@inweb/viewer-visualize 27.4.7 → 27.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/viewer-visualize.js +239 -136
  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 +72 -48
  5. package/dist/viewer-visualize.module.js.map +1 -1
  6. package/lib/Viewer/Components/CameraComponent.d.ts +1 -1
  7. package/lib/Viewer/Draggers/MeasureLineDragger/index.d.ts +1 -1
  8. package/lib/Viewer/Draggers/OdaLineDragger.d.ts +0 -1
  9. package/lib/Viewer/Markup/Visualize/VisualizeMarkup.d.ts +1 -1
  10. package/lib/Viewer/Viewer.d.ts +5 -5
  11. package/package.json +6 -6
  12. package/src/Viewer/Commands/SetSelected2.ts +1 -1
  13. package/src/Viewer/Commands/index.ts +21 -10
  14. package/src/Viewer/Components/CameraComponent.ts +5 -5
  15. package/src/Viewer/Components/CanvasRemoveComponent.ts +0 -1
  16. package/src/Viewer/Components/GestureManagerComponent.ts +0 -1
  17. package/src/Viewer/Components/ZoomWheelComponent.ts +0 -1
  18. package/src/Viewer/Draggers/Common/OdBaseDragger.ts +3 -1
  19. package/src/Viewer/Draggers/MeasureLineDragger/MeasureUtils.ts +2 -2
  20. package/src/Viewer/Draggers/MeasureLineDragger/index.ts +4 -4
  21. package/src/Viewer/Draggers/OdBaseCuttingPlaneDragger.ts +6 -3
  22. package/src/Viewer/Draggers/OdCuttingPlaneZAxisDragger.ts +1 -1
  23. package/src/Viewer/Draggers/OdaLineDragger.ts +4 -5
  24. package/src/Viewer/Loaders/FileLoader.ts +6 -4
  25. package/src/Viewer/Loaders/VSFFileLoader.ts +1 -1
  26. package/src/Viewer/Loaders/VSFXCloudPartialLoader.ts +7 -5
  27. package/src/Viewer/Loaders/VSFXCloudStreamingLoader.ts +1 -1
  28. package/src/Viewer/Loaders/VSFXFileLoader.ts +1 -1
  29. package/src/Viewer/Markup/Visualize/VisualizeMarkup.ts +1 -1
  30. package/src/Viewer/Models/ModelImpl.ts +1 -1
  31. package/src/Viewer/Viewer.ts +44 -23
  32. package/src/Viewer/utils.ts +1 -1
@@ -6,6 +6,6 @@ export declare class CameraComponent implements IComponent {
6
6
  dispose(): void;
7
7
  getCameraMode(view: any): CameraMode;
8
8
  switchCameraMode(mode: CameraMode): void;
9
- optionsChange: () => void;
9
+ syncOptions: () => void;
10
10
  geometryEnd: () => void;
11
11
  }
@@ -23,6 +23,6 @@ export declare class MeasureLineDragger extends OdBaseDragger {
23
23
  end(): void;
24
24
  createNewMeasureIfNeed(): void;
25
25
  createMeasureLine(): MeasureLineItem;
26
- optionsChange(event: any): void;
26
+ updateUnits(event: any): void;
27
27
  getKUnitByName(unitName: string): any;
28
28
  }
@@ -3,7 +3,6 @@ import { OdBaseDragger } from "./Common/OdBaseDragger";
3
3
  export declare const MARKUP_ENTITY_LINE = "$MarkupTempEntity_Line";
4
4
  export declare class OdaLineDragger extends OdBaseDragger {
5
5
  protected entity: any;
6
- protected points: any[];
7
6
  protected drawPoints: any[];
8
7
  constructor(subject: Viewer);
9
8
  dispose(): void;
@@ -9,7 +9,7 @@ export declare class VisualizeMarkup implements IMarkup {
9
9
  b: number;
10
10
  };
11
11
  lineWidth: number;
12
- lineType: "solid";
12
+ lineType: string;
13
13
  fontSize: number;
14
14
  initialize(container: HTMLElement, containerEvents: string[], viewer?: IEventEmitter, worldTransformer?: IWorldTransform): void;
15
15
  dispose(): void;
@@ -23,7 +23,6 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
23
23
  private _crossOrigin;
24
24
  private _activeDragger;
25
25
  private _components;
26
- private _updateDelay;
27
26
  private _renderNeeded;
28
27
  private _renderTime;
29
28
  private _enableAutoUpdate;
@@ -132,10 +131,11 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
132
131
  * - {@link UpdateEvent | update}
133
132
  * - {@link RenderEvent | render}
134
133
  *
135
- * @param force - If `true` updates the viewer immidietly. Otherwise updates on next animation frame.
136
- * Default is `false`.
134
+ * @param force - If `true` updates the viewer immidietly. If a `number` is specified and more than the
135
+ * given amount of milliseconds has elapsed since the last rendering, the update is performed
136
+ * immediately as well. Otherwise updates on next animation frame. Default is `false`.
137
137
  */
138
- update(force?: boolean): void;
138
+ update(force?: boolean | number): void;
139
139
  render(time?: DOMHighResTimeStamp): void;
140
140
  loadReferences(model: Model | File | Assembly): Promise<this>;
141
141
  applyModelTransformMatrix(model: Model | Assembly): void;
@@ -232,7 +232,7 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
232
232
  activeDragger(): IDragger | null;
233
233
  setActiveDragger(name?: string): IDragger | null;
234
234
  resetActiveDragger(): void;
235
- getComponent(name: string): IComponent;
235
+ getComponent(name: string): IComponent | null;
236
236
  drawViewpoint(viewpoint: IViewpoint): void;
237
237
  createViewpoint(): IViewpoint;
238
238
  getSnapshot(type?: string, quality?: number): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inweb/viewer-visualize",
3
- "version": "27.4.7",
3
+ "version": "27.6.0",
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": "~27.4.7",
33
- "@inweb/eventemitter2": "~27.4.7",
34
- "@inweb/markup": "~27.4.7",
35
- "@inweb/viewer-core": "~27.4.7"
32
+ "@inweb/client": "~27.6.0",
33
+ "@inweb/eventemitter2": "~27.6.0",
34
+ "@inweb/markup": "~27.6.0",
35
+ "@inweb/viewer-core": "~27.6.0"
36
36
  },
37
- "visualizeJS": "https://public-fhemb7e3embacwec.z02.azurefd.net/libs/visualizejs/27.4/Visualize.js"
37
+ "visualizeJS": "https://public-fhemb7e3embacwec.z02.azurefd.net/libs/visualizejs/master/Visualize.js"
38
38
  }
@@ -24,7 +24,7 @@
24
24
  import { Viewer } from "../Viewer";
25
25
 
26
26
  export function setSelected2(viewer: Viewer, handles2: string[] = []): void {
27
- const handles = [];
27
+ const handles: string[] = [];
28
28
 
29
29
  handles2.forEach((handle) => {
30
30
  if (!handle.includes(":")) {
@@ -106,18 +106,29 @@ commands.registerCommand("zoomToObjects", zoomToObjects);
106
106
  commands.registerCommand("zoomToSelected", zoomToSelected);
107
107
  commands.registerCommand("autoTransformAllModelsToCentralPoint", autoTransformAllModelsToCentralPoint);
108
108
 
109
- commands.registerCommand("k3DViewTop", (viewer) => setDefaultViewPosition(viewer, "k3DViewTop"));
110
- commands.registerCommand("k3DViewBottom", (viewer) => setDefaultViewPosition(viewer, "k3DViewBottom"));
111
- commands.registerCommand("k3DViewLeft", (viewer) => setDefaultViewPosition(viewer, "k3DViewLeft"));
112
- commands.registerCommand("k3DViewRight", (viewer) => setDefaultViewPosition(viewer, "k3DViewRight"));
113
- commands.registerCommand("k3DViewFront", (viewer) => setDefaultViewPosition(viewer, "k3DViewFront"));
114
- commands.registerCommand("k3DViewBack", (viewer) => setDefaultViewPosition(viewer, "k3DViewBack"));
115
- commands.registerCommand("k3DViewSE", (viewer) => setDefaultViewPosition(viewer, "k3DViewSE"));
116
- commands.registerCommand("k3DViewSW", (viewer) => setDefaultViewPosition(viewer, "k3DViewSW"));
117
- commands.registerCommand("k3DViewNE", (viewer) => setDefaultViewPosition(viewer, "k3DViewNE"));
118
- commands.registerCommand("k3DViewNW", (viewer) => setDefaultViewPosition(viewer, "k3DViewNW"));
109
+ commands.registerCommand("top", (viewer) => setDefaultViewPosition(viewer, "k3DViewTop"));
110
+ commands.registerCommand("bottom", (viewer) => setDefaultViewPosition(viewer, "k3DViewBottom"));
111
+ commands.registerCommand("left", (viewer) => setDefaultViewPosition(viewer, "k3DViewLeft"));
112
+ commands.registerCommand("right", (viewer) => setDefaultViewPosition(viewer, "k3DViewRight"));
113
+ commands.registerCommand("front", (viewer) => setDefaultViewPosition(viewer, "k3DViewFront"));
114
+ commands.registerCommand("back", (viewer) => setDefaultViewPosition(viewer, "k3DViewBack"));
115
+ commands.registerCommand("se", (viewer) => setDefaultViewPosition(viewer, "k3DViewSE"));
116
+ commands.registerCommand("sw", (viewer) => setDefaultViewPosition(viewer, "k3DViewSW"));
117
+ commands.registerCommand("ne", (viewer) => setDefaultViewPosition(viewer, "k3DViewNE"));
118
+ commands.registerCommand("nw", (viewer) => setDefaultViewPosition(viewer, "k3DViewNW"));
119
119
 
120
120
  commands.registerCommandAlias("clearMarkup", "clearOverlay");
121
121
  commands.registerCommandAlias("clearSelected", "unselect");
122
122
  commands.registerCommandAlias("getSnapshot", "createPreview");
123
123
  commands.registerCommandAlias("zoomToExtents", "zoomExtents");
124
+
125
+ commands.registerCommandAlias("top", "k3DViewTop");
126
+ commands.registerCommandAlias("bottom", "k3DViewBottom");
127
+ commands.registerCommandAlias("left", "k3DViewLeft");
128
+ commands.registerCommandAlias("right", "k3DViewRight");
129
+ commands.registerCommandAlias("front", "k3DViewFront");
130
+ commands.registerCommandAlias("back", "k3DViewBack");
131
+ commands.registerCommandAlias("se", "k3DViewSE");
132
+ commands.registerCommandAlias("sw", "k3DViewSW");
133
+ commands.registerCommandAlias("ne", "k3DViewNE");
134
+ commands.registerCommandAlias("nw", "k3DViewNW");
@@ -31,15 +31,15 @@ export class CameraComponent implements IComponent {
31
31
  this.viewer = viewer;
32
32
  this.viewer.addEventListener("databasechunk", this.geometryEnd);
33
33
  this.viewer.addEventListener("clear", this.geometryEnd);
34
- this.viewer.addEventListener("optionschange", this.optionsChange);
35
- this.viewer.addEventListener("initialize", this.optionsChange);
34
+ this.viewer.addEventListener("optionschange", this.syncOptions);
35
+ this.viewer.addEventListener("initialize", this.syncOptions);
36
36
  }
37
37
 
38
38
  dispose() {
39
39
  this.viewer.removeEventListener("databasechunk", this.geometryEnd);
40
40
  this.viewer.removeEventListener("clear", this.geometryEnd);
41
- this.viewer.removeEventListener("optionschange", this.optionsChange);
42
- this.viewer.removeEventListener("initialize", this.optionsChange);
41
+ this.viewer.removeEventListener("optionschange", this.syncOptions);
42
+ this.viewer.removeEventListener("initialize", this.syncOptions);
43
43
  }
44
44
 
45
45
  getCameraMode(view: any): CameraMode {
@@ -61,7 +61,7 @@ export class CameraComponent implements IComponent {
61
61
  activeView.delete();
62
62
  }
63
63
 
64
- optionsChange = () => {
64
+ syncOptions = () => {
65
65
  this.switchCameraMode(this.viewer.options.cameraMode);
66
66
  };
67
67
 
@@ -36,7 +36,6 @@ export class CanvasRemoveComponent implements IComponent {
36
36
 
37
37
  dispose() {
38
38
  this.mutationObserver.disconnect();
39
- this.mutationObserver = undefined;
40
39
  }
41
40
 
42
41
  cleanupViewer = (mutations: MutationRecord[]) => {
@@ -34,6 +34,5 @@ export class GestureManagerComponent implements IComponent {
34
34
 
35
35
  dispose() {
36
36
  this.gestureManager.dispose();
37
- this.gestureManager = undefined;
38
37
  }
39
38
  }
@@ -35,6 +35,5 @@ export class ZoomWheelComponent implements IComponent {
35
35
 
36
36
  dispose() {
37
37
  this.zoomWheelDragger.dispose();
38
- this.zoomWheelDragger = undefined;
39
38
  }
40
39
  }
@@ -37,7 +37,7 @@ export class OdBaseDragger extends OdaGeAction {
37
37
  protected isDragging: boolean;
38
38
  protected press: boolean;
39
39
 
40
- public name: string;
40
+ public name = "";
41
41
 
42
42
  constructor(subject: Viewer) {
43
43
  super(subject.visualizeJs);
@@ -45,6 +45,8 @@ export class OdBaseDragger extends OdaGeAction {
45
45
  this.needInputText = false;
46
46
  this.mouseDownPosition = { x: 0, y: 0 };
47
47
  this.autoSelect = false;
48
+ this.isDragging = false;
49
+ this.press = false;
48
50
 
49
51
  this.pointerdown = this.pointerdown.bind(this);
50
52
  this.pointerup = this.pointerup.bind(this);
@@ -142,8 +142,8 @@ export function getDataForDrawLineWithFixed(p1: Point2d, p2: Point2d, width: num
142
142
  checkSegmentsIntersect(p1, p2, pLB, pRB, intersects);
143
143
  checkSegmentsIntersect(p1, p2, pRB, pRU, intersects);
144
144
 
145
- let fixedP1: Point2d = null;
146
- let fixedP2: Point2d = null;
145
+ let fixedP1: Point2d | null = null;
146
+ let fixedP2: Point2d | null = null;
147
147
 
148
148
  if (intersects.length === 0) {
149
149
  fixedP1 = p1;
@@ -78,10 +78,10 @@ export class MeasureLineDragger extends OdBaseDragger {
78
78
  this.m_overlayElement.style.pointerEvents = "none";
79
79
  document.body.appendChild(this.m_overlayElement);
80
80
 
81
- this.optionsChange = this.optionsChange.bind(this);
81
+ this.updateUnits = this.updateUnits.bind(this);
82
82
  this.updatePreview = this.updatePreview.bind(this);
83
83
 
84
- this.subject.addEventListener("optionschange", this.optionsChange);
84
+ this.subject.addEventListener("optionschange", this.updateUnits);
85
85
  this.subject.addEventListener("render", this.updatePreview);
86
86
 
87
87
  this.resize();
@@ -92,7 +92,7 @@ export class MeasureLineDragger extends OdBaseDragger {
92
92
 
93
93
  this.m_overlayElement.remove();
94
94
 
95
- this.subject.removeEventListener("optionschange", this.optionsChange);
95
+ this.subject.removeEventListener("optionschange", this.updateUnits);
96
96
  this.subject.removeEventListener("render", this.updatePreview);
97
97
  }
98
98
 
@@ -209,7 +209,7 @@ export class MeasureLineDragger extends OdBaseDragger {
209
209
  return item;
210
210
  }
211
211
 
212
- optionsChange(event): void {
212
+ updateUnits(event): void {
213
213
  const options: IOptions = event.data;
214
214
  const toUnitName = options.rulerUnit ?? "Default";
215
215
  const toPrecision = options.rulerPrecision ?? "Default";
@@ -59,10 +59,9 @@ export class OdBaseCuttingPlaneDragger extends OdBaseDragger {
59
59
 
60
60
  avp.addCuttingPlane(plane);
61
61
  this.index = avp.numCuttingPlanes() - 1;
62
+ this.subject.syncOptions(); // <- sync cutting plane fill options
62
63
 
63
- const { red, green, blue } = this.subject.options.cuttingPlaneFillColor;
64
- avp.setEnableCuttingPlaneFill(true, red, green, blue);
65
- avp.setCuttingPlaneFillPatternEnabled(true, this.m_module.CuttingPlaneFillStyle.kSlantRight, 0x0, 0x0, 0x0);
64
+ this.subject.emitEvent({ type: "changecuttingplanes" });
66
65
 
67
66
  this.m_model = this.getModel();
68
67
  this.createPreview();
@@ -115,6 +114,8 @@ export class OdBaseCuttingPlaneDragger extends OdBaseDragger {
115
114
  plane.set(this.toGePoint(this.m_center), this.m_normal);
116
115
  avp.updateCuttingPlane(this.index, plane);
117
116
 
117
+ this.subject.emitEvent({ type: "changecuttingplanes" });
118
+
118
119
  this.drawPreview();
119
120
 
120
121
  this.deleteAll([avp, plane, oldCenter, delta, oldLast]);
@@ -136,6 +137,8 @@ export class OdBaseCuttingPlaneDragger extends OdBaseDragger {
136
137
  plane.set(this.toGePoint(this.m_center), this.m_normal);
137
138
  avp.updateCuttingPlane(this.index, plane);
138
139
 
140
+ this.subject.emitEvent({ type: "changecuttingplanes" });
141
+
139
142
  this.deleteAll([avp, plane, this.m_last]);
140
143
 
141
144
  const device = this.getViewer().getActiveDevice();
@@ -25,7 +25,7 @@ import { OdBaseCuttingPlaneDragger } from "./OdBaseCuttingPlaneDragger";
25
25
 
26
26
  export class OdCuttingPlaneZAxisDragger extends OdBaseCuttingPlaneDragger {
27
27
  override createNormal(): number[] {
28
- return [0, 0, 1];
28
+ return [0, 0, -1];
29
29
  }
30
30
 
31
31
  override handleDelta(delta: Point3d): Point3d {
@@ -27,24 +27,23 @@ export const MARKUP_ENTITY_LINE = "$MarkupTempEntity_Line";
27
27
 
28
28
  export class OdaLineDragger extends OdBaseDragger {
29
29
  protected entity: any;
30
- protected points: any[];
31
30
  protected drawPoints: any[];
32
31
 
33
32
  constructor(subject: Viewer) {
34
33
  super(subject);
35
34
  this.press = false;
35
+ this.drawPoints = [];
36
36
  }
37
37
 
38
38
  override dispose(): void {
39
39
  super.dispose();
40
40
  this.end();
41
- this.points = null;
42
- this.drawPoints = null;
41
+ this.drawPoints.length = 0;
43
42
  }
44
43
 
45
44
  override start(x: number, y: number): void {
46
45
  const point = this.getViewer().screenToWorld(x, y);
47
- this.drawPoints = [point[0], point[1], point[2]];
46
+ this.drawPoints.push(point[0], point[1], point[2]);
48
47
  }
49
48
 
50
49
  override drag(x: number, y: number): void {
@@ -58,7 +57,7 @@ export class OdaLineDragger extends OdBaseDragger {
58
57
  override end(): void {
59
58
  if (this.entity) {
60
59
  this.entity.delete();
61
- this.drawPoints = null;
60
+ this.drawPoints.length = 0;
62
61
  this.entity = null;
63
62
  }
64
63
  }
@@ -24,12 +24,11 @@
24
24
  export class FileLoader {
25
25
  private requestHeader: HeadersInit;
26
26
  private withCredentials: boolean;
27
- private abortSignal: AbortSignal;
27
+ private abortSignal: AbortSignal | undefined;
28
28
 
29
29
  constructor() {
30
30
  this.requestHeader = {};
31
31
  this.withCredentials = false;
32
- this.abortSignal = undefined;
33
32
  }
34
33
 
35
34
  setRequestHeader(requestHeader: HeadersInit) {
@@ -56,13 +55,16 @@ export class FileLoader {
56
55
  .then((response) => {
57
56
  if (!response.ok) throw new Error(`Failed to fetch "${response.url}", status ${response.status}`);
58
57
 
58
+ const body = response.body;
59
+ if (!body) return response;
60
+
59
61
  const contentLength = response.headers.get("X-File-Size") || response.headers.get("Content-Length");
60
62
  const total = parseInt(contentLength || "", 10) || 0;
61
63
  const lengthComputable = total > 0;
62
64
 
63
65
  const stream = new ReadableStream({
64
66
  async start(controller) {
65
- const reader = response.body.getReader();
67
+ const reader = body.getReader();
66
68
  let loaded = 0;
67
69
  try {
68
70
  while (true) {
@@ -91,7 +93,7 @@ export class FileLoader {
91
93
  const reader = new FileReader();
92
94
  reader.onload = () => resolve(reader.result as any);
93
95
  reader.onerror = () => reject(reader.error);
94
- reader.onprogress = onProgress;
96
+ reader.onprogress = onProgress || null;
95
97
  reader.readAsArrayBuffer(new Blob([file]));
96
98
  });
97
99
  }
@@ -34,7 +34,7 @@ export class VSFFileLoader extends Loader {
34
34
  this.viewer = viewer;
35
35
  }
36
36
 
37
- override isSupport(file: any, format?: string): boolean {
37
+ override isSupport(file: any, format = ""): boolean {
38
38
  return (
39
39
  (typeof file === "string" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&
40
40
  /vsf$/i.test(format)
@@ -52,6 +52,8 @@ export class VSFXCloudPartialLoader extends Loader {
52
52
  override async load(model: any): Promise<this> {
53
53
  if (!this.viewer.visualizeJs) return this;
54
54
 
55
+ type Range = { requestId: number; begin: number; end: number };
56
+
55
57
  const visViewer = this.viewer.visViewer();
56
58
  visViewer.memoryLimit = this.viewer.options.memoryLimit;
57
59
 
@@ -90,11 +92,11 @@ export class VSFXCloudPartialLoader extends Loader {
90
92
  this.viewer.update(true);
91
93
  } else {
92
94
  this.viewer.emitEvent({ type: "geometrychunk", data: chunk, file: model.file, model });
93
- this.viewer.update();
95
+ this.viewer.update(500);
94
96
  }
95
97
  };
96
98
 
97
- const downloadResourceRange = async (dataId: string, requestId: number, ranges: any) => {
99
+ const downloadResourceRange = async (dataId: string, requestId: number, ranges: Range[]) => {
98
100
  const abortCtrl = new AbortController();
99
101
  this.abortControllerForRequestMap.set(requestId, abortCtrl);
100
102
  try {
@@ -107,8 +109,8 @@ export class VSFXCloudPartialLoader extends Loader {
107
109
  }
108
110
  };
109
111
 
110
- const requestRecordsToRanges = (requestId: number, records: any): any => {
111
- const ranges = [];
112
+ const requestRecordsToRanges = (requestId: number, records: any): Range[] => {
113
+ const ranges: Range[] = [];
112
114
  for (let i = 0; i < records.size(); i++) {
113
115
  const record = records.get(i);
114
116
  ranges.push({
@@ -151,7 +153,7 @@ export class VSFXCloudPartialLoader extends Loader {
151
153
  const dataId = `${model.fileId}${model.file.type}`;
152
154
  const ranges = requestRecordsToRanges(requestId, records);
153
155
 
154
- let pendingRanges = [];
156
+ let pendingRanges: Range[] = [];
155
157
  let requestNumber = 0;
156
158
  const pendingRequest = pendingRequestsMap.get(dataId);
157
159
  if (pendingRequest) {
@@ -88,7 +88,7 @@ export class VSFXCloudStreamingLoader extends Loader {
88
88
  this.viewer.update(true);
89
89
  } else {
90
90
  this.viewer.emitEvent({ type: "geometrychunk", data: chunk, file: model.file, model });
91
- this.viewer.update();
91
+ this.viewer.update(500);
92
92
  }
93
93
  };
94
94
 
@@ -34,7 +34,7 @@ export class VSFXFileLoader extends Loader {
34
34
  this.viewer = viewer;
35
35
  }
36
36
 
37
- override isSupport(file: any, format?: string): boolean {
37
+ override isSupport(file: any, format = ""): boolean {
38
38
  return (
39
39
  (typeof file === "string" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&
40
40
  /vsfx$/i.test(format)
@@ -33,7 +33,7 @@ export class VisualizeMarkup implements IMarkup {
33
33
  protected _markupColor = { r: 255, g: 0, b: 0 };
34
34
 
35
35
  public lineWidth = 4;
36
- public lineType: "solid";
36
+ public lineType = "solid";
37
37
  public fontSize = 34;
38
38
 
39
39
  initialize(
@@ -26,7 +26,7 @@ import { IModelImpl } from "./IModelImpl";
26
26
  // Basic model implementation.
27
27
 
28
28
  export class ModelImpl implements IModelImpl {
29
- public id: string;
29
+ public id = "";
30
30
 
31
31
  dispose(): void {}
32
32
  }