@itwin/saved-views-react 0.9.2 → 0.9.4
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/lib/applySavedView.js +81 -30
- package/lib/createViewState.d.ts +29 -0
- package/lib/createViewState.js +92 -18
- package/package.json +1 -1
package/lib/applySavedView.js
CHANGED
|
@@ -2,9 +2,75 @@
|
|
|
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 {
|
|
6
|
-
import {
|
|
5
|
+
import { Camera, } from "@itwin/core-common";
|
|
6
|
+
import { ViewPose, ViewPose2d, ViewPose3d, ViewState, } from "@itwin/core-frontend";
|
|
7
|
+
import { YawPitchRollAngles } from "@itwin/core-geometry";
|
|
8
|
+
import { createViewStateFromProps, createViewStateProps, } from "./createViewState.js";
|
|
7
9
|
import { extensionHandlers, } from "./translation/SavedViewsExtensionHandlers.js";
|
|
10
|
+
async function createSeedViewStateProps(iModel, viewport, savedViewData, settings = {}) {
|
|
11
|
+
if (settings.viewState !== "keep") {
|
|
12
|
+
return settings.viewState instanceof ViewState
|
|
13
|
+
? settings.viewState.toProps()
|
|
14
|
+
: createViewStateProps(iModel, savedViewData.viewData);
|
|
15
|
+
}
|
|
16
|
+
return viewport.view.toProps();
|
|
17
|
+
}
|
|
18
|
+
function applyCameraOptions(seedViewStateProps, _iModel, viewport, savedViewData, settings) {
|
|
19
|
+
const setCameraInfo = (seedViewDef, cameraProps, viewDataType = "iTwin3d") => {
|
|
20
|
+
if (viewDataType === "iTwin3d") {
|
|
21
|
+
const viewDef = seedViewStateProps.viewDefinitionProps;
|
|
22
|
+
if (cameraProps instanceof ViewPose3d) {
|
|
23
|
+
viewDef.cameraOn = cameraProps.cameraOn;
|
|
24
|
+
viewDef.origin = cameraProps.origin;
|
|
25
|
+
viewDef.extents = cameraProps.extents;
|
|
26
|
+
viewDef.angles = YawPitchRollAngles.createFromMatrix3d(cameraProps.rotation)?.toJSON();
|
|
27
|
+
viewDef.camera = cameraProps.camera;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const cameraProps3d = cameraProps;
|
|
31
|
+
viewDef.cameraOn = cameraProps3d.camera !== undefined;
|
|
32
|
+
viewDef.origin = cameraProps3d.origin;
|
|
33
|
+
viewDef.extents = cameraProps3d.extents;
|
|
34
|
+
viewDef.angles = cameraProps3d.angles;
|
|
35
|
+
viewDef.camera = cameraProps3d.camera ?? new Camera();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
//2d Sheet or Drawing
|
|
40
|
+
const viewDef = seedViewStateProps.viewDefinitionProps;
|
|
41
|
+
if (cameraProps instanceof ViewPose2d) {
|
|
42
|
+
viewDef.origin = cameraProps.origin;
|
|
43
|
+
viewDef.delta = cameraProps.delta;
|
|
44
|
+
viewDef.angle = cameraProps.angle;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const cameraProps2d = cameraProps;
|
|
48
|
+
viewDef.origin = cameraProps2d.origin;
|
|
49
|
+
viewDef.delta = cameraProps2d.delta;
|
|
50
|
+
viewDef.angle = cameraProps2d.angle;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return seedViewDef;
|
|
54
|
+
};
|
|
55
|
+
const cameraProps = settings.camera instanceof ViewPose
|
|
56
|
+
? settings.camera
|
|
57
|
+
: settings.camera === "keep"
|
|
58
|
+
? viewport.view.toProps().viewDefinitionProps
|
|
59
|
+
: savedViewData.viewData;
|
|
60
|
+
setCameraInfo(seedViewStateProps, cameraProps, savedViewData.viewData.type);
|
|
61
|
+
return seedViewStateProps;
|
|
62
|
+
}
|
|
63
|
+
async function applyViewStateProps(viewStateProps, iModel, viewport, savedViewData, settings) {
|
|
64
|
+
// We use "hidden" as the default value for modelAndCategoryVisibilityFallback
|
|
65
|
+
// because users expect modelSelector.enabled and categorySelector.enabled to
|
|
66
|
+
// act as exclusive whitelists when modelSelector.disabled or categorySelector.disabled
|
|
67
|
+
// arrays are empty, respectively.
|
|
68
|
+
const { modelAndCategoryVisibilityFallback = "hidden" } = settings;
|
|
69
|
+
const viewState = await createViewStateFromProps(viewStateProps, iModel, savedViewData.viewData, {
|
|
70
|
+
modelAndCategoryVisibilityFallback,
|
|
71
|
+
});
|
|
72
|
+
viewport.changeView(viewState, settings.viewChangeOptions);
|
|
73
|
+
}
|
|
8
74
|
/**
|
|
9
75
|
* Updates {@linkcode viewport} state to match captured Saved View.
|
|
10
76
|
*
|
|
@@ -18,33 +84,23 @@ import { extensionHandlers, } from "./translation/SavedViewsExtensionHandlers.js
|
|
|
18
84
|
* ]);
|
|
19
85
|
*/
|
|
20
86
|
export async function applySavedView(iModel, viewport, savedViewData, settings = {}, overrides) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
else if (settings.camera === "keep") {
|
|
36
|
-
viewState.applyPose(viewport.view.savePose());
|
|
37
|
-
}
|
|
38
|
-
viewport.changeView(viewState, settings.viewChangeOptions);
|
|
87
|
+
let viewStateProps = await createSeedViewStateProps(iModel, viewport, savedViewData, settings);
|
|
88
|
+
viewStateProps = applyCameraOptions(viewStateProps, iModel, viewport, savedViewData, settings);
|
|
89
|
+
await applyViewStateProps(viewStateProps, iModel, viewport, savedViewData, settings);
|
|
90
|
+
// Reset each extension even if it's not present in the saved view data
|
|
91
|
+
if (settings.emphasis !== "keep") {
|
|
92
|
+
overrides?.emphasizeElements?.reset
|
|
93
|
+
? overrides?.emphasizeElements.reset(viewport)
|
|
94
|
+
: extensionHandlers.emphasizeElements.reset(viewport);
|
|
95
|
+
}
|
|
96
|
+
if (settings.perModelCategoryVisibility !== "keep") {
|
|
97
|
+
overrides?.perModelCategoryVisibility?.reset
|
|
98
|
+
? overrides?.perModelCategoryVisibility.reset(viewport)
|
|
99
|
+
: extensionHandlers.perModelCategoryVisibility.reset(viewport);
|
|
39
100
|
}
|
|
40
101
|
const extensions = findKnownExtensions(savedViewData.extensions ?? []);
|
|
41
102
|
if (extensions.emphasis) {
|
|
42
103
|
const override = overrides?.emphasizeElements;
|
|
43
|
-
if (settings.emphasis !== "keep") {
|
|
44
|
-
override?.reset
|
|
45
|
-
? override.reset(viewport)
|
|
46
|
-
: extensionHandlers.emphasizeElements.reset(viewport);
|
|
47
|
-
}
|
|
48
104
|
if (settings.emphasis === "apply") {
|
|
49
105
|
override?.apply
|
|
50
106
|
? override.apply(extensions.emphasis, viewport)
|
|
@@ -53,11 +109,6 @@ export async function applySavedView(iModel, viewport, savedViewData, settings =
|
|
|
53
109
|
}
|
|
54
110
|
if (extensions.perModelCategoryVisibility) {
|
|
55
111
|
const override = overrides?.perModelCategoryVisibility;
|
|
56
|
-
if (settings.perModelCategoryVisibility !== "keep") {
|
|
57
|
-
override?.reset
|
|
58
|
-
? override.reset(viewport)
|
|
59
|
-
: extensionHandlers.perModelCategoryVisibility.reset(viewport);
|
|
60
|
-
}
|
|
61
112
|
if (settings.perModelCategoryVisibility === "apply") {
|
|
62
113
|
override?.apply
|
|
63
114
|
? override.apply(extensions.perModelCategoryVisibility, viewport)
|
package/lib/createViewState.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ViewStateProps } from "@itwin/core-common";
|
|
1
2
|
import { type IModelConnection, type ViewState } from "@itwin/core-frontend";
|
|
2
3
|
import type { ViewData } from "./SavedView.js";
|
|
3
4
|
export interface ViewStateCreateSettings {
|
|
@@ -19,11 +20,39 @@ export interface ViewStateCreateSettings {
|
|
|
19
20
|
*/
|
|
20
21
|
modelAndCategoryVisibilityFallback?: "visible" | "hidden" | undefined;
|
|
21
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Creates {@link ViewStateProps} object out of Saved View data. It provides a lower-level
|
|
25
|
+
* access to view data for advanced use.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const viewStateProps = await createViewStateProps(iModel, savedViewData.viewData);
|
|
29
|
+
* const viewState = createViewStateFromProps(viewStateProps);
|
|
30
|
+
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
31
|
+
*
|
|
32
|
+
* // The three lines above are equivalent to
|
|
33
|
+
* const viewState = await createViewState(iModel, savedViewData.viewData);
|
|
34
|
+
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
35
|
+
*/
|
|
36
|
+
export declare function createViewStateProps(iModel: IModelConnection, viewData: ViewData): Promise<ViewStateProps>;
|
|
22
37
|
/**
|
|
23
38
|
* Creates {@link ViewState} object out of Saved View data. It provides a lower-level
|
|
24
39
|
* access to view data for advanced use.
|
|
25
40
|
*
|
|
26
41
|
* @example
|
|
42
|
+
* const viewStateProps = await createViewStateProps(iModel, savedViewData.viewData);
|
|
43
|
+
* const viewState = createViewStateFromProps(viewStateProps);
|
|
44
|
+
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
45
|
+
*
|
|
46
|
+
* // The three lines above are equivalent to
|
|
47
|
+
* const viewState = await createViewState(iModel, savedViewData.viewData);
|
|
48
|
+
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
49
|
+
*/
|
|
50
|
+
export declare function createViewStateFromProps(props: ViewStateProps, iModel: IModelConnection, viewData: ViewData, settings?: ViewStateCreateSettings): Promise<ViewState>;
|
|
51
|
+
/**
|
|
52
|
+
* Creates {@link ViewState} object out of ViewStateProps. It provides a lower-level
|
|
53
|
+
* access to view data for advanced use.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
27
56
|
* const viewState = await createViewState(iModel, savedViewData.viewData);
|
|
28
57
|
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
29
58
|
*
|
package/lib/createViewState.js
CHANGED
|
@@ -1,17 +1,69 @@
|
|
|
1
1
|
/*---------------------------------------------------------------------------------------------
|
|
2
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
-
*--------------------------------------------------------------------------------------------*/
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { Camera, } from "@itwin/core-common";
|
|
6
6
|
import { DrawingViewState, SheetViewState, SpatialViewState, } from "@itwin/core-frontend";
|
|
7
|
-
import { queryMissingCategories, queryMissingModels } from "./captureSavedViewData.js";
|
|
7
|
+
import { queryMissingCategories, queryMissingModels, } from "./captureSavedViewData.js";
|
|
8
8
|
import { extractClipVectors } from "./translation/clipVectorsExtractor.js";
|
|
9
|
-
import { extractDisplayStyle, extractDisplayStyle3d } from "./translation/displayStyleExtractor.js";
|
|
9
|
+
import { extractDisplayStyle, extractDisplayStyle3d, } from "./translation/displayStyleExtractor.js";
|
|
10
|
+
/**
|
|
11
|
+
* Creates {@link ViewStateProps} object out of Saved View data. It provides a lower-level
|
|
12
|
+
* access to view data for advanced use.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const viewStateProps = await createViewStateProps(iModel, savedViewData.viewData);
|
|
16
|
+
* const viewState = createViewStateFromProps(viewStateProps);
|
|
17
|
+
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
18
|
+
*
|
|
19
|
+
* // The three lines above are equivalent to
|
|
20
|
+
* const viewState = await createViewState(iModel, savedViewData.viewData);
|
|
21
|
+
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
22
|
+
*/
|
|
23
|
+
export async function createViewStateProps(iModel, viewData) {
|
|
24
|
+
const viewStateProps = await createViewStatePropsVariant(iModel, viewData);
|
|
25
|
+
return viewStateProps;
|
|
26
|
+
}
|
|
27
|
+
async function applyViewStateOptions(viewState, iModel, viewData, settings = {}) {
|
|
28
|
+
if (settings.modelAndCategoryVisibilityFallback === "visible") {
|
|
29
|
+
await unhideNewModelsAndCategories(iModel, viewState, viewData);
|
|
30
|
+
}
|
|
31
|
+
if (!settings.skipViewStateLoad) {
|
|
32
|
+
await viewState.load();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
10
35
|
/**
|
|
11
36
|
* Creates {@link ViewState} object out of Saved View data. It provides a lower-level
|
|
12
37
|
* access to view data for advanced use.
|
|
13
38
|
*
|
|
14
39
|
* @example
|
|
40
|
+
* const viewStateProps = await createViewStateProps(iModel, savedViewData.viewData);
|
|
41
|
+
* const viewState = createViewStateFromProps(viewStateProps);
|
|
42
|
+
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
43
|
+
*
|
|
44
|
+
* // The three lines above are equivalent to
|
|
45
|
+
* const viewState = await createViewState(iModel, savedViewData.viewData);
|
|
46
|
+
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
47
|
+
*/
|
|
48
|
+
export async function createViewStateFromProps(props, iModel, viewData, settings = {}) {
|
|
49
|
+
let viewState;
|
|
50
|
+
if (viewData.type === "iTwinDrawing") {
|
|
51
|
+
viewState = DrawingViewState.createFromProps(props, iModel);
|
|
52
|
+
}
|
|
53
|
+
else if (viewData.type === "iTwinSheet") {
|
|
54
|
+
viewState = SheetViewState.createFromProps(props, iModel);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
viewState = SpatialViewState.createFromProps(props, iModel);
|
|
58
|
+
}
|
|
59
|
+
await applyViewStateOptions(viewState, iModel, viewData, settings);
|
|
60
|
+
return viewState;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Creates {@link ViewState} object out of ViewStateProps. It provides a lower-level
|
|
64
|
+
* access to view data for advanced use.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
15
67
|
* const viewState = await createViewState(iModel, savedViewData.viewData);
|
|
16
68
|
* await applySavedView(iModel, viewport, savedViewData, { viewState });
|
|
17
69
|
*
|
|
@@ -20,13 +72,17 @@ import { extractDisplayStyle, extractDisplayStyle3d } from "./translation/displa
|
|
|
20
72
|
*/
|
|
21
73
|
export async function createViewState(iModel, viewData, settings = {}) {
|
|
22
74
|
const viewState = await createViewStateVariant(iModel, viewData);
|
|
23
|
-
|
|
24
|
-
|
|
75
|
+
await applyViewStateOptions(viewState, iModel, viewData, settings);
|
|
76
|
+
return viewState;
|
|
77
|
+
}
|
|
78
|
+
async function createViewStatePropsVariant(iModel, viewData) {
|
|
79
|
+
if (viewData.type === "iTwinDrawing") {
|
|
80
|
+
return createDrawingViewStateProps(iModel, viewData);
|
|
25
81
|
}
|
|
26
|
-
if (
|
|
27
|
-
|
|
82
|
+
if (viewData.type === "iTwinSheet") {
|
|
83
|
+
return createSheetViewStateProps(iModel, viewData);
|
|
28
84
|
}
|
|
29
|
-
return
|
|
85
|
+
return createSpatialViewStateProps(iModel, viewData);
|
|
30
86
|
}
|
|
31
87
|
async function createViewStateVariant(iModel, viewData) {
|
|
32
88
|
if (viewData.type === "iTwinDrawing") {
|
|
@@ -37,8 +93,8 @@ async function createViewStateVariant(iModel, viewData) {
|
|
|
37
93
|
}
|
|
38
94
|
return createSpatialViewState(iModel, viewData);
|
|
39
95
|
}
|
|
40
|
-
async function
|
|
41
|
-
const seedViewState = await fetchIModelViewData(iModel, SpatialViewState.classFullName);
|
|
96
|
+
async function createSpatialViewStateProps(iModel, viewData) {
|
|
97
|
+
const seedViewState = (await fetchIModelViewData(iModel, SpatialViewState.classFullName));
|
|
42
98
|
const props = {
|
|
43
99
|
viewDefinitionProps: {
|
|
44
100
|
origin: viewData.origin,
|
|
@@ -78,10 +134,14 @@ async function createSpatialViewState(iModel, viewData) {
|
|
|
78
134
|
},
|
|
79
135
|
},
|
|
80
136
|
};
|
|
137
|
+
return props;
|
|
138
|
+
}
|
|
139
|
+
async function createSpatialViewState(iModel, viewData) {
|
|
140
|
+
const props = await createSpatialViewStateProps(iModel, viewData);
|
|
81
141
|
return SpatialViewState.createFromProps(props, iModel);
|
|
82
142
|
}
|
|
83
|
-
async function
|
|
84
|
-
const seedViewState = await fetchIModelViewData(iModel, DrawingViewState.classFullName);
|
|
143
|
+
async function createDrawingViewStateProps(iModel, viewData) {
|
|
144
|
+
const seedViewState = (await fetchIModelViewData(iModel, DrawingViewState.classFullName));
|
|
85
145
|
const props = {
|
|
86
146
|
viewDefinitionProps: {
|
|
87
147
|
classFullName: seedViewState.classFullName,
|
|
@@ -122,10 +182,14 @@ async function createDrawingViewState(iModel, viewData) {
|
|
|
122
182
|
federationGuid: seedViewState.displayStyle.federationGuid,
|
|
123
183
|
},
|
|
124
184
|
};
|
|
185
|
+
return props;
|
|
186
|
+
}
|
|
187
|
+
async function createDrawingViewState(iModel, viewData) {
|
|
188
|
+
const props = await createDrawingViewStateProps(iModel, viewData);
|
|
125
189
|
return DrawingViewState.createFromProps(props, iModel);
|
|
126
190
|
}
|
|
127
|
-
async function
|
|
128
|
-
const seedViewState = await fetchIModelViewData(iModel, SheetViewState.classFullName);
|
|
191
|
+
async function createSheetViewStateProps(iModel, viewData) {
|
|
192
|
+
const seedViewState = (await fetchIModelViewData(iModel, SheetViewState.classFullName));
|
|
129
193
|
const props = {
|
|
130
194
|
viewDefinitionProps: {
|
|
131
195
|
classFullName: seedViewState.classFullName,
|
|
@@ -178,6 +242,10 @@ async function createSheetViewState(iModel, viewData) {
|
|
|
178
242
|
},
|
|
179
243
|
sheetAttachments: viewData.sheetAttachments,
|
|
180
244
|
};
|
|
245
|
+
return props;
|
|
246
|
+
}
|
|
247
|
+
async function createSheetViewState(iModel, viewData) {
|
|
248
|
+
const props = await createSheetViewStateProps(iModel, viewData);
|
|
181
249
|
return SheetViewState.createFromProps(props, iModel);
|
|
182
250
|
}
|
|
183
251
|
async function fetchIModelViewData(iModel, viewClassName) {
|
|
@@ -212,12 +280,18 @@ function createEmptyViewState(iModel, viewClassName) {
|
|
|
212
280
|
async function getDefaultViewIdFromClassName(iModel, viewClassName) {
|
|
213
281
|
// Check validity of default view
|
|
214
282
|
const viewId = await iModel.views.queryDefaultViewId();
|
|
215
|
-
const viewProps = await iModel.elements.queryProps({
|
|
283
|
+
const viewProps = await iModel.elements.queryProps({
|
|
284
|
+
from: viewClassName,
|
|
285
|
+
where: "ECInstanceId=" + viewId,
|
|
286
|
+
});
|
|
216
287
|
if (viewProps.length > 0) {
|
|
217
288
|
return viewId;
|
|
218
289
|
}
|
|
219
290
|
// Return the first view we can find
|
|
220
|
-
const viewList = await iModel.views.getViewList({
|
|
291
|
+
const viewList = await iModel.views.getViewList({
|
|
292
|
+
from: viewClassName,
|
|
293
|
+
wantPrivate: false,
|
|
294
|
+
});
|
|
221
295
|
if (viewList.length === 0) {
|
|
222
296
|
return "";
|
|
223
297
|
}
|