@itwin/editor-frontend 3.0.0-dev.94 → 3.0.0-extension.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/CreateElementTool.js +1 -1
- package/lib/cjs/CreateElementTool.js.map +1 -1
- package/lib/cjs/EditTool.d.ts.map +1 -1
- package/lib/cjs/EditTool.js +5 -0
- package/lib/cjs/EditTool.js.map +1 -1
- package/lib/cjs/ElementGeometryTool.d.ts +64 -5
- package/lib/cjs/ElementGeometryTool.d.ts.map +1 -1
- package/lib/cjs/ElementGeometryTool.js +173 -8
- package/lib/cjs/ElementGeometryTool.js.map +1 -1
- package/lib/esm/CreateElementTool.js +1 -1
- package/lib/esm/CreateElementTool.js.map +1 -1
- package/lib/esm/EditTool.d.ts.map +1 -1
- package/lib/esm/EditTool.js +6 -1
- package/lib/esm/EditTool.js.map +1 -1
- package/lib/esm/ElementGeometryTool.d.ts +64 -5
- package/lib/esm/ElementGeometryTool.d.ts.map +1 -1
- package/lib/esm/ElementGeometryTool.js +167 -8
- package/lib/esm/ElementGeometryTool.js.map +1 -1
- package/lib/public/locales/en/Editor.json +20 -0
- package/package.json +12 -12
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @module Editing
|
|
7
7
|
*/
|
|
8
8
|
import { Id64 } from "@itwin/core-bentley";
|
|
9
|
-
import { editorBuiltInCmdIds, SubEntityType } from "@itwin/editor-common";
|
|
9
|
+
import { BooleanMode, editorBuiltInCmdIds, SubEntityType } from "@itwin/editor-common";
|
|
10
10
|
import { FeatureAppearance, FeatureAppearanceProvider, RgbColor } from "@itwin/core-common";
|
|
11
11
|
import { Geometry, Point3d, Range3d, Transform, Vector3d } from "@itwin/core-geometry";
|
|
12
12
|
import { AccuDrawHintBuilder, ElementSetTool, EventHandled, GraphicBranch, GraphicType, IModelApp, InputSource, readElementGraphics } from "@itwin/core-frontend";
|
|
@@ -168,24 +168,44 @@ export class ElementGeometryCacheTool extends ElementSetTool {
|
|
|
168
168
|
}
|
|
169
169
|
}
|
|
170
170
|
get geometryCacheFilter() { return undefined; }
|
|
171
|
-
async
|
|
172
|
-
if (
|
|
173
|
-
return false;
|
|
174
|
-
if (!hit.isElementHit)
|
|
171
|
+
async acceptElementForOperation(id) {
|
|
172
|
+
if (Id64.isInvalid(id) || Id64.isTransient(id))
|
|
175
173
|
return false;
|
|
176
|
-
let accept = this._checkedIds.get(
|
|
174
|
+
let accept = this._checkedIds.get(id);
|
|
177
175
|
if (undefined === accept) {
|
|
178
176
|
try {
|
|
179
177
|
this._startedCmd = await this.startCommand();
|
|
180
|
-
accept = await ElementGeometryCacheTool.callCommand("createElementGeometryCache",
|
|
178
|
+
accept = await ElementGeometryCacheTool.callCommand("createElementGeometryCache", id, this.geometryCacheFilter);
|
|
181
179
|
}
|
|
182
180
|
catch (err) {
|
|
183
181
|
accept = false;
|
|
184
182
|
}
|
|
185
|
-
this._checkedIds.set(
|
|
183
|
+
this._checkedIds.set(id, accept);
|
|
186
184
|
}
|
|
187
185
|
return accept;
|
|
188
186
|
}
|
|
187
|
+
async isElementValidForOperation(hit, out) {
|
|
188
|
+
if (!await super.isElementValidForOperation(hit, out))
|
|
189
|
+
return false;
|
|
190
|
+
return this.acceptElementForOperation(hit.sourceId);
|
|
191
|
+
}
|
|
192
|
+
async postFilterIds(arg) {
|
|
193
|
+
const ids = [];
|
|
194
|
+
for (const id of Id64.iterable(arg)) {
|
|
195
|
+
if (await this.acceptElementForOperation(id))
|
|
196
|
+
ids.push(id);
|
|
197
|
+
}
|
|
198
|
+
return ids;
|
|
199
|
+
}
|
|
200
|
+
async getGroupIds(id) {
|
|
201
|
+
return this.postFilterIds(await super.getGroupIds(id));
|
|
202
|
+
}
|
|
203
|
+
async getSelectionSetCandidates(ss) {
|
|
204
|
+
return this.postFilterIds(await super.getSelectionSetCandidates(ss));
|
|
205
|
+
}
|
|
206
|
+
async getDragSelectCandidates(vp, origin, corner, method, overlap) {
|
|
207
|
+
return this.postFilterIds(await super.getDragSelectCandidates(vp, origin, corner, method, overlap));
|
|
208
|
+
}
|
|
189
209
|
onDynamicFrame(_ev, context) {
|
|
190
210
|
if (undefined !== this._graphicsProvider)
|
|
191
211
|
this._graphicsProvider.addGraphic(context);
|
|
@@ -250,6 +270,111 @@ export class ElementGeometryCacheTool extends ElementSetTool {
|
|
|
250
270
|
this.clearGraphic();
|
|
251
271
|
}
|
|
252
272
|
}
|
|
273
|
+
/** @alpha Base class for tools that perform boolean operations on a set of elements. */
|
|
274
|
+
export class BooleanOperationTool extends ElementGeometryCacheTool {
|
|
275
|
+
get allowSelectionSet() { return BooleanMode.Subtract !== this.mode; }
|
|
276
|
+
get allowDragSelect() { return BooleanMode.Subtract !== this.mode; }
|
|
277
|
+
get controlKeyContinuesSelection() { return true; }
|
|
278
|
+
get requiredElementCount() { return 2; }
|
|
279
|
+
get geometryCacheFilter() {
|
|
280
|
+
return { parts: true, curves: false, surfaces: BooleanMode.Subtract === this.mode && !this.agenda.isEmpty, solids: true, other: false };
|
|
281
|
+
}
|
|
282
|
+
async onAgendaModified() {
|
|
283
|
+
// Filter changes to allow surfaces as tools, invalidate cached accept status...
|
|
284
|
+
if (BooleanMode.Subtract === this.mode && (this.agenda.isEmpty || 1 === this.agenda.length))
|
|
285
|
+
this._checkedIds.clear();
|
|
286
|
+
}
|
|
287
|
+
async applyAgendaOperation() {
|
|
288
|
+
if (this.agenda.length < this.requiredElementCount)
|
|
289
|
+
return undefined;
|
|
290
|
+
try {
|
|
291
|
+
this._startedCmd = await this.startCommand();
|
|
292
|
+
const target = this.agenda.elements[0];
|
|
293
|
+
const tools = this.agenda.elements.slice(1);
|
|
294
|
+
const params = { mode: this.mode, tools };
|
|
295
|
+
const opts = { writeChanges: true };
|
|
296
|
+
return await ElementGeometryCacheTool.callCommand("booleanOperation", target, params, opts);
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
async processAgenda(_ev) {
|
|
303
|
+
const result = await this.applyAgendaOperation();
|
|
304
|
+
if (result === null || result === void 0 ? void 0 : result.elementId)
|
|
305
|
+
await this.saveChanges();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/** @alpha Perform boolean union of solid geometry. */
|
|
309
|
+
export class UniteSolidElementsTool extends BooleanOperationTool {
|
|
310
|
+
get mode() { return BooleanMode.Unite; }
|
|
311
|
+
async onRestartTool() {
|
|
312
|
+
const tool = new UniteSolidElementsTool();
|
|
313
|
+
if (!await tool.run())
|
|
314
|
+
return this.exitTool();
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
UniteSolidElementsTool.toolId = "UniteSolids";
|
|
318
|
+
UniteSolidElementsTool.iconSpec = "icon-move"; // TODO: Need better icon...
|
|
319
|
+
/** @alpha Perform boolean subtract of solid geometry. */
|
|
320
|
+
export class SubtractSolidElementsTool extends BooleanOperationTool {
|
|
321
|
+
get mode() { return BooleanMode.Subtract; }
|
|
322
|
+
async onRestartTool() {
|
|
323
|
+
const tool = new SubtractSolidElementsTool();
|
|
324
|
+
if (!await tool.run())
|
|
325
|
+
return this.exitTool();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
SubtractSolidElementsTool.toolId = "SubtractSolids";
|
|
329
|
+
SubtractSolidElementsTool.iconSpec = "icon-move"; // TODO: Need better icon...
|
|
330
|
+
/** @alpha Perform boolean intersection of solid geometry. */
|
|
331
|
+
export class IntersectSolidElementsTool extends BooleanOperationTool {
|
|
332
|
+
get mode() { return BooleanMode.Intersect; }
|
|
333
|
+
async onRestartTool() {
|
|
334
|
+
const tool = new IntersectSolidElementsTool();
|
|
335
|
+
if (!await tool.run())
|
|
336
|
+
return this.exitTool();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
IntersectSolidElementsTool.toolId = "IntersectSolids";
|
|
340
|
+
IntersectSolidElementsTool.iconSpec = "icon-move"; // TODO: Need better icon...
|
|
341
|
+
/** @alpha Perform sew operation on surface geometry. */
|
|
342
|
+
export class SewSheetElementsTool extends ElementGeometryCacheTool {
|
|
343
|
+
get allowSelectionSet() { return true; }
|
|
344
|
+
get allowDragSelect() { return true; }
|
|
345
|
+
get controlKeyContinuesSelection() { return true; }
|
|
346
|
+
get requiredElementCount() { return 2; }
|
|
347
|
+
get geometryCacheFilter() {
|
|
348
|
+
return { parts: true, curves: false, surfaces: true, solids: false, other: false };
|
|
349
|
+
}
|
|
350
|
+
async applyAgendaOperation() {
|
|
351
|
+
if (this.agenda.length < this.requiredElementCount)
|
|
352
|
+
return undefined;
|
|
353
|
+
try {
|
|
354
|
+
this._startedCmd = await this.startCommand();
|
|
355
|
+
const target = this.agenda.elements[0];
|
|
356
|
+
const tools = this.agenda.elements.slice(1);
|
|
357
|
+
const params = { tools };
|
|
358
|
+
const opts = { writeChanges: true };
|
|
359
|
+
return await ElementGeometryCacheTool.callCommand("sewSheets", target, params, opts);
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
return undefined;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
async processAgenda(_ev) {
|
|
366
|
+
const result = await this.applyAgendaOperation();
|
|
367
|
+
if (result === null || result === void 0 ? void 0 : result.elementId)
|
|
368
|
+
await this.saveChanges();
|
|
369
|
+
}
|
|
370
|
+
async onRestartTool() {
|
|
371
|
+
const tool = new SewSheetElementsTool();
|
|
372
|
+
if (!await tool.run())
|
|
373
|
+
return this.exitTool();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
SewSheetElementsTool.toolId = "SewSheets";
|
|
377
|
+
SewSheetElementsTool.iconSpec = "icon-move"; // TODO: Need better icon...
|
|
253
378
|
/** @alpha Base class for tools that need to locate faces, edges, and vertices. */
|
|
254
379
|
export class LocateSubEntityTool extends ElementGeometryCacheTool {
|
|
255
380
|
wantSubEntityType(type) { return SubEntityType.Face === type; }
|
|
@@ -495,4 +620,38 @@ export class OffsetFacesTool extends LocateSubEntityTool {
|
|
|
495
620
|
}
|
|
496
621
|
OffsetFacesTool.toolId = "OffsetFaces";
|
|
497
622
|
OffsetFacesTool.iconSpec = "icon-move"; // TODO: Need better icon...
|
|
623
|
+
/** @alpha Identify faces to offset to hollow solids. */
|
|
624
|
+
export class HollowFacesTool extends LocateSubEntityTool {
|
|
625
|
+
get geometryCacheFilter() {
|
|
626
|
+
return { minGeom: 1, maxGeom: 1, parts: true, curves: false, surfaces: false, solids: true, other: false };
|
|
627
|
+
}
|
|
628
|
+
async applyAgendaOperation(ev, isAccept) {
|
|
629
|
+
if (undefined === ev.viewport || this.agenda.isEmpty || undefined === this._acceptedSubEntity)
|
|
630
|
+
return undefined;
|
|
631
|
+
// TODO: Tool settings for shell thickness and face thickness...
|
|
632
|
+
const shellThickness = 0.1;
|
|
633
|
+
const faceThickness = 0.0;
|
|
634
|
+
try {
|
|
635
|
+
this._startedCmd = await this.startCommand();
|
|
636
|
+
const params = { faces: this._acceptedSubEntity.subEntity, distances: faceThickness, defaultDistance: shellThickness };
|
|
637
|
+
const opts = {
|
|
638
|
+
wantGraphic: isAccept ? undefined : true,
|
|
639
|
+
chordTolerance: computeChordToleranceFromPoint(ev.viewport, ev.point),
|
|
640
|
+
requestId: `${this.toolId}:${this.agenda.elements[0]}`,
|
|
641
|
+
writeChanges: isAccept ? true : undefined,
|
|
642
|
+
};
|
|
643
|
+
return await ElementGeometryCacheTool.callCommand("hollowFaces", this.agenda.elements[0], params, opts);
|
|
644
|
+
}
|
|
645
|
+
catch (err) {
|
|
646
|
+
return undefined;
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
async onRestartTool() {
|
|
650
|
+
const tool = new HollowFacesTool();
|
|
651
|
+
if (!await tool.run())
|
|
652
|
+
return this.exitTool();
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
HollowFacesTool.toolId = "HollowFaces";
|
|
656
|
+
HollowFacesTool.iconSpec = "icon-move"; // TODO: Need better icon...
|
|
498
657
|
//# sourceMappingURL=ElementGeometryTool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElementGeometryTool.js","sourceRoot":"","sources":["../../src/ElementGeometryTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Editing\r\n */\r\n\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { editorBuiltInCmdIds, ElementGeometryCacheFilter, ElementGeometryResultOptions, ElementGeometryResultProps, LocateSubEntityProps, OffsetFacesProps, SolidModelingCommandIpc, SubEntityFilter, SubEntityGeometryProps, SubEntityLocationProps, SubEntityProps, SubEntityType } from \"@itwin/editor-common\";\r\nimport { FeatureAppearance, FeatureAppearanceProvider, RgbColor } from \"@itwin/core-common\";\r\nimport { Geometry, Point3d, Range3d, Ray3d, Transform, Vector3d } from \"@itwin/core-geometry\";\r\nimport { AccuDrawHintBuilder, BeButtonEvent, DecorateContext, DynamicsContext, ElementSetTool, EventHandled, FeatureOverrideProvider, FeatureSymbology, GraphicBranch, GraphicBranchOptions, GraphicType, HitDetail, IModelApp, IModelConnection, InputSource, LocateResponse, readElementGraphics, RenderGraphicOwner, Viewport } from \"@itwin/core-frontend\";\r\nimport { computeChordToleranceFromPoint } from \"./CreateElementTool\";\r\nimport { EditTools } from \"./EditTool\";\r\n\r\n/** @alpha */\r\nexport class ElementGeometryGraphicsProvider {\r\n public readonly iModel: IModelConnection;\r\n public graphic?: RenderGraphicOwner;\r\n\r\n constructor(iModel: IModelConnection) {\r\n this.iModel = iModel;\r\n }\r\n\r\n /** Call to request a RenderGraphic for the supplied graphic data.\r\n * @see [[cleanupGraphic]] Must be called when the tool exits.\r\n */\r\n public async createGraphic(graphicData: Uint8Array): Promise<boolean> {\r\n try {\r\n const graphic = await readElementGraphics(graphicData, this.iModel, Id64.invalid, true, { noFlash: true, noHilite: true });\r\n const graphicOwner = graphic ? IModelApp.renderSystem.createGraphicOwner(graphic) : undefined;\r\n this.cleanupGraphic();\r\n return (undefined !== (this.graphic = graphicOwner));\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]].\r\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\r\n */\r\n public cleanupGraphic(): void {\r\n if (undefined === this.graphic)\r\n return;\r\n this.graphic.disposeGraphic();\r\n this.graphic = undefined;\r\n }\r\n\r\n public addGraphic(context: DynamicsContext, transform?: Transform, opts?: GraphicBranchOptions): void {\r\n if (undefined === this.graphic)\r\n return;\r\n\r\n if (undefined === transform && undefined === opts) {\r\n context.addGraphic(this.graphic);\r\n return;\r\n }\r\n\r\n const branch = new GraphicBranch(false);\r\n branch.add(this.graphic);\r\n\r\n const branchGraphic = context.createGraphicBranch(branch, transform ? transform : Transform.createIdentity(), opts);\r\n context.addGraphic(branchGraphic);\r\n }\r\n\r\n public addDecoration(context: DecorateContext, type: GraphicType, transform?: Transform, opts?: GraphicBranchOptions): void {\r\n if (undefined === this.graphic)\r\n return;\r\n\r\n const branch = new GraphicBranch(false);\r\n branch.add(this.graphic);\r\n\r\n const branchGraphic = context.createGraphicBranch(branch, transform ? transform : Transform.createIdentity(), opts);\r\n context.addDecoration(type, branchGraphic);\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport class SubEntityData {\r\n public info?: SubEntityProps;\r\n public geom?: SubEntityGeometryProps;\r\n\r\n protected _graphicsProvider?: ElementGeometryGraphicsProvider;\r\n\r\n public isSame(other: SubEntityProps): boolean {\r\n if (undefined === this.info)\r\n return false;\r\n if (this.info.index !== other.index)\r\n return false;\r\n if (this.info.type !== other.type)\r\n return false;\r\n if (this.info.id !== other.id)\r\n return false;\r\n return true;\r\n }\r\n\r\n public getAppearance(vp: Viewport, accepted: boolean): FeatureAppearance {\r\n const color = vp.hilite.color;\r\n const rgb = RgbColor.fromColorDef(accepted ? color.inverse() : color);\r\n const transparency = 0.25;\r\n const emphasized = true; // Necessary for obscured sub-entities w/SceneGraphic...\r\n let weight;\r\n\r\n switch (this.info?.type) {\r\n case SubEntityType.Face:\r\n break;\r\n case SubEntityType.Edge:\r\n const edgeWeight = accepted ? 5 : 3;\r\n weight = this.geom?.appearance?.weight ? Math.min(this.geom.appearance.weight + edgeWeight, 31) : edgeWeight;\r\n break;\r\n case SubEntityType.Vertex:\r\n const vertexWeight = accepted ? 12 : 10;\r\n weight = this.geom?.appearance?.weight ? Math.min(this.geom.appearance.weight + vertexWeight, 31) : vertexWeight;\r\n break;\r\n }\r\n\r\n return FeatureAppearance.fromJSON({ rgb, transparency, weight, emphasized, nonLocatable: true });\r\n }\r\n\r\n public async createGraphic(iModel: IModelConnection): Promise<boolean> {\r\n if (undefined === this.geom?.graphic)\r\n return false;\r\n\r\n if (undefined === this._graphicsProvider)\r\n this._graphicsProvider = new ElementGeometryGraphicsProvider(iModel);\r\n\r\n return this._graphicsProvider.createGraphic(this.geom.graphic);\r\n }\r\n\r\n public cleanupGraphic(): void {\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n this._graphicsProvider.cleanupGraphic();\r\n this._graphicsProvider = undefined;\r\n }\r\n\r\n public get hasGraphic(): boolean {\r\n return (undefined !== this._graphicsProvider?.graphic);\r\n }\r\n\r\n public display(context: DecorateContext, accepted: boolean): void {\r\n if (undefined === this._graphicsProvider?.graphic)\r\n return;\r\n\r\n const appearanceProvider = FeatureAppearanceProvider.supplement((app: FeatureAppearance) => {\r\n return app.extendAppearance(this.getAppearance(context.viewport, accepted));\r\n });\r\n\r\n const opts: GraphicBranchOptions = { appearanceProvider };\r\n\r\n const range = (this.geom?.range ? Range3d.fromJSON(this.geom.range) : undefined);\r\n const pixelSize = context.viewport.getPixelSizeAtPoint(range ? range.center : undefined);\r\n const offsetDir = context.viewport.view.getZVector();\r\n offsetDir.scaleToLength(3 * pixelSize, offsetDir);\r\n const offsetTrans = Transform.createTranslation(offsetDir);\r\n\r\n this._graphicsProvider.addDecoration(context, GraphicType.Scene, offsetTrans, opts);\r\n }\r\n}\r\n\r\n/** @alpha Base class for tools that want to use the backend geometry cache. */\r\nexport abstract class ElementGeometryCacheTool extends ElementSetTool implements FeatureOverrideProvider {\r\n protected _startedCmd?: string;\r\n protected readonly _checkedIds = new Map<Id64String, boolean>();\r\n protected _graphicsProvider?: ElementGeometryGraphicsProvider;\r\n protected _graphicsPending?: true | undefined;\r\n protected _firstResult = true;\r\n\r\n protected allowView(vp: Viewport) { return vp.view.is3d(); }\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\r\n\r\n protected async startCommand(): Promise<string> {\r\n if (undefined !== this._startedCmd)\r\n return this._startedCmd;\r\n return EditTools.startCommand<string>(editorBuiltInCmdIds.cmdSolidModeling, this.iModel.key);\r\n }\r\n\r\n public static callCommand<T extends keyof SolidModelingCommandIpc>(method: T, ...args: Parameters<SolidModelingCommandIpc[T]>): ReturnType<SolidModelingCommandIpc[T]> {\r\n return EditTools.callCommand(method, ...args) as ReturnType<SolidModelingCommandIpc[T]>;\r\n }\r\n\r\n // TODO: This looks nice as long as ViewFlags.transparency is on...\r\n protected get agendaAppearance(): FeatureAppearance { return FeatureAppearance.fromTransparency(0.90); }\r\n protected get wantAgendaAppearanceOverride(): boolean { return false; }\r\n\r\n public addFeatureOverrides(overrides: FeatureSymbology.Overrides, _vp: Viewport): void {\r\n if (this.agenda.isEmpty)\r\n return;\r\n\r\n const app = this.agendaAppearance;\r\n this.agenda.elements.forEach((id) => { overrides.overrideElement(id, app); });\r\n }\r\n\r\n protected updateAgendaAppearanceProvider(drop?: true): void {\r\n if (!this.wantAgendaAppearanceOverride)\r\n return;\r\n\r\n for (const vp of IModelApp.viewManager) {\r\n if (!this.allowView(vp))\r\n continue;\r\n\r\n if (drop || this.agenda.isEmpty)\r\n vp.dropFeatureOverrideProvider(this);\r\n else if (!vp.addFeatureOverrideProvider(this))\r\n vp.setFeatureOverrideProviderChanged();\r\n }\r\n }\r\n\r\n protected get geometryCacheFilter(): ElementGeometryCacheFilter | undefined { return undefined; }\r\n\r\n protected override async isElementValidForOperation(hit: HitDetail, out?: LocateResponse): Promise<boolean> {\r\n if (!await super.isElementValidForOperation(hit, out))\r\n return false;\r\n\r\n if (!hit.isElementHit)\r\n return false;\r\n\r\n let accept = this._checkedIds.get(hit.sourceId);\r\n\r\n if (undefined === accept) {\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n accept = await ElementGeometryCacheTool.callCommand(\"createElementGeometryCache\", hit.sourceId, this.geometryCacheFilter);\r\n } catch (err) {\r\n accept = false;\r\n }\r\n\r\n this._checkedIds.set(hit.sourceId, accept);\r\n }\r\n\r\n return accept;\r\n }\r\n\r\n public override onDynamicFrame(_ev: BeButtonEvent, context: DynamicsContext): void {\r\n if (undefined !== this._graphicsProvider)\r\n this._graphicsProvider.addGraphic(context);\r\n }\r\n\r\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\r\n return this.updateGraphic(ev, IModelApp.viewManager.inDynamicsMode);\r\n }\r\n\r\n protected async getGraphicData(_ev: BeButtonEvent): Promise<Uint8Array | undefined> { return undefined; }\r\n\r\n protected async updateGraphic(ev: BeButtonEvent, isDynamics: boolean): Promise<void> {\r\n if (!isDynamics || this._graphicsPending)\r\n return; // Continue displaying previous graphic if new graphic is still pending...\r\n\r\n this._graphicsPending = true;\r\n const graphicData = await this.getGraphicData(ev);\r\n this._graphicsPending = undefined;\r\n\r\n if (undefined !== graphicData) {\r\n if (this._firstResult) {\r\n this.updateAgendaAppearanceProvider();\r\n this._firstResult = false;\r\n }\r\n return this.createGraphic(graphicData);\r\n }\r\n\r\n if (undefined !== this._graphicsProvider)\r\n this._graphicsProvider.cleanupGraphic();\r\n }\r\n\r\n protected async createGraphic(graphicData: Uint8Array): Promise<void> {\r\n if (undefined === this._graphicsProvider)\r\n this._graphicsProvider = new ElementGeometryGraphicsProvider(this.iModel);\r\n\r\n await this._graphicsProvider.createGraphic(graphicData);\r\n }\r\n\r\n protected clearGraphic(): void {\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n this._graphicsProvider.cleanupGraphic();\r\n this._graphicsProvider = undefined;\r\n }\r\n\r\n protected async clearElementGeometryCache(): Promise<void> {\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n await ElementGeometryCacheTool.callCommand(\"clearElementGeometryCache\");\r\n } catch (err) { }\r\n }\r\n\r\n public override async onUnsuspend(): Promise<void> {\r\n if (!this._firstResult)\r\n this.updateAgendaAppearanceProvider();\r\n return super.onUnsuspend();\r\n }\r\n\r\n public override async onSuspend(): Promise<void> {\r\n if (!this._firstResult)\r\n this.updateAgendaAppearanceProvider(true);\r\n return super.onSuspend();\r\n }\r\n\r\n public override async onPostInstall(): Promise<void> {\r\n await super.onPostInstall();\r\n if (this.wantAgendaAppearanceOverride)\r\n this.agenda.manageHiliteState = false;\r\n }\r\n\r\n public override async onCleanup(): Promise<void> {\r\n await super.onCleanup();\r\n await this.clearElementGeometryCache();\r\n this.updateAgendaAppearanceProvider(true);\r\n this.clearGraphic();\r\n }\r\n}\r\n\r\n/** @alpha Base class for tools that need to locate faces, edges, and vertices. */\r\nexport abstract class LocateSubEntityTool extends ElementGeometryCacheTool {\r\n protected _currentSubEntity?: SubEntityData;\r\n protected _acceptedSubEntity?: SubEntityLocationProps;\r\n\r\n protected wantSubEntityType(type: SubEntityType) { return SubEntityType.Face === type; }\r\n protected getMaximumSubEntityHits(type: SubEntityType) { return this.wantSubEntityType(type) ? 25 : 0; }\r\n\r\n protected override get wantAgendaAppearanceOverride(): boolean { return true; }\r\n\r\n public override decorate(context: DecorateContext): void {\r\n if (!this.allowView(context.viewport))\r\n return;\r\n\r\n if (undefined !== this._currentSubEntity)\r\n this._currentSubEntity.display(context, false);\r\n }\r\n\r\n protected getLocateAperture(ev: BeButtonEvent): number {\r\n if (undefined === ev.viewport)\r\n return 0.0;\r\n\r\n return ev.viewport.pixelsFromInches(InputSource.Touch === ev.inputSource ? IModelApp.locateManager.touchApertureInches : IModelApp.locateManager.apertureInches);\r\n }\r\n\r\n protected getMaxRayDistance(ev: BeButtonEvent, aperture: number): number {\r\n if (undefined === ev.viewport)\r\n return 0.0;\r\n\r\n // NOTE: Compute a world coordinate radius for ray test, try getting aperature size at point on element...\r\n const hit = IModelApp.accuSnap.currHit;\r\n const vec: Point3d[] = [];\r\n\r\n vec[0] = ev.viewport.worldToView(hit ? hit.hitPoint : ev.point);\r\n vec[1] = vec[0].clone(); vec[1].x += 1;\r\n ev.viewport.viewToWorldArray(vec);\r\n\r\n // The edge and vertex hits get post-filtered on xy distance, so this is fine for perspective views...\r\n return (aperture * vec[0].distance(vec[1]));\r\n }\r\n\r\n protected getSubEntityFilter(): SubEntityFilter | undefined { return undefined; }\r\n\r\n protected async pickSubEntities(id: Id64String, boresite: Ray3d, maxFace: number, maxEdge: number, maxVertex: number, maxDistance: number, hiddenEdgesVisible: boolean, filter?: SubEntityFilter): Promise<SubEntityLocationProps[] | undefined> {\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const opts: LocateSubEntityProps = {\r\n maxFace,\r\n maxEdge,\r\n maxVertex,\r\n maxDistance,\r\n hiddenEdgesVisible,\r\n filter,\r\n };\r\n return await ElementGeometryCacheTool.callCommand(\"locateSubEntities\", id, boresite.origin, boresite.direction, opts);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n protected async doPickSubEntities(id: Id64String, ev: BeButtonEvent): Promise<SubEntityLocationProps[] | undefined> {\r\n const vp = ev.viewport;\r\n if (undefined === vp)\r\n return undefined;\r\n\r\n const maxFace = this.getMaximumSubEntityHits(SubEntityType.Face);\r\n const maxEdge = this.getMaximumSubEntityHits(SubEntityType.Edge);\r\n const maxVertex = this.getMaximumSubEntityHits(SubEntityType.Vertex);\r\n\r\n if (0 === maxFace && 0 === maxEdge && 0 === maxVertex)\r\n return undefined;\r\n\r\n const aperture = this.getLocateAperture(ev);\r\n const maxDistance = this.getMaxRayDistance(ev, aperture);\r\n const boresite = AccuDrawHintBuilder.getBoresite(ev.point, vp);\r\n const hiddenEdgesVisible = vp.viewFlags.hiddenEdgesVisible();\r\n const filter = this.getSubEntityFilter();\r\n\r\n let hits = await this.pickSubEntities(id, boresite, maxFace, maxEdge, maxVertex, maxDistance, hiddenEdgesVisible, filter);\r\n\r\n // NOTE: Remove erroneous edge/vertex hits in perspective views by checking real xy distance to hit point...\r\n if (undefined === hits || !vp.isCameraOn)\r\n return hits;\r\n\r\n if (maxEdge > 0 && hits.length > 1) {\r\n const edgeApertureSquared = (aperture * aperture);\r\n const vertexApertureSquared = ((aperture * 2.0) * (aperture * 2.0));\r\n\r\n const e2 = Math.pow(aperture, 2);\r\n const v2 = Math.pow(aperture * 2.0, 2);\r\n\r\n if (e2 !== edgeApertureSquared || v2 !== vertexApertureSquared)\r\n return hits;\r\n\r\n const rayOrigin = vp.worldToView(boresite.origin);\r\n\r\n hits = hits.filter((hit) => {\r\n if (SubEntityType.Face === hit.subEntity.type)\r\n return true;\r\n\r\n const hitPoint = vp.worldToView(Point3d.fromJSON(hit.point));\r\n const distance = hitPoint.distanceSquaredXY(rayOrigin);\r\n\r\n return (distance <= (SubEntityType.Edge === hit.subEntity.type ? edgeApertureSquared : vertexApertureSquared));\r\n });\r\n }\r\n\r\n return hits;\r\n }\r\n\r\n protected async doLocateSubEntity(ev: BeButtonEvent, newSearch: boolean): Promise<boolean> {\r\n if (this.agenda.isEmpty || undefined === ev.viewport)\r\n return false;\r\n\r\n if (newSearch) {\r\n const info = await this.doPickSubEntities(this.agenda.elements[this.agenda.length - 1], ev);\r\n\r\n if (undefined === info)\r\n return false;\r\n\r\n this._acceptedSubEntity = info[0]; // TODO: Save array for reset cyling. Do we need to support multiple elements?\r\n this.clearSubEntityGraphic();\r\n\r\n return true;\r\n }\r\n\r\n this._acceptedSubEntity = undefined;\r\n return true;\r\n }\r\n\r\n protected override async chooseNextHit(ev: BeButtonEvent): Promise<EventHandled> {\r\n if (undefined === this._acceptedSubEntity)\r\n return super.chooseNextHit(ev);\r\n\r\n await this.doLocateSubEntity(ev, false);\r\n if (undefined === this._acceptedSubEntity)\r\n await this.onReinitialize();\r\n\r\n return EventHandled.No;\r\n }\r\n\r\n protected override async gatherInput(ev: BeButtonEvent): Promise<EventHandled | undefined> {\r\n if (undefined === this._acceptedSubEntity)\r\n await this.doLocateSubEntity(ev, true);\r\n return super.gatherInput(ev);\r\n }\r\n\r\n protected override get wantAdditionalInput(): boolean {\r\n if (undefined === this._acceptedSubEntity)\r\n return true;\r\n return super.wantAdditionalInput;\r\n }\r\n\r\n protected async setCurrentSubEntity(id?: Id64String, current?: SubEntityLocationProps, chordTolerance?: number): Promise<boolean> {\r\n if (undefined === id || undefined === current) {\r\n if (undefined === this._currentSubEntity || !this._currentSubEntity.hasGraphic)\r\n return false;\r\n this._currentSubEntity.cleanupGraphic();\r\n return true;\r\n }\r\n\r\n if (undefined !== this._currentSubEntity && this._currentSubEntity.hasGraphic && this._currentSubEntity.isSame(current.subEntity))\r\n return false;\r\n\r\n if (undefined === this._currentSubEntity)\r\n this._currentSubEntity = new SubEntityData();\r\n else\r\n this._currentSubEntity.cleanupGraphic();\r\n\r\n const opts: ElementGeometryResultOptions = {\r\n wantGraphic: true,\r\n wantRange: true,\r\n wantAppearance: true,\r\n chordTolerance,\r\n };\r\n\r\n this._currentSubEntity.info = current.subEntity;\r\n this._currentSubEntity.geom = await ElementGeometryCacheTool.callCommand(\"getSubEntityGeometry\", id, current.subEntity, opts);\r\n\r\n return this._currentSubEntity.createGraphic(this.iModel);\r\n }\r\n\r\n protected clearSubEntityGraphic(): void {\r\n if (undefined === this._currentSubEntity)\r\n return;\r\n this._currentSubEntity.cleanupGraphic();\r\n this._currentSubEntity = undefined;\r\n }\r\n\r\n protected async updateSubEntityGraphic(ev: BeButtonEvent): Promise<boolean> {\r\n if (undefined === ev.viewport)\r\n return false;\r\n\r\n const hit = IModelApp.accuSnap.currHit;\r\n if (undefined === hit || !hit.isElementHit)\r\n return this.setCurrentSubEntity();\r\n\r\n const current = await this.doPickSubEntities(hit.sourceId, ev);\r\n const chordTolerance = current ? computeChordToleranceFromPoint(ev.viewport, Point3d.fromJSON(current[0].point)) : 0.0;\r\n\r\n if (!await this.setCurrentSubEntity(hit.sourceId, current ? current[0] : undefined, chordTolerance))\r\n return false;\r\n\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n return true;\r\n }\r\n\r\n protected override async updateGraphic(ev: BeButtonEvent, isDynamics: boolean): Promise<void> {\r\n if (isDynamics)\r\n return super.updateGraphic(ev, isDynamics);\r\n\r\n await this.updateSubEntityGraphic(ev);\r\n }\r\n\r\n protected async applyAgendaOperation(_ev: BeButtonEvent, _isAccept: boolean): Promise<ElementGeometryResultProps | undefined> { return undefined; }\r\n\r\n protected override async getGraphicData(ev: BeButtonEvent): Promise<Uint8Array | undefined> {\r\n const result = await this.applyAgendaOperation(ev, false);\r\n return result?.graphic;\r\n }\r\n\r\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\r\n if (undefined === this._acceptedSubEntity)\r\n return;\r\n\r\n const result = await this.applyAgendaOperation(ev, true);\r\n if (result?.elementId)\r\n await this.saveChanges();\r\n }\r\n\r\n protected setupAccuDraw(): void { }\r\n\r\n protected override setupAndPromptForNextAction(): void {\r\n this.setupAccuDraw();\r\n super.setupAndPromptForNextAction();\r\n }\r\n\r\n public override async onCleanup(): Promise<void> {\r\n this.clearSubEntityGraphic();\r\n return super.onCleanup();\r\n }\r\n}\r\n\r\n/** @alpha Identify faces of solids and surfaces to offset. */\r\nexport class OffsetFacesTool extends LocateSubEntityTool {\r\n public static override toolId = \"OffsetFaces\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n public override requireWriteableTarget(): boolean { return false; } // TODO: Testing...\r\n\r\n protected override get wantDynamics(): boolean { return true; }\r\n protected override get wantAccuSnap(): boolean { return undefined !== this._acceptedSubEntity; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { minGeom: 1, maxGeom: 1, parts: true, curves: false, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected override async applyAgendaOperation(ev: BeButtonEvent, isAccept: boolean): Promise<ElementGeometryResultProps | undefined> {\r\n if (undefined === ev.viewport || this.agenda.isEmpty || undefined === this._acceptedSubEntity?.point || undefined === this._acceptedSubEntity?.normal)\r\n return undefined;\r\n\r\n const facePt = Point3d.fromJSON(this._acceptedSubEntity.point);\r\n const faceNormal = Vector3d.fromJSON(this._acceptedSubEntity.normal);\r\n const projPt = AccuDrawHintBuilder.projectPointToLineInView(ev.point, facePt, faceNormal, ev.viewport);\r\n\r\n if (undefined === projPt)\r\n return undefined;\r\n\r\n const offsetDir = Vector3d.createStartEnd(facePt, projPt);\r\n let offset = offsetDir.magnitude();\r\n\r\n if (offset < Geometry.smallMetricDistance)\r\n return undefined;\r\n\r\n if (offsetDir.dotProduct(faceNormal) < 0.0)\r\n offset = -offset;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const params: OffsetFacesProps = { faces: this._acceptedSubEntity.subEntity, distances: offset };\r\n const opts: ElementGeometryResultOptions = {\r\n wantGraphic: isAccept ? undefined : true,\r\n chordTolerance: computeChordToleranceFromPoint(ev.viewport, ev.point),\r\n requestId: `${this.toolId}:${this.agenda.elements[0]}`,\r\n writeChanges: isAccept ? true : undefined,\r\n };\r\n return await ElementGeometryCacheTool.callCommand(\"offsetFaces\", this.agenda.elements[0], params, opts);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n protected override setupAccuDraw(): void {\r\n if (undefined === this._acceptedSubEntity?.point || undefined === this._acceptedSubEntity?.normal)\r\n return;\r\n\r\n const facePt = Point3d.fromJSON(this._acceptedSubEntity.point);\r\n const faceNormal = Vector3d.fromJSON(this._acceptedSubEntity.normal);\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setOriginFixed = true;\r\n hints.setLockY = true;\r\n hints.setLockZ = true;\r\n hints.setModeRectangular();\r\n hints.setOrigin(facePt);\r\n hints.setXAxis2(faceNormal);\r\n hints.sendHints();\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new OffsetFacesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"ElementGeometryTool.js","sourceRoot":"","sources":["../../src/ElementGeometryTool.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Editing\r\n */\r\n\r\nimport { Id64, Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport { BooleanMode, BooleanOperationProps, editorBuiltInCmdIds, ElementGeometryCacheFilter, ElementGeometryResultOptions, ElementGeometryResultProps, HollowFacesProps, LocateSubEntityProps, OffsetFacesProps, SewSheetProps, SolidModelingCommandIpc, SubEntityFilter, SubEntityGeometryProps, SubEntityLocationProps, SubEntityProps, SubEntityType } from \"@itwin/editor-common\";\r\nimport { FeatureAppearance, FeatureAppearanceProvider, RgbColor } from \"@itwin/core-common\";\r\nimport { Geometry, Point3d, Range3d, Ray3d, Transform, Vector3d } from \"@itwin/core-geometry\";\r\nimport { AccuDrawHintBuilder, BeButtonEvent, DecorateContext, DynamicsContext, ElementSetTool, EventHandled, FeatureOverrideProvider, FeatureSymbology, GraphicBranch, GraphicBranchOptions, GraphicType, HitDetail, IModelApp, IModelConnection, InputSource, LocateResponse, readElementGraphics, RenderGraphicOwner, SelectionMethod, SelectionSet, Viewport } from \"@itwin/core-frontend\";\r\nimport { computeChordToleranceFromPoint } from \"./CreateElementTool\";\r\nimport { EditTools } from \"./EditTool\";\r\n\r\n/** @alpha */\r\nexport class ElementGeometryGraphicsProvider {\r\n public readonly iModel: IModelConnection;\r\n public graphic?: RenderGraphicOwner;\r\n\r\n constructor(iModel: IModelConnection) {\r\n this.iModel = iModel;\r\n }\r\n\r\n /** Call to request a RenderGraphic for the supplied graphic data.\r\n * @see [[cleanupGraphic]] Must be called when the tool exits.\r\n */\r\n public async createGraphic(graphicData: Uint8Array): Promise<boolean> {\r\n try {\r\n const graphic = await readElementGraphics(graphicData, this.iModel, Id64.invalid, true, { noFlash: true, noHilite: true });\r\n const graphicOwner = graphic ? IModelApp.renderSystem.createGraphicOwner(graphic) : undefined;\r\n this.cleanupGraphic();\r\n return (undefined !== (this.graphic = graphicOwner));\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]].\r\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\r\n */\r\n public cleanupGraphic(): void {\r\n if (undefined === this.graphic)\r\n return;\r\n this.graphic.disposeGraphic();\r\n this.graphic = undefined;\r\n }\r\n\r\n public addGraphic(context: DynamicsContext, transform?: Transform, opts?: GraphicBranchOptions): void {\r\n if (undefined === this.graphic)\r\n return;\r\n\r\n if (undefined === transform && undefined === opts) {\r\n context.addGraphic(this.graphic);\r\n return;\r\n }\r\n\r\n const branch = new GraphicBranch(false);\r\n branch.add(this.graphic);\r\n\r\n const branchGraphic = context.createGraphicBranch(branch, transform ? transform : Transform.createIdentity(), opts);\r\n context.addGraphic(branchGraphic);\r\n }\r\n\r\n public addDecoration(context: DecorateContext, type: GraphicType, transform?: Transform, opts?: GraphicBranchOptions): void {\r\n if (undefined === this.graphic)\r\n return;\r\n\r\n const branch = new GraphicBranch(false);\r\n branch.add(this.graphic);\r\n\r\n const branchGraphic = context.createGraphicBranch(branch, transform ? transform : Transform.createIdentity(), opts);\r\n context.addDecoration(type, branchGraphic);\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport class SubEntityData {\r\n public info?: SubEntityProps;\r\n public geom?: SubEntityGeometryProps;\r\n\r\n protected _graphicsProvider?: ElementGeometryGraphicsProvider;\r\n\r\n public isSame(other: SubEntityProps): boolean {\r\n if (undefined === this.info)\r\n return false;\r\n if (this.info.index !== other.index)\r\n return false;\r\n if (this.info.type !== other.type)\r\n return false;\r\n if (this.info.id !== other.id)\r\n return false;\r\n return true;\r\n }\r\n\r\n public getAppearance(vp: Viewport, accepted: boolean): FeatureAppearance {\r\n const color = vp.hilite.color;\r\n const rgb = RgbColor.fromColorDef(accepted ? color.inverse() : color);\r\n const transparency = 0.25;\r\n const emphasized = true; // Necessary for obscured sub-entities w/SceneGraphic...\r\n let weight;\r\n\r\n switch (this.info?.type) {\r\n case SubEntityType.Face:\r\n break;\r\n case SubEntityType.Edge:\r\n const edgeWeight = accepted ? 5 : 3;\r\n weight = this.geom?.appearance?.weight ? Math.min(this.geom.appearance.weight + edgeWeight, 31) : edgeWeight;\r\n break;\r\n case SubEntityType.Vertex:\r\n const vertexWeight = accepted ? 12 : 10;\r\n weight = this.geom?.appearance?.weight ? Math.min(this.geom.appearance.weight + vertexWeight, 31) : vertexWeight;\r\n break;\r\n }\r\n\r\n return FeatureAppearance.fromJSON({ rgb, transparency, weight, emphasized, nonLocatable: true });\r\n }\r\n\r\n public async createGraphic(iModel: IModelConnection): Promise<boolean> {\r\n if (undefined === this.geom?.graphic)\r\n return false;\r\n\r\n if (undefined === this._graphicsProvider)\r\n this._graphicsProvider = new ElementGeometryGraphicsProvider(iModel);\r\n\r\n return this._graphicsProvider.createGraphic(this.geom.graphic);\r\n }\r\n\r\n public cleanupGraphic(): void {\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n this._graphicsProvider.cleanupGraphic();\r\n this._graphicsProvider = undefined;\r\n }\r\n\r\n public get hasGraphic(): boolean {\r\n return (undefined !== this._graphicsProvider?.graphic);\r\n }\r\n\r\n public display(context: DecorateContext, accepted: boolean): void {\r\n if (undefined === this._graphicsProvider?.graphic)\r\n return;\r\n\r\n const appearanceProvider = FeatureAppearanceProvider.supplement((app: FeatureAppearance) => {\r\n return app.extendAppearance(this.getAppearance(context.viewport, accepted));\r\n });\r\n\r\n const opts: GraphicBranchOptions = { appearanceProvider };\r\n\r\n const range = (this.geom?.range ? Range3d.fromJSON(this.geom.range) : undefined);\r\n const pixelSize = context.viewport.getPixelSizeAtPoint(range ? range.center : undefined);\r\n const offsetDir = context.viewport.view.getZVector();\r\n offsetDir.scaleToLength(3 * pixelSize, offsetDir);\r\n const offsetTrans = Transform.createTranslation(offsetDir);\r\n\r\n this._graphicsProvider.addDecoration(context, GraphicType.Scene, offsetTrans, opts);\r\n }\r\n}\r\n\r\n/** @alpha Base class for tools that want to use the backend geometry cache. */\r\nexport abstract class ElementGeometryCacheTool extends ElementSetTool implements FeatureOverrideProvider {\r\n protected _startedCmd?: string;\r\n protected readonly _checkedIds = new Map<Id64String, boolean>();\r\n protected _graphicsProvider?: ElementGeometryGraphicsProvider;\r\n protected _graphicsPending?: true;\r\n protected _firstResult = true;\r\n\r\n protected allowView(vp: Viewport) { return vp.view.is3d(); }\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\r\n\r\n protected async startCommand(): Promise<string> {\r\n if (undefined !== this._startedCmd)\r\n return this._startedCmd;\r\n return EditTools.startCommand<string>(editorBuiltInCmdIds.cmdSolidModeling, this.iModel.key);\r\n }\r\n\r\n public static callCommand<T extends keyof SolidModelingCommandIpc>(method: T, ...args: Parameters<SolidModelingCommandIpc[T]>): ReturnType<SolidModelingCommandIpc[T]> {\r\n return EditTools.callCommand(method, ...args) as ReturnType<SolidModelingCommandIpc[T]>;\r\n }\r\n\r\n // TODO: This looks nice as long as ViewFlags.transparency is on...\r\n protected get agendaAppearance(): FeatureAppearance { return FeatureAppearance.fromTransparency(0.90); }\r\n protected get wantAgendaAppearanceOverride(): boolean { return false; }\r\n\r\n public addFeatureOverrides(overrides: FeatureSymbology.Overrides, _vp: Viewport): void {\r\n if (this.agenda.isEmpty)\r\n return;\r\n\r\n const app = this.agendaAppearance;\r\n this.agenda.elements.forEach((id) => { overrides.overrideElement(id, app); });\r\n }\r\n\r\n protected updateAgendaAppearanceProvider(drop?: true): void {\r\n if (!this.wantAgendaAppearanceOverride)\r\n return;\r\n\r\n for (const vp of IModelApp.viewManager) {\r\n if (!this.allowView(vp))\r\n continue;\r\n\r\n if (drop || this.agenda.isEmpty)\r\n vp.dropFeatureOverrideProvider(this);\r\n else if (!vp.addFeatureOverrideProvider(this))\r\n vp.setFeatureOverrideProviderChanged();\r\n }\r\n }\r\n\r\n protected get geometryCacheFilter(): ElementGeometryCacheFilter | undefined { return undefined; }\r\n\r\n protected async acceptElementForOperation(id: Id64String): Promise<boolean> {\r\n if (Id64.isInvalid(id) || Id64.isTransient(id))\r\n return false;\r\n\r\n let accept = this._checkedIds.get(id);\r\n\r\n if (undefined === accept) {\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n accept = await ElementGeometryCacheTool.callCommand(\"createElementGeometryCache\", id, this.geometryCacheFilter);\r\n } catch (err) {\r\n accept = false;\r\n }\r\n\r\n this._checkedIds.set(id, accept);\r\n }\r\n\r\n return accept;\r\n }\r\n\r\n protected override async isElementValidForOperation(hit: HitDetail, out?: LocateResponse): Promise<boolean> {\r\n if (!await super.isElementValidForOperation(hit, out))\r\n return false;\r\n\r\n return this.acceptElementForOperation(hit.sourceId);\r\n }\r\n\r\n protected async postFilterIds(arg: Id64Arg): Promise<Id64Arg> {\r\n const ids: Id64Array = [];\r\n\r\n for (const id of Id64.iterable(arg)) {\r\n if (await this.acceptElementForOperation(id))\r\n ids.push(id);\r\n }\r\n\r\n return ids;\r\n }\r\n\r\n protected override async getGroupIds(id: Id64String): Promise<Id64Arg> {\r\n return this.postFilterIds(await super.getGroupIds(id));\r\n }\r\n\r\n protected override async getSelectionSetCandidates(ss: SelectionSet): Promise<Id64Arg> {\r\n return this.postFilterIds(await super.getSelectionSetCandidates(ss));\r\n }\r\n\r\n protected override async getDragSelectCandidates(vp: Viewport, origin: Point3d, corner: Point3d, method: SelectionMethod, overlap: boolean): Promise<Id64Arg> {\r\n return this.postFilterIds(await super.getDragSelectCandidates(vp, origin, corner, method, overlap));\r\n }\r\n\r\n public override onDynamicFrame(_ev: BeButtonEvent, context: DynamicsContext): void {\r\n if (undefined !== this._graphicsProvider)\r\n this._graphicsProvider.addGraphic(context);\r\n }\r\n\r\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\r\n return this.updateGraphic(ev, IModelApp.viewManager.inDynamicsMode);\r\n }\r\n\r\n protected async getGraphicData(_ev: BeButtonEvent): Promise<Uint8Array | undefined> { return undefined; }\r\n\r\n protected async updateGraphic(ev: BeButtonEvent, isDynamics: boolean): Promise<void> {\r\n if (!isDynamics || this._graphicsPending)\r\n return; // Continue displaying previous graphic if new graphic is still pending...\r\n\r\n this._graphicsPending = true;\r\n const graphicData = await this.getGraphicData(ev);\r\n this._graphicsPending = undefined;\r\n\r\n if (undefined !== graphicData) {\r\n if (this._firstResult) {\r\n this.updateAgendaAppearanceProvider();\r\n this._firstResult = false;\r\n }\r\n return this.createGraphic(graphicData);\r\n }\r\n\r\n if (undefined !== this._graphicsProvider)\r\n this._graphicsProvider.cleanupGraphic();\r\n }\r\n\r\n protected async createGraphic(graphicData: Uint8Array): Promise<void> {\r\n if (undefined === this._graphicsProvider)\r\n this._graphicsProvider = new ElementGeometryGraphicsProvider(this.iModel);\r\n\r\n await this._graphicsProvider.createGraphic(graphicData);\r\n }\r\n\r\n protected clearGraphic(): void {\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n this._graphicsProvider.cleanupGraphic();\r\n this._graphicsProvider = undefined;\r\n }\r\n\r\n protected async clearElementGeometryCache(): Promise<void> {\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n await ElementGeometryCacheTool.callCommand(\"clearElementGeometryCache\");\r\n } catch (err) { }\r\n }\r\n\r\n public override async onUnsuspend(): Promise<void> {\r\n if (!this._firstResult)\r\n this.updateAgendaAppearanceProvider();\r\n return super.onUnsuspend();\r\n }\r\n\r\n public override async onSuspend(): Promise<void> {\r\n if (!this._firstResult)\r\n this.updateAgendaAppearanceProvider(true);\r\n return super.onSuspend();\r\n }\r\n\r\n public override async onPostInstall(): Promise<void> {\r\n await super.onPostInstall();\r\n if (this.wantAgendaAppearanceOverride)\r\n this.agenda.manageHiliteState = false;\r\n }\r\n\r\n public override async onCleanup(): Promise<void> {\r\n await super.onCleanup();\r\n await this.clearElementGeometryCache();\r\n this.updateAgendaAppearanceProvider(true);\r\n this.clearGraphic();\r\n }\r\n}\r\n\r\n/** @alpha Base class for tools that perform boolean operations on a set of elements. */\r\nexport abstract class BooleanOperationTool extends ElementGeometryCacheTool {\r\n protected abstract get mode(): BooleanMode;\r\n protected override get allowSelectionSet(): boolean { return BooleanMode.Subtract !== this.mode; }\r\n protected override get allowDragSelect(): boolean { return BooleanMode.Subtract !== this.mode; }\r\n protected override get controlKeyContinuesSelection(): boolean { return true; }\r\n protected override get requiredElementCount(): number { return 2; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: false, surfaces: BooleanMode.Subtract === this.mode && !this.agenda.isEmpty, solids: true, other: false };\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n // Filter changes to allow surfaces as tools, invalidate cached accept status...\r\n if (BooleanMode.Subtract === this.mode && (this.agenda.isEmpty || 1 === this.agenda.length))\r\n this._checkedIds.clear();\r\n }\r\n\r\n protected async applyAgendaOperation(): Promise<ElementGeometryResultProps | undefined> {\r\n if (this.agenda.length < this.requiredElementCount)\r\n return undefined;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const target = this.agenda.elements[0];\r\n const tools: Id64Array = this.agenda.elements.slice(1);\r\n const params: BooleanOperationProps = { mode: this.mode, tools };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"booleanOperation\", target, params, opts);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n public override async processAgenda(_ev: BeButtonEvent): Promise<void> {\r\n const result = await this.applyAgendaOperation();\r\n if (result?.elementId)\r\n await this.saveChanges();\r\n }\r\n}\r\n\r\n/** @alpha Perform boolean union of solid geometry. */\r\nexport class UniteSolidElementsTool extends BooleanOperationTool {\r\n public static override toolId = \"UniteSolids\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected override get mode(): BooleanMode { return BooleanMode.Unite; }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new UniteSolidElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Perform boolean subtract of solid geometry. */\r\nexport class SubtractSolidElementsTool extends BooleanOperationTool {\r\n public static override toolId = \"SubtractSolids\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected override get mode(): BooleanMode { return BooleanMode.Subtract; }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new SubtractSolidElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Perform boolean intersection of solid geometry. */\r\nexport class IntersectSolidElementsTool extends BooleanOperationTool {\r\n public static override toolId = \"IntersectSolids\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected override get mode(): BooleanMode { return BooleanMode.Intersect; }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new IntersectSolidElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Perform sew operation on surface geometry. */\r\nexport class SewSheetElementsTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"SewSheets\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected override get allowSelectionSet(): boolean { return true; }\r\n protected override get allowDragSelect(): boolean { return true; }\r\n protected override get controlKeyContinuesSelection(): boolean { return true; }\r\n protected override get requiredElementCount(): number { return 2; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: false, surfaces: true, solids: false, other: false };\r\n }\r\n\r\n protected async applyAgendaOperation(): Promise<ElementGeometryResultProps | undefined> {\r\n if (this.agenda.length < this.requiredElementCount)\r\n return undefined;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const target = this.agenda.elements[0];\r\n const tools: Id64Array = this.agenda.elements.slice(1);\r\n const params: SewSheetProps = { tools };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"sewSheets\", target, params, opts);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n public override async processAgenda(_ev: BeButtonEvent): Promise<void> {\r\n const result = await this.applyAgendaOperation();\r\n if (result?.elementId)\r\n await this.saveChanges();\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new SewSheetElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Base class for tools that need to locate faces, edges, and vertices. */\r\nexport abstract class LocateSubEntityTool extends ElementGeometryCacheTool {\r\n protected _currentSubEntity?: SubEntityData;\r\n protected _acceptedSubEntity?: SubEntityLocationProps;\r\n\r\n protected wantSubEntityType(type: SubEntityType) { return SubEntityType.Face === type; }\r\n protected getMaximumSubEntityHits(type: SubEntityType) { return this.wantSubEntityType(type) ? 25 : 0; }\r\n\r\n protected override get wantAgendaAppearanceOverride(): boolean { return true; }\r\n\r\n public override decorate(context: DecorateContext): void {\r\n if (!this.allowView(context.viewport))\r\n return;\r\n\r\n if (undefined !== this._currentSubEntity)\r\n this._currentSubEntity.display(context, false);\r\n }\r\n\r\n protected getLocateAperture(ev: BeButtonEvent): number {\r\n if (undefined === ev.viewport)\r\n return 0.0;\r\n\r\n return ev.viewport.pixelsFromInches(InputSource.Touch === ev.inputSource ? IModelApp.locateManager.touchApertureInches : IModelApp.locateManager.apertureInches);\r\n }\r\n\r\n protected getMaxRayDistance(ev: BeButtonEvent, aperture: number): number {\r\n if (undefined === ev.viewport)\r\n return 0.0;\r\n\r\n // NOTE: Compute a world coordinate radius for ray test, try getting aperature size at point on element...\r\n const hit = IModelApp.accuSnap.currHit;\r\n const vec: Point3d[] = [];\r\n\r\n vec[0] = ev.viewport.worldToView(hit ? hit.hitPoint : ev.point);\r\n vec[1] = vec[0].clone(); vec[1].x += 1;\r\n ev.viewport.viewToWorldArray(vec);\r\n\r\n // The edge and vertex hits get post-filtered on xy distance, so this is fine for perspective views...\r\n return (aperture * vec[0].distance(vec[1]));\r\n }\r\n\r\n protected getSubEntityFilter(): SubEntityFilter | undefined { return undefined; }\r\n\r\n protected async pickSubEntities(id: Id64String, boresite: Ray3d, maxFace: number, maxEdge: number, maxVertex: number, maxDistance: number, hiddenEdgesVisible: boolean, filter?: SubEntityFilter): Promise<SubEntityLocationProps[] | undefined> {\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const opts: LocateSubEntityProps = {\r\n maxFace,\r\n maxEdge,\r\n maxVertex,\r\n maxDistance,\r\n hiddenEdgesVisible,\r\n filter,\r\n };\r\n return await ElementGeometryCacheTool.callCommand(\"locateSubEntities\", id, boresite.origin, boresite.direction, opts);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n protected async doPickSubEntities(id: Id64String, ev: BeButtonEvent): Promise<SubEntityLocationProps[] | undefined> {\r\n const vp = ev.viewport;\r\n if (undefined === vp)\r\n return undefined;\r\n\r\n const maxFace = this.getMaximumSubEntityHits(SubEntityType.Face);\r\n const maxEdge = this.getMaximumSubEntityHits(SubEntityType.Edge);\r\n const maxVertex = this.getMaximumSubEntityHits(SubEntityType.Vertex);\r\n\r\n if (0 === maxFace && 0 === maxEdge && 0 === maxVertex)\r\n return undefined;\r\n\r\n const aperture = this.getLocateAperture(ev);\r\n const maxDistance = this.getMaxRayDistance(ev, aperture);\r\n const boresite = AccuDrawHintBuilder.getBoresite(ev.point, vp);\r\n const hiddenEdgesVisible = vp.viewFlags.hiddenEdgesVisible();\r\n const filter = this.getSubEntityFilter();\r\n\r\n let hits = await this.pickSubEntities(id, boresite, maxFace, maxEdge, maxVertex, maxDistance, hiddenEdgesVisible, filter);\r\n\r\n // NOTE: Remove erroneous edge/vertex hits in perspective views by checking real xy distance to hit point...\r\n if (undefined === hits || !vp.isCameraOn)\r\n return hits;\r\n\r\n if (maxEdge > 0 && hits.length > 1) {\r\n const edgeApertureSquared = (aperture * aperture);\r\n const vertexApertureSquared = ((aperture * 2.0) * (aperture * 2.0));\r\n\r\n const e2 = Math.pow(aperture, 2);\r\n const v2 = Math.pow(aperture * 2.0, 2);\r\n\r\n if (e2 !== edgeApertureSquared || v2 !== vertexApertureSquared)\r\n return hits;\r\n\r\n const rayOrigin = vp.worldToView(boresite.origin);\r\n\r\n hits = hits.filter((hit) => {\r\n if (SubEntityType.Face === hit.subEntity.type)\r\n return true;\r\n\r\n const hitPoint = vp.worldToView(Point3d.fromJSON(hit.point));\r\n const distance = hitPoint.distanceSquaredXY(rayOrigin);\r\n\r\n return (distance <= (SubEntityType.Edge === hit.subEntity.type ? edgeApertureSquared : vertexApertureSquared));\r\n });\r\n }\r\n\r\n return hits;\r\n }\r\n\r\n protected async doLocateSubEntity(ev: BeButtonEvent, newSearch: boolean): Promise<boolean> {\r\n if (this.agenda.isEmpty || undefined === ev.viewport)\r\n return false;\r\n\r\n if (newSearch) {\r\n const info = await this.doPickSubEntities(this.agenda.elements[this.agenda.length - 1], ev);\r\n\r\n if (undefined === info)\r\n return false;\r\n\r\n this._acceptedSubEntity = info[0]; // TODO: Save array for reset cyling. Do we need to support multiple elements?\r\n this.clearSubEntityGraphic();\r\n\r\n return true;\r\n }\r\n\r\n this._acceptedSubEntity = undefined;\r\n return true;\r\n }\r\n\r\n protected override async chooseNextHit(ev: BeButtonEvent): Promise<EventHandled> {\r\n if (undefined === this._acceptedSubEntity)\r\n return super.chooseNextHit(ev);\r\n\r\n await this.doLocateSubEntity(ev, false);\r\n if (undefined === this._acceptedSubEntity)\r\n await this.onReinitialize();\r\n\r\n return EventHandled.No;\r\n }\r\n\r\n protected override async gatherInput(ev: BeButtonEvent): Promise<EventHandled | undefined> {\r\n if (undefined === this._acceptedSubEntity)\r\n await this.doLocateSubEntity(ev, true);\r\n return super.gatherInput(ev);\r\n }\r\n\r\n protected override get wantAdditionalInput(): boolean {\r\n if (undefined === this._acceptedSubEntity)\r\n return true;\r\n return super.wantAdditionalInput;\r\n }\r\n\r\n protected async setCurrentSubEntity(id?: Id64String, current?: SubEntityLocationProps, chordTolerance?: number): Promise<boolean> {\r\n if (undefined === id || undefined === current) {\r\n if (undefined === this._currentSubEntity || !this._currentSubEntity.hasGraphic)\r\n return false;\r\n this._currentSubEntity.cleanupGraphic();\r\n return true;\r\n }\r\n\r\n if (undefined !== this._currentSubEntity && this._currentSubEntity.hasGraphic && this._currentSubEntity.isSame(current.subEntity))\r\n return false;\r\n\r\n if (undefined === this._currentSubEntity)\r\n this._currentSubEntity = new SubEntityData();\r\n else\r\n this._currentSubEntity.cleanupGraphic();\r\n\r\n const opts: ElementGeometryResultOptions = {\r\n wantGraphic: true,\r\n wantRange: true,\r\n wantAppearance: true,\r\n chordTolerance,\r\n };\r\n\r\n this._currentSubEntity.info = current.subEntity;\r\n this._currentSubEntity.geom = await ElementGeometryCacheTool.callCommand(\"getSubEntityGeometry\", id, current.subEntity, opts);\r\n\r\n return this._currentSubEntity.createGraphic(this.iModel);\r\n }\r\n\r\n protected clearSubEntityGraphic(): void {\r\n if (undefined === this._currentSubEntity)\r\n return;\r\n this._currentSubEntity.cleanupGraphic();\r\n this._currentSubEntity = undefined;\r\n }\r\n\r\n protected async updateSubEntityGraphic(ev: BeButtonEvent): Promise<boolean> {\r\n if (undefined === ev.viewport)\r\n return false;\r\n\r\n const hit = IModelApp.accuSnap.currHit;\r\n if (undefined === hit || !hit.isElementHit)\r\n return this.setCurrentSubEntity();\r\n\r\n const current = await this.doPickSubEntities(hit.sourceId, ev);\r\n const chordTolerance = current ? computeChordToleranceFromPoint(ev.viewport, Point3d.fromJSON(current[0].point)) : 0.0;\r\n\r\n if (!await this.setCurrentSubEntity(hit.sourceId, current ? current[0] : undefined, chordTolerance))\r\n return false;\r\n\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n return true;\r\n }\r\n\r\n protected override async updateGraphic(ev: BeButtonEvent, isDynamics: boolean): Promise<void> {\r\n if (isDynamics)\r\n return super.updateGraphic(ev, isDynamics);\r\n\r\n await this.updateSubEntityGraphic(ev);\r\n }\r\n\r\n protected async applyAgendaOperation(_ev: BeButtonEvent, _isAccept: boolean): Promise<ElementGeometryResultProps | undefined> { return undefined; }\r\n\r\n protected override async getGraphicData(ev: BeButtonEvent): Promise<Uint8Array | undefined> {\r\n const result = await this.applyAgendaOperation(ev, false);\r\n return result?.graphic;\r\n }\r\n\r\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\r\n if (undefined === this._acceptedSubEntity)\r\n return;\r\n\r\n const result = await this.applyAgendaOperation(ev, true);\r\n if (result?.elementId)\r\n await this.saveChanges();\r\n }\r\n\r\n protected setupAccuDraw(): void { }\r\n\r\n protected override setupAndPromptForNextAction(): void {\r\n this.setupAccuDraw();\r\n super.setupAndPromptForNextAction();\r\n }\r\n\r\n public override async onCleanup(): Promise<void> {\r\n this.clearSubEntityGraphic();\r\n return super.onCleanup();\r\n }\r\n}\r\n\r\n/** @alpha Identify faces of solids and surfaces to offset. */\r\nexport class OffsetFacesTool extends LocateSubEntityTool {\r\n public static override toolId = \"OffsetFaces\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n public override requireWriteableTarget(): boolean { return false; } // TODO: Testing...\r\n\r\n protected override get wantDynamics(): boolean { return true; }\r\n protected override get wantAccuSnap(): boolean { return undefined !== this._acceptedSubEntity; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { minGeom: 1, maxGeom: 1, parts: true, curves: false, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected override async applyAgendaOperation(ev: BeButtonEvent, isAccept: boolean): Promise<ElementGeometryResultProps | undefined> {\r\n if (undefined === ev.viewport || this.agenda.isEmpty || undefined === this._acceptedSubEntity?.point || undefined === this._acceptedSubEntity?.normal)\r\n return undefined;\r\n\r\n const facePt = Point3d.fromJSON(this._acceptedSubEntity.point);\r\n const faceNormal = Vector3d.fromJSON(this._acceptedSubEntity.normal);\r\n const projPt = AccuDrawHintBuilder.projectPointToLineInView(ev.point, facePt, faceNormal, ev.viewport);\r\n\r\n if (undefined === projPt)\r\n return undefined;\r\n\r\n const offsetDir = Vector3d.createStartEnd(facePt, projPt);\r\n let offset = offsetDir.magnitude();\r\n\r\n if (offset < Geometry.smallMetricDistance)\r\n return undefined;\r\n\r\n if (offsetDir.dotProduct(faceNormal) < 0.0)\r\n offset = -offset;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const params: OffsetFacesProps = { faces: this._acceptedSubEntity.subEntity, distances: offset };\r\n const opts: ElementGeometryResultOptions = {\r\n wantGraphic: isAccept ? undefined : true,\r\n chordTolerance: computeChordToleranceFromPoint(ev.viewport, ev.point),\r\n requestId: `${this.toolId}:${this.agenda.elements[0]}`,\r\n writeChanges: isAccept ? true : undefined,\r\n };\r\n return await ElementGeometryCacheTool.callCommand(\"offsetFaces\", this.agenda.elements[0], params, opts);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n protected override setupAccuDraw(): void {\r\n if (undefined === this._acceptedSubEntity?.point || undefined === this._acceptedSubEntity?.normal)\r\n return;\r\n\r\n const facePt = Point3d.fromJSON(this._acceptedSubEntity.point);\r\n const faceNormal = Vector3d.fromJSON(this._acceptedSubEntity.normal);\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setOriginFixed = true;\r\n hints.setLockY = true;\r\n hints.setLockZ = true;\r\n hints.setModeRectangular();\r\n hints.setOrigin(facePt);\r\n hints.setXAxis2(faceNormal);\r\n hints.sendHints();\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new OffsetFacesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Identify faces to offset to hollow solids. */\r\nexport class HollowFacesTool extends LocateSubEntityTool {\r\n public static override toolId = \"HollowFaces\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { minGeom: 1, maxGeom: 1, parts: true, curves: false, surfaces: false, solids: true, other: false };\r\n }\r\n\r\n protected override async applyAgendaOperation(ev: BeButtonEvent, isAccept: boolean): Promise<ElementGeometryResultProps | undefined> {\r\n if (undefined === ev.viewport || this.agenda.isEmpty || undefined === this._acceptedSubEntity)\r\n return undefined;\r\n\r\n // TODO: Tool settings for shell thickness and face thickness...\r\n const shellThickness = 0.1;\r\n const faceThickness = 0.0;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const params: HollowFacesProps = { faces: this._acceptedSubEntity.subEntity, distances: faceThickness, defaultDistance: shellThickness };\r\n const opts: ElementGeometryResultOptions = {\r\n wantGraphic: isAccept ? undefined : true,\r\n chordTolerance: computeChordToleranceFromPoint(ev.viewport, ev.point),\r\n requestId: `${this.toolId}:${this.agenda.elements[0]}`,\r\n writeChanges: isAccept ? true : undefined,\r\n };\r\n return await ElementGeometryCacheTool.callCommand(\"hollowFaces\", this.agenda.elements[0], params, opts);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new HollowFacesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n"]}
|
|
@@ -98,10 +98,30 @@
|
|
|
98
98
|
"CornerRadius": "Corner Radius"
|
|
99
99
|
}
|
|
100
100
|
},
|
|
101
|
+
"UniteSolids": {
|
|
102
|
+
"keyin": "editor unite solids",
|
|
103
|
+
"flyover": "Unite selected solids"
|
|
104
|
+
},
|
|
105
|
+
"SubtractSolids": {
|
|
106
|
+
"keyin": "editor subtract solids",
|
|
107
|
+
"flyover": "Subtract selected solids"
|
|
108
|
+
},
|
|
109
|
+
"IntersectSolids": {
|
|
110
|
+
"keyin": "editor intersect solids",
|
|
111
|
+
"flyover": "Intersect selected solids"
|
|
112
|
+
},
|
|
113
|
+
"SewSheets": {
|
|
114
|
+
"keyin": "editor sew sheets",
|
|
115
|
+
"flyover": "Sew selected sheets"
|
|
116
|
+
},
|
|
101
117
|
"OffsetFaces": {
|
|
102
118
|
"keyin": "editor offset faces",
|
|
103
119
|
"flyover": "Offset faces of surfaces and solids"
|
|
104
120
|
},
|
|
121
|
+
"HollowFaces": {
|
|
122
|
+
"keyin": "editor hollow faces",
|
|
123
|
+
"flyover": "Hollow solids by offsetting faces"
|
|
124
|
+
},
|
|
105
125
|
"UndoAll": {
|
|
106
126
|
"keyin": "editor undo all",
|
|
107
127
|
"flyover": "Undo All"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/editor-frontend",
|
|
3
|
-
"version": "3.0.0-
|
|
3
|
+
"version": "3.0.0-extension.0",
|
|
4
4
|
"description": "iModel.js frontend components",
|
|
5
5
|
"main": "lib/cjs/editor-frontend.js",
|
|
6
6
|
"module": "lib/esm/editor-frontend.js",
|
|
@@ -23,19 +23,19 @@
|
|
|
23
23
|
"url": "http://www.bentley.com"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
|
-
"@itwin/core-bentley": "^3.0.0-
|
|
27
|
-
"@itwin/core-common": "^3.0.0-
|
|
26
|
+
"@itwin/core-bentley": "^3.0.0-extension.0",
|
|
27
|
+
"@itwin/core-common": "^3.0.0-extension.0"
|
|
28
28
|
},
|
|
29
29
|
"//devDependencies": [
|
|
30
30
|
"NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install",
|
|
31
31
|
"NOTE: All tools used by scripts in this package must be listed as devDependencies"
|
|
32
32
|
],
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@itwin/core-bentley": "3.0.0-
|
|
35
|
-
"@itwin/build-tools": "3.0.0-
|
|
36
|
-
"@itwin/certa": "3.0.0-
|
|
37
|
-
"@itwin/eslint-plugin": "3.0.0-
|
|
38
|
-
"@itwin/core-common": "3.0.0-
|
|
34
|
+
"@itwin/core-bentley": "3.0.0-extension.0",
|
|
35
|
+
"@itwin/build-tools": "3.0.0-extension.0",
|
|
36
|
+
"@itwin/certa": "3.0.0-extension.0",
|
|
37
|
+
"@itwin/eslint-plugin": "3.0.0-extension.0",
|
|
38
|
+
"@itwin/core-common": "3.0.0-extension.0",
|
|
39
39
|
"@types/chai": "^4.1.4",
|
|
40
40
|
"@types/mocha": "^8.2.2",
|
|
41
41
|
"@types/node": "14.14.31",
|
|
@@ -55,10 +55,10 @@
|
|
|
55
55
|
"NOTE: editor-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"
|
|
56
56
|
],
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"@itwin/core-geometry": "3.0.0-
|
|
59
|
-
"@itwin/editor-common": "3.0.0-
|
|
60
|
-
"@itwin/core-frontend": "3.0.0-
|
|
61
|
-
"@itwin/appui-abstract": "3.0.0-
|
|
58
|
+
"@itwin/core-geometry": "3.0.0-extension.0",
|
|
59
|
+
"@itwin/editor-common": "3.0.0-extension.0",
|
|
60
|
+
"@itwin/core-frontend": "3.0.0-extension.0",
|
|
61
|
+
"@itwin/appui-abstract": "3.0.0-extension.0"
|
|
62
62
|
},
|
|
63
63
|
"eslintConfig": {
|
|
64
64
|
"plugins": [
|