3dviewer-sdk 1.0.11 → 1.0.13

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/index.js CHANGED
@@ -147,6 +147,8 @@ var NodeModule = class {
147
147
  // src/modules/files.module.ts
148
148
  var DEFAULT_API_BASE_URL = "https://dev.3dviewer.anybim.vn";
149
149
  var DEFAULT_VIEWER_ORIGIN = "http://localhost:3000";
150
+ var SDK_VIEWER_PATH = "/mainviewer-sdk";
151
+ var LEGACY_VIEWER_PATH = "/mainviewer";
150
152
  var FilesModule = class {
151
153
  constructor(viewer) {
152
154
  this.viewer = viewer;
@@ -296,7 +298,7 @@ var FilesModule = class {
296
298
  const raw = this.config.baseUrl || this.viewer.getOptions().baseUrl || DEFAULT_API_BASE_URL;
297
299
  return this.normalizeBaseUrl(raw);
298
300
  }
299
- // Resolve viewer route path (e.g. /mainviewer).
301
+ // Resolve viewer route path for all SDK flows.
300
302
  resolveViewerPath() {
301
303
  const configuredPath = this.config.viewerPath || this.viewer.getOptions().viewerPath;
302
304
  if (!configuredPath) {
@@ -304,28 +306,32 @@ var FilesModule = class {
304
306
  if (viewerUrl) {
305
307
  try {
306
308
  const pathname = new URL(viewerUrl, window.location.href).pathname;
307
- if (pathname && pathname !== "/") return pathname;
309
+ if (pathname && pathname !== "/") return this.normalizeSdkViewerPath(pathname);
308
310
  } catch {
309
311
  }
310
312
  }
311
313
  }
312
- const p = (configuredPath || "/mainviewer").trim();
313
- if (!p) return "/mainviewer";
314
- return p.startsWith("/") ? p : `/${p}`;
314
+ return this.normalizeSdkViewerPath(configuredPath || SDK_VIEWER_PATH);
315
+ }
316
+ normalizeSdkViewerPath(path) {
317
+ const p = path.trim();
318
+ if (!p || p === LEGACY_VIEWER_PATH) return SDK_VIEWER_PATH;
319
+ const normalized = p.startsWith("/") ? p : `/${p}`;
320
+ return normalized === LEGACY_VIEWER_PATH ? SDK_VIEWER_PATH : normalized;
315
321
  }
316
322
  // Viewer host used to open iframe after conversion completes.
317
323
  resolveViewerOrigin() {
318
- const configuredBaseUrl = this.config.baseUrl || this.viewer.getOptions().baseUrl;
319
- if (configuredBaseUrl) {
324
+ const viewerUrl = this.viewer.getOptions().url;
325
+ if (viewerUrl) {
320
326
  try {
321
- return this.normalizeBaseUrl(new URL(configuredBaseUrl, window.location.href).origin);
327
+ return this.normalizeBaseUrl(new URL(viewerUrl, window.location.href).origin);
322
328
  } catch {
323
329
  }
324
330
  }
325
- const viewerUrl = this.viewer.getOptions().url;
326
- if (viewerUrl) {
331
+ const configuredBaseUrl = this.config.baseUrl || this.viewer.getOptions().baseUrl;
332
+ if (configuredBaseUrl) {
327
333
  try {
328
- return this.normalizeBaseUrl(new URL(viewerUrl, window.location.href).origin);
334
+ return this.normalizeBaseUrl(new URL(configuredBaseUrl, window.location.href).origin);
329
335
  } catch {
330
336
  }
331
337
  }
@@ -334,6 +340,11 @@ var FilesModule = class {
334
340
  // Build conversion service root from API base URL.
335
341
  resolveHostConversion() {
336
342
  const baseUrl = this.resolveBaseUrl();
343
+ try {
344
+ const parsed = new URL(baseUrl, window.location.href);
345
+ if (parsed.hostname.includes("conversion")) return baseUrl;
346
+ } catch {
347
+ }
337
348
  return baseUrl.endsWith("/service/conversion") ? baseUrl : `${baseUrl}/service/conversion`;
338
349
  }
339
350
  // Resolve upload path sent to conversion APIs.
@@ -486,16 +497,16 @@ var FilesModule = class {
486
497
  }
487
498
  // Submit conversion request to the newer downloadUrl-based endpoint.
488
499
  async cacheFileV2(options) {
500
+ var _a;
489
501
  const hostConversion = await this.resolveHostConversion();
490
502
  const params = new URLSearchParams();
491
- if (typeof options.overwrite === "boolean") {
492
- params.set("overwrite", String(options.overwrite));
493
- }
503
+ params.set("overwrite", String((_a = options.overwrite) != null ? _a : true));
504
+ params.set("ignore_line_weight", "1");
494
505
  if (options.project) {
495
506
  params.set("project", options.project);
496
507
  }
497
508
  const query = params.toString();
498
- const url = `${hostConversion}/api/StreamFile/convert${query ? `?${query}` : ""}`;
509
+ const url = `${hostConversion}/api/StreamFile${query ? `?${query}` : ""}`;
499
510
  const payload = this.buildConvertV2Payload(options);
500
511
  const response = await fetch(url, {
501
512
  method: "POST",
@@ -583,8 +594,8 @@ var FilesModule = class {
583
594
  };
584
595
 
585
596
  // src/modules/toolbar.module.ts
586
- function createRequestId() {
587
- return `sheets_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
597
+ function createRequestId(prefix) {
598
+ return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
588
599
  }
589
600
  var ALL_3D_TOOLBAR_OPERATORS = [
590
601
  "home",
@@ -670,90 +681,78 @@ var ToolbarModule = class {
670
681
  enableAllPdf() {
671
682
  this.clearDisabledPdf();
672
683
  }
673
- hideToolbar() {
674
- this.setToolbarVisible(false);
675
- }
676
- showToolbar() {
677
- this.setToolbarVisible(true);
678
- }
679
- setToolbarVisible(visible, target = "all") {
680
- this.postToolbarVisibility({ visible, target });
681
- }
682
- hideLeftToolbar() {
683
- this.setToolbarVisible(false, "left");
684
- }
685
- showLeftToolbar() {
686
- this.setToolbarVisible(true, "left");
684
+ useToolbar(target = "all") {
685
+ this.postToolbarUse({ target });
687
686
  }
688
- hideCenterToolbar() {
689
- this.setToolbarVisible(false, "center");
687
+ useLeftToolbar() {
688
+ this.useToolbar("left");
690
689
  }
691
- showCenterToolbar() {
692
- this.setToolbarVisible(true, "center");
690
+ useCenterToolbar() {
691
+ this.useToolbar("center");
693
692
  }
694
- hideRightToolbar() {
695
- this.setToolbarVisible(false, "right");
693
+ useRightToolbar() {
694
+ this.useToolbar("right");
696
695
  }
697
- showRightToolbar() {
698
- this.setToolbarVisible(true, "right");
696
+ usePanel(panel, format) {
697
+ this.postPanelOpen({ panel, format });
699
698
  }
700
699
  openClippingPlanes() {
701
- this.postPanelOpen({ panel: "clipping-commands", format: "3d" });
700
+ this.usePanel("clipping-commands", "3d");
702
701
  }
703
702
  closeClippingPlanes() {
704
703
  this.postPanelClose({ panel: "clipping-commands", format: "3d" });
705
704
  }
706
705
  openSetting() {
707
- this.postPanelOpen({ panel: "setting" });
706
+ this.usePanel("setting");
708
707
  }
709
708
  closeSetting() {
710
709
  this.postPanelClose({ panel: "setting" });
711
710
  }
712
711
  openSetting3D() {
713
- this.postPanelOpen({ panel: "setting", format: "3d" });
712
+ this.usePanel("setting", "3d");
714
713
  }
715
714
  closeSetting3D() {
716
715
  this.postPanelClose({ panel: "setting", format: "3d" });
717
716
  }
718
717
  openSettingPdf() {
719
- this.postPanelOpen({ panel: "setting", format: "pdf" });
718
+ this.usePanel("setting", "pdf");
720
719
  }
721
720
  closeSettingPdf() {
722
721
  this.postPanelClose({ panel: "setting", format: "pdf" });
723
722
  }
724
723
  openStatesObjects() {
725
- this.postPanelOpen({ panel: "statesObjects", format: "3d" });
724
+ this.usePanel("statesObjects", "3d");
726
725
  }
727
726
  closeStatesObjects() {
728
727
  this.postPanelClose({ panel: "statesObjects", format: "3d" });
729
728
  }
730
729
  openLinkedObjects() {
731
- this.postPanelOpen({ panel: "linkedObjects", format: "3d" });
730
+ this.usePanel("linkedObjects", "3d");
732
731
  }
733
732
  closeLinkedObjects() {
734
733
  this.postPanelClose({ panel: "linkedObjects", format: "3d" });
735
734
  }
736
735
  openModelTree() {
737
- this.postPanelOpen({ panel: "model-tree", format: "3d" });
736
+ this.usePanel("model-tree", "3d");
738
737
  }
739
738
  closeModelTree() {
740
739
  this.postPanelClose({ panel: "model-tree", format: "3d" });
741
740
  }
742
741
  openObjectProperties() {
743
- this.postPanelOpen({ panel: "object-properties", format: "3d" });
742
+ this.usePanel("object-properties", "3d");
744
743
  }
745
744
  closeObjectProperties() {
746
745
  this.postPanelClose({ panel: "object-properties", format: "3d" });
747
746
  }
748
747
  openSheets() {
749
- this.postPanelOpen({ panel: "sheets", format: "3d" });
748
+ this.usePanel("sheets", "3d");
750
749
  }
751
750
  closeSheets() {
752
751
  this.postPanelClose({ panel: "sheets", format: "3d" });
753
752
  }
754
753
  getSheets(options) {
755
754
  var _a;
756
- const requestId = createRequestId();
755
+ const requestId = createRequestId("sheets");
757
756
  const timeoutMs = Math.max(1e3, (_a = options == null ? void 0 : options.timeoutMs) != null ? _a : 1e4);
758
757
  return new Promise((resolve, reject) => {
759
758
  const timer = setTimeout(() => {
@@ -769,6 +768,60 @@ var ToolbarModule = class {
769
768
  this.postSheetsGetList({ requestId });
770
769
  });
771
770
  }
771
+ getObjectProperties(options) {
772
+ var _a;
773
+ const requestId = createRequestId("object_properties");
774
+ const timeoutMs = Math.max(1e3, (_a = options == null ? void 0 : options.timeoutMs) != null ? _a : 1e4);
775
+ return new Promise((resolve, reject) => {
776
+ const timer = setTimeout(() => {
777
+ off();
778
+ reject(new Error("Timeout while getting object properties list from viewer"));
779
+ }, timeoutMs);
780
+ const off = this.viewer._on("object-properties:list", (payload) => {
781
+ if (payload.requestId !== requestId) return;
782
+ clearTimeout(timer);
783
+ off();
784
+ resolve(payload.properties);
785
+ });
786
+ this.postObjectPropertiesGetList({ requestId });
787
+ });
788
+ }
789
+ getLinkedObjects(options) {
790
+ var _a;
791
+ const requestId = createRequestId("linked_objects");
792
+ const timeoutMs = Math.max(1e3, (_a = options == null ? void 0 : options.timeoutMs) != null ? _a : 1e4);
793
+ return new Promise((resolve, reject) => {
794
+ const timer = setTimeout(() => {
795
+ off();
796
+ reject(new Error("Timeout while getting linked objects list from viewer"));
797
+ }, timeoutMs);
798
+ const off = this.viewer._on("linked-objects:list", (payload) => {
799
+ if (payload.requestId !== requestId) return;
800
+ clearTimeout(timer);
801
+ off();
802
+ resolve(payload.linkedObjects);
803
+ });
804
+ this.postLinkedObjectsGetList({ requestId });
805
+ });
806
+ }
807
+ getStatesObjects(options) {
808
+ var _a;
809
+ const requestId = createRequestId("states_objects");
810
+ const timeoutMs = Math.max(1e3, (_a = options == null ? void 0 : options.timeoutMs) != null ? _a : 1e4);
811
+ return new Promise((resolve, reject) => {
812
+ const timer = setTimeout(() => {
813
+ off();
814
+ reject(new Error("Timeout while getting states objects list from viewer"));
815
+ }, timeoutMs);
816
+ const off = this.viewer._on("states-objects:list", (payload) => {
817
+ if (payload.requestId !== requestId) return;
818
+ clearTimeout(timer);
819
+ off();
820
+ resolve(payload.statesObjects);
821
+ });
822
+ this.postStatesObjectsGetList({ requestId });
823
+ });
824
+ }
772
825
  applySheet(sheetId) {
773
826
  this.postSheetsApply({ sheetId });
774
827
  }
@@ -811,8 +864,8 @@ var ToolbarModule = class {
811
864
  postConfig(payload) {
812
865
  this.viewer.postToViewer("viewer-toolbar-config" /* TOOLBAR_CONFIG */, payload);
813
866
  }
814
- postToolbarVisibility(payload) {
815
- this.viewer.postToViewer("viewer-toolbar-visibility" /* TOOLBAR_VISIBILITY */, payload);
867
+ postToolbarUse(payload) {
868
+ this.viewer.postToViewer("viewer-toolbar-use" /* TOOLBAR_USE */, payload);
816
869
  }
817
870
  postPanelOpen(payload) {
818
871
  this.viewer.postToViewer("viewer-panel-open" /* PANEL_OPEN */, payload);
@@ -829,6 +882,15 @@ var ToolbarModule = class {
829
882
  postSheetsApply(payload) {
830
883
  this.viewer.postToViewer("viewer-sheets-apply" /* SHEETS_APPLY */, payload);
831
884
  }
885
+ postObjectPropertiesGetList(payload) {
886
+ this.viewer.postToViewer("viewer-object-properties-get-list" /* OBJECT_PROPERTIES_GET_LIST */, payload);
887
+ }
888
+ postLinkedObjectsGetList(payload) {
889
+ this.viewer.postToViewer("viewer-linked-objects-get-list" /* LINKED_OBJECTS_GET_LIST */, payload);
890
+ }
891
+ postStatesObjectsGetList(payload) {
892
+ this.viewer.postToViewer("viewer-states-objects-get-list" /* STATES_OBJECTS_GET_LIST */, payload);
893
+ }
832
894
  };
833
895
 
834
896
  // src/modules/model-tree.module.ts
@@ -985,6 +1047,8 @@ var LanguageModule = class {
985
1047
  };
986
1048
 
987
1049
  // src/viewer.ts
1050
+ var SDK_VIEWER_PATH2 = "/mainviewer-sdk";
1051
+ var LEGACY_VIEWER_PATH2 = "/mainviewer";
988
1052
  var Viewer3D = class {
989
1053
  constructor(options) {
990
1054
  this.options = options;
@@ -1089,6 +1153,54 @@ var Viewer3D = class {
1089
1153
  });
1090
1154
  break;
1091
1155
  }
1156
+ case "viewer-object-properties-list" /* OBJECT_PROPERTIES_LIST */: {
1157
+ const payload = data.payload;
1158
+ if (!payload || !payload.requestId || !Array.isArray(payload.properties)) break;
1159
+ this._emit("object-properties:list", {
1160
+ requestId: String(payload.requestId),
1161
+ properties: payload.properties.filter((item) => item && typeof item === "object").map((item) => ({ ...item })),
1162
+ timestamp: Number(payload.timestamp) || Date.now()
1163
+ });
1164
+ break;
1165
+ }
1166
+ case "viewer-linked-objects-list" /* LINKED_OBJECTS_LIST */: {
1167
+ const payload = data.payload;
1168
+ if (!payload || !payload.requestId || !Array.isArray(payload.linkedObjects)) break;
1169
+ this._emit("linked-objects:list", {
1170
+ requestId: String(payload.requestId),
1171
+ linkedObjects: payload.linkedObjects.filter((item) => item && typeof item === "object").map((item) => ({ ...item })),
1172
+ timestamp: Number(payload.timestamp) || Date.now()
1173
+ });
1174
+ break;
1175
+ }
1176
+ case "viewer-states-objects-list" /* STATES_OBJECTS_LIST */: {
1177
+ const payload = data.payload;
1178
+ if (!payload || !payload.requestId || !Array.isArray(payload.statesObjects)) break;
1179
+ this._emit("states-objects:list", {
1180
+ requestId: String(payload.requestId),
1181
+ statesObjects: payload.statesObjects.map((item) => {
1182
+ var _a2, _b2, _c2, _d2, _e, _f, _g;
1183
+ return {
1184
+ id: String((_a2 = item.id) != null ? _a2 : ""),
1185
+ name: String((_b2 = item.name) != null ? _b2 : ""),
1186
+ char: String((_c2 = item.char) != null ? _c2 : ""),
1187
+ object: Array.isArray(item.object) ? item.object.map((objectItem) => {
1188
+ var _a3;
1189
+ return {
1190
+ name: String((_a3 = objectItem == null ? void 0 : objectItem.name) != null ? _a3 : ""),
1191
+ id: Number(objectItem == null ? void 0 : objectItem.id) || 0
1192
+ };
1193
+ }) : [],
1194
+ states: {
1195
+ color: String((_e = (_d2 = item.states) == null ? void 0 : _d2.color) != null ? _e : ""),
1196
+ type: String((_g = (_f = item.states) == null ? void 0 : _f.type) != null ? _g : "")
1197
+ }
1198
+ };
1199
+ }),
1200
+ timestamp: Number(payload.timestamp) || Date.now()
1201
+ });
1202
+ break;
1203
+ }
1092
1204
  case "viewer-markup-list" /* MARKUP_LIST */: {
1093
1205
  const payload = data.payload;
1094
1206
  if (!payload || !payload.requestId || !Array.isArray(payload.markups)) break;
@@ -1208,18 +1320,39 @@ var Viewer3D = class {
1208
1320
  if (!this.initialized) throw new Error("Call viewer.init() before using viewer");
1209
1321
  }
1210
1322
  withInitialOptions(url) {
1211
- if (!this.options.initialToolbarVisibility) return url;
1212
1323
  try {
1213
1324
  const parsedUrl = new URL(url, window.location.href);
1214
- parsedUrl.searchParams.set(
1215
- "toolbarVisibility",
1216
- JSON.stringify(this.options.initialToolbarVisibility)
1217
- );
1325
+ if (parsedUrl.pathname === LEGACY_VIEWER_PATH2) {
1326
+ parsedUrl.pathname = SDK_VIEWER_PATH2;
1327
+ }
1328
+ const initialToolbar = this.normalizeInitialToolbar();
1329
+ if (initialToolbar) {
1330
+ parsedUrl.searchParams.set("useToolbar", JSON.stringify(initialToolbar));
1331
+ }
1218
1332
  return parsedUrl.toString();
1219
1333
  } catch {
1220
1334
  return url;
1221
1335
  }
1222
1336
  }
1337
+ normalizeInitialToolbar() {
1338
+ const initialToolbar = this.options.initialToolbar;
1339
+ if (!initialToolbar) return null;
1340
+ if (typeof initialToolbar === "string") {
1341
+ return { [initialToolbar]: true };
1342
+ }
1343
+ if (Array.isArray(initialToolbar)) {
1344
+ return initialToolbar.reduce((result, target) => {
1345
+ result[target] = true;
1346
+ return result;
1347
+ }, {});
1348
+ }
1349
+ const entries = Object.entries(initialToolbar).filter(([, enabled]) => enabled === true);
1350
+ if (entries.length === 0) return null;
1351
+ return entries.reduce((result, [target]) => {
1352
+ result[target] = true;
1353
+ return result;
1354
+ }, {});
1355
+ }
1223
1356
  // ===== typed internal events used by modules =====
1224
1357
  _on(event, cb) {
1225
1358
  return this.emitter.on(event, cb);