@itwin/editor-frontend 5.2.0-dev.8 → 5.3.0-dev.2
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/CHANGELOG.md +36 -1
- package/lib/cjs/TransformElementsTool.d.ts +8 -0
- package/lib/cjs/TransformElementsTool.d.ts.map +1 -1
- package/lib/cjs/TransformElementsTool.js +45 -7
- package/lib/cjs/TransformElementsTool.js.map +1 -1
- package/lib/esm/TransformElementsTool.d.ts +8 -0
- package/lib/esm/TransformElementsTool.d.ts.map +1 -1
- package/lib/esm/TransformElementsTool.js +45 -7
- package/lib/esm/TransformElementsTool.js.map +1 -1
- package/package.json +14 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
# Change Log - @itwin/editor-frontend
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Wed, 24 Sep 2025 17:43:58 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 5.1.9
|
|
6
|
+
Wed, 24 Sep 2025 17:38:08 GMT
|
|
7
|
+
|
|
8
|
+
_Version update only_
|
|
9
|
+
|
|
10
|
+
## 5.1.8
|
|
11
|
+
Wed, 17 Sep 2025 17:17:16 GMT
|
|
12
|
+
|
|
13
|
+
_Version update only_
|
|
14
|
+
|
|
15
|
+
## 5.1.7
|
|
16
|
+
Tue, 09 Sep 2025 19:28:04 GMT
|
|
17
|
+
|
|
18
|
+
_Version update only_
|
|
19
|
+
|
|
20
|
+
## 5.1.6
|
|
21
|
+
Mon, 08 Sep 2025 13:53:47 GMT
|
|
22
|
+
|
|
23
|
+
_Version update only_
|
|
24
|
+
|
|
25
|
+
## 5.1.5
|
|
26
|
+
Thu, 04 Sep 2025 13:51:09 GMT
|
|
27
|
+
|
|
28
|
+
_Version update only_
|
|
29
|
+
|
|
30
|
+
## 5.1.4
|
|
31
|
+
Fri, 22 Aug 2025 14:22:33 GMT
|
|
32
|
+
|
|
33
|
+
_Version update only_
|
|
34
|
+
|
|
35
|
+
## 5.1.3
|
|
36
|
+
Wed, 20 Aug 2025 13:57:10 GMT
|
|
37
|
+
|
|
38
|
+
_Version update only_
|
|
4
39
|
|
|
5
40
|
## 5.1.2
|
|
6
41
|
Thu, 14 Aug 2025 19:38:08 GMT
|
|
@@ -9,9 +9,14 @@ import { Transform } from "@itwin/core-geometry";
|
|
|
9
9
|
* @beta
|
|
10
10
|
*/
|
|
11
11
|
export interface TransformGraphicsData {
|
|
12
|
+
/** Element id graphics were requested from */
|
|
12
13
|
id: Id64String;
|
|
14
|
+
/** Placement transform applied to graphics */
|
|
13
15
|
placement: Placement;
|
|
16
|
+
/** The graphic representation of the element */
|
|
14
17
|
graphic: RenderGraphicOwner;
|
|
18
|
+
/** Optional model id generated graphics will be associated to */
|
|
19
|
+
modelId?: Id64String;
|
|
15
20
|
}
|
|
16
21
|
/** A class for creating and managing RenderGraphics representing geometric elements for the purpose of interactive tool dynamics.
|
|
17
22
|
* @beta
|
|
@@ -43,7 +48,10 @@ export declare class TransformGraphicsProvider {
|
|
|
43
48
|
* @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.
|
|
44
49
|
*/
|
|
45
50
|
cleanupGraphics(): Promise<void>;
|
|
51
|
+
private isOverlayModel;
|
|
46
52
|
addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void;
|
|
53
|
+
addSingleOverlayGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void;
|
|
54
|
+
addSingleGraphicData(data: TransformGraphicsData, transform: Transform, context: DynamicsContext): void;
|
|
47
55
|
addGraphics(transform: Transform, context: DynamicsContext): void;
|
|
48
56
|
}
|
|
49
57
|
/** Edit tool base class for applying a transform to element placements.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformElementsTool.d.ts","sourceRoot":"","sources":["../../src/TransformElementsTool.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAsB,OAAO,EAAE,UAAU,EAAgB,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAA6E,SAAS,EAA4B,MAAM,oBAAoB,CAAC;AACpJ,OAAO,EAAuB,aAAa,EAAE,eAAe,EAAE,cAAc,EAA4B,gBAAgB,EAAiG,aAAa,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"TransformElementsTool.d.ts","sourceRoot":"","sources":["../../src/TransformElementsTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,10 +51,11 @@ class TransformGraphicsProvider {
|
|
|
51
51
|
const graphicData = await core_frontend_1.IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);
|
|
52
52
|
if (undefined === graphicData)
|
|
53
53
|
return;
|
|
54
|
-
const
|
|
54
|
+
const modelId = elementProps[0].model;
|
|
55
|
+
const graphic = await (0, core_frontend_1.readElementGraphics)(graphicData, this.iModel, modelId, placement.is3d, { noFlash: true, noHilite: true });
|
|
55
56
|
if (undefined === graphic)
|
|
56
57
|
return;
|
|
57
|
-
return { id, placement, graphic: core_frontend_1.IModelApp.renderSystem.createGraphicOwner(graphic) };
|
|
58
|
+
return { id, placement, graphic: core_frontend_1.IModelApp.renderSystem.createGraphicOwner(graphic), modelId };
|
|
58
59
|
}
|
|
59
60
|
disposeOfGraphics() {
|
|
60
61
|
this.data.forEach((data) => {
|
|
@@ -117,20 +118,57 @@ class TransformGraphicsProvider {
|
|
|
117
118
|
await this.cancelPendingRequests();
|
|
118
119
|
this.disposeOfGraphics();
|
|
119
120
|
}
|
|
121
|
+
isOverlayModel(vp, modelId) {
|
|
122
|
+
if (undefined === modelId || !core_bentley_1.Id64.isValidId64(modelId) || !vp.view.is3d())
|
|
123
|
+
return false;
|
|
124
|
+
const planProjectionSettings = vp.view.displayStyle.settings.getPlanProjectionSettings(modelId);
|
|
125
|
+
return (planProjectionSettings?.overlay ? true : false);
|
|
126
|
+
}
|
|
120
127
|
addSingleGraphic(graphic, transform, context) {
|
|
121
128
|
const branch = new core_frontend_1.GraphicBranch(false);
|
|
122
129
|
branch.add(graphic);
|
|
123
130
|
const branchGraphic = context.createBranch(branch, transform);
|
|
124
131
|
context.addGraphic(branchGraphic);
|
|
125
132
|
}
|
|
133
|
+
addSingleOverlayGraphic(graphic, transform, context) {
|
|
134
|
+
const branch = new core_frontend_1.GraphicBranch(false);
|
|
135
|
+
branch.add(graphic);
|
|
136
|
+
const branchGraphic = context.createBranch(branch, transform);
|
|
137
|
+
context.addOverlay(branchGraphic);
|
|
138
|
+
}
|
|
139
|
+
addSingleGraphicData(data, transform, context) {
|
|
140
|
+
const isOverlay = this.isOverlayModel(context.viewport, data.modelId);
|
|
141
|
+
if (isOverlay)
|
|
142
|
+
this.addSingleOverlayGraphic(data.graphic, transform, context);
|
|
143
|
+
else
|
|
144
|
+
this.addSingleGraphic(data.graphic, transform, context);
|
|
145
|
+
}
|
|
126
146
|
addGraphics(transform, context) {
|
|
127
147
|
if (0 === this.data.length)
|
|
128
148
|
return;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
149
|
+
let branch;
|
|
150
|
+
let overlayBranch;
|
|
151
|
+
for (const data of this.data) {
|
|
152
|
+
const isOverlay = this.isOverlayModel(context.viewport, data.modelId);
|
|
153
|
+
if (isOverlay) {
|
|
154
|
+
if (undefined === overlayBranch)
|
|
155
|
+
overlayBranch = new core_frontend_1.GraphicBranch(false);
|
|
156
|
+
overlayBranch.add(data.graphic);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
if (undefined === branch)
|
|
160
|
+
branch = new core_frontend_1.GraphicBranch(false);
|
|
161
|
+
branch.add(data.graphic);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (undefined !== overlayBranch) {
|
|
165
|
+
const overlayBranchGraphic = context.createBranch(overlayBranch, transform);
|
|
166
|
+
context.addOverlay(overlayBranchGraphic);
|
|
167
|
+
}
|
|
168
|
+
if (undefined !== branch) {
|
|
169
|
+
const branchGraphic = context.createBranch(branch, transform);
|
|
170
|
+
context.addGraphic(branchGraphic);
|
|
171
|
+
}
|
|
134
172
|
}
|
|
135
173
|
}
|
|
136
174
|
exports.TransformGraphicsProvider = TransformGraphicsProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformElementsTool.js","sourceRoot":"","sources":["../../src/TransformElementsTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Editing\n */\n\nimport { BentleyError, Id64, Id64Arg, Id64String, IModelStatus } from \"@itwin/core-bentley\";\nimport { GeometricElementProps, isPlacement2dProps, PersistentGraphicsRequestProps, Placement, Placement2d, Placement3d } from \"@itwin/core-common\";\nimport { AccuDrawHintBuilder, BeButtonEvent, DynamicsContext, ElementSetTool, GraphicBranch, IModelApp, IModelConnection, IpcApp, ModifyElementSource, NotifyMessageDetails, OutputMessagePriority, readElementGraphics, RenderGraphic, RenderGraphicOwner } from \"@itwin/core-frontend\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\nimport { EditTools } from \"./EditTool\";\nimport { basicManipulationIpc } from \"./EditToolIpc\";\n\n/** Geometric element id, placement, and RenderGraphic managed by [[TransformGraphicsProvider]].\n * @beta\n */\nexport interface TransformGraphicsData {\n id: Id64String;\n placement: Placement;\n graphic: RenderGraphicOwner;\n}\n\n/** A class for creating and managing RenderGraphics representing geometric elements for the purpose of interactive tool dynamics.\n * @beta\n */\nexport class TransformGraphicsProvider {\n public readonly iModel: IModelConnection;\n public readonly data: TransformGraphicsData[];\n public readonly pending: Map<Id64String, string>;\n public readonly prefix: string;\n /** Chord tolerance to use to stroke the element's geometry in meters. */\n public chordTolerance = 0.01;\n\n constructor(iModel: IModelConnection, prefix: string) {\n this.iModel = iModel;\n this.prefix = prefix;\n this.data = new Array<TransformGraphicsData>();\n this.pending = new Map<Id64String, string>();\n }\n\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\n\n private async createRequest(id: Id64String): Promise<TransformGraphicsData | undefined> {\n const elementProps = (await this.iModel.elements.getProps(id)) as GeometricElementProps[];\n if (0 === elementProps.length)\n return;\n\n const placementProps = elementProps[0].placement;\n if (undefined === placementProps)\n return;\n\n const placement = isPlacement2dProps(placementProps) ? Placement2d.fromJSON(placementProps) : Placement3d.fromJSON(placementProps);\n if (!placement.isValid)\n return; // Ignore assembly parents w/o geometry, etc...\n\n const requestProps: PersistentGraphicsRequestProps = {\n id: this.getRequestId(id),\n elementId: id,\n toleranceLog10: this.getToleranceLog10(),\n };\n\n this.pending.set(id, requestProps.id); // keep track of requests so they can be cancelled...\n\n const graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\n if (undefined === graphicData)\n return;\n\n const graphic = await readElementGraphics(graphicData, this.iModel, elementProps[0].model, placement.is3d, { noFlash: true, noHilite: true });\n if (undefined === graphic)\n return;\n\n return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic) };\n }\n\n private disposeOfGraphics(): void {\n this.data.forEach((data) => {\n data.graphic.disposeGraphic();\n });\n\n this.data.length = 0;\n }\n\n private async cancelPendingRequests(): Promise<void> {\n const requests = new Array<string>();\n for (const [_key, id] of this.pending)\n requests.push(id);\n\n this.pending.clear();\n if (0 === requests.length)\n return;\n\n return IpcApp.appFunctionIpc.cancelElementGraphicsRequests(this.iModel.key, requests);\n }\n\n /** Call to request a RenderGraphic for the supplied element id.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public async createSingleGraphic(id: Id64String): Promise<boolean> {\n try {\n const info = await this.createRequest(id);\n\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined === info?.graphic)\n return false;\n\n this.data.push(info);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Call to request RenderGraphics for the supplied element ids. Does not wait for results as\n * generating graphics for a large number of elements can take time. Instead an array of [[RenderGraphicOwner]]\n * is populated as requests are resolved and the current dynamics frame displays what is available.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public createGraphics(elements: Id64Arg): void {\n if (0 === Id64.sizeOf(elements))\n return;\n\n try {\n for (const id of Id64.iterable(elements)) {\n const promise = this.createRequest(id);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n promise.then((info) => {\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined !== info?.graphic)\n this.data.push(info);\n });\n }\n } catch { }\n }\n\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]] and cancel requests that are still pending.\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\n */\n public async cleanupGraphics(): Promise<void> {\n await this.cancelPendingRequests();\n this.disposeOfGraphics();\n }\n\n public addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\n const branch = new GraphicBranch(false);\n branch.add(graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n\n public addGraphics(transform: Transform, context: DynamicsContext): void {\n if (0 === this.data.length)\n return;\n\n const branch = new GraphicBranch(false);\n for (const data of this.data)\n branch.add(data.graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n}\n\n/** Edit tool base class for applying a transform to element placements.\n * Example of a tool that would translate elements:\n * ```ts\n * class SampleMoveElementsTool extends TransformElementsTool {\n * public static override toolId = \"SampleMoveElements\";\n * public static override iconSpec = \"icon-move\";\n * protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\n * return (this.anchorPoint ? Transform.createTranslation(ev.point.minus(this.anchorPoint)) : undefined);\n * }\n * public async onRestartTool(): Promise<void> {\n * const tool = new SampleMoveElementsTool();\n * if (!await tool.run()) return this.exitTool();\n * }\n * }\n * ```\n * @beta\n */\nexport abstract class TransformElementsTool extends ElementSetTool {\n protected override get allowSelectionSet(): boolean { return true; }\n protected override get allowGroups(): boolean { return true; }\n protected override get allowDragSelect(): boolean { return true; }\n protected override get controlKeyContinuesSelection(): boolean { return true; }\n protected override get wantAccuSnap(): boolean { return true; }\n protected override get wantDynamics(): boolean { return true; }\n protected get wantMakeCopy(): boolean { return false; }\n protected get wantRepeatOperation(): boolean { return this.wantMakeCopy && !this.agenda.isEmpty; }\n protected _graphicsProvider?: TransformGraphicsProvider;\n protected _startedCmd?: string;\n\n protected abstract calculateTransform(ev: BeButtonEvent): Transform | undefined;\n\n protected async createAgendaGraphics(changed: boolean): Promise<void> {\n if (changed) {\n if (undefined === this._graphicsProvider)\n return; // Not yet needed...\n } else {\n if (undefined !== this._graphicsProvider)\n return; // Use existing graphics...\n }\n\n if (undefined === this._graphicsProvider)\n this._graphicsProvider = new TransformGraphicsProvider(this.iModel, this.toolId);\n else\n await this._graphicsProvider.cleanupGraphics();\n\n if (1 === this.agenda.length) {\n await this._graphicsProvider.createSingleGraphic(this.agenda.elements[0]);\n return;\n }\n\n this._graphicsProvider.createGraphics(this.agenda.elements);\n }\n\n protected async clearAgendaGraphics(): Promise<void> {\n if (undefined === this._graphicsProvider)\n return;\n await this._graphicsProvider.cleanupGraphics();\n this._graphicsProvider = undefined;\n }\n\n protected override async onAgendaModified(): Promise<void> {\n await this.createAgendaGraphics(true);\n }\n\n protected override async initAgendaDynamics(): Promise<boolean> {\n await this.createAgendaGraphics(false);\n return super.initAgendaDynamics();\n }\n\n protected transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\n if (undefined !== this._graphicsProvider)\n this._graphicsProvider.addGraphics(transform, context);\n }\n\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n this.transformAgendaDynamics(transform, context);\n }\n\n protected updateAnchorLocation(transform: Transform): void {\n // Update anchor point to support creating additional copies (repeat vs. restart)...\n if (undefined === this.anchorPoint)\n return;\n\n transform.multiplyPoint3d(this.anchorPoint, this.anchorPoint);\n\n const hints = new AccuDrawHintBuilder();\n hints.setOrigin(this.anchorPoint);\n hints.sendHints();\n }\n\n protected async startCommand(): Promise<string> {\n if (undefined !== this._startedCmd)\n return this._startedCmd;\n return EditTools.startCommand<string>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\n }\n\n protected async replaceAgenda(newIds: Id64Arg | undefined): Promise<void> {\n this.agenda.clear();\n\n if (undefined !== newIds)\n this.agenda.add(newIds);\n\n if (this.isSelectionSetModify) {\n if (this.agenda.isEmpty)\n this.iModel.selectionSet.emptyAll();\n else\n this.iModel.selectionSet.replace(this.agenda.elements);\n\n this.agenda.setSource(ModifyElementSource.SelectionSet);\n this.setPreferredElementSource(); // Update \"use selection set\" flag...\n }\n\n return this.onAgendaModified();\n }\n\n protected async transformAndCopyAgenda(_transform: Transform): Promise<Id64Arg | undefined> {\n return undefined;\n }\n\n protected async transformAgenda(transform: Transform): Promise<void> {\n try {\n this._startedCmd = await this.startCommand();\n if (IModelStatus.Success === await basicManipulationIpc.transformPlacement(this.agenda.compressIds(), transform.toJSON()))\n await this.saveChanges();\n } catch (err) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\n }\n }\n\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n\n if (this.wantMakeCopy)\n await this.replaceAgenda(await this.transformAndCopyAgenda(transform));\n else\n await this.transformAgenda(transform);\n\n this.updateAnchorLocation(transform);\n }\n\n public override async onProcessComplete(): Promise<void> {\n if (this.wantRepeatOperation)\n return; // Continue with current agenda instead of restarting (ex. create additional copies)\n return super.onProcessComplete();\n }\n\n public override async onCleanup() {\n await this.clearAgendaGraphics();\n return super.onCleanup();\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"TransformElementsTool.js","sourceRoot":"","sources":["../../src/TransformElementsTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Editing\n */\n\nimport { BentleyError, Id64, Id64Arg, Id64String, IModelStatus } from \"@itwin/core-bentley\";\nimport { GeometricElementProps, isPlacement2dProps, PersistentGraphicsRequestProps, Placement, Placement2d, Placement3d } from \"@itwin/core-common\";\nimport { AccuDrawHintBuilder, BeButtonEvent, DynamicsContext, ElementSetTool, GraphicBranch, IModelApp, IModelConnection, IpcApp, ModifyElementSource, NotifyMessageDetails, OutputMessagePriority, readElementGraphics, RenderGraphic, RenderGraphicOwner, Viewport } from \"@itwin/core-frontend\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\nimport { EditTools } from \"./EditTool\";\nimport { basicManipulationIpc } from \"./EditToolIpc\";\n\n/** Geometric element id, placement, and RenderGraphic managed by [[TransformGraphicsProvider]].\n * @beta\n */\nexport interface TransformGraphicsData {\n /** Element id graphics were requested from */\n id: Id64String;\n /** Placement transform applied to graphics */\n placement: Placement;\n /** The graphic representation of the element */\n graphic: RenderGraphicOwner;\n /** Optional model id generated graphics will be associated to */\n modelId?: Id64String;\n}\n\n/** A class for creating and managing RenderGraphics representing geometric elements for the purpose of interactive tool dynamics.\n * @beta\n */\nexport class TransformGraphicsProvider {\n public readonly iModel: IModelConnection;\n public readonly data: TransformGraphicsData[];\n public readonly pending: Map<Id64String, string>;\n public readonly prefix: string;\n /** Chord tolerance to use to stroke the element's geometry in meters. */\n public chordTolerance = 0.01;\n\n constructor(iModel: IModelConnection, prefix: string) {\n this.iModel = iModel;\n this.prefix = prefix;\n this.data = new Array<TransformGraphicsData>();\n this.pending = new Map<Id64String, string>();\n }\n\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\n\n private async createRequest(id: Id64String): Promise<TransformGraphicsData | undefined> {\n const elementProps = (await this.iModel.elements.getProps(id)) as GeometricElementProps[];\n if (0 === elementProps.length)\n return;\n\n const placementProps = elementProps[0].placement;\n if (undefined === placementProps)\n return;\n\n const placement = isPlacement2dProps(placementProps) ? Placement2d.fromJSON(placementProps) : Placement3d.fromJSON(placementProps);\n if (!placement.isValid)\n return; // Ignore assembly parents w/o geometry, etc...\n\n const requestProps: PersistentGraphicsRequestProps = {\n id: this.getRequestId(id),\n elementId: id,\n toleranceLog10: this.getToleranceLog10(),\n };\n\n this.pending.set(id, requestProps.id); // keep track of requests so they can be cancelled...\n\n const graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\n if (undefined === graphicData)\n return;\n\n const modelId = elementProps[0].model;\n const graphic = await readElementGraphics(graphicData, this.iModel, modelId, placement.is3d, { noFlash: true, noHilite: true });\n if (undefined === graphic)\n return;\n\n return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic), modelId };\n }\n\n private disposeOfGraphics(): void {\n this.data.forEach((data) => {\n data.graphic.disposeGraphic();\n });\n\n this.data.length = 0;\n }\n\n private async cancelPendingRequests(): Promise<void> {\n const requests = new Array<string>();\n for (const [_key, id] of this.pending)\n requests.push(id);\n\n this.pending.clear();\n if (0 === requests.length)\n return;\n\n return IpcApp.appFunctionIpc.cancelElementGraphicsRequests(this.iModel.key, requests);\n }\n\n /** Call to request a RenderGraphic for the supplied element id.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public async createSingleGraphic(id: Id64String): Promise<boolean> {\n try {\n const info = await this.createRequest(id);\n\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined === info?.graphic)\n return false;\n\n this.data.push(info);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Call to request RenderGraphics for the supplied element ids. Does not wait for results as\n * generating graphics for a large number of elements can take time. Instead an array of [[RenderGraphicOwner]]\n * is populated as requests are resolved and the current dynamics frame displays what is available.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public createGraphics(elements: Id64Arg): void {\n if (0 === Id64.sizeOf(elements))\n return;\n\n try {\n for (const id of Id64.iterable(elements)) {\n const promise = this.createRequest(id);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n promise.then((info) => {\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined !== info?.graphic)\n this.data.push(info);\n });\n }\n } catch { }\n }\n\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]] and cancel requests that are still pending.\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\n */\n public async cleanupGraphics(): Promise<void> {\n await this.cancelPendingRequests();\n this.disposeOfGraphics();\n }\n\n private isOverlayModel(vp: Viewport, modelId?: Id64String): boolean {\n if (undefined === modelId || !Id64.isValidId64(modelId) || !vp.view.is3d())\n return false;\n\n const planProjectionSettings = vp.view.displayStyle.settings.getPlanProjectionSettings(modelId);\n return (planProjectionSettings?.overlay ? true : false);\n }\n\n public addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\n const branch = new GraphicBranch(false);\n branch.add(graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n\n public addSingleOverlayGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\n const branch = new GraphicBranch(false);\n branch.add(graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addOverlay(branchGraphic);\n }\n\n public addSingleGraphicData(data: TransformGraphicsData, transform: Transform, context: DynamicsContext): void {\n const isOverlay = this.isOverlayModel(context.viewport, data.modelId);\n\n if (isOverlay)\n this.addSingleOverlayGraphic(data.graphic, transform, context);\n else\n this.addSingleGraphic(data.graphic, transform, context);\n }\n\n public addGraphics(transform: Transform, context: DynamicsContext): void {\n if (0 === this.data.length)\n return;\n\n let branch;\n let overlayBranch;\n\n for (const data of this.data) {\n const isOverlay = this.isOverlayModel(context.viewport, data.modelId);\n\n if (isOverlay) {\n if (undefined === overlayBranch)\n overlayBranch = new GraphicBranch(false);\n overlayBranch.add(data.graphic);\n } else {\n if (undefined === branch)\n branch = new GraphicBranch(false);\n branch.add(data.graphic);\n }\n }\n\n if (undefined !== overlayBranch) {\n const overlayBranchGraphic = context.createBranch(overlayBranch, transform);\n context.addOverlay(overlayBranchGraphic);\n }\n\n if (undefined !== branch) {\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n }\n}\n\n/** Edit tool base class for applying a transform to element placements.\n * Example of a tool that would translate elements:\n * ```ts\n * class SampleMoveElementsTool extends TransformElementsTool {\n * public static override toolId = \"SampleMoveElements\";\n * public static override iconSpec = \"icon-move\";\n * protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\n * return (this.anchorPoint ? Transform.createTranslation(ev.point.minus(this.anchorPoint)) : undefined);\n * }\n * public async onRestartTool(): Promise<void> {\n * const tool = new SampleMoveElementsTool();\n * if (!await tool.run()) return this.exitTool();\n * }\n * }\n * ```\n * @beta\n */\nexport abstract class TransformElementsTool extends ElementSetTool {\n protected override get allowSelectionSet(): boolean { return true; }\n protected override get allowGroups(): boolean { return true; }\n protected override get allowDragSelect(): boolean { return true; }\n protected override get controlKeyContinuesSelection(): boolean { return true; }\n protected override get wantAccuSnap(): boolean { return true; }\n protected override get wantDynamics(): boolean { return true; }\n protected get wantMakeCopy(): boolean { return false; }\n protected get wantRepeatOperation(): boolean { return this.wantMakeCopy && !this.agenda.isEmpty; }\n protected _graphicsProvider?: TransformGraphicsProvider;\n protected _startedCmd?: string;\n\n protected abstract calculateTransform(ev: BeButtonEvent): Transform | undefined;\n\n protected async createAgendaGraphics(changed: boolean): Promise<void> {\n if (changed) {\n if (undefined === this._graphicsProvider)\n return; // Not yet needed...\n } else {\n if (undefined !== this._graphicsProvider)\n return; // Use existing graphics...\n }\n\n if (undefined === this._graphicsProvider)\n this._graphicsProvider = new TransformGraphicsProvider(this.iModel, this.toolId);\n else\n await this._graphicsProvider.cleanupGraphics();\n\n if (1 === this.agenda.length) {\n await this._graphicsProvider.createSingleGraphic(this.agenda.elements[0]);\n return;\n }\n\n this._graphicsProvider.createGraphics(this.agenda.elements);\n }\n\n protected async clearAgendaGraphics(): Promise<void> {\n if (undefined === this._graphicsProvider)\n return;\n await this._graphicsProvider.cleanupGraphics();\n this._graphicsProvider = undefined;\n }\n\n protected override async onAgendaModified(): Promise<void> {\n await this.createAgendaGraphics(true);\n }\n\n protected override async initAgendaDynamics(): Promise<boolean> {\n await this.createAgendaGraphics(false);\n return super.initAgendaDynamics();\n }\n\n protected transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\n if (undefined !== this._graphicsProvider)\n this._graphicsProvider.addGraphics(transform, context);\n }\n\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n this.transformAgendaDynamics(transform, context);\n }\n\n protected updateAnchorLocation(transform: Transform): void {\n // Update anchor point to support creating additional copies (repeat vs. restart)...\n if (undefined === this.anchorPoint)\n return;\n\n transform.multiplyPoint3d(this.anchorPoint, this.anchorPoint);\n\n const hints = new AccuDrawHintBuilder();\n hints.setOrigin(this.anchorPoint);\n hints.sendHints();\n }\n\n protected async startCommand(): Promise<string> {\n if (undefined !== this._startedCmd)\n return this._startedCmd;\n return EditTools.startCommand<string>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\n }\n\n protected async replaceAgenda(newIds: Id64Arg | undefined): Promise<void> {\n this.agenda.clear();\n\n if (undefined !== newIds)\n this.agenda.add(newIds);\n\n if (this.isSelectionSetModify) {\n if (this.agenda.isEmpty)\n this.iModel.selectionSet.emptyAll();\n else\n this.iModel.selectionSet.replace(this.agenda.elements);\n\n this.agenda.setSource(ModifyElementSource.SelectionSet);\n this.setPreferredElementSource(); // Update \"use selection set\" flag...\n }\n\n return this.onAgendaModified();\n }\n\n protected async transformAndCopyAgenda(_transform: Transform): Promise<Id64Arg | undefined> {\n return undefined;\n }\n\n protected async transformAgenda(transform: Transform): Promise<void> {\n try {\n this._startedCmd = await this.startCommand();\n if (IModelStatus.Success === await basicManipulationIpc.transformPlacement(this.agenda.compressIds(), transform.toJSON()))\n await this.saveChanges();\n } catch (err) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\n }\n }\n\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n\n if (this.wantMakeCopy)\n await this.replaceAgenda(await this.transformAndCopyAgenda(transform));\n else\n await this.transformAgenda(transform);\n\n this.updateAnchorLocation(transform);\n }\n\n public override async onProcessComplete(): Promise<void> {\n if (this.wantRepeatOperation)\n return; // Continue with current agenda instead of restarting (ex. create additional copies)\n return super.onProcessComplete();\n }\n\n public override async onCleanup() {\n await this.clearAgendaGraphics();\n return super.onCleanup();\n }\n}\n\n"]}
|
|
@@ -9,9 +9,14 @@ import { Transform } from "@itwin/core-geometry";
|
|
|
9
9
|
* @beta
|
|
10
10
|
*/
|
|
11
11
|
export interface TransformGraphicsData {
|
|
12
|
+
/** Element id graphics were requested from */
|
|
12
13
|
id: Id64String;
|
|
14
|
+
/** Placement transform applied to graphics */
|
|
13
15
|
placement: Placement;
|
|
16
|
+
/** The graphic representation of the element */
|
|
14
17
|
graphic: RenderGraphicOwner;
|
|
18
|
+
/** Optional model id generated graphics will be associated to */
|
|
19
|
+
modelId?: Id64String;
|
|
15
20
|
}
|
|
16
21
|
/** A class for creating and managing RenderGraphics representing geometric elements for the purpose of interactive tool dynamics.
|
|
17
22
|
* @beta
|
|
@@ -43,7 +48,10 @@ export declare class TransformGraphicsProvider {
|
|
|
43
48
|
* @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.
|
|
44
49
|
*/
|
|
45
50
|
cleanupGraphics(): Promise<void>;
|
|
51
|
+
private isOverlayModel;
|
|
46
52
|
addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void;
|
|
53
|
+
addSingleOverlayGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void;
|
|
54
|
+
addSingleGraphicData(data: TransformGraphicsData, transform: Transform, context: DynamicsContext): void;
|
|
47
55
|
addGraphics(transform: Transform, context: DynamicsContext): void;
|
|
48
56
|
}
|
|
49
57
|
/** Edit tool base class for applying a transform to element placements.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformElementsTool.d.ts","sourceRoot":"","sources":["../../src/TransformElementsTool.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAsB,OAAO,EAAE,UAAU,EAAgB,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAA6E,SAAS,EAA4B,MAAM,oBAAoB,CAAC;AACpJ,OAAO,EAAuB,aAAa,EAAE,eAAe,EAAE,cAAc,EAA4B,gBAAgB,EAAiG,aAAa,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"TransformElementsTool.d.ts","sourceRoot":"","sources":["../../src/TransformElementsTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,10 +48,11 @@ export class TransformGraphicsProvider {
|
|
|
48
48
|
const graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);
|
|
49
49
|
if (undefined === graphicData)
|
|
50
50
|
return;
|
|
51
|
-
const
|
|
51
|
+
const modelId = elementProps[0].model;
|
|
52
|
+
const graphic = await readElementGraphics(graphicData, this.iModel, modelId, placement.is3d, { noFlash: true, noHilite: true });
|
|
52
53
|
if (undefined === graphic)
|
|
53
54
|
return;
|
|
54
|
-
return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic) };
|
|
55
|
+
return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic), modelId };
|
|
55
56
|
}
|
|
56
57
|
disposeOfGraphics() {
|
|
57
58
|
this.data.forEach((data) => {
|
|
@@ -114,20 +115,57 @@ export class TransformGraphicsProvider {
|
|
|
114
115
|
await this.cancelPendingRequests();
|
|
115
116
|
this.disposeOfGraphics();
|
|
116
117
|
}
|
|
118
|
+
isOverlayModel(vp, modelId) {
|
|
119
|
+
if (undefined === modelId || !Id64.isValidId64(modelId) || !vp.view.is3d())
|
|
120
|
+
return false;
|
|
121
|
+
const planProjectionSettings = vp.view.displayStyle.settings.getPlanProjectionSettings(modelId);
|
|
122
|
+
return (planProjectionSettings?.overlay ? true : false);
|
|
123
|
+
}
|
|
117
124
|
addSingleGraphic(graphic, transform, context) {
|
|
118
125
|
const branch = new GraphicBranch(false);
|
|
119
126
|
branch.add(graphic);
|
|
120
127
|
const branchGraphic = context.createBranch(branch, transform);
|
|
121
128
|
context.addGraphic(branchGraphic);
|
|
122
129
|
}
|
|
130
|
+
addSingleOverlayGraphic(graphic, transform, context) {
|
|
131
|
+
const branch = new GraphicBranch(false);
|
|
132
|
+
branch.add(graphic);
|
|
133
|
+
const branchGraphic = context.createBranch(branch, transform);
|
|
134
|
+
context.addOverlay(branchGraphic);
|
|
135
|
+
}
|
|
136
|
+
addSingleGraphicData(data, transform, context) {
|
|
137
|
+
const isOverlay = this.isOverlayModel(context.viewport, data.modelId);
|
|
138
|
+
if (isOverlay)
|
|
139
|
+
this.addSingleOverlayGraphic(data.graphic, transform, context);
|
|
140
|
+
else
|
|
141
|
+
this.addSingleGraphic(data.graphic, transform, context);
|
|
142
|
+
}
|
|
123
143
|
addGraphics(transform, context) {
|
|
124
144
|
if (0 === this.data.length)
|
|
125
145
|
return;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
146
|
+
let branch;
|
|
147
|
+
let overlayBranch;
|
|
148
|
+
for (const data of this.data) {
|
|
149
|
+
const isOverlay = this.isOverlayModel(context.viewport, data.modelId);
|
|
150
|
+
if (isOverlay) {
|
|
151
|
+
if (undefined === overlayBranch)
|
|
152
|
+
overlayBranch = new GraphicBranch(false);
|
|
153
|
+
overlayBranch.add(data.graphic);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
if (undefined === branch)
|
|
157
|
+
branch = new GraphicBranch(false);
|
|
158
|
+
branch.add(data.graphic);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (undefined !== overlayBranch) {
|
|
162
|
+
const overlayBranchGraphic = context.createBranch(overlayBranch, transform);
|
|
163
|
+
context.addOverlay(overlayBranchGraphic);
|
|
164
|
+
}
|
|
165
|
+
if (undefined !== branch) {
|
|
166
|
+
const branchGraphic = context.createBranch(branch, transform);
|
|
167
|
+
context.addGraphic(branchGraphic);
|
|
168
|
+
}
|
|
131
169
|
}
|
|
132
170
|
}
|
|
133
171
|
/** Edit tool base class for applying a transform to element placements.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformElementsTool.js","sourceRoot":"","sources":["../../src/TransformElementsTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Editing\n */\n\nimport { BentleyError, Id64, Id64Arg, Id64String, IModelStatus } from \"@itwin/core-bentley\";\nimport { GeometricElementProps, isPlacement2dProps, PersistentGraphicsRequestProps, Placement, Placement2d, Placement3d } from \"@itwin/core-common\";\nimport { AccuDrawHintBuilder, BeButtonEvent, DynamicsContext, ElementSetTool, GraphicBranch, IModelApp, IModelConnection, IpcApp, ModifyElementSource, NotifyMessageDetails, OutputMessagePriority, readElementGraphics, RenderGraphic, RenderGraphicOwner } from \"@itwin/core-frontend\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\nimport { EditTools } from \"./EditTool\";\nimport { basicManipulationIpc } from \"./EditToolIpc\";\n\n/** Geometric element id, placement, and RenderGraphic managed by [[TransformGraphicsProvider]].\n * @beta\n */\nexport interface TransformGraphicsData {\n id: Id64String;\n placement: Placement;\n graphic: RenderGraphicOwner;\n}\n\n/** A class for creating and managing RenderGraphics representing geometric elements for the purpose of interactive tool dynamics.\n * @beta\n */\nexport class TransformGraphicsProvider {\n public readonly iModel: IModelConnection;\n public readonly data: TransformGraphicsData[];\n public readonly pending: Map<Id64String, string>;\n public readonly prefix: string;\n /** Chord tolerance to use to stroke the element's geometry in meters. */\n public chordTolerance = 0.01;\n\n constructor(iModel: IModelConnection, prefix: string) {\n this.iModel = iModel;\n this.prefix = prefix;\n this.data = new Array<TransformGraphicsData>();\n this.pending = new Map<Id64String, string>();\n }\n\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\n\n private async createRequest(id: Id64String): Promise<TransformGraphicsData | undefined> {\n const elementProps = (await this.iModel.elements.getProps(id)) as GeometricElementProps[];\n if (0 === elementProps.length)\n return;\n\n const placementProps = elementProps[0].placement;\n if (undefined === placementProps)\n return;\n\n const placement = isPlacement2dProps(placementProps) ? Placement2d.fromJSON(placementProps) : Placement3d.fromJSON(placementProps);\n if (!placement.isValid)\n return; // Ignore assembly parents w/o geometry, etc...\n\n const requestProps: PersistentGraphicsRequestProps = {\n id: this.getRequestId(id),\n elementId: id,\n toleranceLog10: this.getToleranceLog10(),\n };\n\n this.pending.set(id, requestProps.id); // keep track of requests so they can be cancelled...\n\n const graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\n if (undefined === graphicData)\n return;\n\n const graphic = await readElementGraphics(graphicData, this.iModel, elementProps[0].model, placement.is3d, { noFlash: true, noHilite: true });\n if (undefined === graphic)\n return;\n\n return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic) };\n }\n\n private disposeOfGraphics(): void {\n this.data.forEach((data) => {\n data.graphic.disposeGraphic();\n });\n\n this.data.length = 0;\n }\n\n private async cancelPendingRequests(): Promise<void> {\n const requests = new Array<string>();\n for (const [_key, id] of this.pending)\n requests.push(id);\n\n this.pending.clear();\n if (0 === requests.length)\n return;\n\n return IpcApp.appFunctionIpc.cancelElementGraphicsRequests(this.iModel.key, requests);\n }\n\n /** Call to request a RenderGraphic for the supplied element id.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public async createSingleGraphic(id: Id64String): Promise<boolean> {\n try {\n const info = await this.createRequest(id);\n\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined === info?.graphic)\n return false;\n\n this.data.push(info);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Call to request RenderGraphics for the supplied element ids. Does not wait for results as\n * generating graphics for a large number of elements can take time. Instead an array of [[RenderGraphicOwner]]\n * is populated as requests are resolved and the current dynamics frame displays what is available.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public createGraphics(elements: Id64Arg): void {\n if (0 === Id64.sizeOf(elements))\n return;\n\n try {\n for (const id of Id64.iterable(elements)) {\n const promise = this.createRequest(id);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n promise.then((info) => {\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined !== info?.graphic)\n this.data.push(info);\n });\n }\n } catch { }\n }\n\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]] and cancel requests that are still pending.\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\n */\n public async cleanupGraphics(): Promise<void> {\n await this.cancelPendingRequests();\n this.disposeOfGraphics();\n }\n\n public addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\n const branch = new GraphicBranch(false);\n branch.add(graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n\n public addGraphics(transform: Transform, context: DynamicsContext): void {\n if (0 === this.data.length)\n return;\n\n const branch = new GraphicBranch(false);\n for (const data of this.data)\n branch.add(data.graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n}\n\n/** Edit tool base class for applying a transform to element placements.\n * Example of a tool that would translate elements:\n * ```ts\n * class SampleMoveElementsTool extends TransformElementsTool {\n * public static override toolId = \"SampleMoveElements\";\n * public static override iconSpec = \"icon-move\";\n * protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\n * return (this.anchorPoint ? Transform.createTranslation(ev.point.minus(this.anchorPoint)) : undefined);\n * }\n * public async onRestartTool(): Promise<void> {\n * const tool = new SampleMoveElementsTool();\n * if (!await tool.run()) return this.exitTool();\n * }\n * }\n * ```\n * @beta\n */\nexport abstract class TransformElementsTool extends ElementSetTool {\n protected override get allowSelectionSet(): boolean { return true; }\n protected override get allowGroups(): boolean { return true; }\n protected override get allowDragSelect(): boolean { return true; }\n protected override get controlKeyContinuesSelection(): boolean { return true; }\n protected override get wantAccuSnap(): boolean { return true; }\n protected override get wantDynamics(): boolean { return true; }\n protected get wantMakeCopy(): boolean { return false; }\n protected get wantRepeatOperation(): boolean { return this.wantMakeCopy && !this.agenda.isEmpty; }\n protected _graphicsProvider?: TransformGraphicsProvider;\n protected _startedCmd?: string;\n\n protected abstract calculateTransform(ev: BeButtonEvent): Transform | undefined;\n\n protected async createAgendaGraphics(changed: boolean): Promise<void> {\n if (changed) {\n if (undefined === this._graphicsProvider)\n return; // Not yet needed...\n } else {\n if (undefined !== this._graphicsProvider)\n return; // Use existing graphics...\n }\n\n if (undefined === this._graphicsProvider)\n this._graphicsProvider = new TransformGraphicsProvider(this.iModel, this.toolId);\n else\n await this._graphicsProvider.cleanupGraphics();\n\n if (1 === this.agenda.length) {\n await this._graphicsProvider.createSingleGraphic(this.agenda.elements[0]);\n return;\n }\n\n this._graphicsProvider.createGraphics(this.agenda.elements);\n }\n\n protected async clearAgendaGraphics(): Promise<void> {\n if (undefined === this._graphicsProvider)\n return;\n await this._graphicsProvider.cleanupGraphics();\n this._graphicsProvider = undefined;\n }\n\n protected override async onAgendaModified(): Promise<void> {\n await this.createAgendaGraphics(true);\n }\n\n protected override async initAgendaDynamics(): Promise<boolean> {\n await this.createAgendaGraphics(false);\n return super.initAgendaDynamics();\n }\n\n protected transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\n if (undefined !== this._graphicsProvider)\n this._graphicsProvider.addGraphics(transform, context);\n }\n\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n this.transformAgendaDynamics(transform, context);\n }\n\n protected updateAnchorLocation(transform: Transform): void {\n // Update anchor point to support creating additional copies (repeat vs. restart)...\n if (undefined === this.anchorPoint)\n return;\n\n transform.multiplyPoint3d(this.anchorPoint, this.anchorPoint);\n\n const hints = new AccuDrawHintBuilder();\n hints.setOrigin(this.anchorPoint);\n hints.sendHints();\n }\n\n protected async startCommand(): Promise<string> {\n if (undefined !== this._startedCmd)\n return this._startedCmd;\n return EditTools.startCommand<string>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\n }\n\n protected async replaceAgenda(newIds: Id64Arg | undefined): Promise<void> {\n this.agenda.clear();\n\n if (undefined !== newIds)\n this.agenda.add(newIds);\n\n if (this.isSelectionSetModify) {\n if (this.agenda.isEmpty)\n this.iModel.selectionSet.emptyAll();\n else\n this.iModel.selectionSet.replace(this.agenda.elements);\n\n this.agenda.setSource(ModifyElementSource.SelectionSet);\n this.setPreferredElementSource(); // Update \"use selection set\" flag...\n }\n\n return this.onAgendaModified();\n }\n\n protected async transformAndCopyAgenda(_transform: Transform): Promise<Id64Arg | undefined> {\n return undefined;\n }\n\n protected async transformAgenda(transform: Transform): Promise<void> {\n try {\n this._startedCmd = await this.startCommand();\n if (IModelStatus.Success === await basicManipulationIpc.transformPlacement(this.agenda.compressIds(), transform.toJSON()))\n await this.saveChanges();\n } catch (err) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\n }\n }\n\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n\n if (this.wantMakeCopy)\n await this.replaceAgenda(await this.transformAndCopyAgenda(transform));\n else\n await this.transformAgenda(transform);\n\n this.updateAnchorLocation(transform);\n }\n\n public override async onProcessComplete(): Promise<void> {\n if (this.wantRepeatOperation)\n return; // Continue with current agenda instead of restarting (ex. create additional copies)\n return super.onProcessComplete();\n }\n\n public override async onCleanup() {\n await this.clearAgendaGraphics();\n return super.onCleanup();\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"TransformElementsTool.js","sourceRoot":"","sources":["../../src/TransformElementsTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Editing\n */\n\nimport { BentleyError, Id64, Id64Arg, Id64String, IModelStatus } from \"@itwin/core-bentley\";\nimport { GeometricElementProps, isPlacement2dProps, PersistentGraphicsRequestProps, Placement, Placement2d, Placement3d } from \"@itwin/core-common\";\nimport { AccuDrawHintBuilder, BeButtonEvent, DynamicsContext, ElementSetTool, GraphicBranch, IModelApp, IModelConnection, IpcApp, ModifyElementSource, NotifyMessageDetails, OutputMessagePriority, readElementGraphics, RenderGraphic, RenderGraphicOwner, Viewport } from \"@itwin/core-frontend\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\nimport { EditTools } from \"./EditTool\";\nimport { basicManipulationIpc } from \"./EditToolIpc\";\n\n/** Geometric element id, placement, and RenderGraphic managed by [[TransformGraphicsProvider]].\n * @beta\n */\nexport interface TransformGraphicsData {\n /** Element id graphics were requested from */\n id: Id64String;\n /** Placement transform applied to graphics */\n placement: Placement;\n /** The graphic representation of the element */\n graphic: RenderGraphicOwner;\n /** Optional model id generated graphics will be associated to */\n modelId?: Id64String;\n}\n\n/** A class for creating and managing RenderGraphics representing geometric elements for the purpose of interactive tool dynamics.\n * @beta\n */\nexport class TransformGraphicsProvider {\n public readonly iModel: IModelConnection;\n public readonly data: TransformGraphicsData[];\n public readonly pending: Map<Id64String, string>;\n public readonly prefix: string;\n /** Chord tolerance to use to stroke the element's geometry in meters. */\n public chordTolerance = 0.01;\n\n constructor(iModel: IModelConnection, prefix: string) {\n this.iModel = iModel;\n this.prefix = prefix;\n this.data = new Array<TransformGraphicsData>();\n this.pending = new Map<Id64String, string>();\n }\n\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\n\n private async createRequest(id: Id64String): Promise<TransformGraphicsData | undefined> {\n const elementProps = (await this.iModel.elements.getProps(id)) as GeometricElementProps[];\n if (0 === elementProps.length)\n return;\n\n const placementProps = elementProps[0].placement;\n if (undefined === placementProps)\n return;\n\n const placement = isPlacement2dProps(placementProps) ? Placement2d.fromJSON(placementProps) : Placement3d.fromJSON(placementProps);\n if (!placement.isValid)\n return; // Ignore assembly parents w/o geometry, etc...\n\n const requestProps: PersistentGraphicsRequestProps = {\n id: this.getRequestId(id),\n elementId: id,\n toleranceLog10: this.getToleranceLog10(),\n };\n\n this.pending.set(id, requestProps.id); // keep track of requests so they can be cancelled...\n\n const graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\n if (undefined === graphicData)\n return;\n\n const modelId = elementProps[0].model;\n const graphic = await readElementGraphics(graphicData, this.iModel, modelId, placement.is3d, { noFlash: true, noHilite: true });\n if (undefined === graphic)\n return;\n\n return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic), modelId };\n }\n\n private disposeOfGraphics(): void {\n this.data.forEach((data) => {\n data.graphic.disposeGraphic();\n });\n\n this.data.length = 0;\n }\n\n private async cancelPendingRequests(): Promise<void> {\n const requests = new Array<string>();\n for (const [_key, id] of this.pending)\n requests.push(id);\n\n this.pending.clear();\n if (0 === requests.length)\n return;\n\n return IpcApp.appFunctionIpc.cancelElementGraphicsRequests(this.iModel.key, requests);\n }\n\n /** Call to request a RenderGraphic for the supplied element id.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public async createSingleGraphic(id: Id64String): Promise<boolean> {\n try {\n const info = await this.createRequest(id);\n\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined === info?.graphic)\n return false;\n\n this.data.push(info);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Call to request RenderGraphics for the supplied element ids. Does not wait for results as\n * generating graphics for a large number of elements can take time. Instead an array of [[RenderGraphicOwner]]\n * is populated as requests are resolved and the current dynamics frame displays what is available.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public createGraphics(elements: Id64Arg): void {\n if (0 === Id64.sizeOf(elements))\n return;\n\n try {\n for (const id of Id64.iterable(elements)) {\n const promise = this.createRequest(id);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n promise.then((info) => {\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined !== info?.graphic)\n this.data.push(info);\n });\n }\n } catch { }\n }\n\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]] and cancel requests that are still pending.\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\n */\n public async cleanupGraphics(): Promise<void> {\n await this.cancelPendingRequests();\n this.disposeOfGraphics();\n }\n\n private isOverlayModel(vp: Viewport, modelId?: Id64String): boolean {\n if (undefined === modelId || !Id64.isValidId64(modelId) || !vp.view.is3d())\n return false;\n\n const planProjectionSettings = vp.view.displayStyle.settings.getPlanProjectionSettings(modelId);\n return (planProjectionSettings?.overlay ? true : false);\n }\n\n public addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\n const branch = new GraphicBranch(false);\n branch.add(graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n\n public addSingleOverlayGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\n const branch = new GraphicBranch(false);\n branch.add(graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addOverlay(branchGraphic);\n }\n\n public addSingleGraphicData(data: TransformGraphicsData, transform: Transform, context: DynamicsContext): void {\n const isOverlay = this.isOverlayModel(context.viewport, data.modelId);\n\n if (isOverlay)\n this.addSingleOverlayGraphic(data.graphic, transform, context);\n else\n this.addSingleGraphic(data.graphic, transform, context);\n }\n\n public addGraphics(transform: Transform, context: DynamicsContext): void {\n if (0 === this.data.length)\n return;\n\n let branch;\n let overlayBranch;\n\n for (const data of this.data) {\n const isOverlay = this.isOverlayModel(context.viewport, data.modelId);\n\n if (isOverlay) {\n if (undefined === overlayBranch)\n overlayBranch = new GraphicBranch(false);\n overlayBranch.add(data.graphic);\n } else {\n if (undefined === branch)\n branch = new GraphicBranch(false);\n branch.add(data.graphic);\n }\n }\n\n if (undefined !== overlayBranch) {\n const overlayBranchGraphic = context.createBranch(overlayBranch, transform);\n context.addOverlay(overlayBranchGraphic);\n }\n\n if (undefined !== branch) {\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n }\n}\n\n/** Edit tool base class for applying a transform to element placements.\n * Example of a tool that would translate elements:\n * ```ts\n * class SampleMoveElementsTool extends TransformElementsTool {\n * public static override toolId = \"SampleMoveElements\";\n * public static override iconSpec = \"icon-move\";\n * protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\n * return (this.anchorPoint ? Transform.createTranslation(ev.point.minus(this.anchorPoint)) : undefined);\n * }\n * public async onRestartTool(): Promise<void> {\n * const tool = new SampleMoveElementsTool();\n * if (!await tool.run()) return this.exitTool();\n * }\n * }\n * ```\n * @beta\n */\nexport abstract class TransformElementsTool extends ElementSetTool {\n protected override get allowSelectionSet(): boolean { return true; }\n protected override get allowGroups(): boolean { return true; }\n protected override get allowDragSelect(): boolean { return true; }\n protected override get controlKeyContinuesSelection(): boolean { return true; }\n protected override get wantAccuSnap(): boolean { return true; }\n protected override get wantDynamics(): boolean { return true; }\n protected get wantMakeCopy(): boolean { return false; }\n protected get wantRepeatOperation(): boolean { return this.wantMakeCopy && !this.agenda.isEmpty; }\n protected _graphicsProvider?: TransformGraphicsProvider;\n protected _startedCmd?: string;\n\n protected abstract calculateTransform(ev: BeButtonEvent): Transform | undefined;\n\n protected async createAgendaGraphics(changed: boolean): Promise<void> {\n if (changed) {\n if (undefined === this._graphicsProvider)\n return; // Not yet needed...\n } else {\n if (undefined !== this._graphicsProvider)\n return; // Use existing graphics...\n }\n\n if (undefined === this._graphicsProvider)\n this._graphicsProvider = new TransformGraphicsProvider(this.iModel, this.toolId);\n else\n await this._graphicsProvider.cleanupGraphics();\n\n if (1 === this.agenda.length) {\n await this._graphicsProvider.createSingleGraphic(this.agenda.elements[0]);\n return;\n }\n\n this._graphicsProvider.createGraphics(this.agenda.elements);\n }\n\n protected async clearAgendaGraphics(): Promise<void> {\n if (undefined === this._graphicsProvider)\n return;\n await this._graphicsProvider.cleanupGraphics();\n this._graphicsProvider = undefined;\n }\n\n protected override async onAgendaModified(): Promise<void> {\n await this.createAgendaGraphics(true);\n }\n\n protected override async initAgendaDynamics(): Promise<boolean> {\n await this.createAgendaGraphics(false);\n return super.initAgendaDynamics();\n }\n\n protected transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\n if (undefined !== this._graphicsProvider)\n this._graphicsProvider.addGraphics(transform, context);\n }\n\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n this.transformAgendaDynamics(transform, context);\n }\n\n protected updateAnchorLocation(transform: Transform): void {\n // Update anchor point to support creating additional copies (repeat vs. restart)...\n if (undefined === this.anchorPoint)\n return;\n\n transform.multiplyPoint3d(this.anchorPoint, this.anchorPoint);\n\n const hints = new AccuDrawHintBuilder();\n hints.setOrigin(this.anchorPoint);\n hints.sendHints();\n }\n\n protected async startCommand(): Promise<string> {\n if (undefined !== this._startedCmd)\n return this._startedCmd;\n return EditTools.startCommand<string>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\n }\n\n protected async replaceAgenda(newIds: Id64Arg | undefined): Promise<void> {\n this.agenda.clear();\n\n if (undefined !== newIds)\n this.agenda.add(newIds);\n\n if (this.isSelectionSetModify) {\n if (this.agenda.isEmpty)\n this.iModel.selectionSet.emptyAll();\n else\n this.iModel.selectionSet.replace(this.agenda.elements);\n\n this.agenda.setSource(ModifyElementSource.SelectionSet);\n this.setPreferredElementSource(); // Update \"use selection set\" flag...\n }\n\n return this.onAgendaModified();\n }\n\n protected async transformAndCopyAgenda(_transform: Transform): Promise<Id64Arg | undefined> {\n return undefined;\n }\n\n protected async transformAgenda(transform: Transform): Promise<void> {\n try {\n this._startedCmd = await this.startCommand();\n if (IModelStatus.Success === await basicManipulationIpc.transformPlacement(this.agenda.compressIds(), transform.toJSON()))\n await this.saveChanges();\n } catch (err) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\n }\n }\n\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n\n if (this.wantMakeCopy)\n await this.replaceAgenda(await this.transformAndCopyAgenda(transform));\n else\n await this.transformAgenda(transform);\n\n this.updateAnchorLocation(transform);\n }\n\n public override async onProcessComplete(): Promise<void> {\n if (this.wantRepeatOperation)\n return; // Continue with current agenda instead of restarting (ex. create additional copies)\n return super.onProcessComplete();\n }\n\n public override async onCleanup() {\n await this.clearAgendaGraphics();\n return super.onCleanup();\n }\n}\n\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/editor-frontend",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.3.0-dev.2",
|
|
4
4
|
"description": "iTwin.js frontend components",
|
|
5
5
|
"main": "lib/cjs/editor-frontend.js",
|
|
6
6
|
"module": "lib/esm/editor-frontend.js",
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
"url": "http://www.bentley.com"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
|
-
"@itwin/
|
|
27
|
-
"@itwin/
|
|
28
|
-
"@itwin/core-
|
|
29
|
-
"@itwin/core-
|
|
30
|
-
"@itwin/core-geometry": "5.
|
|
26
|
+
"@itwin/appui-abstract": "5.3.0-dev.2",
|
|
27
|
+
"@itwin/core-common": "5.3.0-dev.2",
|
|
28
|
+
"@itwin/core-frontend": "5.3.0-dev.2",
|
|
29
|
+
"@itwin/core-bentley": "5.3.0-dev.2",
|
|
30
|
+
"@itwin/core-geometry": "5.3.0-dev.2"
|
|
31
31
|
},
|
|
32
32
|
"//devDependencies": [
|
|
33
33
|
"NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install",
|
|
@@ -39,20 +39,20 @@
|
|
|
39
39
|
"eslint": "^9.31.0",
|
|
40
40
|
"rimraf": "^6.0.1",
|
|
41
41
|
"typescript": "~5.6.2",
|
|
42
|
-
"@itwin/build-tools": "5.
|
|
43
|
-
"@itwin/core-bentley": "5.
|
|
44
|
-
"@itwin/
|
|
45
|
-
"@itwin/core-
|
|
46
|
-
"@itwin/
|
|
47
|
-
"@itwin/core-frontend": "5.
|
|
48
|
-
"@itwin/
|
|
42
|
+
"@itwin/build-tools": "5.3.0-dev.2",
|
|
43
|
+
"@itwin/core-bentley": "5.3.0-dev.2",
|
|
44
|
+
"@itwin/appui-abstract": "5.3.0-dev.2",
|
|
45
|
+
"@itwin/core-common": "5.3.0-dev.2",
|
|
46
|
+
"@itwin/core-geometry": "5.3.0-dev.2",
|
|
47
|
+
"@itwin/core-frontend": "5.3.0-dev.2",
|
|
48
|
+
"@itwin/certa": "5.3.0-dev.2"
|
|
49
49
|
},
|
|
50
50
|
"//dependencies": [
|
|
51
51
|
"NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API",
|
|
52
52
|
"NOTE: editor-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"
|
|
53
53
|
],
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@itwin/editor-common": "5.
|
|
55
|
+
"@itwin/editor-common": "5.3.0-dev.2"
|
|
56
56
|
},
|
|
57
57
|
"scripts": {
|
|
58
58
|
"build": "npm run -s copy:locale && npm run -s build:cjs && npm run -s build:esm",
|