@itwin/core-backend 5.2.0-dev.8 → 5.3.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 +36 -1
- package/lib/cjs/BackendHubAccess.d.ts +2 -0
- package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.d.ts +6 -0
- package/lib/cjs/BackendLoggerCategory.d.ts.map +1 -1
- package/lib/cjs/BackendLoggerCategory.js +6 -0
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BriefcaseManager.d.ts +57 -3
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +151 -42
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +4 -0
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +8 -0
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +22 -0
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.d.ts.map +1 -1
- package/lib/cjs/GeographicCRSServices.js +2 -0
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +54 -3
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +87 -9
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +11 -1
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +5 -0
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.d.ts +1 -5
- package/lib/cjs/IModelIncrementalSchemaLocater.d.ts.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js +0 -6
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.d.ts +8 -0
- package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js +11 -0
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/StashManager.d.ts +175 -0
- package/lib/cjs/StashManager.d.ts.map +1 -0
- package/lib/cjs/StashManager.js +306 -0
- package/lib/cjs/StashManager.js.map +1 -0
- package/lib/cjs/TxnManager.d.ts +226 -15
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +249 -23
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +10 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +15 -6
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts +3 -2
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +5 -4
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +52 -24
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +49 -59
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.d.ts +2 -0
- package/lib/cjs/annotations/TextAnnotationGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.js +26 -19
- package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.js +8 -0
- package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.d.ts +49 -36
- package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js +204 -135
- package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js +1 -1
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- 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/cjs/internal/annotations/fields.d.ts +2 -12
- package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
- package/lib/cjs/internal/annotations/fields.js +49 -45
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/esm/BackendHubAccess.d.ts +2 -0
- package/lib/esm/BackendHubAccess.d.ts.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BackendLoggerCategory.d.ts +6 -0
- package/lib/esm/BackendLoggerCategory.d.ts.map +1 -1
- package/lib/esm/BackendLoggerCategory.js +6 -0
- package/lib/esm/BackendLoggerCategory.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts +57 -3
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +152 -43
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +4 -0
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/ECDb.d.ts +8 -0
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +22 -0
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/GeographicCRSServices.d.ts.map +1 -1
- package/lib/esm/GeographicCRSServices.js +2 -0
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +54 -3
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +88 -10
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelHost.d.ts +11 -1
- package/lib/esm/IModelHost.d.ts.map +1 -1
- package/lib/esm/IModelHost.js +5 -0
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.d.ts +1 -5
- package/lib/esm/IModelIncrementalSchemaLocater.d.ts.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js +0 -6
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.d.ts +8 -0
- package/lib/esm/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/esm/SqliteChangesetReader.js +11 -0
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/StashManager.d.ts +175 -0
- package/lib/esm/StashManager.d.ts.map +1 -0
- package/lib/esm/StashManager.js +301 -0
- package/lib/esm/StashManager.js.map +1 -0
- package/lib/esm/TxnManager.d.ts +226 -15
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +247 -21
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +10 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js +13 -5
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts +3 -2
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +5 -4
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +52 -24
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +51 -61
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.d.ts +2 -0
- package/lib/esm/annotations/TextAnnotationGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.js +26 -19
- package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.js +8 -0
- package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.d.ts +49 -36
- package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js +205 -136
- package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js +1 -1
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- 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/internal/annotations/fields.d.ts +2 -12
- package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
- package/lib/esm/internal/annotations/fields.js +51 -47
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.d.ts +5 -1
- package/lib/esm/test/AnnotationTestUtils.d.ts.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js +6 -1
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +163 -46
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +12 -10
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +299 -43
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js +453 -86
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts +46 -0
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js +20 -2
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +71 -1
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.d.ts +2 -0
- package/lib/esm/test/hubaccess/Rebase.test.d.ts.map +1 -0
- package/lib/esm/test/hubaccess/Rebase.test.js +640 -0
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -0
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js +20 -20
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js +3 -3
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts +16 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js +47 -0
- package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +15 -19
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +131 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js +3 -3
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/package.json +13 -13
|
@@ -15,7 +15,10 @@ import { DrawingCategory, SpatialCategory } from "../../Category";
|
|
|
15
15
|
import { DisplayStyle2d, DisplayStyle3d } from "../../DisplayStyle";
|
|
16
16
|
import { CategorySelector, DrawingViewDefinition, ModelSelector, SpatialViewDefinition } from "../../ViewDefinition";
|
|
17
17
|
import { FontFile } from "../../FontFile";
|
|
18
|
-
import { computeTextRangeAsStringLength } from "../AnnotationTestUtils";
|
|
18
|
+
import { computeTextRangeAsStringLength, MockBuilder } from "../AnnotationTestUtils";
|
|
19
|
+
import { TextAnnotationUsesTextStyleByDefault } from "../../annotations/ElementDrivesTextAnnotation";
|
|
20
|
+
import { layoutTextBlock, TextStyleResolver } from "../../annotations/TextBlockLayout";
|
|
21
|
+
import { appendTextAnnotationGeometry } from "../../annotations/TextAnnotationGeometry";
|
|
19
22
|
function mockIModel() {
|
|
20
23
|
const iModel = {
|
|
21
24
|
fonts: {
|
|
@@ -26,13 +29,15 @@ function mockIModel() {
|
|
|
26
29
|
};
|
|
27
30
|
return iModel;
|
|
28
31
|
}
|
|
29
|
-
function createAnnotation(
|
|
32
|
+
function createAnnotation(textBlock) {
|
|
30
33
|
const styleOverrides = { fontName: "Karla" };
|
|
31
|
-
const block = TextBlock.create({
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
const block = textBlock ?? TextBlock.create({ styleOverrides });
|
|
35
|
+
if (!textBlock) {
|
|
36
|
+
block.appendRun(TextRun.create({ content: "Run, Barry,", styleOverrides }));
|
|
37
|
+
block.appendRun(TextRun.create({ content: " RUN!!! ", styleOverrides }));
|
|
38
|
+
block.appendRun(FractionRun.create({ numerator: "Harrison", denominator: "Wells", styleOverrides }));
|
|
39
|
+
block.margins = { left: 0, right: 1, top: 2, bottom: 3 };
|
|
40
|
+
}
|
|
36
41
|
const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
|
|
37
42
|
annotation.anchor = { vertical: "middle", horizontal: "right" };
|
|
38
43
|
annotation.orientation = YawPitchRollAngles.createDegrees(1, 0, -1);
|
|
@@ -81,6 +86,26 @@ const createIModel = async (name) => {
|
|
|
81
86
|
const createAnnotationTextStyle = (iModel, definitionModel, name, settings = TextStyleSettings.defaultProps) => {
|
|
82
87
|
return AnnotationTextStyle.create(iModel, definitionModel, name, settings, "description");
|
|
83
88
|
};
|
|
89
|
+
function createElement2d(imodel, createArgs) {
|
|
90
|
+
const placement = {
|
|
91
|
+
origin: { x: 0, y: 0 },
|
|
92
|
+
angle: Angle.createDegrees(0).toJSON(),
|
|
93
|
+
};
|
|
94
|
+
return TextAnnotation2d.create(imodel, {
|
|
95
|
+
...createArgs,
|
|
96
|
+
placement,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function createElement3d(imodel, createArgs) {
|
|
100
|
+
const placement = {
|
|
101
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
102
|
+
angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),
|
|
103
|
+
};
|
|
104
|
+
return TextAnnotation3d.create(imodel, {
|
|
105
|
+
...createArgs,
|
|
106
|
+
placement,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
84
109
|
describe("TextAnnotation element", () => {
|
|
85
110
|
function makeElement(props) {
|
|
86
111
|
return TextAnnotation2d.fromJSON({
|
|
@@ -95,6 +120,7 @@ describe("TextAnnotation element", () => {
|
|
|
95
120
|
origin: { x: 0, y: 0 },
|
|
96
121
|
angle: 0,
|
|
97
122
|
},
|
|
123
|
+
defaultTextStyle: new TextAnnotationUsesTextStyleByDefault("0x21").toJSON(),
|
|
98
124
|
...props,
|
|
99
125
|
}, mockIModel());
|
|
100
126
|
}
|
|
@@ -104,16 +130,18 @@ describe("TextAnnotation element", () => {
|
|
|
104
130
|
});
|
|
105
131
|
it("converts JSON string to class instance", () => {
|
|
106
132
|
const elem = makeElement({
|
|
107
|
-
textAnnotationData: JSON.stringify({ textBlock: TextBlock.create(
|
|
133
|
+
textAnnotationData: JSON.stringify({ textBlock: TextBlock.create().toJSON() }),
|
|
134
|
+
defaultTextStyle: new TextAnnotationUsesTextStyleByDefault("0x42").toJSON()
|
|
108
135
|
});
|
|
109
136
|
const anno = elem.getAnnotation();
|
|
110
137
|
expect(anno).not.to.be.undefined;
|
|
111
138
|
expect(anno.textBlock.isEmpty).to.be.true;
|
|
112
|
-
expect(
|
|
139
|
+
expect(elem.defaultTextStyle).not.to.be.undefined;
|
|
140
|
+
expect(elem.defaultTextStyle.id).to.equal("0x42");
|
|
113
141
|
});
|
|
114
142
|
it("produces a new object each time it is called", () => {
|
|
115
143
|
const elem = makeElement({
|
|
116
|
-
textAnnotationData: JSON.stringify({ textBlock: TextBlock.create(
|
|
144
|
+
textAnnotationData: JSON.stringify({ textBlock: TextBlock.create().toJSON() })
|
|
117
145
|
});
|
|
118
146
|
const anno1 = elem.getAnnotation();
|
|
119
147
|
const anno2 = elem.getAnnotation();
|
|
@@ -124,7 +152,7 @@ describe("TextAnnotation element", () => {
|
|
|
124
152
|
describe("setAnnotation", () => {
|
|
125
153
|
it("updates properties", () => {
|
|
126
154
|
const elem = makeElement();
|
|
127
|
-
const textBlock = TextBlock.create(
|
|
155
|
+
const textBlock = TextBlock.create();
|
|
128
156
|
textBlock.appendRun(TextRun.create({ content: "text" }));
|
|
129
157
|
const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });
|
|
130
158
|
elem.setAnnotation(annotation);
|
|
@@ -134,9 +162,7 @@ describe("TextAnnotation element", () => {
|
|
|
134
162
|
});
|
|
135
163
|
describe("TextAnnotation3d Persistence", () => {
|
|
136
164
|
let imodel;
|
|
137
|
-
let
|
|
138
|
-
let seedModelId;
|
|
139
|
-
let seedStyleId;
|
|
165
|
+
let createElement3dArgs;
|
|
140
166
|
before(async () => {
|
|
141
167
|
imodel = await createIModel("TextAnnotation3d");
|
|
142
168
|
const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
|
|
@@ -147,20 +173,13 @@ describe("TextAnnotation element", () => {
|
|
|
147
173
|
expect(category).not.to.be.undefined;
|
|
148
174
|
expect(model).not.to.be.undefined;
|
|
149
175
|
expect(styleId).not.to.be.undefined;
|
|
150
|
-
|
|
151
|
-
seedModelId = model;
|
|
152
|
-
seedStyleId = styleId;
|
|
176
|
+
createElement3dArgs = { category, model };
|
|
153
177
|
});
|
|
154
178
|
after(() => imodel.close());
|
|
155
|
-
function createElement3d(createArgs) {
|
|
156
|
-
return TextAnnotation3d.create(imodel, seedCategoryId, seedModelId, {
|
|
157
|
-
origin: { x: 0, y: 0, z: 0 },
|
|
158
|
-
angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),
|
|
159
|
-
}, createArgs?.textAnnotationData);
|
|
160
|
-
}
|
|
161
179
|
it("creating element does not automatically compute the geometry", () => {
|
|
162
180
|
const annotation = createAnnotation();
|
|
163
|
-
const
|
|
181
|
+
const args = { ...createElement3dArgs, textAnnotationData: annotation.toJSON() };
|
|
182
|
+
const el = createElement3d(imodel, args);
|
|
164
183
|
expect(el.getAnnotation().equals(annotation)).to.be.true;
|
|
165
184
|
expect(el.geom).to.be.undefined;
|
|
166
185
|
});
|
|
@@ -175,7 +194,7 @@ describe("TextAnnotation element", () => {
|
|
|
175
194
|
}
|
|
176
195
|
describe("inserts 3d element and round-trips through JSON", async () => {
|
|
177
196
|
async function test(annotation) {
|
|
178
|
-
const el0 = createElement3d();
|
|
197
|
+
const el0 = createElement3d(imodel, { ...createElement3dArgs });
|
|
179
198
|
if (annotation) {
|
|
180
199
|
el0.setAnnotation(annotation);
|
|
181
200
|
}
|
|
@@ -198,42 +217,30 @@ describe("TextAnnotation element", () => {
|
|
|
198
217
|
}
|
|
199
218
|
}
|
|
200
219
|
it("roundtrips an empty annotation", async () => { await test(); });
|
|
201
|
-
it("roundtrips an annotation with a style", async () => { await test(TextAnnotation.fromJSON({ textBlock: { styleId: seedStyleId } })); });
|
|
202
220
|
it("roundtrips an annotation with a textBlock", async () => { await test(createAnnotation()); });
|
|
203
221
|
});
|
|
204
222
|
});
|
|
205
223
|
describe("TextAnnotation2d Persistence", () => {
|
|
206
224
|
let imodel;
|
|
207
|
-
let
|
|
208
|
-
let seedModelId;
|
|
209
|
-
let seedStyleId;
|
|
225
|
+
let createElement2dArgs;
|
|
210
226
|
before(async () => {
|
|
211
227
|
imodel = await createIModel("TextAnnotation2d");
|
|
212
228
|
const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
|
|
213
229
|
const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
|
|
214
230
|
const { category, model } = insertDrawingModel(imodel, jobSubjectId, definitionModel);
|
|
215
|
-
const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { fontName: "Totally Real Font", lineHeight: 0.25, isItalic: true }).insert();
|
|
216
231
|
expect(jobSubjectId).not.to.be.undefined;
|
|
217
232
|
expect(category).not.to.be.undefined;
|
|
218
233
|
expect(model).not.to.be.undefined;
|
|
219
|
-
|
|
220
|
-
seedCategoryId = category;
|
|
221
|
-
seedModelId = model;
|
|
222
|
-
seedStyleId = styleId;
|
|
234
|
+
createElement2dArgs = { category, model };
|
|
223
235
|
});
|
|
224
236
|
after(() => {
|
|
225
237
|
imodel.saveChanges("tests");
|
|
226
238
|
imodel.close();
|
|
227
239
|
});
|
|
228
|
-
function createElement2d(createArgs) {
|
|
229
|
-
return TextAnnotation2d.create(imodel, seedCategoryId, seedModelId, {
|
|
230
|
-
origin: { x: 0, y: 0 },
|
|
231
|
-
angle: Angle.createDegrees(0).toJSON(),
|
|
232
|
-
}, createArgs?.textAnnotationData);
|
|
233
|
-
}
|
|
234
240
|
it("creating element does not automatically compute the geometry", () => {
|
|
235
241
|
const annotation = createAnnotation();
|
|
236
|
-
const
|
|
242
|
+
const args = { ...createElement2dArgs, textAnnotationData: annotation.toJSON() };
|
|
243
|
+
const el = createElement2d(imodel, args);
|
|
237
244
|
expect(el.getAnnotation().equals(annotation)).to.be.true;
|
|
238
245
|
expect(el.geom).to.be.undefined;
|
|
239
246
|
});
|
|
@@ -245,7 +252,7 @@ describe("TextAnnotation element", () => {
|
|
|
245
252
|
}
|
|
246
253
|
describe("inserts 2d element and round-trips through JSON", async () => {
|
|
247
254
|
async function test(annotation) {
|
|
248
|
-
const el0 = createElement2d();
|
|
255
|
+
const el0 = createElement2d(imodel, createElement2dArgs);
|
|
249
256
|
if (annotation) {
|
|
250
257
|
el0.setAnnotation(annotation);
|
|
251
258
|
}
|
|
@@ -265,13 +272,127 @@ describe("TextAnnotation element", () => {
|
|
|
265
272
|
expect(anno).not.to.be.undefined;
|
|
266
273
|
expect(anno.equals(annotation)).to.be.true;
|
|
267
274
|
expect(el0.toJSON().elementGeometryBuilderParams).not.to.be.undefined;
|
|
275
|
+
expect(el0.toJSON().elementGeometryBuilderParams).to.deep.equal(el1.toJSON().elementGeometryBuilderParams);
|
|
268
276
|
}
|
|
269
277
|
}
|
|
270
278
|
it("roundtrips an empty annotation", async () => { await test(); });
|
|
271
|
-
it("roundtrips an annotation with a style", async () => { await test(TextAnnotation.fromJSON({ textBlock: { styleId: seedStyleId } })); });
|
|
272
279
|
it("roundtrips an annotation with a textBlock", async () => { await test(createAnnotation()); });
|
|
273
280
|
});
|
|
274
281
|
});
|
|
282
|
+
describe("defaultTextStyle", () => {
|
|
283
|
+
let imodel;
|
|
284
|
+
let seedSubjectId;
|
|
285
|
+
let seedDefinitionModelId;
|
|
286
|
+
let seedStyleId;
|
|
287
|
+
let seedStyleId2;
|
|
288
|
+
before(async () => {
|
|
289
|
+
imodel = await createIModel("DefaultTextStyle");
|
|
290
|
+
const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
|
|
291
|
+
const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
|
|
292
|
+
const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { fontName: "Totally Real Font", lineHeight: 0.25, isItalic: true }).insert();
|
|
293
|
+
const differentStyleId = createAnnotationTextStyle(imodel, definitionModel, "alt", { fontName: "Karla", lineHeight: 0.5, isBold: true }).insert();
|
|
294
|
+
expect(jobSubjectId).not.to.be.undefined;
|
|
295
|
+
expect(definitionModel).not.to.be.undefined;
|
|
296
|
+
expect(styleId).not.to.be.undefined;
|
|
297
|
+
expect(differentStyleId).not.to.be.undefined;
|
|
298
|
+
seedSubjectId = jobSubjectId;
|
|
299
|
+
seedDefinitionModelId = definitionModel;
|
|
300
|
+
seedStyleId = styleId;
|
|
301
|
+
seedStyleId2 = differentStyleId;
|
|
302
|
+
});
|
|
303
|
+
after(() => {
|
|
304
|
+
imodel.saveChanges("tests");
|
|
305
|
+
imodel.close();
|
|
306
|
+
});
|
|
307
|
+
describe("TextAnnotation2d", () => {
|
|
308
|
+
let createElement2dArgs;
|
|
309
|
+
before(() => {
|
|
310
|
+
const { category, model } = insertDrawingModel(imodel, seedSubjectId, seedDefinitionModelId);
|
|
311
|
+
expect(category).not.to.be.undefined;
|
|
312
|
+
expect(model).not.to.be.undefined;
|
|
313
|
+
createElement2dArgs = { category, model };
|
|
314
|
+
});
|
|
315
|
+
it("preserves defaultTextStyle after round trip", () => {
|
|
316
|
+
const annotation = createAnnotation();
|
|
317
|
+
const args = { ...createElement2dArgs, textAnnotationData: annotation.toJSON(), defaultTextStyleId: seedStyleId };
|
|
318
|
+
const el0 = createElement2d(imodel, args);
|
|
319
|
+
expect(el0.defaultTextStyle).not.to.be.undefined;
|
|
320
|
+
expect(el0.defaultTextStyle.id).to.equal(seedStyleId);
|
|
321
|
+
el0.insert();
|
|
322
|
+
const el1 = imodel.elements.getElement(el0.id);
|
|
323
|
+
expect(el1).not.to.be.undefined;
|
|
324
|
+
expect(el1.defaultTextStyle).not.to.be.undefined;
|
|
325
|
+
expect(el1.defaultTextStyle.id).to.equal(seedStyleId);
|
|
326
|
+
expect(el0.toJSON().elementGeometryBuilderParams).to.deep.equal(el1.toJSON().elementGeometryBuilderParams);
|
|
327
|
+
});
|
|
328
|
+
it("produces different geometry when defaultTextStyle changes", () => {
|
|
329
|
+
const annotation = createAnnotation();
|
|
330
|
+
const args = { ...createElement2dArgs, textAnnotationData: annotation.toJSON() };
|
|
331
|
+
const el0 = createElement2d(imodel, args);
|
|
332
|
+
el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId);
|
|
333
|
+
const geom1 = el0.toJSON().elementGeometryBuilderParams;
|
|
334
|
+
el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId2);
|
|
335
|
+
const geom2 = el0.toJSON().elementGeometryBuilderParams;
|
|
336
|
+
expect(geom1).not.to.deep.equal(geom2);
|
|
337
|
+
});
|
|
338
|
+
it("allows defaultTextStyle to be undefined", () => {
|
|
339
|
+
const annotation = createAnnotation();
|
|
340
|
+
const args = { ...createElement2dArgs, textAnnotationData: annotation.toJSON() };
|
|
341
|
+
const el0 = createElement2d(imodel, args);
|
|
342
|
+
el0.defaultTextStyle = undefined;
|
|
343
|
+
const elId = el0.insert();
|
|
344
|
+
expect(Id64.isValidId64(elId)).to.be.true;
|
|
345
|
+
const el1 = imodel.elements.getElement(elId);
|
|
346
|
+
expect(el1).not.to.be.undefined;
|
|
347
|
+
expect(el1 instanceof TextAnnotation2d).to.be.true;
|
|
348
|
+
expect(el1.defaultTextStyle).to.be.undefined;
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
describe("TextAnnotation3d", () => {
|
|
352
|
+
let createElement3dArgs;
|
|
353
|
+
before(() => {
|
|
354
|
+
const { category, model } = insertSpatialModel(imodel, seedSubjectId, seedDefinitionModelId);
|
|
355
|
+
expect(category).not.to.be.undefined;
|
|
356
|
+
expect(model).not.to.be.undefined;
|
|
357
|
+
createElement3dArgs = { category, model };
|
|
358
|
+
});
|
|
359
|
+
it("preserves defaultTextStyle after round trip", () => {
|
|
360
|
+
const annotation = createAnnotation();
|
|
361
|
+
const args = { ...createElement3dArgs, textAnnotationData: annotation.toJSON(), defaultTextStyleId: seedStyleId };
|
|
362
|
+
const el0 = createElement3d(imodel, args);
|
|
363
|
+
expect(el0.defaultTextStyle).not.to.be.undefined;
|
|
364
|
+
expect(el0.defaultTextStyle.id).to.equal(seedStyleId);
|
|
365
|
+
el0.insert();
|
|
366
|
+
const el1 = imodel.elements.getElement(el0.id);
|
|
367
|
+
expect(el1).not.to.be.undefined;
|
|
368
|
+
expect(el1.defaultTextStyle).not.to.be.undefined;
|
|
369
|
+
expect(el1.defaultTextStyle.id).to.equal(seedStyleId);
|
|
370
|
+
expect(el0.toJSON().elementGeometryBuilderParams).to.deep.equal(el1.toJSON().elementGeometryBuilderParams);
|
|
371
|
+
});
|
|
372
|
+
it("produces different geometry when defaultTextStyle changes", () => {
|
|
373
|
+
const annotation = createAnnotation();
|
|
374
|
+
const args = { ...createElement3dArgs, textAnnotationData: annotation.toJSON() };
|
|
375
|
+
const el0 = createElement3d(imodel, args);
|
|
376
|
+
el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId);
|
|
377
|
+
const geom1 = el0.toJSON().elementGeometryBuilderParams;
|
|
378
|
+
el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId2);
|
|
379
|
+
const geom2 = el0.toJSON().elementGeometryBuilderParams;
|
|
380
|
+
expect(geom1).not.to.deep.equal(geom2);
|
|
381
|
+
});
|
|
382
|
+
it("allows defaultTextStyle to be undefined", () => {
|
|
383
|
+
const annotation = createAnnotation();
|
|
384
|
+
const args = { ...createElement3dArgs, textAnnotationData: annotation.toJSON() };
|
|
385
|
+
const el0 = createElement3d(imodel, args);
|
|
386
|
+
el0.defaultTextStyle = undefined;
|
|
387
|
+
const elId = el0.insert();
|
|
388
|
+
expect(Id64.isValidId64(elId)).to.be.true;
|
|
389
|
+
const el1 = imodel.elements.getElement(elId);
|
|
390
|
+
expect(el1).not.to.be.undefined;
|
|
391
|
+
expect(el1 instanceof TextAnnotation3d).to.be.true;
|
|
392
|
+
expect(el1.defaultTextStyle).to.be.undefined;
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
});
|
|
275
396
|
});
|
|
276
397
|
describe("AnnotationTextStyle", () => {
|
|
277
398
|
let imodel;
|
|
@@ -354,4 +475,139 @@ describe("AnnotationTextStyle", () => {
|
|
|
354
475
|
expect(el0.settings.toJSON()).to.deep.equal(newStyle.toJSON());
|
|
355
476
|
});
|
|
356
477
|
});
|
|
478
|
+
describe("appendTextAnnotationGeometry", () => {
|
|
479
|
+
let imodel;
|
|
480
|
+
let seedDefinitionModelId;
|
|
481
|
+
let seedCategoryId;
|
|
482
|
+
let seedStyleId;
|
|
483
|
+
let seedStyleId2;
|
|
484
|
+
before(async () => {
|
|
485
|
+
imodel = await createIModel("DefaultTextStyle");
|
|
486
|
+
const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
|
|
487
|
+
const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
|
|
488
|
+
const { category, model } = insertDrawingModel(imodel, jobSubjectId, definitionModel);
|
|
489
|
+
const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { fontName: "Totally Real Font", lineHeight: 0.25, isItalic: true }).insert();
|
|
490
|
+
const differentStyleId = createAnnotationTextStyle(imodel, definitionModel, "alt", { fontName: "Karla", lineHeight: 0.5, isBold: true }).insert();
|
|
491
|
+
expect(jobSubjectId).not.to.be.undefined;
|
|
492
|
+
expect(definitionModel).not.to.be.undefined;
|
|
493
|
+
expect(category).not.to.be.undefined;
|
|
494
|
+
expect(model).not.to.be.undefined;
|
|
495
|
+
expect(styleId).not.to.be.undefined;
|
|
496
|
+
expect(differentStyleId).not.to.be.undefined;
|
|
497
|
+
seedDefinitionModelId = definitionModel;
|
|
498
|
+
seedCategoryId = category;
|
|
499
|
+
seedStyleId = styleId;
|
|
500
|
+
seedStyleId2 = differentStyleId;
|
|
501
|
+
});
|
|
502
|
+
function runAppendTextAnnotationGeometry(annotation, styleId, scaleFactor = 1) {
|
|
503
|
+
const builder = new MockBuilder();
|
|
504
|
+
const resolver = new TextStyleResolver({
|
|
505
|
+
textBlock: annotation.textBlock,
|
|
506
|
+
textStyleId: styleId,
|
|
507
|
+
iModel: imodel,
|
|
508
|
+
});
|
|
509
|
+
const layout = layoutTextBlock({
|
|
510
|
+
textBlock: annotation.textBlock,
|
|
511
|
+
iModel: imodel,
|
|
512
|
+
textStyleResolver: resolver,
|
|
513
|
+
});
|
|
514
|
+
const result = appendTextAnnotationGeometry({
|
|
515
|
+
annotationProps: annotation.toJSON(),
|
|
516
|
+
layout,
|
|
517
|
+
textStyleResolver: resolver,
|
|
518
|
+
scaleFactor,
|
|
519
|
+
builder,
|
|
520
|
+
categoryId: seedCategoryId,
|
|
521
|
+
});
|
|
522
|
+
expect(result).to.be.true;
|
|
523
|
+
return builder;
|
|
524
|
+
}
|
|
525
|
+
it("produces the same geometry when given the same inputs", () => {
|
|
526
|
+
const builder1 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId);
|
|
527
|
+
const builder2 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId);
|
|
528
|
+
expect(builder1.geometries).to.deep.equal(builder2.geometries);
|
|
529
|
+
expect(builder1.params).to.deep.equal(builder2.params);
|
|
530
|
+
expect(builder1.textStrings).to.deep.equal(builder2.textStrings);
|
|
531
|
+
});
|
|
532
|
+
it("produces no geometry when given an empty annotation", () => {
|
|
533
|
+
const block = TextBlock.create();
|
|
534
|
+
const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
|
|
535
|
+
const builder = runAppendTextAnnotationGeometry(annotation, seedStyleId);
|
|
536
|
+
expect(builder.geometries).to.be.empty;
|
|
537
|
+
expect(builder.params).to.be.empty;
|
|
538
|
+
expect(builder.textStrings).to.be.empty;
|
|
539
|
+
});
|
|
540
|
+
it("produces geometry when given an empty annotation with frame styling", () => {
|
|
541
|
+
const block = TextBlock.create();
|
|
542
|
+
const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
|
|
543
|
+
const styleId = createAnnotationTextStyle(imodel, seedDefinitionModelId, "empty anno style", {
|
|
544
|
+
fontName: "Totally Real Font",
|
|
545
|
+
frame: {
|
|
546
|
+
shape: "rectangle",
|
|
547
|
+
}
|
|
548
|
+
}).insert();
|
|
549
|
+
const builder = runAppendTextAnnotationGeometry(annotation, styleId);
|
|
550
|
+
expect(builder.geometries).not.to.be.empty;
|
|
551
|
+
expect(builder.params).not.to.be.empty;
|
|
552
|
+
expect(builder.textStrings).to.be.empty;
|
|
553
|
+
});
|
|
554
|
+
it("produces different geometry when given different text-content in annotations", () => {
|
|
555
|
+
const anno1 = createAnnotation();
|
|
556
|
+
const anno2 = createAnnotation();
|
|
557
|
+
anno2.textBlock.appendRun(TextRun.create({ content: "extra", styleOverrides: { fontName: "Totally Real Font" } }));
|
|
558
|
+
const builder1 = runAppendTextAnnotationGeometry(anno1, seedStyleId);
|
|
559
|
+
const builder2 = runAppendTextAnnotationGeometry(anno2, seedStyleId);
|
|
560
|
+
expect(builder1.geometries).to.not.deep.equal(builder2.geometries);
|
|
561
|
+
expect(builder1.params).to.deep.equal(builder2.params);
|
|
562
|
+
expect(builder1.textStrings).to.not.deep.equal(builder2.textStrings);
|
|
563
|
+
});
|
|
564
|
+
it("produces different geometry when given different default styles", () => {
|
|
565
|
+
const builder1 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId);
|
|
566
|
+
const builder2 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId2);
|
|
567
|
+
expect(builder1.geometries).to.not.deep.equal(builder2.geometries);
|
|
568
|
+
expect(builder1.textStrings).to.not.deep.equal(builder2.textStrings);
|
|
569
|
+
});
|
|
570
|
+
it("accounts for style overrides in the text", () => {
|
|
571
|
+
const block = TextBlock.create();
|
|
572
|
+
block.appendParagraph();
|
|
573
|
+
block.children[0].styleOverrides = { isBold: true };
|
|
574
|
+
block.appendRun(TextRun.create({ content: "Run, Barry," }));
|
|
575
|
+
block.appendParagraph();
|
|
576
|
+
block.appendRun(TextRun.create({ content: " RUN!!! ", styleOverrides: { isItalic: false } }));
|
|
577
|
+
block.margins = { left: 0, right: 1, top: 2, bottom: 3 };
|
|
578
|
+
const annotation = createAnnotation(block);
|
|
579
|
+
const builder = runAppendTextAnnotationGeometry(annotation, seedStyleId);
|
|
580
|
+
expect(builder.textStrings.length).to.equal(2);
|
|
581
|
+
expect(builder.textStrings[0].text).to.equal("Run, Barry,");
|
|
582
|
+
// From override on paragraph
|
|
583
|
+
expect(builder.textStrings[0].bold).to.be.true;
|
|
584
|
+
// From default style
|
|
585
|
+
expect(builder.textStrings[0].italic).to.be.true;
|
|
586
|
+
expect(builder.textStrings[1].text).to.equal(" RUN!!! ");
|
|
587
|
+
// From default style
|
|
588
|
+
expect(builder.textStrings[1].bold).to.be.false;
|
|
589
|
+
// From override on run
|
|
590
|
+
expect(builder.textStrings[1].italic).to.be.false;
|
|
591
|
+
});
|
|
592
|
+
it("uses TextStyleSettings.defaults when no default style is provided", () => {
|
|
593
|
+
const block = TextBlock.create();
|
|
594
|
+
block.appendRun(TextRun.create({ content: "Run, Barry," }));
|
|
595
|
+
block.margins = { left: 0, right: 1, top: 2, bottom: 3 };
|
|
596
|
+
const annotation = createAnnotation(block);
|
|
597
|
+
const builder = runAppendTextAnnotationGeometry(annotation, "");
|
|
598
|
+
expect(builder.textStrings.length).to.equal(1);
|
|
599
|
+
expect(builder.textStrings[0].text).to.equal("Run, Barry,");
|
|
600
|
+
expect(builder.textStrings[0].font).to.equal(0); // Font ID 0 is the "missing" font in the default text style
|
|
601
|
+
expect(builder.textStrings[0].bold).to.equal(TextStyleSettings.defaultProps.isBold);
|
|
602
|
+
expect(builder.textStrings[0].italic).to.equal(TextStyleSettings.defaultProps.isItalic);
|
|
603
|
+
expect(builder.textStrings[0].underline).to.equal(TextStyleSettings.defaultProps.isUnderlined);
|
|
604
|
+
});
|
|
605
|
+
it("scales geometry correctly", () => {
|
|
606
|
+
const annotation = createAnnotation();
|
|
607
|
+
const builder1 = runAppendTextAnnotationGeometry(annotation, seedStyleId, 1);
|
|
608
|
+
const builder2 = runAppendTextAnnotationGeometry(annotation, seedStyleId, 2);
|
|
609
|
+
expect(builder1.textStrings[0].height * 2).to.equal(builder2.textStrings[0].height);
|
|
610
|
+
expect(builder1.textStrings[0].width * 2).to.equal(builder2.textStrings[0].width);
|
|
611
|
+
});
|
|
612
|
+
});
|
|
357
613
|
//# sourceMappingURL=TextAnnotation.test.js.map
|