@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.
- package/dist/viewer-visualize.js +18183 -18012
- package/dist/viewer-visualize.js.map +1 -1
- package/dist/viewer-visualize.min.js +1 -1
- package/dist/viewer-visualize.module.js +335 -297
- package/dist/viewer-visualize.module.js.map +1 -1
- package/lib/Viewer/Loaders/{UpdaterController.d.ts → UpdateController.d.ts} +1 -1
- package/lib/Viewer/Loaders/VSFBufferLoader.d.ts +8 -0
- package/lib/Viewer/Loaders/VSFModelLoader.d.ts +8 -0
- package/lib/Viewer/Loaders/VSFXBufferLoader.d.ts +8 -0
- package/lib/Viewer/Loaders/VSFXModelLoader.d.ts +8 -0
- package/lib/Viewer/Loaders/VSFXPartialLoader.d.ts +10 -0
- package/lib/Viewer/Loaders/VSFXStreamingLoader.d.ts +8 -0
- package/lib/Viewer/Loaders/index.d.ts +67 -0
- package/lib/Viewer/Viewer.d.ts +7 -59
- package/lib/index.d.ts +3 -2
- package/package.json +5 -5
- package/src/Viewer/Loaders/{BaseLoader.ts → UpdateController.ts} +30 -10
- package/src/Viewer/Loaders/{LoaderFactory.ts → VSFBufferLoader.ts} +28 -19
- package/src/Viewer/Loaders/VSFModelLoader.ts +87 -0
- package/src/Viewer/Loaders/VSFXBufferLoader.ts +58 -0
- package/src/Viewer/Loaders/{VsfXLoader.ts → VSFXModelLoader.ts} +35 -35
- package/src/Viewer/Loaders/{VsfXPartialLoader.ts → VSFXPartialLoader.ts} +55 -45
- package/src/Viewer/Loaders/{VsfXStreamingLoader.ts → VSFXStreamingLoader.ts} +35 -25
- package/src/Viewer/Loaders/index.ts +108 -0
- package/src/Viewer/Viewer.ts +53 -103
- package/src/index.ts +6 -3
- package/lib/Viewer/Loaders/BaseLoader.d.ts +0 -10
- package/lib/Viewer/Loaders/LoaderFactory.d.ts +0 -10
- package/lib/Viewer/Loaders/TCSLoader.d.ts +0 -4
- package/lib/Viewer/Loaders/VsfXLoader.d.ts +0 -4
- package/lib/Viewer/Loaders/VsfXPartialLoader.d.ts +0 -4
- package/lib/Viewer/Loaders/VsfXStreamingLoader.d.ts +0 -4
- package/src/Viewer/Loaders/TCSLoader.ts +0 -83
- 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
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
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
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
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
|
|
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
|
-
|
|
2487
|
-
|
|
2488
|
-
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
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
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
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
|
|
2544
|
-
|
|
2545
|
-
|
|
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
|
|
2549
|
-
|
|
2550
|
-
|
|
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
|
-
|
|
2528
|
+
file: model.file,
|
|
2529
|
+
model: model
|
|
2555
2530
|
});
|
|
2556
2531
|
};
|
|
2557
2532
|
console.time("File load time");
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
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
|
|
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
|
|
2629
|
-
|
|
2630
|
-
|
|
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
|
|
2634
|
-
|
|
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
|
-
|
|
2602
|
+
updateController.update(UpdateType.kDelay);
|
|
2642
2603
|
this.viewer.emitEvent({
|
|
2643
2604
|
type: "geometryprogress",
|
|
2644
2605
|
data: progress,
|
|
2645
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2630
|
+
file: model.file,
|
|
2631
|
+
model: model
|
|
2668
2632
|
});
|
|
2669
2633
|
}
|
|
2670
2634
|
};
|
|
2671
2635
|
console.time("File load time");
|
|
2672
|
-
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
|
|
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
|
|
2700
|
-
|
|
2701
|
-
|
|
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
|
|
2713
|
-
|
|
2714
|
-
this.viewer.
|
|
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
|
-
|
|
2672
|
+
updateController.update(UpdateType.kDelay);
|
|
2721
2673
|
this.viewer.emitEvent({
|
|
2722
2674
|
type: "geometryprogress",
|
|
2723
2675
|
data: progress,
|
|
2724
|
-
|
|
2676
|
+
file: model.file,
|
|
2677
|
+
model: model
|
|
2725
2678
|
});
|
|
2726
2679
|
if (state) {
|
|
2727
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
2740
|
+
downloadResourceRange(model.database, requestId, ranges);
|
|
2785
2741
|
},
|
|
2786
2742
|
onFullLoaded: () => {
|
|
2787
|
-
|
|
2743
|
+
updateController.update(UpdateType.kNormal);
|
|
2788
2744
|
},
|
|
2789
2745
|
onRequestResponseParsed: requestId => {
|
|
2790
|
-
abortControllerForRequestMap.delete(requestId);
|
|
2791
|
-
|
|
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 = `${
|
|
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.
|
|
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
|
-
|
|
2867
|
-
|
|
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
|
|
2881
|
-
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
2887
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
3839
|
+
file: buffer
|
|
3801
3840
|
});
|
|
3802
3841
|
this.emitEvent({
|
|
3803
3842
|
type: "databasechunk",
|
|
3804
3843
|
data: data,
|
|
3805
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3884
|
+
file: buffer
|
|
3846
3885
|
});
|
|
3847
3886
|
this.emitEvent({
|
|
3848
3887
|
type: "databasechunk",
|
|
3849
3888
|
data: data,
|
|
3850
|
-
|
|
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
|
-
|
|
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
|
|
3906
|
+
var _a;
|
|
3868
3907
|
(_a = this._abortControllerForReferences) === null || _a === undefined ? undefined : _a.abort();
|
|
3869
3908
|
this._abortControllerForReferences = undefined;
|
|
3870
|
-
|
|
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
|