Примеры выражений скриптов атрибутивных правил

Ниже приведены примеры выражений скриптов для правил атрибутов вычисления, ограничения и проверки.

Изучите репозиторий Esri GitHub, чтобы ознакомиться с другими примерами выражений скриптов Arcade для правил атрибутов.

Примеры правил атрибутов вычисления

Примеры правил атрибутов ограничений

Примеры правил атрибутов ограничений

Примеры для всех типов правил

Примеры правил атрибутов вычисления

Создать ID путем увеличения последовательности.

Правило немедленного вычисления создается в поле 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
}