@itwin/core-backend 5.13.0-dev.14 → 5.13.0-dev.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +12 -0
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +9 -0
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts +22 -7
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +104 -36
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +25 -10
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +13 -1
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +9 -0
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts +22 -7
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +104 -36
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +25 -10
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +178 -2
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +48 -18
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts +2 -0
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js +263 -0
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js.map +1 -0
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextAnnotationElement.js","sourceRoot":"","sources":["../../../src/annotations/TextAnnotationElement.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\n\r\nimport { AnnotationTextStyleProps, BisCodeSpec, Code, CodeProps, CodeScopeProps, CodeSpec, ECVersionString, ElementGeometry, ElementGeometryBuilderParams, EntityReferenceSet, Placement2d, Placement2dProps, Placement3d, Placement3dProps, PlacementProps, TextAnnotation, TextAnnotation2dProps, TextAnnotation3dProps, TextAnnotationProps, TextStyleSettings, TextStyleSettingsProps, traverseTextBlockComponent, VersionedJSON } from \"@itwin/core-common\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { AnnotationElement2d, DefinitionElement, Drawing, GraphicalElement3d, OnElementIdArg, OnElementPropsArg } from \"../Element\";\r\nimport { assert, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { layoutTextBlock, TextStyleResolver } from \"./TextBlockLayout\";\r\nimport { appendTextAnnotationGeometry } from \"./TextAnnotationGeometry\";\r\nimport { ElementDrivesTextAnnotation, TextAnnotationUsesTextStyleByDefault, TextBlockAndId } from \"./ElementDrivesTextAnnotation\";\r\nimport { IModelElementCloneContext } from \"../IModelElementCloneContext\";\r\nimport { CustomHandledProperty, DeserializeEntityArgs, ECSqlRow } from \"../Entity\";\r\n\r\nimport * as semver from \"semver\";\r\n\r\n\r\n/** The version of the JSON stored in `TextAnnotation2d/3dProps.textAnnotationData` used by the code.\r\n * Uses the same semantics as [ECVersion]($ecschema-metadata).\r\n * @internal\r\n*/\r\nexport const TEXT_ANNOTATION_JSON_VERSION = \"1.0.0\";\r\n\r\nfunction validateAndMigrateVersionedJSON<T>(\r\n json: string,\r\n currentVersion: ECVersionString,\r\n migrate: (old: VersionedJSON<T>) => T\r\n): VersionedJSON<T> | undefined {\r\n let parsed;\r\n try {\r\n parsed = JSON.parse(json) as VersionedJSON<T>;\r\n } catch {\r\n return undefined;\r\n }\r\n\r\n const version = parsed.version;\r\n if (typeof version !== \"string\" || !semver.valid(version))\r\n throw new Error(\"JSON version is missing or invalid.\");\r\n\r\n if (typeof parsed.data !== \"object\" || parsed.data === null)\r\n throw new Error(\"JSON data is missing or invalid.\");\r\n\r\n // Newer\r\n if (semver.gt(version, currentVersion))\r\n throw new Error(`JSON version ${parsed.version} is newer than supported version ${currentVersion}. Application update required to understand data.`);\r\n\r\n // Older\r\n if (semver.lt(version, currentVersion)) {\r\n parsed.data = migrate(parsed);\r\n parsed.version = currentVersion;\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\nfunction migrateTextAnnotationData(oldData: VersionedJSON<TextAnnotationProps>): TextAnnotationProps {\r\n if (oldData.version === TEXT_ANNOTATION_JSON_VERSION) return oldData.data;\r\n\r\n // Place migration logic here.\r\n\r\n throw new Error(`Migration for textAnnotationData from version ${oldData.version} to ${TEXT_ANNOTATION_JSON_VERSION} failed.`);\r\n}\r\n\r\n/** Parses, validates, and potentially migrates the text annotation data from a JSON string.\r\n * @internal\r\n */\r\nexport function parseTextAnnotationData(json: string | undefined): VersionedJSON<TextAnnotationProps> | undefined {\r\n if (!json) return undefined;\r\n\r\n return validateAndMigrateVersionedJSON<TextAnnotationProps>(json, TEXT_ANNOTATION_JSON_VERSION, migrateTextAnnotationData);\r\n}\r\n\r\nfunction getElementGeometryBuilderParams(iModel: IModelDb, modelId: Id64String, categoryId: Id64String, _placementProps: PlacementProps, annotationProps?: TextAnnotationProps, textStyleId?: Id64String, _subCategory?: Id64String): ElementGeometryBuilderParams {\r\n const textBlock = TextAnnotation.fromJSON(annotationProps).textBlock;\r\n const textStyleResolver = new TextStyleResolver({ textBlock, textStyleId: textStyleId ?? \"\", iModel });\r\n const layout = layoutTextBlock({ iModel, textBlock, textStyleResolver });\r\n const builder = new ElementGeometry.Builder();\r\n let scaleFactor = 1;\r\n const element = iModel.elements.getElement(modelId);\r\n if (element instanceof Drawing)\r\n scaleFactor = element.scaleFactor;\r\n appendTextAnnotationGeometry({ layout, textStyleResolver, scaleFactor, annotationProps: annotationProps ?? {}, builder, categoryId });\r\n\r\n return { entryArray: builder.entries };\r\n}\r\n\r\n/** Arguments supplied when creating a [[TextAnnotation2d]].\r\n * @beta\r\n */\r\nexport interface TextAnnotation2dCreateArgs {\r\n /** The category ID for the annotation. */\r\n category: Id64String;\r\n /** The model ID where the annotation will be placed. */\r\n model: Id64String;\r\n /** The placement properties for the annotation. */\r\n placement: Placement2dProps;\r\n /** The default text style ID for the annotation. */\r\n defaultTextStyleId?: Id64String;\r\n /** Optional [[TextAnnotation]] JSON representation used to create the `TextAnnotation2d`. Essentially an empty element if not provided. */\r\n textAnnotationProps?: TextAnnotationProps;\r\n /** Optional code for the element. */\r\n code?: CodeProps;\r\n}\r\n\r\n/** Arguments supplied when creating a [[TextAnnotation3d]].\r\n * @beta\r\n */\r\nexport interface TextAnnotation3dCreateArgs {\r\n /** The category ID for the annotation. */\r\n category: Id64String;\r\n /** The model ID where the annotation will be placed. */\r\n model: Id64String;\r\n /** The placement properties for the annotation. */\r\n placement: Placement3dProps;\r\n /** The default text style ID for the annotation. */\r\n defaultTextStyleId?: Id64String;\r\n /** Optional [[TextAnnotation]] JSON representation used to create the `TextAnnotation3d`. Essentially an empty element if not provided. */\r\n textAnnotationProps?: TextAnnotationProps;\r\n /** Optional code for the element. */\r\n code?: CodeProps;\r\n}\r\n\r\n/** An element that displays textual content within a 2d model.\r\n * The text is stored as a [TextAnnotation]($common) from which the element's [geometry]($docs/learning/common/GeometryStream.md) and [Placement]($common) are computed.\r\n * @see [[setAnnotation]] to change the textual content.\r\n * @public @preview\r\n */\r\nexport class TextAnnotation2d extends AnnotationElement2d /* implements ITextAnnotation */ {\r\n /** @internal */\r\n public static override get className(): string { return \"TextAnnotation2d\"; }\r\n /**\r\n * The default [[AnnotationTextStyle]] used by the TextAnnotation2d.\r\n * @beta\r\n */\r\n public defaultTextStyle?: TextAnnotationUsesTextStyleByDefault;\r\n /** The data associated with the text annotation. */\r\n private _textAnnotationProps?: TextAnnotationProps;\r\n\r\n /** Extract the textual content, if present.\r\n * @see [[setAnnotation]] to change it.\r\n */\r\n public getAnnotation(): TextAnnotation | undefined {\r\n return this._textAnnotationProps ? TextAnnotation.fromJSON(this._textAnnotationProps) : undefined;\r\n }\r\n\r\n /** Change the textual content of the `TextAnnotation2d`.\r\n * @see [[getAnnotation]] to extract the current annotation.\r\n * @param annotation The new annotation\r\n */\r\n public setAnnotation(annotation: TextAnnotation) {\r\n this._textAnnotationProps = annotation.toJSON();\r\n }\r\n\r\n protected constructor(props: TextAnnotation2dProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n if (props.defaultTextStyle) {\r\n this.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(props.defaultTextStyle.id);\r\n }\r\n this._textAnnotationProps = parseTextAnnotationData(props.textAnnotationData)?.data;\r\n }\r\n\r\n /** Creates a new instance of `TextAnnotation2d` from its JSON representation. */\r\n public static fromJSON(props: TextAnnotation2dProps, iModel: IModelDb): TextAnnotation2d {\r\n return new TextAnnotation2d(props, iModel);\r\n }\r\n\r\n /**\r\n * Converts the current `TextAnnotation2d` instance to its JSON representation.\r\n * It also computes the `elementGeometryBuilderParams` property used to create the GeometryStream.\r\n * @inheritdoc\r\n */\r\n public override toJSON(): TextAnnotation2dProps {\r\n const props = super.toJSON() as TextAnnotation2dProps;\r\n props.textAnnotationData = this._textAnnotationProps ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: this._textAnnotationProps }) : undefined;\r\n if (this._textAnnotationProps) {\r\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(this.iModel, this.model, this.category, this.placement, this._textAnnotationProps, this.defaultTextStyle ? this.defaultTextStyle.id : undefined);\r\n }\r\n\r\n return props;\r\n }\r\n\r\n /** Creates a new `TextAnnotation2d` instance with the specified properties.\r\n * @param iModelDb The iModel.\r\n * @param arg The arguments for creating the TextAnnotation2d.\r\n * @beta\r\n */\r\n public static create(iModelDb: IModelDb, arg: TextAnnotation2dCreateArgs): TextAnnotation2d {\r\n const elementProps: TextAnnotation2dProps = {\r\n classFullName: this.classFullName,\r\n textAnnotationData: arg.textAnnotationProps ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: arg.textAnnotationProps }) : undefined,\r\n defaultTextStyle: arg.defaultTextStyleId ? new TextAnnotationUsesTextStyleByDefault(arg.defaultTextStyleId).toJSON() : undefined,\r\n placement: arg.placement,\r\n model: arg.model,\r\n category: arg.category,\r\n code: arg.code ?? Code.createEmpty(),\r\n };\r\n return new this(elementProps, iModelDb);\r\n }\r\n\r\n /**\r\n * Updates the geometry of the TextAnnotation2d on insert and validates version.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onInsert(arg: OnElementPropsArg): void {\r\n super.onInsert(arg);\r\n this.validateVersionAndUpdateGeometry(arg);\r\n }\r\n\r\n /**\r\n * Updates the geometry of the TextAnnotation2d on update and validates version.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onUpdate(arg: OnElementPropsArg): void {\r\n super.onUpdate(arg);\r\n this.validateVersionAndUpdateGeometry(arg);\r\n }\r\n\r\n /**\r\n * Populates the `elementGeometryBuilderParams` property in the [TextAnnotation2dProps]($common).\r\n * Only does this if the `elementGeometryBuilderParams` is not already set and if there is actually a text annotation to produce geometry for.\r\n * Also, validates the version of the text annotation data and migrates it if necessary.\r\n * @beta\r\n */\r\n protected static validateVersionAndUpdateGeometry(arg: OnElementPropsArg): void {\r\n const props = arg.props as TextAnnotation2dProps;\r\n const textAnnotationData = parseTextAnnotationData(props.textAnnotationData);\r\n if (!props.elementGeometryBuilderParams && textAnnotationData) {\r\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(arg.iModel, props.model, props.category, props.placement ?? Placement2d.fromJSON(), textAnnotationData.data, props.defaultTextStyle?.id);\r\n }\r\n }\r\n\r\n /**\r\n * TextAnnotation2d custom HandledProps include 'textAnnotationData'.\r\n * @inheritdoc\r\n * @internal\r\n */\r\n protected static override readonly _customHandledProps: CustomHandledProperty[] = [\r\n { propertyName: \"textAnnotationData\", source: \"Class\" },\r\n ];\r\n\r\n /**\r\n * TextAnnotation2d deserializes 'textAnnotationData'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override deserialize(props: DeserializeEntityArgs): TextAnnotation2dProps {\r\n const elProps = super.deserialize(props) as TextAnnotation2dProps;\r\n const textAnnotationData = parseTextAnnotationData(props.row.textAnnotationData);\r\n if (textAnnotationData) {\r\n elProps.textAnnotationData = JSON.stringify(textAnnotationData);\r\n }\r\n return elProps;\r\n }\r\n\r\n /**\r\n * TextAnnotation2d serializes 'textAnnotationData'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override serialize(props: TextAnnotation2dProps, iModel: IModelDb): ECSqlRow {\r\n const inst = super.serialize(props, iModel);\r\n if (props.textAnnotationData !== undefined) {\r\n inst.textAnnotationData = props.textAnnotationData;\r\n }\r\n return inst;\r\n }\r\n\r\n /** @internal */\r\n public getTextBlocks(): Iterable<TextBlockAndId> {\r\n return getTextBlocks(this);\r\n }\r\n\r\n /** @internal */\r\n public updateTextBlocks(textBlocks: TextBlockAndId[]): void {\r\n return updateTextBlocks(this, textBlocks);\r\n }\r\n\r\n /** @internal */\r\n public static override onInserted(arg: OnElementIdArg): void {\r\n super.onInserted(arg);\r\n ElementDrivesTextAnnotation.updateFieldDependencies(arg.iModel.getIndirectTxn(), arg.id);\r\n }\r\n\r\n /** @internal */\r\n public static override onUpdated(arg: OnElementIdArg): void {\r\n super.onUpdated(arg);\r\n ElementDrivesTextAnnotation.updateFieldDependencies(arg.iModel.getIndirectTxn(), arg.id);\r\n }\r\n\r\n protected override collectReferenceIds(referenceIds: EntityReferenceSet): void {\r\n super.collectReferenceIds(referenceIds);\r\n collectReferenceIds(this, referenceIds);\r\n }\r\n\r\n /** @internal */\r\n protected static override async onCloned(context: IModelElementCloneContext, srcProps: TextAnnotation2dProps, dstProps: TextAnnotation2dProps): Promise<void> {\r\n await super.onCloned(context, srcProps, dstProps);\r\n\r\n const srcElem = TextAnnotation2d.fromJSON(srcProps, context.sourceDb);\r\n ElementDrivesTextAnnotation.remapFields(srcElem, context);\r\n const anno = srcElem.getAnnotation();\r\n dstProps.textAnnotationData = anno ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: anno.toJSON() }) : undefined;\r\n\r\n return remapTextStyle(context, srcElem, dstProps);\r\n }\r\n}\r\n\r\n/** An element that displays textual content within a 3d model.\r\n * The text is stored as a [TextAnnotation]($common) from which the element's [geometry]($docs/learning/common/GeometryStream.md) and [Placement]($common) are computed.\r\n * @see [[setAnnotation]] to change the textual content.\r\n * @public @preview\r\n */\r\nexport class TextAnnotation3d extends GraphicalElement3d /* implements ITextAnnotation */ {\r\n /** @internal */\r\n public static override get className(): string { return \"TextAnnotation3d\"; }\r\n /**\r\n * The default [[AnnotationTextStyle]] used by the TextAnnotation3d.\r\n * @beta\r\n */\r\n public defaultTextStyle?: TextAnnotationUsesTextStyleByDefault;\r\n /** The data associated with the text annotation. */\r\n private _textAnnotationProps?: TextAnnotationProps;\r\n\r\n /** Extract the textual content, if present.\r\n * @see [[setAnnotation]] to change it.\r\n */\r\n public getAnnotation(): TextAnnotation | undefined {\r\n return this._textAnnotationProps ? TextAnnotation.fromJSON(this._textAnnotationProps) : undefined;\r\n }\r\n\r\n /** Change the textual content of the `TextAnnotation3d`.\r\n * @see [[getAnnotation]] to extract the current annotation.\r\n * @param annotation The new annotation\r\n */\r\n public setAnnotation(annotation: TextAnnotation) {\r\n this._textAnnotationProps = annotation.toJSON();\r\n }\r\n\r\n protected constructor(props: TextAnnotation3dProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n if (props.defaultTextStyle) {\r\n this.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(props.defaultTextStyle.id);\r\n }\r\n this._textAnnotationProps = parseTextAnnotationData(props.textAnnotationData)?.data;\r\n }\r\n\r\n /** Creates a new instance of `TextAnnotation3d` from its JSON representation. */\r\n public static fromJSON(props: TextAnnotation3dProps, iModel: IModelDb): TextAnnotation3d {\r\n return new TextAnnotation3d(props, iModel);\r\n }\r\n\r\n /**\r\n * Converts the current `TextAnnotation3d` instance to its JSON representation.\r\n * It also computes the `elementGeometryBuilderParams` property used to create the GeometryStream.\r\n * @inheritdoc\r\n */\r\n public override toJSON(): TextAnnotation3dProps {\r\n const props = super.toJSON() as TextAnnotation3dProps;\r\n props.textAnnotationData = this._textAnnotationProps ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: this._textAnnotationProps }) : undefined;\r\n if (this._textAnnotationProps) {\r\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(this.iModel, this.model, this.category, this.placement, this._textAnnotationProps, this.defaultTextStyle ? this.defaultTextStyle.id : undefined);\r\n }\r\n\r\n return props;\r\n }\r\n\r\n /** Creates a new `TextAnnotation3d` instance with the specified properties.\r\n * @param iModelDb The iModel.\r\n * @param arg The arguments for creating the TextAnnotation3d.\r\n * @beta\r\n */\r\n public static create(iModelDb: IModelDb, arg: TextAnnotation3dCreateArgs): TextAnnotation3d {\r\n const elementProps: TextAnnotation3dProps = {\r\n classFullName: this.classFullName,\r\n textAnnotationData: arg.textAnnotationProps ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: arg.textAnnotationProps }) : undefined,\r\n defaultTextStyle: arg.defaultTextStyleId ? new TextAnnotationUsesTextStyleByDefault(arg.defaultTextStyleId).toJSON() : undefined,\r\n placement: arg.placement,\r\n model: arg.model,\r\n category: arg.category,\r\n code: arg.code ?? Code.createEmpty(),\r\n };\r\n return new this(elementProps, iModelDb);\r\n }\r\n\r\n /**\r\n * Updates the geometry of the TextAnnotation3d on insert and validates version..\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onInsert(arg: OnElementPropsArg): void {\r\n super.onInsert(arg);\r\n this.validateVersionAndUpdateGeometry(arg);\r\n }\r\n\r\n /**\r\n * Updates the geometry of the TextAnnotation3d on update and validates version..\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onUpdate(arg: OnElementPropsArg): void {\r\n super.onUpdate(arg);\r\n this.validateVersionAndUpdateGeometry(arg);\r\n }\r\n\r\n /**\r\n * Populates the `elementGeometryBuilderParams` property in the [TextAnnotation3dProps]($common).\r\n * Only does this if the `elementGeometryBuilderParams` is not already set and if there is actually a text annotation to produce geometry for.\r\n * Also, validates the version of the text annotation data and migrates it if necessary.\r\n * @beta\r\n */\r\n protected static validateVersionAndUpdateGeometry(arg: OnElementPropsArg): void {\r\n const props = arg.props as TextAnnotation3dProps;\r\n const textAnnotationData = parseTextAnnotationData(props.textAnnotationData);\r\n if (!props.elementGeometryBuilderParams && textAnnotationData) {\r\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(arg.iModel, props.model, props.category, props.placement ?? Placement3d.fromJSON(), textAnnotationData.data, props.defaultTextStyle?.id);\r\n }\r\n }\r\n\r\n /**\r\n * TextAnnotation3d custom HandledProps include 'textAnnotationData'.\r\n * @inheritdoc\r\n * @internal\r\n */\r\n protected static override readonly _customHandledProps: CustomHandledProperty[] = [\r\n { propertyName: \"textAnnotationData\", source: \"Class\" },\r\n ];\r\n\r\n /**\r\n * TextAnnotation3d deserializes 'textAnnotationData'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override deserialize(props: DeserializeEntityArgs): TextAnnotation3dProps {\r\n const elProps = super.deserialize(props) as TextAnnotation3dProps;\r\n const textAnnotationData = parseTextAnnotationData(props.row.textAnnotationData);\r\n if (textAnnotationData) {\r\n elProps.textAnnotationData = JSON.stringify(textAnnotationData);\r\n }\r\n return elProps;\r\n }\r\n\r\n /**\r\n * TextAnnotation3d serializes 'textAnnotationData'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override serialize(props: TextAnnotation3dProps, iModel: IModelDb): ECSqlRow {\r\n const inst = super.serialize(props, iModel);\r\n if (props.textAnnotationData !== undefined) {\r\n inst.textAnnotationData = props.textAnnotationData;\r\n }\r\n return inst;\r\n }\r\n\r\n /** @internal */\r\n public getTextBlocks(): Iterable<TextBlockAndId> {\r\n return getTextBlocks(this);\r\n }\r\n\r\n /** @internal */\r\n public updateTextBlocks(textBlocks: TextBlockAndId[]): void {\r\n return updateTextBlocks(this, textBlocks);\r\n }\r\n\r\n /** @internal */\r\n public static override onInserted(arg: OnElementIdArg): void {\r\n super.onInserted(arg);\r\n ElementDrivesTextAnnotation.updateFieldDependencies(arg.iModel.getIndirectTxn(), arg.id);\r\n }\r\n\r\n /** @internal */\r\n public static override onUpdated(arg: OnElementIdArg): void {\r\n super.onUpdated(arg);\r\n ElementDrivesTextAnnotation.updateFieldDependencies(arg.iModel.getIndirectTxn(), arg.id);\r\n }\r\n\r\n protected override collectReferenceIds(referenceIds: EntityReferenceSet): void {\r\n super.collectReferenceIds(referenceIds);\r\n collectReferenceIds(this, referenceIds);\r\n }\r\n\r\n /** @internal */\r\n protected static override async onCloned(context: IModelElementCloneContext, srcProps: TextAnnotation3dProps, dstProps: TextAnnotation3dProps): Promise<void> {\r\n await super.onCloned(context, srcProps, dstProps);\r\n\r\n const srcElem = TextAnnotation3d.fromJSON(srcProps, context.sourceDb);\r\n ElementDrivesTextAnnotation.remapFields(srcElem, context);\r\n const anno = srcElem.getAnnotation();\r\n dstProps.textAnnotationData = anno ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: anno.toJSON() }) : undefined;\r\n\r\n return remapTextStyle(context, srcElem, dstProps);\r\n }\r\n}\r\n\r\nasync function remapTextStyle(\r\n context: IModelElementCloneContext,\r\n srcElem: TextAnnotation2d | TextAnnotation3d,\r\n dstProps: TextAnnotation2dProps | TextAnnotation3dProps\r\n): Promise<void> {\r\n const dstStyleId = await AnnotationTextStyle.remapTextStyleId(srcElem.defaultTextStyle?.id ?? Id64.invalid, context);\r\n dstProps.defaultTextStyle = Id64.isValid(dstStyleId) ? new TextAnnotationUsesTextStyleByDefault(dstStyleId).toJSON() : undefined;\r\n}\r\n\r\nfunction collectReferenceIds(elem: TextAnnotation2d | TextAnnotation3d, referenceIds: EntityReferenceSet): void {\r\n const style = elem.defaultTextStyle?.id;\r\n if (style && Id64.isValidId64(style)) {\r\n referenceIds.addElement(style);\r\n }\r\n\r\n const block = elem.getAnnotation()?.textBlock;\r\n if (block) {\r\n for (const { child } of traverseTextBlockComponent(block)) {\r\n if (child.type === \"field\") {\r\n const hostId = child.propertyHost.elementId;\r\n if (Id64.isValidId64(hostId)) {\r\n referenceIds.addElement(hostId);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction getTextBlocks(elem: TextAnnotation2d | TextAnnotation3d): Iterable<TextBlockAndId> {\r\n const annotation = elem.getAnnotation();\r\n return annotation ? [{ textBlock: annotation.textBlock, id: undefined }] : [];\r\n}\r\n\r\nfunction updateTextBlocks(elem: TextAnnotation2d | TextAnnotation3d, textBlocks: TextBlockAndId[]): void {\r\n assert(textBlocks.length === 1);\r\n assert(textBlocks[0].id === undefined);\r\n\r\n const annotation = elem.getAnnotation();\r\n if (!annotation) {\r\n // We must obtain the TextBlockAndId from the element in the first place, so the only way we could end up here is if\r\n // somebody removed the text annotation after we called getTextBlocks. That's gotta be a mistake.\r\n throw new Error(\"Text annotation element has no text\");\r\n }\r\n\r\n annotation.textBlock = textBlocks[0].textBlock;\r\n\r\n elem.setAnnotation(annotation);\r\n}\r\n\r\n/** The version of the JSON stored in `AnnotationTextStyleProps.settings` used by the code.\r\n * Uses the same semantics as [ECVersion]($ecschema-metadata).\r\n * @internal\r\n*/\r\n// 1.0.1 - Added terminatorShapes for leaders\r\n// 1.0.2 - Changed margins to be fractions of text height instead of absolute values\r\nexport const TEXT_STYLE_SETTINGS_JSON_VERSION = \"1.0.2\";\r\n\r\nfunction migrateTextStyleSettings(oldData: VersionedJSON<TextStyleSettingsProps>): TextStyleSettingsProps {\r\n if (oldData.version === TEXT_STYLE_SETTINGS_JSON_VERSION) return oldData.data;\r\n\r\n // Migrate from 1.0.0 to 1.0.1\r\n if (oldData.data.leader && !oldData.data.leader.terminatorShape) {\r\n oldData.data.leader.terminatorShape = TextStyleSettings.defaultProps.leader.terminatorShape;\r\n }\r\n // Migrate from 1.0.1 to 1.0.2.\r\n if (oldData.version === \"1.0.1\") {\r\n // In 1.0.2, margins are specified as a fraction of text height instead of absolute values.\r\n const textHeight = oldData.data.textHeight ?? TextStyleSettings.defaultProps.textHeight;\r\n const margins = oldData.data.margins ?? TextStyleSettings.defaultProps.margins;\r\n oldData.data.margins = {\r\n top: (margins.top ?? TextStyleSettings.defaultProps.margins.top) / textHeight,\r\n bottom: (margins.bottom ?? TextStyleSettings.defaultProps.margins.bottom) / textHeight,\r\n left: (margins.left ?? TextStyleSettings.defaultProps.margins.left) / textHeight,\r\n right: (margins.right ?? TextStyleSettings.defaultProps.margins.right) / textHeight,\r\n };\r\n }\r\n return oldData.data;\r\n\r\n}\r\n\r\n/** Arguments supplied when creating an [[AnnotationTextStyle]].\r\n * @beta\r\n */\r\nexport interface TextStyleCreateArgs {\r\n /** The ID of the [[DefinitionModel]]. */\r\n definitionModelId: Id64String;\r\n /** The name to assign to the [[AnnotationTextStyle]]. */\r\n name: string;\r\n /** Optional text style settings used to create the [[AnnotationTextStyle]]. Default settings will be used if not provided. */\r\n settings?: TextStyleSettingsProps;\r\n /** Optional description for the [[AnnotationTextStyle]]. */\r\n description?: string;\r\n}\r\n\r\n/**\r\n * The definition element that holds text style information.\r\n * The style is stored as a [TextStyleSettings]($common).\r\n * @beta\r\n */\r\nexport class AnnotationTextStyle extends DefinitionElement {\r\n /** @internal */\r\n public static override get className(): string { return \"AnnotationTextStyle\"; }\r\n /**\r\n * Optional text describing the `AnnotationTextStyle`.\r\n */\r\n public description?: string;\r\n /**\r\n * The text style settings for the `AnnotationTextStyle`.\r\n * @see [[TextStyleSettings]] for more information.\r\n */\r\n public settings: TextStyleSettings;\r\n\r\n protected constructor(props: AnnotationTextStyleProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n this.description = props.description;\r\n const settingsProps = AnnotationTextStyle.parseTextStyleSettings(props.settings);\r\n this.settings = TextStyleSettings.fromJSON(settingsProps?.data);\r\n }\r\n\r\n /**\r\n * Creates a Code for an `AnnotationTextStyle` given a name that is meant to be unique within the scope of the specified DefinitionModel.\r\n *\r\n * @param iModel - The IModelDb.\r\n * @param definitionModelId - The ID of the DefinitionModel that contains the AnnotationTextStyle and provides the scope for its name.\r\n * @param name - The AnnotationTextStyle name.\r\n * @beta\r\n */\r\n public static createCode(iModel: IModelDb, definitionModelId: CodeScopeProps, name: string): Code {\r\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.annotationTextStyle);\r\n return new Code({ spec: codeSpec.id, scope: definitionModelId, value: name });\r\n }\r\n\r\n /**\r\n * Creates a new instance of `AnnotationTextStyle` with the specified properties.\r\n *\r\n * @param iModelDb - The iModelDb.\r\n * @param arg - The arguments for creating the AnnotationTextStyle.\r\n * @beta\r\n */\r\n public static create(iModelDb: IModelDb, arg: TextStyleCreateArgs): AnnotationTextStyle {\r\n const props: AnnotationTextStyleProps = {\r\n classFullName: this.classFullName,\r\n model: arg.definitionModelId,\r\n code: this.createCode(iModelDb, arg.definitionModelId, arg.name).toJSON(),\r\n description: arg.description,\r\n settings: arg.settings ? JSON.stringify({ version: TEXT_STYLE_SETTINGS_JSON_VERSION, data: arg.settings }) : undefined,\r\n }\r\n return new this(props, iModelDb);\r\n }\r\n\r\n /**\r\n * Converts the current `AnnotationTextStyle` instance to its JSON representation.\r\n * @inheritdoc\r\n */\r\n public override toJSON(): AnnotationTextStyleProps {\r\n const props = super.toJSON() as AnnotationTextStyleProps;\r\n props.description = this.description;\r\n props.settings = JSON.stringify({ version: TEXT_STYLE_SETTINGS_JSON_VERSION, data: this.settings.toJSON() });\r\n return props;\r\n }\r\n\r\n /** Creates a new instance of `AnnotationTextStyle` from its JSON representation. */\r\n public static fromJSON(props: AnnotationTextStyleProps, iModel: IModelDb): AnnotationTextStyle {\r\n return new AnnotationTextStyle(props, iModel);\r\n }\r\n\r\n /**\r\n * Validates that the AnnotationTextStyle's settings are valid before insert.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onInsert(arg: OnElementPropsArg): void {\r\n super.onInsert(arg);\r\n this.validateSettings(arg.props);\r\n }\r\n\r\n /**\r\n * Validates that the AnnotationTextStyle's settings are valid before update.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onUpdate(arg: OnElementPropsArg): void {\r\n super.onUpdate(arg);\r\n this.validateSettings(arg.props);\r\n }\r\n\r\n private static validateSettings(props: AnnotationTextStyleProps): void {\r\n const settingProps = AnnotationTextStyle.parseTextStyleSettings(props.settings);\r\n if (!settingProps) return;\r\n const settings = TextStyleSettings.fromJSON(settingProps.data);\r\n const errors = settings.getValidationErrors();\r\n if (errors.length > 0) {\r\n throw new Error(`Invalid AnnotationTextStyle settings: ${errors.join(\", \")}`);\r\n }\r\n }\r\n\r\n /**\r\n * AnnotationTextStyle custom HandledProps include 'settings'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override readonly _customHandledProps: CustomHandledProperty[] = [\r\n { propertyName: \"settings\", source: \"Class\" },\r\n ];\r\n\r\n /**\r\n * AnnotationTextStyle deserializes 'settings'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override deserialize(props: DeserializeEntityArgs): AnnotationTextStyleProps {\r\n const elProps = super.deserialize(props) as AnnotationTextStyleProps;\r\n const settings = this.parseTextStyleSettings(props.row.settings);\r\n if (settings) {\r\n elProps.settings = JSON.stringify(settings);\r\n }\r\n return elProps;\r\n }\r\n\r\n /**\r\n * AnnotationTextStyle serializes 'settings'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override serialize(props: AnnotationTextStyleProps, iModel: IModelDb): ECSqlRow {\r\n const inst = super.serialize(props, iModel);\r\n if (props.settings !== undefined) {\r\n inst.settings = props.settings;\r\n }\r\n return inst;\r\n }\r\n\r\n /** Parses, validates, and potentially migrates the text style settings data from a JSON string. */\r\n private static parseTextStyleSettings(json: string | undefined): VersionedJSON<TextStyleSettingsProps> | undefined {\r\n if (!json) return undefined;\r\n return validateAndMigrateVersionedJSON<TextStyleSettingsProps>(json, TEXT_STYLE_SETTINGS_JSON_VERSION, migrateTextStyleSettings);\r\n }\r\n\r\n /** When copying an element from one iModel to another, returns the Id of the AnnotationTextStyle in the `context`'s target iModel\r\n * corresponding to `sourceTextStyleId`, or [Id64.invalid]($bentley) if no corresponding text style exists.\r\n * If a text style with the same [Code]($common) exists in the target iModel, the style Id will be remapped to refer to that style.\r\n * Otherwise, a copy of the style will be imported into the target iModel and its element Id returned.\r\n * Implementations of [[ITextAnnotation]] should invoke this function when implementing their [[Element.onCloned]] method.\r\n * @throws Error if an attempt to import the text style failed.\r\n */\r\n public static async remapTextStyleId(sourceTextStyleId: Id64String, context: IModelElementCloneContext): Promise<Id64String> {\r\n // No remapping necessary if there's no text style or we're not copying to a different iModel.\r\n if (!Id64.isValid(sourceTextStyleId) || !context.isBetweenIModels) {\r\n return sourceTextStyleId;\r\n }\r\n\r\n // If the style's already been remapped, we're finished.\r\n let dstStyleId: Id64String | undefined = context.findTargetElementId(sourceTextStyleId);\r\n if (Id64.isValid(dstStyleId)) {\r\n return dstStyleId;\r\n }\r\n\r\n // Look up the style. It really ought to exist.\r\n const srcStyle = context.sourceDb.elements.tryGetElement<AnnotationTextStyle>(sourceTextStyleId);\r\n if (!srcStyle) {\r\n return Id64.invalid;\r\n }\r\n\r\n // If a style with the same code exists in the target iModel, remap to that one.\r\n dstStyleId = context.targetDb.elements.queryElementIdByCode(srcStyle.code);\r\n if (undefined !== dstStyleId) {\r\n return dstStyleId;\r\n }\r\n\r\n // Copy the style into the target iModel and remap its Id.\r\n const dstStyleProps = await context.cloneElement(srcStyle);\r\n dstStyleId = context.targetDb.getIndirectTxn().insertElement(dstStyleProps);\r\n assert(undefined !== dstStyleId);\r\n context.remapElement(sourceTextStyleId, dstStyleId);\r\n return dstStyleId;\r\n }\r\n\r\n protected static override async onCloned(context: IModelElementCloneContext, srcProps: AnnotationTextStyleProps, dstProps: AnnotationTextStyleProps): Promise<void> {\r\n await super.onCloned(context, srcProps, dstProps);\r\n if (!context.isBetweenIModels) {\r\n return;\r\n }\r\n\r\n const settingsProps = AnnotationTextStyle.parseTextStyleSettings(srcProps.settings);\r\n const font = TextStyleSettings.fromJSON(settingsProps?.data).font;\r\n\r\n const fontsToEmbed = [];\r\n for (const file of context.sourceDb.fonts.queryEmbeddedFontFiles()) {\r\n if (file.type === font.type && file.faces.some((face) => face.familyName === font.name)) {\r\n fontsToEmbed.push(file);\r\n }\r\n }\r\n\r\n await Promise.all(fontsToEmbed.map(async (file) => context.targetDb.fonts.embedFontFile({ file })));\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"TextAnnotationElement.js","sourceRoot":"","sources":["../../../src/annotations/TextAnnotationElement.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\n\r\nimport { AnnotationTextStyleProps, BisCodeSpec, Code, CodeProps, CodeScopeProps, CodeSpec, ECVersionString, ElementGeometry, ElementGeometryBuilderParams, EntityReferenceSet, Placement2d, Placement2dProps, Placement3d, Placement3dProps, PlacementProps, TextAnnotation, TextAnnotation2dProps, TextAnnotation3dProps, TextAnnotationProps, TextStyleSettings, TextStyleSettingsProps, traverseTextBlockComponent, VersionedJSON } from \"@itwin/core-common\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { AnnotationElement2d, DefinitionElement, Drawing, GraphicalElement3d, OnElementIdArg, OnElementPropsArg } from \"../Element\";\r\nimport { assert, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { layoutTextBlock, TextStyleResolver } from \"./TextBlockLayout\";\r\nimport { appendTextAnnotationGeometry } from \"./TextAnnotationGeometry\";\r\nimport { ElementDrivesTextAnnotation, TextAnnotationUsesTextStyleByDefault, TextBlockAndId } from \"./ElementDrivesTextAnnotation\";\r\nimport { IModelElementCloneContext } from \"../IModelElementCloneContext\";\r\nimport { CustomHandledProperty, DeserializeEntityArgs, ECSqlRow } from \"../Entity\";\r\n\r\nimport * as semver from \"semver\";\r\n\r\n\r\n/** The version of the JSON stored in `TextAnnotation2d/3dProps.textAnnotationData` used by the code.\r\n * Uses the same semantics as [ECVersion]($ecschema-metadata).\r\n * @internal\r\n*/\r\nexport const TEXT_ANNOTATION_JSON_VERSION = \"1.0.0\";\r\n\r\nfunction validateAndMigrateVersionedJSON<T>(\r\n json: string,\r\n currentVersion: ECVersionString,\r\n migrate: (old: VersionedJSON<T>) => T\r\n): VersionedJSON<T> | undefined {\r\n let parsed;\r\n try {\r\n parsed = JSON.parse(json) as VersionedJSON<T>;\r\n } catch {\r\n return undefined;\r\n }\r\n\r\n const version = parsed.version;\r\n if (typeof version !== \"string\" || !semver.valid(version))\r\n throw new Error(\"JSON version is missing or invalid.\");\r\n\r\n if (typeof parsed.data !== \"object\" || parsed.data === null)\r\n throw new Error(\"JSON data is missing or invalid.\");\r\n\r\n // Newer\r\n if (semver.gt(version, currentVersion))\r\n throw new Error(`JSON version ${parsed.version} is newer than supported version ${currentVersion}. Application update required to understand data.`);\r\n\r\n // Older\r\n if (semver.lt(version, currentVersion)) {\r\n parsed.data = migrate(parsed);\r\n parsed.version = currentVersion;\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\nfunction migrateTextAnnotationData(oldData: VersionedJSON<TextAnnotationProps>): TextAnnotationProps {\r\n if (oldData.version === TEXT_ANNOTATION_JSON_VERSION) return oldData.data;\r\n\r\n // Place migration logic here.\r\n\r\n throw new Error(`Migration for textAnnotationData from version ${oldData.version} to ${TEXT_ANNOTATION_JSON_VERSION} failed.`);\r\n}\r\n\r\n/** Parses, validates, and potentially migrates the text annotation data from a JSON string.\r\n * @internal\r\n */\r\nexport function parseTextAnnotationData(json: string | undefined): VersionedJSON<TextAnnotationProps> | undefined {\r\n if (!json) return undefined;\r\n\r\n return validateAndMigrateVersionedJSON<TextAnnotationProps>(json, TEXT_ANNOTATION_JSON_VERSION, migrateTextAnnotationData);\r\n}\r\n\r\nfunction getElementGeometryBuilderParams(iModel: IModelDb, modelId: Id64String, categoryId: Id64String, _placementProps: PlacementProps, annotationProps?: TextAnnotationProps, textStyleId?: Id64String, _subCategory?: Id64String): ElementGeometryBuilderParams {\r\n const textBlock = TextAnnotation.fromJSON(annotationProps).textBlock;\r\n const textStyleResolver = new TextStyleResolver({ textBlock, textStyleId: textStyleId ?? \"\", iModel });\r\n const layout = layoutTextBlock({ iModel, textBlock, textStyleResolver });\r\n const builder = new ElementGeometry.Builder();\r\n let scaleFactor = 1;\r\n const element = iModel.elements.getElement(modelId);\r\n if (element instanceof Drawing)\r\n scaleFactor = element.scaleFactor;\r\n appendTextAnnotationGeometry({ layout, textStyleResolver, scaleFactor, annotationProps: annotationProps ?? {}, builder, categoryId });\r\n\r\n return { entryArray: builder.entries };\r\n}\r\n\r\n/** Arguments supplied when creating a [[TextAnnotation2d]].\r\n * @beta\r\n */\r\nexport interface TextAnnotation2dCreateArgs {\r\n /** The category ID for the annotation. */\r\n category: Id64String;\r\n /** The model ID where the annotation will be placed. */\r\n model: Id64String;\r\n /** The placement properties for the annotation. */\r\n placement: Placement2dProps;\r\n /** The default text style ID for the annotation. */\r\n defaultTextStyleId?: Id64String;\r\n /** Optional [[TextAnnotation]] JSON representation used to create the `TextAnnotation2d`. Essentially an empty element if not provided. */\r\n textAnnotationProps?: TextAnnotationProps;\r\n /** Optional code for the element. */\r\n code?: CodeProps;\r\n}\r\n\r\n/** Arguments supplied when creating a [[TextAnnotation3d]].\r\n * @beta\r\n */\r\nexport interface TextAnnotation3dCreateArgs {\r\n /** The category ID for the annotation. */\r\n category: Id64String;\r\n /** The model ID where the annotation will be placed. */\r\n model: Id64String;\r\n /** The placement properties for the annotation. */\r\n placement: Placement3dProps;\r\n /** The default text style ID for the annotation. */\r\n defaultTextStyleId?: Id64String;\r\n /** Optional [[TextAnnotation]] JSON representation used to create the `TextAnnotation3d`. Essentially an empty element if not provided. */\r\n textAnnotationProps?: TextAnnotationProps;\r\n /** Optional code for the element. */\r\n code?: CodeProps;\r\n}\r\n\r\n/** An element that displays textual content within a 2d model.\r\n * The text is stored as a [TextAnnotation]($common) from which the element's [geometry]($docs/learning/common/GeometryStream.md) and [Placement]($common) are computed.\r\n * @see [[setAnnotation]] to change the textual content.\r\n * @public @preview\r\n */\r\nexport class TextAnnotation2d extends AnnotationElement2d /* implements ITextAnnotation */ {\r\n /** @internal */\r\n public static override get className(): string { return \"TextAnnotation2d\"; }\r\n /**\r\n * The default [[AnnotationTextStyle]] used by the TextAnnotation2d.\r\n * @beta\r\n */\r\n public defaultTextStyle?: TextAnnotationUsesTextStyleByDefault;\r\n /** The data associated with the text annotation. */\r\n private _textAnnotationProps?: TextAnnotationProps;\r\n\r\n /** Extract the textual content, if present.\r\n * @see [[setAnnotation]] to change it.\r\n */\r\n public getAnnotation(): TextAnnotation | undefined {\r\n return this._textAnnotationProps ? TextAnnotation.fromJSON(this._textAnnotationProps) : undefined;\r\n }\r\n\r\n /** Change the textual content of the `TextAnnotation2d`.\r\n * @see [[getAnnotation]] to extract the current annotation.\r\n * @param annotation The new annotation\r\n */\r\n public setAnnotation(annotation: TextAnnotation) {\r\n this._textAnnotationProps = annotation.toJSON();\r\n }\r\n\r\n protected constructor(props: TextAnnotation2dProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n if (props.defaultTextStyle) {\r\n this.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(props.defaultTextStyle.id);\r\n }\r\n this._textAnnotationProps = parseTextAnnotationData(props.textAnnotationData)?.data;\r\n }\r\n\r\n /** Creates a new instance of `TextAnnotation2d` from its JSON representation. */\r\n public static fromJSON(props: TextAnnotation2dProps, iModel: IModelDb): TextAnnotation2d {\r\n return new TextAnnotation2d(props, iModel);\r\n }\r\n\r\n /**\r\n * Converts the current `TextAnnotation2d` instance to its JSON representation.\r\n * It also computes the `elementGeometryBuilderParams` property used to create the GeometryStream.\r\n * @inheritdoc\r\n */\r\n public override toJSON(): TextAnnotation2dProps {\r\n const props = super.toJSON() as TextAnnotation2dProps;\r\n props.textAnnotationData = this._textAnnotationProps ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: this._textAnnotationProps }) : undefined;\r\n if (this._textAnnotationProps) {\r\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(this.iModel, this.model, this.category, this.placement, this._textAnnotationProps, this.defaultTextStyle ? this.defaultTextStyle.id : undefined);\r\n }\r\n\r\n return props;\r\n }\r\n\r\n /** Creates a new `TextAnnotation2d` instance with the specified properties.\r\n * @param iModelDb The iModel.\r\n * @param arg The arguments for creating the TextAnnotation2d.\r\n * @beta\r\n */\r\n public static create(iModelDb: IModelDb, arg: TextAnnotation2dCreateArgs): TextAnnotation2d {\r\n const elementProps: TextAnnotation2dProps = {\r\n classFullName: this.classFullName,\r\n textAnnotationData: arg.textAnnotationProps ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: arg.textAnnotationProps }) : undefined,\r\n defaultTextStyle: arg.defaultTextStyleId ? new TextAnnotationUsesTextStyleByDefault(arg.defaultTextStyleId).toJSON() : undefined,\r\n placement: arg.placement,\r\n model: arg.model,\r\n category: arg.category,\r\n code: arg.code ?? Code.createEmpty(),\r\n };\r\n return new this(elementProps, iModelDb);\r\n }\r\n\r\n /**\r\n * Updates the geometry of the TextAnnotation2d on insert and validates version.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onInsert(arg: OnElementPropsArg): void {\r\n super.onInsert(arg);\r\n this.validateVersionAndUpdateGeometry(arg);\r\n }\r\n\r\n /**\r\n * Updates the geometry of the TextAnnotation2d on update and validates version.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onUpdate(arg: OnElementPropsArg): void {\r\n super.onUpdate(arg);\r\n this.validateVersionAndUpdateGeometry(arg);\r\n }\r\n\r\n /**\r\n * Populates the `elementGeometryBuilderParams` property in the [TextAnnotation2dProps]($common).\r\n * Only does this if the `elementGeometryBuilderParams` is not already set and if there is actually a text annotation to produce geometry for.\r\n * Also, validates the version of the text annotation data and migrates it if necessary.\r\n * @beta\r\n */\r\n protected static validateVersionAndUpdateGeometry(arg: OnElementPropsArg): void {\r\n const props = arg.props as TextAnnotation2dProps;\r\n const textAnnotationData = parseTextAnnotationData(props.textAnnotationData);\r\n if (!props.elementGeometryBuilderParams && textAnnotationData) {\r\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(arg.iModel, props.model, props.category, props.placement ?? Placement2d.fromJSON(), textAnnotationData.data, props.defaultTextStyle?.id);\r\n }\r\n }\r\n\r\n /**\r\n * TextAnnotation2d custom HandledProps include 'textAnnotationData'.\r\n * @inheritdoc\r\n * @internal\r\n */\r\n protected static override readonly _customHandledProps: CustomHandledProperty[] = [\r\n { propertyName: \"textAnnotationData\", source: \"Class\" },\r\n ];\r\n\r\n /**\r\n * TextAnnotation2d deserializes 'textAnnotationData'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override deserialize(props: DeserializeEntityArgs): TextAnnotation2dProps {\r\n const elProps = super.deserialize(props) as TextAnnotation2dProps;\r\n const textAnnotationData = parseTextAnnotationData(props.row.textAnnotationData);\r\n if (textAnnotationData) {\r\n elProps.textAnnotationData = JSON.stringify(textAnnotationData);\r\n }\r\n return elProps;\r\n }\r\n\r\n /**\r\n * TextAnnotation2d serializes 'textAnnotationData'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override serialize(props: TextAnnotation2dProps, iModel: IModelDb): ECSqlRow {\r\n const inst = super.serialize(props, iModel);\r\n if (props.textAnnotationData !== undefined) {\r\n inst.textAnnotationData = props.textAnnotationData;\r\n }\r\n return inst;\r\n }\r\n\r\n /** @internal */\r\n public getTextBlocks(): Iterable<TextBlockAndId> {\r\n return getTextBlocks(this);\r\n }\r\n\r\n /** @internal */\r\n public updateTextBlocks(textBlocks: TextBlockAndId[]): void {\r\n return updateTextBlocks(this, textBlocks);\r\n }\r\n\r\n /** @internal */\r\n public static override onInserted(arg: OnElementIdArg): void {\r\n super.onInserted(arg);\r\n ElementDrivesTextAnnotation.updateFieldDependencies(arg.iModel.getIndirectTxn(), arg.id);\r\n }\r\n\r\n /** @internal */\r\n public static override onUpdated(arg: OnElementIdArg): void {\r\n super.onUpdated(arg);\r\n ElementDrivesTextAnnotation.updateFieldDependencies(arg.iModel.getIndirectTxn(), arg.id);\r\n }\r\n\r\n protected override collectReferenceIds(referenceIds: EntityReferenceSet): void {\r\n super.collectReferenceIds(referenceIds);\r\n collectReferenceIds(this, referenceIds);\r\n }\r\n\r\n /** @internal */\r\n protected static override async onCloned(context: IModelElementCloneContext, srcProps: TextAnnotation2dProps, dstProps: TextAnnotation2dProps): Promise<void> {\r\n await super.onCloned(context, srcProps, dstProps);\r\n\r\n const srcElem = TextAnnotation2d.fromJSON(srcProps, context.sourceDb);\r\n ElementDrivesTextAnnotation.remapFields(srcElem, context);\r\n const anno = srcElem.getAnnotation();\r\n dstProps.textAnnotationData = anno ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: anno.toJSON() }) : undefined;\r\n\r\n return remapTextStyle(context, srcElem, dstProps);\r\n }\r\n}\r\n\r\n/** An element that displays textual content within a 3d model.\r\n * The text is stored as a [TextAnnotation]($common) from which the element's [geometry]($docs/learning/common/GeometryStream.md) and [Placement]($common) are computed.\r\n * @see [[setAnnotation]] to change the textual content.\r\n * @public @preview\r\n */\r\nexport class TextAnnotation3d extends GraphicalElement3d /* implements ITextAnnotation */ {\r\n /** @internal */\r\n public static override get className(): string { return \"TextAnnotation3d\"; }\r\n /**\r\n * The default [[AnnotationTextStyle]] used by the TextAnnotation3d.\r\n * @beta\r\n */\r\n public defaultTextStyle?: TextAnnotationUsesTextStyleByDefault;\r\n /** The data associated with the text annotation. */\r\n private _textAnnotationProps?: TextAnnotationProps;\r\n\r\n /** Extract the textual content, if present.\r\n * @see [[setAnnotation]] to change it.\r\n */\r\n public getAnnotation(): TextAnnotation | undefined {\r\n return this._textAnnotationProps ? TextAnnotation.fromJSON(this._textAnnotationProps) : undefined;\r\n }\r\n\r\n /** Change the textual content of the `TextAnnotation3d`.\r\n * @see [[getAnnotation]] to extract the current annotation.\r\n * @param annotation The new annotation\r\n */\r\n public setAnnotation(annotation: TextAnnotation) {\r\n this._textAnnotationProps = annotation.toJSON();\r\n }\r\n\r\n protected constructor(props: TextAnnotation3dProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n if (props.defaultTextStyle) {\r\n this.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(props.defaultTextStyle.id);\r\n }\r\n this._textAnnotationProps = parseTextAnnotationData(props.textAnnotationData)?.data;\r\n }\r\n\r\n /** Creates a new instance of `TextAnnotation3d` from its JSON representation. */\r\n public static fromJSON(props: TextAnnotation3dProps, iModel: IModelDb): TextAnnotation3d {\r\n return new TextAnnotation3d(props, iModel);\r\n }\r\n\r\n /**\r\n * Converts the current `TextAnnotation3d` instance to its JSON representation.\r\n * It also computes the `elementGeometryBuilderParams` property used to create the GeometryStream.\r\n * @inheritdoc\r\n */\r\n public override toJSON(): TextAnnotation3dProps {\r\n const props = super.toJSON() as TextAnnotation3dProps;\r\n props.textAnnotationData = this._textAnnotationProps ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: this._textAnnotationProps }) : undefined;\r\n if (this._textAnnotationProps) {\r\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(this.iModel, this.model, this.category, this.placement, this._textAnnotationProps, this.defaultTextStyle ? this.defaultTextStyle.id : undefined);\r\n }\r\n\r\n return props;\r\n }\r\n\r\n /** Creates a new `TextAnnotation3d` instance with the specified properties.\r\n * @param iModelDb The iModel.\r\n * @param arg The arguments for creating the TextAnnotation3d.\r\n * @beta\r\n */\r\n public static create(iModelDb: IModelDb, arg: TextAnnotation3dCreateArgs): TextAnnotation3d {\r\n const elementProps: TextAnnotation3dProps = {\r\n classFullName: this.classFullName,\r\n textAnnotationData: arg.textAnnotationProps ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: arg.textAnnotationProps }) : undefined,\r\n defaultTextStyle: arg.defaultTextStyleId ? new TextAnnotationUsesTextStyleByDefault(arg.defaultTextStyleId).toJSON() : undefined,\r\n placement: arg.placement,\r\n model: arg.model,\r\n category: arg.category,\r\n code: arg.code ?? Code.createEmpty(),\r\n };\r\n return new this(elementProps, iModelDb);\r\n }\r\n\r\n /**\r\n * Updates the geometry of the TextAnnotation3d on insert and validates version..\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onInsert(arg: OnElementPropsArg): void {\r\n super.onInsert(arg);\r\n this.validateVersionAndUpdateGeometry(arg);\r\n }\r\n\r\n /**\r\n * Updates the geometry of the TextAnnotation3d on update and validates version..\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onUpdate(arg: OnElementPropsArg): void {\r\n super.onUpdate(arg);\r\n this.validateVersionAndUpdateGeometry(arg);\r\n }\r\n\r\n /**\r\n * Populates the `elementGeometryBuilderParams` property in the [TextAnnotation3dProps]($common).\r\n * Only does this if the `elementGeometryBuilderParams` is not already set and if there is actually a text annotation to produce geometry for.\r\n * Also, validates the version of the text annotation data and migrates it if necessary.\r\n * @beta\r\n */\r\n protected static validateVersionAndUpdateGeometry(arg: OnElementPropsArg): void {\r\n const props = arg.props as TextAnnotation3dProps;\r\n const textAnnotationData = parseTextAnnotationData(props.textAnnotationData);\r\n if (!props.elementGeometryBuilderParams && textAnnotationData) {\r\n props.elementGeometryBuilderParams = getElementGeometryBuilderParams(arg.iModel, props.model, props.category, props.placement ?? Placement3d.fromJSON(), textAnnotationData.data, props.defaultTextStyle?.id);\r\n }\r\n }\r\n\r\n /**\r\n * TextAnnotation3d custom HandledProps include 'textAnnotationData'.\r\n * @inheritdoc\r\n * @internal\r\n */\r\n protected static override readonly _customHandledProps: CustomHandledProperty[] = [\r\n { propertyName: \"textAnnotationData\", source: \"Class\" },\r\n ];\r\n\r\n /**\r\n * TextAnnotation3d deserializes 'textAnnotationData'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override deserialize(props: DeserializeEntityArgs): TextAnnotation3dProps {\r\n const elProps = super.deserialize(props) as TextAnnotation3dProps;\r\n const textAnnotationData = parseTextAnnotationData(props.row.textAnnotationData);\r\n if (textAnnotationData) {\r\n elProps.textAnnotationData = JSON.stringify(textAnnotationData);\r\n }\r\n return elProps;\r\n }\r\n\r\n /**\r\n * TextAnnotation3d serializes 'textAnnotationData'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override serialize(props: TextAnnotation3dProps, iModel: IModelDb): ECSqlRow {\r\n const inst = super.serialize(props, iModel);\r\n if (props.textAnnotationData !== undefined) {\r\n inst.textAnnotationData = props.textAnnotationData;\r\n }\r\n return inst;\r\n }\r\n\r\n /** @internal */\r\n public getTextBlocks(): Iterable<TextBlockAndId> {\r\n return getTextBlocks(this);\r\n }\r\n\r\n /** @internal */\r\n public updateTextBlocks(textBlocks: TextBlockAndId[]): void {\r\n return updateTextBlocks(this, textBlocks);\r\n }\r\n\r\n /** @internal */\r\n public static override onInserted(arg: OnElementIdArg): void {\r\n super.onInserted(arg);\r\n ElementDrivesTextAnnotation.updateFieldDependencies(arg.iModel.getIndirectTxn(), arg.id);\r\n }\r\n\r\n /** @internal */\r\n public static override onUpdated(arg: OnElementIdArg): void {\r\n super.onUpdated(arg);\r\n ElementDrivesTextAnnotation.updateFieldDependencies(arg.iModel.getIndirectTxn(), arg.id);\r\n }\r\n\r\n protected override collectReferenceIds(referenceIds: EntityReferenceSet): void {\r\n super.collectReferenceIds(referenceIds);\r\n collectReferenceIds(this, referenceIds);\r\n }\r\n\r\n /** @internal */\r\n protected static override async onCloned(context: IModelElementCloneContext, srcProps: TextAnnotation3dProps, dstProps: TextAnnotation3dProps): Promise<void> {\r\n await super.onCloned(context, srcProps, dstProps);\r\n\r\n const srcElem = TextAnnotation3d.fromJSON(srcProps, context.sourceDb);\r\n ElementDrivesTextAnnotation.remapFields(srcElem, context);\r\n const anno = srcElem.getAnnotation();\r\n dstProps.textAnnotationData = anno ? JSON.stringify({ version: TEXT_ANNOTATION_JSON_VERSION, data: anno.toJSON() }) : undefined;\r\n\r\n return remapTextStyle(context, srcElem, dstProps);\r\n }\r\n}\r\n\r\nasync function remapTextStyle(\r\n context: IModelElementCloneContext,\r\n srcElem: TextAnnotation2d | TextAnnotation3d,\r\n dstProps: TextAnnotation2dProps | TextAnnotation3dProps\r\n): Promise<void> {\r\n const dstStyleId = await AnnotationTextStyle.remapTextStyleId(srcElem.defaultTextStyle?.id ?? Id64.invalid, context);\r\n dstProps.defaultTextStyle = Id64.isValid(dstStyleId) ? new TextAnnotationUsesTextStyleByDefault(dstStyleId).toJSON() : undefined;\r\n}\r\n\r\nfunction collectReferenceIds(elem: TextAnnotation2d | TextAnnotation3d, referenceIds: EntityReferenceSet): void {\r\n const style = elem.defaultTextStyle?.id;\r\n if (style && Id64.isValidId64(style)) {\r\n referenceIds.addElement(style);\r\n }\r\n\r\n const block = elem.getAnnotation()?.textBlock;\r\n if (block) {\r\n for (const { child } of traverseTextBlockComponent(block)) {\r\n if (child.type === \"field\") {\r\n const hostId = child.propertyHost.elementId;\r\n if (Id64.isValidId64(hostId)) {\r\n referenceIds.addElement(hostId);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction getTextBlocks(elem: TextAnnotation2d | TextAnnotation3d): Iterable<TextBlockAndId> {\r\n const annotation = elem.getAnnotation();\r\n return annotation ? [{ textBlock: annotation.textBlock, id: undefined }] : [];\r\n}\r\n\r\nfunction updateTextBlocks(elem: TextAnnotation2d | TextAnnotation3d, textBlocks: TextBlockAndId[]): void {\r\n assert(textBlocks.length === 1);\r\n assert(textBlocks[0].id === undefined);\r\n\r\n const annotation = elem.getAnnotation();\r\n if (!annotation) {\r\n // We must obtain the TextBlockAndId from the element in the first place, so the only way we could end up here is if\r\n // somebody removed the text annotation after we called getTextBlocks. That's gotta be a mistake.\r\n throw new Error(\"Text annotation element has no text\");\r\n }\r\n\r\n annotation.textBlock = textBlocks[0].textBlock;\r\n\r\n elem.setAnnotation(annotation);\r\n}\r\n\r\n/** The version of the JSON stored in `AnnotationTextStyleProps.settings` used by the code.\r\n * Uses the same semantics as [ECVersion]($ecschema-metadata).\r\n * @internal\r\n*/\r\n// 1.0.1 - Added terminatorShapes for leaders\r\n// 1.0.2 - Changed margins to be fractions of text height instead of absolute values\r\n// 1.0.3 - Added new leader style properties for targetPoint feature (showLeaders,showTerminators,showTargetPoint,targetPointShape,targetPointOffsetFactor)\r\nexport const TEXT_STYLE_SETTINGS_JSON_VERSION = \"1.0.3\";\r\n\r\nfunction migrateTextStyleSettings(oldData: VersionedJSON<TextStyleSettingsProps>): TextStyleSettingsProps {\r\n const data = oldData.data;\r\n const version = oldData.version;\r\n if (version === TEXT_STYLE_SETTINGS_JSON_VERSION) return data;\r\n\r\n // Migrate from 1.0.0 to 1.0.1\r\n if (semver.lt(version, \"1.0.1\")) {\r\n if (data.leader && !data.leader.terminatorShape) {\r\n data.leader.terminatorShape = TextStyleSettings.defaultProps.leader.terminatorShape;\r\n }\r\n }\r\n // Migrate from 1.0.1 to 1.0.2.\r\n if (semver.lt(version, \"1.0.2\")) {\r\n // In 1.0.2, margins are specified as a fraction of text height instead of absolute values.\r\n const textHeight = data.textHeight ?? TextStyleSettings.defaultProps.textHeight;\r\n const margins = data.margins ?? TextStyleSettings.defaultProps.margins;\r\n data.margins = {\r\n top: (margins.top ?? TextStyleSettings.defaultProps.margins.top) / textHeight,\r\n bottom: (margins.bottom ?? TextStyleSettings.defaultProps.margins.bottom) / textHeight,\r\n left: (margins.left ?? TextStyleSettings.defaultProps.margins.left) / textHeight,\r\n right: (margins.right ?? TextStyleSettings.defaultProps.margins.right) / textHeight,\r\n };\r\n }\r\n\r\n // Migrate from 1.0.2 to 1.0.3.\r\n if (semver.lt(version, \"1.0.3\")) {\r\n if (data.leader) {\r\n data.leader.showLeaders = data.leader?.showLeaders ?? TextStyleSettings.defaultProps.leader.showLeaders;\r\n data.leader.showTerminators = data.leader?.showTerminators ?? TextStyleSettings.defaultProps.leader.showTerminators;\r\n data.leader.showTargetPoint = data.leader?.showTargetPoint ?? TextStyleSettings.defaultProps.leader.showTargetPoint;\r\n data.leader.targetPointShape = data.leader?.targetPointShape ?? TextStyleSettings.defaultProps.leader.targetPointShape;\r\n data.leader.targetPointOffsetFactor = data.leader?.targetPointOffsetFactor ?? TextStyleSettings.defaultProps.leader.targetPointOffsetFactor;\r\n }\r\n\r\n }\r\n return data;\r\n\r\n}\r\n\r\n/** Arguments supplied when creating an [[AnnotationTextStyle]].\r\n * @beta\r\n */\r\nexport interface TextStyleCreateArgs {\r\n /** The ID of the [[DefinitionModel]]. */\r\n definitionModelId: Id64String;\r\n /** The name to assign to the [[AnnotationTextStyle]]. */\r\n name: string;\r\n /** Optional text style settings used to create the [[AnnotationTextStyle]]. Default settings will be used if not provided. */\r\n settings?: TextStyleSettingsProps;\r\n /** Optional description for the [[AnnotationTextStyle]]. */\r\n description?: string;\r\n}\r\n\r\n/**\r\n * The definition element that holds text style information.\r\n * The style is stored as a [TextStyleSettings]($common).\r\n * @beta\r\n */\r\nexport class AnnotationTextStyle extends DefinitionElement {\r\n /** @internal */\r\n public static override get className(): string { return \"AnnotationTextStyle\"; }\r\n /**\r\n * Optional text describing the `AnnotationTextStyle`.\r\n */\r\n public description?: string;\r\n /**\r\n * The text style settings for the `AnnotationTextStyle`.\r\n * @see [[TextStyleSettings]] for more information.\r\n */\r\n public settings: TextStyleSettings;\r\n\r\n protected constructor(props: AnnotationTextStyleProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n this.description = props.description;\r\n const settingsProps = AnnotationTextStyle.parseTextStyleSettings(props.settings);\r\n this.settings = TextStyleSettings.fromJSON(settingsProps?.data);\r\n }\r\n\r\n /**\r\n * Creates a Code for an `AnnotationTextStyle` given a name that is meant to be unique within the scope of the specified DefinitionModel.\r\n *\r\n * @param iModel - The IModelDb.\r\n * @param definitionModelId - The ID of the DefinitionModel that contains the AnnotationTextStyle and provides the scope for its name.\r\n * @param name - The AnnotationTextStyle name.\r\n * @beta\r\n */\r\n public static createCode(iModel: IModelDb, definitionModelId: CodeScopeProps, name: string): Code {\r\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.annotationTextStyle);\r\n return new Code({ spec: codeSpec.id, scope: definitionModelId, value: name });\r\n }\r\n\r\n /**\r\n * Creates a new instance of `AnnotationTextStyle` with the specified properties.\r\n *\r\n * @param iModelDb - The iModelDb.\r\n * @param arg - The arguments for creating the AnnotationTextStyle.\r\n * @beta\r\n */\r\n public static create(iModelDb: IModelDb, arg: TextStyleCreateArgs): AnnotationTextStyle {\r\n const props: AnnotationTextStyleProps = {\r\n classFullName: this.classFullName,\r\n model: arg.definitionModelId,\r\n code: this.createCode(iModelDb, arg.definitionModelId, arg.name).toJSON(),\r\n description: arg.description,\r\n settings: arg.settings ? JSON.stringify({ version: TEXT_STYLE_SETTINGS_JSON_VERSION, data: arg.settings }) : undefined,\r\n }\r\n return new this(props, iModelDb);\r\n }\r\n\r\n /**\r\n * Converts the current `AnnotationTextStyle` instance to its JSON representation.\r\n * @inheritdoc\r\n */\r\n public override toJSON(): AnnotationTextStyleProps {\r\n const props = super.toJSON() as AnnotationTextStyleProps;\r\n props.description = this.description;\r\n props.settings = JSON.stringify({ version: TEXT_STYLE_SETTINGS_JSON_VERSION, data: this.settings.toJSON() });\r\n return props;\r\n }\r\n\r\n /** Creates a new instance of `AnnotationTextStyle` from its JSON representation. */\r\n public static fromJSON(props: AnnotationTextStyleProps, iModel: IModelDb): AnnotationTextStyle {\r\n return new AnnotationTextStyle(props, iModel);\r\n }\r\n\r\n /**\r\n * Validates that the AnnotationTextStyle's settings are valid before insert.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onInsert(arg: OnElementPropsArg): void {\r\n super.onInsert(arg);\r\n this.validateSettings(arg.props);\r\n }\r\n\r\n /**\r\n * Validates that the AnnotationTextStyle's settings are valid before update.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override onUpdate(arg: OnElementPropsArg): void {\r\n super.onUpdate(arg);\r\n this.validateSettings(arg.props);\r\n }\r\n\r\n private static validateSettings(props: AnnotationTextStyleProps): void {\r\n const settingProps = AnnotationTextStyle.parseTextStyleSettings(props.settings);\r\n if (!settingProps) return;\r\n const settings = TextStyleSettings.fromJSON(settingProps.data);\r\n const errors = settings.getValidationErrors();\r\n if (errors.length > 0) {\r\n throw new Error(`Invalid AnnotationTextStyle settings: ${errors.join(\", \")}`);\r\n }\r\n }\r\n\r\n /**\r\n * AnnotationTextStyle custom HandledProps include 'settings'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n protected static override readonly _customHandledProps: CustomHandledProperty[] = [\r\n { propertyName: \"settings\", source: \"Class\" },\r\n ];\r\n\r\n /**\r\n * AnnotationTextStyle deserializes 'settings'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override deserialize(props: DeserializeEntityArgs): AnnotationTextStyleProps {\r\n const elProps = super.deserialize(props) as AnnotationTextStyleProps;\r\n const settings = this.parseTextStyleSettings(props.row.settings);\r\n if (settings) {\r\n elProps.settings = JSON.stringify(settings);\r\n }\r\n return elProps;\r\n }\r\n\r\n /**\r\n * AnnotationTextStyle serializes 'settings'.\r\n * @inheritdoc\r\n * @beta\r\n */\r\n public static override serialize(props: AnnotationTextStyleProps, iModel: IModelDb): ECSqlRow {\r\n const inst = super.serialize(props, iModel);\r\n if (props.settings !== undefined) {\r\n inst.settings = props.settings;\r\n }\r\n return inst;\r\n }\r\n\r\n /** Parses, validates, and potentially migrates the text style settings data from a JSON string. */\r\n private static parseTextStyleSettings(json: string | undefined): VersionedJSON<TextStyleSettingsProps> | undefined {\r\n if (!json) return undefined;\r\n return validateAndMigrateVersionedJSON<TextStyleSettingsProps>(json, TEXT_STYLE_SETTINGS_JSON_VERSION, migrateTextStyleSettings);\r\n }\r\n\r\n /** When copying an element from one iModel to another, returns the Id of the AnnotationTextStyle in the `context`'s target iModel\r\n * corresponding to `sourceTextStyleId`, or [Id64.invalid]($bentley) if no corresponding text style exists.\r\n * If a text style with the same [Code]($common) exists in the target iModel, the style Id will be remapped to refer to that style.\r\n * Otherwise, a copy of the style will be imported into the target iModel and its element Id returned.\r\n * Implementations of [[ITextAnnotation]] should invoke this function when implementing their [[Element.onCloned]] method.\r\n * @throws Error if an attempt to import the text style failed.\r\n */\r\n public static async remapTextStyleId(sourceTextStyleId: Id64String, context: IModelElementCloneContext): Promise<Id64String> {\r\n // No remapping necessary if there's no text style or we're not copying to a different iModel.\r\n if (!Id64.isValid(sourceTextStyleId) || !context.isBetweenIModels) {\r\n return sourceTextStyleId;\r\n }\r\n\r\n // If the style's already been remapped, we're finished.\r\n let dstStyleId: Id64String | undefined = context.findTargetElementId(sourceTextStyleId);\r\n if (Id64.isValid(dstStyleId)) {\r\n return dstStyleId;\r\n }\r\n\r\n // Look up the style. It really ought to exist.\r\n const srcStyle = context.sourceDb.elements.tryGetElement<AnnotationTextStyle>(sourceTextStyleId);\r\n if (!srcStyle) {\r\n return Id64.invalid;\r\n }\r\n\r\n // If a style with the same code exists in the target iModel, remap to that one.\r\n dstStyleId = context.targetDb.elements.queryElementIdByCode(srcStyle.code);\r\n if (undefined !== dstStyleId) {\r\n return dstStyleId;\r\n }\r\n\r\n // Copy the style into the target iModel and remap its Id.\r\n const dstStyleProps = await context.cloneElement(srcStyle);\r\n dstStyleId = context.targetDb.getIndirectTxn().insertElement(dstStyleProps);\r\n assert(undefined !== dstStyleId);\r\n context.remapElement(sourceTextStyleId, dstStyleId);\r\n return dstStyleId;\r\n }\r\n\r\n protected static override async onCloned(context: IModelElementCloneContext, srcProps: AnnotationTextStyleProps, dstProps: AnnotationTextStyleProps): Promise<void> {\r\n await super.onCloned(context, srcProps, dstProps);\r\n if (!context.isBetweenIModels) {\r\n return;\r\n }\r\n\r\n const settingsProps = AnnotationTextStyle.parseTextStyleSettings(srcProps.settings);\r\n const font = TextStyleSettings.fromJSON(settingsProps?.data).font;\r\n\r\n const fontsToEmbed = [];\r\n for (const file of context.sourceDb.fonts.queryEmbeddedFontFiles()) {\r\n if (file.type === font.type && file.faces.some((face) => face.familyName === font.name)) {\r\n fontsToEmbed.push(file);\r\n }\r\n }\r\n\r\n await Promise.all(fontsToEmbed.map(async (file) => context.targetDb.fonts.embedFontFile({ file })));\r\n }\r\n}\r\n"]}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { expect } from "chai";
|
|
6
|
-
import { ColorDef, GeometryParams, LineBreakRun, terminatorShapes, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
|
|
7
|
-
import { LineSegment3d, LineString3d, Point3d, Range2d, YawPitchRollAngles } from "@itwin/core-geometry";
|
|
6
|
+
import { ColorDef, GeometryParams, LineBreakRun, targetPointShapes, terminatorShapes, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
|
|
7
|
+
import { Arc3d, LineSegment3d, LineString3d, Point3d, Range2d, YawPitchRollAngles } from "@itwin/core-geometry";
|
|
8
8
|
import { appendLeadersToBuilder, computeElbowDirection, computeFrame, computeLeaderAttachmentPoint, TextStyleResolver } from "../../core-backend";
|
|
9
9
|
import { Id64 } from "@itwin/core-bentley";
|
|
10
10
|
import { doLayout, MockBuilder } from "../AnnotationTestUtils";
|
|
@@ -218,6 +218,182 @@ describe("LeaderGeometry", () => {
|
|
|
218
218
|
});
|
|
219
219
|
});
|
|
220
220
|
});
|
|
221
|
+
it("should not append any geometry when both showLeaders and showTargetPoint are false", () => {
|
|
222
|
+
const targetLeaders = [{
|
|
223
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
224
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
225
|
+
styleOverrides: { leader: { showLeaders: false, showTargetPoint: false } },
|
|
226
|
+
}];
|
|
227
|
+
const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
228
|
+
expect(result).to.be.true;
|
|
229
|
+
expect(builder.geometries.length).to.equal(0);
|
|
230
|
+
});
|
|
231
|
+
it("should not append leader line or terminator when showLeaders is false", () => {
|
|
232
|
+
const targetLeaders = [{
|
|
233
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
234
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
235
|
+
styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: "cross" } },
|
|
236
|
+
}];
|
|
237
|
+
const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
238
|
+
expect(result).to.be.true;
|
|
239
|
+
// Only the target point graphic (a "cross" => two line segments) should be present.
|
|
240
|
+
expect(builder.geometries.length).to.equal(2);
|
|
241
|
+
for (const geometry of builder.geometries)
|
|
242
|
+
expect(geometry).to.be.instanceOf(LineSegment3d);
|
|
243
|
+
});
|
|
244
|
+
it("should append the leader line but no terminator when showTerminators is false", () => {
|
|
245
|
+
const targetLeaders = [{
|
|
246
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
247
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
248
|
+
styleOverrides: { leader: { showLeaders: true, showTerminators: false, showTargetPoint: false } },
|
|
249
|
+
}];
|
|
250
|
+
const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
251
|
+
expect(result).to.be.true;
|
|
252
|
+
// Only the leader line should be present, with no terminator geometry.
|
|
253
|
+
expect(builder.geometries.length).to.equal(1);
|
|
254
|
+
expect(builder.geometries[0]).to.be.instanceOf(LineString3d);
|
|
255
|
+
});
|
|
256
|
+
it("should append the target point graphic in addition to the leader line and terminator when showTargetPoint is true", () => {
|
|
257
|
+
const targetLeaders = [{
|
|
258
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
259
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
260
|
+
styleOverrides: { leader: { showLeaders: true, showTerminators: true, showTargetPoint: true, targetPointShape: "cross" } },
|
|
261
|
+
}];
|
|
262
|
+
const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
263
|
+
expect(result).to.be.true;
|
|
264
|
+
// leader line (1) + openArrow terminator (1) + cross target point (2) = 4 geometry entries.
|
|
265
|
+
expect(builder.geometries.length).to.equal(4);
|
|
266
|
+
expect(builder.geometries[0]).to.be.instanceOf(LineString3d); // leader line
|
|
267
|
+
expect(builder.geometries[1]).to.be.instanceOf(LineString3d); // openArrow terminator
|
|
268
|
+
expect(builder.geometries[2]).to.be.instanceOf(LineSegment3d); // cross segment
|
|
269
|
+
expect(builder.geometries[3]).to.be.instanceOf(LineSegment3d); // cross segment
|
|
270
|
+
});
|
|
271
|
+
// Disable the leader line so that only the target point graphic is produced, making the assertions unambiguous.
|
|
272
|
+
const makeTargetPointLeader = (shape) => ({
|
|
273
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
274
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
275
|
+
styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: shape } },
|
|
276
|
+
});
|
|
277
|
+
it("should draw a 'cross' target point as two crossed line segments", () => {
|
|
278
|
+
const result = appendLeadersToBuilder(builder, [makeTargetPointLeader("cross")], layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
279
|
+
expect(result).to.be.true;
|
|
280
|
+
expect(builder.geometries.length).to.equal(2);
|
|
281
|
+
for (const geometry of builder.geometries)
|
|
282
|
+
expect(geometry).to.be.instanceOf(LineSegment3d);
|
|
283
|
+
});
|
|
284
|
+
it("should draw a 'plus' target point as two orthogonal line segments", () => {
|
|
285
|
+
const result = appendLeadersToBuilder(builder, [makeTargetPointLeader("plus")], layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
286
|
+
expect(result).to.be.true;
|
|
287
|
+
expect(builder.geometries.length).to.equal(2);
|
|
288
|
+
for (const geometry of builder.geometries)
|
|
289
|
+
expect(geometry).to.be.instanceOf(LineSegment3d);
|
|
290
|
+
});
|
|
291
|
+
it("should draw a 'circle' target point with a radius of half the terminator height", () => {
|
|
292
|
+
const terminatorHalfHeight = (TextStyleSettings.defaultProps.leader.terminatorHeightFactor ?? 1) * textHeight / 2;
|
|
293
|
+
const result = appendLeadersToBuilder(builder, [makeTargetPointLeader("circle")], layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
294
|
+
expect(result).to.be.true;
|
|
295
|
+
expect(builder.geometries.length).to.equal(1);
|
|
296
|
+
const circle = builder.geometries[0];
|
|
297
|
+
expect(circle).to.be.instanceOf(Arc3d);
|
|
298
|
+
expect(circle.circularRadius()).to.be.closeTo(terminatorHalfHeight, 0.01);
|
|
299
|
+
});
|
|
300
|
+
it("should draw a 'square' target point as a closed line string with equal width and height", () => {
|
|
301
|
+
const result = appendLeadersToBuilder(builder, [makeTargetPointLeader("square")], layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
302
|
+
expect(result).to.be.true;
|
|
303
|
+
expect(builder.geometries.length).to.equal(1);
|
|
304
|
+
const square = builder.geometries[0];
|
|
305
|
+
expect(square).to.be.instanceOf(LineString3d);
|
|
306
|
+
expect(square.points.length).to.equal(5); // closed loop
|
|
307
|
+
const width = Math.abs(square.points[1].x - square.points[0].x);
|
|
308
|
+
const height = Math.abs(square.points[2].y - square.points[1].y);
|
|
309
|
+
expect(width).to.be.closeTo(height, 0.01);
|
|
310
|
+
});
|
|
311
|
+
it("should draw a 'rectangle' target point as a closed line string using configured width and height", () => {
|
|
312
|
+
const terminatorWidth = (TextStyleSettings.defaultProps.leader.terminatorWidthFactor ?? 1) * textHeight;
|
|
313
|
+
const terminatorHeight = (TextStyleSettings.defaultProps.leader.terminatorHeightFactor ?? 1) * textHeight;
|
|
314
|
+
const result = appendLeadersToBuilder(builder, [makeTargetPointLeader("rectangle")], layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
315
|
+
expect(result).to.be.true;
|
|
316
|
+
expect(builder.geometries.length).to.equal(1);
|
|
317
|
+
const rectangle = builder.geometries[0];
|
|
318
|
+
expect(rectangle).to.be.instanceOf(LineString3d);
|
|
319
|
+
expect(rectangle.points.length).to.equal(5); // closed loop
|
|
320
|
+
const width = Math.abs(rectangle.points[1].x - rectangle.points[0].x);
|
|
321
|
+
const height = Math.abs(rectangle.points[2].y - rectangle.points[1].y);
|
|
322
|
+
expect(width).to.be.closeTo(terminatorWidth, 0.01);
|
|
323
|
+
expect(height).to.be.closeTo(terminatorHeight, 0.01);
|
|
324
|
+
});
|
|
325
|
+
it("should produce target point geometry for every predefined shape", () => {
|
|
326
|
+
for (const shape of targetPointShapes) {
|
|
327
|
+
const localBuilder = new MockBuilder();
|
|
328
|
+
const result = appendLeadersToBuilder(localBuilder, [makeTargetPointLeader(shape)], layout, transform, new GeometryParams(Id64.invalid), textStyleResolver, scaleFactor);
|
|
329
|
+
expect(result, `shape: ${shape}`).to.be.true;
|
|
330
|
+
expect(localBuilder.geometries.length, `shape: ${shape}`).to.be.greaterThan(0);
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
it("should not offset the leader start point when targetPointOffsetFactor is 0", () => {
|
|
334
|
+
const leader = {
|
|
335
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
336
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
337
|
+
styleOverrides: { leader: { showTargetPoint: true, targetPointOffsetFactor: 0 } },
|
|
338
|
+
};
|
|
339
|
+
const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
340
|
+
expect(result).to.be.true;
|
|
341
|
+
const leaderLine = builder.geometries[0];
|
|
342
|
+
expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.true;
|
|
343
|
+
});
|
|
344
|
+
it("should offset the leader start point away from the target point when targetPointOffsetFactor is non-zero", () => {
|
|
345
|
+
const offsetFactor = 2;
|
|
346
|
+
const leader = {
|
|
347
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
348
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
349
|
+
styleOverrides: { leader: { showTargetPoint: true, targetPointOffsetFactor: offsetFactor } },
|
|
350
|
+
};
|
|
351
|
+
const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
352
|
+
expect(result).to.be.true;
|
|
353
|
+
const leaderLine = builder.geometries[0];
|
|
354
|
+
// The leader line should start away from the original start point by offsetFactor * textHeight.
|
|
355
|
+
expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.false;
|
|
356
|
+
const offsetDistance = leaderLine.points[0].distance(leader.startPoint);
|
|
357
|
+
expect(offsetDistance).to.be.closeTo(offsetFactor * textHeight, 0.01);
|
|
358
|
+
});
|
|
359
|
+
it("should clamp oversized target-point offsets to the first leader segment", () => {
|
|
360
|
+
const leader = {
|
|
361
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
362
|
+
intermediatePoints: [Point3d.create(20, 0, 0)],
|
|
363
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
364
|
+
styleOverrides: { leader: { showLeaders: true, showTargetPoint: true, showTerminators: false, targetPointOffsetFactor: 100 } },
|
|
365
|
+
};
|
|
366
|
+
const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
367
|
+
expect(result).to.be.true;
|
|
368
|
+
const leaderLine = builder.geometries[0];
|
|
369
|
+
const offsetDistance = leaderLine.points[0].distance(leader.startPoint);
|
|
370
|
+
expect(offsetDistance).to.be.at.most(leader.startPoint.distance(leader.intermediatePoints[0]));
|
|
371
|
+
});
|
|
372
|
+
it("should treat negative target-point offsets as zero", () => {
|
|
373
|
+
const leader = {
|
|
374
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
375
|
+
intermediatePoints: [Point3d.create(20, 0, 0)],
|
|
376
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
377
|
+
styleOverrides: { leader: { showLeaders: true, showTargetPoint: true, showTerminators: false, targetPointOffsetFactor: -2 } },
|
|
378
|
+
};
|
|
379
|
+
const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
380
|
+
expect(result).to.be.true;
|
|
381
|
+
const leaderLine = builder.geometries[0];
|
|
382
|
+
expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.true;
|
|
383
|
+
});
|
|
384
|
+
it("should draw the target point graphic at the original start point regardless of the offset", () => {
|
|
385
|
+
const offsetFactor = 2;
|
|
386
|
+
const leader = {
|
|
387
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
388
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
389
|
+
styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: "circle", targetPointOffsetFactor: offsetFactor } },
|
|
390
|
+
};
|
|
391
|
+
const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
392
|
+
expect(result).to.be.true;
|
|
393
|
+
const circle = builder.geometries[0];
|
|
394
|
+
expect(circle).to.be.instanceOf(Arc3d);
|
|
395
|
+
expect(circle.center.isAlmostEqual(leader.startPoint)).to.be.true;
|
|
396
|
+
});
|
|
221
397
|
});
|
|
222
398
|
});
|
|
223
399
|
describe("computeElbowDirection", () => {
|