@inweb/viewer-visualize 26.7.0 → 26.7.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 +207 -40
- package/dist/viewer-visualize.js.map +1 -1
- package/dist/viewer-visualize.min.js +1 -1
- package/dist/viewer-visualize.module.js +124 -27
- package/dist/viewer-visualize.module.js.map +1 -1
- package/lib/Viewer/Draggers/index.d.ts +1 -2
- package/lib/Viewer/Loaders/FileLoader.d.ts +10 -0
- package/lib/Viewer/Loaders/VSFFileLoader.d.ts +8 -0
- package/lib/Viewer/Loaders/VSFXFileLoader.d.ts +8 -0
- package/lib/Viewer/Loaders/index.d.ts +2 -3
- package/lib/Viewer/Viewer.d.ts +63 -12
- package/lib/index.d.ts +6 -5
- package/package.json +5 -5
- package/src/Viewer/Draggers/index.ts +1 -3
- package/src/Viewer/Loaders/FileLoader.ts +108 -0
- package/src/Viewer/Loaders/{VSFBufferLoader.ts → VSFFileLoader.ts} +25 -9
- package/src/Viewer/Loaders/{VSFXBufferLoader.ts → VSFXFileLoader.ts} +25 -9
- package/src/Viewer/Loaders/index.ts +6 -7
- package/src/Viewer/Viewer.ts +83 -18
- package/src/index.ts +6 -5
- package/lib/Viewer/Loaders/VSFBufferLoader.d.ts +0 -8
- package/lib/Viewer/Loaders/VSFXBufferLoader.d.ts +0 -8
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class FileLoader {
|
|
2
|
+
private requestHeader;
|
|
3
|
+
private withCredentials;
|
|
4
|
+
private abortSignal;
|
|
5
|
+
constructor();
|
|
6
|
+
setRequestHeader(requestHeader: HeadersInit): void;
|
|
7
|
+
setWithCredentials(withCredentials: boolean): void;
|
|
8
|
+
setAbortSignal(abortSignal: AbortSignal): void;
|
|
9
|
+
load(file: any, onProgress?: (event: any) => void): Promise<ArrayBuffer>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Loader, LoadParams } from "@inweb/viewer-core";
|
|
2
|
+
import { Viewer } from "../Viewer";
|
|
3
|
+
export declare class VSFFileLoader extends Loader {
|
|
4
|
+
viewer: Viewer;
|
|
5
|
+
constructor(viewer: Viewer);
|
|
6
|
+
isSupport(file: any, format?: string): boolean;
|
|
7
|
+
load(file: any, format?: string, params?: LoadParams): Promise<this>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Loader, LoadParams } from "@inweb/viewer-core";
|
|
2
|
+
import { Viewer } from "../Viewer";
|
|
3
|
+
export declare class VSFXFileLoader extends Loader {
|
|
4
|
+
viewer: Viewer;
|
|
5
|
+
constructor(viewer: Viewer);
|
|
6
|
+
isSupport(file: any, format?: string): boolean;
|
|
7
|
+
load(file: any, format?: string, params?: LoadParams): Promise<this>;
|
|
8
|
+
}
|
|
@@ -27,8 +27,7 @@ import { ILoadersRegistry } from "@inweb/viewer-core";
|
|
|
27
27
|
* @example Implementing a custom loader.
|
|
28
28
|
*
|
|
29
29
|
* ```javascript
|
|
30
|
-
* import { Loader } from "@inweb/viewer-
|
|
31
|
-
* import { loaders, Viewer } from "@inweb/viewer-visualize";
|
|
30
|
+
* import { Loader, loaders, Viewer } from "@inweb/viewer-visualize";
|
|
32
31
|
*
|
|
33
32
|
* class MyLoader extends Loader {
|
|
34
33
|
* public viewer: Viewer;
|
|
@@ -55,7 +54,7 @@ import { ILoadersRegistry } from "@inweb/viewer-core";
|
|
|
55
54
|
* this.viewer.syncOverlay();
|
|
56
55
|
* this.viewer.resize();
|
|
57
56
|
*
|
|
58
|
-
* this.viewer.emitEvent({ type: "databasechunk", data
|
|
57
|
+
* this.viewer.emitEvent({ type: "databasechunk", data, file });
|
|
59
58
|
*
|
|
60
59
|
* return Promise.resove(this);
|
|
61
60
|
* };
|
package/lib/Viewer/Viewer.d.ts
CHANGED
|
@@ -199,33 +199,84 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
|
|
|
199
199
|
loadReferences(model: Model | File | Assembly): Promise<this>;
|
|
200
200
|
applyModelTransformMatrix(model: Model | Assembly): void;
|
|
201
201
|
applySceneGraphSettings(options?: IOptions): void;
|
|
202
|
-
open(file: FileSource, params?: {
|
|
203
|
-
format?: string;
|
|
204
|
-
mode?: string;
|
|
205
|
-
}): Promise<this>;
|
|
206
|
-
/**
|
|
207
|
-
* Deprecated since `26.4`. Use {@link open | open()} instead.
|
|
208
|
-
*/
|
|
209
|
-
openVsfFile(buffer: Uint8Array | ArrayBuffer): this;
|
|
210
202
|
/**
|
|
211
|
-
* Loads a
|
|
203
|
+
* Loads a file into the viewer.
|
|
204
|
+
*
|
|
205
|
+
* The viewer must be {@link initialize | initialized} before opening the file. Otherwise, `open()` does
|
|
206
|
+
* nothing.
|
|
207
|
+
*
|
|
208
|
+
* This method requires a `Client` instance to be specified to load file from the Open Cloud Server.
|
|
209
|
+
* The file geometry data on the Open Cloud Server must be converted into a `vsfx` format, otherwise an
|
|
210
|
+
* exception will be thrown.
|
|
211
|
+
*
|
|
212
|
+
* For files from Open Cloud Server, the default model will be loaded. If there is no default model,
|
|
213
|
+
* first availiable model will be loaded. If no models are found in the file, an exception will be
|
|
214
|
+
* thrown.
|
|
212
215
|
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
216
|
+
* For URLs, the file extension is used to determine the file format. For a `ArrayBuffer` and `Data
|
|
217
|
+
* URL`, a file format must be specified using `params.format` parameter (see below). If no appropriate
|
|
218
|
+
* loader is found for the specified format, an exception will be thrown.
|
|
215
219
|
*
|
|
216
220
|
* If there was an active dragger before opening the file, it will be deactivated. After opening the
|
|
217
221
|
* file, you must manually activate the required dragger.
|
|
218
222
|
*
|
|
223
|
+
* To open a large files, enable {@link IOptions.enablePartialMode | partial streaming} mode before
|
|
224
|
+
* opening. Partial streaming is only supported when opening files from an Open Cloud Server, but not
|
|
225
|
+
* local files and URLs. Example:
|
|
226
|
+
*
|
|
227
|
+
* ```javascript
|
|
228
|
+
* viewer.options.enableStreamingMode = true;
|
|
229
|
+
* viewer.options.enablePartialMode = true;
|
|
230
|
+
* await viewer.open(file);
|
|
231
|
+
* ```
|
|
232
|
+
*
|
|
219
233
|
* Fires:
|
|
220
234
|
*
|
|
221
235
|
* - {@link OpenEvent | open}
|
|
222
236
|
* - {@link GeometryStartEvent | geometrystart}
|
|
223
237
|
* - {@link GeometryProgressEvent | geometryprogress}
|
|
224
238
|
* - {@link DatabaseChunkEvent | databasechunk}
|
|
239
|
+
* - {@link GeometryChunkEvent | geometrychunk}
|
|
225
240
|
* - {@link GeometryEndEvent | geometryend}
|
|
226
241
|
* - {@link GeometryErrorEvent | geometryerror}
|
|
227
242
|
*
|
|
228
|
-
* @param
|
|
243
|
+
* @param file - File to load. Can be one of:
|
|
244
|
+
*
|
|
245
|
+
* - `File`, `Assembly` or `Model` instance from the Open Cloud Server
|
|
246
|
+
* - File `URL` string
|
|
247
|
+
* - {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string
|
|
248
|
+
* - {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object
|
|
249
|
+
* - {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}
|
|
250
|
+
* object
|
|
251
|
+
*
|
|
252
|
+
* @param params - Loading parameters.
|
|
253
|
+
* @param params.format - File format string. Required when loading a file as `ArrayBuffer` or `Data
|
|
254
|
+
* URL`.
|
|
255
|
+
* @param params.mode - Reserved for future use.
|
|
256
|
+
* @param params.requestHeader - The
|
|
257
|
+
* {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used in HTTP
|
|
258
|
+
* request.
|
|
259
|
+
* @param params.withCredentials - Whether the HTTP request uses credentials such as cookies,
|
|
260
|
+
* authorization headers or TLS client certificates. See
|
|
261
|
+
* {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}
|
|
262
|
+
* for more details.
|
|
263
|
+
*/
|
|
264
|
+
open(file: FileSource, params?: {
|
|
265
|
+
format?: string;
|
|
266
|
+
mode?: string;
|
|
267
|
+
requestHeader?: HeadersInit;
|
|
268
|
+
withCredentials?: boolean;
|
|
269
|
+
}): Promise<this>;
|
|
270
|
+
/**
|
|
271
|
+
* Deprecated since `26.4`. Use {@link open | open()} instead.
|
|
272
|
+
*
|
|
273
|
+
* @deprecated
|
|
274
|
+
*/
|
|
275
|
+
openVsfFile(buffer: Uint8Array | ArrayBuffer): this;
|
|
276
|
+
/**
|
|
277
|
+
* Deprecated since `26.4`. Use {@link open | open()} instead.
|
|
278
|
+
*
|
|
279
|
+
* @deprecated
|
|
229
280
|
*/
|
|
230
281
|
openVsfxFile(buffer: Uint8Array | ArrayBuffer): this;
|
|
231
282
|
cancel(): this;
|
package/lib/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
1
|
+
export * from "./Viewer/Draggers";
|
|
2
|
+
export * from "./Viewer/Commands";
|
|
3
|
+
export * from "./Viewer/Components";
|
|
4
|
+
export * from "./Viewer/Loaders";
|
|
5
|
+
export * from "./Viewer/Loaders/FileLoader";
|
|
6
|
+
export * from "./Viewer/Viewer";
|
|
6
7
|
export { OdBaseDragger } from "./Viewer/Draggers/Common/OdBaseDragger";
|
|
7
8
|
export { MarkupType } from "./Viewer/Markup/MarkupFactory";
|
|
8
9
|
export * from "@inweb/viewer-core";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inweb/viewer-visualize",
|
|
3
|
-
"version": "26.7.
|
|
3
|
+
"version": "26.7.2",
|
|
4
4
|
"description": "JavaScript library for rendering CAD and BIM files in a browser using VisualizeJS",
|
|
5
5
|
"homepage": "https://cloud.opendesign.com/docs/index.html",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -29,10 +29,10 @@
|
|
|
29
29
|
"docs": "typedoc"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@inweb/client": "~26.7.
|
|
33
|
-
"@inweb/eventemitter2": "~26.7.
|
|
34
|
-
"@inweb/markup": "~26.7.
|
|
35
|
-
"@inweb/viewer-core": "~26.7.
|
|
32
|
+
"@inweb/client": "~26.7.2",
|
|
33
|
+
"@inweb/eventemitter2": "~26.7.2",
|
|
34
|
+
"@inweb/markup": "~26.7.2",
|
|
35
|
+
"@inweb/viewer-core": "~26.7.2"
|
|
36
36
|
},
|
|
37
37
|
"visualizeJS": "https://public-fhemb7e3embacwec.z02.azurefd.net/libs/visualizejs/master/Visualize.js"
|
|
38
38
|
}
|
|
@@ -78,7 +78,7 @@ import { OrbitAroundBuildingDragger } from "./OrbitAroundBuildingDragger";
|
|
|
78
78
|
* viewer.setActiveDragger("MyDragger");
|
|
79
79
|
* ```
|
|
80
80
|
*/
|
|
81
|
-
const draggers: IDraggersRegistry = draggersRegistry("visualizejs");
|
|
81
|
+
export const draggers: IDraggersRegistry = draggersRegistry("visualizejs");
|
|
82
82
|
|
|
83
83
|
// build-in draggers
|
|
84
84
|
|
|
@@ -93,5 +93,3 @@ draggers.registerDragger("CuttingPlaneXAxis", (viewer) => new OdCuttingPlaneXAxi
|
|
|
93
93
|
draggers.registerDragger("CuttingPlaneYAxis", (viewer) => new OdCuttingPlaneYAxisDragger(viewer));
|
|
94
94
|
draggers.registerDragger("CuttingPlaneZAxis", (viewer) => new OdCuttingPlaneZAxisDragger(viewer));
|
|
95
95
|
draggers.registerDragger("Walk", (viewer) => new OdaWalkDragger(viewer));
|
|
96
|
-
|
|
97
|
-
export { draggers };
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
3
|
+
// All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This software and its documentation and related materials are owned by
|
|
6
|
+
// the Alliance. The software may only be incorporated into application
|
|
7
|
+
// programs owned by members of the Alliance, subject to a signed
|
|
8
|
+
// Membership Agreement and Supplemental Software License Agreement with the
|
|
9
|
+
// Alliance. The structure and organization of this software are the valuable
|
|
10
|
+
// trade secrets of the Alliance and its suppliers. The software is also
|
|
11
|
+
// protected by copyright law and international treaty provisions. Application
|
|
12
|
+
// programs incorporating this software must include the following statement
|
|
13
|
+
// with their copyright notices:
|
|
14
|
+
//
|
|
15
|
+
// This application incorporates Open Design Alliance software pursuant to a
|
|
16
|
+
// license agreement with Open Design Alliance.
|
|
17
|
+
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
18
|
+
// All rights reserved.
|
|
19
|
+
//
|
|
20
|
+
// By use of this software, its documentation or related materials, you
|
|
21
|
+
// acknowledge and accept the above terms.
|
|
22
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
23
|
+
|
|
24
|
+
export class FileLoader {
|
|
25
|
+
private requestHeader: HeadersInit;
|
|
26
|
+
private withCredentials: boolean;
|
|
27
|
+
private abortSignal: AbortSignal;
|
|
28
|
+
|
|
29
|
+
constructor() {
|
|
30
|
+
this.requestHeader = {};
|
|
31
|
+
this.withCredentials = false;
|
|
32
|
+
this.abortSignal = undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
setRequestHeader(requestHeader: HeadersInit) {
|
|
36
|
+
this.requestHeader = requestHeader;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
setWithCredentials(withCredentials: boolean) {
|
|
40
|
+
this.withCredentials = withCredentials;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
setAbortSignal(abortSignal: AbortSignal) {
|
|
44
|
+
this.abortSignal = abortSignal;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
load(file: any, onProgress?: (event) => void): Promise<ArrayBuffer> {
|
|
48
|
+
if (typeof file === "string") {
|
|
49
|
+
const request = new Request(file, {
|
|
50
|
+
headers: new Headers(this.requestHeader),
|
|
51
|
+
credentials: this.withCredentials ? "include" : "same-origin",
|
|
52
|
+
signal: this.abortSignal,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
return fetch(request)
|
|
56
|
+
.then((response) => {
|
|
57
|
+
if (!response.ok) throw new Error(`Failed to fetch "${response.url}", status ${response.status}`);
|
|
58
|
+
|
|
59
|
+
const contentLength = response.headers.get("X-File-Size") || response.headers.get("Content-Length");
|
|
60
|
+
const total = parseInt(contentLength || "", 10) || 0;
|
|
61
|
+
const lengthComputable = total > 0;
|
|
62
|
+
|
|
63
|
+
const stream = new ReadableStream({
|
|
64
|
+
async start(controller) {
|
|
65
|
+
const reader = response.body.getReader();
|
|
66
|
+
let loaded = 0;
|
|
67
|
+
try {
|
|
68
|
+
while (true) {
|
|
69
|
+
const { done, value } = await reader.read();
|
|
70
|
+
if (done) break;
|
|
71
|
+
if (onProgress) {
|
|
72
|
+
loaded += value.byteLength;
|
|
73
|
+
onProgress(new ProgressEvent("progress", { lengthComputable, loaded, total }));
|
|
74
|
+
}
|
|
75
|
+
controller.enqueue(value);
|
|
76
|
+
}
|
|
77
|
+
controller.close();
|
|
78
|
+
} catch (e) {
|
|
79
|
+
controller.error(e);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
return new Response(stream);
|
|
85
|
+
})
|
|
86
|
+
.then((response) => response.arrayBuffer());
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (file instanceof globalThis.File) {
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
const reader = new FileReader();
|
|
92
|
+
reader.onload = () => resolve(reader.result as any);
|
|
93
|
+
reader.onerror = () => reject(reader.error);
|
|
94
|
+
reader.onprogress = onProgress;
|
|
95
|
+
reader.readAsArrayBuffer(new Blob([file]));
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (onProgress) {
|
|
100
|
+
const total = (file as ArrayBuffer).byteLength;
|
|
101
|
+
const lengthComputable = total > 0;
|
|
102
|
+
const loaded = total;
|
|
103
|
+
onProgress(new ProgressEvent("progress", { lengthComputable, loaded, total }));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return Promise.resolve(file);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -21,10 +21,11 @@
|
|
|
21
21
|
// acknowledge and accept the above terms.
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
|
-
import { Loader } from "@inweb/viewer-core";
|
|
24
|
+
import { Loader, LoadParams } from "@inweb/viewer-core";
|
|
25
25
|
import { Viewer } from "../Viewer";
|
|
26
|
+
import { FileLoader } from "./FileLoader";
|
|
26
27
|
|
|
27
|
-
export class
|
|
28
|
+
export class VSFFileLoader extends Loader {
|
|
28
29
|
public viewer: Viewer;
|
|
29
30
|
|
|
30
31
|
constructor(viewer: Viewer) {
|
|
@@ -33,16 +34,32 @@ export class VSFBufferLoader extends Loader {
|
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
override isSupport(file: any, format?: string): boolean {
|
|
36
|
-
return
|
|
37
|
+
return (
|
|
38
|
+
(typeof file === "string" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&
|
|
39
|
+
/vsf$/i.test(format)
|
|
40
|
+
);
|
|
37
41
|
}
|
|
38
42
|
|
|
39
|
-
override load(
|
|
40
|
-
if (!this.viewer.visualizeJs) return
|
|
43
|
+
override async load(file: any, format?: string, params?: LoadParams): Promise<this> {
|
|
44
|
+
if (!this.viewer.visualizeJs) return this;
|
|
45
|
+
|
|
46
|
+
const progress = (event: ProgressEvent) => {
|
|
47
|
+
const { lengthComputable, loaded, total } = event;
|
|
48
|
+
const progress = lengthComputable ? loaded / total : 1;
|
|
49
|
+
this.viewer.emitEvent({ type: "geometryprogress", data: progress, file });
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const loader = new FileLoader();
|
|
53
|
+
loader.setRequestHeader(params.requestHeader);
|
|
54
|
+
loader.setWithCredentials(params.withCredentials);
|
|
55
|
+
loader.setAbortSignal(this.abortController.signal);
|
|
56
|
+
|
|
57
|
+
const buffer = await loader.load(file, progress);
|
|
58
|
+
const data = new Uint8Array(buffer);
|
|
41
59
|
|
|
42
60
|
const visLib = this.viewer.visLib();
|
|
43
61
|
const visViewer = visLib.getViewer();
|
|
44
62
|
|
|
45
|
-
const data = new Uint8Array(buffer);
|
|
46
63
|
visViewer.parseFile(data);
|
|
47
64
|
|
|
48
65
|
this.viewer.syncOpenCloudVisualStyle(false);
|
|
@@ -50,9 +67,8 @@ export class VSFBufferLoader extends Loader {
|
|
|
50
67
|
this.viewer.syncOverlay();
|
|
51
68
|
this.viewer.resize();
|
|
52
69
|
|
|
53
|
-
this.viewer.emitEvent({ type: "
|
|
54
|
-
this.viewer.emitEvent({ type: "databasechunk", data, file: buffer });
|
|
70
|
+
this.viewer.emitEvent({ type: "databasechunk", data, file });
|
|
55
71
|
|
|
56
|
-
return
|
|
72
|
+
return this;
|
|
57
73
|
}
|
|
58
74
|
}
|
|
@@ -21,10 +21,11 @@
|
|
|
21
21
|
// acknowledge and accept the above terms.
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
|
-
import { Loader } from "@inweb/viewer-core";
|
|
24
|
+
import { Loader, LoadParams } from "@inweb/viewer-core";
|
|
25
25
|
import { Viewer } from "../Viewer";
|
|
26
|
+
import { FileLoader } from "./FileLoader";
|
|
26
27
|
|
|
27
|
-
export class
|
|
28
|
+
export class VSFXFileLoader extends Loader {
|
|
28
29
|
public viewer: Viewer;
|
|
29
30
|
|
|
30
31
|
constructor(viewer: Viewer) {
|
|
@@ -33,16 +34,32 @@ export class VSFXBufferLoader extends Loader {
|
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
override isSupport(file: any, format?: string): boolean {
|
|
36
|
-
return
|
|
37
|
+
return (
|
|
38
|
+
(typeof file === "string" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&
|
|
39
|
+
/vsfx$/i.test(format)
|
|
40
|
+
);
|
|
37
41
|
}
|
|
38
42
|
|
|
39
|
-
override load(
|
|
40
|
-
if (!this.viewer.visualizeJs) return
|
|
43
|
+
override async load(file: any, format?: string, params?: LoadParams): Promise<this> {
|
|
44
|
+
if (!this.viewer.visualizeJs) return this;
|
|
45
|
+
|
|
46
|
+
const progress = (event: ProgressEvent) => {
|
|
47
|
+
const { lengthComputable, loaded, total } = event;
|
|
48
|
+
const progress = lengthComputable ? loaded / total : 1;
|
|
49
|
+
this.viewer.emitEvent({ type: "geometryprogress", data: progress, file });
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const loader = new FileLoader();
|
|
53
|
+
loader.setRequestHeader(params.requestHeader);
|
|
54
|
+
loader.setWithCredentials(params.withCredentials);
|
|
55
|
+
loader.setAbortSignal(this.abortController.signal);
|
|
56
|
+
|
|
57
|
+
const buffer = await loader.load(file, progress);
|
|
58
|
+
const data = new Uint8Array(buffer);
|
|
41
59
|
|
|
42
60
|
const visLib = this.viewer.visLib();
|
|
43
61
|
const visViewer = visLib.getViewer();
|
|
44
62
|
|
|
45
|
-
const data = new Uint8Array(buffer);
|
|
46
63
|
visViewer.parseVsfx(data);
|
|
47
64
|
|
|
48
65
|
this.viewer.syncOpenCloudVisualStyle(false);
|
|
@@ -50,9 +67,8 @@ export class VSFXBufferLoader extends Loader {
|
|
|
50
67
|
this.viewer.syncOverlay();
|
|
51
68
|
this.viewer.resize();
|
|
52
69
|
|
|
53
|
-
this.viewer.emitEvent({ type: "
|
|
54
|
-
this.viewer.emitEvent({ type: "databasechunk", data, file: buffer });
|
|
70
|
+
this.viewer.emitEvent({ type: "databasechunk", data, file });
|
|
55
71
|
|
|
56
|
-
return
|
|
72
|
+
return this;
|
|
57
73
|
}
|
|
58
74
|
}
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
|
|
24
24
|
import { ILoadersRegistry, loadersRegistry } from "@inweb/viewer-core";
|
|
25
25
|
|
|
26
|
-
import {
|
|
26
|
+
import { VSFFileLoader } from "./VSFFileLoader";
|
|
27
27
|
import { VSFCloudLoader } from "./VSFCloudLoader";
|
|
28
28
|
|
|
29
|
-
import {
|
|
29
|
+
import { VSFXFileLoader } from "./VSFXFileLoader";
|
|
30
30
|
import { VSFXCloudLoader } from "./VSFXCloudLoader";
|
|
31
31
|
import { VSFXCloudStreamingLoader } from "./VSFXCloudStreamingLoader";
|
|
32
32
|
import { VSFXCloudPartialLoader } from "./VSFXCloudPartialLoader";
|
|
@@ -59,8 +59,7 @@ import { VSFXCloudPartialLoader } from "./VSFXCloudPartialLoader";
|
|
|
59
59
|
* @example Implementing a custom loader.
|
|
60
60
|
*
|
|
61
61
|
* ```javascript
|
|
62
|
-
* import { Loader } from "@inweb/viewer-
|
|
63
|
-
* import { loaders, Viewer } from "@inweb/viewer-visualize";
|
|
62
|
+
* import { Loader, loaders, Viewer } from "@inweb/viewer-visualize";
|
|
64
63
|
*
|
|
65
64
|
* class MyLoader extends Loader {
|
|
66
65
|
* public viewer: Viewer;
|
|
@@ -87,7 +86,7 @@ import { VSFXCloudPartialLoader } from "./VSFXCloudPartialLoader";
|
|
|
87
86
|
* this.viewer.syncOverlay();
|
|
88
87
|
* this.viewer.resize();
|
|
89
88
|
*
|
|
90
|
-
* this.viewer.emitEvent({ type: "databasechunk", data
|
|
89
|
+
* this.viewer.emitEvent({ type: "databasechunk", data, file });
|
|
91
90
|
*
|
|
92
91
|
* return Promise.resove(this);
|
|
93
92
|
* };
|
|
@@ -100,10 +99,10 @@ export const loaders: ILoadersRegistry = loadersRegistry("visualizejs");
|
|
|
100
99
|
|
|
101
100
|
// build-in loaders
|
|
102
101
|
|
|
103
|
-
loaders.registerLoader("vsf-
|
|
102
|
+
loaders.registerLoader("vsf-file", (viewer: any) => new VSFFileLoader(viewer));
|
|
104
103
|
loaders.registerLoader("vsf-cloud", (viewer: any) => new VSFCloudLoader(viewer));
|
|
105
104
|
|
|
106
|
-
loaders.registerLoader("vsfx-
|
|
105
|
+
loaders.registerLoader("vsfx-file", (viewer: any) => new VSFXFileLoader(viewer));
|
|
107
106
|
loaders.registerLoader("vsfx-cloud", (viewer: any) => new VSFXCloudLoader(viewer));
|
|
108
107
|
loaders.registerLoader("vsfx-cloud-streaming", (viewer: any) => new VSFXCloudStreamingLoader(viewer));
|
|
109
108
|
loaders.registerLoader("vsfx-cloud-partial", (viewer: any) => new VSFXCloudPartialLoader(viewer));
|
package/src/Viewer/Viewer.ts
CHANGED
|
@@ -851,7 +851,77 @@ export class Viewer
|
|
|
851
851
|
this.update();
|
|
852
852
|
}
|
|
853
853
|
|
|
854
|
-
|
|
854
|
+
/**
|
|
855
|
+
* Loads a file into the viewer.
|
|
856
|
+
*
|
|
857
|
+
* The viewer must be {@link initialize | initialized} before opening the file. Otherwise, `open()` does
|
|
858
|
+
* nothing.
|
|
859
|
+
*
|
|
860
|
+
* This method requires a `Client` instance to be specified to load file from the Open Cloud Server.
|
|
861
|
+
* The file geometry data on the Open Cloud Server must be converted into a `vsfx` format, otherwise an
|
|
862
|
+
* exception will be thrown.
|
|
863
|
+
*
|
|
864
|
+
* For files from Open Cloud Server, the default model will be loaded. If there is no default model,
|
|
865
|
+
* first availiable model will be loaded. If no models are found in the file, an exception will be
|
|
866
|
+
* thrown.
|
|
867
|
+
*
|
|
868
|
+
* For URLs, the file extension is used to determine the file format. For a `ArrayBuffer` and `Data
|
|
869
|
+
* URL`, a file format must be specified using `params.format` parameter (see below). If no appropriate
|
|
870
|
+
* loader is found for the specified format, an exception will be thrown.
|
|
871
|
+
*
|
|
872
|
+
* If there was an active dragger before opening the file, it will be deactivated. After opening the
|
|
873
|
+
* file, you must manually activate the required dragger.
|
|
874
|
+
*
|
|
875
|
+
* To open a large files, enable {@link IOptions.enablePartialMode | partial streaming} mode before
|
|
876
|
+
* opening. Partial streaming is only supported when opening files from an Open Cloud Server, but not
|
|
877
|
+
* local files and URLs. Example:
|
|
878
|
+
*
|
|
879
|
+
* ```javascript
|
|
880
|
+
* viewer.options.enableStreamingMode = true;
|
|
881
|
+
* viewer.options.enablePartialMode = true;
|
|
882
|
+
* await viewer.open(file);
|
|
883
|
+
* ```
|
|
884
|
+
*
|
|
885
|
+
* Fires:
|
|
886
|
+
*
|
|
887
|
+
* - {@link OpenEvent | open}
|
|
888
|
+
* - {@link GeometryStartEvent | geometrystart}
|
|
889
|
+
* - {@link GeometryProgressEvent | geometryprogress}
|
|
890
|
+
* - {@link DatabaseChunkEvent | databasechunk}
|
|
891
|
+
* - {@link GeometryChunkEvent | geometrychunk}
|
|
892
|
+
* - {@link GeometryEndEvent | geometryend}
|
|
893
|
+
* - {@link GeometryErrorEvent | geometryerror}
|
|
894
|
+
*
|
|
895
|
+
* @param file - File to load. Can be one of:
|
|
896
|
+
*
|
|
897
|
+
* - `File`, `Assembly` or `Model` instance from the Open Cloud Server
|
|
898
|
+
* - File `URL` string
|
|
899
|
+
* - {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string
|
|
900
|
+
* - {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object
|
|
901
|
+
* - {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}
|
|
902
|
+
* object
|
|
903
|
+
*
|
|
904
|
+
* @param params - Loading parameters.
|
|
905
|
+
* @param params.format - File format string. Required when loading a file as `ArrayBuffer` or `Data
|
|
906
|
+
* URL`.
|
|
907
|
+
* @param params.mode - Reserved for future use.
|
|
908
|
+
* @param params.requestHeader - The
|
|
909
|
+
* {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used in HTTP
|
|
910
|
+
* request.
|
|
911
|
+
* @param params.withCredentials - Whether the HTTP request uses credentials such as cookies,
|
|
912
|
+
* authorization headers or TLS client certificates. See
|
|
913
|
+
* {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}
|
|
914
|
+
* for more details.
|
|
915
|
+
*/
|
|
916
|
+
async open(
|
|
917
|
+
file: FileSource,
|
|
918
|
+
params: {
|
|
919
|
+
format?: string;
|
|
920
|
+
mode?: string;
|
|
921
|
+
requestHeader?: HeadersInit;
|
|
922
|
+
withCredentials?: boolean;
|
|
923
|
+
} = {}
|
|
924
|
+
): Promise<this> {
|
|
855
925
|
if (!this.visualizeJs) return this;
|
|
856
926
|
|
|
857
927
|
this.cancel();
|
|
@@ -895,8 +965,14 @@ export class Viewer
|
|
|
895
965
|
|
|
896
966
|
/**
|
|
897
967
|
* Deprecated since `26.4`. Use {@link open | open()} instead.
|
|
968
|
+
*
|
|
969
|
+
* @deprecated
|
|
898
970
|
*/
|
|
899
971
|
openVsfFile(buffer: Uint8Array | ArrayBuffer): this {
|
|
972
|
+
console.warn(
|
|
973
|
+
"Viewer.openVsfFile() has been deprecated since 26.4 and will be removed in a future release, use Viewer.open() instead."
|
|
974
|
+
);
|
|
975
|
+
|
|
900
976
|
if (!this.visualizeJs) return this;
|
|
901
977
|
|
|
902
978
|
this.cancel();
|
|
@@ -929,26 +1005,15 @@ export class Viewer
|
|
|
929
1005
|
}
|
|
930
1006
|
|
|
931
1007
|
/**
|
|
932
|
-
*
|
|
933
|
-
*
|
|
934
|
-
* This method does not support {@link IOptions.enableStreamingMode | streaming} or
|
|
935
|
-
* {@link IOptions.enablePartialMode | partial streaming} mode.
|
|
936
|
-
*
|
|
937
|
-
* If there was an active dragger before opening the file, it will be deactivated. After opening the
|
|
938
|
-
* file, you must manually activate the required dragger.
|
|
939
|
-
*
|
|
940
|
-
* Fires:
|
|
941
|
-
*
|
|
942
|
-
* - {@link OpenEvent | open}
|
|
943
|
-
* - {@link GeometryStartEvent | geometrystart}
|
|
944
|
-
* - {@link GeometryProgressEvent | geometryprogress}
|
|
945
|
-
* - {@link DatabaseChunkEvent | databasechunk}
|
|
946
|
-
* - {@link GeometryEndEvent | geometryend}
|
|
947
|
-
* - {@link GeometryErrorEvent | geometryerror}
|
|
1008
|
+
* Deprecated since `26.4`. Use {@link open | open()} instead.
|
|
948
1009
|
*
|
|
949
|
-
* @
|
|
1010
|
+
* @deprecated
|
|
950
1011
|
*/
|
|
951
1012
|
openVsfxFile(buffer: Uint8Array | ArrayBuffer): this {
|
|
1013
|
+
console.warn(
|
|
1014
|
+
"Viewer.openVsfxFile() has been deprecated since 26.4 and will be removed in a future release, use Viewer.open() instead."
|
|
1015
|
+
);
|
|
1016
|
+
|
|
952
1017
|
if (!this.visualizeJs) return this;
|
|
953
1018
|
|
|
954
1019
|
this.cancel();
|
package/src/index.ts
CHANGED
|
@@ -21,11 +21,12 @@
|
|
|
21
21
|
// acknowledge and accept the above terms.
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
|
-
export
|
|
25
|
-
export
|
|
26
|
-
export
|
|
27
|
-
export
|
|
28
|
-
export
|
|
24
|
+
export * from "./Viewer/Draggers";
|
|
25
|
+
export * from "./Viewer/Commands";
|
|
26
|
+
export * from "./Viewer/Components";
|
|
27
|
+
export * from "./Viewer/Loaders";
|
|
28
|
+
export * from "./Viewer/Loaders/FileLoader";
|
|
29
|
+
export * from "./Viewer/Viewer";
|
|
29
30
|
|
|
30
31
|
export { OdBaseDragger } from "./Viewer/Draggers/Common/OdBaseDragger";
|
|
31
32
|
export { MarkupType } from "./Viewer/Markup/MarkupFactory";
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Loader } from "@inweb/viewer-core";
|
|
2
|
-
import { Viewer } from "../Viewer";
|
|
3
|
-
export declare class VSFBufferLoader extends Loader {
|
|
4
|
-
viewer: Viewer;
|
|
5
|
-
constructor(viewer: Viewer);
|
|
6
|
-
isSupport(file: any, format?: string): boolean;
|
|
7
|
-
load(buffer: any, format?: string): Promise<this>;
|
|
8
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Loader } from "@inweb/viewer-core";
|
|
2
|
-
import { Viewer } from "../Viewer";
|
|
3
|
-
export declare class VSFXBufferLoader extends Loader {
|
|
4
|
-
viewer: Viewer;
|
|
5
|
-
constructor(viewer: Viewer);
|
|
6
|
-
isSupport(file: any, format?: string): boolean;
|
|
7
|
-
load(buffer: any, format?: string): Promise<this>;
|
|
8
|
-
}
|