@inweb/viewer-visualize 25.3.17 → 25.3.18

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.
@@ -2777,10 +2777,10 @@
2777
2777
  updaterController.initialize(this.viewer);
2778
2778
  this.viewer._abortController = abortController;
2779
2779
  let isFireDatabaseChunk = false;
2780
- const chunkLoadHandler = (progress, data) => {
2780
+ const chunkLoadHandler = (progress, chunk) => {
2781
2781
  if (!this.viewer.visualizeJs)
2782
2782
  return;
2783
- const status = visViewer.parseVsfx(data);
2783
+ const status = visViewer.parseVsfx(chunk);
2784
2784
  updaterController.update(UpdateType.kDelay);
2785
2785
  this.viewer.emitEvent({ type: "geometryprogress", data: progress, model: this.model });
2786
2786
  let state = false;
@@ -2794,16 +2794,16 @@
2794
2794
  this.viewer.syncOpenCloudVisualStyle(false);
2795
2795
  this.viewer.syncOptions();
2796
2796
  this.viewer.resize();
2797
- this.viewer.emitEvent({ type: "databasechunk", data, model: this.model });
2797
+ this.viewer.emitEvent({ type: "databasechunk", data: chunk, model: this.model });
2798
2798
  }
2799
2799
  else {
2800
- this.viewer.emitEvent({ type: "geometrychunk", data, model: this.model });
2800
+ this.viewer.emitEvent({ type: "geometrychunk", data: chunk, model: this.model });
2801
2801
  }
2802
2802
  };
2803
2803
  console.time("File load time");
2804
2804
  try {
2805
2805
  this.viewer.emitEvent({ type: "geometrystart", model: this.model });
2806
- await this.model.partialDownloadResource(this.model.database, chunkLoadHandler, abortController.signal);
2806
+ await this.model.downloadResource(this.model.database, chunkLoadHandler, abortController.signal);
2807
2807
  console.timeEnd("File load time");
2808
2808
  updaterController.update(UpdateType.kNormal);
2809
2809
  this.viewer.emitEvent({ type: "geometryend", model: this.model });
@@ -2816,6 +2816,8 @@
2816
2816
  }
2817
2817
 
2818
2818
  ///////////////////////////////////////////////////////////////////////////////
2819
+ const PENDING_REQUESTS_SIZE = 50;
2820
+ const PENDING_REQUESTS_TIMEOUT = 250;
2819
2821
  class VsfXPartialLoader extends BaseLoader {
2820
2822
  async load() {
2821
2823
  if (!this.viewer.visualizeJs)
@@ -2826,8 +2828,6 @@
2826
2828
  const abortControllerForRequestMap = new Map();
2827
2829
  let servicePartAborted = false;
2828
2830
  const pendingRequestsMap = new Map();
2829
- const PENDING_REQUESTS_SIZE = 50;
2830
- const PENDING_REQUESTS_TIMEOUT = 250;
2831
2831
  let pendingRequestsTimerId = 0;
2832
2832
  const pendingRequestsAbortHandler = () => clearTimeout(pendingRequestsTimerId);
2833
2833
  const pendingRequestsAbortController = new AbortController();
@@ -2837,10 +2837,10 @@
2837
2837
  this.viewer._abortController = abortController;
2838
2838
  this.viewer._abortControllerForRequestMap = abortControllerForRequestMap;
2839
2839
  visViewer.memoryLimit = this.options.memoryLimit;
2840
- const requestLoadHandler = (progress, data, requestId) => {
2840
+ const chunkLoadHandler = (progress, chunk, requestId = 0) => {
2841
2841
  if (!this.viewer.visualizeJs)
2842
2842
  return;
2843
- const state = visViewer.parseVsfxInPartialMode(requestId, data);
2843
+ const state = visViewer.parseVsfxInPartialMode(requestId, chunk);
2844
2844
  updaterController.update(UpdateType.kDelay);
2845
2845
  this.viewer.emitEvent({ type: "geometryprogress", data: progress, model: this.model });
2846
2846
  if (state) {
@@ -2848,103 +2848,111 @@
2848
2848
  this.viewer.syncOpenCloudVisualStyle(false);
2849
2849
  this.viewer.syncOptions();
2850
2850
  this.viewer.resize();
2851
- this.viewer.emitEvent({ type: "databasechunk", data, model: this.model });
2851
+ this.viewer.emitEvent({ type: "databasechunk", data: chunk, model: this.model });
2852
2852
  }
2853
2853
  else {
2854
- this.viewer.emitEvent({ type: "geometrychunk", data, model: this.model });
2854
+ this.viewer.emitEvent({ type: "geometrychunk", data: chunk, model: this.model });
2855
2855
  }
2856
2856
  };
2857
- const downloadPartOfFile = async (requestId, records, dataId, isMultipleParts = false) => {
2857
+ const downloadResourceRange = async (dataId, requestId, ranges) => {
2858
+ console.log("--- VsfXPartialLoader.downloadResourceRange", dataId, requestId, ranges);
2858
2859
  const abortCtrl = new AbortController();
2859
2860
  abortControllerForRequestMap.set(requestId, abortCtrl);
2860
2861
  try {
2861
- await this.model.downloadFileRange(requestId, records, dataId, requestLoadHandler, abortCtrl.signal);
2862
+ await this.model.downloadResourceRange(dataId, ranges, requestId, chunkLoadHandler, abortCtrl.signal);
2862
2863
  }
2863
2864
  catch (error) {
2865
+ console.log("--- VsfXPartialLoader.downloadResourceRange error", dataId, requestId, error);
2864
2866
  this.viewer.emitEvent({ type: "geometryerror", data: error, model: this.model });
2865
2867
  }
2866
2868
  finally {
2867
- const requests = isMultipleParts ? [...new Set(records.map((item) => item.reqId))] : [requestId];
2868
- requests.forEach((requestId) => visViewer.onRequestResponseComplete(requestId));
2869
+ ranges.forEach((range) => visViewer.onRequestResponseComplete(range.requestId));
2869
2870
  abortControllerForRequestMap.delete(requestId);
2870
2871
  updaterController.update(UpdateType.kNormal);
2871
2872
  }
2872
2873
  };
2873
- const recordsToArray = (requestId, records) => {
2874
- const res = [];
2874
+ const requestRecordsToRanges = (requestId, records) => {
2875
+ const ranges = [];
2875
2876
  for (let i = 0; i < records.size(); i++) {
2876
2877
  const record = records.get(i);
2877
- res.push({
2878
- reqId: requestId,
2879
- begin: record.begin,
2880
- end: record.end,
2881
- size: parseInt(record.end, 10) - parseInt(record.begin, 10),
2878
+ ranges.push({
2879
+ requestId,
2880
+ begin: Number(record.begin),
2881
+ end: Number(record.end),
2882
2882
  });
2883
2883
  record.delete();
2884
2884
  }
2885
- return res;
2885
+ return ranges;
2886
2886
  };
2887
2887
  const objectHandler = {
2888
2888
  onServicePartReceived: (bHasIndex) => {
2889
+ console.log("--- VsfXPartialLoader.onServicePartReceived", bHasIndex);
2889
2890
  if (bHasIndex) {
2890
2891
  servicePartAborted = true;
2891
2892
  abortController.abort();
2892
2893
  }
2893
2894
  },
2894
2895
  onRequest: (requestId, records) => {
2895
- downloadPartOfFile(requestId, records, this.model.database);
2896
+ const ranges = requestRecordsToRanges(requestId, records);
2897
+ console.log("--- VsfXPartialLoader.onRequest", this.model.database, requestId, ranges);
2898
+ downloadResourceRange(this.model.database, requestId, ranges);
2896
2899
  },
2897
2900
  onFullLoaded: () => {
2901
+ console.log("--- VsfXPartialLoader.onFullLoaded");
2898
2902
  updaterController.update(UpdateType.kNormal);
2899
- console.timeEnd("File load time");
2900
2903
  },
2901
2904
  onRequestResponseParsed: (requestId) => {
2905
+ console.log("--- VsfXPartialLoader.onRequestResponseParsed", requestId);
2902
2906
  abortControllerForRequestMap.delete(requestId);
2903
2907
  updaterController.update(UpdateType.kNormal);
2904
2908
  },
2905
2909
  onRequestAborted: (requestId) => {
2910
+ console.log("--- VsfXPartialLoader.onRequestAborted", requestId);
2906
2911
  const abortCtrl = abortControllerForRequestMap.get(requestId);
2907
2912
  if (abortCtrl)
2908
2913
  abortCtrl.abort();
2909
2914
  },
2910
- onRequestResourceFile: async (requestId, _, records) => {
2911
- const dataId = `${this.model.fileId}${this.model.file.type}`;
2912
- let pendingRequests = [];
2913
- let recNumber = 0;
2914
- const pendingRequestsRecord = pendingRequestsMap.get(dataId);
2915
- if (pendingRequestsRecord) {
2916
- pendingRequests = pendingRequestsRecord.array;
2917
- recNumber = pendingRequestsRecord.number;
2915
+ onRequestResourceFile: (requestId, dataId, records) => {
2916
+ // const dataId = `${this.model.fileId}${this.model.file.type}`;
2917
+ const ranges = requestRecordsToRanges(requestId, records);
2918
+ console.log("--- VsfXPartialLoader.onRequestResourceFile", dataId, requestId, ranges);
2919
+ let pendingRanges = [];
2920
+ let requestNumber = 0;
2921
+ const pendingRequest = pendingRequestsMap.get(dataId);
2922
+ if (pendingRequest) {
2923
+ pendingRanges = pendingRequest.ranges;
2924
+ requestNumber = pendingRequest.number;
2918
2925
  }
2919
2926
  // first several records of each file are processed without grouping (they usually require to be processed sequentially)
2920
- if (recNumber < 6) {
2921
- pendingRequestsMap.set(dataId, { array: pendingRequests, number: recNumber + 1 });
2922
- await downloadPartOfFile(requestId, records, dataId);
2927
+ if (requestNumber <= 5) {
2928
+ console.log("--- VsfXPartialLoader.onRequestResourceFile: requestNumber <= 5");
2929
+ pendingRequestsMap.set(dataId, { ranges: [], number: requestNumber + 1 });
2930
+ downloadResourceRange(dataId, requestId, ranges);
2923
2931
  return;
2924
2932
  }
2933
+ pendingRanges = pendingRanges.concat(ranges);
2925
2934
  // group requests to each file to launch a combined server request
2926
- if (pendingRequests.length >= PENDING_REQUESTS_SIZE) {
2935
+ if (pendingRanges.length >= PENDING_REQUESTS_SIZE) {
2936
+ console.log("--- VsfXPartialLoader.onRequestResourceFile: pendingRanges.length >", PENDING_REQUESTS_SIZE);
2927
2937
  if (pendingRequestsTimerId) {
2928
2938
  window.clearTimeout(pendingRequestsTimerId);
2929
2939
  pendingRequestsTimerId = 0;
2930
2940
  }
2931
- downloadPartOfFile(requestId, pendingRequests, dataId, true);
2932
- pendingRequests = [...recordsToArray(requestId, records)];
2933
- }
2934
- else {
2935
- pendingRequests = [...pendingRequests, ...recordsToArray(requestId, records)];
2941
+ pendingRequestsMap.set(dataId, { ranges: [], number: requestNumber + 1 });
2942
+ downloadResourceRange(dataId, requestId, pendingRanges);
2943
+ return;
2936
2944
  }
2937
- pendingRequestsMap.set(dataId, { array: pendingRequests, number: recNumber + 1 });
2945
+ pendingRequestsMap.set(dataId, { ranges: pendingRanges, number: requestNumber + 1 });
2938
2946
  // set timeout to wait for the new requests, after that process the remaining requests
2939
2947
  if (pendingRequestsTimerId === 0) {
2940
2948
  pendingRequestsTimerId = window.setTimeout(() => {
2949
+ console.log("--- VsfXPartialLoader.onRequestResourceFile: timer", PENDING_REQUESTS_SIZE);
2941
2950
  pendingRequestsAbortController.signal.removeEventListener("abort", pendingRequestsAbortHandler);
2942
2951
  pendingRequestsTimerId = 0;
2943
- pendingRequestsMap.forEach((requestsRecord, keyFileName) => {
2944
- const array = requestsRecord.array;
2945
- if (array.length > 0) {
2946
- downloadPartOfFile(requestId, array, keyFileName, true);
2947
- pendingRequestsMap.set(keyFileName, { array: [], number: requestsRecord.number + 1 });
2952
+ pendingRequestsMap.forEach((request, dataId) => {
2953
+ if (request.ranges.length > 0) {
2954
+ pendingRequestsMap.set(dataId, { ranges: [], number: request.number + 1 });
2955
+ downloadResourceRange(dataId, requestId, request.ranges);
2948
2956
  }
2949
2957
  });
2950
2958
  }, PENDING_REQUESTS_TIMEOUT);
@@ -2953,11 +2961,10 @@
2953
2961
  },
2954
2962
  };
2955
2963
  visViewer.attachPartialResolver(objectHandler);
2956
- console.time("File load time");
2957
2964
  try {
2958
2965
  this.viewer.emitEvent({ type: "geometrystart", model: this.model });
2959
2966
  await this.model
2960
- .downloadFileRange(0, null, this.model.database, requestLoadHandler, abortController.signal)
2967
+ .downloadResource(this.model.database, chunkLoadHandler, abortController.signal)
2961
2968
  .catch((error) => {
2962
2969
  if (!servicePartAborted)
2963
2970
  throw error;
@@ -2984,22 +2991,25 @@
2984
2991
  const visViewer = visLib.getViewer();
2985
2992
  const abortController = new AbortController();
2986
2993
  this.viewer._abortController = abortController;
2994
+ const chunkLoadHandler = (progress) => {
2995
+ this.viewer.emitEvent({ type: "geometryprogress", data: progress, model: this.model });
2996
+ };
2987
2997
  console.time("File load time");
2988
2998
  try {
2989
2999
  this.viewer.emitEvent({ type: "geometrystart", model: this.model });
2990
- const progressCb = (progress) => this.viewer.emitEvent({ type: "geometryprogress", data: progress, model: this.model });
2991
- const arrayBuffer = await this.model.downloadResource(this.model.database, progressCb, abortController.signal);
3000
+ const arrayBuffer = await this.model.downloadResource(this.model.database, chunkLoadHandler, abortController.signal);
2992
3001
  if (abortController.signal.aborted) {
2993
3002
  await Promise.reject(new Error(`Open model aborted ${this.model.name}`));
2994
3003
  }
3004
+ const data = new Uint8Array(arrayBuffer);
2995
3005
  if (this.viewer.visualizeJs) {
2996
- visViewer.parseVsfx(new Uint8Array(arrayBuffer));
2997
- this.viewer.update(true);
3006
+ visViewer.parseVsfx(data);
2998
3007
  this.viewer.syncOpenCloudVisualStyle(false);
2999
3008
  this.viewer.syncOptions();
3000
3009
  this.viewer.resize();
3001
3010
  }
3002
3011
  console.timeEnd("File load time");
3012
+ this.viewer.emitEvent({ type: "databasechunk", data, model: this.model });
3003
3013
  this.viewer.emitEvent({ type: "geometryend", model: this.model });
3004
3014
  }
3005
3015
  catch (error) {
@@ -16662,9 +16672,9 @@
16662
16672
  visualStyleId = visViewer.findVisualStyle("OpenCloud");
16663
16673
  }
16664
16674
  catch (e) {
16665
- if (!isInitializing) {
16666
- console.log("OpenCloud visual style not found, creating it on client side");
16667
- }
16675
+ // if (!isInitializing) {
16676
+ // console.log("OpenCloud visual style not found, creating it on client side");
16677
+ // }
16668
16678
  visualStyleId = visViewer.createVisualStyle("OpenCloud");
16669
16679
  const colorDef = new visLib.OdTvColorDef(66, 66, 66);
16670
16680
  const shadedVsId = visViewer.findVisualStyle("Realistic");
@@ -17023,7 +17033,7 @@
17023
17033
  throw new Error("No default model found");
17024
17034
  const overrideOptions = new Options();
17025
17035
  overrideOptions.data = this.options.data;
17026
- if (file.type === ".rcs") {
17036
+ if (file.type === ".rcs" && !overrideOptions.enablePartialMode) {
17027
17037
  console.log("Partial load mode is forced for RCS file");
17028
17038
  overrideOptions.enablePartialMode = true;
17029
17039
  }