@itwin/saved-views-react 0.5.0 → 0.7.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.
- package/README.md +38 -4
- package/lib/SavedView.d.ts +41 -11
- package/lib/SavedViewTile/SavedViewOptions.js +10 -10
- package/lib/SavedViewTile/SavedViewTile.css +8 -1
- package/lib/SavedViewTile/SavedViewTile.d.ts +4 -3
- package/lib/SavedViewTile/SavedViewTile.js +5 -9
- package/lib/SavedViewTile/SavedViewTileContext.d.ts +0 -1
- package/lib/SavedViewTile/SavedViewTileContext.js +1 -1
- package/lib/SavedViewsClient/ITwinSavedViewsClient.d.ts +21 -23
- package/lib/SavedViewsClient/ITwinSavedViewsClient.js +120 -57
- package/lib/SavedViewsClient/SavedViewsClient.d.ts +68 -45
- package/lib/SavedViewsWidget/SavedViewGroupTile/SavedViewGroupTile.js +2 -3
- package/lib/SavedViewsWidget/SavedViewGroupTile/SavedViewGroupTileContext.d.ts +0 -1
- package/lib/SavedViewsWidget/SavedViewGroupTile/SavedViewGroupTileContext.js +1 -1
- package/lib/SavedViewsWidget/SavedViewsExpandableBlockWidget.d.ts +5 -3
- package/lib/SavedViewsWidget/SavedViewsExpandableBlockWidget.js +3 -3
- package/lib/SavedViewsWidget/SavedViewsFolderWidget.d.ts +5 -4
- package/lib/SavedViewsWidget/SavedViewsFolderWidget.js +7 -7
- package/lib/applySavedView.d.ts +36 -31
- package/lib/applySavedView.js +61 -26
- package/lib/captureSavedViewData.d.ts +31 -5
- package/lib/captureSavedViewData.js +103 -63
- package/lib/captureSavedViewThumbnail.d.ts +8 -1
- package/lib/captureSavedViewThumbnail.js +15 -7
- package/lib/createViewState.d.ts +22 -5
- package/lib/createViewState.js +28 -25
- package/lib/index.d.ts +10 -10
- package/lib/index.js +7 -7
- package/lib/translation/SavedViewTypes.d.ts +1 -1
- package/lib/translation/SavedViewsExtensionHandlers.d.ts +3 -0
- package/lib/translation/SavedViewsExtensionHandlers.js +14 -0
- package/lib/translation/clipVectorsLegacyExtractor.js +4 -0
- package/lib/translation/displayStyleExtractor.js +80 -3
- package/lib/translation/extractionUtilities.d.ts +9 -1
- package/lib/translation/extractionUtilities.js +16 -0
- package/lib/useSavedViews.d.ts +172 -34
- package/lib/useSavedViews.js +475 -503
- package/lib/utils.d.ts +8 -0
- package/lib/utils.js +13 -0
- package/package.json +9 -9
|
@@ -1,25 +1,59 @@
|
|
|
1
1
|
import { QueryRowFormat } from "@itwin/core-common";
|
|
2
|
+
import { extensionHandlers } from "./translation/SavedViewsExtensionHandlers.js";
|
|
2
3
|
import { extractClipVectorsFromLegacy } from "./translation/clipVectorsLegacyExtractor.js";
|
|
3
4
|
import { extractDisplayStyle2dFromLegacy, extractDisplayStyle3dFromLegacy, } from "./translation/displayStyleExtractor.js";
|
|
5
|
+
/**
|
|
6
|
+
* Captures current {@link Viewport} state into serializable format. The returned
|
|
7
|
+
* data can later be used to restore viewport's view.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import { captureSavedViewData, captureSavedViewThumbnail } from "@itwin/saved-views-react";
|
|
11
|
+
*
|
|
12
|
+
* async function saveViewport(viewport) {
|
|
13
|
+
* const { viewData, extensions = [] } = await captureSavedViewData({ viewport });
|
|
14
|
+
* const myExtensions = captureMyCustomViewportState(viewport);
|
|
15
|
+
* const thumbnail = captureSavedViewThumbnail(viewport);
|
|
16
|
+
* return { thumbnail, viewData, extensions: extensions.concat(myExtensions) };
|
|
17
|
+
* }
|
|
18
|
+
*/
|
|
4
19
|
export async function captureSavedViewData(args) {
|
|
5
|
-
const
|
|
6
|
-
if (args.
|
|
20
|
+
const extensions = [];
|
|
21
|
+
if (!args.omitEmphasis) {
|
|
22
|
+
extensions.push(extensionHandlers.emphasizeElements);
|
|
23
|
+
}
|
|
24
|
+
if (!args.omitPerModelCategoryVisibility) {
|
|
25
|
+
extensions.push(extensionHandlers.perModelCategoryVisibility);
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
viewData: await createSavedViewVariant(args.viewport),
|
|
29
|
+
extensions: extensions
|
|
30
|
+
.map((extension) => ({
|
|
31
|
+
extensionName: extension.extensionName,
|
|
32
|
+
data: extension.capture(args.viewport),
|
|
33
|
+
}))
|
|
34
|
+
.filter(({ data }) => data !== undefined),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function createSavedViewVariant(viewport) {
|
|
38
|
+
const hiddenCategoriesPromise = queryMissingCategories(viewport.iModel, new Set(viewport.view.categorySelector.toJSON().categories));
|
|
39
|
+
if (viewport.view.isSpatialView()) {
|
|
7
40
|
const [hiddenCategories, hiddenModels] = await Promise.all([
|
|
8
41
|
hiddenCategoriesPromise,
|
|
9
|
-
|
|
42
|
+
queryMissingModels(viewport.iModel, new Set(viewport.view.modelSelector.toJSON().models)),
|
|
10
43
|
]);
|
|
11
|
-
return createSpatialSavedViewObject(
|
|
44
|
+
return createSpatialSavedViewObject(viewport, hiddenCategories, hiddenModels);
|
|
12
45
|
}
|
|
13
|
-
if (
|
|
14
|
-
return createDrawingSavedViewObject(
|
|
46
|
+
if (viewport.view.isDrawingView()) {
|
|
47
|
+
return createDrawingSavedViewObject(viewport, await hiddenCategoriesPromise);
|
|
15
48
|
}
|
|
16
|
-
return createSheetSavedViewObject(
|
|
49
|
+
return createSheetSavedViewObject(viewport, await hiddenCategoriesPromise);
|
|
17
50
|
}
|
|
18
51
|
function createSpatialSavedViewObject(vp, hiddenCategories, hiddenModels) {
|
|
19
52
|
const viewState = vp.view;
|
|
20
53
|
const displayStyleProps = viewState.displayStyle.toJSON();
|
|
21
54
|
// Clear the timePoint if no schedule script is available on the viewState
|
|
22
|
-
if (viewState.is3d() && displayStyleProps.jsonProperties?.styles?.timePoint &&
|
|
55
|
+
if (viewState.is3d() && displayStyleProps.jsonProperties?.styles?.timePoint &&
|
|
56
|
+
!viewState.displayStyle.scheduleScript) {
|
|
23
57
|
displayStyleProps.jsonProperties.styles.timePoint = undefined;
|
|
24
58
|
}
|
|
25
59
|
// Omit the schedule script - may cause excessively large JSON.
|
|
@@ -28,26 +62,25 @@ function createSpatialSavedViewObject(vp, hiddenCategories, hiddenModels) {
|
|
|
28
62
|
}
|
|
29
63
|
const viewDefinitionProps = viewState.toJSON();
|
|
30
64
|
return {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
},
|
|
48
|
-
displayStyle: extractDisplayStyle3dFromLegacy(displayStyleProps),
|
|
49
|
-
clipVectors: extractClipVectorsFromLegacy(viewDefinitionProps),
|
|
65
|
+
type: "iTwin3d",
|
|
66
|
+
origin: toArrayVector3d(viewDefinitionProps.origin),
|
|
67
|
+
extents: toArrayVector3d(viewDefinitionProps.extents),
|
|
68
|
+
angles: viewDefinitionProps.angles && toYawPitchRoll(viewDefinitionProps.angles),
|
|
69
|
+
camera: viewDefinitionProps.cameraOn ? {
|
|
70
|
+
lens: toDegrees(viewDefinitionProps.camera.lens) ?? 0,
|
|
71
|
+
focusDist: viewDefinitionProps.camera.focusDist,
|
|
72
|
+
eye: toArrayVector3d(viewDefinitionProps.camera.eye),
|
|
73
|
+
} : undefined,
|
|
74
|
+
categories: {
|
|
75
|
+
enabled: viewState.categorySelector.toJSON().categories,
|
|
76
|
+
disabled: hiddenCategories,
|
|
77
|
+
},
|
|
78
|
+
models: {
|
|
79
|
+
enabled: viewState.modelSelector.toJSON().models,
|
|
80
|
+
disabled: hiddenModels,
|
|
50
81
|
},
|
|
82
|
+
displayStyle: extractDisplayStyle3dFromLegacy(displayStyleProps),
|
|
83
|
+
clipVectors: extractClipVectorsFromLegacy(viewDefinitionProps),
|
|
51
84
|
};
|
|
52
85
|
}
|
|
53
86
|
function toArrayVector3d(xyzProps) {
|
|
@@ -67,17 +100,16 @@ function createDrawingSavedViewObject(vp, hiddenCategories) {
|
|
|
67
100
|
const viewState = vp.view;
|
|
68
101
|
const viewDefinitionProps = viewState.toJSON();
|
|
69
102
|
return {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
},
|
|
103
|
+
type: "iTwinDrawing",
|
|
104
|
+
modelExtents: {},
|
|
105
|
+
baseModelId: viewDefinitionProps.baseModelId,
|
|
106
|
+
origin: toArrayVector2d(viewDefinitionProps.origin),
|
|
107
|
+
delta: toArrayVector2d(viewDefinitionProps.delta),
|
|
108
|
+
angle: toDegrees(viewDefinitionProps.angle) ?? 0,
|
|
109
|
+
displayStyle: extractDisplayStyle2dFromLegacy(viewState.displayStyle.toJSON()),
|
|
110
|
+
categories: {
|
|
111
|
+
enabled: viewState.categorySelector.toJSON().categories,
|
|
112
|
+
disabled: hiddenCategories,
|
|
81
113
|
},
|
|
82
114
|
};
|
|
83
115
|
}
|
|
@@ -85,20 +117,19 @@ function createSheetSavedViewObject(vp, hiddenCategories) {
|
|
|
85
117
|
const viewState = vp.view;
|
|
86
118
|
const viewDefinitionProps = viewState.toJSON();
|
|
87
119
|
return {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
},
|
|
98
|
-
width: viewState.sheetSize.x,
|
|
99
|
-
height: viewState.sheetSize.y,
|
|
100
|
-
sheetAttachments: viewState.attachmentIds,
|
|
120
|
+
type: "iTwinSheet",
|
|
121
|
+
baseModelId: viewDefinitionProps.baseModelId,
|
|
122
|
+
origin: toArrayVector2d(viewDefinitionProps.origin),
|
|
123
|
+
delta: toArrayVector2d(viewDefinitionProps.delta),
|
|
124
|
+
angle: toDegrees(viewDefinitionProps.angle) ?? 0,
|
|
125
|
+
displayStyle: extractDisplayStyle2dFromLegacy(viewState.displayStyle.toJSON()),
|
|
126
|
+
categories: {
|
|
127
|
+
enabled: viewState.categorySelector.toJSON().categories,
|
|
128
|
+
disabled: hiddenCategories,
|
|
101
129
|
},
|
|
130
|
+
width: viewState.sheetSize.x,
|
|
131
|
+
height: viewState.sheetSize.y,
|
|
132
|
+
sheetAttachments: viewState.attachmentIds,
|
|
102
133
|
};
|
|
103
134
|
}
|
|
104
135
|
function toArrayVector2d(xyzProps) {
|
|
@@ -119,28 +150,37 @@ function toDegrees(angle) {
|
|
|
119
150
|
}
|
|
120
151
|
return undefined;
|
|
121
152
|
}
|
|
122
|
-
export async function
|
|
123
|
-
|
|
124
|
-
|
|
153
|
+
export async function queryMissingModels(iModel, knownModels) {
|
|
154
|
+
if (iModel.isBlank) {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
const allModels = await queryAllSpatiallyLocatedModels(iModel);
|
|
158
|
+
return allModels.filter((modelId) => !knownModels.has(modelId));
|
|
125
159
|
}
|
|
126
|
-
async function
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
//
|
|
160
|
+
export async function queryAllSpatiallyLocatedModels(iModel) {
|
|
161
|
+
// BisCore ECSchema gained IsNotSpatiallyLocated property in 2019, almost exactly
|
|
162
|
+
// one year after the initial iTwin.js release. The following query will fail to
|
|
163
|
+
// compile with iModels created in that time frame unless user has performed
|
|
164
|
+
// schema upgrade which assigned NULL value to the property.
|
|
130
165
|
try {
|
|
131
166
|
return await executeQuery(iModel, "SELECT ECInstanceId FROM Bis.GeometricModel3D WHERE IsPrivate = false AND IsTemplate = false AND (IsNotSpatiallyLocated IS NULL OR IsNotSpatiallyLocated = false)");
|
|
132
167
|
}
|
|
133
168
|
catch {
|
|
169
|
+
// Above query failed, assume we have an old iModel
|
|
134
170
|
return executeQuery(iModel, "SELECT ECInstanceId FROM Bis.GeometricModel3D WHERE IsPrivate = false AND IsTemplate = false");
|
|
135
171
|
}
|
|
136
172
|
}
|
|
137
|
-
export async function
|
|
138
|
-
|
|
139
|
-
|
|
173
|
+
export async function queryMissingCategories(iModel, knownCategories) {
|
|
174
|
+
if (iModel.isBlank) {
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
const allCategories = await queryAllCategories(iModel);
|
|
178
|
+
return allCategories.filter((categoryId) => !knownCategories.has(categoryId));
|
|
140
179
|
}
|
|
141
|
-
async function
|
|
180
|
+
export async function queryAllCategories(iModel) {
|
|
142
181
|
return executeQuery(iModel, "SELECT DISTINCT Category.Id AS id FROM BisCore.GeometricElement3d WHERE Category.Id IN (SELECT ECInstanceId FROM BisCore.SpatialCategory)");
|
|
143
182
|
}
|
|
144
183
|
async function executeQuery(iModel, query) {
|
|
145
|
-
|
|
184
|
+
const result = await iModel.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes }).toArray();
|
|
185
|
+
return result.flat();
|
|
146
186
|
}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { type Viewport } from "@itwin/core-frontend";
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Generates Saved View thumbnail based on what is currently displayed on the {@linkcode viewport}.
|
|
4
|
+
* @returns base64-encoded URL string, or `undefined` if the thumbnail could not be generated
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const thumbnail = captureSavedViewThumbnail(viewport);
|
|
8
|
+
* console.log(thumbnail); // "data:image/png;base64,iVBORw0KGoAAAANSUhEUg..."
|
|
9
|
+
*/
|
|
3
10
|
export declare function captureSavedViewThumbnail(viewport: Viewport, width?: number, height?: number): string | undefined;
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { getCenteredViewRect, imageBufferToCanvas } from "@itwin/core-frontend";
|
|
2
2
|
import { Point2d } from "@itwin/core-geometry";
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Generates Saved View thumbnail based on what is currently displayed on the {@linkcode viewport}.
|
|
5
|
+
* @returns base64-encoded URL string, or `undefined` if the thumbnail could not be generated
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const thumbnail = captureSavedViewThumbnail(viewport);
|
|
9
|
+
* console.log(thumbnail); // "data:image/png;base64,iVBORw0KGoAAAANSUhEUg..."
|
|
10
|
+
*/
|
|
4
11
|
export function captureSavedViewThumbnail(viewport, width = 280, height = 200) {
|
|
5
12
|
const thumbnail = getThumbnail(viewport, width, height);
|
|
6
13
|
if (!thumbnail) {
|
|
@@ -11,15 +18,16 @@ export function captureSavedViewThumbnail(viewport, width = 280, height = 200) {
|
|
|
11
18
|
}
|
|
12
19
|
function getThumbnail(vp, width, height) {
|
|
13
20
|
const size = new Point2d(width, height);
|
|
14
|
-
// Passing in vp.target.viewRect instead of vp.viewRect because currently vp.viewRect
|
|
15
|
-
// cases when a new dialog is created. The bottom
|
|
16
|
-
//
|
|
17
|
-
//
|
|
21
|
+
// Passing in vp.target.viewRect instead of vp.viewRect because currently vp.viewRect
|
|
22
|
+
// is not updated correctly in some cases when a new dialog is created. The bottom
|
|
23
|
+
// property would be 2px higher than the renderRect in readImageBuffer which
|
|
24
|
+
// caused the method to return undefined. vp.target.viewRect allows us to have
|
|
25
|
+
// the correct dimensions when creating the thumbnail.
|
|
18
26
|
const thumbnail = vp.readImageBuffer({ rect: getCenteredViewRect(vp.target.viewRect), size });
|
|
19
27
|
if (thumbnail) {
|
|
20
28
|
return thumbnail;
|
|
21
29
|
}
|
|
22
|
-
// Since using vp.target.viewRect while creating thumbnail returns undefined
|
|
23
|
-
// vp.viewRect
|
|
30
|
+
// Since using vp.target.viewRect while creating thumbnail returns undefined
|
|
31
|
+
// for some, we switch back to using vp.viewRect
|
|
24
32
|
return vp.readImageBuffer({ rect: getCenteredViewRect(vp.viewRect), size });
|
|
25
33
|
}
|
package/lib/createViewState.d.ts
CHANGED
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
import { type IModelConnection, type ViewState } from "@itwin/core-frontend";
|
|
2
|
-
import { ViewData } from "
|
|
2
|
+
import type { ViewData } from "./SavedView.js";
|
|
3
3
|
export interface ViewStateCreateSettings {
|
|
4
4
|
/**
|
|
5
|
-
* Normally
|
|
6
|
-
*
|
|
5
|
+
* Normally {@link createViewState} function invokes and awaits {@linkcode ViewState.load}
|
|
6
|
+
* method before returning. You may skip this step if you intend to perform it later.
|
|
7
7
|
* @default false
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* const viewState = await createViewState(iModel, savedViewData.viewData, { skipViewStateLoad: true });
|
|
11
|
+
* viewState.categorySelector.addCategories("<additional_category_id>");
|
|
12
|
+
* await viewState.load();
|
|
8
13
|
*/
|
|
9
14
|
skipViewStateLoad?: boolean | undefined;
|
|
10
15
|
/**
|
|
11
|
-
* How to handle visibility of models and categories that exist in iModel but
|
|
16
|
+
* How to handle visibility of models and categories that exist in iModel but
|
|
17
|
+
* not captured in Saved View data.
|
|
12
18
|
* @default "hidden"
|
|
13
19
|
*/
|
|
14
20
|
modelAndCategoryVisibilityFallback?: "visible" | "hidden" | undefined;
|
|
15
21
|
}
|
|
16
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Creates {@link ViewState} object out of Saved View data. It provides a lower-level
|
|
24
|
+
* access to view data for advanced use.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* const viewState = await createViewState(iModel, savedViewData.viewData);
|
|
28
|
+
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
29
|
+
*
|
|
30
|
+
* // The two lines above are equivalent to
|
|
31
|
+
* await applySavedView(iModel, viewport, savedViewData);
|
|
32
|
+
*/
|
|
33
|
+
export declare function createViewState(iModel: IModelConnection, viewData: ViewData, settings?: ViewStateCreateSettings): Promise<ViewState>;
|
package/lib/createViewState.js
CHANGED
|
@@ -2,30 +2,40 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
import { Camera,
|
|
5
|
+
import { Camera, } from "@itwin/core-common";
|
|
6
6
|
import { DrawingViewState, SheetViewState, SpatialViewState, } from "@itwin/core-frontend";
|
|
7
|
-
import {
|
|
8
|
-
import { getMissingCategories, getMissingModels } from "./captureSavedViewData.js";
|
|
7
|
+
import { queryMissingCategories, queryMissingModels } from "./captureSavedViewData.js";
|
|
9
8
|
import { extractClipVectors } from "./translation/clipVectorsExtractor.js";
|
|
10
9
|
import { extractDisplayStyle, extractDisplayStyle3d } from "./translation/displayStyleExtractor.js";
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Creates {@link ViewState} object out of Saved View data. It provides a lower-level
|
|
12
|
+
* access to view data for advanced use.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const viewState = await createViewState(iModel, savedViewData.viewData);
|
|
16
|
+
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
17
|
+
*
|
|
18
|
+
* // The two lines above are equivalent to
|
|
19
|
+
* await applySavedView(iModel, viewport, savedViewData);
|
|
20
|
+
*/
|
|
21
|
+
export async function createViewState(iModel, viewData, settings = {}) {
|
|
22
|
+
const viewState = await createViewStateVariant(iModel, viewData);
|
|
13
23
|
if (settings.modelAndCategoryVisibilityFallback === "visible") {
|
|
14
|
-
await unhideNewModelsAndCategories(iModel, viewState,
|
|
24
|
+
await unhideNewModelsAndCategories(iModel, viewState, viewData);
|
|
15
25
|
}
|
|
16
26
|
if (!settings.skipViewStateLoad) {
|
|
17
27
|
await viewState.load();
|
|
18
28
|
}
|
|
19
29
|
return viewState;
|
|
20
30
|
}
|
|
21
|
-
async function createViewStateVariant(iModel,
|
|
22
|
-
if (
|
|
23
|
-
return createDrawingViewState(iModel,
|
|
31
|
+
async function createViewStateVariant(iModel, viewData) {
|
|
32
|
+
if (viewData.type === "iTwinDrawing") {
|
|
33
|
+
return createDrawingViewState(iModel, viewData);
|
|
24
34
|
}
|
|
25
|
-
if (
|
|
26
|
-
return createSheetViewState(iModel,
|
|
35
|
+
if (viewData.type === "iTwinSheet") {
|
|
36
|
+
return createSheetViewState(iModel, viewData);
|
|
27
37
|
}
|
|
28
|
-
return createSpatialViewState(iModel,
|
|
38
|
+
return createSpatialViewState(iModel, viewData);
|
|
29
39
|
}
|
|
30
40
|
async function createSpatialViewState(iModel, viewData) {
|
|
31
41
|
const seedViewState = await fetchIModelViewData(iModel, SpatialViewState.classFullName);
|
|
@@ -202,10 +212,7 @@ function createEmptyViewState(iModel, viewClassName) {
|
|
|
202
212
|
async function getDefaultViewIdFromClassName(iModel, viewClassName) {
|
|
203
213
|
// Check validity of default view
|
|
204
214
|
const viewId = await iModel.views.queryDefaultViewId();
|
|
205
|
-
const
|
|
206
|
-
params.from = viewClassName;
|
|
207
|
-
params.where = "ECInstanceId=" + viewId;
|
|
208
|
-
const viewProps = await IModelReadRpcInterface.getClient().queryElementProps(iModel.getRpcProps(), params);
|
|
215
|
+
const viewProps = await iModel.elements.queryProps({ from: viewClassName, where: "ECInstanceId=" + viewId });
|
|
209
216
|
if (viewProps.length > 0) {
|
|
210
217
|
return viewId;
|
|
211
218
|
}
|
|
@@ -219,29 +226,25 @@ async function getDefaultViewIdFromClassName(iModel, viewClassName) {
|
|
|
219
226
|
function cloneCode({ spec, scope, value }) {
|
|
220
227
|
return { spec, scope, value };
|
|
221
228
|
}
|
|
222
|
-
async function unhideNewModelsAndCategories(iModel, viewState,
|
|
223
|
-
if (
|
|
229
|
+
async function unhideNewModelsAndCategories(iModel, viewState, viewData) {
|
|
230
|
+
if (viewData.type === "iTwin3d") {
|
|
224
231
|
if (!viewState.isSpatialView()) {
|
|
225
232
|
return;
|
|
226
233
|
}
|
|
227
|
-
const viewData = savedViewData.itwin3dView;
|
|
228
234
|
if (!viewData.categories?.disabled || !viewData.models?.disabled) {
|
|
229
235
|
return;
|
|
230
236
|
}
|
|
231
237
|
const [visibleCategories, visibleModels] = await Promise.all([
|
|
232
|
-
|
|
233
|
-
|
|
238
|
+
queryMissingCategories(iModel, new Set(viewData.categories.disabled)),
|
|
239
|
+
queryMissingModels(iModel, new Set(viewData.models.disabled)),
|
|
234
240
|
]);
|
|
235
241
|
viewState.categorySelector.addCategories(visibleCategories);
|
|
236
242
|
viewState.modelSelector.addModels(visibleModels);
|
|
237
243
|
return;
|
|
238
244
|
}
|
|
239
|
-
const viewData = isViewDataITwinDrawing(savedViewData)
|
|
240
|
-
? savedViewData.itwinDrawingView
|
|
241
|
-
: savedViewData.itwinSheetView;
|
|
242
245
|
if (!viewData.categories?.disabled) {
|
|
243
246
|
return;
|
|
244
247
|
}
|
|
245
|
-
const visibleCategories = await
|
|
248
|
+
const visibleCategories = await queryMissingCategories(iModel, new Set(viewData.categories.disabled));
|
|
246
249
|
viewState.categorySelector.addCategories(visibleCategories);
|
|
247
250
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
+
export { applySavedView, type ApplySavedViewSettings } from "./applySavedView.js";
|
|
2
|
+
export { captureSavedViewData } from "./captureSavedViewData.js";
|
|
3
|
+
export { captureSavedViewThumbnail } from "./captureSavedViewThumbnail.js";
|
|
4
|
+
export { createViewState, type ViewStateCreateSettings } from "./createViewState.js";
|
|
1
5
|
export { LayeredDropdownMenu, LayeredMenuItem } from "./LayeredDropdownMenu/LayeredDropdownMenu.js";
|
|
2
|
-
export
|
|
6
|
+
export { defaultLocalization, type LocalizationStrings } from "./localization.js";
|
|
7
|
+
export type { ITwin3dViewData, ITwinDrawingdata, ITwinSheetData, SavedView, SavedViewData, SavedViewGroup, SavedViewTag, ViewData, } from "./SavedView.js";
|
|
8
|
+
export { ITwinSavedViewsClient } from "./SavedViewsClient/ITwinSavedViewsClient.js";
|
|
9
|
+
export type { CreateGroupArgs, CreateSavedViewArgs, CreateTagArgs, DeleteGroupArgs, DeleteSavedViewArgs, DeleteTagArgs, GetGroupsArgs, GetSavedViewByIdArgs, GetSavedViewsArgs, GetTagsArgs, GetThumbnailUrlArgs, SavedViewsClient, UpdateGroupArgs, UpdateSavedViewArgs, UpdateTagArgs, UploadThumbnailArgs, } from "./SavedViewsClient/SavedViewsClient.js";
|
|
10
|
+
export { SavedViewsContextProvider, type SavedViewsContext } from "./SavedViewsContext.js";
|
|
3
11
|
export { SavedViewOptions } from "./SavedViewTile/SavedViewOptions.js";
|
|
4
12
|
export { SavedViewTile } from "./SavedViewTile/SavedViewTile.js";
|
|
5
13
|
export { useSavedViewTileContext, type SavedViewTileContext } from "./SavedViewTile/SavedViewTileContext.js";
|
|
6
|
-
export { ITwinSavedViewsClient } from "./SavedViewsClient/ITwinSavedViewsClient.js";
|
|
7
|
-
export type { CreateGroupParams, CreateSavedViewParams, CreateTagParams, DeleteGroupParams, DeleteSavedViewParams, DeleteTagParams, GetSavedViewInfoParams, GetSingularSavedViewParams, GetThumbnailUrlParams, SavedViewInfo, SavedViewsClient, UpdateGroupParams, UpdateSavedViewParams, UpdateTagParams, UploadThumbnailParams, } from "./SavedViewsClient/SavedViewsClient.js";
|
|
8
|
-
export { SavedViewsContextProvider, type SavedViewsContext } from "./SavedViewsContext.js";
|
|
9
14
|
export { StickyExpandableBlock } from "./StickyExpandableBlock/StickyExpandableBlock.js";
|
|
10
15
|
export { TileGrid } from "./TileGrid/TileGrid.js";
|
|
11
|
-
export {
|
|
12
|
-
export { captureSavedViewData } from "./captureSavedViewData.js";
|
|
13
|
-
export { captureSavedViewThumbnail } from "./captureSavedViewThumbnail.js";
|
|
14
|
-
export { createViewState, type ViewStateCreateSettings } from "./createViewState.js";
|
|
15
|
-
export { defaultLocalization, type LocalizationStrings } from "./localization.js";
|
|
16
|
-
export { useSavedViews, type SavedViewActions } from "./useSavedViews.js";
|
|
16
|
+
export { useSavedViews, type SavedViewsActions } from "./useSavedViews.js";
|
package/lib/index.js
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
export { applySavedView } from "./applySavedView.js";
|
|
6
|
+
export { captureSavedViewData } from "./captureSavedViewData.js";
|
|
7
|
+
export { captureSavedViewThumbnail } from "./captureSavedViewThumbnail.js";
|
|
8
|
+
export { createViewState } from "./createViewState.js";
|
|
5
9
|
export { LayeredDropdownMenu, LayeredMenuItem } from "./LayeredDropdownMenu/LayeredDropdownMenu.js";
|
|
10
|
+
export { defaultLocalization } from "./localization.js";
|
|
11
|
+
export { ITwinSavedViewsClient } from "./SavedViewsClient/ITwinSavedViewsClient.js";
|
|
12
|
+
export { SavedViewsContextProvider } from "./SavedViewsContext.js";
|
|
6
13
|
export { SavedViewOptions } from "./SavedViewTile/SavedViewOptions.js";
|
|
7
14
|
export { SavedViewTile } from "./SavedViewTile/SavedViewTile.js";
|
|
8
15
|
export { useSavedViewTileContext } from "./SavedViewTile/SavedViewTileContext.js";
|
|
9
|
-
export { ITwinSavedViewsClient } from "./SavedViewsClient/ITwinSavedViewsClient.js";
|
|
10
|
-
export { SavedViewsContextProvider } from "./SavedViewsContext.js";
|
|
11
16
|
export { StickyExpandableBlock } from "./StickyExpandableBlock/StickyExpandableBlock.js";
|
|
12
17
|
export { TileGrid } from "./TileGrid/TileGrid.js";
|
|
13
|
-
export { applySavedView } from "./applySavedView.js";
|
|
14
|
-
export { captureSavedViewData } from "./captureSavedViewData.js";
|
|
15
|
-
export { captureSavedViewThumbnail } from "./captureSavedViewThumbnail.js";
|
|
16
|
-
export { createViewState } from "./createViewState.js";
|
|
17
|
-
export { defaultLocalization } from "./localization.js";
|
|
18
18
|
export { useSavedViews } from "./useSavedViews.js";
|
|
@@ -4,7 +4,6 @@ import type { Range3dProps } from "@itwin/core-geometry";
|
|
|
4
4
|
export interface LegacySavedView3d extends LegacySavedViewBase {
|
|
5
5
|
displayStyleProps: DisplayStyle3dProps;
|
|
6
6
|
modelSelectorProps: ModelSelectorProps;
|
|
7
|
-
modelExtents?: Range3dProps;
|
|
8
7
|
viewDefinitionProps: SpatialViewDefinitionProps;
|
|
9
8
|
perModelCategoryVisibility?: PerModelCategoryVisibilityProps[];
|
|
10
9
|
hiddenModels?: Id64Array;
|
|
@@ -20,6 +19,7 @@ export interface LegacySavedView2d extends LegacySavedViewBase {
|
|
|
20
19
|
sectionDrawing?: SectionDrawingViewProps;
|
|
21
20
|
sheetProps?: SheetProps;
|
|
22
21
|
sheetAttachments?: Id64Array;
|
|
22
|
+
modelExtents?: Range3dProps;
|
|
23
23
|
}
|
|
24
24
|
export interface LegacySavedViewBase {
|
|
25
25
|
id: string;
|
|
@@ -3,16 +3,19 @@ export interface ExtensionHandler {
|
|
|
3
3
|
extensionName: string;
|
|
4
4
|
apply: (extensionData: string, viewport: Viewport) => void;
|
|
5
5
|
reset: (viewport: Viewport) => void;
|
|
6
|
+
capture: (viewport: Viewport) => string | undefined;
|
|
6
7
|
}
|
|
7
8
|
export declare const extensionHandlers: {
|
|
8
9
|
emphasizeElements: {
|
|
9
10
|
extensionName: string;
|
|
10
11
|
apply: (extensionData: string, viewport: Viewport) => void;
|
|
11
12
|
reset: (viewport: Viewport) => void;
|
|
13
|
+
capture: (viewport: Viewport) => string | undefined;
|
|
12
14
|
};
|
|
13
15
|
perModelCategoryVisibility: {
|
|
14
16
|
extensionName: string;
|
|
15
17
|
apply: (extensionData: string, viewport: Viewport) => void;
|
|
16
18
|
reset: (viewport: Viewport) => void;
|
|
19
|
+
capture: (viewport: Viewport) => string | undefined;
|
|
17
20
|
};
|
|
18
21
|
};
|
|
@@ -21,6 +21,10 @@ export const extensionHandlers = {
|
|
|
21
21
|
viewport.isFadeOutActive = false;
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
|
+
capture: (viewport) => {
|
|
25
|
+
const emphasizeElementsProps = EmphasizeElements.get(viewport)?.toJSON(viewport);
|
|
26
|
+
return emphasizeElementsProps ? JSON.stringify({ emphasizeElementsProps }) : undefined;
|
|
27
|
+
},
|
|
24
28
|
},
|
|
25
29
|
perModelCategoryVisibility: {
|
|
26
30
|
extensionName: "PerModelCategoryVisibility",
|
|
@@ -35,5 +39,15 @@ export const extensionHandlers = {
|
|
|
35
39
|
reset: (viewport) => {
|
|
36
40
|
viewport.perModelCategoryVisibility.clearOverrides();
|
|
37
41
|
},
|
|
42
|
+
capture: (viewport) => {
|
|
43
|
+
if (!viewport.view.isSpatialView()) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const props = [];
|
|
47
|
+
for (const { modelId, categoryId, visible } of viewport.perModelCategoryVisibility) {
|
|
48
|
+
props.push({ modelId, categoryId, visible });
|
|
49
|
+
}
|
|
50
|
+
return props.length > 0 ? JSON.stringify({ perModelCategoryVisibilityProps: props }) : undefined;
|
|
51
|
+
},
|
|
38
52
|
},
|
|
39
53
|
};
|
|
@@ -6,6 +6,10 @@ export function extractClipVectorsFromLegacy(input) {
|
|
|
6
6
|
}
|
|
7
7
|
const output = {};
|
|
8
8
|
applyExtraction(viewDetails, output, clipVectorLegacyMappings);
|
|
9
|
+
output.clipVectors = output.clipVectors?.filter((value) => {
|
|
10
|
+
const hasPlanes = "planes" in value;
|
|
11
|
+
return (!hasPlanes || (value.planes && Object.keys(value.planes).length > 0));
|
|
12
|
+
});
|
|
9
13
|
return output.clipVectors;
|
|
10
14
|
}
|
|
11
15
|
const clipPlaneLegacyMappings = [
|