Skip to content

Commit 6ceb34e

Browse files
authored
Add support for realityModelDisplay (#175)
Fix for iTwin/itwin-saved-views-service#598
1 parent 94ff8ba commit 6ceb34e

11 files changed

Lines changed: 1999 additions & 1473 deletions

File tree

.changeset/fine-cars-wink.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@itwin/saved-views-client": patch
3+
"@itwin/saved-views-react": patch
4+
---
5+
6+
Add support for realityModelDisplay

package.json

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,5 @@
3636
"npm-run-all": "^4.1.5",
3737
"tsx": "^4.15.4",
3838
"typescript": "^5.5.4"
39-
},
40-
"resolutions": {
41-
"@babel/runtime": "^7.26.10",
42-
"@eslint/plugin-kit": "^0.3.3",
43-
"@isaacs/brace-expansion@<=5.0.0": ">=5.0.1",
44-
"axios": "^1.13.5",
45-
"brace-expansion": "^2.0.2",
46-
"fast-xml-parser@>=4.3.6 <=5.3.3": ">=5.3.4",
47-
"form-data": ">=4.0.4",
48-
"lodash@>=4.0.0 <=4.17.22": ">=4.17.23",
49-
"qs": ">=6.14.2"
5039
}
5140
}

packages/saved-views-client/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"happy-dom": "^20.0.0",
4747
"rimraf": "^6.1.2",
4848
"typescript": "^5.5.4",
49-
"vite": "^6.0.0",
49+
"vite": "^6.4.1",
5050
"vitest": "^4.0.16"
5151
}
5252
}

packages/saved-views-client/src/models/savedViews/DisplayStyles.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ export interface DisplayStyleSettingsProps {
204204
backgroundColor?: RgbatColorProps;
205205
monochromeColor?: RgbatColorProps;
206206
monochromeMode?: MonochromeMode;
207+
// Omit scheduleScript - may cause excessively large JSON.
207208
renderTimeline?: string;
208209
/**
209210
* The point in time reflected by the view, in UNIX seconds. This identifies a point on the timeline of the style's
@@ -218,6 +219,7 @@ export interface DisplayStyleSettingsProps {
218219
mapImagery?: MapImageryProps;
219220
// Original name: modelOvr
220221
modelOverrides?: DisplayStyleModelAppearanceProps[];
222+
realityModelDisplay?: DisplayStyleRealityModelDisplayProps[];
221223
clipStyle?: ClipStyleProps;
222224
// Original name: planarClipOvr
223225
planarClipOverrides?: DisplayStylePlanarClipMaskProps[];
@@ -370,16 +372,68 @@ export enum GlobeMode {
370372
Plane = 1,
371373
}
372374

375+
/**
376+
* Specifies how the sizes of the individual points within a point cloud are computed.
377+
* - "pixel": Each point is an exact number of pixels in diameter, as specified by [[PointCloudDisplaySettings.pixelSize]].
378+
* - "voxel": Each point is the size of a "voxel" in meters, as specified by the [Tile]($frontend) to which the point belongs.
379+
*/
380+
export type PointCloudSizeMode = "voxel" | "pixel";
381+
382+
/**
383+
* Specifies the shape drawn for each individual point within a point cloud.
384+
* - "round": Each point is drawn as a circle.
385+
* - "square": Each point is drawn as a square.
386+
*/
387+
export type PointCloudShape = "square" | "round";
388+
389+
/**
390+
* Specifies the Eye-Dome Lighting mode used for a point cloud.
391+
* - "off": EDL is not calculated
392+
* - "on": EDL is calculated using a single pass.
393+
* - "full" EDL is calculated with full algorithm including optional filtering
394+
*/
395+
export type PointCloudEDLMode = "off" | "on" | "full";
396+
397+
/** The JSON representation of PointCloudDisplaySettings. */
398+
export interface PointCloudDisplayProps {
399+
sizeMode?: PointCloudSizeMode;
400+
voxelScale?: number;
401+
minPixelsPerVoxel?: number;
402+
maxPixelsPerVoxel?: number;
403+
pixelSize?: number;
404+
shape?: PointCloudShape;
405+
edlMode?: PointCloudEDLMode;
406+
edlStrength?: number;
407+
edlRadius?: number;
408+
edlFilter?: number;
409+
edlMixWts1?: number;
410+
edlMixWts2?: number;
411+
edlMixWts4?: number;
412+
}
413+
414+
/** The JSON representation of RealityModelDisplaySettings. */
415+
export interface RealityModelDisplayProps {
416+
pointCloud?: PointCloudDisplayProps;
417+
overrideColorRatio?: number;
418+
}
419+
420+
/** A RealityModelDisplayProps applied to a specific model to override its reality model display within the context of a DisplayStyle. */
421+
export interface DisplayStyleRealityModelDisplayProps extends RealityModelDisplayProps {
422+
modelId?: string;
423+
}
424+
373425
/** JSON representation of a ContextRealityModel. */
374426
export interface ContextRealityModelProps {
375427
realityDataSourceKey?: RealityDataSourceKey;
376428
tilesetUrl: string;
429+
// Omit orbitGtBlob - marked as @alpha
377430
realityDataId?: string;
378431
name?: string;
379432
description?: string;
380433
classifiers?: SpatialClassifierProps[];
381434
planarClipMask?: PlanarClipMaskProps;
382435
appearanceOverrides?: FeatureAppearanceProps;
436+
displaySettings?: RealityModelDisplayProps;
383437
}
384438

385439
/** JSON representation of a SpatialClassifier. */

packages/saved-views-react/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
"react-dom": "^18.0.0",
6161
"recursive-readdir": "^2.2.3",
6262
"typescript": "^5.5.4",
63-
"vite": "^6.0.0",
63+
"vite": "^6.4.1",
6464
"vitest": "^4.0.16"
6565
},
6666
"peerDependencies": {

packages/saved-views-react/src/LayeredDropdownMenu/LayeredDropdownMenu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ interface LayeredDropdownMenuProps {
1616
menuItems: ReactElement[] | ((close: () => void) => ReactElement[]);
1717

1818
/** Dropdown menu trigger to pass to iTwinUI `<DropdownMenu />` component. */
19-
children: ReactNode;
19+
children: React.JSX.Element;
2020
}
2121

2222
/**
@@ -61,7 +61,7 @@ export function LayeredDropdownMenu(props: LayeredDropdownMenuProps): ReactEleme
6161
return (
6262
<layeredDropdownMenuContext.Provider value={{ activeMenuItem, setActiveMenuItem }}>
6363
<DropdownMenu menuItems={menuItems} onVisibleChange={(visible) => !visible && setActiveMenuItem(undefined)}>
64-
{props.children}
64+
{props.children as React.JSX.Element}
6565
</DropdownMenu>
6666
</layeredDropdownMenuContext.Provider>
6767
);

packages/saved-views-react/src/captureSavedViewData.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ function createSheetSavedViewObject(
215215
},
216216
width: viewState.sheetSize.x,
217217
height: viewState.sheetSize.y,
218-
sheetAttachments: viewState.attachmentIds,
218+
sheetAttachments: [...viewState.attachmentIds],
219219
viewDetails: extractViewDetails2dFromLegacy(viewDefinitionProps),
220220
};
221221
}

packages/saved-views-react/src/translation/displayStyleExtractor.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,33 @@ const displayStyleModelAppearanceLegacyMappings: ExtractionFunc<void, void>[] =
164164
extractString("modelId"),
165165
];
166166

167+
export const realityModelDisplayMappings: ExtractionFunc<void, void>[] = [
168+
extractObject(
169+
[
170+
extractString("sizeMode"),
171+
extractNumber("voxelScale"),
172+
extractNumber("minPixelsPerVoxel"),
173+
extractNumber("maxPixelsPerVoxel"),
174+
extractNumber("pixelSize"),
175+
extractString("shape"),
176+
extractString("edlMode"),
177+
extractNumber("edlStrength"),
178+
extractNumber("edlRadius"),
179+
extractNumber("edlFilter"),
180+
extractNumber("edlMixWts1"),
181+
extractNumber("edlMixWts2"),
182+
extractNumber("edlMixWts4"),
183+
],
184+
"pointCloud",
185+
),
186+
extractNumber("overrideColorRatio"),
187+
];
188+
189+
const displayStyleRealityModelDisplayMappings: ExtractionFunc<void, void>[] = [
190+
...realityModelDisplayMappings,
191+
extractString("modelId"),
192+
];
193+
167194
const contextRealityModelsMappings: ExtractionFunc<void, void>[] = [
168195
extractObject(
169196
[
@@ -198,6 +225,7 @@ const contextRealityModelsMappings: ExtractionFunc<void, void>[] = [
198225
),
199226
extractObject(planarClipMaskMappings, "planarClipMask"),
200227
extractObject(featureAppearanceMappings, "appearanceOverrides"),
228+
extractObject(realityModelDisplayMappings, "displaySettings"),
201229
];
202230

203231
const contextRealityModelsLegacyMappings: ExtractionFunc<void, void>[] = [
@@ -234,6 +262,7 @@ const contextRealityModelsLegacyMappings: ExtractionFunc<void, void>[] = [
234262
),
235263
extractObject(planarClipMaskMappings, "planarClipMask"),
236264
extractObject(featureAppearanceLegacyMappings, "appearanceOverrides"),
265+
extractObject(realityModelDisplayMappings, "displaySettings"),
237266
];
238267

239268
const commonMapLayerPropsMapping: ExtractionFunc<void, void>[] = [
@@ -511,6 +540,7 @@ const displayStylesMapping: ExtractionFunc<void, void>[] = [
511540
"modelOverrides",
512541
"modelOvr",
513542
),
543+
extractArray(displayStyleRealityModelDisplayMappings, "realityModelDisplay"),
514544
extractObject(clipStyleMappings, "clipStyle"),
515545
extractArray(
516546
displayStylePlanarClipMaskMappings,
@@ -536,6 +566,11 @@ const displayStylesLegacyMapping: ExtractionFunc<void, void>[] = [
536566
extractStringOrArray("excludedElements"),
537567
extractObject(mapImageryLegacyMapping, "mapImagery"),
538568
extractArray(displayStyleModelAppearanceLegacyMappings, "modelOvr", "modelOverrides"),
569+
extractArrayElementsConditionally(
570+
(value) => value && !value.invisible,
571+
displayStyleRealityModelDisplayMappings,
572+
"realityModelDisplay",
573+
),
539574
extractObject(clipStyleLegacyMappings, "clipStyle"),
540575
extractArray(displayStylePlanarClipMaskMappings, "planarClipOvr", "planarClipOverrides"),
541576
];

packages/test-app-backend/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
"@types/dotenv-flow": "^3.2.0",
2222
"@types/node": "^18.0.0",
2323
"dotenv-flow": "^3.2.0",
24+
"inversify": "^8.1.0",
25+
"reflect-metadata": "^0.2.2",
2426
"tsx": "^4.15.4",
2527
"typescript": "^5.5.4"
2628
}

packages/test-app-frontend/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@
4646
"react-redux": "^7.2.2",
4747
"react-router-dom": "^6.11.2",
4848
"redux": "^4.1.0",
49-
"sass": "^1.64.1",
49+
"sass": "^1.98.0",
5050
"typescript": "^5.5.4",
51-
"vite": "^6.0.0",
51+
"vite": "^6.4.1",
5252
"vite-plugin-static-copy": "^2.3.2",
5353
"vite-tsconfig-paths": "^4.3.1"
5454
}

0 commit comments

Comments
 (0)