@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.
- package/dist/viewer-visualize.js +68 -58
- package/dist/viewer-visualize.js.map +1 -1
- package/dist/viewer-visualize.min.js +1 -1
- package/dist/viewer-visualize.module.js +81 -65
- package/dist/viewer-visualize.module.js.map +1 -1
- package/package.json +1 -1
- package/src/Viewer/Loaders/VsfXLoader.ts +13 -5
- package/src/Viewer/Loaders/VsfXPartialLoader.ts +70 -48
- package/src/Viewer/Loaders/VsfXStreamingLoader.ts +5 -5
- package/src/Viewer/Viewer.ts +4 -4
package/dist/viewer-visualize.js
CHANGED
|
@@ -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,
|
|
2780
|
+
const chunkLoadHandler = (progress, chunk) => {
|
|
2781
2781
|
if (!this.viewer.visualizeJs)
|
|
2782
2782
|
return;
|
|
2783
|
-
const status = visViewer.parseVsfx(
|
|
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.
|
|
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
|
|
2840
|
+
const chunkLoadHandler = (progress, chunk, requestId = 0) => {
|
|
2841
2841
|
if (!this.viewer.visualizeJs)
|
|
2842
2842
|
return;
|
|
2843
|
-
const state = visViewer.parseVsfxInPartialMode(requestId,
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
|
2874
|
-
const
|
|
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
|
-
|
|
2878
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
2911
|
-
const dataId = `${this.model.fileId}${this.model.file.type}`;
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
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 (
|
|
2921
|
-
|
|
2922
|
-
|
|
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 (
|
|
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
|
-
|
|
2932
|
-
|
|
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, {
|
|
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((
|
|
2944
|
-
|
|
2945
|
-
|
|
2946
|
-
|
|
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
|
-
.
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
}
|