Ниже приведены примеры выражений скриптов для правил атрибутов вычисления, ограничения и проверки.
Изучите репозиторий Esri GitHub, чтобы ознакомиться с другими примерами выражений скриптов Arcade для правил атрибутов.
Примеры правил атрибутов вычисления
Примеры правил атрибутов ограничений
Примеры правил атрибутов ограничений
Примеры для всех типов правил
Примеры правил атрибутов вычисления
Правило немедленного вычисления создается в поле assetID в классе объектов трансформаторов и запускается при операциях вставка, редактирование. Когда вы создаете трансформатор, функция NextSequenceValue Arcade направляет запрос к базе данных, чтобы получить следующее значение последовательности, используя при этом inputSequenceName из assetid_seq.
Чтобы создать последовательность для ссылки на правила атрибутов, используйте инструмент Создать последовательность баз данных. При использовании последовательностей в выражении скрипта убедитесь, что опция Исключить из оценки приложения задана как true.
return "Tx-" + NextSequenceValue ("assetid_seq")
Бывает необходимо, чтобы правило вычисления возвращало заданное пользователем сообщение об ошибке в виде сбоя, если условие не выполняется. В этом примере создается правило немедленного вычисления для заполнения поля (FacilityID) на основе пересекающейся подстанции. Это правило будет выполняться в операциях вставки и обновления. Если вы попытаетесь создать трансформатор в подстанции, выражение Arcade берет имя этой подстанции и для построения полного поля FacilityID (SubstationName-AssetID) использует 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;
Можно создать правило вычисления, согласно которому другие объекты будут отмечены как требующие вычисления или проверки. При выполнении вычисления в словаре могут использоваться ключевые слова calculationRequired или validationRequired, которые будут служить для сброса Статуса проверки атрибута одного или нескольких объектов. Это используется, когда один класс объектов зависит от другого. В данном примере поле AssetID класса объектов Трансформатор зависит от класса объектов пересекающая Подстанция. Для поля yearName класса объектов Substation создается правило вычисления. Когда имя подстанции будет обновлено, новое имя и текущий год будут сохранены в поле yearName. Как часть этой логики, все трансформаторы, пересекающие подстанцию в классе объектов Трансформатор, будут помечены как требующие вычисления. Существует правило пакетного вычисления для класса объектов Трансформатор, которое вычислит 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.'
}
Создать правило вычисления в поле shape набора данных для внесения изменений в геометрию объекта. В этом примере скрипта геометрия точечного объекта изменена таким образом, чтобы он находился на расстоянии 5 единиц от первого объекта в pointClass1.
Внимание:
Пространственная привязка возвращаемой геометрии должна соответствовать пространственной привязке набора данных, содержащего правило атрибута.
//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'};
Примеры правил атрибутов ограничений
Правила проверки лучше всего подходят для случаев, когда требуется обнаружить поврежденные данные, но вы не хотите мешать редакторам выполнять свою работу с помощью правила ограничения. Вы можете оценивать правила и создавать ошибки для объектов, которые нарушают ваше правило. Это – пример подстанций, которые превышают максимальное значение kva и помечены как ошибки (создаются ошибки полигонов).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, чтобы она ссылалась на атрибуты объекта перед редактированием. Сравните $originalfeature и $feature через Arcade, чтобы определить, изменился ли атрибут пространственного объекта.
Пример синтаксиса Arcade, в котором для проверки того, изменился ли атрибут, используется $originalfeature.
if ($feature.field == $originalfeature.field) {
//code if field attribute hasn't changed
} else {
//code if field attribute has changed.
}
Пример синтаксиса Arcade, в котором для проверки того, изменилась ли геометрия, используется $originalfeature.
if (Equals(Geometry($feature), Geometry($originalfeature))) {
//code if geometry hasn't changed
} else {
//code if geometry has changed
}
Пример синтаксиса Arcade, в котором для проверки того, изменился ли на 50% атрибут, используется $originalfeature.
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, чтобы она ссылалась на edit type в логике Arcade. Это позволит создать одно правило атрибута, когда будут разрешены любые события, которые могут быть триггерами событий и добавить условия в зависимости от типа редактирования.
Пример синтаксиса Arcade, в котором для проверки типа редактирования используется $editcontext.
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
}