@inweb/viewer-visualize 27.9.1 → 27.11.0

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 (89) hide show
  1. package/dist/viewer-visualize.js +573 -236
  2. package/dist/viewer-visualize.js.map +1 -1
  3. package/dist/viewer-visualize.min.js +1 -1
  4. package/dist/viewer-visualize.module.js +458 -236
  5. package/dist/viewer-visualize.module.js.map +1 -1
  6. package/lib/Viewer/Commands/ClearSelected.d.ts +1 -1
  7. package/lib/Viewer/Commands/Deselect.d.ts +2 -0
  8. package/lib/Viewer/Commands/Explode.d.ts +1 -1
  9. package/lib/Viewer/Commands/GetHidden.d.ts +2 -0
  10. package/lib/Viewer/Commands/GetIsolated.d.ts +2 -0
  11. package/lib/Viewer/Commands/GetSelected.d.ts +2 -2
  12. package/lib/Viewer/Commands/GetSelected2.d.ts +1 -1
  13. package/lib/Viewer/Commands/Hide.d.ts +2 -0
  14. package/lib/Viewer/Commands/HideAll.d.ts +2 -0
  15. package/lib/Viewer/Commands/HideSelected.d.ts +1 -1
  16. package/lib/Viewer/Commands/Isolate.d.ts +2 -0
  17. package/lib/Viewer/Commands/IsolateSelected.d.ts +1 -1
  18. package/lib/Viewer/Commands/RegenerateAll.d.ts +1 -1
  19. package/lib/Viewer/Commands/ResetView.d.ts +1 -1
  20. package/lib/Viewer/Commands/Select.d.ts +2 -0
  21. package/lib/Viewer/Commands/SelectModel.d.ts +1 -1
  22. package/lib/Viewer/Commands/SetSelected.d.ts +2 -2
  23. package/lib/Viewer/Commands/SetSelected2.d.ts +2 -2
  24. package/lib/Viewer/Commands/Show.d.ts +2 -0
  25. package/lib/Viewer/Commands/ShowAll.d.ts +1 -1
  26. package/lib/Viewer/Commands/ToHandles.d.ts +2 -0
  27. package/lib/Viewer/Commands/ToHandles2.d.ts +2 -0
  28. package/lib/Viewer/Commands/ToggleSelection.d.ts +2 -0
  29. package/lib/Viewer/Commands/ZoomExtents.d.ts +2 -0
  30. package/lib/Viewer/Commands/ZoomTo.d.ts +2 -0
  31. package/lib/Viewer/Commands/ZoomToSelected.d.ts +1 -1
  32. package/lib/Viewer/Components/index.d.ts +1 -1
  33. package/lib/Viewer/Draggers/index.d.ts +2 -2
  34. package/lib/Viewer/Loaders/VSFCloudLoader.d.ts +2 -2
  35. package/lib/Viewer/Loaders/VSFXCloudLoader.d.ts +2 -2
  36. package/lib/Viewer/Loaders/VSFXCloudPartialLoader.d.ts +2 -2
  37. package/lib/Viewer/Loaders/VSFXCloudStreamingLoader.d.ts +2 -2
  38. package/lib/Viewer/Loaders/index.d.ts +4 -2
  39. package/lib/Viewer/Models/ModelImpl.d.ts +15 -1
  40. package/lib/Viewer/Models/ModelImpl.types.d.ts +10 -0
  41. package/lib/Viewer/Viewer.d.ts +19 -4
  42. package/package.json +6 -6
  43. package/src/Viewer/Commands/ClearSelected.ts +4 -8
  44. package/src/Viewer/Commands/Deselect.ts +35 -0
  45. package/src/Viewer/Commands/Explode.ts +4 -6
  46. package/src/Viewer/Commands/GetHidden.ts +30 -0
  47. package/src/Viewer/Commands/GetIsolated.ts +30 -0
  48. package/src/Viewer/Commands/GetModels.ts +2 -3
  49. package/src/Viewer/Commands/GetSelected.ts +5 -30
  50. package/src/Viewer/Commands/GetSelected2.ts +5 -7
  51. package/src/Viewer/Commands/Hide.ts +35 -0
  52. package/src/Viewer/Commands/HideAll.ts +32 -0
  53. package/src/Viewer/Commands/HideSelected.ts +2 -11
  54. package/src/Viewer/Commands/Isolate.ts +41 -0
  55. package/src/Viewer/Commands/IsolateSelected.ts +2 -8
  56. package/src/Viewer/Commands/RegenerateAll.ts +2 -3
  57. package/src/Viewer/Commands/ResetView.ts +2 -4
  58. package/src/Viewer/Commands/Select.ts +36 -0
  59. package/src/Viewer/Commands/SelectModel.ts +11 -14
  60. package/src/Viewer/Commands/SetSelected.ts +8 -19
  61. package/src/Viewer/Commands/SetSelected2.ts +6 -14
  62. package/src/Viewer/Commands/Show.ts +34 -0
  63. package/src/Viewer/Commands/ShowAll.ts +3 -6
  64. package/src/Viewer/Commands/ToHandles.ts +35 -0
  65. package/src/Viewer/Commands/ToHandles2.ts +36 -0
  66. package/src/Viewer/Commands/ToggleSelection.ts +40 -0
  67. package/src/Viewer/Commands/{ZoomToExtents.ts → ZoomExtents.ts} +2 -8
  68. package/src/Viewer/Commands/{ZoomToObjects.ts → ZoomTo.ts} +8 -13
  69. package/src/Viewer/Commands/ZoomToSelected.ts +3 -11
  70. package/src/Viewer/Commands/index.ts +29 -8
  71. package/src/Viewer/Components/index.ts +1 -1
  72. package/src/Viewer/Draggers/Actions/OrbitAction.ts +21 -14
  73. package/src/Viewer/Draggers/Common/OdBaseDragger.ts +32 -32
  74. package/src/Viewer/Draggers/OdZoomWheelDragger.ts +2 -2
  75. package/src/Viewer/Draggers/OrbitAroundBuildingDragger.ts +14 -10
  76. package/src/Viewer/Draggers/index.ts +2 -2
  77. package/src/Viewer/Loaders/VSFCloudLoader.ts +5 -4
  78. package/src/Viewer/Loaders/VSFFileLoader.ts +2 -1
  79. package/src/Viewer/Loaders/VSFXCloudLoader.ts +5 -4
  80. package/src/Viewer/Loaders/VSFXCloudPartialLoader.ts +5 -4
  81. package/src/Viewer/Loaders/VSFXCloudStreamingLoader.ts +5 -4
  82. package/src/Viewer/Loaders/VSFXFileLoader.ts +2 -1
  83. package/src/Viewer/Loaders/index.ts +4 -2
  84. package/src/Viewer/Models/ModelImpl.ts +150 -3
  85. package/src/Viewer/Models/{IModelImpl.ts → ModelImpl.types.ts} +9 -1
  86. package/src/Viewer/Viewer.ts +121 -19
  87. package/lib/Viewer/Commands/ZoomToExtents.d.ts +0 -2
  88. package/lib/Viewer/Commands/ZoomToObjects.d.ts +0 -2
  89. package/lib/Viewer/Models/IModelImpl.d.ts +0 -5
@@ -21,7 +21,7 @@
21
21
  // acknowledge and accept the above terms.
22
22
  ///////////////////////////////////////////////////////////////////////////////
23
23
 
24
- import { draggersRegistry, commandsRegistry, componentsRegistry, Loader, loadersRegistry, Options, Info, CANVAS_EVENTS } from '@inweb/viewer-core';
24
+ import { draggersRegistry, commandsRegistry, componentsRegistry, Loader, loadersRegistry, Options, Info, CANVAS_EVENTS, Selector, VisibilityManager } from '@inweb/viewer-core';
25
25
  export * from '@inweb/viewer-core';
26
26
  import { EventEmitter2 } from '@inweb/eventemitter2';
27
27
  import { Markup } from '@inweb/markup';
@@ -156,21 +156,21 @@ class OdBaseDragger extends OdaGeAction {
156
156
  this.pointermove = this.pointermove.bind(this);
157
157
  this.click = this.click.bind(this);
158
158
  this.dblclick = this.dblclick.bind(this);
159
- this.subject.addEventListener("pointerdown", this.pointerdown);
160
- this.subject.addEventListener("pointerup", this.pointerup);
161
- this.subject.addEventListener("pointercancel", this.pointercancel);
162
- this.subject.addEventListener("pointermove", this.pointermove);
163
- this.subject.addEventListener("click", this.click);
164
- this.subject.addEventListener("dblclick", this.dblclick);
159
+ this.subject.canvas.addEventListener("pointerdown", this.pointerdown);
160
+ this.subject.canvas.addEventListener("pointerup", this.pointerup);
161
+ this.subject.canvas.addEventListener("pointercancel", this.pointercancel);
162
+ this.subject.canvas.addEventListener("pointermove", this.pointermove);
163
+ this.subject.canvas.addEventListener("click", this.click);
164
+ this.subject.canvas.addEventListener("dblclick", this.dblclick);
165
165
  this.getViewer().setEnableAutoSelect(false);
166
166
  }
167
167
  dispose() {
168
- this.subject.removeEventListener("pointerdown", this.pointerdown);
169
- this.subject.removeEventListener("pointerup", this.pointerup);
170
- this.subject.removeEventListener("pointercancel", this.pointercancel);
171
- this.subject.removeEventListener("pointermove", this.pointermove);
172
- this.subject.removeEventListener("click", this.click);
173
- this.subject.removeEventListener("dblclick", this.dblclick);
168
+ this.subject.canvas.removeEventListener("pointerdown", this.pointerdown);
169
+ this.subject.canvas.removeEventListener("pointerup", this.pointerup);
170
+ this.subject.canvas.removeEventListener("pointercancel", this.pointercancel);
171
+ this.subject.canvas.removeEventListener("pointermove", this.pointermove);
172
+ this.subject.canvas.removeEventListener("click", this.click);
173
+ this.subject.canvas.removeEventListener("dblclick", this.dblclick);
174
174
  }
175
175
  relativeCoords(event) {
176
176
  return { x: event.offsetX * window.devicePixelRatio, y: event.offsetY * window.devicePixelRatio };
@@ -216,25 +216,37 @@ class OdBaseDragger extends OdaGeAction {
216
216
  }
217
217
  }
218
218
  click(ev) {
219
- const viewer = this.getViewer();
220
219
  const relCoord = this.relativeCoords(ev);
221
220
  const x = relCoord.x;
222
221
  const y = relCoord.y;
223
222
  const isNotDragging = Math.abs(x - this.mouseDownPosition.x) < CLICK_DELTA && Math.abs(y - this.mouseDownPosition.y) < CLICK_DELTA;
224
223
  if (this.autoSelect && isNotDragging) {
225
- viewer.unselect();
226
- viewer.select(x, y, x, y);
227
- this.subject.update();
228
- const selectionSet = viewer.getSelected();
229
- this.subject.emitEvent({ type: "select", data: selectionSet, handles: this.subject.getSelected() });
230
- this.subject.emitEvent({ type: "select2", data: selectionSet, handles: this.subject.getSelected2() });
224
+ const viewer = this.getViewer();
225
+ const view = viewer.activeView;
226
+ const model = viewer.getActiveModel();
227
+ const opt = new this.m_module.OdTvSelectionOptions();
228
+ opt.setMode(this.m_module.SelectionMode.kPoint);
229
+ const selectionSet = view.select([x, y], opt, model);
230
+ const handles = this.subject.models[0].getHandlesBySelectionSet(selectionSet);
231
+ selectionSet.delete();
232
+ opt.delete();
233
+ if (handles.length > 0) {
234
+ if (!ev.shiftKey)
235
+ this.subject.setSelected(handles);
236
+ else
237
+ this.subject.toggleSelection(handles);
238
+ }
239
+ else {
240
+ if (!ev.shiftKey)
241
+ this.subject.clearSelected();
242
+ }
231
243
  }
232
244
  }
233
245
  dblclick(ev) {
234
- const viewer = this.getViewer();
235
246
  const relCoord = this.relativeCoords(ev);
236
247
  const x = relCoord.x;
237
248
  const y = relCoord.y;
249
+ const viewer = this.getViewer();
238
250
  const device = viewer.getActiveDevice();
239
251
  const clickView = device.viewAt([x, y]);
240
252
  if (clickView && !clickView.active) {
@@ -243,15 +255,7 @@ class OdBaseDragger extends OdaGeAction {
243
255
  this.subject.update();
244
256
  }
245
257
  else if (this.autoSelect) {
246
- const pSelected = viewer.getSelected();
247
- if (!pSelected.isNull() && pSelected.numItems() !== 0) {
248
- const itr = pSelected.getIterator();
249
- const entity = itr.getEntity();
250
- viewer.zoomToEntity(entity);
251
- this.subject.emitEvent({ type: "zoomtoentity", data: entity });
252
- this.subject.update();
253
- this.deleteAll([itr, entity]);
254
- }
258
+ this.subject.zoomToSelected();
255
259
  }
256
260
  device.delete();
257
261
  }
@@ -1865,27 +1869,29 @@ class OrbitAction {
1865
1869
  }
1866
1870
  }
1867
1871
  getCenter() {
1872
+ const handles = this._subject.getSelected();
1873
+ const selectionSet = this._subject.models[0].getSelectionSetByHandles(handles);
1868
1874
  const viewer = this.getViewer();
1869
1875
  let center;
1870
- const pSet = viewer.getSelected();
1871
- if (!pSet.isNull() && pSet.numItems() !== 0) {
1872
- const itr = pSet.getIterator();
1873
- let ext, entId, extSelected;
1874
- for (; !itr.done(); itr.step()) {
1875
- entId = itr.getEntity();
1876
- ext = entId.getWCSExtents();
1876
+ if (selectionSet.numItems() > 0) {
1877
+ let extSelected;
1878
+ const itemItr = selectionSet.getIterator();
1879
+ while (!itemItr.done()) {
1880
+ const entityId = itemItr.getEntity();
1881
+ const entityExt = entityId.getWCSExtents();
1877
1882
  if (extSelected)
1878
- extSelected.addExt(ext);
1883
+ extSelected.addExt(entityExt);
1879
1884
  else
1880
- extSelected = ext;
1885
+ extSelected = entityExt;
1886
+ itemItr.step();
1881
1887
  }
1888
+ itemItr.delete();
1882
1889
  center = extSelected.center();
1883
- extSelected.delete();
1884
- itr.delete();
1885
1890
  }
1886
1891
  else {
1887
1892
  center = viewer.getActiveExtents().center();
1888
1893
  }
1894
+ selectionSet.delete();
1889
1895
  return center;
1890
1896
  }
1891
1897
  getViewer() {
@@ -2064,14 +2070,14 @@ class OdZoomWheelDragger extends OdBaseDragger {
2064
2070
  constructor(subject) {
2065
2071
  super(subject);
2066
2072
  this.wheel = this.wheel.bind(this);
2067
- this.subject.addEventListener("wheel", this.wheel);
2073
+ this.subject.canvas.addEventListener("wheel", this.wheel);
2068
2074
  this._zoomAction = new ZoomAction(this.m_module, this.subject);
2069
2075
  this._endInteractivityTimeOutId = undefined;
2070
2076
  this._isEnableInteractivityMode = false;
2071
2077
  }
2072
2078
  dispose() {
2073
2079
  super.dispose();
2074
- this.subject.removeEventListener("wheel", this.wheel);
2080
+ this.subject.canvas.removeEventListener("wheel", this.wheel);
2075
2081
  if (this._endInteractivityTimeOutId) {
2076
2082
  clearTimeout(this._endInteractivityTimeOutId);
2077
2083
  this.endInteractivity();
@@ -2302,28 +2308,31 @@ class OrbitAroundBuildingDragger extends OdBaseDragger {
2302
2308
  this.endInteractivity();
2303
2309
  }
2304
2310
  getCenter() {
2311
+ const handles = this.subject.getSelected();
2312
+ const selectionSet = this.subject.models[0].getSelectionSetByHandles(handles);
2305
2313
  const viewer = this.getViewer();
2306
2314
  let ext = viewer.getActiveExtents();
2307
- const pSet = viewer.getSelected();
2308
- if (!pSet.isNull() && pSet.numItems() !== 0) {
2309
- const itr = pSet.getIterator();
2310
- const entId = itr.getEntity();
2311
- if (entId.getType() === 1) {
2312
- const obj = entId.openObject();
2315
+ if (selectionSet.numItems() > 0) {
2316
+ const itemItr = selectionSet.getIterator();
2317
+ const entityId = itemItr.getEntity();
2318
+ const type = entityId.getType();
2319
+ if (type === this.m_module.OdTvEntityType.kEntity.value) {
2320
+ const obj = entityId.openObject();
2313
2321
  ext.delete();
2314
2322
  ext = obj.getExtents();
2315
2323
  obj.delete();
2316
2324
  }
2317
- else if (entId.getType() === 2) {
2318
- const obj = entId.openObjectAsInsert();
2325
+ else if (type === this.m_module.OdTvEntityType.kInsert.value) {
2326
+ const obj = entityId.openObjectAsInsert();
2319
2327
  const extTuple = obj.getExtents();
2320
2328
  ext.delete();
2321
2329
  ext = extTuple.ext;
2322
2330
  extTuple.delete();
2323
2331
  obj.delete();
2324
2332
  }
2325
- itr.delete();
2333
+ itemItr.delete();
2326
2334
  }
2335
+ selectionSet.delete();
2327
2336
  const center = ext.center();
2328
2337
  ext.delete();
2329
2338
  return center;
@@ -2506,38 +2515,40 @@ function clearMarkup(viewer) {
2506
2515
  }
2507
2516
 
2508
2517
  function clearSelected(viewer) {
2509
- if (!viewer.visualizeJs)
2510
- return;
2511
- const visViewer = viewer.visViewer();
2512
- visViewer.unselect();
2518
+ viewer.selector.clearSelected();
2519
+ viewer.emitEvent({ type: "select" });
2520
+ viewer.emitEvent({ type: "select2" });
2513
2521
  viewer.update();
2514
- viewer.emitEvent({ type: "select", handles: [] });
2515
- viewer.emitEvent({ type: "select2", handles: [] });
2516
2522
  }
2517
2523
 
2518
2524
  function clearSlices(viewer) {
2519
2525
  viewer.clearSlices();
2520
2526
  }
2521
2527
 
2522
- function getSnapshot(viewer, type, quality) {
2523
- var _a, _b, _c;
2524
- if (!viewer.visualizeJs)
2525
- return "";
2526
- const mimeType = (_a = type !== null && type !== void 0 ? type : viewer.options.snapshotMimeType) !== null && _a !== void 0 ? _a : "image/jpeg";
2527
- const imageQuality = (_b = quality !== null && quality !== void 0 ? quality : viewer.options.snapshotQuality) !== null && _b !== void 0 ? _b : 0.25;
2528
- if (viewer.markup) {
2529
- return viewer.markup.getSnapshot(mimeType, imageQuality);
2530
- }
2531
- return ((_c = viewer.canvas) === null || _c === void 0 ? void 0 : _c.toDataURL(mimeType, imageQuality)) || "";
2528
+ function toHandles(viewer, handles2) {
2529
+ if (!Array.isArray(handles2))
2530
+ handles2 = [handles2];
2531
+ if (handles2.length === 0)
2532
+ return handles2;
2533
+ if (!handles2[0].includes(":"))
2534
+ return handles2;
2535
+ const handles = handles2.map((handle) => handle.slice(handle.indexOf(":") + 1));
2536
+ return handles;
2532
2537
  }
2533
2538
 
2534
- function explode(viewer, index = 0) {
2535
- if (!viewer.visualizeJs)
2536
- return;
2537
- const visViewer = viewer.visViewer();
2538
- visViewer.explode(index);
2539
+ function deselect(viewer, handles = []) {
2540
+ handles = toHandles(viewer, handles);
2541
+ viewer.selector.deselect(handles);
2542
+ viewer.emitEvent({ type: "select" });
2543
+ viewer.emitEvent({ type: "select2" });
2544
+ viewer.update();
2545
+ }
2546
+
2547
+ function explode(viewer, scale = 0) {
2548
+ viewer.models.forEach((model) => model.explode(scale));
2549
+ viewer.explodeScale = scale;
2539
2550
  viewer.update();
2540
- viewer.emitEvent({ type: "explode", data: index });
2551
+ viewer.emitEvent({ type: "explode", data: scale });
2541
2552
  }
2542
2553
  function collect(viewer) {
2543
2554
  explode(viewer, 0);
@@ -2551,78 +2562,102 @@ function getDefaultViewPositions(viewer) {
2551
2562
  return Object.keys(defViewPos).filter((x) => x !== "values");
2552
2563
  }
2553
2564
 
2565
+ function toHandles2(viewer, handles) {
2566
+ if (!Array.isArray(handles))
2567
+ handles = [handles];
2568
+ if (handles.length === 0)
2569
+ return handles;
2570
+ if (handles[0].includes(":"))
2571
+ return handles;
2572
+ const model = viewer.models[0];
2573
+ const handles2 = handles.map((handle) => `${model.id}:${handle}`);
2574
+ return handles2;
2575
+ }
2576
+
2577
+ function getHidden(viewer, multimodel = false) {
2578
+ const handles = Array.from(viewer.visibilityManager.hidden);
2579
+ return multimodel ? toHandles2(viewer, handles) : handles;
2580
+ }
2581
+
2582
+ function getIsolated(viewer, multimodel = false) {
2583
+ const handles = Array.from(viewer.visibilityManager.isolated);
2584
+ return multimodel ? toHandles2(viewer, handles) : handles;
2585
+ }
2586
+
2554
2587
  function getModels(viewer) {
2555
- if (!viewer.visualizeJs)
2556
- return [];
2557
2588
  const visViewer = viewer.visViewer();
2558
2589
  const handles = [];
2559
2590
  const modelItr = visViewer.getModelIterator();
2560
- for (; !modelItr.done(); modelItr.step()) {
2591
+ while (!modelItr.done()) {
2561
2592
  const modelPtr = modelItr.getModel();
2562
2593
  if (modelPtr.getName()[0] !== "$")
2563
2594
  handles.push(modelPtr.getDatabaseHandle());
2595
+ modelItr.step();
2564
2596
  }
2565
2597
  modelItr.delete();
2566
2598
  return handles;
2567
2599
  }
2568
2600
 
2569
- function getSelected(viewer) {
2570
- if (!viewer.visualizeJs)
2571
- return [];
2572
- const visViewer = viewer.visViewer();
2573
- const handles = [];
2574
- const selectionSet = visViewer.getSelected();
2575
- if (!selectionSet.isNull() && selectionSet.numItems() !== 0) {
2576
- const itr = selectionSet.getIterator();
2577
- for (; !itr.done(); itr.step()) {
2578
- const entityId = itr.getEntity();
2579
- const entityPtr = entityId.getType() === 1
2580
- ? entityId.openObject()
2581
- : entityId.getType() === 2
2582
- ? entityId.openObjectAsInsert()
2583
- : null;
2584
- if (entityPtr) {
2585
- const handle = entityPtr.getNativeDatabaseHandle();
2586
- if (handle !== "-1")
2587
- handles.push(handle);
2588
- entityPtr.delete();
2589
- }
2590
- }
2591
- itr.delete();
2592
- }
2593
- return handles;
2601
+ function getSelected(viewer, multimodel = false) {
2602
+ const handles = Array.from(viewer.selector.selected);
2603
+ return multimodel ? toHandles2(viewer, handles) : handles;
2594
2604
  }
2595
2605
 
2596
2606
  function getSelected2(viewer) {
2597
- const handles = viewer.executeCommand("getSelected");
2598
- const model = viewer.models[0];
2599
- const handles2 = handles.map((handle) => `${model.id}:${handle}`);
2600
- return handles2;
2607
+ console.warn("getSelected2 command has been deprecated since 27.11 and will be removed in a future release, use getSelected instead");
2608
+ return viewer.executeCommand("getSelected", true);
2601
2609
  }
2602
2610
 
2603
- function hideSelected(viewer) {
2611
+ function getSnapshot(viewer, type, quality) {
2612
+ var _a, _b, _c;
2604
2613
  if (!viewer.visualizeJs)
2605
- return;
2606
- const visViewer = viewer.visViewer();
2607
- visViewer.hideSelectedObjects(false);
2608
- viewer.update();
2614
+ return "";
2615
+ const mimeType = (_a = type !== null && type !== void 0 ? type : viewer.options.snapshotMimeType) !== null && _a !== void 0 ? _a : "image/jpeg";
2616
+ const imageQuality = (_b = quality !== null && quality !== void 0 ? quality : viewer.options.snapshotQuality) !== null && _b !== void 0 ? _b : 0.25;
2617
+ if (viewer.markup) {
2618
+ return viewer.markup.getSnapshot(mimeType, imageQuality);
2619
+ }
2620
+ return ((_c = viewer.canvas) === null || _c === void 0 ? void 0 : _c.toDataURL(mimeType, imageQuality)) || "";
2621
+ }
2622
+
2623
+ function hide(viewer, handles) {
2624
+ handles = toHandles(viewer, handles);
2625
+ viewer.deselect(handles);
2626
+ viewer.visibilityManager.hide(handles);
2609
2627
  viewer.emitEvent({ type: "hide" });
2610
- viewer.emitEvent({ type: "select", handles: [] });
2611
- viewer.emitEvent({ type: "select2", handles: [] });
2628
+ viewer.update();
2612
2629
  }
2613
2630
 
2614
- function isolateSelected(viewer) {
2615
- if (!viewer.visualizeJs)
2616
- return;
2617
- const visViewer = viewer.visViewer();
2618
- visViewer.isolateSelectedObjects(false);
2631
+ function hideAll(viewer) {
2632
+ viewer.clearSelected();
2633
+ viewer.visibilityManager.hideAll();
2634
+ viewer.emitEvent({ type: "hideall" });
2619
2635
  viewer.update();
2636
+ }
2637
+
2638
+ function hideSelected(viewer) {
2639
+ viewer.hide(viewer.getSelected(false));
2640
+ }
2641
+
2642
+ function isolate(viewer, handles) {
2643
+ handles = toHandles(viewer, handles);
2644
+ const handlesSet = new Set(handles);
2645
+ const toDeselect = [];
2646
+ for (const handle of viewer.selector.selected) {
2647
+ if (!handlesSet.has(handle))
2648
+ toDeselect.push(handle);
2649
+ }
2650
+ viewer.deselect(toDeselect);
2651
+ viewer.visibilityManager.isolate(handles);
2620
2652
  viewer.emitEvent({ type: "isolate" });
2653
+ viewer.update();
2654
+ }
2655
+
2656
+ function isolateSelected(viewer) {
2657
+ viewer.isolate(viewer.getSelected(false));
2621
2658
  }
2622
2659
 
2623
2660
  function regenerateAll(viewer) {
2624
- if (!viewer.visualizeJs)
2625
- return;
2626
2661
  const visViewer = viewer.visViewer();
2627
2662
  visViewer.regenAll();
2628
2663
  viewer.update();
@@ -2630,8 +2665,6 @@ function regenerateAll(viewer) {
2630
2665
  }
2631
2666
 
2632
2667
  function resetView(viewer) {
2633
- if (!viewer.visualizeJs)
2634
- return;
2635
2668
  viewer.executeCommand("setActiveDragger");
2636
2669
  viewer.executeCommand("clearSlices");
2637
2670
  viewer.executeCommand("clearOverlay");
@@ -2639,29 +2672,35 @@ function resetView(viewer) {
2639
2672
  viewer.executeCommand("clearSelected");
2640
2673
  viewer.executeCommand("showAll");
2641
2674
  viewer.executeCommand("explode", 0);
2642
- viewer.executeCommand("zoomToExtents", true);
2675
+ viewer.executeCommand("zoomExtents");
2643
2676
  viewer.emit({ type: "resetview" });
2644
2677
  }
2645
2678
 
2679
+ function select(viewer, handles = []) {
2680
+ handles = toHandles(viewer, handles);
2681
+ viewer.show(handles);
2682
+ viewer.selector.select(handles);
2683
+ viewer.emitEvent({ type: "select" });
2684
+ viewer.emitEvent({ type: "select2" });
2685
+ viewer.update();
2686
+ }
2687
+
2646
2688
  function selectModel(viewer, handle) {
2647
- if (!viewer.visualizeJs)
2648
- return;
2689
+ let handles = [];
2649
2690
  const visViewer = viewer.visViewer();
2650
- const activeView = visViewer.activeView;
2651
2691
  const modelItr = visViewer.getModelIterator();
2652
- for (; !modelItr.done(); modelItr.step()) {
2653
- const modelPtr = modelItr.getModel();
2654
- if (modelPtr.getDatabaseHandle() === handle) {
2655
- const selectionSet = activeView.selectCrossing([0, 9999, 9999, 0], modelPtr);
2656
- visViewer.setSelected(selectionSet);
2657
- viewer.update();
2658
- viewer.emitEvent({ type: "select", handles: viewer.getSelected() });
2659
- viewer.emitEvent({ type: "select2", handles: viewer.getSelected2() });
2660
- selectionSet.delete();
2692
+ while (!modelItr.done()) {
2693
+ const model = modelItr.getModel();
2694
+ if (model.getDatabaseHandle() === handle) {
2695
+ const entityItr = model.getEntitiesIterator();
2696
+ handles = viewer.models[0].getHandlesByEntityIterator(entityItr);
2697
+ entityItr.delete();
2661
2698
  break;
2662
2699
  }
2700
+ modelItr.step();
2663
2701
  }
2664
2702
  modelItr.delete();
2703
+ viewer.setSelected(handles);
2665
2704
  }
2666
2705
 
2667
2706
  function setActiveDragger(viewer, dragger = "") {
@@ -2683,94 +2722,74 @@ function setMarkupColor(viewer, r = 255, g = 0, b = 0) {
2683
2722
  viewer.markup.setMarkupColor(r, g, b);
2684
2723
  }
2685
2724
 
2686
- function setSelected(viewer, handles2 = []) {
2687
- if (!viewer.visualizeJs)
2688
- return;
2689
- const handles = handles2.map((handle) => handle.slice(handle.indexOf(":") + 1));
2690
- const visLib = viewer.visLib();
2691
- const visViewer = viewer.visViewer();
2692
- const selectionSet = new visLib.OdTvSelectionSet();
2693
- handles.forEach((handle) => {
2694
- const entityId = visViewer.getEntityByOriginalHandle(handle + "");
2695
- if (!entityId.isNull())
2696
- selectionSet.appendEntity(entityId);
2697
- });
2698
- visViewer.setSelected(selectionSet);
2725
+ function setSelected(viewer, handles = []) {
2726
+ handles = toHandles(viewer, handles);
2727
+ viewer.show(handles);
2728
+ viewer.selector.setSelected(handles);
2729
+ viewer.emitEvent({ type: "select" });
2730
+ viewer.emitEvent({ type: "select2" });
2699
2731
  viewer.update();
2700
- viewer.emitEvent({ type: "select", data: selectionSet, handles });
2701
- viewer.emitEvent({ type: "select2", data: selectionSet, handles: handles2 });
2702
- selectionSet.delete();
2703
2732
  }
2704
2733
 
2705
2734
  function setSelected2(viewer, handles2 = []) {
2706
- const handles = [];
2707
- handles2.forEach((handle) => {
2708
- if (!handle.includes(":")) {
2709
- handles.push(handle);
2710
- }
2711
- else
2712
- viewer.models.forEach((model) => {
2713
- if (handle.split(":", 1)[0] === model.id + "")
2714
- handles.push(handle);
2715
- });
2716
- });
2717
- return viewer.executeCommand("setSelected", handles);
2735
+ console.warn("setSelected2 command has been deprecated since 27.11 and will be removed in a future release, use setSelected instead");
2736
+ return viewer.executeCommand("setSelected", handles2);
2718
2737
  }
2719
2738
 
2720
- function showAll(viewer) {
2721
- if (!viewer.visualizeJs)
2722
- return;
2723
- const visViewer = viewer.visViewer();
2724
- visViewer.unisolateSelectedObjects(false);
2739
+ function show(viewer, handles) {
2740
+ handles = toHandles(viewer, handles);
2741
+ viewer.visibilityManager.show(handles);
2742
+ viewer.emitEvent({ type: "show" });
2725
2743
  viewer.update();
2744
+ }
2745
+
2746
+ function showAll(viewer) {
2747
+ viewer.visibilityManager.showAll();
2726
2748
  viewer.emitEvent({ type: "showall" });
2749
+ viewer.update();
2727
2750
  }
2728
2751
 
2729
- function zoomToExtents(viewer, force = false, animate = viewer.options.cameraAnimation) {
2730
- if (!viewer.visualizeJs)
2731
- return;
2732
- const visViewer = viewer.visViewer();
2733
- const saveEnableAmination = visViewer.getEnableAnimation();
2734
- visViewer.setEnableAnimation(animate);
2735
- visViewer.zoomExtents(force);
2736
- visViewer.update();
2737
- visViewer.setEnableAnimation(saveEnableAmination);
2738
- viewer.deviceAutoRegeneration();
2752
+ function toggleSelection(viewer, handles = []) {
2753
+ handles = toHandles(viewer, handles);
2754
+ if (viewer.selector.selected.has(handles[0])) {
2755
+ viewer.selector.deselect(handles);
2756
+ }
2757
+ else {
2758
+ viewer.show(handles);
2759
+ viewer.selector.select(handles);
2760
+ }
2761
+ viewer.emitEvent({ type: "select" });
2762
+ viewer.emitEvent({ type: "select2" });
2739
2763
  viewer.update();
2740
- viewer.emitEvent({ type: "zoom" });
2741
2764
  }
2742
2765
 
2743
- function zoomToObjects(viewer, handles = []) {
2744
- var _a;
2745
- if (!viewer.visualizeJs)
2746
- return;
2747
- const visLib = viewer.visLib();
2766
+ function zoomExtents(viewer) {
2748
2767
  const visViewer = viewer.visViewer();
2749
- const selectionSet = new visLib.OdTvSelectionSet();
2750
- handles.forEach((handle) => {
2751
- const entityId = visViewer.getEntityByOriginalHandle(handle + "");
2752
- if (!entityId.isNull())
2753
- selectionSet.appendEntity(entityId);
2754
- });
2755
- (_a = visViewer.zoomToObjects) === null || _a === void 0 ? void 0 : _a.call(visViewer, selectionSet);
2768
+ visViewer.zoomExtents(true);
2756
2769
  viewer.deviceAutoRegeneration();
2757
2770
  viewer.update();
2758
2771
  viewer.emitEvent({ type: "zoom" });
2759
- selectionSet.delete();
2760
2772
  }
2761
2773
 
2762
- function zoomToSelected(viewer) {
2774
+ function zoomTo(viewer, handles = []) {
2763
2775
  var _a;
2764
- if (!viewer.visualizeJs)
2765
- return;
2776
+ handles = toHandles(viewer, handles);
2766
2777
  const visViewer = viewer.visViewer();
2767
- const selectionSet = visViewer.getSelected();
2768
- (_a = visViewer.zoomToObjects) === null || _a === void 0 ? void 0 : _a.call(visViewer, selectionSet);
2778
+ const selectionSet = viewer.models[0].getSelectionSetByHandles(handles);
2779
+ if (selectionSet.numItems() > 0)
2780
+ (_a = visViewer.zoomToObjects) === null || _a === void 0 ? void 0 : _a.call(visViewer, selectionSet);
2781
+ else
2782
+ visViewer.zoomExtents(false);
2783
+ selectionSet.delete();
2769
2784
  viewer.deviceAutoRegeneration();
2770
2785
  viewer.update();
2771
2786
  viewer.emitEvent({ type: "zoom" });
2772
2787
  }
2773
2788
 
2789
+ function zoomToSelected(viewer) {
2790
+ zoomTo(viewer, viewer.getSelected(false));
2791
+ }
2792
+
2774
2793
  function isTemplateModel(modelPtr) {
2775
2794
  return modelPtr.getName()[0] === "$";
2776
2795
  }
@@ -2833,26 +2852,35 @@ commands.registerCommand("applyModelTransform", applyModelTransform);
2833
2852
  commands.registerCommand("clearMarkup", clearMarkup);
2834
2853
  commands.registerCommand("clearSelected", clearSelected);
2835
2854
  commands.registerCommand("clearSlices", clearSlices);
2836
- commands.registerCommand("getSnapshot", getSnapshot);
2837
- commands.registerCommand("explode", explode);
2838
2855
  commands.registerCommand("collect", collect);
2856
+ commands.registerCommand("deselect", deselect);
2857
+ commands.registerCommand("explode", explode);
2858
+ commands.registerCommand("getSnapshot", getSnapshot);
2839
2859
  commands.registerCommand("getDefaultViewPositions", getDefaultViewPositions);
2860
+ commands.registerCommand("getHidden", getHidden);
2861
+ commands.registerCommand("getIsolated", getIsolated);
2840
2862
  commands.registerCommand("getModels", getModels);
2841
2863
  commands.registerCommand("getSelected", getSelected);
2842
2864
  commands.registerCommand("getSelected2", getSelected2);
2865
+ commands.registerCommand("hide", hide);
2866
+ commands.registerCommand("hideAll", hideAll);
2843
2867
  commands.registerCommand("hideSelected", hideSelected);
2868
+ commands.registerCommand("isolate", isolate);
2844
2869
  commands.registerCommand("isolateSelected", isolateSelected);
2845
2870
  commands.registerCommand("regenerateAll", regenerateAll);
2846
2871
  commands.registerCommand("resetView", resetView);
2872
+ commands.registerCommand("select", select);
2847
2873
  commands.registerCommand("selectModel", selectModel);
2848
2874
  commands.registerCommand("setActiveDragger", setActiveDragger);
2849
2875
  commands.registerCommand("setDefaultViewPosition", setDefaultViewPosition);
2850
2876
  commands.registerCommand("setMarkupColor", setMarkupColor);
2851
2877
  commands.registerCommand("setSelected", setSelected);
2852
2878
  commands.registerCommand("setSelected2", setSelected2);
2879
+ commands.registerCommand("show", show);
2853
2880
  commands.registerCommand("showAll", showAll);
2854
- commands.registerCommand("zoomToExtents", zoomToExtents);
2855
- commands.registerCommand("zoomToObjects", zoomToObjects);
2881
+ commands.registerCommand("toggleSelection", toggleSelection);
2882
+ commands.registerCommand("zoomExtents", zoomExtents);
2883
+ commands.registerCommand("zoomTo", zoomTo);
2856
2884
  commands.registerCommand("zoomToSelected", zoomToSelected);
2857
2885
  commands.registerCommand("autoTransformAllModelsToCentralPoint", autoTransformAllModelsToCentralPoint);
2858
2886
  commands.registerCommand("top", (viewer) => setDefaultViewPosition(viewer, "k3DViewTop"));
@@ -2868,7 +2896,8 @@ commands.registerCommand("nw", (viewer) => setDefaultViewPosition(viewer, "k3DVi
2868
2896
  commands.registerCommandAlias("clearMarkup", "clearOverlay");
2869
2897
  commands.registerCommandAlias("clearSelected", "unselect");
2870
2898
  commands.registerCommandAlias("getSnapshot", "createPreview");
2871
- commands.registerCommandAlias("zoomToExtents", "zoomExtents");
2899
+ commands.registerCommandAlias("zoomExtents", "zoomToExtents");
2900
+ commands.registerCommandAlias("zoomTo", "zoomToObjects");
2872
2901
  commands.registerCommandAlias("top", "k3DViewTop");
2873
2902
  commands.registerCommandAlias("bottom", "k3DViewBottom");
2874
2903
  commands.registerCommandAlias("left", "k3DViewLeft");
@@ -3332,10 +3361,120 @@ components.registerComponent("GestureManagerComponent", (viewer) => new GestureM
3332
3361
  components.registerComponent("ResetComponent", (viewer) => new ResetComponent(viewer));
3333
3362
 
3334
3363
  class ModelImpl {
3335
- constructor() {
3364
+ constructor(visualizeJs) {
3336
3365
  this.id = "";
3366
+ this.id = "";
3367
+ this.visualizeJs = visualizeJs;
3337
3368
  }
3338
3369
  dispose() { }
3370
+ initialize() {
3371
+ }
3372
+ getHandlesByEntityIterator(iterator) {
3373
+ const handles2 = [];
3374
+ while (!iterator.done()) {
3375
+ const entityId = iterator.getEntity();
3376
+ const entityType = entityId.getType();
3377
+ let entityPtr = null;
3378
+ if (entityType === this.visualizeJs.OdTvEntityType.kEntity.value)
3379
+ entityPtr = entityId.openObject();
3380
+ if (entityType === this.visualizeJs.OdTvEntityType.kInsert.value)
3381
+ entityPtr = entityId.openObjectAsInsert();
3382
+ if (entityPtr) {
3383
+ const handle = entityPtr.getNativeDatabaseHandle();
3384
+ if (handle !== "-1")
3385
+ handles2.push(handle);
3386
+ entityPtr.delete();
3387
+ }
3388
+ iterator.step();
3389
+ }
3390
+ return handles2;
3391
+ }
3392
+ getHandlesBySelectionSet(selectionSet) {
3393
+ const iterator = selectionSet.getIterator();
3394
+ const handles = this.getHandlesByEntityIterator(iterator);
3395
+ iterator.delete();
3396
+ return handles;
3397
+ }
3398
+ getSelectionSetByHandles(handles) {
3399
+ const viewer = this.visualizeJs.getViewer();
3400
+ const selectionSet = viewer.getEntitySetByOriginalHandles(handles);
3401
+ return selectionSet;
3402
+ }
3403
+ hide(handles) {
3404
+ const viewer = this.visualizeJs.getViewer();
3405
+ const model = viewer.getActiveModel();
3406
+ const selectionSet = this.getSelectionSetByHandles(handles);
3407
+ model.hideBySelectionSet(selectionSet, false);
3408
+ selectionSet.delete();
3409
+ return this;
3410
+ }
3411
+ hideAll() {
3412
+ const viewer = this.visualizeJs.getViewer();
3413
+ const model = viewer.getActiveModel();
3414
+ const selectionSet = new this.visualizeJs.OdTvSelectionSet();
3415
+ const entityItr = model.getEntitiesIterator();
3416
+ while (!entityItr.done()) {
3417
+ const entityId = entityItr.getEntity();
3418
+ const entityType = entityId.getType();
3419
+ const isEntity = entityType === this.visualizeJs.OdTvEntityType.kEntity.value;
3420
+ const isInsert = entityType === this.visualizeJs.OdTvEntityType.kInsert.value;
3421
+ if (isEntity || isInsert)
3422
+ selectionSet.appendEntity(entityId);
3423
+ entityItr.step();
3424
+ }
3425
+ entityItr.delete();
3426
+ model.hideBySelectionSet(selectionSet, false);
3427
+ selectionSet.delete();
3428
+ return this;
3429
+ }
3430
+ isolate(handles) {
3431
+ if (handles.length > 0) {
3432
+ const viewer = this.visualizeJs.getViewer();
3433
+ const model = viewer.getActiveModel();
3434
+ const selectionSet = this.getSelectionSetByHandles(handles);
3435
+ model.isolateBySelectionSet(selectionSet, false);
3436
+ selectionSet.delete();
3437
+ }
3438
+ else {
3439
+ this.hideAll();
3440
+ }
3441
+ return this;
3442
+ }
3443
+ show(handles) {
3444
+ const viewer = this.visualizeJs.getViewer();
3445
+ const model = viewer.getActiveModel();
3446
+ const selectionSet = this.getSelectionSetByHandles(handles);
3447
+ model.unHideBySelectionSet(selectionSet, true, false);
3448
+ selectionSet.delete();
3449
+ return this;
3450
+ }
3451
+ showAll() {
3452
+ const viewer = this.visualizeJs.getViewer();
3453
+ const model = viewer.getActiveModel();
3454
+ model.unIsolate(false);
3455
+ return this;
3456
+ }
3457
+ highlight(handles) {
3458
+ const viewer = this.visualizeJs.getViewer();
3459
+ const view = viewer.activeView;
3460
+ const selectionSet = this.getSelectionSetByHandles(handles);
3461
+ view.highlightAll(selectionSet, true);
3462
+ selectionSet.delete();
3463
+ return this;
3464
+ }
3465
+ unhighlight(handles) {
3466
+ const viewer = this.visualizeJs.getViewer();
3467
+ const view = viewer.activeView;
3468
+ const selectionSet = this.getSelectionSetByHandles(handles);
3469
+ view.highlightAll(selectionSet, false);
3470
+ selectionSet.delete();
3471
+ return this;
3472
+ }
3473
+ explode(scale, coeff = 4) {
3474
+ const viewer = this.visualizeJs.getViewer();
3475
+ viewer.explode(scale);
3476
+ return this;
3477
+ }
3339
3478
  }
3340
3479
 
3341
3480
  class FileLoader {
@@ -3447,8 +3586,9 @@ class VSFFileLoader extends Loader {
3447
3586
  console.error("VSF parse error.", error);
3448
3587
  throw error;
3449
3588
  }
3450
- const modelImpl = new ModelImpl();
3589
+ const modelImpl = new ModelImpl(this.viewer.visualizeJs);
3451
3590
  modelImpl.id = params.modelId || this.extractFileName(file);
3591
+ modelImpl.initialize();
3452
3592
  this.viewer.models.push(modelImpl);
3453
3593
  this.viewer.syncOptions();
3454
3594
  this.viewer.syncOverlay();
@@ -3469,7 +3609,7 @@ class VSFCloudLoader extends Loader {
3469
3609
  typeof file.downloadResource === "function" &&
3470
3610
  /.data$/i.test(file.database));
3471
3611
  }
3472
- async load(model, format) {
3612
+ async load(model, format, params = {}) {
3473
3613
  if (!this.viewer.visualizeJs)
3474
3614
  return this;
3475
3615
  const visViewer = this.viewer.visViewer();
@@ -3492,8 +3632,9 @@ class VSFCloudLoader extends Loader {
3492
3632
  throw error;
3493
3633
  }
3494
3634
  if (i === 0) {
3495
- const modelImpl = new ModelImpl();
3496
- modelImpl.id = model.file.id;
3635
+ const modelImpl = new ModelImpl(this.viewer.visualizeJs);
3636
+ modelImpl.id = params.modelId || model.file.id;
3637
+ modelImpl.initialize();
3497
3638
  this.viewer.models.push(modelImpl);
3498
3639
  this.viewer.syncOptions();
3499
3640
  this.viewer.syncOverlay();
@@ -3542,8 +3683,9 @@ class VSFXFileLoader extends Loader {
3542
3683
  console.error("VSFX parse error.", error);
3543
3684
  throw error;
3544
3685
  }
3545
- const modelImpl = new ModelImpl();
3686
+ const modelImpl = new ModelImpl(this.viewer.visualizeJs);
3546
3687
  modelImpl.id = params.modelId || this.extractFileName(file);
3688
+ modelImpl.initialize();
3547
3689
  this.viewer.models.push(modelImpl);
3548
3690
  this.viewer.syncOptions();
3549
3691
  this.viewer.syncOverlay();
@@ -3565,7 +3707,7 @@ class VSFXCloudLoader extends Loader {
3565
3707
  /.vsfx$/i.test(file.database) &&
3566
3708
  this.viewer.options.enableStreamingMode === false);
3567
3709
  }
3568
- async load(model) {
3710
+ async load(model, format, params = {}) {
3569
3711
  if (!this.viewer.visualizeJs)
3570
3712
  return Promise.resolve(this);
3571
3713
  const visViewer = this.viewer.visViewer();
@@ -3583,8 +3725,9 @@ class VSFXCloudLoader extends Loader {
3583
3725
  console.error("VSFX parse error.", error);
3584
3726
  throw error;
3585
3727
  }
3586
- const modelImpl = new ModelImpl();
3587
- modelImpl.id = model.file.id;
3728
+ const modelImpl = new ModelImpl(this.viewer.visualizeJs);
3729
+ modelImpl.id = params.modelId || model.file.id;
3730
+ modelImpl.initialize();
3588
3731
  this.viewer.models.push(modelImpl);
3589
3732
  this.viewer.syncOptions();
3590
3733
  this.viewer.syncOverlay();
@@ -3608,7 +3751,7 @@ class VSFXCloudStreamingLoader extends Loader {
3608
3751
  this.viewer.options.enablePartialMode === false &&
3609
3752
  !/.rcs$/i.test(file.type));
3610
3753
  }
3611
- async load(model) {
3754
+ async load(model, format, params = {}) {
3612
3755
  if (!this.viewer.visualizeJs)
3613
3756
  return this;
3614
3757
  const visLib = this.viewer.visLib();
@@ -3633,8 +3776,9 @@ class VSFXCloudStreamingLoader extends Loader {
3633
3776
  isDatabaseChunk = true;
3634
3777
  }
3635
3778
  if (isDatabaseChunk) {
3636
- const modelImpl = new ModelImpl();
3637
- modelImpl.id = model.file.id;
3779
+ const modelImpl = new ModelImpl(this.viewer.visualizeJs);
3780
+ modelImpl.id = params.modelId || model.file.id;
3781
+ modelImpl.initialize();
3638
3782
  this.viewer.models.push(modelImpl);
3639
3783
  this.viewer.syncOptions();
3640
3784
  this.viewer.syncOverlay();
@@ -3667,7 +3811,7 @@ class VSFXCloudPartialLoader extends Loader {
3667
3811
  /.vsfx$/i.test(file.database) &&
3668
3812
  (this.viewer.options.enablePartialMode === true || /.rcs$/i.test(file.type)));
3669
3813
  }
3670
- async load(model) {
3814
+ async load(model, format, params = {}) {
3671
3815
  if (!this.viewer.visualizeJs)
3672
3816
  return this;
3673
3817
  const visViewer = this.viewer.visViewer();
@@ -3691,8 +3835,9 @@ class VSFXCloudPartialLoader extends Loader {
3691
3835
  }
3692
3836
  this.viewer.emitEvent({ type: "geometryprogress", data: progress, file: model.file, model });
3693
3837
  if (isDatabaseChunk) {
3694
- const modelImpl = new ModelImpl();
3695
- modelImpl.id = model.file.id;
3838
+ const modelImpl = new ModelImpl(this.viewer.visualizeJs);
3839
+ modelImpl.id = params.modelId || model.file.id;
3840
+ modelImpl.initialize();
3696
3841
  this.viewer.models.push(modelImpl);
3697
3842
  this.viewer.syncOptions();
3698
3843
  this.viewer.syncOverlay();
@@ -4075,9 +4220,12 @@ class Viewer extends EventEmitter2 {
4075
4220
  this.info = new Info();
4076
4221
  this.canvasEvents = CANVAS_EVENTS.slice();
4077
4222
  this.canvaseventlistener = (event) => this.emit(event);
4223
+ this.selector = new Selector(this.models);
4224
+ this.visibilityManager = new VisibilityManager(this.models);
4225
+ this.explodeScale = 0;
4078
4226
  this._visualizeTimestamp = 0;
4079
4227
  this._activeDragger = null;
4080
- this._components = [];
4228
+ this._components = new Map();
4081
4229
  this._renderNeeded = false;
4082
4230
  this._renderTime = 0;
4083
4231
  this._enableAutoUpdate = (_a = params.enableAutoUpdate) !== null && _a !== void 0 ? _a : true;
@@ -4102,7 +4250,7 @@ class Viewer extends EventEmitter2 {
4102
4250
  return this._markup;
4103
4251
  }
4104
4252
  configure(params) {
4105
- this._visualizeJsUrl = params.visualizeJsUrl || "https://public-fhemb7e3embacwec.z02.azurefd.net/libs/visualizejs/27.9/Visualize.js";
4253
+ this._visualizeJsUrl = params.visualizeJsUrl || "https://public-fhemb7e3embacwec.z02.azurefd.net/libs/visualizejs/master/Visualize.js";
4106
4254
  this._crossOrigin = params.crossOrigin;
4107
4255
  return this;
4108
4256
  }
@@ -4144,7 +4292,7 @@ class Viewer extends EventEmitter2 {
4144
4292
  for (const name of components.getComponents().keys()) {
4145
4293
  const component = components.createComponent(name, this);
4146
4294
  if (component)
4147
- this._components.push(component);
4295
+ this._components.set(name, component);
4148
4296
  }
4149
4297
  this.syncOptions();
4150
4298
  this.syncOverlay();
@@ -4160,7 +4308,7 @@ class Viewer extends EventEmitter2 {
4160
4308
  this.removeAllListeners();
4161
4309
  this.setActiveDragger();
4162
4310
  this._components.forEach((component) => component.dispose());
4163
- this._components.length = 0;
4311
+ this._components.clear();
4164
4312
  this._markup.dispose();
4165
4313
  if (this.canvas) {
4166
4314
  this.canvasEvents.forEach((x) => this.canvas.removeEventListener(x, this.canvaseventlistener));
@@ -4191,8 +4339,8 @@ class Viewer extends EventEmitter2 {
4191
4339
  }
4192
4340
  update(force = false) {
4193
4341
  const time = performance.now();
4194
- if (typeof force === "number" && time - this._renderTime >= force)
4195
- force = true;
4342
+ if (typeof force === "number")
4343
+ force = time - this._renderTime >= force;
4196
4344
  if (this._enableAutoUpdate) {
4197
4345
  this._renderNeeded = true;
4198
4346
  if (force)
@@ -4481,30 +4629,66 @@ class Viewer extends EventEmitter2 {
4481
4629
  this.emitEvent({ type: "clearslices" });
4482
4630
  this.update();
4483
4631
  }
4484
- getSelected() {
4485
- return this.executeCommand("getSelected");
4486
- }
4487
- setSelected(handles) {
4488
- this.executeCommand("setSelected", handles);
4632
+ getSelected(multimodel) {
4633
+ return this.executeCommand("getSelected", multimodel);
4489
4634
  }
4490
4635
  getSelected2() {
4491
4636
  return this.executeCommand("getSelected2");
4492
4637
  }
4638
+ setSelected(handles) {
4639
+ this.executeCommand("setSelected", handles);
4640
+ }
4493
4641
  setSelected2(handles) {
4494
4642
  this.executeCommand("setSelected2", handles);
4495
4643
  }
4644
+ select(handles) {
4645
+ this.executeCommand("select", handles);
4646
+ }
4647
+ deselect(handles) {
4648
+ this.executeCommand("deselect", handles);
4649
+ }
4650
+ toggleSelection(handles) {
4651
+ this.executeCommand("toggleSelection", handles);
4652
+ }
4496
4653
  clearSelected() {
4497
4654
  this.executeCommand("clearSelected");
4498
4655
  }
4656
+ getHidden(multimodel) {
4657
+ return this.executeCommand("getHidden", multimodel);
4658
+ }
4659
+ getIsolated(multimodel) {
4660
+ return this.executeCommand("getIsolated", multimodel);
4661
+ }
4662
+ hide(handle) {
4663
+ this.executeCommand("hide", handle);
4664
+ }
4665
+ hideAll() {
4666
+ this.executeCommand("hideAll");
4667
+ }
4499
4668
  hideSelected() {
4500
4669
  this.executeCommand("hideSelected");
4501
4670
  }
4671
+ isolate(handle) {
4672
+ this.executeCommand("isolate", handle);
4673
+ }
4502
4674
  isolateSelected() {
4503
4675
  this.executeCommand("isolateSelected");
4504
4676
  }
4677
+ show(handle) {
4678
+ this.executeCommand("show", handle);
4679
+ }
4505
4680
  showAll() {
4506
4681
  this.executeCommand("showAll");
4507
4682
  }
4683
+ zoomExtents() {
4684
+ this.executeCommand("zoomExtents");
4685
+ }
4686
+ zoomTo(handles) {
4687
+ this.executeCommand("zoomTo", handles);
4688
+ }
4689
+ zoomToSelected() {
4690
+ this.executeCommand("zoomToSelected");
4691
+ }
4508
4692
  explode(index = 0) {
4509
4693
  this.executeCommand("explode", index);
4510
4694
  }
@@ -4546,10 +4730,10 @@ class Viewer extends EventEmitter2 {
4546
4730
  }
4547
4731
  }
4548
4732
  getComponent(name) {
4549
- return this._components.find((component) => component.name === name) || null;
4733
+ return this._components.get(name) || null;
4550
4734
  }
4551
4735
  drawViewpoint(viewpoint) {
4552
- var _a, _b;
4736
+ var _a, _b, _c, _d;
4553
4737
  if (!this.visualizeJs)
4554
4738
  return;
4555
4739
  const visViewer = this.visViewer();
@@ -4593,8 +4777,22 @@ class Viewer extends EventEmitter2 {
4593
4777
  }
4594
4778
  };
4595
4779
  const setSelection = (selection) => {
4596
- if (selection)
4597
- this.setSelected(selection.map((component) => component.handle));
4780
+ if (selection) {
4781
+ this.setSelected(selection.map(({ handle }) => handle));
4782
+ }
4783
+ };
4784
+ const setVisibility = (visibility) => {
4785
+ if (visibility && visibility.exceptions)
4786
+ if (visibility.default_visibility) {
4787
+ this.hide(visibility.exceptions.map(({ handle }) => handle));
4788
+ }
4789
+ else {
4790
+ this.isolate(visibility.exceptions.map(({ handle }) => handle));
4791
+ }
4792
+ };
4793
+ const setExplodeScale = (scale) => {
4794
+ if (scale > 0)
4795
+ this.explode(scale);
4598
4796
  };
4599
4797
  const draggerName = (_a = this._activeDragger) === null || _a === void 0 ? void 0 : _a.name;
4600
4798
  this.setActiveDragger();
@@ -4606,7 +4804,9 @@ class Viewer extends EventEmitter2 {
4606
4804
  setOrthogonalCamera(viewpoint.orthogonal_camera);
4607
4805
  setPerspectiveCamera(viewpoint.perspective_camera);
4608
4806
  setClippingPlanes(viewpoint.clipping_planes);
4609
- setSelection(((_b = viewpoint.custom_fields) === null || _b === void 0 ? void 0 : _b.selection2) || viewpoint.selection);
4807
+ setVisibility(((_b = viewpoint.custom_fields) === null || _b === void 0 ? void 0 : _b.visibility2) || viewpoint.visibility);
4808
+ setSelection(((_c = viewpoint.custom_fields) === null || _c === void 0 ? void 0 : _c.selection2) || viewpoint.selection);
4809
+ setExplodeScale((_d = viewpoint.custom_fields) === null || _d === void 0 ? void 0 : _d.explodeScale);
4610
4810
  this._markup.setViewpoint(viewpoint);
4611
4811
  this.syncOverlay();
4612
4812
  this.setActiveDragger(draggerName);
@@ -4667,20 +4867,42 @@ class Viewer extends EventEmitter2 {
4667
4867
  return clipping_planes;
4668
4868
  };
4669
4869
  const getSelection = () => {
4670
- return this.getSelected().map((handle) => ({ handle }));
4870
+ const selected = Array.from(this.selector.selected);
4871
+ return selected.map((handle) => ({ handle }));
4671
4872
  };
4672
4873
  const getSelection2 = () => {
4673
- return this.getSelected2().map((handle) => ({ handle }));
4874
+ const selected = Array.from(this.selector.selected);
4875
+ const selected2 = toHandles2(this, selected);
4876
+ return selected2.map((handle) => ({ handle }));
4877
+ };
4878
+ const getVisibility = () => {
4879
+ const exceptions = Array.from(this.visibilityManager.exceptions);
4880
+ return {
4881
+ default_visibility: this.visibilityManager.defaultVisible,
4882
+ exceptions: exceptions.map((handle) => ({ handle })),
4883
+ };
4884
+ };
4885
+ const getVisibility2 = () => {
4886
+ const exceptions = Array.from(this.visibilityManager.exceptions);
4887
+ const exceptions2 = toHandles2(this, exceptions);
4888
+ return {
4889
+ default_visibility: this.visibilityManager.defaultVisible,
4890
+ exceptions: exceptions2.map((handle) => ({ handle })),
4891
+ };
4674
4892
  };
4675
4893
  const viewpoint = { custom_fields: {} };
4676
4894
  viewpoint.orthogonal_camera = getOrthogonalCamera();
4677
4895
  viewpoint.perspective_camera = getPerspectiveCamera();
4678
4896
  viewpoint.clipping_planes = getClippingPlanes();
4679
4897
  viewpoint.selection = getSelection();
4898
+ viewpoint.visibility = getVisibility();
4680
4899
  viewpoint.description = new Date().toDateString();
4681
4900
  viewpoint.snapshot = { data: this.getSnapshot() };
4682
- this._markup.getViewpoint(viewpoint);
4683
4901
  viewpoint.custom_fields.selection2 = getSelection2();
4902
+ viewpoint.custom_fields.visibility2 = getVisibility2();
4903
+ viewpoint.custom_fields.explodeScale = this.explodeScale;
4904
+ viewpoint.custom_fields.files = this.models.map((model) => model.id);
4905
+ this._markup.getViewpoint(viewpoint);
4684
4906
  this.emitEvent({ type: "createviewpoint", data: viewpoint });
4685
4907
  return viewpoint;
4686
4908
  }