3dviewer-sdk 1.0.12 → 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,12 +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 conversion API base URL with legacy baseUrl fallback.
300
- resolveConversionBaseUrl() {
301
- const raw = this.config.conversionBaseUrl || this.viewer.getOptions().conversionBaseUrl;
302
- return (raw == null ? void 0 : raw.trim()) ? this.normalizeBaseUrl(raw) : this.resolveBaseUrl();
303
- }
304
- // Resolve viewer route path (e.g. /mainviewer).
301
+ // Resolve viewer route path for all SDK flows.
305
302
  resolveViewerPath() {
306
303
  const configuredPath = this.config.viewerPath || this.viewer.getOptions().viewerPath;
307
304
  if (!configuredPath) {
@@ -309,36 +306,46 @@ var FilesModule = class {
309
306
  if (viewerUrl) {
310
307
  try {
311
308
  const pathname = new URL(viewerUrl, window.location.href).pathname;
312
- if (pathname && pathname !== "/") return pathname;
309
+ if (pathname && pathname !== "/") return this.normalizeSdkViewerPath(pathname);
313
310
  } catch {
314
311
  }
315
312
  }
316
313
  }
317
- const p = (configuredPath || "/mainviewer").trim();
318
- if (!p) return "/mainviewer";
319
- 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;
320
321
  }
321
322
  // Viewer host used to open iframe after conversion completes.
322
323
  resolveViewerOrigin() {
323
- const configuredBaseUrl = this.config.baseUrl || this.viewer.getOptions().baseUrl;
324
- if (configuredBaseUrl) {
324
+ const viewerUrl = this.viewer.getOptions().url;
325
+ if (viewerUrl) {
325
326
  try {
326
- return this.normalizeBaseUrl(new URL(configuredBaseUrl, window.location.href).origin);
327
+ return this.normalizeBaseUrl(new URL(viewerUrl, window.location.href).origin);
327
328
  } catch {
328
329
  }
329
330
  }
330
- const viewerUrl = this.viewer.getOptions().url;
331
- if (viewerUrl) {
331
+ const configuredBaseUrl = this.config.baseUrl || this.viewer.getOptions().baseUrl;
332
+ if (configuredBaseUrl) {
332
333
  try {
333
- return this.normalizeBaseUrl(new URL(viewerUrl, window.location.href).origin);
334
+ return this.normalizeBaseUrl(new URL(configuredBaseUrl, window.location.href).origin);
334
335
  } catch {
335
336
  }
336
337
  }
337
338
  return this.normalizeBaseUrl(DEFAULT_VIEWER_ORIGIN);
338
339
  }
339
- // Use the configured conversion API root as-is.
340
+ // Build conversion service root from API base URL.
340
341
  resolveHostConversion() {
341
- return this.resolveConversionBaseUrl();
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
+ }
348
+ return baseUrl.endsWith("/service/conversion") ? baseUrl : `${baseUrl}/service/conversion`;
342
349
  }
343
350
  // Resolve upload path sent to conversion APIs.
344
351
  getUploadPath() {
@@ -490,16 +497,16 @@ var FilesModule = class {
490
497
  }
491
498
  // Submit conversion request to the newer downloadUrl-based endpoint.
492
499
  async cacheFileV2(options) {
500
+ var _a;
493
501
  const hostConversion = await this.resolveHostConversion();
494
502
  const params = new URLSearchParams();
495
- if (typeof options.overwrite === "boolean") {
496
- params.set("overwrite", String(options.overwrite));
497
- }
503
+ params.set("overwrite", String((_a = options.overwrite) != null ? _a : true));
504
+ params.set("ignore_line_weight", "1");
498
505
  if (options.project) {
499
506
  params.set("project", options.project);
500
507
  }
501
508
  const query = params.toString();
502
- const url = `${hostConversion}/api/StreamFile/convert${query ? `?${query}` : ""}`;
509
+ const url = `${hostConversion}/api/StreamFile${query ? `?${query}` : ""}`;
503
510
  const payload = this.buildConvertV2Payload(options);
504
511
  const response = await fetch(url, {
505
512
  method: "POST",
@@ -587,8 +594,8 @@ var FilesModule = class {
587
594
  };
588
595
 
589
596
  // src/modules/toolbar.module.ts
590
- function createRequestId() {
591
- 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)}`;
592
599
  }
593
600
  var ALL_3D_TOOLBAR_OPERATORS = [
594
601
  "home",
@@ -674,90 +681,78 @@ var ToolbarModule = class {
674
681
  enableAllPdf() {
675
682
  this.clearDisabledPdf();
676
683
  }
677
- hideToolbar() {
678
- this.setToolbarVisible(false);
679
- }
680
- showToolbar() {
681
- this.setToolbarVisible(true);
682
- }
683
- setToolbarVisible(visible, target = "all") {
684
- this.postToolbarVisibility({ visible, target });
685
- }
686
- hideLeftToolbar() {
687
- this.setToolbarVisible(false, "left");
684
+ useToolbar(target = "all") {
685
+ this.postToolbarUse({ target });
688
686
  }
689
- showLeftToolbar() {
690
- this.setToolbarVisible(true, "left");
687
+ useLeftToolbar() {
688
+ this.useToolbar("left");
691
689
  }
692
- hideCenterToolbar() {
693
- this.setToolbarVisible(false, "center");
690
+ useCenterToolbar() {
691
+ this.useToolbar("center");
694
692
  }
695
- showCenterToolbar() {
696
- this.setToolbarVisible(true, "center");
693
+ useRightToolbar() {
694
+ this.useToolbar("right");
697
695
  }
698
- hideRightToolbar() {
699
- this.setToolbarVisible(false, "right");
700
- }
701
- showRightToolbar() {
702
- this.setToolbarVisible(true, "right");
696
+ usePanel(panel, format) {
697
+ this.postPanelOpen({ panel, format });
703
698
  }
704
699
  openClippingPlanes() {
705
- this.postPanelOpen({ panel: "clipping-commands", format: "3d" });
700
+ this.usePanel("clipping-commands", "3d");
706
701
  }
707
702
  closeClippingPlanes() {
708
703
  this.postPanelClose({ panel: "clipping-commands", format: "3d" });
709
704
  }
710
705
  openSetting() {
711
- this.postPanelOpen({ panel: "setting" });
706
+ this.usePanel("setting");
712
707
  }
713
708
  closeSetting() {
714
709
  this.postPanelClose({ panel: "setting" });
715
710
  }
716
711
  openSetting3D() {
717
- this.postPanelOpen({ panel: "setting", format: "3d" });
712
+ this.usePanel("setting", "3d");
718
713
  }
719
714
  closeSetting3D() {
720
715
  this.postPanelClose({ panel: "setting", format: "3d" });
721
716
  }
722
717
  openSettingPdf() {
723
- this.postPanelOpen({ panel: "setting", format: "pdf" });
718
+ this.usePanel("setting", "pdf");
724
719
  }
725
720
  closeSettingPdf() {
726
721
  this.postPanelClose({ panel: "setting", format: "pdf" });
727
722
  }
728
723
  openStatesObjects() {
729
- this.postPanelOpen({ panel: "statesObjects", format: "3d" });
724
+ this.usePanel("statesObjects", "3d");
730
725
  }
731
726
  closeStatesObjects() {
732
727
  this.postPanelClose({ panel: "statesObjects", format: "3d" });
733
728
  }
734
729
  openLinkedObjects() {
735
- this.postPanelOpen({ panel: "linkedObjects", format: "3d" });
730
+ this.usePanel("linkedObjects", "3d");
736
731
  }
737
732
  closeLinkedObjects() {
738
733
  this.postPanelClose({ panel: "linkedObjects", format: "3d" });
739
734
  }
740
735
  openModelTree() {
741
- this.postPanelOpen({ panel: "model-tree", format: "3d" });
736
+ this.usePanel("model-tree", "3d");
742
737
  }
743
738
  closeModelTree() {
744
739
  this.postPanelClose({ panel: "model-tree", format: "3d" });
745
740
  }
746
741
  openObjectProperties() {
747
- this.postPanelOpen({ panel: "object-properties", format: "3d" });
742
+ this.usePanel("object-properties", "3d");
748
743
  }
749
744
  closeObjectProperties() {
750
745
  this.postPanelClose({ panel: "object-properties", format: "3d" });
751
746
  }
752
747
  openSheets() {
753
- this.postPanelOpen({ panel: "sheets", format: "3d" });
748
+ this.usePanel("sheets", "3d");
754
749
  }
755
750
  closeSheets() {
756
751
  this.postPanelClose({ panel: "sheets", format: "3d" });
757
752
  }
758
753
  getSheets(options) {
759
754
  var _a;
760
- const requestId = createRequestId();
755
+ const requestId = createRequestId("sheets");
761
756
  const timeoutMs = Math.max(1e3, (_a = options == null ? void 0 : options.timeoutMs) != null ? _a : 1e4);
762
757
  return new Promise((resolve, reject) => {
763
758
  const timer = setTimeout(() => {
@@ -773,6 +768,60 @@ var ToolbarModule = class {
773
768
  this.postSheetsGetList({ requestId });
774
769
  });
775
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
+ }
776
825
  applySheet(sheetId) {
777
826
  this.postSheetsApply({ sheetId });
778
827
  }
@@ -815,8 +864,8 @@ var ToolbarModule = class {
815
864
  postConfig(payload) {
816
865
  this.viewer.postToViewer("viewer-toolbar-config" /* TOOLBAR_CONFIG */, payload);
817
866
  }
818
- postToolbarVisibility(payload) {
819
- this.viewer.postToViewer("viewer-toolbar-visibility" /* TOOLBAR_VISIBILITY */, payload);
867
+ postToolbarUse(payload) {
868
+ this.viewer.postToViewer("viewer-toolbar-use" /* TOOLBAR_USE */, payload);
820
869
  }
821
870
  postPanelOpen(payload) {
822
871
  this.viewer.postToViewer("viewer-panel-open" /* PANEL_OPEN */, payload);
@@ -833,6 +882,15 @@ var ToolbarModule = class {
833
882
  postSheetsApply(payload) {
834
883
  this.viewer.postToViewer("viewer-sheets-apply" /* SHEETS_APPLY */, payload);
835
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
+ }
836
894
  };
837
895
 
838
896
  // src/modules/model-tree.module.ts
@@ -989,6 +1047,8 @@ var LanguageModule = class {
989
1047
  };
990
1048
 
991
1049
  // src/viewer.ts
1050
+ var SDK_VIEWER_PATH2 = "/mainviewer-sdk";
1051
+ var LEGACY_VIEWER_PATH2 = "/mainviewer";
992
1052
  var Viewer3D = class {
993
1053
  constructor(options) {
994
1054
  this.options = options;
@@ -1093,6 +1153,54 @@ var Viewer3D = class {
1093
1153
  });
1094
1154
  break;
1095
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
+ }
1096
1204
  case "viewer-markup-list" /* MARKUP_LIST */: {
1097
1205
  const payload = data.payload;
1098
1206
  if (!payload || !payload.requestId || !Array.isArray(payload.markups)) break;
@@ -1212,18 +1320,39 @@ var Viewer3D = class {
1212
1320
  if (!this.initialized) throw new Error("Call viewer.init() before using viewer");
1213
1321
  }
1214
1322
  withInitialOptions(url) {
1215
- if (!this.options.initialToolbarVisibility) return url;
1216
1323
  try {
1217
1324
  const parsedUrl = new URL(url, window.location.href);
1218
- parsedUrl.searchParams.set(
1219
- "toolbarVisibility",
1220
- JSON.stringify(this.options.initialToolbarVisibility)
1221
- );
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
+ }
1222
1332
  return parsedUrl.toString();
1223
1333
  } catch {
1224
1334
  return url;
1225
1335
  }
1226
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
+ }
1227
1356
  // ===== typed internal events used by modules =====
1228
1357
  _on(event, cb) {
1229
1358
  return this.emitter.on(event, cb);