@inweb/viewer-visualize 26.9.0 → 26.9.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.
@@ -5,5 +5,5 @@ export declare class ResizeCanvasComponent implements IComponent {
5
5
  protected resizeObserver: ResizeObserver;
6
6
  constructor(viewer: Viewer);
7
7
  dispose(): void;
8
- resizeViewer: () => void;
8
+ resizeViewer: (entries: ResizeObserverEntry[]) => void;
9
9
  }
@@ -49,10 +49,9 @@ import { ILoadersRegistry } from "@inweb/viewer-core";
49
49
  *
50
50
  * this.viewer.visualizeJs.getViewer().parseVsfx(data);
51
51
  *
52
- * this.viewer.syncOpenCloudVisualStyle(false);
53
52
  * this.viewer.syncOptions();
54
53
  * this.viewer.syncOverlay();
55
- * this.viewer.resize();
54
+ * this.viewer.update();
56
55
  *
57
56
  * this.viewer.emitEvent({ type: "databasechunk", data, file });
58
57
  *
@@ -11,13 +11,14 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
11
11
  private _activeDragger;
12
12
  private _components;
13
13
  private _enableAutoUpdate;
14
- private _isNeedRender;
15
- private _isRunAsyncUpdate;
14
+ private _renderNeeded;
16
15
  private _renderTime;
16
+ private _isRunAsyncUpdate;
17
17
  protected _options: Options;
18
18
  protected _visualizeJsUrl: string;
19
19
  protected _visualizeJs: any;
20
20
  protected _visualizeTimestamp: number;
21
+ protected _viewer: any;
21
22
  protected _crossOrigin: any;
22
23
  private canvaseventlistener;
23
24
  canvasEvents: string[];
@@ -103,7 +104,8 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
103
104
  * Returns `true` if `VisualizeJS` module has been loaded and initialized.
104
105
  */
105
106
  isInitialized(): boolean;
106
- render(time: DOMHighResTimeStamp): void;
107
+ setSize(width: number, height: number, updateStyle?: boolean): void;
108
+ render(time?: DOMHighResTimeStamp): void;
107
109
  resize(): this;
108
110
  /**
109
111
  * Updates the viewer.
@@ -150,7 +152,7 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
150
152
  * instance.
151
153
  */
152
154
  visViewer(): any;
153
- syncOpenCloudVisualStyle(isInitializing: boolean): this;
155
+ syncOpenCloudVisualStyle(): this;
154
156
  syncOptions(options?: IOptions): this;
155
157
  syncHighlightingOptions(options?: IOptions): this;
156
158
  get draggers(): string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inweb/viewer-visualize",
3
- "version": "26.9.0",
3
+ "version": "26.9.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.9.0",
33
- "@inweb/eventemitter2": "~26.9.0",
34
- "@inweb/markup": "~26.9.0",
35
- "@inweb/viewer-core": "~26.9.0"
32
+ "@inweb/client": "~26.9.2",
33
+ "@inweb/eventemitter2": "~26.9.2",
34
+ "@inweb/markup": "~26.9.2",
35
+ "@inweb/viewer-core": "~26.9.2"
36
36
  },
37
37
  "visualizeJS": "https://public-fhemb7e3embacwec.z02.azurefd.net/libs/visualizejs/master/Visualize.js"
38
38
  }
@@ -44,7 +44,7 @@ export function applyModelTransform(viewer: Viewer, model: Model | File | Assemb
44
44
  if (!model.getModelTransformMatrix) return; // Model.getModelTransformMatrix() since 24.3.14
45
45
 
46
46
  const visLib = viewer.visLib();
47
- const visViewer = visLib.getViewer();
47
+ const visViewer = viewer.visViewer();
48
48
 
49
49
  const modelItr = visViewer.getModelIterator();
50
50
  for (; !modelItr.done(); modelItr.step()) {
@@ -37,7 +37,7 @@ export async function autoTransformAllModelsToCentralPoint(
37
37
  if (!model.getModelTransformMatrix) return; // Model.getModelTransformMatrix() since 24.3.14
38
38
 
39
39
  const visLib = viewer.visLib();
40
- const visViewer = visLib.getViewer();
40
+ const visViewer = viewer.visViewer();
41
41
 
42
42
  const viewExt = visViewer.getActiveExtents();
43
43
  const centralPoint = viewExt.center();
@@ -27,7 +27,7 @@ export function setSelected(viewer: Viewer, handles: string[] = []): void {
27
27
  if (!viewer.visualizeJs) return;
28
28
 
29
29
  const visLib = viewer.visLib();
30
- const visViewer = visLib.getViewer();
30
+ const visViewer = viewer.visViewer();
31
31
 
32
32
  const selectionSet = new visLib.OdTvSelectionSet();
33
33
  handles?.forEach((handle) => {
@@ -38,7 +38,11 @@ export class ResizeCanvasComponent implements IComponent {
38
38
  this.resizeObserver.disconnect();
39
39
  }
40
40
 
41
- resizeViewer = () => {
42
- this.viewer.resize();
41
+ resizeViewer = (entries: ResizeObserverEntry[]) => {
42
+ const { width, height } = entries[0].contentRect;
43
+
44
+ if (!width || !height) return; // <- invisible viewer, or viewer with parent removed
45
+
46
+ this.viewer.setSize(width, height);
43
47
  };
44
48
  }
@@ -101,6 +101,12 @@ export class OrbitAction {
101
101
  extView.delete();
102
102
 
103
103
  this._subject.activeDragger()?.updatePreview?.();
104
+ this._subject.emitEvent({
105
+ type: "orbit",
106
+ });
107
+ this._subject.emitEvent({
108
+ type: "changecamera",
109
+ });
104
110
  }
105
111
 
106
112
  public endAction() {
@@ -88,6 +88,9 @@ export class PanAction {
88
88
  dX: absoluteX - this._deltaScreenPosition.x,
89
89
  dY: absoluteY - this._deltaScreenPosition.y,
90
90
  });
91
+ this._subject.emitEvent({
92
+ type: "changecamera",
93
+ });
91
94
 
92
95
  this._deltaScreenPosition = { x: absoluteX, y: absoluteY };
93
96
  }
@@ -37,6 +37,7 @@ export class ZoomAction {
37
37
  viewer.zoomAt(zoomFactor, x, y);
38
38
 
39
39
  this._subject.deviceAutoRegeneration();
40
+
40
41
  this._subject.activeDragger()?.updatePreview?.();
41
42
  this._subject.emitEvent({
42
43
  type: "zoomat",
@@ -44,5 +45,8 @@ export class ZoomAction {
44
45
  x: absoluteX,
45
46
  y: absoluteY,
46
47
  });
48
+ this._subject.emitEvent({
49
+ type: "changecamera",
50
+ });
47
51
  }
48
52
  }
@@ -205,7 +205,9 @@ export class OdaWalkDragger extends OdBaseDragger {
205
205
  break;
206
206
  }
207
207
  }
208
+
208
209
  this.subject.update();
210
+ this.subject.emitEvent({ type: "changecamera" });
209
211
  }
210
212
 
211
213
  this.lastFrameTS = timestamp;
@@ -223,7 +225,9 @@ export class OdaWalkDragger extends OdBaseDragger {
223
225
 
224
226
  if (dltX !== 0.0) this.turnLeft(-dltX * this.deltaAngle);
225
227
  if (dltY !== 0.0) this.cameraWalker.turnDown(dltY * this.deltaAngle);
228
+
226
229
  this.subject.update();
230
+ this.subject.emitEvent({ type: "changecamera" });
227
231
  }
228
232
  }
229
233
 
@@ -44,9 +44,7 @@ export class VSFCloudLoader extends Loader {
44
44
  override async load(model: any, format?: string): Promise<this> {
45
45
  if (!this.viewer.visualizeJs) return this;
46
46
 
47
- const visLib = this.viewer.visLib();
48
- const visViewer = visLib.getViewer();
49
-
47
+ const visViewer = this.viewer.visViewer();
50
48
  const filesToDownload = [model.database, ...model.geometry];
51
49
 
52
50
  console.time("File load time");
@@ -60,18 +58,21 @@ export class VSFCloudLoader extends Loader {
60
58
  };
61
59
 
62
60
  const arrayBuffer = await model.downloadResource(dataId, progress, this.abortController.signal);
61
+ const data = new Uint8Array(arrayBuffer);
62
+
63
63
  if (!this.viewer.visualizeJs) return this;
64
64
 
65
- const data = new Uint8Array(arrayBuffer);
66
- visViewer.parseStream(data);
65
+ try {
66
+ visViewer.parseStream(data);
67
+ } catch (error: any) {
68
+ console.error("VSF parse error.", error);
69
+ throw error;
70
+ }
67
71
 
68
72
  if (i === 0) {
69
- this.viewer.update(true);
70
-
71
- this.viewer.syncOpenCloudVisualStyle(false);
72
73
  this.viewer.syncOptions();
73
74
  this.viewer.syncOverlay();
74
- this.viewer.resize();
75
+ this.viewer.update(true);
75
76
 
76
77
  this.viewer.emitEvent({ type: "databasechunk", data, file: model.file, model });
77
78
  } else {
@@ -43,6 +43,8 @@ export class VSFFileLoader extends Loader {
43
43
  override async load(file: any, format?: string, params?: LoadParams): Promise<this> {
44
44
  if (!this.viewer.visualizeJs) return this;
45
45
 
46
+ const visViewer = this.viewer.visViewer();
47
+
46
48
  const progress = (event: ProgressEvent) => {
47
49
  const { lengthComputable, loaded, total } = event;
48
50
  const progress = lengthComputable ? loaded / total : 1;
@@ -54,18 +56,21 @@ export class VSFFileLoader extends Loader {
54
56
  loader.setWithCredentials(params.withCredentials);
55
57
  loader.setAbortSignal(this.abortController.signal);
56
58
 
57
- const buffer = await loader.load(file, progress);
58
- const data = new Uint8Array(buffer);
59
+ const arrayBuffer = await loader.load(file, progress);
60
+ const data = new Uint8Array(arrayBuffer);
59
61
 
60
- const visLib = this.viewer.visLib();
61
- const visViewer = visLib.getViewer();
62
+ if (!this.viewer.visualizeJs) return this;
62
63
 
63
- visViewer.parseFile(data);
64
+ try {
65
+ visViewer.parseFile(data);
66
+ } catch (error: any) {
67
+ console.error("VSF parse error.", error);
68
+ throw error;
69
+ }
64
70
 
65
- this.viewer.syncOpenCloudVisualStyle(false);
66
71
  this.viewer.syncOptions();
67
72
  this.viewer.syncOverlay();
68
- this.viewer.resize();
73
+ this.viewer.update(true);
69
74
 
70
75
  this.viewer.emitEvent({ type: "databasechunk", data, file });
71
76
 
@@ -45,8 +45,7 @@ export class VSFXCloudLoader extends Loader {
45
45
  override async load(model: any, format?: string, params: any = {}): Promise<this> {
46
46
  if (!this.viewer.visualizeJs) return Promise.resolve(this);
47
47
 
48
- const visLib = this.viewer.visLib();
49
- const visViewer = visLib.getViewer();
48
+ const visViewer = this.viewer.visViewer();
50
49
 
51
50
  const progress = (progress: number) => {
52
51
  this.viewer.emitEvent({ type: "geometryprogress", data: progress, file: model.file, model });
@@ -55,10 +54,10 @@ export class VSFXCloudLoader extends Loader {
55
54
  console.time("File load time");
56
55
 
57
56
  const arrayBuffer = await model.downloadResource(model.database, progress, this.abortController.signal);
58
- if (!this.viewer.visualizeJs) return this;
59
-
60
57
  const data = new Uint8Array(arrayBuffer);
61
58
 
59
+ if (!this.viewer.visualizeJs) return this;
60
+
62
61
  try {
63
62
  visViewer.parseVsfx(data);
64
63
  } catch (error: any) {
@@ -66,10 +65,9 @@ export class VSFXCloudLoader extends Loader {
66
65
  throw error;
67
66
  }
68
67
 
69
- this.viewer.syncOpenCloudVisualStyle(false);
70
68
  this.viewer.syncOptions();
71
69
  this.viewer.syncOverlay();
72
- this.viewer.resize();
70
+ this.viewer.update(true);
73
71
 
74
72
  this.viewer.emitEvent({ type: "databasechunk", data, file: model.file, model });
75
73
 
@@ -52,8 +52,7 @@ export class VSFXCloudPartialLoader extends Loader {
52
52
  override async load(model: any, format?: string): Promise<this> {
53
53
  if (!this.viewer.visualizeJs) return this;
54
54
 
55
- const visLib = this.viewer.visLib();
56
- const visViewer = visLib.getViewer();
55
+ const visViewer = this.viewer.visViewer();
57
56
  let servicePartAborted = false;
58
57
 
59
58
  const pendingRequestsMap = new Map();
@@ -71,28 +70,24 @@ export class VSFXCloudPartialLoader extends Loader {
71
70
  const chunkLoadHandler = (progress: number, chunk: Uint8Array, requestId = 0) => {
72
71
  if (!this.viewer.visualizeJs) return;
73
72
 
74
- let state: boolean;
73
+ let isDatabaseChunk: boolean;
75
74
  try {
76
- state = visViewer.parseVsfxInPartialMode(requestId, chunk);
75
+ isDatabaseChunk = visViewer.parseVsfxInPartialMode(requestId, chunk);
77
76
  } catch (error: any) {
78
77
  console.error("VSFX parse error.", error);
79
78
  throw error;
80
79
  }
81
80
 
82
- updateController.update(UpdateType.kDelay);
83
-
84
81
  this.viewer.emitEvent({ type: "geometryprogress", data: progress, file: model.file, model });
85
82
 
86
- if (state) {
87
- updateController.update(UpdateType.kForce);
88
-
89
- this.viewer.syncOpenCloudVisualStyle(false);
83
+ if (isDatabaseChunk) {
90
84
  this.viewer.syncOptions();
91
85
  this.viewer.syncOverlay();
92
- this.viewer.resize();
93
86
 
87
+ updateController.update(UpdateType.kForce);
94
88
  this.viewer.emitEvent({ type: "databasechunk", data: chunk, file: model.file, model });
95
89
  } else {
90
+ updateController.update(UpdateType.kDelay);
96
91
  this.viewer.emitEvent({ type: "geometrychunk", data: chunk, file: model.file, model });
97
92
  }
98
93
  };
@@ -49,7 +49,7 @@ export class VSFXCloudStreamingLoader extends Loader {
49
49
  if (!this.viewer.visualizeJs) return this;
50
50
 
51
51
  const visLib = this.viewer.visLib();
52
- const visViewer = visLib.getViewer();
52
+ const visViewer = this.viewer.visViewer();
53
53
 
54
54
  const updateController = new UpdateController();
55
55
  updateController.initialize(this.viewer);
@@ -59,7 +59,7 @@ export class VSFXCloudStreamingLoader extends Loader {
59
59
  const chunkLoadHandler = (progress: number, chunk: Uint8Array) => {
60
60
  if (!this.viewer.visualizeJs) return;
61
61
 
62
- let status;
62
+ let status: any;
63
63
  try {
64
64
  status = visViewer.parseVsfx(chunk);
65
65
  } catch (error: any) {
@@ -67,29 +67,25 @@ export class VSFXCloudStreamingLoader extends Loader {
67
67
  throw error;
68
68
  }
69
69
 
70
- updateController.update(UpdateType.kDelay);
71
-
72
70
  this.viewer.emitEvent({ type: "geometryprogress", data: progress, file: model.file, model });
73
71
 
74
- let state = false;
72
+ let isDatabaseChunk = false;
75
73
  if (
76
74
  status === visLib.DatabaseStreamStatus.ReadyServiceData ||
77
75
  (status === visLib.DatabaseStreamStatus.Complete && !isFireDatabaseChunk)
78
76
  ) {
79
77
  isFireDatabaseChunk = true;
80
- state = true;
78
+ isDatabaseChunk = true;
81
79
  }
82
80
 
83
- if (state) {
84
- updateController.update(UpdateType.kForce);
85
-
86
- this.viewer.syncOpenCloudVisualStyle(false);
81
+ if (isDatabaseChunk) {
87
82
  this.viewer.syncOptions();
88
83
  this.viewer.syncOverlay();
89
- this.viewer.resize();
90
84
 
85
+ updateController.update(UpdateType.kForce);
91
86
  this.viewer.emitEvent({ type: "databasechunk", data: chunk, file: model.file, model });
92
87
  } else {
88
+ updateController.update(UpdateType.kDelay);
93
89
  this.viewer.emitEvent({ type: "geometrychunk", data: chunk, file: model.file, model });
94
90
  }
95
91
  };
@@ -43,6 +43,8 @@ export class VSFXFileLoader extends Loader {
43
43
  override async load(file: any, format?: string, params?: LoadParams): Promise<this> {
44
44
  if (!this.viewer.visualizeJs) return this;
45
45
 
46
+ const visViewer = this.viewer.visViewer();
47
+
46
48
  const progress = (event: ProgressEvent) => {
47
49
  const { lengthComputable, loaded, total } = event;
48
50
  const progress = lengthComputable ? loaded / total : 1;
@@ -54,18 +56,21 @@ export class VSFXFileLoader extends Loader {
54
56
  loader.setWithCredentials(params.withCredentials);
55
57
  loader.setAbortSignal(this.abortController.signal);
56
58
 
57
- const buffer = await loader.load(file, progress);
58
- const data = new Uint8Array(buffer);
59
+ const arrayBuffer = await loader.load(file, progress);
60
+ const data = new Uint8Array(arrayBuffer);
59
61
 
60
- const visLib = this.viewer.visLib();
61
- const visViewer = visLib.getViewer();
62
+ if (!this.viewer.visualizeJs) return this;
62
63
 
63
- visViewer.parseVsfx(data);
64
+ try {
65
+ visViewer.parseVsfx(data);
66
+ } catch (error: any) {
67
+ console.error("VSFX parse error.", error);
68
+ throw error;
69
+ }
64
70
 
65
- this.viewer.syncOpenCloudVisualStyle(false);
66
71
  this.viewer.syncOptions();
67
72
  this.viewer.syncOverlay();
68
- this.viewer.resize();
73
+ this.viewer.update(true);
69
74
 
70
75
  this.viewer.emitEvent({ type: "databasechunk", data, file });
71
76
 
@@ -81,10 +81,9 @@ import { VSFXCloudPartialLoader } from "./VSFXCloudPartialLoader";
81
81
  *
82
82
  * this.viewer.visualizeJs.getViewer().parseVsfx(data);
83
83
  *
84
- * this.viewer.syncOpenCloudVisualStyle(false);
85
84
  * this.viewer.syncOptions();
86
85
  * this.viewer.syncOverlay();
87
- * this.viewer.resize();
86
+ * this.viewer.update();
88
87
  *
89
88
  * this.viewer.emitEvent({ type: "databasechunk", data, file });
90
89
  *
@@ -108,7 +108,7 @@ export class VisualizeMarkup implements IMarkup {
108
108
  if (!this._viewer.visualizeJs) return;
109
109
 
110
110
  const visLib = this._viewer.visLib();
111
- const visViewer = visLib.getViewer();
111
+ const visViewer = this._viewer.visViewer();
112
112
  const activeView = visViewer.activeView;
113
113
 
114
114
  this._viewer.syncOverlay();
@@ -165,7 +165,7 @@ export class VisualizeMarkup implements IMarkup {
165
165
  }
166
166
 
167
167
  const visLib = this._viewer.visLib();
168
- const visViewer = visLib.getViewer();
168
+ const visViewer = this._viewer.visViewer();
169
169
 
170
170
  if (!viewpoint) viewpoint = {};
171
171