@itwin/core-backend 5.13.0-dev.9 → 5.14.0-dev.2
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/CHANGELOG.md +33 -1
- package/lib/cjs/Category.d.ts +4 -4
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts +5 -0
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +13 -3
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/CodeSpecs.d.ts +3 -3
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +2 -2
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/EditTxn.d.ts.map +1 -1
- package/lib/cjs/EditTxn.js +1 -0
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/Element.d.ts +48 -12
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +120 -24
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +30 -15
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +51 -15
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/Model.d.ts +5 -5
- package/lib/cjs/Model.d.ts.map +1 -1
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/PropertyStore.js +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/SchemaSync.d.ts +37 -9
- package/lib/cjs/SchemaSync.d.ts.map +1 -1
- package/lib/cjs/SchemaSync.js +125 -6
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SynchronousChannel.d.ts +62 -0
- package/lib/cjs/SynchronousChannel.d.ts.map +1 -0
- package/lib/cjs/SynchronousChannel.js +11 -0
- package/lib/cjs/SynchronousChannel.js.map +1 -0
- package/lib/cjs/Texture.d.ts +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +44 -4
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +72 -14
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +6 -6
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.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/cjs/core-backend.d.ts +1 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +1 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.d.ts +22 -0
- package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.js +13 -0
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/NoReservations.d.ts +6 -0
- package/lib/cjs/internal/NoReservations.d.ts.map +1 -0
- package/lib/cjs/internal/NoReservations.js +21 -0
- package/lib/cjs/internal/NoReservations.js.map +1 -0
- package/lib/cjs/internal/SchemaSyncReservations.d.ts +4 -0
- package/lib/cjs/internal/SchemaSyncReservations.d.ts.map +1 -0
- package/lib/cjs/internal/SchemaSyncReservations.js +118 -0
- package/lib/cjs/internal/SchemaSyncReservations.js.map +1 -0
- package/lib/cjs/internal/Symbols.d.ts +1 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +2 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/esm/Category.d.ts +4 -4
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.d.ts +5 -0
- package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +13 -3
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/CodeSpecs.d.ts +3 -3
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +2 -2
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/EditTxn.d.ts.map +1 -1
- package/lib/esm/EditTxn.js +1 -0
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/Element.d.ts +48 -12
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +121 -25
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +30 -15
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +52 -16
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/Model.d.ts +5 -5
- package/lib/esm/Model.d.ts.map +1 -1
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/PropertyStore.js +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/SchemaSync.d.ts +37 -9
- package/lib/esm/SchemaSync.d.ts.map +1 -1
- package/lib/esm/SchemaSync.js +127 -8
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SynchronousChannel.d.ts +62 -0
- package/lib/esm/SynchronousChannel.d.ts.map +1 -0
- package/lib/esm/SynchronousChannel.js +9 -0
- package/lib/esm/SynchronousChannel.js.map +1 -0
- package/lib/esm/Texture.d.ts +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +44 -4
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +72 -14
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +6 -6
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.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/core-backend.d.ts +1 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +1 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.d.ts +22 -0
- package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -1
- package/lib/esm/internal/IntegrityCheck.js +13 -0
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/NoReservations.d.ts +6 -0
- package/lib/esm/internal/NoReservations.d.ts.map +1 -0
- package/lib/esm/internal/NoReservations.js +18 -0
- package/lib/esm/internal/NoReservations.js.map +1 -0
- package/lib/esm/internal/SchemaSyncReservations.d.ts +4 -0
- package/lib/esm/internal/SchemaSyncReservations.d.ts.map +1 -0
- package/lib/esm/internal/SchemaSyncReservations.js +115 -0
- package/lib/esm/internal/SchemaSyncReservations.js.map +1 -0
- package/lib/esm/internal/Symbols.d.ts +1 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +1 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
- package/lib/esm/test/IModelTestUtils.js +8 -3
- package/lib/esm/test/IModelTestUtils.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/ecdb/ECSqlStatement.test.js +177 -0
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +2 -16
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +2 -2
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +80 -2
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/imodel/IModelECSql.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelECSql.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelECSql.test.js +367 -0
- package/lib/esm/test/imodel/IModelECSql.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelElements.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelElements.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelElements.test.js +969 -0
- package/lib/esm/test/imodel/IModelElements.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.js +539 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.js +499 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelMetadata.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelMetadata.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelMetadata.test.js +274 -0
- package/lib/esm/test/imodel/IModelMetadata.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelModels.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelModels.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelModels.test.js +357 -0
- package/lib/esm/test/imodel/IModelModels.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelRelationships.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelRelationships.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelRelationships.test.js +407 -0
- package/lib/esm/test/imodel/IModelRelationships.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelTestFixtures.d.ts +53 -0
- package/lib/esm/test/imodel/IModelTestFixtures.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelTestFixtures.js +107 -0
- package/lib/esm/test/imodel/IModelTestFixtures.js.map +1 -0
- package/lib/esm/test/imodel/IModelViews.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelViews.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelViews.test.js +199 -0
- package/lib/esm/test/imodel/IModelViews.test.js.map +1 -0
- package/lib/esm/test/index.d.ts +0 -1
- package/lib/esm/test/index.d.ts.map +1 -1
- package/lib/esm/test/index.js +0 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +8 -26
- package/lib/esm/test/standalone/ChangesetReader.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/lib/esm/test/standalone/GeometryStream.test.js +1 -3
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +78 -1
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js +29 -10
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +23 -0
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts +2 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.js +221 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.js.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts +2 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js +459 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js.map +1 -0
- package/lib/esm/test/standalone/SnapshotDb.test.js +1 -0
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +108 -8
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/package.json +14 -17
- package/lib/esm/test/RevisionUtility.d.ts +0 -33
- package/lib/esm/test/RevisionUtility.d.ts.map +0 -1
- package/lib/esm/test/RevisionUtility.js +0 -52
- package/lib/esm/test/RevisionUtility.js.map +0 -1
- package/lib/esm/test/imodel/IModel.test.d.ts +0 -2
- package/lib/esm/test/imodel/IModel.test.d.ts.map +0 -1
- package/lib/esm/test/imodel/IModel.test.js +0 -3277
- package/lib/esm/test/imodel/IModel.test.js.map +0 -1
|
@@ -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", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LeaderGeometry.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/LeaderGeometry.test.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\r\nimport { expect } from \"chai\";\r\nimport { ColorDef, GeometryParams, LineBreakRun, TerminatorShape, terminatorShapes, TextAnnotation, TextAnnotationLeader, TextBlock, TextFrameStyleProps, TextRun, TextStyleSettings } from \"@itwin/core-common\";\r\nimport { Arc3d, LineSegment3d, LineString3d, Point3d, Range2d, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { appendLeadersToBuilder, computeElbowDirection, computeFrame, computeLeaderAttachmentPoint, TextStyleResolver } from \"../../core-backend\";\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { doLayout, MockBuilder } from \"../AnnotationTestUtils\";\r\n\r\ndescribe(\"LeaderGeometry\", () => {\r\n let builder: MockBuilder;\r\n let defaultParams: GeometryParams;\r\n\r\n const textBlock = TextBlock.create({ styleOverrides: { font: { name: \"Arial\" }, color: ColorDef.black.toJSON(), leader: { wantElbow: false } } });\r\n textBlock.appendRun(TextRun.create({ content: \"Hello\", styleOverrides: { font: { name: \"Arial\" } } }));\r\n textBlock.appendRun(LineBreakRun.create({\r\n styleOverrides: { font: { name: \"Arial\" } },\r\n }));\r\n textBlock.appendRun(TextRun.create({ content: \"World\", styleOverrides: { font: { name: \"Arial\" } } }));\r\n\r\n const frame: TextFrameStyleProps = { borderWeight: 1, shape: \"rectangle\" };\r\n\r\n const annotation = TextAnnotation.fromJSON({\r\n textBlock: textBlock.toJSON(),\r\n anchor: { horizontal: \"left\", vertical: \"top\" },\r\n orientation: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\r\n offset: { x: 0, y: 0 },\r\n });\r\n\r\n const findTextStyle = (id: Id64String) => TextStyleSettings.fromJSON(id === \"0x34\" ? { lineSpacingFactor: 12, font: { name: \"block\" }, frame } : { lineSpacingFactor: 99, font: { name: \"run\" }, frame });\r\n const textStyleResolver = new TextStyleResolver({\r\n textBlock,\r\n textStyleId: \"0x34\",\r\n iModel: {} as any,\r\n findTextStyle,\r\n });\r\n const layout = doLayout(textBlock, {\r\n textStyleId: \"0x34\",\r\n findTextStyle,\r\n findFontId: () => 0,\r\n });\r\n const scaleFactor = 1;\r\n\r\n\r\n const range = Range2d.fromJSON(layout.range);\r\n const transform = annotation.computeTransform(range);\r\n const frameCurve = computeFrame({ frame: frame.shape === \"none\" ? \"rectangle\" : (frame.shape ?? \"rectangle\"), range: layout.range, transform });\r\n\r\n beforeEach(() => {\r\n builder = new MockBuilder();\r\n defaultParams = new GeometryParams(Id64.invalid);\r\n });\r\n\r\n describe(\"appendLeaderToBuilder\", () => {\r\n it(\"should append a leader to the builder\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }\r\n ]\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const params = builder.params[builder.params.length - 1];\r\n expect(builder.params.length).to.be.equal(1);\r\n expect(params.lineColor).to.be.equal(ColorDef.black); // textBlock color\r\n expect(builder.geometries.length).to.be.equal(2); // One LineString3d for leadersLines and one for terminators\r\n for (const geometryEntry of builder.geometries) {\r\n expect(geometryEntry).to.be.instanceOf(LineString3d);\r\n }\r\n });\r\n\r\n it(\"should append multiple leaders to the builder\", () => {\r\n const leaders: TextAnnotationLeader[] = [{ startPoint: Point3d.create(20, 20, 0), attachment: { mode: \"Nearest\" } },\r\n { startPoint: Point3d.create(10, 0, 0), attachment: { mode: \"Nearest\" } }];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.params.length).to.be.equal(2); // One for each leader\r\n expect(builder.geometries.length).to.be.equal(4); // Two LineString3d for leadersSegments and two for terminators\r\n for (const geometryEntry of builder.geometries) {\r\n expect(geometryEntry).to.be.instanceOf(LineString3d);\r\n }\r\n });\r\n\r\n it(\"should have intermediate points in geometry\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" },\r\n intermediatePoints: [Point3d.create(15, 15, 0), Point3d.create(20, 20, 0)]\r\n }\r\n ];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const geometries = builder.geometries;\r\n const leaderLines = geometries[0] as LineString3d;\r\n expect(leaderLines.points.length).to.be.equal(4); // start + 2 intermediate + end\r\n });\r\n\r\n it(\"should have elbow in the geometry\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const geometries = builder.geometries;\r\n const leaderLines = geometries[0] as LineString3d;\r\n expect(leaderLines.points.length).to.be.equal(3); // start + elbowPoint + end\r\n });\r\n\r\n describe(\"should return correct geometry for different attachment modes\", () => {\r\n const leaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\r\n }, {\r\n startPoint: Point3d.create(20, 20, 0),\r\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0.5 }\r\n }, {\r\n startPoint: Point3d.create(30, 30, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }]\r\n\r\n for (const leader of leaders) {\r\n builder = new MockBuilder();\r\n it(`${leader.attachment.mode}`, () => {\r\n const attachmentPoint = computeLeaderAttachmentPoint(leader, frameCurve, layout, transform);\r\n if (!attachmentPoint) {\r\n expect.fail(\"Attachment point should not be undefined\");\r\n }\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLines = builder.geometries[0] as LineString3d;\r\n // The last point in the geometry is the point on frame where leader is supposed to be attached.\r\n expect(leaderLines.points[leaderLines.points.length - 1].isAlmostEqual(attachmentPoint)).to.be.true;\r\n })\r\n }\r\n })\r\n describe(\"should return correct geometry for different styleOverrides\", () => {\r\n const textHeight = TextStyleSettings.defaultProps.textHeight;\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5,\r\n color: ColorDef.red.toJSON(),\r\n terminatorShape: terminatorShapes[0],\r\n terminatorHeightFactor: 2,\r\n terminatorWidthFactor: 2,\r\n }\r\n }\r\n }\r\n ];\r\n\r\n it(\"should apply color overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const params = builder.params[builder.params.length - 1];\r\n expect(params.lineColor).to.equal(ColorDef.red);\r\n });\r\n\r\n it(\"should apply terminator size overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const terminatorLines = builder.geometries[1] as LineString3d;\r\n const terminatorLength = LineSegment3d.create(terminatorLines.points[0], terminatorLines.points[1]).curveLength();\r\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\r\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\r\n // terminator length is calculated based on the terminator width and height factors.\r\n const expectedTerminatorLength = Math.sqrt(terminatorWidth * terminatorWidth + ((terminatorHeight / 2) * (terminatorHeight / 2)));\r\n expect(terminatorLength).to.be.closeTo(expectedTerminatorLength, 0.01);\r\n });\r\n\r\n it(\"should apply elbow length overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLines = builder.geometries[0] as LineString3d;\r\n // When elbow exists, the last two points in the leaderLines should form the elbow\r\n const elbowLine = LineSegment3d.create(leaderLines.points[leaderLines.points.length - 1], leaderLines.points[leaderLines.points.length - 2]);\r\n const elbowLength = elbowLine.curveLength();\r\n expect(elbowLength).to.be.closeTo((leaders[0].styleOverrides?.leader?.elbowLength ?? 1) * textHeight, 0.01);\r\n });\r\n\r\n it(\"should apply terminator shape overrides\", () => {\r\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\r\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\r\n let firstLeaderLineLengthBeforeTruncation: number;\r\n terminatorShapes.forEach((shape: TerminatorShape) => {\r\n it(`Terminator shape: ${shape}`, () => {\r\n leaders[0].styleOverrides = { ...leaders[0].styleOverrides, leader: { terminatorShape: shape } };\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n if (shape === \"none\") {\r\n expect(builder.geometries.length).to.equal(1); // Only leader line should be present with no terminators\r\n } else {\r\n let terminatorGeometry = builder.geometries[1];\r\n if (shape.includes(\"Filled\")) {\r\n expect(builder.geometries.length).to.equal(3) // One entry for geometry query and another for geometryParams for fill\r\n terminatorGeometry = builder.geometries[2];\r\n }\r\n if (shape.includes(\"circle\")) {\r\n expect((terminatorGeometry as Arc3d).circularRadius()).to.equal(terminatorHeight / 2)\r\n }\r\n\r\n if (shape === \"slash\") {\r\n expect(terminatorGeometry).to.be.instanceOf(LineSegment3d);\r\n expect(terminatorGeometry.curveLength()).to.equal(terminatorHeight);\r\n }\r\n\r\n if (shape === \"closedArrow\") {\r\n // The leaderLine is truncated to accommodate the closed and hollow shape of the terminator\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const firstLeaderLine = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);\r\n const firstLeaderLineLength = firstLeaderLine.curveLength();\r\n expect(firstLeaderLineLength).to.be.closeTo(firstLeaderLineLengthBeforeTruncation - terminatorWidth, 0.01);\r\n } else {\r\n // keep record of first leader line length before truncation for closedArrow test\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const firstLeaderLineBeforeTruncation = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);\r\n firstLeaderLineLengthBeforeTruncation = firstLeaderLineBeforeTruncation.curveLength();\r\n }\r\n }\r\n\r\n });\r\n\r\n });\r\n });\r\n\r\n });\r\n });\r\n\r\n describe(\"computeElbowDirection\", () => {\r\n it(\"should return elbow direction\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n if (attachmentPoint) {\r\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\r\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\r\n expect(elbowDirection).to.exist;\r\n }\r\n });\r\n\r\n it(\"should return undefined if elbow is tangential\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n if (attachmentPoint) {\r\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\r\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\r\n expect(elbowDirection).to.be.undefined;\r\n }\r\n });\r\n })\r\n\r\n describe(\"computeLeaderAttachmentPoint\", () => {\r\n it(\"should return correct attachmentPoint for 'Nearest' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n expect(attachmentPoint!.isAlmostEqual(Point3d.create(0, 0, 0))).to.be.true;\r\n });\r\n\r\n it(\"should return correct attachmentPoint for 'Keypoint' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0 }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n expect(attachmentPoint?.y).to.be.equal(range.low.y); // expected to be at the bottom of the TextBlock\r\n });\r\n\r\n it(\"should return correct attachmentPoint for 'TextPoint' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n const topY = range.high.y;\r\n const middleY = (range.low.y + range.high.y) / 2;\r\n expect(attachmentPoint!.y).to.be.within(middleY, topY); // expected to be in the upper half of the TextBlock\r\n });\r\n })\r\n\r\n})\r\n"]}
|
|
1
|
+
{"version":3,"file":"LeaderGeometry.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/LeaderGeometry.test.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\r\nimport { expect } from \"chai\";\r\nimport { ColorDef, GeometryParams, LineBreakRun, TargetPointShape, targetPointShapes, TerminatorShape, terminatorShapes, TextAnnotation, TextAnnotationLeader, TextBlock, TextFrameStyleProps, TextRun, TextStyleSettings } from \"@itwin/core-common\";\r\nimport { Arc3d, LineSegment3d, LineString3d, Point3d, Range2d, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { appendLeadersToBuilder, computeElbowDirection, computeFrame, computeLeaderAttachmentPoint, TextStyleResolver } from \"../../core-backend\";\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { doLayout, MockBuilder } from \"../AnnotationTestUtils\";\r\n\r\ndescribe(\"LeaderGeometry\", () => {\r\n let builder: MockBuilder;\r\n let defaultParams: GeometryParams;\r\n\r\n const textBlock = TextBlock.create({ styleOverrides: { font: { name: \"Arial\" }, color: ColorDef.black.toJSON(), leader: { wantElbow: false } } });\r\n textBlock.appendRun(TextRun.create({ content: \"Hello\", styleOverrides: { font: { name: \"Arial\" } } }));\r\n textBlock.appendRun(LineBreakRun.create({\r\n styleOverrides: { font: { name: \"Arial\" } },\r\n }));\r\n textBlock.appendRun(TextRun.create({ content: \"World\", styleOverrides: { font: { name: \"Arial\" } } }));\r\n\r\n const frame: TextFrameStyleProps = { borderWeight: 1, shape: \"rectangle\" };\r\n\r\n const annotation = TextAnnotation.fromJSON({\r\n textBlock: textBlock.toJSON(),\r\n anchor: { horizontal: \"left\", vertical: \"top\" },\r\n orientation: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\r\n offset: { x: 0, y: 0 },\r\n });\r\n\r\n const findTextStyle = (id: Id64String) => TextStyleSettings.fromJSON(id === \"0x34\" ? { lineSpacingFactor: 12, font: { name: \"block\" }, frame } : { lineSpacingFactor: 99, font: { name: \"run\" }, frame });\r\n const textStyleResolver = new TextStyleResolver({\r\n textBlock,\r\n textStyleId: \"0x34\",\r\n iModel: {} as any,\r\n findTextStyle,\r\n });\r\n const layout = doLayout(textBlock, {\r\n textStyleId: \"0x34\",\r\n findTextStyle,\r\n findFontId: () => 0,\r\n });\r\n const scaleFactor = 1;\r\n\r\n\r\n const range = Range2d.fromJSON(layout.range);\r\n const transform = annotation.computeTransform(range);\r\n const frameCurve = computeFrame({ frame: frame.shape === \"none\" ? \"rectangle\" : (frame.shape ?? \"rectangle\"), range: layout.range, transform });\r\n\r\n beforeEach(() => {\r\n builder = new MockBuilder();\r\n defaultParams = new GeometryParams(Id64.invalid);\r\n });\r\n\r\n describe(\"appendLeaderToBuilder\", () => {\r\n it(\"should append a leader to the builder\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }\r\n ]\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const params = builder.params[builder.params.length - 1];\r\n expect(builder.params.length).to.be.equal(1);\r\n expect(params.lineColor).to.be.equal(ColorDef.black); // textBlock color\r\n expect(builder.geometries.length).to.be.equal(2); // One LineString3d for leadersLines and one for terminators\r\n for (const geometryEntry of builder.geometries) {\r\n expect(geometryEntry).to.be.instanceOf(LineString3d);\r\n }\r\n });\r\n\r\n it(\"should append multiple leaders to the builder\", () => {\r\n const leaders: TextAnnotationLeader[] = [{ startPoint: Point3d.create(20, 20, 0), attachment: { mode: \"Nearest\" } },\r\n { startPoint: Point3d.create(10, 0, 0), attachment: { mode: \"Nearest\" } }];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.params.length).to.be.equal(2); // One for each leader\r\n expect(builder.geometries.length).to.be.equal(4); // Two LineString3d for leadersSegments and two for terminators\r\n for (const geometryEntry of builder.geometries) {\r\n expect(geometryEntry).to.be.instanceOf(LineString3d);\r\n }\r\n });\r\n\r\n it(\"should have intermediate points in geometry\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" },\r\n intermediatePoints: [Point3d.create(15, 15, 0), Point3d.create(20, 20, 0)]\r\n }\r\n ];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const geometries = builder.geometries;\r\n const leaderLines = geometries[0] as LineString3d;\r\n expect(leaderLines.points.length).to.be.equal(4); // start + 2 intermediate + end\r\n });\r\n\r\n it(\"should have elbow in the geometry\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const geometries = builder.geometries;\r\n const leaderLines = geometries[0] as LineString3d;\r\n expect(leaderLines.points.length).to.be.equal(3); // start + elbowPoint + end\r\n });\r\n\r\n describe(\"should return correct geometry for different attachment modes\", () => {\r\n const leaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\r\n }, {\r\n startPoint: Point3d.create(20, 20, 0),\r\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0.5 }\r\n }, {\r\n startPoint: Point3d.create(30, 30, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }]\r\n\r\n for (const leader of leaders) {\r\n builder = new MockBuilder();\r\n it(`${leader.attachment.mode}`, () => {\r\n const attachmentPoint = computeLeaderAttachmentPoint(leader, frameCurve, layout, transform);\r\n if (!attachmentPoint) {\r\n expect.fail(\"Attachment point should not be undefined\");\r\n }\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLines = builder.geometries[0] as LineString3d;\r\n // The last point in the geometry is the point on frame where leader is supposed to be attached.\r\n expect(leaderLines.points[leaderLines.points.length - 1].isAlmostEqual(attachmentPoint)).to.be.true;\r\n })\r\n }\r\n })\r\n describe(\"should return correct geometry for different styleOverrides\", () => {\r\n const textHeight = TextStyleSettings.defaultProps.textHeight;\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5,\r\n color: ColorDef.red.toJSON(),\r\n terminatorShape: terminatorShapes[0],\r\n terminatorHeightFactor: 2,\r\n terminatorWidthFactor: 2,\r\n }\r\n }\r\n }\r\n ];\r\n\r\n it(\"should apply color overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const params = builder.params[builder.params.length - 1];\r\n expect(params.lineColor).to.equal(ColorDef.red);\r\n });\r\n\r\n it(\"should apply terminator size overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const terminatorLines = builder.geometries[1] as LineString3d;\r\n const terminatorLength = LineSegment3d.create(terminatorLines.points[0], terminatorLines.points[1]).curveLength();\r\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\r\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\r\n // terminator length is calculated based on the terminator width and height factors.\r\n const expectedTerminatorLength = Math.sqrt(terminatorWidth * terminatorWidth + ((terminatorHeight / 2) * (terminatorHeight / 2)));\r\n expect(terminatorLength).to.be.closeTo(expectedTerminatorLength, 0.01);\r\n });\r\n\r\n it(\"should apply elbow length overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLines = builder.geometries[0] as LineString3d;\r\n // When elbow exists, the last two points in the leaderLines should form the elbow\r\n const elbowLine = LineSegment3d.create(leaderLines.points[leaderLines.points.length - 1], leaderLines.points[leaderLines.points.length - 2]);\r\n const elbowLength = elbowLine.curveLength();\r\n expect(elbowLength).to.be.closeTo((leaders[0].styleOverrides?.leader?.elbowLength ?? 1) * textHeight, 0.01);\r\n });\r\n\r\n it(\"should apply terminator shape overrides\", () => {\r\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\r\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\r\n let firstLeaderLineLengthBeforeTruncation: number;\r\n terminatorShapes.forEach((shape: TerminatorShape) => {\r\n it(`Terminator shape: ${shape}`, () => {\r\n leaders[0].styleOverrides = { ...leaders[0].styleOverrides, leader: { terminatorShape: shape } };\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n if (shape === \"none\") {\r\n expect(builder.geometries.length).to.equal(1); // Only leader line should be present with no terminators\r\n } else {\r\n let terminatorGeometry = builder.geometries[1];\r\n if (shape.includes(\"Filled\")) {\r\n expect(builder.geometries.length).to.equal(3) // One entry for geometry query and another for geometryParams for fill\r\n terminatorGeometry = builder.geometries[2];\r\n }\r\n if (shape.includes(\"circle\")) {\r\n expect((terminatorGeometry as Arc3d).circularRadius()).to.equal(terminatorHeight / 2)\r\n }\r\n\r\n if (shape === \"slash\") {\r\n expect(terminatorGeometry).to.be.instanceOf(LineSegment3d);\r\n expect(terminatorGeometry.curveLength()).to.equal(terminatorHeight);\r\n }\r\n\r\n if (shape === \"closedArrow\") {\r\n // The leaderLine is truncated to accommodate the closed and hollow shape of the terminator\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const firstLeaderLine = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);\r\n const firstLeaderLineLength = firstLeaderLine.curveLength();\r\n expect(firstLeaderLineLength).to.be.closeTo(firstLeaderLineLengthBeforeTruncation - terminatorWidth, 0.01);\r\n } else {\r\n // keep record of first leader line length before truncation for closedArrow test\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const firstLeaderLineBeforeTruncation = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);\r\n firstLeaderLineLengthBeforeTruncation = firstLeaderLineBeforeTruncation.curveLength();\r\n }\r\n }\r\n\r\n });\r\n\r\n });\r\n });\r\n\r\n it(\"should not append any geometry when both showLeaders and showTargetPoint are false\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: false } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(0);\r\n });\r\n\r\n it(\"should not append leader line or terminator when showLeaders is false\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: \"cross\" } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n // Only the target point graphic (a \"cross\" => two line segments) should be present.\r\n expect(builder.geometries.length).to.equal(2);\r\n for (const geometry of builder.geometries)\r\n expect(geometry).to.be.instanceOf(LineSegment3d);\r\n });\r\n\r\n it(\"should append the leader line but no terminator when showTerminators is false\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTerminators: false, showTargetPoint: false } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n // Only the leader line should be present, with no terminator geometry.\r\n expect(builder.geometries.length).to.equal(1);\r\n expect(builder.geometries[0]).to.be.instanceOf(LineString3d);\r\n });\r\n\r\n it(\"should append the target point graphic in addition to the leader line and terminator when showTargetPoint is true\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTerminators: true, showTargetPoint: true, targetPointShape: \"cross\" } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n // leader line (1) + openArrow terminator (1) + cross target point (2) = 4 geometry entries.\r\n expect(builder.geometries.length).to.equal(4);\r\n expect(builder.geometries[0]).to.be.instanceOf(LineString3d); // leader line\r\n expect(builder.geometries[1]).to.be.instanceOf(LineString3d); // openArrow terminator\r\n expect(builder.geometries[2]).to.be.instanceOf(LineSegment3d); // cross segment\r\n expect(builder.geometries[3]).to.be.instanceOf(LineSegment3d); // cross segment\r\n });\r\n\r\n // Disable the leader line so that only the target point graphic is produced, making the assertions unambiguous.\r\n const makeTargetPointLeader = (shape: TargetPointShape): TextAnnotationLeader => ({\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: shape } },\r\n });\r\n\r\n it(\"should draw a 'cross' target point as two crossed line segments\", () => {\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"cross\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(2);\r\n for (const geometry of builder.geometries)\r\n expect(geometry).to.be.instanceOf(LineSegment3d);\r\n });\r\n\r\n it(\"should draw a 'plus' target point as two orthogonal line segments\", () => {\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"plus\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(2);\r\n for (const geometry of builder.geometries)\r\n expect(geometry).to.be.instanceOf(LineSegment3d);\r\n });\r\n\r\n it(\"should draw a 'circle' target point with a radius of half the terminator height\", () => {\r\n const terminatorHalfHeight = (TextStyleSettings.defaultProps.leader.terminatorHeightFactor ?? 1) * textHeight / 2;\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"circle\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(1);\r\n const circle = builder.geometries[0] as Arc3d;\r\n expect(circle).to.be.instanceOf(Arc3d);\r\n expect(circle.circularRadius()).to.be.closeTo(terminatorHalfHeight, 0.01);\r\n });\r\n\r\n it(\"should draw a 'square' target point as a closed line string with equal width and height\", () => {\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"square\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(1);\r\n const square = builder.geometries[0] as LineString3d;\r\n expect(square).to.be.instanceOf(LineString3d);\r\n expect(square.points.length).to.equal(5); // closed loop\r\n const width = Math.abs(square.points[1].x - square.points[0].x);\r\n const height = Math.abs(square.points[2].y - square.points[1].y);\r\n expect(width).to.be.closeTo(height, 0.01);\r\n });\r\n\r\n it(\"should draw a 'rectangle' target point as a closed line string using configured width and height\", () => {\r\n const terminatorWidth = (TextStyleSettings.defaultProps.leader.terminatorWidthFactor ?? 1) * textHeight;\r\n const terminatorHeight = (TextStyleSettings.defaultProps.leader.terminatorHeightFactor ?? 1) * textHeight;\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"rectangle\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(1);\r\n const rectangle = builder.geometries[0] as LineString3d;\r\n expect(rectangle).to.be.instanceOf(LineString3d);\r\n expect(rectangle.points.length).to.equal(5); // closed loop\r\n const width = Math.abs(rectangle.points[1].x - rectangle.points[0].x);\r\n const height = Math.abs(rectangle.points[2].y - rectangle.points[1].y);\r\n expect(width).to.be.closeTo(terminatorWidth, 0.01);\r\n expect(height).to.be.closeTo(terminatorHeight, 0.01);\r\n });\r\n\r\n it(\"should produce target point geometry for every predefined shape\", () => {\r\n for (const shape of targetPointShapes) {\r\n const localBuilder = new MockBuilder();\r\n const result = appendLeadersToBuilder(localBuilder, [makeTargetPointLeader(shape)], layout, transform, new GeometryParams(Id64.invalid), textStyleResolver, scaleFactor);\r\n expect(result, `shape: ${shape}`).to.be.true;\r\n expect(localBuilder.geometries.length, `shape: ${shape}`).to.be.greaterThan(0);\r\n }\r\n });\r\n\r\n it(\"should not offset the leader start point when targetPointOffsetFactor is 0\", () => {\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showTargetPoint: true, targetPointOffsetFactor: 0 } },\r\n };\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.true;\r\n });\r\n\r\n it(\"should offset the leader start point away from the target point when targetPointOffsetFactor is non-zero\", () => {\r\n const offsetFactor = 2;\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showTargetPoint: true, targetPointOffsetFactor: offsetFactor } },\r\n };\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n // The leader line should start away from the original start point by offsetFactor * textHeight.\r\n expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.false;\r\n const offsetDistance = leaderLine.points[0].distance(leader.startPoint);\r\n expect(offsetDistance).to.be.closeTo(offsetFactor * textHeight, 0.01);\r\n });\r\n\r\n it(\"should clamp oversized target-point offsets to the first leader segment\", () => {\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n intermediatePoints: [Point3d.create(20, 0, 0)],\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTargetPoint: true, showTerminators: false, targetPointOffsetFactor: 100 } },\r\n };\r\n\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const offsetDistance = leaderLine.points[0].distance(leader.startPoint);\r\n expect(offsetDistance).to.be.at.most(leader.startPoint.distance(leader.intermediatePoints![0]));\r\n });\r\n\r\n it(\"should treat negative target-point offsets as zero\", () => {\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n intermediatePoints: [Point3d.create(20, 0, 0)],\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTargetPoint: true, showTerminators: false, targetPointOffsetFactor: -2 } },\r\n };\r\n\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.true;\r\n });\r\n\r\n it(\"should draw the target point graphic at the original start point regardless of the offset\", () => {\r\n const offsetFactor = 2;\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: \"circle\", targetPointOffsetFactor: offsetFactor } },\r\n };\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const circle = builder.geometries[0] as Arc3d;\r\n expect(circle).to.be.instanceOf(Arc3d);\r\n expect(circle.center.isAlmostEqual(leader.startPoint)).to.be.true;\r\n });\r\n\r\n });\r\n });\r\n\r\n describe(\"computeElbowDirection\", () => {\r\n it(\"should return elbow direction\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n if (attachmentPoint) {\r\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\r\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\r\n expect(elbowDirection).to.exist;\r\n }\r\n });\r\n\r\n it(\"should return undefined if elbow is tangential\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n if (attachmentPoint) {\r\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\r\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\r\n expect(elbowDirection).to.be.undefined;\r\n }\r\n });\r\n })\r\n\r\n describe(\"computeLeaderAttachmentPoint\", () => {\r\n it(\"should return correct attachmentPoint for 'Nearest' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n expect(attachmentPoint!.isAlmostEqual(Point3d.create(0, 0, 0))).to.be.true;\r\n });\r\n\r\n it(\"should return correct attachmentPoint for 'Keypoint' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0 }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n expect(attachmentPoint?.y).to.be.equal(range.low.y); // expected to be at the bottom of the TextBlock\r\n });\r\n\r\n it(\"should return correct attachmentPoint for 'TextPoint' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n const topY = range.high.y;\r\n const middleY = (range.low.y + range.high.y) / 2;\r\n expect(attachmentPoint!.y).to.be.within(middleY, topY); // expected to be in the upper half of the TextBlock\r\n });\r\n })\r\n\r\n})\r\n"]}
|
|
@@ -918,24 +918,6 @@ describe("AnnotationTextStyle", () => {
|
|
|
918
918
|
}
|
|
919
919
|
expect(migratedStyle.settings.leader.terminatorShape).to.not.be.undefined;
|
|
920
920
|
});
|
|
921
|
-
it("should return same data when version is 1.0.2", () => {
|
|
922
|
-
const styleData = {
|
|
923
|
-
version: "1.0.2",
|
|
924
|
-
data: TextStyleSettings.defaultProps
|
|
925
|
-
};
|
|
926
|
-
const migratedStyle = makeStyle({
|
|
927
|
-
settings: JSON.stringify({
|
|
928
|
-
version: styleData.version,
|
|
929
|
-
data: styleData.data
|
|
930
|
-
}),
|
|
931
|
-
});
|
|
932
|
-
const jsonStyleData = migratedStyle.toJSON();
|
|
933
|
-
if (jsonStyleData.settings) {
|
|
934
|
-
const parsedJson = JSON.parse(jsonStyleData.settings);
|
|
935
|
-
expect(parsedJson.version).to.equal(styleData.version);
|
|
936
|
-
expect(parsedJson.data).to.deep.equal(styleData.data);
|
|
937
|
-
}
|
|
938
|
-
});
|
|
939
921
|
it("should migrate text style settings to 1.0.2", () => {
|
|
940
922
|
const oldStyleData = {
|
|
941
923
|
...TextStyleSettings.defaultProps,
|
|
@@ -961,6 +943,54 @@ describe("AnnotationTextStyle", () => {
|
|
|
961
943
|
// Margins should be converted back to margin factors i.e 0.25/0.5=0.5
|
|
962
944
|
expect(migratedStyle.settings.margins).to.deep.equal({ left: 0.5, right: 0.5, top: 0.5, bottom: 0.5 });
|
|
963
945
|
});
|
|
946
|
+
it("should migrate text style settings to 1.0.3", () => {
|
|
947
|
+
// Simulate 1.0.2 data whose leader object is missing the new target-point fields.
|
|
948
|
+
const oldLeader = { ...TextStyleSettings.defaultProps.leader };
|
|
949
|
+
delete oldLeader.showLeaders;
|
|
950
|
+
delete oldLeader.showTerminators;
|
|
951
|
+
delete oldLeader.showTargetPoint;
|
|
952
|
+
delete oldLeader.targetPointShape;
|
|
953
|
+
delete oldLeader.targetPointOffsetFactor;
|
|
954
|
+
const oldStyleData = {
|
|
955
|
+
...TextStyleSettings.defaultProps,
|
|
956
|
+
leader: oldLeader,
|
|
957
|
+
};
|
|
958
|
+
const migratedStyle = makeStyle({
|
|
959
|
+
settings: JSON.stringify({
|
|
960
|
+
version: "1.0.2",
|
|
961
|
+
data: oldStyleData,
|
|
962
|
+
}),
|
|
963
|
+
});
|
|
964
|
+
const jsonStyleData = migratedStyle.toJSON();
|
|
965
|
+
if (jsonStyleData.settings) {
|
|
966
|
+
const jsonVersion = JSON.parse(jsonStyleData.settings).version;
|
|
967
|
+
expect(jsonVersion).to.equal(TEXT_STYLE_SETTINGS_JSON_VERSION);
|
|
968
|
+
}
|
|
969
|
+
const { leader } = migratedStyle.settings;
|
|
970
|
+
expect(leader.showLeaders).to.equal(TextStyleSettings.defaultProps.leader.showLeaders);
|
|
971
|
+
expect(leader.showTerminators).to.equal(TextStyleSettings.defaultProps.leader.showTerminators);
|
|
972
|
+
expect(leader.showTargetPoint).to.equal(TextStyleSettings.defaultProps.leader.showTargetPoint);
|
|
973
|
+
expect(leader.targetPointShape).to.equal(TextStyleSettings.defaultProps.leader.targetPointShape);
|
|
974
|
+
expect(leader.targetPointOffsetFactor).to.equal(TextStyleSettings.defaultProps.leader.targetPointOffsetFactor);
|
|
975
|
+
});
|
|
976
|
+
it("should return same data when version is 1.0.3", () => {
|
|
977
|
+
const styleData = {
|
|
978
|
+
version: TEXT_STYLE_SETTINGS_JSON_VERSION,
|
|
979
|
+
data: TextStyleSettings.defaultProps,
|
|
980
|
+
};
|
|
981
|
+
const migratedStyle = makeStyle({
|
|
982
|
+
settings: JSON.stringify({
|
|
983
|
+
version: styleData.version,
|
|
984
|
+
data: styleData.data,
|
|
985
|
+
}),
|
|
986
|
+
});
|
|
987
|
+
const jsonStyleData = migratedStyle.toJSON();
|
|
988
|
+
if (jsonStyleData.settings) {
|
|
989
|
+
const parsedJson = JSON.parse(jsonStyleData.settings);
|
|
990
|
+
expect(parsedJson.version).to.equal(TEXT_STYLE_SETTINGS_JSON_VERSION);
|
|
991
|
+
expect(parsedJson.data).to.deep.equal(styleData.data);
|
|
992
|
+
}
|
|
993
|
+
});
|
|
964
994
|
it("should return defaultProps when styleData is unrecognized", () => {
|
|
965
995
|
const textStyle = makeStyle({
|
|
966
996
|
settings: JSON.stringify({
|