@itwin/core-backend 3.4.0-dev.3 → 3.4.0-dev.30

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 (73) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  3. package/lib/cjs/BackendHubAccess.js.map +1 -1
  4. package/lib/cjs/ChangedElementsDb.d.ts +1 -0
  5. package/lib/cjs/ChangedElementsDb.d.ts.map +1 -1
  6. package/lib/cjs/ChangedElementsDb.js +2 -2
  7. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  8. package/lib/cjs/CodeService.d.ts +392 -0
  9. package/lib/cjs/CodeService.d.ts.map +1 -0
  10. package/lib/cjs/CodeService.js +62 -0
  11. package/lib/cjs/CodeService.js.map +1 -0
  12. package/lib/cjs/CodeSpecs.js.map +1 -1
  13. package/lib/cjs/CustomViewState3dCreator.d.ts.map +1 -1
  14. package/lib/cjs/CustomViewState3dCreator.js +1 -0
  15. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  16. package/lib/cjs/Element.d.ts.map +1 -1
  17. package/lib/cjs/Element.js +4 -0
  18. package/lib/cjs/Element.js.map +1 -1
  19. package/lib/cjs/ElementTreeWalker.d.ts +41 -18
  20. package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
  21. package/lib/cjs/ElementTreeWalker.js +91 -57
  22. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  23. package/lib/cjs/ExportGraphics.d.ts +9 -9
  24. package/lib/cjs/ExportGraphics.d.ts.map +1 -1
  25. package/lib/cjs/ExportGraphics.js.map +1 -1
  26. package/lib/cjs/GeoCoordConfig.d.ts +7 -1
  27. package/lib/cjs/GeoCoordConfig.d.ts.map +1 -1
  28. package/lib/cjs/GeoCoordConfig.js +15 -6
  29. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  30. package/lib/cjs/HubMock.d.ts.map +1 -1
  31. package/lib/cjs/HubMock.js +7 -7
  32. package/lib/cjs/HubMock.js.map +1 -1
  33. package/lib/cjs/IModelDb.d.ts +17 -4
  34. package/lib/cjs/IModelDb.d.ts.map +1 -1
  35. package/lib/cjs/IModelDb.js +53 -11
  36. package/lib/cjs/IModelDb.js.map +1 -1
  37. package/lib/cjs/IModelHost.d.ts.map +1 -1
  38. package/lib/cjs/IModelHost.js +3 -1
  39. package/lib/cjs/IModelHost.js.map +1 -1
  40. package/lib/cjs/IModelSchemaLoader.d.ts.map +1 -1
  41. package/lib/cjs/IModelSchemaLoader.js +10 -18
  42. package/lib/cjs/IModelSchemaLoader.js.map +1 -1
  43. package/lib/cjs/LocalHub.js +1 -1
  44. package/lib/cjs/LocalHub.js.map +1 -1
  45. package/lib/cjs/Material.d.ts +3 -1
  46. package/lib/cjs/Material.d.ts.map +1 -1
  47. package/lib/cjs/Material.js +3 -1
  48. package/lib/cjs/Material.js.map +1 -1
  49. package/lib/cjs/PropertyStore.d.ts +134 -0
  50. package/lib/cjs/PropertyStore.d.ts.map +1 -0
  51. package/lib/cjs/PropertyStore.js +12 -0
  52. package/lib/cjs/PropertyStore.js.map +1 -0
  53. package/lib/cjs/SQLiteDb.d.ts +79 -40
  54. package/lib/cjs/SQLiteDb.d.ts.map +1 -1
  55. package/lib/cjs/SQLiteDb.js +57 -40
  56. package/lib/cjs/SQLiteDb.js.map +1 -1
  57. package/lib/cjs/SqliteStatement.d.ts +14 -2
  58. package/lib/cjs/SqliteStatement.d.ts.map +1 -1
  59. package/lib/cjs/SqliteStatement.js +50 -28
  60. package/lib/cjs/SqliteStatement.js.map +1 -1
  61. package/lib/cjs/TxnManager.js +1 -1
  62. package/lib/cjs/TxnManager.js.map +1 -1
  63. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +10 -0
  64. package/lib/cjs/assets/Settings/backend.setting.json5 +1 -1
  65. package/lib/cjs/core-backend.d.ts +3 -0
  66. package/lib/cjs/core-backend.d.ts.map +1 -1
  67. package/lib/cjs/core-backend.js +3 -0
  68. package/lib/cjs/core-backend.js.map +1 -1
  69. package/lib/cjs/workspace/Workspace.d.ts +7 -3
  70. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  71. package/lib/cjs/workspace/Workspace.js +25 -20
  72. package/lib/cjs/workspace/Workspace.js.map +1 -1
  73. package/package.json +15 -15
@@ -1,7 +1,7 @@
1
1
  /** @packageDocumentation
2
2
  * @module Elements
3
3
  */
4
- import { Id64String } from "@itwin/core-bentley";
4
+ import { Id64Array, Id64String } from "@itwin/core-bentley";
5
5
  import { IModelDb } from "./IModelDb";
6
6
  import { Model } from "./Model";
7
7
  /** @beta */
@@ -60,21 +60,41 @@ export declare abstract class ElementTreeBottomUp {
60
60
  /** process the elements in the specified model */
61
61
  private _processSubModel;
62
62
  }
63
+ /** Helper class that manages the deletion of definitions and subjects */
64
+ declare class SpecialElements {
65
+ definitionModels: Id64Array;
66
+ definitions: Id64Array;
67
+ subjects: Id64Array;
68
+ recordSpecialElement(iModel: IModelDb, elementId: Id64String): boolean;
69
+ /** Delete special elements - This calls Elements.deleteDefinitionElements to process the collected definition elements as a group and then
70
+ * calls Models.deleteModel on collected definition models. It then deletes all collected Subjects by calling Element.deleteElement on them.
71
+ * @note Caller must ensure that the special elements were recorded in a depth-first search.
72
+ */
73
+ deleteSpecialElements(iModel: IModelDb): void;
74
+ }
63
75
  /** Deletes an entire element tree, including sub-models and child elements.
64
76
  * Items are deleted in bottom-up order. Definitions and Subjects are deleted after normal elements.
77
+ * Call deleteNormalElements on each tree. Then call deleteSpecialElements.
78
+ * @see deleteElementTree for a simple way to use this class.
65
79
  * @beta
66
80
  */
67
81
  export declare class ElementTreeDeleter extends ElementTreeBottomUp {
68
- private _special;
69
- private _topElement;
70
- private _topScope;
71
- constructor(iModel: IModelDb, topElement: Id64String, scope?: ElementTreeWalkerScope);
82
+ protected _special: SpecialElements;
72
83
  protected shouldExploreModel(_model: Model): boolean;
73
84
  protected shouldVisitElement(_elementId: Id64String): boolean;
74
85
  protected visitModel(model: Model, _scope: ElementTreeWalkerScope): void;
75
86
  protected visitElement(elementId: Id64String, _scope: ElementTreeWalkerScope): void;
76
- /** Delete the element tree. */
77
- deleteElementTree(): void;
87
+ /**
88
+ * Delete the "normal" elements and record the special elements for deferred processing.
89
+ * @param topElement The parent of the sub-tree to be deleted. Top element itself is also deleted.
90
+ * @param scope How the parent was found
91
+ * @see deleteSpecialElements
92
+ */
93
+ deleteNormalElements(topElement: Id64String, scope?: ElementTreeWalkerScope): void;
94
+ /** Delete all special elements that were found and deferred by deleteNormalElements. Call this
95
+ * function once after all element trees are processed by deleteNormalElements.
96
+ */
97
+ deleteSpecialElements(): void;
78
98
  }
79
99
  /** Does a breadth-first search on the tree defined by an element and its sub-models and children.
80
100
  * Parents are visited first, then children, then sub-models.
@@ -99,27 +119,30 @@ declare abstract class ElementTreeTopDown {
99
119
  * @beta
100
120
  */
101
121
  export declare type ElementSubTreeDeleteFilter = (elementId: Id64String, scope: ElementTreeWalkerScope) => boolean;
102
- /** Deletes the element sub-trees that are chosen by a supplied filter function.
103
- * This class uses ElementTreeTopDown to visit element sub-trees in top-down order.
104
- * When the filter function chooses a sub-tree, this class uses ElementTreeDeleter to delete it.
105
- * Note that when a sub-tree is selected and deleted, its children and sub-models are not visited.
122
+ /** Performs a breadth-first search to visit elements in top-down order.
123
+ * When the supplied filter function chooses an element, ElementTreeDeleter is used to delete it and its sub-tree.
106
124
  * @beta
107
125
  */
108
126
  export declare class ElementSubTreeDeleter extends ElementTreeTopDown {
109
- private _special;
110
- private _topElement;
111
- private _topScope;
127
+ private _treeDeleter;
112
128
  private _shouldPruneCb;
113
- /** Construct an ElementSubTreeDeleter. @see pruneElementTree.
129
+ /** Construct an ElementSubTreeDeleter.
114
130
  * @param iModel The iModel
115
131
  * @param topElement Where to start the search.
116
132
  * @param shouldPruneCb Callback that selects sub-trees that should be deleted.
133
+ * @see deleteElementSubTrees for a simple way to use this class.
117
134
  */
118
- constructor(iModel: IModelDb, topElement: Id64String, shouldPruneCb: ElementSubTreeDeleteFilter, scope?: ElementTreeWalkerScope);
135
+ constructor(iModel: IModelDb, shouldPruneCb: ElementSubTreeDeleteFilter);
119
136
  protected shouldPrune(elementId: Id64String, scope: ElementTreeWalkerScope): boolean;
120
137
  protected prune(elementId: Id64String, scope: ElementTreeWalkerScope): void;
121
- /** Traverses the tree of elements, beginning with the top element, and deletes all selected sub-trees. */
122
- pruneElementTree(): void;
138
+ /** Traverses the tree of elements beginning with the top element, and deletes all selected sub-trees.
139
+ * Normal elements are deleted. Any special elements that are encountered are deferred.
140
+ * Call deleteSpecialElementSubTrees after all top elements have been processed. */
141
+ deleteNormalElementSubTrees(topElement: Id64String, scope?: ElementTreeWalkerScope): void;
142
+ /** Delete all special elements and their sub-trees that were found in the course of processing.
143
+ * The sub-trees were already expanded by ElementTreeDeleter.deleteNormalElements.
144
+ */
145
+ deleteSpecialElementSubTrees(): void;
123
146
  }
124
147
  /** Deletes an element tree starting with the specified top element. The top element is also deleted. Uses ElementTreeDeleter.
125
148
  * @param iModel The iModel
@@ -1 +1 @@
1
- {"version":3,"file":"ElementTreeWalker.d.ts","sourceRoot":"","sources":["../../src/ElementTreeWalker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ElementTreeWalker.d.ts","sourceRoot":"","sources":["../../src/ElementTreeWalker.ts"],"names":[],"mappings":"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"}
@@ -11,11 +11,24 @@ exports.deleteElementSubTrees = exports.deleteElementTree = exports.ElementSubTr
11
11
  const core_bentley_1 = require("@itwin/core-bentley");
12
12
  const core_common_1 = require("@itwin/core-common");
13
13
  const BackendLoggerCategory_1 = require("./BackendLoggerCategory");
14
- const Category_1 = require("./Category");
15
14
  const Element_1 = require("./Element");
16
15
  const IModelDb_1 = require("./IModelDb");
17
16
  const Model_1 = require("./Model");
18
17
  const loggerCategory = `${BackendLoggerCategory_1.BackendLoggerCategory.IModelDb}.ElementTreeWalker`;
18
+ function sortChildrenBeforeParents(iModel, ids) {
19
+ const children = [];
20
+ const parents = [];
21
+ for (const eid of ids) {
22
+ const parentId = iModel.elements.queryParent(eid);
23
+ if (parentId !== undefined && ids.includes(parentId))
24
+ children.push(eid);
25
+ else
26
+ parents.push(eid);
27
+ }
28
+ if (children.length === 0)
29
+ return [parents];
30
+ return [...sortChildrenBeforeParents(iModel, children), parents];
31
+ }
19
32
  function isModelEmpty(iModel, modelId) {
20
33
  return iModel.withPreparedStatement(`select count(*) from ${Element_1.Element.classFullName} where Model.Id = ?`, (stmt) => {
21
34
  stmt.bindId(1, modelId);
@@ -92,7 +105,7 @@ class ElementTreeWalkerScope {
92
105
  exports.ElementTreeWalkerScope = ElementTreeWalkerScope;
93
106
  function fmtElement(iModel, elementId) {
94
107
  const el = iModel.elements.getElement(elementId);
95
- return `${el.id} ${el.classFullName} ${el.code.value} ${el.getDisplayLabel()}`;
108
+ return `${el.id} ${el.classFullName} ${el.getDisplayLabel()}`;
96
109
  }
97
110
  function fmtModel(model) {
98
111
  return `${model.id} ${model.classFullName} ${model.name}`;
@@ -103,15 +116,26 @@ function isTraceEnabled() {
103
116
  isTraceEnabledChecked = core_bentley_1.Logger.isEnabled(loggerCategory, core_bentley_1.LogLevel.Trace) ? 1 : 0;
104
117
  return isTraceEnabledChecked === 1;
105
118
  }
106
- function logElement(op, iModel, elementId, scope) {
107
- if (isTraceEnabled())
108
- core_bentley_1.Logger.logTrace(loggerCategory, `${op} ${fmtElement(iModel, elementId)} ${scope === null || scope === void 0 ? void 0 : scope.toString()}`);
119
+ function logElement(op, iModel, elementId, scope, logChildren) {
120
+ if (!isTraceEnabled())
121
+ return;
122
+ core_bentley_1.Logger.logTrace(loggerCategory, `${op} ${fmtElement(iModel, elementId)} ${scope ? scope.toString() : ""}`);
123
+ if (logChildren)
124
+ iModel.elements.queryChildren(elementId).forEach((c) => logElement(" - ", iModel, c, undefined, true));
109
125
  }
110
- function logModel(op, iModel, modelId, scope) {
126
+ function logModel(op, iModel, modelId, scope, logElements) {
111
127
  if (!isTraceEnabled())
112
128
  return;
113
129
  const model = iModel.models.getModel(modelId);
114
- core_bentley_1.Logger.logTrace(loggerCategory, `${op} ${fmtModel(model)} ${scope === null || scope === void 0 ? void 0 : scope.toString()}`);
130
+ core_bentley_1.Logger.logTrace(loggerCategory, `${op} ${fmtModel(model)} ${scope ? scope.toString() : ""}`);
131
+ if (logElements) {
132
+ iModel.withPreparedStatement(`select ecinstanceid from ${Element_1.Element.classFullName} where Model.Id = ?`, (stmt) => {
133
+ stmt.bindId(1, modelId);
134
+ while (stmt.step() === core_bentley_1.DbResult.BE_SQLITE_ROW) {
135
+ logElement(" - ", iModel, stmt.getValue(0).getId());
136
+ }
137
+ });
138
+ }
115
139
  }
116
140
  /** Does a depth-first search on the tree defined by an element and its sub-models and children.
117
141
  * Sub-models are visited before their modeled elements, and children are visited before their parents.
@@ -197,31 +221,27 @@ class SpecialElements {
197
221
  }
198
222
  return false; // not a special element
199
223
  }
200
- // It's dangerous to pass a mixture of SubCategories and Categories to deleteDefinitionElements.
201
- // That function will delete the Categories first, which automatically deletes all their child
202
- // SubCategories (in native code). If a SubCategory in the list is one of those children, then
203
- // deleteDefinitionElements will try and fail with an exception to delete that SubCategory in a subsequent step.
204
- // To work around this, we delete the SubCategories first, then everything else.
205
- _siftSpecialElements(iModel) {
206
- const subCategories = [];
207
- const other = [];
208
- this.definitions.forEach((elementId) => {
209
- if (iModel.elements.tryGetElement(elementId, Category_1.SubCategory) !== undefined)
210
- subCategories.push(elementId);
211
- else
212
- other.push(elementId);
213
- });
214
- return [subCategories, other];
215
- }
224
+ /** Delete special elements - This calls Elements.deleteDefinitionElements to process the collected definition elements as a group and then
225
+ * calls Models.deleteModel on collected definition models. It then deletes all collected Subjects by calling Element.deleteElement on them.
226
+ * @note Caller must ensure that the special elements were recorded in a depth-first search.
227
+ */
216
228
  deleteSpecialElements(iModel) {
217
- for (const definitions of this._siftSpecialElements(iModel)) {
229
+ // It's dangerous to pass a mixture of SubCategories and Categories to deleteDefinitionElements.
230
+ // That function will delete the Categories first, which automatically deletes all their child
231
+ // SubCategories (in native code). If a SubCategory in the list is one of those children, then
232
+ // deleteDefinitionElements will try and fail with an exception to delete that SubCategory in a subsequent step.
233
+ // To work around this, we delete the SubCategories first, then everything else.
234
+ // A similar problem occurs when you pass other kinds of elements to deleteDefinitionElements, where some are
235
+ // children and others are parents. deleteDefinitionElements does not preserve the order that you specify,
236
+ // and it does not process children before parents.
237
+ for (const definitions of sortChildrenBeforeParents(iModel, this.definitions)) {
218
238
  if (isTraceEnabled())
219
239
  definitions.forEach((e) => logElement("try delete", iModel, e));
220
- iModel.elements.deleteDefinitionElements(definitions); // will not deleted definitions that are still in use.
240
+ iModel.elements.deleteDefinitionElements(definitions); // will not delete definitions that are still in use.
221
241
  }
222
242
  for (const m of this.definitionModels) {
223
243
  if (!isModelEmpty(iModel, m)) {
224
- logModel("Model not empty - cannot delete - may contain Definitions that are still in use", iModel, m);
244
+ logModel("Model not empty - cannot delete - may contain Definitions that are still in use", iModel, m, undefined, true);
225
245
  }
226
246
  else {
227
247
  logModel("delete", iModel, m);
@@ -231,7 +251,7 @@ class SpecialElements {
231
251
  }
232
252
  for (const e of this.subjects) {
233
253
  if (iModel.elements.queryChildren(e).length !== 0) {
234
- logElement("Subject still has children - cannot delete - may have child DefinitionModels", iModel, e);
254
+ logElement("Subject still has children - cannot delete - may have child DefinitionModels", iModel, e, undefined, true);
235
255
  }
236
256
  else {
237
257
  logElement("delete", iModel, e);
@@ -242,22 +262,21 @@ class SpecialElements {
242
262
  }
243
263
  /** Deletes an entire element tree, including sub-models and child elements.
244
264
  * Items are deleted in bottom-up order. Definitions and Subjects are deleted after normal elements.
265
+ * Call deleteNormalElements on each tree. Then call deleteSpecialElements.
266
+ * @see deleteElementTree for a simple way to use this class.
245
267
  * @beta
246
268
  */
247
269
  class ElementTreeDeleter extends ElementTreeBottomUp {
248
- constructor(iModel, topElement, scope) {
249
- super(iModel);
270
+ constructor() {
271
+ super(...arguments);
250
272
  this._special = new SpecialElements();
251
- this._topElement = topElement;
252
- this._topScope = scope !== null && scope !== void 0 ? scope : ElementTreeWalkerScope.createTopScope(this._iModel, this._topElement);
253
273
  }
254
274
  shouldExploreModel(_model) { return true; }
255
275
  shouldVisitElement(_elementId) { return true; }
256
276
  visitModel(model, _scope) {
257
277
  if (isDefinitionModel(model))
258
278
  return; // we recorded definition models in visitElement when we encountered the DefinitionPartition elements.
259
- // visitElement was called first, and it deleted the elements in the model. So, now it's safe to delete the model itself.
260
- // TODO: will fail if model has an element that is sub-modeled by a **DefinitionModel**. I hope that never occurs!
279
+ // visitElement has already deleted the elements in the model. So, now it's safe to delete the model itself.
261
280
  logModel("delete", this._iModel, model.id, _scope);
262
281
  model.delete();
263
282
  }
@@ -267,9 +286,20 @@ class ElementTreeDeleter extends ElementTreeBottomUp {
267
286
  this._iModel.elements.deleteElement(elementId);
268
287
  }
269
288
  }
270
- /** Delete the element tree. */
271
- deleteElementTree() {
272
- this.processElementTree(this._topElement, this._topScope); // Delete the "normal" elements and record the special elements for deferred processing
289
+ /**
290
+ * Delete the "normal" elements and record the special elements for deferred processing.
291
+ * @param topElement The parent of the sub-tree to be deleted. Top element itself is also deleted.
292
+ * @param scope How the parent was found
293
+ * @see deleteSpecialElements
294
+ */
295
+ deleteNormalElements(topElement, scope) {
296
+ const topScope = scope !== null && scope !== void 0 ? scope : ElementTreeWalkerScope.createTopScope(this._iModel, topElement);
297
+ this.processElementTree(topElement, topScope); //
298
+ }
299
+ /** Delete all special elements that were found and deferred by deleteNormalElements. Call this
300
+ * function once after all element trees are processed by deleteNormalElements.
301
+ */
302
+ deleteSpecialElements() {
273
303
  this._special.deleteSpecialElements(this._iModel);
274
304
  }
275
305
  }
@@ -317,36 +347,38 @@ class ElementTreeTopDown {
317
347
  });
318
348
  }
319
349
  }
320
- /** Deletes the element sub-trees that are chosen by a supplied filter function.
321
- * This class uses ElementTreeTopDown to visit element sub-trees in top-down order.
322
- * When the filter function chooses a sub-tree, this class uses ElementTreeDeleter to delete it.
323
- * Note that when a sub-tree is selected and deleted, its children and sub-models are not visited.
350
+ /** Performs a breadth-first search to visit elements in top-down order.
351
+ * When the supplied filter function chooses an element, ElementTreeDeleter is used to delete it and its sub-tree.
324
352
  * @beta
325
353
  */
326
354
  class ElementSubTreeDeleter extends ElementTreeTopDown {
327
- /** Construct an ElementSubTreeDeleter. @see pruneElementTree.
355
+ /** Construct an ElementSubTreeDeleter.
328
356
  * @param iModel The iModel
329
357
  * @param topElement Where to start the search.
330
358
  * @param shouldPruneCb Callback that selects sub-trees that should be deleted.
359
+ * @see deleteElementSubTrees for a simple way to use this class.
331
360
  */
332
- constructor(iModel, topElement, shouldPruneCb, scope) {
361
+ constructor(iModel, shouldPruneCb) {
333
362
  super(iModel);
334
- this._special = new SpecialElements();
335
- this._topElement = topElement;
336
- this._topScope = scope !== null && scope !== void 0 ? scope : ElementTreeWalkerScope.createTopScope(this._iModel, this._topElement);
363
+ this._treeDeleter = new ElementTreeDeleter(this._iModel);
337
364
  this._shouldPruneCb = shouldPruneCb;
338
365
  }
339
366
  shouldPrune(elementId, scope) { return this._shouldPruneCb(elementId, scope); }
340
367
  prune(elementId, scope) {
341
- if (!this._special.recordSpecialElement(this._iModel, elementId)) {
342
- const del = new ElementTreeDeleter(this._iModel, elementId, scope);
343
- del.deleteElementTree();
344
- }
368
+ this._treeDeleter.deleteNormalElements(elementId, scope);
345
369
  }
346
- /** Traverses the tree of elements, beginning with the top element, and deletes all selected sub-trees. */
347
- pruneElementTree() {
348
- this.processElementTree(this._topElement, this._topScope); // deletes normal elements and their sub-trees, defers special elements
349
- this._special.deleteSpecialElements(this._iModel);
370
+ /** Traverses the tree of elements beginning with the top element, and deletes all selected sub-trees.
371
+ * Normal elements are deleted. Any special elements that are encountered are deferred.
372
+ * Call deleteSpecialElementSubTrees after all top elements have been processed. */
373
+ deleteNormalElementSubTrees(topElement, scope) {
374
+ const topScope = scope !== null && scope !== void 0 ? scope : ElementTreeWalkerScope.createTopScope(this._iModel, topElement);
375
+ this.processElementTree(topElement, topScope); // deletes normal elements and their sub-trees, defers special elements
376
+ }
377
+ /** Delete all special elements and their sub-trees that were found in the course of processing.
378
+ * The sub-trees were already expanded by ElementTreeDeleter.deleteNormalElements.
379
+ */
380
+ deleteSpecialElementSubTrees() {
381
+ this._treeDeleter.deleteSpecialElements();
350
382
  }
351
383
  }
352
384
  exports.ElementSubTreeDeleter = ElementSubTreeDeleter;
@@ -356,8 +388,9 @@ exports.ElementSubTreeDeleter = ElementSubTreeDeleter;
356
388
  * @beta
357
389
  */
358
390
  function deleteElementTree(iModel, topElement) {
359
- const del = new ElementTreeDeleter(iModel, topElement);
360
- del.deleteElementTree();
391
+ const del = new ElementTreeDeleter(iModel);
392
+ del.deleteNormalElements(topElement);
393
+ del.deleteSpecialElements();
361
394
  }
362
395
  exports.deleteElementTree = deleteElementTree;
363
396
  /** Deletes all element sub-trees that are selected by the supplied filter. Uses ElementSubTreeDeleter.
@@ -369,8 +402,9 @@ exports.deleteElementTree = deleteElementTree;
369
402
  * @beta
370
403
  */
371
404
  function deleteElementSubTrees(iModel, topElement, filter) {
372
- const del = new ElementSubTreeDeleter(iModel, topElement, filter);
373
- del.pruneElementTree();
405
+ const del = new ElementSubTreeDeleter(iModel, filter);
406
+ del.deleteNormalElementSubTrees(topElement);
407
+ del.deleteSpecialElementSubTrees();
374
408
  }
375
409
  exports.deleteElementSubTrees = deleteElementSubTrees;
376
410
  //# sourceMappingURL=ElementTreeWalker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElementTreeWalker.js","sourceRoot":"","sources":["../../src/ElementTreeWalker.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\nimport { assert, DbResult, Id64Array, Id64String, Logger, LogLevel } from \"@itwin/core-bentley\";\r\nimport { IModel } from \"@itwin/core-common\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { SubCategory } from \"./Category\";\r\nimport { DefinitionElement, DefinitionPartition, Element, Subject } from \"./Element\";\r\nimport { IModelDb } from \"./IModelDb\";\r\nimport { DefinitionModel, Model } from \"./Model\";\r\n\r\nconst loggerCategory = `${BackendLoggerCategory.IModelDb}.ElementTreeWalker`;\r\n\r\n/** @beta */\r\nexport interface ElementTreeWalkerModelInfo { model: Model, isDefinitionModel: boolean }\r\n\r\nfunction isModelEmpty(iModel: IModelDb, modelId: Id64String): boolean {\r\n return iModel.withPreparedStatement(`select count(*) from ${Element.classFullName} where Model.Id = ?`, (stmt) => {\r\n stmt.bindId(1, modelId);\r\n stmt.step();\r\n return stmt.getValue(0).getInteger() === 0;\r\n });\r\n}\r\n\r\nfunction isDefinitionModel(model: Model): boolean {\r\n return (model.id !== IModel.repositoryModelId) && (model instanceof DefinitionModel);\r\n}\r\n\r\nenum ElementPruningClassification { PRUNING_CLASS_Normal = 0, PRUNING_CLASS_Subject = 1, PRUNING_CLASS_Definition = 2, PRUNING_CLASS_DefinitionPartition = 3, }\r\n\r\nfunction classifyElementForPruning(iModel: IModelDb, elementId: Id64String): ElementPruningClassification {\r\n const el = iModel.elements.getElement(elementId);\r\n return (el instanceof Subject) ? ElementPruningClassification.PRUNING_CLASS_Subject :\r\n (el instanceof DefinitionElement) ? ElementPruningClassification.PRUNING_CLASS_Definition :\r\n (el instanceof DefinitionPartition) ? ElementPruningClassification.PRUNING_CLASS_DefinitionPartition :\r\n ElementPruningClassification.PRUNING_CLASS_Normal;\r\n}\r\n\r\n/** Records the path that a tree search took to reach an element or model. This object is immutable.\r\n * @beta\r\n */\r\nexport class ElementTreeWalkerScope {\r\n public readonly topElement: Id64String = \"\";\r\n /** path of parent elements and enclosing models */\r\n public readonly path: Array<Id64String | ElementTreeWalkerModelInfo> = [];\r\n /** cached info about the immediately enclosing model (i.e., the last model in path) */\r\n public readonly enclosingModelInfo: ElementTreeWalkerModelInfo;\r\n\r\n constructor(topElement: Id64String, model: Model);\r\n constructor(enclosingScope: ElementTreeWalkerScope, newScope: Id64String | Model);\r\n constructor(arg1: Id64String | ElementTreeWalkerScope, arg2: Model | Id64String) {\r\n if (typeof arg1 === \"string\") {\r\n // normal constructor\r\n assert(arg2 instanceof Model);\r\n this.topElement = arg1;\r\n this.path.push(this.enclosingModelInfo = { model: arg2, isDefinitionModel: isDefinitionModel(arg2) });\r\n } else if (arg1 instanceof ElementTreeWalkerScope) {\r\n // copy-like constructor\r\n this.topElement = arg1.topElement;\r\n this.path = [...arg1.path];\r\n if (typeof arg2 === \"string\") {\r\n // with new parent\r\n this.path.push(arg2);\r\n this.enclosingModelInfo = arg1.enclosingModelInfo;\r\n } else {\r\n // with new enclosing model\r\n this.path.push(this.enclosingModelInfo = { model: arg2, isDefinitionModel: isDefinitionModel(arg2) });\r\n }\r\n } else {\r\n throw new Error(\"invalid constructor signature\");\r\n }\r\n }\r\n\r\n public get enclosingModel(): Model { return this.enclosingModelInfo.model; }\r\n public get inDefinitionModel(): boolean { return this.enclosingModelInfo.isDefinitionModel; } // NB: this will return false for the RepositoryModel!\r\n public get inRepositoryModel(): boolean { return this.enclosingModelInfo.model.id === IModelDb.repositoryModelId; }\r\n\r\n public static createTopScope(iModel: IModelDb, topElementId: Id64String) {\r\n const topElement = iModel.elements.getElement(topElementId);\r\n const topElementModel = iModel.models.getModel(topElement.model);\r\n return new ElementTreeWalkerScope(topElementId, topElementModel);\r\n }\r\n\r\n private fmtItem(v: Id64String | ElementTreeWalkerModelInfo): string {\r\n if (typeof v === \"string\")\r\n return `element ${v}`;\r\n return `model ${v.model.id} ${v.isDefinitionModel ? \"(DEFN)\" : \"\"}`;\r\n }\r\n\r\n public toString(): string {\r\n return `[ ${this.path.map((v) => this.fmtItem(v)).join(\" / \")} ]`;\r\n }\r\n}\r\n\r\nfunction fmtElement(iModel: IModelDb, elementId: Id64String): string {\r\n const el = iModel.elements.getElement(elementId);\r\n return `${el.id} ${el.classFullName} ${el.code.value} ${el.getDisplayLabel()}`;\r\n}\r\n\r\nfunction fmtModel(model: Model): string {\r\n return `${model.id} ${model.classFullName} ${model.name}`;\r\n}\r\n\r\nlet isTraceEnabledChecked = -1;\r\n\r\nfunction isTraceEnabled(): boolean {\r\n if (isTraceEnabledChecked === -1)\r\n isTraceEnabledChecked = Logger.isEnabled(loggerCategory, LogLevel.Trace) ? 1 : 0;\r\n return isTraceEnabledChecked === 1;\r\n}\r\n\r\nfunction logElement(op: string, iModel: IModelDb, elementId: Id64String, scope?: ElementTreeWalkerScope): void {\r\n if (isTraceEnabled())\r\n Logger.logTrace(loggerCategory, `${op} ${fmtElement(iModel, elementId)} ${scope?.toString()}`);\r\n}\r\n\r\nfunction logModel(op: string, iModel: IModelDb, modelId: Id64String, scope?: ElementTreeWalkerScope): void {\r\n if (!isTraceEnabled())\r\n return;\r\n const model: Model = iModel.models.getModel(modelId);\r\n Logger.logTrace(loggerCategory, `${op} ${fmtModel(model)} ${scope?.toString()}`);\r\n}\r\n\r\n/** Does a depth-first search on the tree defined by an element and its sub-models and children.\r\n * Sub-models are visited before their modeled elements, and children are visited before their parents.\r\n *\r\n * The following callbacks allow the subclass to exclude elements and sub-trees from the search:\r\n * * [[ElementTreeBottomUp.shouldExploreModel]], [[ElementTreeBottomUp.shouldExploreChildren]]\r\n * * [[ElementTreeBottomUp.shouldVisitElement]], [[ElementTreeBottomUp.shouldVisitModel]]\r\n *\r\n * The [[ElementTreeBottomUp.visitElement]] and [[ElementTreeBottomUp.visitModel]] callbacks allow\r\n * the subclass to process the elements and models that are encountered in the search.\r\n * @beta\r\n */\r\nexport abstract class ElementTreeBottomUp {\r\n constructor(protected _iModel: IModelDb) { }\r\n\r\n /** Return true if the search should recurse into this model */\r\n protected shouldExploreModel(_model: Model, _scope: ElementTreeWalkerScope): boolean { return true; }\r\n /** Return true if the search should recurse into the children (if any) of this element */\r\n protected shouldExploreChildren(_parentId: Id64String, _scope: ElementTreeWalkerScope): boolean { return true; }\r\n /** Return true if the search should visit this element */\r\n protected shouldVisitElement(_elementId: Id64String, _scope: ElementTreeWalkerScope): boolean { return true; }\r\n /** Return true if the search should visit this model */\r\n protected shouldVisitModel(_model: Model, _scope: ElementTreeWalkerScope): boolean { return true; }\r\n\r\n /** Called to visit a model */\r\n protected abstract visitModel(model: Model, scope: ElementTreeWalkerScope): void;\r\n\r\n /** Called to visit an element */\r\n protected abstract visitElement(elementId: Id64String, scope: ElementTreeWalkerScope): void;\r\n\r\n /** The main tree-walking function */\r\n protected processElementTree(element: Id64String, scope: ElementTreeWalkerScope) {\r\n const subModel = this._iModel.models.tryGetModel<Model>(element);\r\n if (subModel !== undefined) {\r\n if (this.shouldExploreModel(subModel, scope))\r\n this._processSubModel(subModel, scope);\r\n\r\n if (this.shouldVisitModel(subModel, scope))\r\n this.visitModel(subModel, scope);\r\n }\r\n\r\n if (this.shouldExploreChildren(element, scope))\r\n this._processChildren(element, scope);\r\n\r\n if (this.shouldVisitElement(element, scope))\r\n this.visitElement(element, scope);\r\n }\r\n\r\n /** process the children of the specified parent element */\r\n private _processChildren(parentElement: Id64String, parentScope: ElementTreeWalkerScope): void {\r\n const children = this._iModel.elements.queryChildren(parentElement);\r\n if (children.length === 0)\r\n return;\r\n\r\n const childrenScope = new ElementTreeWalkerScope(parentScope, parentElement);\r\n\r\n for (const childElement of children)\r\n this.processElementTree(childElement, childrenScope);\r\n }\r\n\r\n /** process the elements in the specified model */\r\n private _processSubModel(model: Model, parenScope: ElementTreeWalkerScope): void {\r\n const scope = new ElementTreeWalkerScope(parenScope, model);\r\n // Visit only the top-level parents. processElementTree will visit their children (bottom-up).\r\n model.iModel.withPreparedStatement(`select ECInstanceId from bis:Element where Model.id=? and Parent.Id is null`, (stmt) => {\r\n stmt.bindId(1, model.id);\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n const elementId = stmt.getValue(0).getId();\r\n this.processElementTree(elementId, scope);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/** Helper class that manages the deletion of definitions and subjects */\r\nclass SpecialElements {\r\n public definitionModels: Id64Array = [];\r\n public definitions: Id64Array = [];\r\n public subjects: Id64Array = [];\r\n\r\n public recordSpecialElement(iModel: IModelDb, elementId: Id64String): boolean {\r\n // Defer Definitions and Subjects\r\n const cls = classifyElementForPruning(iModel, elementId);\r\n if (cls === ElementPruningClassification.PRUNING_CLASS_Subject) {\r\n this.subjects.push(elementId);\r\n return true;\r\n } else if (cls === ElementPruningClassification.PRUNING_CLASS_Definition) {\r\n this.definitions.push(elementId);\r\n return true;\r\n } else if (cls === ElementPruningClassification.PRUNING_CLASS_DefinitionPartition) {\r\n this.definitionModels.push(elementId);\r\n return true;\r\n }\r\n return false; // not a special element\r\n }\r\n\r\n // It's dangerous to pass a mixture of SubCategories and Categories to deleteDefinitionElements.\r\n // That function will delete the Categories first, which automatically deletes all their child\r\n // SubCategories (in native code). If a SubCategory in the list is one of those children, then\r\n // deleteDefinitionElements will try and fail with an exception to delete that SubCategory in a subsequent step.\r\n // To work around this, we delete the SubCategories first, then everything else.\r\n private _siftSpecialElements(iModel: IModelDb): Array<string[]> {\r\n const subCategories: Id64Array = [];\r\n const other: Id64Array = [];\r\n this.definitions.forEach((elementId) => {\r\n if (iModel.elements.tryGetElement(elementId, SubCategory) !== undefined)\r\n subCategories.push(elementId);\r\n else\r\n other.push(elementId);\r\n });\r\n return [subCategories, other];\r\n }\r\n\r\n public deleteSpecialElements(iModel: IModelDb) {\r\n for (const definitions of this._siftSpecialElements(iModel)) {\r\n if (isTraceEnabled()) definitions.forEach((e) => logElement(\"try delete\", iModel, e));\r\n iModel.elements.deleteDefinitionElements(definitions); // will not deleted definitions that are still in use.\r\n }\r\n\r\n for (const m of this.definitionModels) {\r\n if (!isModelEmpty(iModel, m)) {\r\n logModel(\"Model not empty - cannot delete - may contain Definitions that are still in use\", iModel, m);\r\n } else {\r\n logModel(\"delete\", iModel, m);\r\n iModel.models.deleteModel(m);\r\n iModel.elements.deleteElement(m);\r\n }\r\n }\r\n\r\n for (const e of this.subjects) {\r\n if (iModel.elements.queryChildren(e).length !== 0) {\r\n logElement(\"Subject still has children - cannot delete - may have child DefinitionModels\", iModel, e);\r\n } else {\r\n logElement(\"delete\", iModel, e);\r\n iModel.elements.deleteElement(e);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** Deletes an entire element tree, including sub-models and child elements.\r\n * Items are deleted in bottom-up order. Definitions and Subjects are deleted after normal elements.\r\n * @beta\r\n */\r\nexport class ElementTreeDeleter extends ElementTreeBottomUp {\r\n private _special: SpecialElements = new SpecialElements();\r\n private _topElement: Id64String;\r\n private _topScope: ElementTreeWalkerScope;\r\n\r\n public constructor(iModel: IModelDb, topElement: Id64String, scope?: ElementTreeWalkerScope) {\r\n super(iModel);\r\n this._topElement = topElement;\r\n this._topScope = scope ?? ElementTreeWalkerScope.createTopScope(this._iModel, this._topElement);\r\n }\r\n\r\n protected override shouldExploreModel(_model: Model): boolean { return true; }\r\n protected override shouldVisitElement(_elementId: Id64String): boolean { return true; }\r\n\r\n protected override visitModel(model: Model, _scope: ElementTreeWalkerScope): void {\r\n if (isDefinitionModel(model))\r\n return; // we recorded definition models in visitElement when we encountered the DefinitionPartition elements.\r\n\r\n // visitElement was called first, and it deleted the elements in the model. So, now it's safe to delete the model itself.\r\n // TODO: will fail if model has an element that is sub-modeled by a **DefinitionModel**. I hope that never occurs!\r\n logModel(\"delete\", this._iModel, model.id, _scope);\r\n model.delete();\r\n }\r\n\r\n protected override visitElement(elementId: Id64String, _scope: ElementTreeWalkerScope): void {\r\n if (!this._special.recordSpecialElement(this._iModel, elementId)) {\r\n logElement(\"delete\", this._iModel, elementId, _scope);\r\n this._iModel.elements.deleteElement(elementId);\r\n }\r\n }\r\n\r\n /** Delete the element tree. */\r\n public deleteElementTree(): void {\r\n this.processElementTree(this._topElement, this._topScope); // Delete the \"normal\" elements and record the special elements for deferred processing\r\n this._special.deleteSpecialElements(this._iModel);\r\n }\r\n\r\n}\r\n\r\n/** Does a breadth-first search on the tree defined by an element and its sub-models and children.\r\n * Parents are visited first, then children, then sub-models.\r\n * The subclass can \"prune\" sub-trees from the search. When a sub-tree is \"pruned\" the search does *not* recurse into it.\r\n * If a sub-tree is not pruned, then the search does recurse into it.\r\n * @beta\r\n */\r\nabstract class ElementTreeTopDown {\r\n constructor(protected _iModel: IModelDb) { }\r\n\r\n /** Should the search *not* recurse into this sub-tree? */\r\n protected shouldPrune(_elementId: Id64String, _scope: ElementTreeWalkerScope): boolean { return false; }\r\n\r\n protected abstract prune(_elementId: Id64String, _scope: ElementTreeWalkerScope): void;\r\n\r\n protected processElementTree(element: Id64String, scope: ElementTreeWalkerScope) {\r\n\r\n if (this.shouldPrune(element, scope)) {\r\n this.prune(element, scope);\r\n return;\r\n }\r\n\r\n this._processChildren(element, scope);\r\n\r\n const subModel = this._iModel.models.tryGetModel<Model>(element);\r\n if (subModel !== undefined) {\r\n this._processSubModel(subModel, scope);\r\n }\r\n }\r\n\r\n private _processChildren(element: Id64String, scope: ElementTreeWalkerScope) {\r\n let parentScope: ElementTreeWalkerScope | undefined;\r\n for (const childElement of this._iModel.elements.queryChildren(element)) {\r\n if (parentScope === undefined)\r\n parentScope = new ElementTreeWalkerScope(scope, element);\r\n this.processElementTree(childElement, parentScope);\r\n }\r\n }\r\n\r\n private _processSubModel(subModel: Model, scope: ElementTreeWalkerScope) {\r\n const subModelScope = new ElementTreeWalkerScope(scope, subModel);\r\n // Visit only the top-level parents. processElementTree will recurse into their children.\r\n this._iModel.withPreparedStatement(`select ECInstanceId from bis:Element where Model.id=? and Parent.Id is null`, (stmt) => {\r\n stmt.bindId(1, subModel.id);\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n const elementId = stmt.getValue(0).getId();\r\n this.processElementTree(elementId, subModelScope);\r\n }\r\n });\r\n }\r\n\r\n}\r\n\r\n/** Signature of the filter function used by ElementSubTreeDeleter.\r\n * @param elementId The sub-tree parent element.\r\n * @param scope The path followed by the top-down search to the element\r\n * @return true if the element and its children and sub-models should be deleted.\r\n * @beta\r\n */\r\nexport type ElementSubTreeDeleteFilter = (elementId: Id64String, scope: ElementTreeWalkerScope) => boolean;\r\n\r\n/** Deletes the element sub-trees that are chosen by a supplied filter function.\r\n * This class uses ElementTreeTopDown to visit element sub-trees in top-down order.\r\n * When the filter function chooses a sub-tree, this class uses ElementTreeDeleter to delete it.\r\n * Note that when a sub-tree is selected and deleted, its children and sub-models are not visited.\r\n * @beta\r\n */\r\nexport class ElementSubTreeDeleter extends ElementTreeTopDown {\r\n private _special: SpecialElements = new SpecialElements();\r\n\r\n private _topElement: Id64String;\r\n private _topScope: ElementTreeWalkerScope;\r\n\r\n private _shouldPruneCb: ElementSubTreeDeleteFilter;\r\n\r\n /** Construct an ElementSubTreeDeleter. @see pruneElementTree.\r\n * @param iModel The iModel\r\n * @param topElement Where to start the search.\r\n * @param shouldPruneCb Callback that selects sub-trees that should be deleted.\r\n */\r\n public constructor(iModel: IModelDb, topElement: Id64String, shouldPruneCb: ElementSubTreeDeleteFilter, scope?: ElementTreeWalkerScope) {\r\n super(iModel);\r\n this._topElement = topElement;\r\n this._topScope = scope ?? ElementTreeWalkerScope.createTopScope(this._iModel, this._topElement);\r\n this._shouldPruneCb = shouldPruneCb;\r\n }\r\n\r\n protected override shouldPrune(elementId: Id64String, scope: ElementTreeWalkerScope): boolean { return this._shouldPruneCb(elementId, scope); }\r\n\r\n protected prune(elementId: Id64String, scope: ElementTreeWalkerScope): void {\r\n if (!this._special.recordSpecialElement(this._iModel, elementId)) {\r\n const del = new ElementTreeDeleter(this._iModel, elementId, scope);\r\n del.deleteElementTree();\r\n }\r\n }\r\n\r\n /** Traverses the tree of elements, beginning with the top element, and deletes all selected sub-trees. */\r\n public pruneElementTree() {\r\n this.processElementTree(this._topElement, this._topScope); // deletes normal elements and their sub-trees, defers special elements\r\n this._special.deleteSpecialElements(this._iModel);\r\n }\r\n}\r\n\r\n/** Deletes an element tree starting with the specified top element. The top element is also deleted. Uses ElementTreeDeleter.\r\n * @param iModel The iModel\r\n * @param topElement The parent of the sub-tree\r\n * @beta\r\n */\r\nexport function deleteElementTree(iModel: IModelDb, topElement: Id64String): void {\r\n const del = new ElementTreeDeleter(iModel, topElement);\r\n del.deleteElementTree();\r\n}\r\n\r\n/** Deletes all element sub-trees that are selected by the supplied filter. Uses ElementSubTreeDeleter.\r\n * If the filter selects the top element itself, then the entire tree (including the top element) is deleted.\r\n * That has the same effect as calling [[deleteElementTree]] on the top element.\r\n * @param iModel The iModel\r\n * @param topElement Where to start the search.\r\n * @param filter Callback that selects sub-trees that should be deleted.\r\n * @beta\r\n */\r\nexport function deleteElementSubTrees(iModel: IModelDb, topElement: Id64String, filter: ElementSubTreeDeleteFilter): void {\r\n const del = new ElementSubTreeDeleter(iModel, topElement, filter);\r\n del.pruneElementTree();\r\n}\r\n"]}
1
+ {"version":3,"file":"ElementTreeWalker.js","sourceRoot":"","sources":["../../src/ElementTreeWalker.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\nimport { assert, DbResult, Id64Array, Id64String, Logger, LogLevel } from \"@itwin/core-bentley\";\r\nimport { IModel } from \"@itwin/core-common\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { DefinitionElement, DefinitionPartition, Element, Subject } from \"./Element\";\r\nimport { IModelDb } from \"./IModelDb\";\r\nimport { DefinitionModel, Model } from \"./Model\";\r\n\r\nconst loggerCategory = `${BackendLoggerCategory.IModelDb}.ElementTreeWalker`;\r\n\r\n/** @beta */\r\nexport interface ElementTreeWalkerModelInfo { model: Model, isDefinitionModel: boolean }\r\n\r\nfunction sortChildrenBeforeParents(iModel: IModelDb, ids: Id64Array): Array<Id64Array> {\r\n const children: Id64Array = [];\r\n const parents: Id64Array = [];\r\n for (const eid of ids) {\r\n const parentId = iModel.elements.queryParent(eid);\r\n if (parentId !== undefined && ids.includes(parentId))\r\n children.push(eid);\r\n else\r\n parents.push(eid);\r\n }\r\n\r\n if (children.length === 0)\r\n return [parents];\r\n\r\n return [...sortChildrenBeforeParents(iModel, children), parents];\r\n}\r\n\r\nfunction isModelEmpty(iModel: IModelDb, modelId: Id64String): boolean {\r\n return iModel.withPreparedStatement(`select count(*) from ${Element.classFullName} where Model.Id = ?`, (stmt) => {\r\n stmt.bindId(1, modelId);\r\n stmt.step();\r\n return stmt.getValue(0).getInteger() === 0;\r\n });\r\n}\r\n\r\nfunction isDefinitionModel(model: Model): boolean {\r\n return (model.id !== IModel.repositoryModelId) && (model instanceof DefinitionModel);\r\n}\r\n\r\nenum ElementPruningClassification { PRUNING_CLASS_Normal = 0, PRUNING_CLASS_Subject = 1, PRUNING_CLASS_Definition = 2, PRUNING_CLASS_DefinitionPartition = 3, }\r\n\r\nfunction classifyElementForPruning(iModel: IModelDb, elementId: Id64String): ElementPruningClassification {\r\n const el = iModel.elements.getElement(elementId);\r\n return (el instanceof Subject) ? ElementPruningClassification.PRUNING_CLASS_Subject :\r\n (el instanceof DefinitionElement) ? ElementPruningClassification.PRUNING_CLASS_Definition :\r\n (el instanceof DefinitionPartition) ? ElementPruningClassification.PRUNING_CLASS_DefinitionPartition :\r\n ElementPruningClassification.PRUNING_CLASS_Normal;\r\n}\r\n\r\n/** Records the path that a tree search took to reach an element or model. This object is immutable.\r\n * @beta\r\n */\r\nexport class ElementTreeWalkerScope {\r\n public readonly topElement: Id64String = \"\";\r\n /** path of parent elements and enclosing models */\r\n public readonly path: Array<Id64String | ElementTreeWalkerModelInfo> = [];\r\n /** cached info about the immediately enclosing model (i.e., the last model in path) */\r\n public readonly enclosingModelInfo: ElementTreeWalkerModelInfo;\r\n\r\n constructor(topElement: Id64String, model: Model);\r\n constructor(enclosingScope: ElementTreeWalkerScope, newScope: Id64String | Model);\r\n constructor(arg1: Id64String | ElementTreeWalkerScope, arg2: Model | Id64String) {\r\n if (typeof arg1 === \"string\") {\r\n // normal constructor\r\n assert(arg2 instanceof Model);\r\n this.topElement = arg1;\r\n this.path.push(this.enclosingModelInfo = { model: arg2, isDefinitionModel: isDefinitionModel(arg2) });\r\n } else if (arg1 instanceof ElementTreeWalkerScope) {\r\n // copy-like constructor\r\n this.topElement = arg1.topElement;\r\n this.path = [...arg1.path];\r\n if (typeof arg2 === \"string\") {\r\n // with new parent\r\n this.path.push(arg2);\r\n this.enclosingModelInfo = arg1.enclosingModelInfo;\r\n } else {\r\n // with new enclosing model\r\n this.path.push(this.enclosingModelInfo = { model: arg2, isDefinitionModel: isDefinitionModel(arg2) });\r\n }\r\n } else {\r\n throw new Error(\"invalid constructor signature\");\r\n }\r\n }\r\n\r\n public get enclosingModel(): Model { return this.enclosingModelInfo.model; }\r\n public get inDefinitionModel(): boolean { return this.enclosingModelInfo.isDefinitionModel; } // NB: this will return false for the RepositoryModel!\r\n public get inRepositoryModel(): boolean { return this.enclosingModelInfo.model.id === IModelDb.repositoryModelId; }\r\n\r\n public static createTopScope(iModel: IModelDb, topElementId: Id64String) {\r\n const topElement = iModel.elements.getElement(topElementId);\r\n const topElementModel = iModel.models.getModel(topElement.model);\r\n return new ElementTreeWalkerScope(topElementId, topElementModel);\r\n }\r\n\r\n private fmtItem(v: Id64String | ElementTreeWalkerModelInfo): string {\r\n if (typeof v === \"string\")\r\n return `element ${v}`;\r\n return `model ${v.model.id} ${v.isDefinitionModel ? \"(DEFN)\" : \"\"}`;\r\n }\r\n\r\n public toString(): string {\r\n return `[ ${this.path.map((v) => this.fmtItem(v)).join(\" / \")} ]`;\r\n }\r\n}\r\n\r\nfunction fmtElement(iModel: IModelDb, elementId: Id64String): string {\r\n const el = iModel.elements.getElement(elementId);\r\n return `${el.id} ${el.classFullName} ${el.getDisplayLabel()}`;\r\n}\r\n\r\nfunction fmtModel(model: Model): string {\r\n return `${model.id} ${model.classFullName} ${model.name}`;\r\n}\r\n\r\nlet isTraceEnabledChecked = -1;\r\n\r\nfunction isTraceEnabled(): boolean {\r\n if (isTraceEnabledChecked === -1)\r\n isTraceEnabledChecked = Logger.isEnabled(loggerCategory, LogLevel.Trace) ? 1 : 0;\r\n return isTraceEnabledChecked === 1;\r\n}\r\n\r\nfunction logElement(op: string, iModel: IModelDb, elementId: Id64String, scope?: ElementTreeWalkerScope, logChildren?: boolean): void {\r\n if (!isTraceEnabled())\r\n return;\r\n\r\n Logger.logTrace(loggerCategory, `${op} ${fmtElement(iModel, elementId)} ${scope ? scope.toString() : \"\"}`);\r\n\r\n if (logChildren)\r\n iModel.elements.queryChildren(elementId).forEach((c) => logElement(\" - \", iModel, c, undefined, true));\r\n}\r\n\r\nfunction logModel(op: string, iModel: IModelDb, modelId: Id64String, scope?: ElementTreeWalkerScope, logElements?: boolean): void {\r\n if (!isTraceEnabled())\r\n return;\r\n const model: Model = iModel.models.getModel(modelId);\r\n Logger.logTrace(loggerCategory, `${op} ${fmtModel(model)} ${scope ? scope.toString() : \"\"}`);\r\n\r\n if (logElements) {\r\n iModel.withPreparedStatement(`select ecinstanceid from ${Element.classFullName} where Model.Id = ?`, (stmt) => {\r\n stmt.bindId(1, modelId);\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n logElement(\" - \", iModel, stmt.getValue(0).getId());\r\n }\r\n });\r\n }\r\n}\r\n\r\n/** Does a depth-first search on the tree defined by an element and its sub-models and children.\r\n * Sub-models are visited before their modeled elements, and children are visited before their parents.\r\n *\r\n * The following callbacks allow the subclass to exclude elements and sub-trees from the search:\r\n * * [[ElementTreeBottomUp.shouldExploreModel]], [[ElementTreeBottomUp.shouldExploreChildren]]\r\n * * [[ElementTreeBottomUp.shouldVisitElement]], [[ElementTreeBottomUp.shouldVisitModel]]\r\n *\r\n * The [[ElementTreeBottomUp.visitElement]] and [[ElementTreeBottomUp.visitModel]] callbacks allow\r\n * the subclass to process the elements and models that are encountered in the search.\r\n * @beta\r\n */\r\nexport abstract class ElementTreeBottomUp {\r\n constructor(protected _iModel: IModelDb) { }\r\n\r\n /** Return true if the search should recurse into this model */\r\n protected shouldExploreModel(_model: Model, _scope: ElementTreeWalkerScope): boolean { return true; }\r\n /** Return true if the search should recurse into the children (if any) of this element */\r\n protected shouldExploreChildren(_parentId: Id64String, _scope: ElementTreeWalkerScope): boolean { return true; }\r\n /** Return true if the search should visit this element */\r\n protected shouldVisitElement(_elementId: Id64String, _scope: ElementTreeWalkerScope): boolean { return true; }\r\n /** Return true if the search should visit this model */\r\n protected shouldVisitModel(_model: Model, _scope: ElementTreeWalkerScope): boolean { return true; }\r\n\r\n /** Called to visit a model */\r\n protected abstract visitModel(model: Model, scope: ElementTreeWalkerScope): void;\r\n\r\n /** Called to visit an element */\r\n protected abstract visitElement(elementId: Id64String, scope: ElementTreeWalkerScope): void;\r\n\r\n /** The main tree-walking function */\r\n protected processElementTree(element: Id64String, scope: ElementTreeWalkerScope) {\r\n const subModel = this._iModel.models.tryGetModel<Model>(element);\r\n if (subModel !== undefined) {\r\n if (this.shouldExploreModel(subModel, scope))\r\n this._processSubModel(subModel, scope);\r\n\r\n if (this.shouldVisitModel(subModel, scope))\r\n this.visitModel(subModel, scope);\r\n }\r\n\r\n if (this.shouldExploreChildren(element, scope))\r\n this._processChildren(element, scope);\r\n\r\n if (this.shouldVisitElement(element, scope))\r\n this.visitElement(element, scope);\r\n }\r\n\r\n /** process the children of the specified parent element */\r\n private _processChildren(parentElement: Id64String, parentScope: ElementTreeWalkerScope): void {\r\n const children = this._iModel.elements.queryChildren(parentElement);\r\n if (children.length === 0)\r\n return;\r\n\r\n const childrenScope = new ElementTreeWalkerScope(parentScope, parentElement);\r\n\r\n for (const childElement of children)\r\n this.processElementTree(childElement, childrenScope);\r\n }\r\n\r\n /** process the elements in the specified model */\r\n private _processSubModel(model: Model, parenScope: ElementTreeWalkerScope): void {\r\n const scope = new ElementTreeWalkerScope(parenScope, model);\r\n // Visit only the top-level parents. processElementTree will visit their children (bottom-up).\r\n model.iModel.withPreparedStatement(`select ECInstanceId from bis:Element where Model.id=? and Parent.Id is null`, (stmt) => {\r\n stmt.bindId(1, model.id);\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n const elementId = stmt.getValue(0).getId();\r\n this.processElementTree(elementId, scope);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/** Helper class that manages the deletion of definitions and subjects */\r\nclass SpecialElements {\r\n public definitionModels: Id64Array = [];\r\n public definitions: Id64Array = [];\r\n public subjects: Id64Array = [];\r\n\r\n public recordSpecialElement(iModel: IModelDb, elementId: Id64String): boolean {\r\n // Defer Definitions and Subjects\r\n const cls = classifyElementForPruning(iModel, elementId);\r\n if (cls === ElementPruningClassification.PRUNING_CLASS_Subject) {\r\n this.subjects.push(elementId);\r\n return true;\r\n } else if (cls === ElementPruningClassification.PRUNING_CLASS_Definition) {\r\n this.definitions.push(elementId);\r\n return true;\r\n } else if (cls === ElementPruningClassification.PRUNING_CLASS_DefinitionPartition) {\r\n this.definitionModels.push(elementId);\r\n return true;\r\n }\r\n return false; // not a special element\r\n }\r\n\r\n /** Delete special elements - This calls Elements.deleteDefinitionElements to process the collected definition elements as a group and then\r\n * calls Models.deleteModel on collected definition models. It then deletes all collected Subjects by calling Element.deleteElement on them.\r\n * @note Caller must ensure that the special elements were recorded in a depth-first search.\r\n */\r\n public deleteSpecialElements(iModel: IModelDb) {\r\n // It's dangerous to pass a mixture of SubCategories and Categories to deleteDefinitionElements.\r\n // That function will delete the Categories first, which automatically deletes all their child\r\n // SubCategories (in native code). If a SubCategory in the list is one of those children, then\r\n // deleteDefinitionElements will try and fail with an exception to delete that SubCategory in a subsequent step.\r\n // To work around this, we delete the SubCategories first, then everything else.\r\n // A similar problem occurs when you pass other kinds of elements to deleteDefinitionElements, where some are\r\n // children and others are parents. deleteDefinitionElements does not preserve the order that you specify,\r\n // and it does not process children before parents.\r\n for (const definitions of sortChildrenBeforeParents(iModel, this.definitions)) {\r\n if (isTraceEnabled()) definitions.forEach((e) => logElement(\"try delete\", iModel, e));\r\n iModel.elements.deleteDefinitionElements(definitions); // will not delete definitions that are still in use.\r\n }\r\n\r\n for (const m of this.definitionModels) {\r\n if (!isModelEmpty(iModel, m)) {\r\n logModel(\"Model not empty - cannot delete - may contain Definitions that are still in use\", iModel, m, undefined, true);\r\n } else {\r\n logModel(\"delete\", iModel, m);\r\n iModel.models.deleteModel(m);\r\n iModel.elements.deleteElement(m);\r\n }\r\n }\r\n\r\n for (const e of this.subjects) {\r\n if (iModel.elements.queryChildren(e).length !== 0) {\r\n logElement(\"Subject still has children - cannot delete - may have child DefinitionModels\", iModel, e, undefined, true);\r\n } else {\r\n logElement(\"delete\", iModel, e);\r\n iModel.elements.deleteElement(e);\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\n/** Deletes an entire element tree, including sub-models and child elements.\r\n * Items are deleted in bottom-up order. Definitions and Subjects are deleted after normal elements.\r\n * Call deleteNormalElements on each tree. Then call deleteSpecialElements.\r\n * @see deleteElementTree for a simple way to use this class.\r\n * @beta\r\n */\r\nexport class ElementTreeDeleter extends ElementTreeBottomUp {\r\n protected _special: SpecialElements = new SpecialElements();\r\n\r\n protected override shouldExploreModel(_model: Model): boolean { return true; }\r\n protected override shouldVisitElement(_elementId: Id64String): boolean { return true; }\r\n\r\n protected override visitModel(model: Model, _scope: ElementTreeWalkerScope): void {\r\n if (isDefinitionModel(model))\r\n return; // we recorded definition models in visitElement when we encountered the DefinitionPartition elements.\r\n\r\n // visitElement has already deleted the elements in the model. So, now it's safe to delete the model itself.\r\n logModel(\"delete\", this._iModel, model.id, _scope);\r\n model.delete();\r\n }\r\n\r\n protected override visitElement(elementId: Id64String, _scope: ElementTreeWalkerScope): void {\r\n if (!this._special.recordSpecialElement(this._iModel, elementId)) {\r\n logElement(\"delete\", this._iModel, elementId, _scope);\r\n this._iModel.elements.deleteElement(elementId);\r\n }\r\n }\r\n\r\n /**\r\n * Delete the \"normal\" elements and record the special elements for deferred processing.\r\n * @param topElement The parent of the sub-tree to be deleted. Top element itself is also deleted.\r\n * @param scope How the parent was found\r\n * @see deleteSpecialElements\r\n */\r\n public deleteNormalElements(topElement: Id64String, scope?: ElementTreeWalkerScope): void {\r\n const topScope = scope ?? ElementTreeWalkerScope.createTopScope(this._iModel, topElement);\r\n this.processElementTree(topElement, topScope); //\r\n }\r\n\r\n /** Delete all special elements that were found and deferred by deleteNormalElements. Call this\r\n * function once after all element trees are processed by deleteNormalElements.\r\n */\r\n public deleteSpecialElements(): void {\r\n this._special.deleteSpecialElements(this._iModel);\r\n }\r\n\r\n}\r\n\r\n/** Does a breadth-first search on the tree defined by an element and its sub-models and children.\r\n * Parents are visited first, then children, then sub-models.\r\n * The subclass can \"prune\" sub-trees from the search. When a sub-tree is \"pruned\" the search does *not* recurse into it.\r\n * If a sub-tree is not pruned, then the search does recurse into it.\r\n * @beta\r\n */\r\nabstract class ElementTreeTopDown {\r\n constructor(protected _iModel: IModelDb) { }\r\n\r\n /** Should the search *not* recurse into this sub-tree? */\r\n protected shouldPrune(_elementId: Id64String, _scope: ElementTreeWalkerScope): boolean { return false; }\r\n\r\n protected abstract prune(_elementId: Id64String, _scope: ElementTreeWalkerScope): void;\r\n\r\n protected processElementTree(element: Id64String, scope: ElementTreeWalkerScope) {\r\n\r\n if (this.shouldPrune(element, scope)) {\r\n this.prune(element, scope);\r\n return;\r\n }\r\n\r\n this._processChildren(element, scope);\r\n\r\n const subModel = this._iModel.models.tryGetModel<Model>(element);\r\n if (subModel !== undefined) {\r\n this._processSubModel(subModel, scope);\r\n }\r\n }\r\n\r\n private _processChildren(element: Id64String, scope: ElementTreeWalkerScope) {\r\n let parentScope: ElementTreeWalkerScope | undefined;\r\n for (const childElement of this._iModel.elements.queryChildren(element)) {\r\n if (parentScope === undefined)\r\n parentScope = new ElementTreeWalkerScope(scope, element);\r\n this.processElementTree(childElement, parentScope);\r\n }\r\n }\r\n\r\n private _processSubModel(subModel: Model, scope: ElementTreeWalkerScope) {\r\n const subModelScope = new ElementTreeWalkerScope(scope, subModel);\r\n // Visit only the top-level parents. processElementTree will recurse into their children.\r\n this._iModel.withPreparedStatement(`select ECInstanceId from bis:Element where Model.id=? and Parent.Id is null`, (stmt) => {\r\n stmt.bindId(1, subModel.id);\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n const elementId = stmt.getValue(0).getId();\r\n this.processElementTree(elementId, subModelScope);\r\n }\r\n });\r\n }\r\n\r\n}\r\n\r\n/** Signature of the filter function used by ElementSubTreeDeleter.\r\n * @param elementId The sub-tree parent element.\r\n * @param scope The path followed by the top-down search to the element\r\n * @return true if the element and its children and sub-models should be deleted.\r\n * @beta\r\n */\r\nexport type ElementSubTreeDeleteFilter = (elementId: Id64String, scope: ElementTreeWalkerScope) => boolean;\r\n\r\n/** Performs a breadth-first search to visit elements in top-down order.\r\n * When the supplied filter function chooses an element, ElementTreeDeleter is used to delete it and its sub-tree.\r\n * @beta\r\n */\r\nexport class ElementSubTreeDeleter extends ElementTreeTopDown {\r\n private _treeDeleter: ElementTreeDeleter;\r\n private _shouldPruneCb: ElementSubTreeDeleteFilter;\r\n\r\n /** Construct an ElementSubTreeDeleter.\r\n * @param iModel The iModel\r\n * @param topElement Where to start the search.\r\n * @param shouldPruneCb Callback that selects sub-trees that should be deleted.\r\n * @see deleteElementSubTrees for a simple way to use this class.\r\n */\r\n public constructor(iModel: IModelDb, shouldPruneCb: ElementSubTreeDeleteFilter) {\r\n super(iModel);\r\n this._treeDeleter = new ElementTreeDeleter(this._iModel);\r\n this._shouldPruneCb = shouldPruneCb;\r\n }\r\n\r\n protected override shouldPrune(elementId: Id64String, scope: ElementTreeWalkerScope): boolean { return this._shouldPruneCb(elementId, scope); }\r\n\r\n protected prune(elementId: Id64String, scope: ElementTreeWalkerScope): void {\r\n this._treeDeleter.deleteNormalElements(elementId, scope);\r\n }\r\n\r\n /** Traverses the tree of elements beginning with the top element, and deletes all selected sub-trees.\r\n * Normal elements are deleted. Any special elements that are encountered are deferred.\r\n * Call deleteSpecialElementSubTrees after all top elements have been processed. */\r\n public deleteNormalElementSubTrees(topElement: Id64String, scope?: ElementTreeWalkerScope) {\r\n const topScope = scope ?? ElementTreeWalkerScope.createTopScope(this._iModel, topElement);\r\n this.processElementTree(topElement, topScope); // deletes normal elements and their sub-trees, defers special elements\r\n }\r\n\r\n /** Delete all special elements and their sub-trees that were found in the course of processing.\r\n * The sub-trees were already expanded by ElementTreeDeleter.deleteNormalElements.\r\n */\r\n public deleteSpecialElementSubTrees() {\r\n this._treeDeleter.deleteSpecialElements();\r\n }\r\n}\r\n\r\n/** Deletes an element tree starting with the specified top element. The top element is also deleted. Uses ElementTreeDeleter.\r\n * @param iModel The iModel\r\n * @param topElement The parent of the sub-tree\r\n * @beta\r\n */\r\nexport function deleteElementTree(iModel: IModelDb, topElement: Id64String): void {\r\n const del = new ElementTreeDeleter(iModel);\r\n del.deleteNormalElements(topElement);\r\n del.deleteSpecialElements();\r\n}\r\n\r\n/** Deletes all element sub-trees that are selected by the supplied filter. Uses ElementSubTreeDeleter.\r\n * If the filter selects the top element itself, then the entire tree (including the top element) is deleted.\r\n * That has the same effect as calling [[deleteElementTree]] on the top element.\r\n * @param iModel The iModel\r\n * @param topElement Where to start the search.\r\n * @param filter Callback that selects sub-trees that should be deleted.\r\n * @beta\r\n */\r\nexport function deleteElementSubTrees(iModel: IModelDb, topElement: Id64String, filter: ElementSubTreeDeleteFilter): void {\r\n const del = new ElementSubTreeDeleter(iModel, filter);\r\n del.deleteNormalElementSubTrees(topElement);\r\n del.deleteSpecialElementSubTrees();\r\n}\r\n"]}
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { Id64Array, Id64String } from "@itwin/core-bentley";
5
5
  import { IndexedPolyface, Polyface, PolyfaceData, PolyfaceVisitor } from "@itwin/core-geometry";
6
- import { GeometryClass } from "@itwin/core-common";
6
+ import { ColorDefProps, GeometryClass } from "@itwin/core-common";
7
7
  /** A collection of line segments, suitable for direct use with graphics APIs.
8
8
  * The structure of this data matches GL_LINES in OpenGL.
9
9
  * See [IModelDb.exportGraphics]($core-backend)
@@ -24,8 +24,8 @@ export interface ExportLinesInfo {
24
24
  elementId: Id64String;
25
25
  /** ID for the [SubCategory]($core-backend) for these graphics */
26
26
  subCategory: Id64String;
27
- /** The color and transparency for these graphics, laid out in TBGR format, see [ColorDef]($core-common) */
28
- color: number;
27
+ /** The color and transparency for these graphics */
28
+ color: ColorDefProps;
29
29
  /** GeometryClass for these graphics */
30
30
  geometryClass: GeometryClass;
31
31
  /** The linework for these graphics */
@@ -61,8 +61,8 @@ export interface ExportGraphicsInfo {
61
61
  elementId: Id64String;
62
62
  /** ID for the [SubCategory]($core-backend) for these graphics */
63
63
  subCategory: Id64String;
64
- /** The color and transparency for these graphics, laid out in TBGR format, see [ColorDef]($core-common) */
65
- color: number;
64
+ /** The color and transparency for these graphics */
65
+ color: ColorDefProps;
66
66
  /** GeometryClass for these graphics */
67
67
  geometryClass: GeometryClass;
68
68
  /** If defined, ID for the [RenderMaterialElement]($core-backend) for these graphics */
@@ -164,8 +164,8 @@ export interface ExportGraphicsOptions {
164
164
  * @public
165
165
  */
166
166
  export interface ExportPartInfo {
167
- /** The color and transparency for these graphics, laid out in TBGR format, see [ColorDef]($core-common) */
168
- color: number;
167
+ /** The color and transparency for these graphics */
168
+ color: ColorDefProps;
169
169
  /** GeometryClass for these graphics */
170
170
  geometryClass: GeometryClass;
171
171
  /** If defined, ID for the [RenderMaterialElement]($core-backend) for these graphics */
@@ -185,8 +185,8 @@ export declare type ExportPartFunction = (info: ExportPartInfo) => void;
185
185
  * @public
186
186
  */
187
187
  export interface ExportPartLinesInfo {
188
- /** The color and transparency for these graphics, laid out in TBGR format, see [ColorDef]($core-common) */
189
- color: number;
188
+ /** The color and transparency for these graphics */
189
+ color: ColorDefProps;
190
190
  /** GeometryClass for these graphics */
191
191
  geometryClass: GeometryClass;
192
192
  /** The linework for these graphics */
@@ -1 +1 @@
1
- {"version":3,"file":"ExportGraphics.d.ts","sourceRoot":"","sources":["../../src/ExportGraphics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExportGraphics.d.ts","sourceRoot":"","sources":["../../src/ExportGraphics.ts"],"names":[],"mappings":"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"}