Content modifier rule

TypeScript type: ContentModifier.

Content modifiers are used to modify how instances of specified ECClasses are displayed in content which is produced using content rules. They do not produce any content by themselves.

Attributes

Name Required? Type Default
Picking attributes
class No SingleSchemaClassSpecification Any class
requiredSchemas No RequiredSchemaSpecification[] []
priority No number 1000
applyOnNestedContent No boolean false
Content Modifiers
relatedProperties No RelatedPropertiesSpecification[] []
calculatedProperties No CalculatedPropertiesSpecification[] []
propertyCategories No PropertyCategorySpecification[] []
propertyOverrides No PropertySpecification[] []

Attribute: class

Specification of ECClass whose content should be modified. The modifier applies property overrides and property categories to all content if this attribute is not specified. This attribute must be specified in order to apply related or calculated properties to the content.

Type SingleSchemaClassSpecification
Is Required No
Default Value Any class
// The ruleset has a content rule that returns content of all `bis.SpatialCategory` and `bis.GeometricModel`
// instances.There's also a content modifier that creates a custom calculated property only for `bis.Category` instances.
const ruleset: Ruleset = {
  id: "example",
  rules: [
    {
      ruleType: "Content",
      specifications: [
        {
          // load content for all `bis.SpatialCategory` and `bis.GeometricModel` instances
          specType: "ContentInstancesOfSpecificClasses",
          classes: { schemaName: "BisCore", classNames: ["SpatialCategory", "GeometricModel"], arePolymorphic: true },
        },
      ],
    },
    {
      ruleType: "ContentModifier",
      class: { schemaName: "BisCore", className: "Category" },
      calculatedProperties: [
        {
          label: "Calculated",
          value: `"PREFIX_" & this.CodeValue`,
        },
      ],
    },
  ],
};

Example of using class attribute

Attribute: requiredSchemas

A list of ECSchema requirements that need to be met for the rule to be used.

Type RequiredSchemaSpecification[]
Is Required No
Default Value []
// The ruleset has a content rule that returns content of given input instances. There's also
// a content modifier that tells us to load `bis.ExternalSourceAspect` related properties, but the
// ECClass was introduced in BisCore version 1.0.2, so the modifier needs a `requiredSchemas` attribute
// to only use the rule if the version meets the requirement.
const ruleset: Ruleset = {
  id: "example",
  rules: [
    {
      ruleType: "Content",
      specifications: [
        {
          // load content for given input instances
          specType: "SelectedNodeInstances",
        },
      ],
    },
    {
      ruleType: "ContentModifier",
      requiredSchemas: [{ name: "BisCore", minVersion: "1.0.2" }],
      class: { schemaName: "BisCore", className: "ExternalSourceAspect" },
      relatedProperties: [
        {
          // request to include properties of related ExternalSourceAspect instances
          propertiesSource: {
            relationship: { schemaName: "BisCore", className: "ElementOwnsMultiAspects" },
            direction: "Forward",
            targetClass: { schemaName: "BisCore", className: "ExternalSourceAspect" },
          },
        },
      ],
    },
  ],
};

Attribute: priority

Defines the order in which rules are handled, higher number means the rule is handled first. If priorities are equal, the rules are handled in the order they're defined.

Type number
Is Required No
Default Value 1000
// The ruleset has a content rule that returns content of all `bis.SpatialCategory`
// instances.There's also a content modifier that tells us to hide all properties
// of `bis.Element` instances and a higher priority modifier that tells us to show
// its `CodeValue` property.
const ruleset: Ruleset = {
  id: "example",
  rules: [
    {
      ruleType: "Content",
      specifications: [
        {
          // load content of all `bis.SpatialCategory` instances
          specType: "ContentInstancesOfSpecificClasses",
          classes: { schemaName: "BisCore", classNames: ["SpatialCategory"], arePolymorphic: true },
        },
      ],
    },
    {
      ruleType: "ContentModifier",
      class: { schemaName: "BisCore", className: "SpatialCategory" },
      priority: 1,
      propertyOverrides: [
        {
          // hide all properties
          name: "*",
          isDisplayed: false,
        },
      ],
    },
    {
      ruleType: "ContentModifier",
      class: { schemaName: "BisCore", className: "SpatialCategory" },
      priority: 2,
      propertyOverrides: [
        {
          // display the CodeValue property
          name: "CodeValue",
          isDisplayed: true,
          doNotHideOtherPropertiesOnDisplayOverride: true,
        },
      ],
    },
  ],
};

Example of using priority attribute

Attribute: applyOnNestedContent

Specifies whether calculatedProperties and relatedProperties specifications should also be applied on nested content.

Type boolean
Is Required No
Default Value false
// The ruleset has a content rule that returns content of given input instances. The produced content
// additionally include properties of parent element by following the `bis.SpatialViewDefinitionUsesModelSelector`
// relationship. There's also a content modifier that includes properties of the related `DisplayStyle` and
// creates a calculated property for nested `bis.SpatialViewDefinition`.
const ruleset: Ruleset = {
  id: "example",
  rules: [
    {
      ruleType: "Content",
      specifications: [
        {
          // load content for given input instances
          specType: "SelectedNodeInstances",
          relatedProperties: [
            {
              propertiesSource: {
                relationship: {
                  schemaName: "BisCore",
                  className: "SpatialViewDefinitionUsesModelSelector",
                },
                direction: "Backward",
              },
            },
          ],
        },
      ],
    },
    {
      // add a content modifier for `SpatialViewDefinition` elements
      ruleType: "ContentModifier",
      class: { schemaName: "BisCore", className: "SpatialViewDefinition" },
      relatedProperties: [
        {
          propertiesSource: {
            relationship: {
              schemaName: "BisCore",
              className: "ViewDefinitionUsesDisplayStyle",
            },
            direction: "Forward",
          },
        },
      ],
      calculatedProperties: [
        {
          label: "Calculated for SpatialViewDefinition",
          value: "this.Pitch",
        },
      ],
      // set `applyOnNestedContent: true` to get this modifier applied when `SpatialViewDefinition` content is loaded indirectly
      applyOnNestedContent: true,
    },
  ],
};
applyOnNestedContent: false applyOnNestedContent: true
Example of not using modifiers on nested content Example of using modifiers on nested content

Attribute: relatedProperties

Specifications of related properties which are included in the generated content.

Type RelatedPropertiesSpecification[]
Is Required No
Default Value []
// The ruleset has a content rule that returns content of given input instances. There's also
// a content modifier that includes properties of the related `bis.Category` for all `bis.GeometricElement3d`
// instances' content.
const ruleset: Ruleset = {
  id: "example",
  rules: [
    {
      ruleType: "Content",
      specifications: [
        {
          // load content for given input instances
          specType: "SelectedNodeInstances",
        },
      ],
    },
    {
      ruleType: "ContentModifier",
      class: { schemaName: "BisCore", className: "GeometricElement3d" },
      relatedProperties: [
        {
          propertiesSource: {
            relationship: { schemaName: "BisCore", className: "GeometricElement3dIsInCategory" },
            direction: "Forward",
          },
          handleTargetClassPolymorphically: true,
        },
      ],
    },
  ],
};

Example of using relatedProperties attribute

Attribute: calculatedProperties

Specifications of calculated properties whose values are generated using provided ECExpressions.

Type CalculatedPropertiesSpecification[]
Is Required No
Default Value []
// The ruleset has a content rule that returns content of given input instances. There's also
// a content modifier that creates a calculated property for `bis.GeometricElement3d` instances.
const ruleset: Ruleset = {
  id: "example",
  rules: [
    {
      ruleType: "Content",
      specifications: [
        {
          // load content for given input instances
          specType: "SelectedNodeInstances",
        },
      ],
    },
    {
      ruleType: "ContentModifier",
      class: { schemaName: "BisCore", className: "GeometricElement3d" },
      calculatedProperties: [
        {
          label: "Yaw & Pitch & Roll",
          value: `this.Yaw & " & " & this.Pitch & " & " & this.Roll`,
        },
      ],
    },
  ],
};

Example of using calculatedProperties attribute

Attribute: propertyCategories

Specifications for custom categories. Simply defining the categories does nothing - they have to be referenced from property specification defined in propertyOverrides by id.

Type PropertyCategorySpecification[]
Is Required No
Default Value []
// The ruleset has a content rule that returns content of given input instances. There's also
// a content modifier that moves all `bis.GeometricElement3d` properties into a custom category.
const ruleset: Ruleset = {
  id: "example",
  rules: [
    {
      ruleType: "Content",
      specifications: [
        {
          // load content for given input instances
          specType: "SelectedNodeInstances",
        },
      ],
    },
    {
      ruleType: "ContentModifier",
      class: { schemaName: "BisCore", className: "GeometricElement3d" },
      propertyCategories: [
        {
          id: "custom-category",
          label: "Custom Category",
        },
      ],
      propertyOverrides: [
        {
          name: "*",
          categoryId: "custom-category",
        },
      ],
    },
  ],
};

Example of using propertyCategories attribute

Attribute: propertyOverrides

Specifications for various property overrides that allow customizing property display.

Type PropertySpecification[]
Is Required No
Default Value []
// The ruleset has a content rule that returns content of given input instances. There's also
// a content modifier that customizes display of `bis.GeometricElement3d` properties.
const ruleset: Ruleset = {
  id: "example",
  rules: [
    {
      ruleType: "Content",
      specifications: [
        {
          // load content for given input instances
          specType: "SelectedNodeInstances",
        },
      ],
    },
    {
      ruleType: "ContentModifier",
      class: { schemaName: "BisCore", className: "GeometricElement3d" },
      propertyOverrides: [
        {
          // force hide the UserLabel property
          name: "UserLabel",
          isDisplayed: false,
        },
        {
          // force show the Parent property which is hidden by default through ECSchema
          name: "Parent",
          isDisplayed: true,
          doNotHideOtherPropertiesOnDisplayOverride: true,
        },
        {
          // override label of CodeValue property
          name: "CodeValue",
          labelOverride: "Overriden Label",
        },
      ],
    },
  ],
};

Example of using propertyOverrides attribute

Last Updated: 15 May, 2024