@inweb/viewer-visualize 26.5.0 → 26.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/viewer-visualize.js +18183 -18012
  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 +335 -297
  5. package/dist/viewer-visualize.module.js.map +1 -1
  6. package/lib/Viewer/Loaders/{UpdaterController.d.ts → UpdateController.d.ts} +1 -1
  7. package/lib/Viewer/Loaders/VSFBufferLoader.d.ts +8 -0
  8. package/lib/Viewer/Loaders/VSFModelLoader.d.ts +8 -0
  9. package/lib/Viewer/Loaders/VSFXBufferLoader.d.ts +8 -0
  10. package/lib/Viewer/Loaders/VSFXModelLoader.d.ts +8 -0
  11. package/lib/Viewer/Loaders/VSFXPartialLoader.d.ts +10 -0
  12. package/lib/Viewer/Loaders/VSFXStreamingLoader.d.ts +8 -0
  13. package/lib/Viewer/Loaders/index.d.ts +67 -0
  14. package/lib/Viewer/Viewer.d.ts +7 -59
  15. package/lib/index.d.ts +3 -2
  16. package/package.json +5 -5
  17. package/src/Viewer/Loaders/{BaseLoader.ts → UpdateController.ts} +30 -10
  18. package/src/Viewer/Loaders/{LoaderFactory.ts → VSFBufferLoader.ts} +28 -19
  19. package/src/Viewer/Loaders/VSFModelLoader.ts +87 -0
  20. package/src/Viewer/Loaders/VSFXBufferLoader.ts +58 -0
  21. package/src/Viewer/Loaders/{VsfXLoader.ts → VSFXModelLoader.ts} +35 -35
  22. package/src/Viewer/Loaders/{VsfXPartialLoader.ts → VSFXPartialLoader.ts} +55 -45
  23. package/src/Viewer/Loaders/{VsfXStreamingLoader.ts → VSFXStreamingLoader.ts} +35 -25
  24. package/src/Viewer/Loaders/index.ts +108 -0
  25. package/src/Viewer/Viewer.ts +53 -103
  26. package/src/index.ts +6 -3
  27. package/lib/Viewer/Loaders/BaseLoader.d.ts +0 -10
  28. package/lib/Viewer/Loaders/LoaderFactory.d.ts +0 -10
  29. package/lib/Viewer/Loaders/TCSLoader.d.ts +0 -4
  30. package/lib/Viewer/Loaders/VsfXLoader.d.ts +0 -4
  31. package/lib/Viewer/Loaders/VsfXPartialLoader.d.ts +0 -4
  32. package/lib/Viewer/Loaders/VsfXStreamingLoader.d.ts +0 -4
  33. package/src/Viewer/Loaders/TCSLoader.ts +0 -83
  34. package/src/Viewer/Loaders/UpdaterController.ts +0 -37
@@ -1,13 +1,13 @@
1
- import { CANVAS_EVENTS, draggersRegistry, commandsRegistry, componentsRegistry, Options } from "@inweb/viewer-core";
1
+ import { CANVAS_EVENTS, draggersRegistry, commandsRegistry, componentsRegistry, Loader, loadersRegistry, Options } from "@inweb/viewer-core";
2
2
 
3
3
  export * from "@inweb/viewer-core";
4
4
 
5
+ import { EventEmitter2 } from "@inweb/eventemitter2";
6
+
5
7
  import { Markup } from "@inweb/markup";
6
8
 
7
9
  export * from "@inweb/markup";
8
10
 
9
- import { EventEmitter2 } from "@inweb/eventemitter2";
10
-
11
11
  class OdaGeAction {
12
12
  constructor(module) {
13
13
  this.setViewParams = params => {
@@ -2421,175 +2421,131 @@ components.registerComponent("ZoomWheelComponent", (viewer => new ZoomWheelCompo
2421
2421
 
2422
2422
  components.registerComponent("GestureManagerComponent", (viewer => new GestureManagerComponent(viewer)));
2423
2423
 
2424
- function loadScript(url, params = {}) {
2425
- return new Promise(((resolve, reject) => {
2426
- const script = document.createElement("script");
2427
- script.src = url;
2428
- script.async = true;
2429
- script.crossOrigin = params.crossOrigin;
2430
- script.onload = () => resolve(script);
2431
- script.onerror = () => {
2432
- script.remove();
2433
- reject(new Error(`GET ${url} failed to load script`));
2434
- };
2435
- document.body.appendChild(script);
2436
- }));
2437
- }
2438
-
2439
- function loadVisuazlizeJsScript(url, params) {
2440
- if (window["getVisualizeLibInst"]) {
2441
- const script = window["getVisualizeLibInst"].script;
2442
- if (script) {
2443
- if (script.src === url) return Promise.resolve(script);
2444
- script.remove();
2445
- }
2446
- delete window["getVisualizeLibInst"];
2447
- }
2448
- return loadScript(url, params);
2449
- }
2450
-
2451
- const loadVisualizeJs = async (url, onprogress, params = {}) => {
2452
- const script = await loadVisuazlizeJsScript(url, params);
2453
- return await new Promise(((resolve, reject) => {
2454
- const options = {
2455
- urlMemFile: url + ".wasm",
2456
- TOTAL_MEMORY: 134217728,
2457
- onprogress: onprogress
2458
- };
2459
- const instance = window["getVisualizeLibInst"](options);
2460
- instance.loadWasmError = reject;
2461
- instance.postRun.push((() => {
2462
- window["getVisualizeLibInst"].script = script;
2463
- resolve(instance);
2464
- }));
2465
- }));
2466
- };
2467
-
2468
- class BaseLoader {
2469
- constructor(viewer, model, options) {
2424
+ class VSFModelLoader extends Loader {
2425
+ constructor(viewer) {
2426
+ super();
2470
2427
  this.viewer = viewer;
2471
- this.model = model;
2472
- this.options = options;
2473
2428
  }
2474
- async load() {}
2475
- }
2476
-
2477
- class TCSLoader extends BaseLoader {
2478
- async load() {
2479
- if (!this.viewer.visualizeJs) return;
2429
+ isSupport(file, format) {
2430
+ return typeof file === "object" && typeof file.database === "string" && typeof file.downloadResource === "function" && /.data$/i.test(file.database);
2431
+ }
2432
+ async load(model, format) {
2433
+ if (!this.viewer.visualizeJs) return this;
2480
2434
  const visLib = this.viewer.visLib();
2481
2435
  const visViewer = visLib.getViewer();
2482
- const abortController = new AbortController;
2483
- const filesToDownload = [ this.model.database, ...this.model.geometry ];
2484
- this.viewer._abortController = abortController;
2436
+ const filesToDownload = [ model.database, ...model.geometry ];
2485
2437
  console.time("File load time");
2486
- try {
2487
- this.viewer.emitEvent({
2488
- type: "geometrystart",
2489
- model: this.model
2490
- });
2491
- for (let i = 0; i < filesToDownload.length; i++) {
2492
- const dataId = filesToDownload[i];
2493
- const chunkLoadHandler = progress => {
2494
- const data = (i + progress) / filesToDownload.length;
2495
- this.viewer.emitEvent({
2496
- type: "geometryprogress",
2497
- data: data,
2498
- model: this.model
2499
- });
2500
- };
2501
- const arrayBuffer = await this.model.downloadResource(dataId, chunkLoadHandler, abortController.signal);
2502
- if (abortController.signal.aborted) {
2503
- await Promise.reject(new Error(`Open model aborted ${this.model.name}`));
2504
- }
2505
- visViewer.parseStream(new Uint8Array(arrayBuffer));
2438
+ for (let i = 0; i < filesToDownload.length; i++) {
2439
+ const dataId = filesToDownload[i];
2440
+ const progress = progress => {
2441
+ const data = (i + progress) / filesToDownload.length;
2442
+ this.viewer.emitEvent({
2443
+ type: "geometryprogress",
2444
+ data: data,
2445
+ file: model.file,
2446
+ model: model
2447
+ });
2448
+ };
2449
+ const arrayBuffer = await model.downloadResource(dataId, progress, this.abortController.signal);
2450
+ if (!this.viewer.visualizeJs) return this;
2451
+ const data = new Uint8Array(arrayBuffer);
2452
+ visViewer.parseStream(data);
2453
+ if (i === 0) {
2454
+ this.viewer.update(true);
2455
+ this.viewer.syncOpenCloudVisualStyle(false);
2456
+ this.viewer.syncOptions();
2457
+ this.viewer.syncOverlay();
2458
+ this.viewer.resize();
2459
+ this.viewer.emitEvent({
2460
+ type: "databasechunk",
2461
+ data: data,
2462
+ file: model.file,
2463
+ model: model
2464
+ });
2465
+ } else {
2506
2466
  this.viewer.update();
2507
- const data = new Uint8Array(arrayBuffer);
2508
- if (i === 0) {
2509
- this.viewer.update(true);
2510
- this.viewer.syncOpenCloudVisualStyle(false);
2511
- this.viewer.syncOptions();
2512
- this.viewer.syncOverlay();
2513
- this.viewer.resize();
2514
- this.viewer.emitEvent({
2515
- type: "databasechunk",
2516
- data: data,
2517
- model: this.model
2518
- });
2519
- } else {
2520
- this.viewer.emitEvent({
2521
- type: "geometrychunk",
2522
- data: data,
2523
- model: this.model
2524
- });
2525
- }
2467
+ this.viewer.emitEvent({
2468
+ type: "geometrychunk",
2469
+ data: data,
2470
+ file: model.file,
2471
+ model: model
2472
+ });
2526
2473
  }
2527
- console.timeEnd("File load time");
2528
- this.viewer.emitEvent({
2529
- type: "geometryend",
2530
- model: this.model
2531
- });
2532
- } catch (error) {
2533
- this.viewer.emitEvent({
2534
- type: "geometryerror",
2535
- data: error,
2536
- model: this.model
2537
- });
2538
- throw error;
2539
2474
  }
2475
+ console.timeEnd("File load time");
2476
+ return this;
2540
2477
  }
2541
2478
  }
2542
2479
 
2543
- class VsfXLoader extends BaseLoader {
2544
- async load() {
2545
- if (!this.viewer.visualizeJs) return;
2480
+ class VSFBufferLoader extends Loader {
2481
+ constructor(viewer) {
2482
+ super();
2483
+ this.viewer = viewer;
2484
+ }
2485
+ isSupport(file, format) {
2486
+ return file instanceof ArrayBuffer && /vsf$/i.test(format);
2487
+ }
2488
+ load(buffer, format) {
2489
+ if (!this.viewer.visualizeJs) return Promise.resolve(this);
2546
2490
  const visLib = this.viewer.visLib();
2547
2491
  const visViewer = visLib.getViewer();
2548
- const abortController = new AbortController;
2549
- this.viewer._abortController = abortController;
2550
- const chunkLoadHandler = progress => {
2492
+ const data = new Uint8Array(buffer);
2493
+ visViewer.parseFile(data);
2494
+ this.viewer.syncOpenCloudVisualStyle(false);
2495
+ this.viewer.syncOptions();
2496
+ this.viewer.syncOverlay();
2497
+ this.viewer.resize();
2498
+ this.viewer.emitEvent({
2499
+ type: "geometryprogress",
2500
+ data: 1,
2501
+ file: buffer
2502
+ });
2503
+ this.viewer.emitEvent({
2504
+ type: "databasechunk",
2505
+ data: data,
2506
+ file: buffer
2507
+ });
2508
+ return Promise.resolve(this);
2509
+ }
2510
+ }
2511
+
2512
+ class VSFXModelLoader extends Loader {
2513
+ constructor(viewer) {
2514
+ super();
2515
+ this.viewer = viewer;
2516
+ }
2517
+ isSupport(file) {
2518
+ return typeof file === "object" && typeof file.database === "string" && typeof file.downloadResource === "function" && /.vsfx$/i.test(file.database) && this.viewer.options.enableStreamingMode === false;
2519
+ }
2520
+ async load(model, format, params = {}) {
2521
+ if (!this.viewer.visualizeJs) return Promise.resolve(this);
2522
+ const visLib = this.viewer.visLib();
2523
+ const visViewer = visLib.getViewer();
2524
+ const progress = progress => {
2551
2525
  this.viewer.emitEvent({
2552
2526
  type: "geometryprogress",
2553
2527
  data: progress,
2554
- model: this.model
2528
+ file: model.file,
2529
+ model: model
2555
2530
  });
2556
2531
  };
2557
2532
  console.time("File load time");
2558
- try {
2559
- this.viewer.emitEvent({
2560
- type: "geometrystart",
2561
- model: this.model
2562
- });
2563
- const arrayBuffer = await this.model.downloadResource(this.model.database, chunkLoadHandler, abortController.signal);
2564
- if (abortController.signal.aborted) {
2565
- await Promise.reject(new Error(`Open model aborted ${this.model.name}`));
2566
- }
2567
- const data = new Uint8Array(arrayBuffer);
2568
- if (this.viewer.visualizeJs) {
2569
- visViewer.parseVsfx(data);
2570
- this.viewer.syncOpenCloudVisualStyle(false);
2571
- this.viewer.syncOptions();
2572
- this.viewer.syncOverlay();
2573
- this.viewer.resize();
2574
- }
2575
- console.timeEnd("File load time");
2576
- this.viewer.emitEvent({
2577
- type: "databasechunk",
2578
- data: data,
2579
- model: this.model
2580
- });
2581
- this.viewer.emitEvent({
2582
- type: "geometryend",
2583
- model: this.model
2584
- });
2585
- } catch (error) {
2586
- this.viewer.emitEvent({
2587
- type: "geometryerror",
2588
- data: error,
2589
- model: this.model
2590
- });
2591
- throw error;
2592
- }
2533
+ const arrayBuffer = await model.downloadResource(model.database, progress, this.abortController.signal);
2534
+ if (!this.viewer.visualizeJs) return this;
2535
+ const data = new Uint8Array(arrayBuffer);
2536
+ visViewer.parseVsfx(data);
2537
+ this.viewer.syncOpenCloudVisualStyle(false);
2538
+ this.viewer.syncOptions();
2539
+ this.viewer.syncOverlay();
2540
+ this.viewer.resize();
2541
+ this.viewer.emitEvent({
2542
+ type: "databasechunk",
2543
+ data: data,
2544
+ file: model.file,
2545
+ model: model
2546
+ });
2547
+ console.timeEnd("File load time");
2548
+ return this;
2593
2549
  }
2594
2550
  }
2595
2551
 
@@ -2605,7 +2561,7 @@ var UpdateType;
2605
2561
  UpdateType[UpdateType["kForce"] = 2] = "kForce";
2606
2562
  })(UpdateType || (UpdateType = {}));
2607
2563
 
2608
- class UpdaterController {
2564
+ class UpdateController {
2609
2565
  constructor() {
2610
2566
  this.lastUpdate = 0;
2611
2567
  this.delayUpdateTime = START_UPDATE_TIME;
@@ -2625,24 +2581,30 @@ class UpdaterController {
2625
2581
  }
2626
2582
  }
2627
2583
 
2628
- class VsfXStreamingLoader extends BaseLoader {
2629
- async load() {
2630
- if (!this.viewer.visualizeJs) return;
2584
+ class VSFXStreamingLoader extends Loader {
2585
+ constructor(viewer) {
2586
+ super();
2587
+ this.viewer = viewer;
2588
+ }
2589
+ isSupport(file) {
2590
+ return typeof file === "object" && typeof file.downloadResource === "function" && /.vsfx$/i.test(file.database) && this.viewer.options.enableStreamingMode === true && this.viewer.options.enablePartialMode === false && !/.rcs$/i.test(file.name);
2591
+ }
2592
+ async load(model) {
2593
+ if (!this.viewer.visualizeJs) return this;
2631
2594
  const visLib = this.viewer.visLib();
2632
2595
  const visViewer = visLib.getViewer();
2633
- const abortController = new AbortController;
2634
- const updaterController = new UpdaterController;
2635
- updaterController.initialize(this.viewer);
2636
- this.viewer._abortController = abortController;
2596
+ const updateController = new UpdateController;
2597
+ updateController.initialize(this.viewer);
2637
2598
  let isFireDatabaseChunk = false;
2638
2599
  const chunkLoadHandler = (progress, chunk) => {
2639
2600
  if (!this.viewer.visualizeJs) return;
2640
2601
  const status = visViewer.parseVsfx(chunk);
2641
- updaterController.update(UpdateType.kDelay);
2602
+ updateController.update(UpdateType.kDelay);
2642
2603
  this.viewer.emitEvent({
2643
2604
  type: "geometryprogress",
2644
2605
  data: progress,
2645
- model: this.model
2606
+ file: model.file,
2607
+ model: model
2646
2608
  });
2647
2609
  let state = false;
2648
2610
  if (status === visLib.DatabaseStreamStatus.ReadyServiceData || status === visLib.DatabaseStreamStatus.Complete && !isFireDatabaseChunk) {
@@ -2650,7 +2612,7 @@ class VsfXStreamingLoader extends BaseLoader {
2650
2612
  state = true;
2651
2613
  }
2652
2614
  if (state) {
2653
- updaterController.update(UpdateType.kForce);
2615
+ updateController.update(UpdateType.kForce);
2654
2616
  this.viewer.syncOpenCloudVisualStyle(false);
2655
2617
  this.viewer.syncOptions();
2656
2618
  this.viewer.syncOverlay();
@@ -2658,37 +2620,23 @@ class VsfXStreamingLoader extends BaseLoader {
2658
2620
  this.viewer.emitEvent({
2659
2621
  type: "databasechunk",
2660
2622
  data: chunk,
2661
- model: this.model
2623
+ file: model.file,
2624
+ model: model
2662
2625
  });
2663
2626
  } else {
2664
2627
  this.viewer.emitEvent({
2665
2628
  type: "geometrychunk",
2666
2629
  data: chunk,
2667
- model: this.model
2630
+ file: model.file,
2631
+ model: model
2668
2632
  });
2669
2633
  }
2670
2634
  };
2671
2635
  console.time("File load time");
2672
- try {
2673
- this.viewer.emitEvent({
2674
- type: "geometrystart",
2675
- model: this.model
2676
- });
2677
- await this.model.downloadResource(this.model.database, chunkLoadHandler, abortController.signal);
2678
- console.timeEnd("File load time");
2679
- updaterController.update(UpdateType.kNormal);
2680
- this.viewer.emitEvent({
2681
- type: "geometryend",
2682
- model: this.model
2683
- });
2684
- } catch (error) {
2685
- this.viewer.emitEvent({
2686
- type: "geometryerror",
2687
- data: error,
2688
- model: this.model
2689
- });
2690
- throw error;
2691
- }
2636
+ await model.downloadResource(model.database, chunkLoadHandler, this.abortController.signal);
2637
+ updateController.update(UpdateType.kNormal);
2638
+ console.timeEnd("File load time");
2639
+ return Promise.resolve(this);
2692
2640
  }
2693
2641
  }
2694
2642
 
@@ -2696,35 +2644,40 @@ const PENDING_REQUESTS_SIZE = 50;
2696
2644
 
2697
2645
  const PENDING_REQUESTS_TIMEOUT = 250;
2698
2646
 
2699
- class VsfXPartialLoader extends BaseLoader {
2700
- async load() {
2701
- if (!this.viewer.visualizeJs) return;
2647
+ class VSFXPartialLoader extends Loader {
2648
+ constructor(viewer) {
2649
+ super();
2650
+ this.viewer = viewer;
2651
+ this.abortControllerForRequestMap = new Map;
2652
+ }
2653
+ isSupport(file) {
2654
+ return typeof file === "object" && typeof file.downloadResource === "function" && /.vsfx$/i.test(file.database) && (this.viewer.options.enablePartialMode === true || /.rcs$/i.test(file.name));
2655
+ }
2656
+ async load(model, format) {
2657
+ if (!this.viewer.visualizeJs) return this;
2702
2658
  const visLib = this.viewer.visLib();
2703
2659
  const visViewer = visLib.getViewer();
2704
- const abortController = new AbortController;
2705
- const abortControllerForRequestMap = new Map;
2706
2660
  let servicePartAborted = false;
2707
2661
  const pendingRequestsMap = new Map;
2708
2662
  let pendingRequestsTimerId = 0;
2709
2663
  const pendingRequestsAbortHandler = () => clearTimeout(pendingRequestsTimerId);
2710
2664
  const pendingRequestsAbortController = new AbortController;
2711
- abortControllerForRequestMap.set(0, pendingRequestsAbortController);
2712
- const updaterController = new UpdaterController;
2713
- updaterController.initialize(this.viewer);
2714
- this.viewer._abortController = abortController;
2715
- this.viewer._abortControllerForRequestMap = abortControllerForRequestMap;
2716
- visViewer.memoryLimit = this.options.memoryLimit;
2665
+ this.abortControllerForRequestMap.set(0, pendingRequestsAbortController);
2666
+ const updateController = new UpdateController;
2667
+ updateController.initialize(this.viewer);
2668
+ visViewer.memoryLimit = this.viewer.options.memoryLimit;
2717
2669
  const chunkLoadHandler = (progress, chunk, requestId = 0) => {
2718
2670
  if (!this.viewer.visualizeJs) return;
2719
2671
  const state = visViewer.parseVsfxInPartialMode(requestId, chunk);
2720
- updaterController.update(UpdateType.kDelay);
2672
+ updateController.update(UpdateType.kDelay);
2721
2673
  this.viewer.emitEvent({
2722
2674
  type: "geometryprogress",
2723
2675
  data: progress,
2724
- model: this.model
2676
+ file: model.file,
2677
+ model: model
2725
2678
  });
2726
2679
  if (state) {
2727
- updaterController.update(UpdateType.kForce);
2680
+ updateController.update(UpdateType.kForce);
2728
2681
  this.viewer.syncOpenCloudVisualStyle(false);
2729
2682
  this.viewer.syncOptions();
2730
2683
  this.viewer.syncOverlay();
@@ -2732,31 +2685,34 @@ class VsfXPartialLoader extends BaseLoader {
2732
2685
  this.viewer.emitEvent({
2733
2686
  type: "databasechunk",
2734
2687
  data: chunk,
2735
- model: this.model
2688
+ file: model.file,
2689
+ model: model
2736
2690
  });
2737
2691
  } else {
2738
2692
  this.viewer.emitEvent({
2739
2693
  type: "geometrychunk",
2740
2694
  data: chunk,
2741
- model: this.model
2695
+ file: model.file,
2696
+ model: model
2742
2697
  });
2743
2698
  }
2744
2699
  };
2745
2700
  const downloadResourceRange = async (dataId, requestId, ranges) => {
2746
2701
  const abortCtrl = new AbortController;
2747
- abortControllerForRequestMap.set(requestId, abortCtrl);
2702
+ this.abortControllerForRequestMap.set(requestId, abortCtrl);
2748
2703
  try {
2749
- await this.model.downloadResourceRange(dataId, requestId, ranges, chunkLoadHandler, abortCtrl.signal);
2704
+ await model.downloadResourceRange(dataId, requestId, ranges, chunkLoadHandler, abortCtrl.signal);
2750
2705
  } catch (error) {
2751
2706
  this.viewer.emitEvent({
2752
2707
  type: "geometryerror",
2753
2708
  data: error,
2754
- model: this.model
2709
+ file: model.file,
2710
+ model: model
2755
2711
  });
2756
2712
  } finally {
2757
2713
  ranges.forEach((range => visViewer.onRequestResponseComplete(range.requestId)));
2758
- abortControllerForRequestMap.delete(requestId);
2759
- updaterController.update(UpdateType.kNormal);
2714
+ this.abortControllerForRequestMap.delete(requestId);
2715
+ updateController.update(UpdateType.kNormal);
2760
2716
  }
2761
2717
  };
2762
2718
  const requestRecordsToRanges = (requestId, records) => {
@@ -2776,26 +2732,26 @@ class VsfXPartialLoader extends BaseLoader {
2776
2732
  onServicePartReceived: bHasIndex => {
2777
2733
  if (bHasIndex) {
2778
2734
  servicePartAborted = true;
2779
- abortController.abort();
2735
+ this.abortController.abort();
2780
2736
  }
2781
2737
  },
2782
2738
  onRequest: (requestId, records) => {
2783
2739
  const ranges = requestRecordsToRanges(requestId, records);
2784
- downloadResourceRange(this.model.database, requestId, ranges);
2740
+ downloadResourceRange(model.database, requestId, ranges);
2785
2741
  },
2786
2742
  onFullLoaded: () => {
2787
- updaterController.update(UpdateType.kNormal);
2743
+ updateController.update(UpdateType.kNormal);
2788
2744
  },
2789
2745
  onRequestResponseParsed: requestId => {
2790
- abortControllerForRequestMap.delete(requestId);
2791
- updaterController.update(UpdateType.kNormal);
2746
+ this.abortControllerForRequestMap.delete(requestId);
2747
+ updateController.update(UpdateType.kNormal);
2792
2748
  },
2793
2749
  onRequestAborted: requestId => {
2794
- const abortCtrl = abortControllerForRequestMap.get(requestId);
2750
+ const abortCtrl = this.abortControllerForRequestMap.get(requestId);
2795
2751
  if (abortCtrl) abortCtrl.abort();
2796
2752
  },
2797
2753
  onRequestResourceFile: (requestId, _, records) => {
2798
- const dataId = `${this.model.fileId}${this.model.file.type}`;
2754
+ const dataId = `${model.fileId}${model.file.type}`;
2799
2755
  const ranges = requestRecordsToRanges(requestId, records);
2800
2756
  let pendingRanges = [];
2801
2757
  let requestNumber = 0;
@@ -2851,45 +2807,109 @@ class VsfXPartialLoader extends BaseLoader {
2851
2807
  };
2852
2808
  visViewer.attachPartialResolver(objectHandler);
2853
2809
  try {
2854
- this.viewer.emitEvent({
2855
- type: "geometrystart",
2856
- model: this.model
2857
- });
2858
- await this.model.downloadResource(this.model.database, chunkLoadHandler, abortController.signal).catch((e => {
2859
- if (!servicePartAborted) throw e;
2860
- }));
2861
- this.viewer.emitEvent({
2862
- type: "geometryend",
2863
- model: this.model
2864
- });
2810
+ await model.downloadResource(model.database, chunkLoadHandler, this.abortController.signal);
2865
2811
  } catch (e) {
2866
- if (pendingRequestsTimerId) {
2867
- window.clearTimeout(pendingRequestsTimerId);
2868
- pendingRequestsTimerId = 0;
2869
- }
2870
- this.viewer.emitEvent({
2871
- type: "geometryerror",
2872
- data: e,
2873
- model: this.model
2874
- });
2875
- throw e;
2812
+ window.clearTimeout(pendingRequestsTimerId);
2813
+ if (!servicePartAborted) throw e;
2876
2814
  }
2815
+ return this;
2816
+ }
2817
+ cancel() {
2818
+ super.cancel();
2819
+ this.abortControllerForRequestMap.forEach((controller => controller.abort()));
2877
2820
  }
2878
2821
  }
2879
2822
 
2880
- class LoaderFactory {
2881
- create(viewer, model, options) {
2882
- const geometryType = model.database.split(".").pop();
2883
- if (model.geometry.length === 0 && geometryType === "vsfx") {
2884
- if (!options.enableStreamingMode) return new VsfXLoader(viewer, model, options); else if (options.enablePartialMode) return new VsfXPartialLoader(viewer, model, options); else return new VsfXStreamingLoader(viewer, model, options);
2885
- }
2886
- if (geometryType === "data") {
2887
- return new TCSLoader(viewer, model, options);
2823
+ class VSFXBufferLoader extends Loader {
2824
+ constructor(viewer) {
2825
+ super();
2826
+ this.viewer = viewer;
2827
+ }
2828
+ isSupport(file, format) {
2829
+ return file instanceof ArrayBuffer && /vsfx$/i.test(format);
2830
+ }
2831
+ load(buffer, format) {
2832
+ if (!this.viewer.visualizeJs) return Promise.resolve(this);
2833
+ const visLib = this.viewer.visLib();
2834
+ const visViewer = visLib.getViewer();
2835
+ const data = new Uint8Array(buffer);
2836
+ visViewer.parseVsfx(data);
2837
+ this.viewer.syncOpenCloudVisualStyle(false);
2838
+ this.viewer.syncOptions();
2839
+ this.viewer.syncOverlay();
2840
+ this.viewer.resize();
2841
+ this.viewer.emitEvent({
2842
+ type: "geometryprogress",
2843
+ data: 1,
2844
+ file: buffer
2845
+ });
2846
+ this.viewer.emitEvent({
2847
+ type: "databasechunk",
2848
+ data: data,
2849
+ file: buffer
2850
+ });
2851
+ return Promise.resolve(this);
2852
+ }
2853
+ }
2854
+
2855
+ const loaders = loadersRegistry("visualizejs");
2856
+
2857
+ loaders.registerLoader("vsf", (viewer => new VSFModelLoader(viewer)));
2858
+
2859
+ loaders.registerLoader("vsf-buffer", (viewer => new VSFBufferLoader(viewer)));
2860
+
2861
+ loaders.registerLoader("vsfx", (viewer => new VSFXModelLoader(viewer)));
2862
+
2863
+ loaders.registerLoader("vsfx-streaming", (viewer => new VSFXStreamingLoader(viewer)));
2864
+
2865
+ loaders.registerLoader("vsfx-partial", (viewer => new VSFXPartialLoader(viewer)));
2866
+
2867
+ loaders.registerLoader("vsfx-buffer", (viewer => new VSFXBufferLoader(viewer)));
2868
+
2869
+ function loadScript(url, params = {}) {
2870
+ return new Promise(((resolve, reject) => {
2871
+ const script = document.createElement("script");
2872
+ script.src = url;
2873
+ script.async = true;
2874
+ script.crossOrigin = params.crossOrigin;
2875
+ script.onload = () => resolve(script);
2876
+ script.onerror = () => {
2877
+ script.remove();
2878
+ reject(new Error(`GET ${url} failed to load script`));
2879
+ };
2880
+ document.body.appendChild(script);
2881
+ }));
2882
+ }
2883
+
2884
+ function loadVisuazlizeJsScript(url, params) {
2885
+ if (window["getVisualizeLibInst"]) {
2886
+ const script = window["getVisualizeLibInst"].script;
2887
+ if (script) {
2888
+ if (script.src === url) return Promise.resolve(script);
2889
+ script.remove();
2888
2890
  }
2889
- throw new Error(`Unknown geometry type: ${geometryType}`);
2891
+ delete window["getVisualizeLibInst"];
2890
2892
  }
2893
+ return loadScript(url, params);
2891
2894
  }
2892
2895
 
2896
+ const loadVisualizeJs = async (url, onprogress, params = {}) => {
2897
+ const script = await loadVisuazlizeJsScript(url, params);
2898
+ return await new Promise(((resolve, reject) => {
2899
+ const options = {
2900
+ urlMemFile: url + ".wasm",
2901
+ TOTAL_MEMORY: 134217728,
2902
+ onprogress: onprogress
2903
+ };
2904
+ const instance = window["getVisualizeLibInst"](options);
2905
+ instance.loadWasmError = reject;
2906
+ instance.postRun.push((() => {
2907
+ window["getVisualizeLibInst"].script = script;
2908
+ resolve(instance);
2909
+ }));
2910
+ }));
2911
+ };
2912
+
2893
2913
  const MARKUP_ENTITY_LINE = "$MarkupTempEntity_Line";
2894
2914
 
2895
2915
  class OdaLineDragger extends OdBaseDragger {
@@ -3228,6 +3248,7 @@ class Viewer extends EventEmitter2 {
3228
3248
  this.configure(params);
3229
3249
  this._options = new Options(this);
3230
3250
  this.client = client;
3251
+ this.loaders = [];
3231
3252
  this._activeDragger = null;
3232
3253
  this._components = [];
3233
3254
  this._renderTime = 0;
@@ -3714,6 +3735,7 @@ class Viewer extends EventEmitter2 {
3714
3735
  var _a;
3715
3736
  if (!this.visualizeJs) return this;
3716
3737
  if (!this.client) return this;
3738
+ if (!model.getReferences) return this;
3717
3739
  const abortController = new AbortController;
3718
3740
  (_a = this._abortControllerForReferences) === null || _a === undefined ? undefined : _a.abort();
3719
3741
  this._abortControllerForReferences = abortController;
@@ -3741,32 +3763,49 @@ class Viewer extends EventEmitter2 {
3741
3763
  device.delete();
3742
3764
  this.update();
3743
3765
  }
3744
- async open(file) {
3766
+ async open(file, params = {}) {
3745
3767
  if (!this.visualizeJs) return this;
3746
3768
  this.cancel();
3747
3769
  this.clear();
3748
3770
  this.emitEvent({
3749
3771
  type: "open",
3772
+ file: file
3773
+ });
3774
+ let model = file;
3775
+ if (model && typeof model.getModels === "function") {
3776
+ const models = await model.getModels();
3777
+ model = models.find((model => model.default)) || models[0] || file;
3778
+ }
3779
+ if (!model) throw new Error(`Format not supported`);
3780
+ let format = params.format;
3781
+ if (!format && typeof model.type === "string") format = model.type.split(".").pop();
3782
+ if (!format && typeof file === "string") format = file.split(".").pop();
3783
+ if (!format && file instanceof globalThis.File) format = file.name.split(".").pop();
3784
+ const loader = loaders.createLoader(this, model, format);
3785
+ if (!loader) throw new Error(`Format not supported`);
3786
+ this.loaders.push(loader);
3787
+ this.emitEvent({
3788
+ type: "geometrystart",
3750
3789
  file: file,
3751
- model: file
3790
+ model: model
3791
+ });
3792
+ try {
3793
+ await this.loadReferences(model);
3794
+ await loader.load(model, format, params);
3795
+ } catch (error) {
3796
+ this.emitEvent({
3797
+ type: "geometryerror",
3798
+ data: error,
3799
+ file: file,
3800
+ model: model
3801
+ });
3802
+ throw error;
3803
+ }
3804
+ this.emitEvent({
3805
+ type: "geometryend",
3806
+ file: file,
3807
+ model: model
3752
3808
  });
3753
- let model = undefined;
3754
- if (file) {
3755
- const models = await file.getModels() || [];
3756
- model = models.find((model => model.default)) || models[0];
3757
- }
3758
- if (!model) throw new Error("No default model found");
3759
- const overrideOptions = new Options;
3760
- overrideOptions.data = this._options.data;
3761
- if (file.type === ".rcs" && !overrideOptions.enablePartialMode) {
3762
- console.log("Partial streaming mode is forced for RCS file");
3763
- overrideOptions.enableStreamingMode = true;
3764
- overrideOptions.enablePartialMode = true;
3765
- }
3766
- const loaderFactory = new LoaderFactory;
3767
- const loader = loaderFactory.create(this, model, overrideOptions);
3768
- await this.loadReferences(model);
3769
- await loader.load();
3770
3809
  if (this.visualizeJs) {
3771
3810
  this.applyModelTransformMatrix(model);
3772
3811
  this.applySceneGraphSettings();
@@ -3779,15 +3818,15 @@ class Viewer extends EventEmitter2 {
3779
3818
  this.clear();
3780
3819
  this.emitEvent({
3781
3820
  type: "open",
3782
- buffer: buffer
3821
+ file: buffer
3822
+ });
3823
+ const visLib = this.visLib();
3824
+ const visViewer = visLib.getViewer();
3825
+ this.emitEvent({
3826
+ type: "geometrystart",
3827
+ file: buffer
3783
3828
  });
3784
3829
  try {
3785
- this.emitEvent({
3786
- type: "geometrystart",
3787
- buffer: buffer
3788
- });
3789
- const visLib = this.visLib();
3790
- const visViewer = visLib.getViewer();
3791
3830
  const data = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
3792
3831
  visViewer.parseFile(data);
3793
3832
  this.syncOpenCloudVisualStyle(false);
@@ -3797,25 +3836,25 @@ class Viewer extends EventEmitter2 {
3797
3836
  this.emitEvent({
3798
3837
  type: "geometryprogress",
3799
3838
  data: 1,
3800
- buffer: buffer
3839
+ file: buffer
3801
3840
  });
3802
3841
  this.emitEvent({
3803
3842
  type: "databasechunk",
3804
3843
  data: data,
3805
- buffer: buffer
3806
- });
3807
- this.emitEvent({
3808
- type: "geometryend",
3809
- buffer: buffer
3844
+ file: buffer
3810
3845
  });
3811
3846
  } catch (error) {
3812
3847
  this.emitEvent({
3813
3848
  type: "geometryerror",
3814
3849
  data: error,
3815
- buffer: buffer
3850
+ file: buffer
3816
3851
  });
3817
3852
  throw error;
3818
3853
  }
3854
+ this.emitEvent({
3855
+ type: "geometryend",
3856
+ file: buffer
3857
+ });
3819
3858
  return this;
3820
3859
  }
3821
3860
  openVsfxFile(buffer) {
@@ -3824,15 +3863,15 @@ class Viewer extends EventEmitter2 {
3824
3863
  this.clear();
3825
3864
  this.emitEvent({
3826
3865
  type: "open",
3827
- buffer: buffer
3866
+ file: buffer
3867
+ });
3868
+ const visLib = this.visLib();
3869
+ const visViewer = visLib.getViewer();
3870
+ this.emitEvent({
3871
+ type: "geometrystart",
3872
+ file: buffer
3828
3873
  });
3829
3874
  try {
3830
- this.emitEvent({
3831
- type: "geometrystart",
3832
- buffer: buffer
3833
- });
3834
- const visLib = this.visLib();
3835
- const visViewer = visLib.getViewer();
3836
3875
  const data = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
3837
3876
  visViewer.parseVsfx(data);
3838
3877
  this.syncOpenCloudVisualStyle(false);
@@ -3842,35 +3881,32 @@ class Viewer extends EventEmitter2 {
3842
3881
  this.emitEvent({
3843
3882
  type: "geometryprogress",
3844
3883
  data: 1,
3845
- buffer: buffer
3884
+ file: buffer
3846
3885
  });
3847
3886
  this.emitEvent({
3848
3887
  type: "databasechunk",
3849
3888
  data: data,
3850
- buffer: buffer
3851
- });
3852
- this.emitEvent({
3853
- type: "geometryend",
3854
- buffer: buffer
3889
+ file: buffer
3855
3890
  });
3856
3891
  } catch (error) {
3857
3892
  this.emitEvent({
3858
3893
  type: "geometryerror",
3859
3894
  data: error,
3860
- buffer: buffer
3895
+ file: buffer
3861
3896
  });
3862
3897
  throw error;
3863
3898
  }
3899
+ this.emitEvent({
3900
+ type: "geometryend",
3901
+ file: buffer
3902
+ });
3864
3903
  return this;
3865
3904
  }
3866
3905
  cancel() {
3867
- var _a, _b, _c;
3906
+ var _a;
3868
3907
  (_a = this._abortControllerForReferences) === null || _a === undefined ? undefined : _a.abort();
3869
3908
  this._abortControllerForReferences = undefined;
3870
- (_b = this._abortController) === null || _b === undefined ? undefined : _b.abort();
3871
- this._abortController = undefined;
3872
- (_c = this._abortControllerForRequestMap) === null || _c === undefined ? undefined : _c.forEach((controller => controller.abort()));
3873
- this._abortControllerForRequestMap = undefined;
3909
+ this.loaders.forEach((loader => loader.cancel()));
3874
3910
  this.emitEvent({
3875
3911
  type: "cancel"
3876
3912
  });
@@ -3886,6 +3922,8 @@ class Viewer extends EventEmitter2 {
3886
3922
  this.clearSelected();
3887
3923
  visViewer.clear();
3888
3924
  visViewer.createLocalDatabase();
3925
+ this.loaders.forEach((loader => loader.dispose()));
3926
+ this.loaders = [];
3889
3927
  this.syncOpenCloudVisualStyle(true);
3890
3928
  this.syncOptions();
3891
3929
  this.syncOverlay();
@@ -4037,5 +4075,5 @@ class Viewer extends EventEmitter2 {
4037
4075
  }
4038
4076
  }
4039
4077
 
4040
- export { OdBaseDragger, Viewer, commands, components, draggers };
4078
+ export { OdBaseDragger, Viewer, commands, components, draggers, loaders };
4041
4079
  //# sourceMappingURL=viewer-visualize.module.js.map