@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.
@@ -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 { ViewPose, ViewState, } from "@itwin/core-frontend";
6
- import { createViewState } from "./createViewState.js";
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
- if (settings.viewState !== "keep") {
22
- // We use "hidden" as the default value for modelAndCategoryVisibilityFallback
23
- // because users expect modelSelector.enabled and categorySelector.enabled to
24
- // act as exclusive whitelists when modelSelector.disabled or categorySelector.disabled
25
- // arrays are empty, respectively.
26
- const { modelAndCategoryVisibilityFallback = "hidden" } = settings;
27
- const viewState = settings.viewState instanceof ViewState
28
- ? settings.viewState
29
- : await createViewState(iModel, savedViewData.viewData, {
30
- modelAndCategoryVisibilityFallback,
31
- });
32
- if (settings.camera instanceof ViewPose) {
33
- viewState.applyPose(settings.camera);
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)
@@ -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
  *
@@ -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
- if (settings.modelAndCategoryVisibilityFallback === "visible") {
24
- await unhideNewModelsAndCategories(iModel, viewState, viewData);
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 (!settings.skipViewStateLoad) {
27
- await viewState.load();
82
+ if (viewData.type === "iTwinSheet") {
83
+ return createSheetViewStateProps(iModel, viewData);
28
84
  }
29
- return viewState;
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 createSpatialViewState(iModel, viewData) {
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 createDrawingViewState(iModel, viewData) {
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 createSheetViewState(iModel, viewData) {
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({ from: viewClassName, where: "ECInstanceId=" + viewId });
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({ from: viewClassName, wantPrivate: false });
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/saved-views-react",
3
- "version": "0.9.2",
3
+ "version": "0.9.4",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",