@itwin/core-backend 5.2.0-dev.7 → 5.3.0-dev.1

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.
Files changed (192) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/lib/cjs/BackendHubAccess.d.ts +2 -0
  3. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  4. package/lib/cjs/BackendHubAccess.js.map +1 -1
  5. package/lib/cjs/BackendLoggerCategory.d.ts +6 -0
  6. package/lib/cjs/BackendLoggerCategory.d.ts.map +1 -1
  7. package/lib/cjs/BackendLoggerCategory.js +6 -0
  8. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  9. package/lib/cjs/BriefcaseManager.d.ts +57 -3
  10. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  11. package/lib/cjs/BriefcaseManager.js +151 -42
  12. package/lib/cjs/BriefcaseManager.js.map +1 -1
  13. package/lib/cjs/CloudSqlite.d.ts +4 -0
  14. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  15. package/lib/cjs/CloudSqlite.js.map +1 -1
  16. package/lib/cjs/ECDb.d.ts +8 -0
  17. package/lib/cjs/ECDb.d.ts.map +1 -1
  18. package/lib/cjs/ECDb.js +22 -0
  19. package/lib/cjs/ECDb.js.map +1 -1
  20. package/lib/cjs/IModelDb.d.ts +54 -3
  21. package/lib/cjs/IModelDb.d.ts.map +1 -1
  22. package/lib/cjs/IModelDb.js +87 -9
  23. package/lib/cjs/IModelDb.js.map +1 -1
  24. package/lib/cjs/IModelHost.d.ts +11 -1
  25. package/lib/cjs/IModelHost.d.ts.map +1 -1
  26. package/lib/cjs/IModelHost.js +5 -0
  27. package/lib/cjs/IModelHost.js.map +1 -1
  28. package/lib/cjs/IModelIncrementalSchemaLocater.d.ts +1 -5
  29. package/lib/cjs/IModelIncrementalSchemaLocater.d.ts.map +1 -1
  30. package/lib/cjs/IModelIncrementalSchemaLocater.js +0 -6
  31. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  32. package/lib/cjs/SqliteChangesetReader.d.ts +8 -0
  33. package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
  34. package/lib/cjs/SqliteChangesetReader.js +11 -0
  35. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  36. package/lib/cjs/StashManager.d.ts +175 -0
  37. package/lib/cjs/StashManager.d.ts.map +1 -0
  38. package/lib/cjs/StashManager.js +306 -0
  39. package/lib/cjs/StashManager.js.map +1 -0
  40. package/lib/cjs/TxnManager.d.ts +226 -15
  41. package/lib/cjs/TxnManager.d.ts.map +1 -1
  42. package/lib/cjs/TxnManager.js +249 -23
  43. package/lib/cjs/TxnManager.js.map +1 -1
  44. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +10 -1
  45. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  46. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +15 -6
  47. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  48. package/lib/cjs/annotations/LeaderGeometry.d.ts +3 -2
  49. package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
  50. package/lib/cjs/annotations/LeaderGeometry.js +5 -4
  51. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  52. package/lib/cjs/annotations/TextAnnotationElement.d.ts +52 -24
  53. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  54. package/lib/cjs/annotations/TextAnnotationElement.js +49 -59
  55. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  56. package/lib/cjs/annotations/TextAnnotationGeometry.d.ts +2 -0
  57. package/lib/cjs/annotations/TextAnnotationGeometry.d.ts.map +1 -1
  58. package/lib/cjs/annotations/TextAnnotationGeometry.js +26 -19
  59. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  60. package/lib/cjs/annotations/TextBlockGeometry.d.ts.map +1 -1
  61. package/lib/cjs/annotations/TextBlockGeometry.js +8 -0
  62. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  63. package/lib/cjs/annotations/TextBlockLayout.d.ts +49 -36
  64. package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -1
  65. package/lib/cjs/annotations/TextBlockLayout.js +204 -135
  66. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  67. package/lib/cjs/internal/ChannelAdmin.js +1 -1
  68. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  69. package/lib/cjs/internal/Symbols.d.ts +1 -0
  70. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  71. package/lib/cjs/internal/Symbols.js +2 -1
  72. package/lib/cjs/internal/Symbols.js.map +1 -1
  73. package/lib/cjs/internal/annotations/fields.d.ts +2 -12
  74. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  75. package/lib/cjs/internal/annotations/fields.js +49 -45
  76. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  77. package/lib/cjs/workspace/Workspace.d.ts +1 -1
  78. package/lib/cjs/workspace/Workspace.js.map +1 -1
  79. package/lib/esm/BackendHubAccess.d.ts +2 -0
  80. package/lib/esm/BackendHubAccess.d.ts.map +1 -1
  81. package/lib/esm/BackendHubAccess.js.map +1 -1
  82. package/lib/esm/BackendLoggerCategory.d.ts +6 -0
  83. package/lib/esm/BackendLoggerCategory.d.ts.map +1 -1
  84. package/lib/esm/BackendLoggerCategory.js +6 -0
  85. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  86. package/lib/esm/BriefcaseManager.d.ts +57 -3
  87. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  88. package/lib/esm/BriefcaseManager.js +152 -43
  89. package/lib/esm/BriefcaseManager.js.map +1 -1
  90. package/lib/esm/CloudSqlite.d.ts +4 -0
  91. package/lib/esm/CloudSqlite.d.ts.map +1 -1
  92. package/lib/esm/CloudSqlite.js.map +1 -1
  93. package/lib/esm/ECDb.d.ts +8 -0
  94. package/lib/esm/ECDb.d.ts.map +1 -1
  95. package/lib/esm/ECDb.js +22 -0
  96. package/lib/esm/ECDb.js.map +1 -1
  97. package/lib/esm/IModelDb.d.ts +54 -3
  98. package/lib/esm/IModelDb.d.ts.map +1 -1
  99. package/lib/esm/IModelDb.js +88 -10
  100. package/lib/esm/IModelDb.js.map +1 -1
  101. package/lib/esm/IModelHost.d.ts +11 -1
  102. package/lib/esm/IModelHost.d.ts.map +1 -1
  103. package/lib/esm/IModelHost.js +5 -0
  104. package/lib/esm/IModelHost.js.map +1 -1
  105. package/lib/esm/IModelIncrementalSchemaLocater.d.ts +1 -5
  106. package/lib/esm/IModelIncrementalSchemaLocater.d.ts.map +1 -1
  107. package/lib/esm/IModelIncrementalSchemaLocater.js +0 -6
  108. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  109. package/lib/esm/SqliteChangesetReader.d.ts +8 -0
  110. package/lib/esm/SqliteChangesetReader.d.ts.map +1 -1
  111. package/lib/esm/SqliteChangesetReader.js +11 -0
  112. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  113. package/lib/esm/StashManager.d.ts +175 -0
  114. package/lib/esm/StashManager.d.ts.map +1 -0
  115. package/lib/esm/StashManager.js +301 -0
  116. package/lib/esm/StashManager.js.map +1 -0
  117. package/lib/esm/TxnManager.d.ts +226 -15
  118. package/lib/esm/TxnManager.d.ts.map +1 -1
  119. package/lib/esm/TxnManager.js +247 -21
  120. package/lib/esm/TxnManager.js.map +1 -1
  121. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +10 -1
  122. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  123. package/lib/esm/annotations/ElementDrivesTextAnnotation.js +13 -5
  124. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  125. package/lib/esm/annotations/LeaderGeometry.d.ts +3 -2
  126. package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
  127. package/lib/esm/annotations/LeaderGeometry.js +5 -4
  128. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  129. package/lib/esm/annotations/TextAnnotationElement.d.ts +52 -24
  130. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  131. package/lib/esm/annotations/TextAnnotationElement.js +51 -61
  132. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  133. package/lib/esm/annotations/TextAnnotationGeometry.d.ts +2 -0
  134. package/lib/esm/annotations/TextAnnotationGeometry.d.ts.map +1 -1
  135. package/lib/esm/annotations/TextAnnotationGeometry.js +26 -19
  136. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  137. package/lib/esm/annotations/TextBlockGeometry.d.ts.map +1 -1
  138. package/lib/esm/annotations/TextBlockGeometry.js +8 -0
  139. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  140. package/lib/esm/annotations/TextBlockLayout.d.ts +49 -36
  141. package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -1
  142. package/lib/esm/annotations/TextBlockLayout.js +205 -136
  143. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  144. package/lib/esm/internal/ChannelAdmin.js +1 -1
  145. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  146. package/lib/esm/internal/Symbols.d.ts +1 -0
  147. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  148. package/lib/esm/internal/Symbols.js +1 -0
  149. package/lib/esm/internal/Symbols.js.map +1 -1
  150. package/lib/esm/internal/annotations/fields.d.ts +2 -12
  151. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  152. package/lib/esm/internal/annotations/fields.js +51 -47
  153. package/lib/esm/internal/annotations/fields.js.map +1 -1
  154. package/lib/esm/test/AnnotationTestUtils.d.ts +5 -1
  155. package/lib/esm/test/AnnotationTestUtils.d.ts.map +1 -1
  156. package/lib/esm/test/AnnotationTestUtils.js +6 -1
  157. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  158. package/lib/esm/test/annotations/Fields.test.js +163 -46
  159. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  160. package/lib/esm/test/annotations/LeaderGeometry.test.js +12 -10
  161. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  162. package/lib/esm/test/annotations/TextAnnotation.test.js +299 -43
  163. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  164. package/lib/esm/test/annotations/TextBlock.test.js +453 -86
  165. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  166. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts +46 -0
  167. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts.map +1 -1
  168. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js +20 -2
  169. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  170. package/lib/esm/test/ecdb/ECDb.test.js +71 -1
  171. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  172. package/lib/esm/test/hubaccess/Rebase.test.d.ts +2 -0
  173. package/lib/esm/test/hubaccess/Rebase.test.d.ts.map +1 -0
  174. package/lib/esm/test/hubaccess/Rebase.test.js +640 -0
  175. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -0
  176. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js +20 -20
  177. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  178. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js +3 -3
  179. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  180. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts +16 -1
  181. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts.map +1 -1
  182. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js +47 -0
  183. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +1 -1
  184. package/lib/esm/test/standalone/ChangeMerge.test.js +15 -19
  185. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  186. package/lib/esm/test/standalone/ChangesetReader.test.js +131 -1
  187. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  188. package/lib/esm/test/standalone/MergeConflict.test.js +3 -3
  189. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  190. package/lib/esm/workspace/Workspace.d.ts +1 -1
  191. package/lib/esm/workspace/Workspace.js.map +1 -1
  192. 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(styleId) {
32
+ function createAnnotation(textBlock) {
30
33
  const styleOverrides = { fontName: "Karla" };
31
- const block = TextBlock.create({ styleId: styleId ?? "0x42", styleOverrides });
32
- block.appendRun(TextRun.create({ content: "Run, Barry,", styleOverrides }));
33
- block.appendRun(TextRun.create({ content: " RUN!!! ", styleOverrides }));
34
- block.appendRun(FractionRun.create({ numerator: "Harrison", denominator: "Wells", styleOverrides }));
35
- block.margins = { left: 0, right: 1, top: 2, bottom: 3 };
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({ styleId: "0x42" }).toJSON() })
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(anno.textBlock.styleId).to.equal("0x42");
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({ styleId: "0x42" }).toJSON() })
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({ styleId: "0x42" });
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 seedCategoryId;
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
- seedCategoryId = category;
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 el = createElement3d({ textAnnotationData: annotation.toJSON() });
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 seedCategoryId;
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
- expect(styleId).not.to.be.undefined;
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 el = createElement2d({ textAnnotationData: annotation.toJSON() });
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