属性规则脚本表达式示例

以下是计算约束验证属性规则的脚本表达式示例。

有关属性规则的更多 Arcade 脚本表达式示例,请参阅 Esri GitHub 资料档案库

计算属性规则示例

约束属性规则示例

验证属性规则示例

所有规则类型的示例

计算属性规则示例

通过递增序列生成 ID。

在变压器要素类中的 assetID 字段上创建实时计算规则,并在插入编辑操作时触发该规则。 在创建变压器时,NextSequenceValue Arcade 函数将查询数据库,以通过使用 assetid_seq 的 inputSequenceName 来获取下一个序列值。

要在属性规则中创建引用序列,请使用创建数据库序列工具。 在脚本表达式中使用序列时,请确保从应用程序评估中排除选项设置为 true。

 return "Tx-" + NextSequenceValue ("assetid_seq")

返回计算规则的自定义错误消息。

在某些情况下,您希望计算规则在不满足条件时返回自定义错误消息作为故障。 在此示例中,创建了实时计算规则以根据相交的变电站填充 (FacilityID) 字段。 该规则将在插入和更新操作时执行。 如果您尝试在变电站中创建变压器,则 Arcade 表达式将获取变电站的名称并使用变压器的 assetID 来构建完整的 FacilityID 字段 (SubstationName-AssetID)。 如果在变电站外创建或移动变压器,则脚本将使用 errorMessage 关键字返回自定义错误消息。

//On Insert or Update set FacilityID = SubstationName - AssetID use intersect to get the substation name
//If no substation (fail with error message dictionary,  must create in substation.) 
var fsStructureBoundary =  FeatureSetByName($datastore, "Substation", ["name"], true)
var fsSubstation = Intersects(fsStructureBoundary, Geometry($feature))
var substation = First (fsSubstation)

var subname  = ""
if (substation == null)
   return  {"errorMessage": "Transformers must be created in a substation."}
else 
   subname =  substation.name

return subname + " - " + $feature.assetid;

将其他要素标记为需要评估。

您可以创建一个计算规则,用于将其他要素标记为需要计算或验证。 在执行计算时,可以在字典中使用 calculationRequiredvalidationRequired 关键字来重置一个或多个要素的验证状态属性。 当要素类取决于其他要素类时,此项非常有用。 在此示例中,Transformer 要素类中的 AssetID 字段取决于相交的 Substation 要素类。 将在 Substation 要素类的 yearName 字段上创建计算规则。 更新变电站名称时,新名称和当前年份将存储在 yearName 字段中。 作为该逻辑的一部分,变压器要素类中与变电站相交的所有变压器均将标记为需要计算。 Transformer 类上存在批处理计算规则,用于在下次评估规则时计算 Transformer AssetID,以反映变电站的新名称和年份。

//Updating the substation name marks its transformers as requiring calculation and updates the yearName to the new name and year. 
//To recalculate the facility id on all transformers, mark all associated transformers as requiring calculation.
var fsDevice =  FeatureSetByName($datastore, "Transformer", ["globalid"], false)
var fsDeviceIntersects = Intersects (fsDevice, Geometry($feature))

var transformers = [];
var count = 0;

for (var i in fsDeviceIntersects)
   transformers[count++] = i.globalid;
var newName = $feature.name + " " + Year(Now())
return {
   'result': newName, 
   'calculationRequired': 
       [
          {
              'className':"Transformer",
              'globalIDs': transformers
           }
       ]
   }

使用计算规则编辑其他要素类。

您可以使用属性规则并凭借 edit 字典关键字对其他要素类执行插入、更新和删除操作。 以下示例是有关区域边界要素类的文本字段的计算规则。 在编辑区域边界要素类中的面时,此属性规则将使用区域名称来更新任何相交的地址点。

var fsAddress = FeatureSetByName($datastore, "Address_pnts", ["globalid"], false)
var fsListAddpnts = Intersects(fsAddress, $feature)
var AddList = []
var counter = 0
var noAddress = Count(fsListAddpnts)
if (noAddress > 0) {
    for (var address in fsListAddpnts) {
        AddList[counter] = {
            'globalid': address.globalid,
            'attributes': {
                'add_district_name': $feature.DistrictName
            }
        }
        counter++
    }
    return {
        'result': noAddress + ' addresses found in the district.',
        'edit': [{
            'className': 'Address_pnts',
            'updates': AddList
        }]
    }
} else {
    return 'No address points in district.'
}

使用计算规则编辑要素的几何。

在数据集的形状字段上创建计算规则,以对要素的几何进行修改。 在此脚本示例中,将点要素几何修改为与 pointClass1 中的第一个要素相距 5 个单位。

警告:

返回的几何的空间参考必须与包含属性规则的数据集的空间参考相匹配。

//This calculation attribute rule is added to the shape field of a point feature class called pointClass2
var centerFeature = First(FeatureSetByName($datastore, "pointClass1"))
//Get the x and y values of the feature in the pointClass1
var x0 = Geometry(centerFeature).x
var y0 = Geometry(centerFeature).y
//Get the x and y values of the current feature in the pointClass2
var x1 = Geometry($feature).x;
var y1 = Geometry($feature).y;
var x2 = 0;
var y2 = 0;
var d = 5
//Calculate the euclidean distance from feature in pointClass1 and current feature in pointClass2
var d1 = sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0))

//Calculate the new x and y to be within 5 metric units while maintaining slope
x2 = (x1 - x0) * d / d1 + x0;
y2 = (y1 - y0) * d / d1 + y0;
//Create a point geometry from the new x and y values
var pointA = Point({
    "x": x2,
    "y": y2,
    "z": 0,
    "spatialReference": Geometry(centerFeature).spatialReference
});
return pointA

约束属性规则示例

返回约束规则的布尔值。

将在变电站类上创建此约束属性规则,并在插入和更新操作时触发该规则。 如果变电站名称为空,则此表达式将返回 false 并失败。 如果变电站名称不为空,则此表达式将返回 true 并允许继续进行编辑。

if ($feature.name == null)
    return false;
else
    return true;

//another way of writing it
return !($feature.name == null)

返回约束规则的自定义错误消息。

在某些情况下,您希望约束属性规则以根据条件返回不同的错误消息。 在以下示例中,如果变电站的名称或 installationDate 为空,则将返回自定义错误。

if ($feature.name == null)
    return   {"errorMessage": "Substation must have a valid name."}
else if ($feature.installationDate == null)
    return   {"errorMessage": "Substation must have a valid installation date."}
else
    return true;

使用约束规则防止删除要素。

除非将 lifecyclestatus 字段设置为停用,否则此约束属性规则可以防止删除要素。 如果 lifecyclestatus 不等于停用,则将返回自定义错误消息,并且编辑将失败。 创建规则以在执行删除操作时触发。

if ($feature.lifecyclestatus == 'retired')
{
  return true;
}
return {'errorMessage': 'You are not allowed delete a feature until it is retired'};

验证属性规则示例

返回验证规则的布尔值。

验证规则最适用于要检测损坏数据,但是您又不希望通过使用约束规则来阻止编辑者完成其工作的情况。 您可以评估规则并为违反规则的要素创建错误。 以下是超过最大千伏安并标记为错误的变电站示例(将创建面错误)。

var fsTransformer =  FeatureSetByName($datastore, "L1Electric_Distribution_Device", ["objectid"], true)
var fsTransformerSubset = Intersects(fsTransformer, Geometry($feature))
var totalKva = 0;
for (var t in fsTransformerSubset)
    totalKva += t.kva

if (totalKva > $feature.maxKva)
     return false
else
     return true

以下示例是在电线杆要素类上创建的验证规则,用于确保当结构高度等于或大于 65 英尺时,材料必须为钢制。 如果不满足以上条件,则将生成一个错误要素。

if ($feature.structureheight >= 65)
{
    If (DomainName($feature, 'Material') == 'Steel')
    { return true; }
    else
    { return false; }
}
Else
{  return true; }

所有规则类型的示例

标识特定属性值是否已更改。

可以使用 $originalfeature 全局变量来引用进行编辑之前的要素属性。 可以通过 Arcade$originalfeature$feature 进行比较,以确定要素的属性是否已更改。

使用 $originalfeature 来检查属性是否已更改的 Arcade 语法示例。

if ($feature.field == $originalfeature.field) {
    //code if field attribute hasn't changed
} else {
    //code if field attribute has changed.
}

使用 $originalfeature 来检查几何是否已更改的 Arcade 语法示例。

if (Equals(Geometry($feature), Geometry($originalfeature))) {
    //code if geometry hasn't changed
} else {
    //code if geometry has changed
}

使用 $originalfeature 来检查属性是否已更改 50% 的 Arcade 语法示例。

if ($originalfeature.field == 0) {
    //code to avoid calculating change if $originalfeature.field was zero
} else {
    var percent_change = Abs(($feature.field - $originalfeature.field) / $originalfeature.field) * 100
    if (percent_change >= 50) {
        //code if percent change is by 50% or more
    } else {
        //code if percent change is less than 50%
    }
}

标识编辑事件触发器,例如插入、更新或删除。

可以使用 $editcontext 全局变量以在 Arcade 逻辑中引用 edit type。 由此可创建一个启用了所有事件触发事件的属性规则,且可以根据编辑的类型添加条件。

使用 $editcontext 检查编辑类型的 Arcade 语法示例。

if ($editContext.editType == "INSERT") {
    //code if the edit is an insert
} else if ($editContext.editType == "UPDATE") {
    //code if the edit is an update
} else if ($editContext.editType == "DELETE") {
    //code if the edit is a delete 
} else if ($editContext.editType == "NA") {
    //code when edit type is not applicable, for example batch calculation or validation rules
}