@itwin/editor-frontend 3.0.0-dev.127 → 3.0.0-dev.131
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/EditTool.d.ts.map +1 -1
- package/lib/cjs/EditTool.js +3 -0
- package/lib/cjs/EditTool.js.map +1 -1
- package/lib/cjs/ElementGeometryTool.d.ts +1 -0
- package/lib/cjs/ElementGeometryTool.d.ts.map +1 -1
- package/lib/cjs/ElementGeometryTool.js +11 -1
- package/lib/cjs/ElementGeometryTool.js.map +1 -1
- package/lib/cjs/SolidModelingTools.d.ts +50 -0
- package/lib/cjs/SolidModelingTools.d.ts.map +1 -1
- package/lib/cjs/SolidModelingTools.js +306 -4
- package/lib/cjs/SolidModelingTools.js.map +1 -1
- package/lib/esm/EditTool.d.ts.map +1 -1
- package/lib/esm/EditTool.js +4 -1
- package/lib/esm/EditTool.js.map +1 -1
- package/lib/esm/ElementGeometryTool.d.ts +1 -0
- package/lib/esm/ElementGeometryTool.d.ts.map +1 -1
- package/lib/esm/ElementGeometryTool.js +12 -2
- package/lib/esm/ElementGeometryTool.js.map +1 -1
- package/lib/esm/SolidModelingTools.d.ts +50 -0
- package/lib/esm/SolidModelingTools.d.ts.map +1 -1
- package/lib/esm/SolidModelingTools.js +303 -4
- package/lib/esm/SolidModelingTools.js.map +1 -1
- package/lib/public/locales/en/Editor.json +12 -0
- package/package.json +12 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidModelingTools.js","sourceRoot":"","sources":["../../src/SolidModelingTools.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 { Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport { BlendEdgesProps, BooleanMode, BooleanOperationProps, ChamferEdgesProps, ChamferMode, CutDepthMode, CutDirectionMode, CutProps, ElementGeometryCacheFilter, ElementGeometryResultOptions, ElementGeometryResultProps, EmbossDirectionMode, EmbossProps, HollowFacesProps, ImprintProps, LoftProps, OffsetFacesProps, ProfileClosure, SewSheetProps, SubEntityFilter, SubEntityLocationProps, SubEntityProps, SubEntityType, SweepPathProps, ThickenSheetProps } from \"@itwin/editor-common\";\r\nimport { ColorDef, ElementGeometry } from \"@itwin/core-common\";\r\nimport { Geometry, LineString3d, Point3d, Vector3d, XYZProps } from \"@itwin/core-geometry\";\r\nimport { AccuDrawHintBuilder, BeButtonEvent, DecorateContext, DynamicsContext, EventHandled, GraphicType, HitDetail } from \"@itwin/core-frontend\";\r\nimport { computeChordToleranceFromPoint } from \"./CreateElementTool\";\r\nimport { ElementGeometryCacheTool, isSameSubEntity, LocateSubEntityTool, SubEntityData } from \"./ElementGeometryTool\";\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.onGeometryCacheFilterChanged();\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 Perform thicken operation on surface geometry. */\r\nexport class ThickenSheetElementsTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"ThickenSheets\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n // TODO: Tool settings for front and back distances...\r\n protected frontDistance = 0.5;\r\n protected backDistance = 0.0;\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 params: ThickenSheetProps = { front: this.frontDistance, back: this.backDistance };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"thickenSheets\", 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 ThickenSheetElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Perform cut operation on solid using region or path profile. */\r\nexport class CutSolidElementsTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"CutSolids\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n protected targetPoint?: Point3d;\r\n protected toolPoint?: Point3d;\r\n\r\n // TODO: Tool settings for both directions, blind cut depth, and outside...\r\n protected bothDirections = false;\r\n protected distance = 0.0;\r\n protected outside = undefined;\r\n\r\n protected override get requiredElementCount(): number { return 2; }\r\n protected get isProfilePhase(): boolean { return !this.agenda.isEmpty; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n const profilePhase = this.isProfilePhase;\r\n return { minGeom: 1, maxGeom: profilePhase ? 1 : undefined, parts: true, curves: profilePhase, surfaces: profilePhase, solids: !profilePhase, other: false };\r\n }\r\n\r\n protected override async createElementGeometryCache(id: Id64String): Promise<boolean> {\r\n if (!await super.createElementGeometryCache(id))\r\n return false;\r\n\r\n if (!this.isProfilePhase)\r\n return true;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n return await ElementGeometryCacheTool.callCommand(\"isPlanarBody\", id, 0);\r\n } catch (err) {\r\n return false;\r\n }\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n // Filter changes to allow sheets and wires as profiles, invalidate cached accept status...\r\n if (this.agenda.isEmpty || 1 === this.agenda.length)\r\n this.onGeometryCacheFilterChanged();\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 const direction = (this.bothDirections ? CutDirectionMode.Both : CutDirectionMode.Auto);\r\n const depth = (0.0 === this.distance ? CutDepthMode.All : CutDepthMode.Blind);\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const target = this.agenda.elements[0];\r\n const profile = this.agenda.elements[1];\r\n const params: CutProps = { profile, direction, depth, distance: this.distance, outside: this.outside, closeOpen: ProfileClosure.Auto, targetPoint: this.targetPoint, toolPoint: this.toolPoint };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"cutSolid\", 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 protected override async buildLocateAgenda(hit: HitDetail): Promise<boolean> {\r\n if (this.isProfilePhase)\r\n this.toolPoint = hit.hitPoint;\r\n else\r\n this.targetPoint = hit.hitPoint;\r\n\r\n return super.buildLocateAgenda(hit);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new CutSolidElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Perform emboss operation on solid or sheet using sheet profile. */\r\nexport class EmbossSolidElementsTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"EmbossSolids\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n protected targetPoint?: Point3d;\r\n\r\n protected override get requiredElementCount(): number { return 2; }\r\n protected get isProfilePhase(): boolean { return !this.agenda.isEmpty; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n const profilePhase = this.isProfilePhase;\r\n return { minGeom: 1, maxGeom: 1, parts: true, curves: false, surfaces: true, solids: !profilePhase, other: false };\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n // Filter changes to disallow solids as profiles, invalidate cached accept status...\r\n if (this.agenda.isEmpty || 1 === this.agenda.length)\r\n this.onGeometryCacheFilterChanged();\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 profile = this.agenda.elements[1];\r\n const params: EmbossProps = { profile, direction: EmbossDirectionMode.Auto, targetPoint: this.targetPoint };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"embossBody\", 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 protected override async buildLocateAgenda(hit: HitDetail): Promise<boolean> {\r\n if (!this.isProfilePhase)\r\n this.targetPoint = hit.hitPoint;\r\n\r\n return super.buildLocateAgenda(hit);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new EmbossSolidElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Create a solid for sheet by sweeping a profile along a path. */\r\nexport class SweepAlongPathTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"SweepAlongPath\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected override get requiredElementCount(): number { return 2; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { minGeom: 1, maxGeom: 1, parts: true, curves: true, 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 path = this.agenda.elements[1];\r\n const params: SweepPathProps = { path };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"sweepAlongPath\", 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 SweepAlongPathTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Create a new sheet or solid body by lofting through a set of profiles. */\r\nexport class LoftProfilesTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"LoftProfiles\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected override get requiredElementCount(): number { return 2; }\r\n protected override get controlKeyContinuesSelection(): boolean { return true; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { minGeom: 1, maxGeom: 1, parts: true, curves: true, 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 = this.agenda.elements.slice(1);\r\n const params: LoftProps = { tools, orderCurves: this.isSelectionSetModify ? true : undefined, orientCurves: true };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"loftProfiles\", 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 LoftProfilesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport class FaceLocationData {\r\n public point: Point3d;\r\n public normal: Vector3d;\r\n\r\n constructor(point: Point3d, normal: Vector3d) {\r\n this.point = point;\r\n this.normal = normal;\r\n }\r\n\r\n public static create(pointProps: XYZProps, normalProps: XYZProps) {\r\n const point = Point3d.fromJSON(pointProps);\r\n const normal = Vector3d.fromJSON(normalProps);\r\n return new FaceLocationData(point, normal);\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 protected override get wantDynamics(): boolean { return true; }\r\n protected override get wantAccuSnap(): boolean { return this.isDynamicsStarted; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: false, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected override async createSubEntityData(id: Id64String, hit: SubEntityLocationProps): Promise<SubEntityData> {\r\n const data = await super.createSubEntityData(id, hit);\r\n\r\n if (undefined !== hit.point && undefined !== hit.normal)\r\n data.toolData = FaceLocationData.create(hit.point, hit.normal);\r\n\r\n return data;\r\n }\r\n\r\n protected override drawAcceptedSubEntities(context: DecorateContext): void {\r\n super.drawAcceptedSubEntities(context);\r\n\r\n // Show pick point on last identified face, offset direction/distance will be computed from this location...\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return;\r\n\r\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 10);\r\n builder.addPointString([faceData.point]);\r\n\r\n context.addDecorationFromBuilder(builder);\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 || !this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return undefined;\r\n\r\n const projPt = AccuDrawHintBuilder.projectPointToLineInView(ev.point, faceData.point, faceData.normal, ev.viewport);\r\n\r\n if (undefined === projPt)\r\n return undefined;\r\n\r\n const offsetDir = Vector3d.createStartEnd(faceData.point, 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(faceData.normal) < 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.getAcceptedSubEntities(), 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 (!this.haveAcceptedSubEntities)\r\n return;\r\n\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return;\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(faceData.point);\r\n hints.setXAxis2(faceData.normal);\r\n hints.sendHints(false);\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 // TODO: Tool settings for shell thickness and face thickness...\r\n protected shellThickness = 0.1;\r\n protected faceThickness = 0.0;\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { 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 || !this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const params: HollowFacesProps = { faces: this.getAcceptedSubEntities(), distances: this.faceThickness, defaultDistance: this.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\r\n/** @alpha */\r\nexport enum ImprintSolidMethod {\r\n /** Imprint intersection with another element */\r\n Element = 0,\r\n /** Imprint offset edges onto face */\r\n Edges = 1,\r\n /** Imprint line string defined by points onto face */\r\n Points = 2,\r\n}\r\n\r\n/** @alpha Identify edges or elements to imprint on solid or surface. */\r\nexport class ImprintSolidElementsTool extends LocateSubEntityTool {\r\n public static override toolId = \"ImprintSolids\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n // TODO: Tool settings for method, propagate for edges, offset distance...\r\n protected method = ImprintSolidMethod.Points;\r\n protected points: Point3d[] = [];\r\n protected extend = true;\r\n protected distance = 0.1;\r\n\r\n protected override get requiredElementCount(): number { return ImprintSolidMethod.Element === this.method ? 2 : 1; }\r\n protected override get allowSubEntityControlSelect(): boolean { return ImprintSolidMethod.Edges === this.method; }\r\n protected override get inhibitSubEntityDisplay(): boolean { return ImprintSolidMethod.Points === this.method ? false : super.inhibitSubEntityDisplay; }\r\n\r\n protected override wantSubEntityType(type: SubEntityType): boolean {\r\n switch (type) {\r\n case SubEntityType.Face:\r\n return ImprintSolidMethod.Points === this.method;\r\n case SubEntityType.Edge:\r\n return ImprintSolidMethod.Edges === this.method;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n protected override get wantDynamics(): boolean { return ImprintSolidMethod.Points === this.method; }\r\n protected override get wantAccuSnap(): boolean { return ImprintSolidMethod.Points === this.method && this.isDynamicsStarted; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: !this.agenda.isEmpty, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n // Filter changes to allow imprinting an open path, invalidate cached accept status...\r\n if (ImprintSolidMethod.Element === this.method && (this.agenda.isEmpty || 1 === this.agenda.length))\r\n this.onGeometryCacheFilterChanged();\r\n }\r\n\r\n protected override async createSubEntityData(id: Id64String, hit: SubEntityLocationProps): Promise<SubEntityData> {\r\n const data = await super.createSubEntityData(id, hit);\r\n\r\n if (undefined !== hit.point && undefined !== hit.normal)\r\n data.toolData = FaceLocationData.create(hit.point, hit.normal);\r\n\r\n return data;\r\n }\r\n\r\n protected override async applyAgendaOperation(_ev: BeButtonEvent, isAccept: boolean): Promise<ElementGeometryResultProps | undefined> {\r\n if (!isAccept || this.agenda.length < this.requiredElementCount)\r\n return undefined;\r\n\r\n const id = this.agenda.elements[0];\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n\r\n let params: ImprintProps;\r\n if (ImprintSolidMethod.Points === this.method) {\r\n if (!this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n const geom = ElementGeometry.fromGeometryQuery(LineString3d.create(this.points));\r\n if (undefined === geom)\r\n return undefined;\r\n\r\n params = { imprint : geom, face: this.getAcceptedSubEntityData(0)?.props, extend: this.extend ? true : undefined };\r\n } else if (ImprintSolidMethod.Edges === this.method) {\r\n if (!this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n // TODO: Include all accepted edges...\r\n const edge = this.getAcceptedSubEntityData(0)?.props;\r\n if (undefined === edge)\r\n return undefined;\r\n\r\n const edgeFaces = await ElementGeometryCacheTool.callCommand(\"getConnectedSubEntities\", id, edge, SubEntityType.Face );\r\n if (undefined === edgeFaces || 0 === edgeFaces.length)\r\n return undefined;\r\n\r\n // TODO: Check planar face...get preferred face from cursor location in dynamics, etc.\r\n const edgeLoop = await ElementGeometryCacheTool.callCommand(\"getConnectedSubEntities\", id, edge, SubEntityType.Edge, { loopFace: edgeFaces[0] } );\r\n if (undefined === edgeLoop || 0 === edgeLoop.length)\r\n return undefined;\r\n\r\n params = { imprint : edgeLoop, face: edgeFaces[0], distance: this.distance, extend: this.extend ? true : undefined };\r\n } else {\r\n params = { imprint : this.agenda.elements[1], extend: this.extend ? true : undefined };\r\n }\r\n\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"imprintBody\", id, params, opts);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\r\n if (ImprintSolidMethod.Points !== this.method || 0 === this.points.length)\r\n return;\r\n\r\n const pts = this.points.slice();\r\n pts.push(ev.point.clone());\r\n\r\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 3);\r\n builder.addLineString(pts);\r\n\r\n context.addGraphic(builder.finish());\r\n }\r\n\r\n protected override async gatherInput(ev: BeButtonEvent): Promise<EventHandled | undefined> {\r\n switch (this.method) {\r\n case ImprintSolidMethod.Points: {\r\n if (!this.haveAcceptedSubEntities)\r\n break;\r\n\r\n this.points.push(ev.point.clone());\r\n if (!ev.isControlKey)\r\n break;\r\n\r\n return EventHandled.No;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return super.gatherInput(ev);\r\n }\r\n\r\n protected override get wantAdditionalInput(): boolean {\r\n switch (this.method) {\r\n case ImprintSolidMethod.Element:\r\n return false;\r\n\r\n case ImprintSolidMethod.Edges:\r\n return super.wantAdditionalInput;\r\n\r\n case ImprintSolidMethod.Points:\r\n return super.wantAdditionalInput || this.points.length < 2;\r\n }\r\n }\r\n\r\n protected override setupAccuDraw(): void {\r\n if (ImprintSolidMethod.Points !== this.method || 0 !== this.points.length)\r\n return;\r\n\r\n if (!this.haveAcceptedSubEntities)\r\n return;\r\n\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setModeRectangular();\r\n hints.setOrigin(faceData.point);\r\n hints.setNormal(faceData.normal);\r\n hints.sendHints(false);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new ImprintSolidElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Identify edges of solids and surfaces to apply blend to. */\r\nexport abstract class BlendEdgesTool extends LocateSubEntityTool {\r\n // TODO: Tool settings for tangent edge propagation...\r\n protected propagateSmooth = true;\r\n\r\n protected override wantSubEntityType(type: SubEntityType): boolean { return SubEntityType.Edge === type; }\r\n\r\n protected override getSubEntityFilter(): SubEntityFilter | undefined {\r\n return { laminarEdges: true, smoothEdges: true };\r\n }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: false, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected async getTangentEdges(id: Id64String, edge: SubEntityProps): Promise<SubEntityProps[] | undefined> {\r\n try {\r\n return await ElementGeometryCacheTool.callCommand(\"getConnectedSubEntities\", id, edge, SubEntityType.Edge, { smoothEdges: true });\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n protected async addTangentEdges(id: Id64String, edge?: SubEntityProps, chordTolerance?: number): Promise<void> {\r\n if (undefined === edge) {\r\n this._acceptedSubEntities.forEach(async (accepted) => {\r\n if (undefined === accepted.toolData)\r\n await this.addTangentEdges(id, accepted.props, accepted.chordTolerance);\r\n });\r\n return;\r\n }\r\n\r\n const tangentEdges = await this.getTangentEdges(id, edge);\r\n if (undefined === tangentEdges)\r\n return;\r\n\r\n tangentEdges.forEach(async (entry) => {\r\n if (!isSameSubEntity(entry, edge)) {\r\n const data = new SubEntityData(entry);\r\n data.toolData = edge; // Mark edge so we know it was added as tangent edge...\r\n await this.createSubEntityGraphic(id, data, chordTolerance);\r\n this._acceptedSubEntities.push(data);\r\n }\r\n });\r\n }\r\n\r\n protected async removeTangentEdges(_id: Id64String, edge?: SubEntityProps): Promise<void> {\r\n if (undefined === edge) {\r\n this._acceptedSubEntities = this._acceptedSubEntities.filter((entry) => undefined === entry.toolData );\r\n return;\r\n }\r\n\r\n const edgeData = this._acceptedSubEntities.find((entry) => isSameSubEntity(entry.props, edge));\r\n if (undefined === edgeData)\r\n return undefined;\r\n\r\n const isTangentEdge = (other: SubEntityData): boolean => {\r\n const primaryOther = (undefined !== other.toolData ? other.toolData : other.props);\r\n return isSameSubEntity(primaryEdge, primaryOther);\r\n };\r\n\r\n const primaryEdge = (undefined !== edgeData.toolData ? edgeData.toolData : edgeData.props);\r\n this._acceptedSubEntities = this._acceptedSubEntities.filter((entry) => !isTangentEdge(entry));\r\n }\r\n\r\n protected override async addSubEntity(id: Id64String, props: SubEntityLocationProps): Promise<void> {\r\n await super.addSubEntity(id, props);\r\n\r\n if (!this.propagateSmooth)\r\n return;\r\n\r\n const chordTolerance = (this.targetView ? computeChordToleranceFromPoint(this.targetView, Point3d.fromJSON(props.point)) : undefined);\r\n\r\n return this.addTangentEdges(id, props.subEntity, chordTolerance);\r\n }\r\n\r\n protected override async removeSubEntity(id: Id64String, props?: SubEntityLocationProps): Promise<void> {\r\n if (!this.propagateSmooth)\r\n return super.removeSubEntity(id, props);\r\n\r\n const edge = (undefined !== props) ? props.subEntity : this.getAcceptedSubEntityData()?.props;\r\n if (undefined === edge)\r\n return;\r\n\r\n return this.removeTangentEdges(id, edge);\r\n }\r\n\r\n protected override getAcceptedSubEntities(): SubEntityProps[] {\r\n const edges: SubEntityProps[] = [];\r\n this._acceptedSubEntities.forEach((entry) => { if (undefined === entry.toolData) edges.push(entry.props); });\r\n return edges;\r\n }\r\n}\r\n\r\n/** @alpha Identify edges of solids and surfaces to apply a rolling ball blend to. */\r\nexport class RoundEdgesTool extends BlendEdgesTool {\r\n public static override toolId = \"RoundEdges\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n // TODO: Tool settings for blend radius...\r\n protected radius = 0.5;\r\n\r\n protected override async applyAgendaOperation(ev: BeButtonEvent, isAccept: boolean): Promise<ElementGeometryResultProps | undefined> {\r\n if (undefined === ev.viewport || this.agenda.isEmpty || !this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const params: BlendEdgesProps = { edges: this.getAcceptedSubEntities(), radii: this.radius, propagateSmooth: this.propagateSmooth };\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(\"blendEdges\", 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 RoundEdgesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Identify edges of solids and surfaces to apply a rolling ball blend to. */\r\nexport class ChamferEdgesTool extends BlendEdgesTool {\r\n public static override toolId = \"ChamferEdges\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n // TODO: Tool settings for chamfer length, distances, distance + angle...\r\n protected mode = ChamferMode.Length;\r\n protected length = 0.5;\r\n\r\n protected override async applyAgendaOperation(ev: BeButtonEvent, isAccept: boolean): Promise<ElementGeometryResultProps | undefined> {\r\n if (undefined === ev.viewport || this.agenda.isEmpty || !this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const params: ChamferEdgesProps = { edges: this.getAcceptedSubEntities(), mode: this.mode, values1: this.length, propagateSmooth: this.propagateSmooth };\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(\"chamferEdges\", 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 ChamferEdgesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n"]}
|
|
1
|
+
{"version":3,"file":"SolidModelingTools.js","sourceRoot":"","sources":["../../src/SolidModelingTools.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 { Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport { BlendEdgesProps, BooleanMode, BooleanOperationProps, ChamferEdgesProps, ChamferMode, CutDepthMode, CutDirectionMode, CutProps, DeleteSubEntityProps, ElementGeometryCacheFilter, ElementGeometryResultOptions, ElementGeometryResultProps, EmbossDirectionMode, EmbossProps, HollowFacesProps, ImprintProps, LoftProps, OffsetFacesProps, ProfileClosure, SewSheetProps, SpinFacesProps, SubEntityFilter, SubEntityLocationProps, SubEntityProps, SubEntityType, SweepFacesProps, SweepPathProps, ThickenSheetProps } from \"@itwin/editor-common\";\r\nimport { ColorDef, ElementGeometry } from \"@itwin/core-common\";\r\nimport { Angle, Geometry, LineString3d, Point3d, Vector3d, XYZProps } from \"@itwin/core-geometry\";\r\nimport { AccuDrawHintBuilder, BeButtonEvent, DecorateContext, DynamicsContext, EventHandled, GraphicType, HitDetail } from \"@itwin/core-frontend\";\r\nimport { computeChordToleranceFromPoint } from \"./CreateElementTool\";\r\nimport { ElementGeometryCacheTool, isSameSubEntity, LocateSubEntityTool, SubEntityData } from \"./ElementGeometryTool\";\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.onGeometryCacheFilterChanged();\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 Perform thicken operation on surface geometry. */\r\nexport class ThickenSheetElementsTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"ThickenSheets\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n // TODO: Tool settings for front and back distances...\r\n protected frontDistance = 0.5;\r\n protected backDistance = 0.0;\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 params: ThickenSheetProps = { front: this.frontDistance, back: this.backDistance };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"thickenSheets\", 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 ThickenSheetElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Perform cut operation on solid using region or path profile. */\r\nexport class CutSolidElementsTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"CutSolids\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n protected targetPoint?: Point3d;\r\n protected toolPoint?: Point3d;\r\n\r\n // TODO: Tool settings for both directions, blind cut depth, and outside...\r\n protected bothDirections = false;\r\n protected distance = 0.0;\r\n protected outside = undefined;\r\n\r\n protected override get requiredElementCount(): number { return 2; }\r\n protected get isProfilePhase(): boolean { return !this.agenda.isEmpty; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n const profilePhase = this.isProfilePhase;\r\n return { minGeom: 1, maxGeom: profilePhase ? 1 : undefined, parts: true, curves: profilePhase, surfaces: profilePhase, solids: !profilePhase, other: false };\r\n }\r\n\r\n protected override async createElementGeometryCache(id: Id64String): Promise<boolean> {\r\n if (!await super.createElementGeometryCache(id))\r\n return false;\r\n\r\n if (!this.isProfilePhase)\r\n return true;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n return await ElementGeometryCacheTool.callCommand(\"isPlanarBody\", id, 0);\r\n } catch (err) {\r\n return false;\r\n }\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n // Filter changes to allow sheets and wires as profiles, invalidate cached accept status...\r\n if (this.agenda.isEmpty || 1 === this.agenda.length)\r\n this.onGeometryCacheFilterChanged();\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 const direction = (this.bothDirections ? CutDirectionMode.Both : CutDirectionMode.Auto);\r\n const depth = (0.0 === this.distance ? CutDepthMode.All : CutDepthMode.Blind);\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const target = this.agenda.elements[0];\r\n const profile = this.agenda.elements[1];\r\n const params: CutProps = { profile, direction, depth, distance: this.distance, outside: this.outside, closeOpen: ProfileClosure.Auto, targetPoint: this.targetPoint, toolPoint: this.toolPoint };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"cutSolid\", 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 protected override async buildLocateAgenda(hit: HitDetail): Promise<boolean> {\r\n if (this.isProfilePhase)\r\n this.toolPoint = hit.hitPoint;\r\n else\r\n this.targetPoint = hit.hitPoint;\r\n\r\n return super.buildLocateAgenda(hit);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new CutSolidElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Perform emboss operation on solid or sheet using sheet profile. */\r\nexport class EmbossSolidElementsTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"EmbossSolids\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n protected targetPoint?: Point3d;\r\n\r\n protected override get requiredElementCount(): number { return 2; }\r\n protected get isProfilePhase(): boolean { return !this.agenda.isEmpty; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n const profilePhase = this.isProfilePhase;\r\n return { minGeom: 1, maxGeom: 1, parts: true, curves: false, surfaces: true, solids: !profilePhase, other: false };\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n // Filter changes to disallow solids as profiles, invalidate cached accept status...\r\n if (this.agenda.isEmpty || 1 === this.agenda.length)\r\n this.onGeometryCacheFilterChanged();\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 profile = this.agenda.elements[1];\r\n const params: EmbossProps = { profile, direction: EmbossDirectionMode.Auto, targetPoint: this.targetPoint };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"embossBody\", 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 protected override async buildLocateAgenda(hit: HitDetail): Promise<boolean> {\r\n if (!this.isProfilePhase)\r\n this.targetPoint = hit.hitPoint;\r\n\r\n return super.buildLocateAgenda(hit);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new EmbossSolidElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Create a solid for sheet by sweeping a profile along a path. */\r\nexport class SweepAlongPathTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"SweepAlongPath\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected override get requiredElementCount(): number { return 2; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { minGeom: 1, maxGeom: 1, parts: true, curves: true, 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 path = this.agenda.elements[1];\r\n const params: SweepPathProps = { path };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"sweepAlongPath\", 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 SweepAlongPathTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Create a new sheet or solid body by lofting through a set of profiles. */\r\nexport class LoftProfilesTool extends ElementGeometryCacheTool {\r\n public static override toolId = \"LoftProfiles\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected override get requiredElementCount(): number { return 2; }\r\n protected override get controlKeyContinuesSelection(): boolean { return true; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { minGeom: 1, maxGeom: 1, parts: true, curves: true, 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 = this.agenda.elements.slice(1);\r\n const params: LoftProps = { tools, orderCurves: this.isSelectionSetModify ? true : undefined, orientCurves: true };\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"loftProfiles\", 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 LoftProfilesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport class FaceLocationData {\r\n public point: Point3d;\r\n public normal: Vector3d;\r\n\r\n constructor(point: Point3d, normal: Vector3d) {\r\n this.point = point;\r\n this.normal = normal;\r\n }\r\n\r\n public static create(pointProps: XYZProps, normalProps: XYZProps) {\r\n const point = Point3d.fromJSON(pointProps);\r\n const normal = Vector3d.fromJSON(normalProps);\r\n return new FaceLocationData(point, normal);\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 // TODO: Tool settings for offset distance...\r\n protected useOffset = false;\r\n protected offset = 0.1;\r\n protected addSmoothFaces = false;\r\n\r\n protected override get wantDynamics(): boolean { return true; }\r\n protected override get wantAccuSnap(): boolean { return this.isDynamicsStarted; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: false, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected override async createSubEntityData(id: Id64String, hit: SubEntityLocationProps): Promise<SubEntityData> {\r\n const data = await super.createSubEntityData(id, hit);\r\n\r\n if (undefined !== hit.point && undefined !== hit.normal)\r\n data.toolData = FaceLocationData.create(hit.point, hit.normal);\r\n\r\n return data;\r\n }\r\n\r\n protected override drawAcceptedSubEntities(context: DecorateContext): void {\r\n super.drawAcceptedSubEntities(context);\r\n\r\n // Show pick point on last identified face, offset direction/distance will be computed from this location...\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return;\r\n\r\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 10);\r\n builder.addPointString([faceData.point]);\r\n\r\n context.addDecorationFromBuilder(builder);\r\n }\r\n\r\n protected async getSmoothFaces(id: Id64String, face: SubEntityProps): Promise<SubEntityProps[] | undefined> {\r\n try {\r\n // NOTE: For offset, include all smoothly connected faces, not just adjacent...\r\n return await ElementGeometryCacheTool.callCommand(\"getConnectedSubEntities\", id, face, SubEntityType.Face, { smoothFaces: true });\r\n } catch (err) {\r\n return undefined;\r\n }\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 || !this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return undefined;\r\n\r\n const projPt = AccuDrawHintBuilder.projectPointToLineInView(ev.point, faceData.point, faceData.normal, ev.viewport);\r\n\r\n if (undefined === projPt)\r\n return undefined;\r\n\r\n const offsetDir = Vector3d.createStartEnd(faceData.point, projPt);\r\n\r\n if (this.useOffset && undefined === offsetDir.scaleToLength(this.offset, offsetDir))\r\n return undefined;\r\n\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(faceData.normal) < 0.0)\r\n offset = -offset;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const id = this.agenda.elements[0];\r\n\r\n const faces = this.getAcceptedSubEntities();\r\n\r\n if (this.addSmoothFaces) {\r\n const allSmoothFaces: SubEntityProps[] = [];\r\n\r\n for (const face of faces) {\r\n const smoothFaces = await this.getSmoothFaces(id, face);\r\n if (undefined !== smoothFaces)\r\n allSmoothFaces.push(...smoothFaces);\r\n }\r\n\r\n for (const smooth of allSmoothFaces) {\r\n if (undefined === faces.find((selected) => isSameSubEntity(selected, smooth)))\r\n faces.unshift(smooth); // Preserve last selected entry as reference face...\r\n }\r\n }\r\n\r\n const params: OffsetFacesProps = { faces, 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}:${id}`,\r\n writeChanges: isAccept ? true : undefined,\r\n };\r\n return await ElementGeometryCacheTool.callCommand(\"offsetFaces\", id, 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 (!this.haveAcceptedSubEntities)\r\n return;\r\n\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return;\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(faceData.point);\r\n hints.setXAxis2(faceData.normal);\r\n hints.sendHints(false);\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 // TODO: Tool settings for shell thickness and face thickness...\r\n protected shellThickness = 0.1;\r\n protected faceThickness = 0.0;\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { 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 || !this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const params: HollowFacesProps = { faces: this.getAcceptedSubEntities(), distances: this.faceThickness, defaultDistance: this.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\r\n/** @alpha Identify faces or edges for removal by growing surrounding faces. */\r\nexport class DeleteSubEntitiesTool extends LocateSubEntityTool {\r\n public static override toolId = \"DeleteSubEntities\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected override wantSubEntityType(type: SubEntityType): boolean {\r\n switch (type) {\r\n case SubEntityType.Face:\r\n case SubEntityType.Edge:\r\n // Choose all faces or all edges...\r\n return (0 === this._acceptedSubEntities.length || this._acceptedSubEntities[0].props.type === type);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n protected override getMaximumSubEntityHits(type: SubEntityType): number {\r\n if (!this.wantSubEntityType(type))\r\n return 0;\r\n\r\n // Only return single closest edge, avoids having to test for redundant edges on reset...\r\n return (SubEntityType.Edge === type ? 1 : 25);\r\n }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: false, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected override async doPickSubEntities(id: Id64String, ev: BeButtonEvent): Promise<SubEntityLocationProps[] | undefined> {\r\n const hits = await super.doPickSubEntities(id, ev);\r\n\r\n if (undefined === hits)\r\n return hits;\r\n\r\n // Don't allow reset to select a back edge...\r\n if (SubEntityType.Face === hits[0].subEntity.type)\r\n return hits.filter((hit) => { return SubEntityType.Face === hit.subEntity.type; });\r\n\r\n try {\r\n const accept = await ElementGeometryCacheTool.callCommand(\"isRedundantEdge\", id, hits[0].subEntity);\r\n\r\n if (accept)\r\n return hits;\r\n\r\n if (hits.length > 1 && SubEntityType.Face === hits[1].subEntity.type)\r\n return hits.slice(1); // Accept face of rejected edge...\r\n\r\n return undefined;\r\n } catch (err) {\r\n return undefined;\r\n }\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 || !this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const params: DeleteSubEntityProps = { subEntities: this.getAcceptedSubEntities() };\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(\"deleteSubEntities\", 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 DeleteSubEntitiesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport enum ImprintSolidMethod {\r\n /** Imprint intersection with another element */\r\n Element = 0,\r\n /** Imprint offset edges onto face */\r\n Edges = 1,\r\n /** Imprint line string defined by points onto face */\r\n Points = 2,\r\n}\r\n\r\n/** @alpha Identify edges or elements to imprint on solid or surface. */\r\nexport class ImprintSolidElementsTool extends LocateSubEntityTool {\r\n public static override toolId = \"ImprintSolids\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n // TODO: Tool settings for method, propagate for edges, offset distance...\r\n protected method = ImprintSolidMethod.Points;\r\n protected points: Point3d[] = [];\r\n protected extend = true;\r\n protected distance = 0.1;\r\n\r\n protected override get requiredElementCount(): number { return ImprintSolidMethod.Element === this.method ? 2 : 1; }\r\n protected override get allowSubEntityControlSelect(): boolean { return ImprintSolidMethod.Edges === this.method; }\r\n protected override get inhibitSubEntityDisplay(): boolean { return ImprintSolidMethod.Points === this.method ? false : super.inhibitSubEntityDisplay; }\r\n\r\n protected override wantSubEntityType(type: SubEntityType): boolean {\r\n switch (type) {\r\n case SubEntityType.Face:\r\n return ImprintSolidMethod.Points === this.method;\r\n case SubEntityType.Edge:\r\n return ImprintSolidMethod.Edges === this.method;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n protected override get wantDynamics(): boolean { return ImprintSolidMethod.Points === this.method; }\r\n protected override get wantAccuSnap(): boolean { return ImprintSolidMethod.Points === this.method && this.isDynamicsStarted; }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: !this.agenda.isEmpty, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n // Filter changes to allow imprinting an open path, invalidate cached accept status...\r\n if (ImprintSolidMethod.Element === this.method && (this.agenda.isEmpty || 1 === this.agenda.length))\r\n this.onGeometryCacheFilterChanged();\r\n }\r\n\r\n protected override async createSubEntityData(id: Id64String, hit: SubEntityLocationProps): Promise<SubEntityData> {\r\n const data = await super.createSubEntityData(id, hit);\r\n\r\n if (undefined !== hit.point && undefined !== hit.normal)\r\n data.toolData = FaceLocationData.create(hit.point, hit.normal);\r\n\r\n return data;\r\n }\r\n\r\n protected override async applyAgendaOperation(_ev: BeButtonEvent, isAccept: boolean): Promise<ElementGeometryResultProps | undefined> {\r\n if (!isAccept || this.agenda.length < this.requiredElementCount)\r\n return undefined;\r\n\r\n const id = this.agenda.elements[0];\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n\r\n let params: ImprintProps;\r\n if (ImprintSolidMethod.Points === this.method) {\r\n if (!this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n const geom = ElementGeometry.fromGeometryQuery(LineString3d.create(this.points));\r\n if (undefined === geom)\r\n return undefined;\r\n\r\n params = { imprint : geom, face: this.getAcceptedSubEntityData(0)?.props, extend: this.extend ? true : undefined };\r\n } else if (ImprintSolidMethod.Edges === this.method) {\r\n if (!this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n // TODO: Include all accepted edges...\r\n const edge = this.getAcceptedSubEntityData(0)?.props;\r\n if (undefined === edge)\r\n return undefined;\r\n\r\n const edgeFaces = await ElementGeometryCacheTool.callCommand(\"getConnectedSubEntities\", id, edge, SubEntityType.Face );\r\n if (undefined === edgeFaces || 0 === edgeFaces.length)\r\n return undefined;\r\n\r\n // TODO: Check planar face...get preferred face from cursor location in dynamics, etc.\r\n const edgeLoop = await ElementGeometryCacheTool.callCommand(\"getConnectedSubEntities\", id, edge, SubEntityType.Edge, { loopFace: edgeFaces[0] } );\r\n if (undefined === edgeLoop || 0 === edgeLoop.length)\r\n return undefined;\r\n\r\n params = { imprint : edgeLoop, face: edgeFaces[0], distance: this.distance, extend: this.extend ? true : undefined };\r\n } else {\r\n params = { imprint : this.agenda.elements[1], extend: this.extend ? true : undefined };\r\n }\r\n\r\n const opts: ElementGeometryResultOptions = { writeChanges: true };\r\n return await ElementGeometryCacheTool.callCommand(\"imprintBody\", id, params, opts);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\r\n if (ImprintSolidMethod.Points !== this.method || 0 === this.points.length)\r\n return;\r\n\r\n const pts = this.points.slice();\r\n pts.push(ev.point.clone());\r\n\r\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 3);\r\n builder.addLineString(pts);\r\n\r\n context.addGraphic(builder.finish());\r\n }\r\n\r\n protected override async gatherInput(ev: BeButtonEvent): Promise<EventHandled | undefined> {\r\n switch (this.method) {\r\n case ImprintSolidMethod.Points: {\r\n if (!this.haveAcceptedSubEntities)\r\n break;\r\n\r\n this.points.push(ev.point.clone());\r\n if (!ev.isControlKey)\r\n break;\r\n\r\n return EventHandled.No;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return super.gatherInput(ev);\r\n }\r\n\r\n protected override get wantAdditionalInput(): boolean {\r\n switch (this.method) {\r\n case ImprintSolidMethod.Element:\r\n return false;\r\n\r\n case ImprintSolidMethod.Edges:\r\n return super.wantAdditionalInput;\r\n\r\n case ImprintSolidMethod.Points:\r\n return super.wantAdditionalInput || this.points.length < 2;\r\n }\r\n }\r\n\r\n protected override setupAccuDraw(): void {\r\n if (ImprintSolidMethod.Points !== this.method || 0 !== this.points.length)\r\n return;\r\n\r\n if (!this.haveAcceptedSubEntities)\r\n return;\r\n\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setModeRectangular();\r\n hints.setOrigin(faceData.point);\r\n hints.setNormal(faceData.normal);\r\n hints.sendHints(false);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new ImprintSolidElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Identify edges of solids and surfaces to apply blend to. */\r\nexport abstract class BlendEdgesTool extends LocateSubEntityTool {\r\n // TODO: Tool settings for tangent edge propagation...\r\n protected propagateSmooth = true;\r\n\r\n protected override wantSubEntityType(type: SubEntityType): boolean { return SubEntityType.Edge === type; }\r\n\r\n protected override getSubEntityFilter(): SubEntityFilter | undefined {\r\n return { laminarEdges: true, smoothEdges: true };\r\n }\r\n\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: false, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected async getTangentEdges(id: Id64String, edge: SubEntityProps): Promise<SubEntityProps[] | undefined> {\r\n try {\r\n return await ElementGeometryCacheTool.callCommand(\"getConnectedSubEntities\", id, edge, SubEntityType.Edge, { smoothEdges: true });\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n protected async addTangentEdges(id: Id64String, edge?: SubEntityProps, chordTolerance?: number): Promise<void> {\r\n if (undefined === edge) {\r\n this._acceptedSubEntities.forEach(async (accepted) => {\r\n if (undefined === accepted.toolData)\r\n await this.addTangentEdges(id, accepted.props, accepted.chordTolerance);\r\n });\r\n return;\r\n }\r\n\r\n const tangentEdges = await this.getTangentEdges(id, edge);\r\n if (undefined === tangentEdges)\r\n return;\r\n\r\n tangentEdges.forEach(async (entry) => {\r\n if (!isSameSubEntity(entry, edge)) {\r\n const data = new SubEntityData(entry);\r\n data.toolData = edge; // Mark edge so we know it was added as tangent edge...\r\n await this.createSubEntityGraphic(id, data, chordTolerance);\r\n this._acceptedSubEntities.push(data);\r\n }\r\n });\r\n }\r\n\r\n protected async removeTangentEdges(_id: Id64String, edge?: SubEntityProps): Promise<void> {\r\n if (undefined === edge) {\r\n this._acceptedSubEntities = this._acceptedSubEntities.filter((entry) => undefined === entry.toolData );\r\n return;\r\n }\r\n\r\n const edgeData = this._acceptedSubEntities.find((entry) => isSameSubEntity(entry.props, edge));\r\n if (undefined === edgeData)\r\n return undefined;\r\n\r\n const isTangentEdge = (other: SubEntityData): boolean => {\r\n const primaryOther = (undefined !== other.toolData ? other.toolData : other.props);\r\n return isSameSubEntity(primaryEdge, primaryOther);\r\n };\r\n\r\n const primaryEdge = (undefined !== edgeData.toolData ? edgeData.toolData : edgeData.props);\r\n this._acceptedSubEntities = this._acceptedSubEntities.filter((entry) => !isTangentEdge(entry));\r\n }\r\n\r\n protected override async addSubEntity(id: Id64String, props: SubEntityLocationProps): Promise<void> {\r\n await super.addSubEntity(id, props);\r\n\r\n if (!this.propagateSmooth)\r\n return;\r\n\r\n const chordTolerance = (this.targetView ? computeChordToleranceFromPoint(this.targetView, Point3d.fromJSON(props.point)) : undefined);\r\n\r\n return this.addTangentEdges(id, props.subEntity, chordTolerance);\r\n }\r\n\r\n protected override async removeSubEntity(id: Id64String, props?: SubEntityLocationProps): Promise<void> {\r\n if (!this.propagateSmooth)\r\n return super.removeSubEntity(id, props);\r\n\r\n const edge = (undefined !== props) ? props.subEntity : this.getAcceptedSubEntityData()?.props;\r\n if (undefined === edge)\r\n return;\r\n\r\n return this.removeTangentEdges(id, edge);\r\n }\r\n\r\n protected override getAcceptedSubEntities(): SubEntityProps[] {\r\n const edges: SubEntityProps[] = [];\r\n this._acceptedSubEntities.forEach((entry) => { if (undefined === entry.toolData) edges.push(entry.props); });\r\n return edges;\r\n }\r\n}\r\n\r\n/** @alpha Identify edges of solids and surfaces to apply a rolling ball blend to. */\r\nexport class RoundEdgesTool extends BlendEdgesTool {\r\n public static override toolId = \"RoundEdges\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n // TODO: Tool settings for blend radius...\r\n protected radius = 0.5;\r\n\r\n protected override async applyAgendaOperation(ev: BeButtonEvent, isAccept: boolean): Promise<ElementGeometryResultProps | undefined> {\r\n if (undefined === ev.viewport || this.agenda.isEmpty || !this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const params: BlendEdgesProps = { edges: this.getAcceptedSubEntities(), radii: this.radius, propagateSmooth: this.propagateSmooth };\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(\"blendEdges\", 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 RoundEdgesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Identify edges of solids and surfaces to apply a rolling ball blend to. */\r\nexport class ChamferEdgesTool extends BlendEdgesTool {\r\n public static override toolId = \"ChamferEdges\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n // TODO: Tool settings for chamfer length, distances, distance + angle...\r\n protected mode = ChamferMode.Length;\r\n protected length = 0.5;\r\n\r\n protected override async applyAgendaOperation(ev: BeButtonEvent, isAccept: boolean): Promise<ElementGeometryResultProps | undefined> {\r\n if (undefined === ev.viewport || this.agenda.isEmpty || !this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const params: ChamferEdgesProps = { edges: this.getAcceptedSubEntities(), mode: this.mode, values1: this.length, propagateSmooth: this.propagateSmooth };\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(\"chamferEdges\", 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 ChamferEdgesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Identify faces of solids and surfaces to translate. */\r\nexport class SweepFacesTool extends LocateSubEntityTool {\r\n public static override toolId = \"SweepFaces\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n // TODO: Tool settings for sweep distance...\r\n protected useDistance = false;\r\n protected distance = 0.1;\r\n protected addSmoothFaces = false;\r\n\r\n protected override get wantDynamics(): boolean { return true; }\r\n protected override get wantAccuSnap(): boolean { return this.isDynamicsStarted; }\r\n\r\n // TODO: Sweep open path to surface, sweep surface to solid...\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: false, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected override async createSubEntityData(id: Id64String, hit: SubEntityLocationProps): Promise<SubEntityData> {\r\n const data = await super.createSubEntityData(id, hit);\r\n\r\n if (undefined !== hit.point && undefined !== hit.normal)\r\n data.toolData = FaceLocationData.create(hit.point, hit.normal);\r\n\r\n return data;\r\n }\r\n\r\n protected override drawAcceptedSubEntities(context: DecorateContext): void {\r\n super.drawAcceptedSubEntities(context);\r\n\r\n // Show pick point on last identified face, offset direction/distance will be computed from this location...\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return;\r\n\r\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 10);\r\n builder.addPointString([faceData.point]);\r\n\r\n context.addDecorationFromBuilder(builder);\r\n }\r\n\r\n protected async getSmoothFaces(id: Id64String, face: SubEntityProps): Promise<SubEntityProps[] | undefined> {\r\n try {\r\n // NOTE: For sweep/translation, it makes sense to limit smooth to immediately adjacent...\r\n return await ElementGeometryCacheTool.callCommand(\"getConnectedSubEntities\", id, face, SubEntityType.Face, { smoothFaces: true, adjacentFaces: true });\r\n } catch (err) {\r\n return undefined;\r\n }\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 || !this.haveAcceptedSubEntities)\r\n return undefined;\r\n\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return undefined;\r\n\r\n const path = Vector3d.createStartEnd(faceData.point, ev.point);\r\n\r\n if (this.useDistance && undefined === path.scaleToLength(this.distance, path))\r\n return undefined;\r\n\r\n if (path.magnitude() < Geometry.smallMetricDistance)\r\n return undefined;\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const id = this.agenda.elements[0];\r\n\r\n const opts: ElementGeometryResultOptions = {\r\n wantGraphic: isAccept ? undefined : true,\r\n chordTolerance: computeChordToleranceFromPoint(ev.viewport, ev.point),\r\n requestId: `${this.toolId}:${id}`,\r\n writeChanges: isAccept ? true : undefined,\r\n };\r\n\r\n const faces = this.getAcceptedSubEntities();\r\n\r\n if (this.addSmoothFaces) {\r\n const allSmoothFaces: SubEntityProps[] = [];\r\n\r\n for (const face of faces) {\r\n const smoothFaces = await this.getSmoothFaces(id, face);\r\n if (undefined !== smoothFaces)\r\n allSmoothFaces.push(...smoothFaces);\r\n }\r\n\r\n for (const smooth of allSmoothFaces) {\r\n if (undefined === faces.find((selected) => isSameSubEntity(selected, smooth)))\r\n faces.unshift(smooth); // Preserve last selected entry as reference face...\r\n }\r\n }\r\n\r\n const params: SweepFacesProps = { faces, path };\r\n return await ElementGeometryCacheTool.callCommand(\"sweepFaces\", id, 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 (!this.haveAcceptedSubEntities)\r\n return;\r\n\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return;\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(faceData.point);\r\n hints.setXAxis2(faceData.normal);\r\n hints.sendHints(false);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new SweepFacesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** @alpha Identify faces of solids and surfaces to revolve. */\r\nexport class SpinFacesTool extends LocateSubEntityTool {\r\n public static override toolId = \"SpinFaces\";\r\n public static override iconSpec = \"icon-move\"; // TODO: Need better icon...\r\n\r\n protected points: Point3d[] = [];\r\n\r\n // TODO: Tool settings for sweep angle...\r\n protected sweep = Angle.piOver2Radians;\r\n\r\n protected override get wantDynamics(): boolean { return true; }\r\n protected override get wantAccuSnap(): boolean { return this.isDynamicsStarted || (this.haveAcceptedSubEntities && !this.isControlDown); }\r\n\r\n // TODO: Spin open path to surface, spin surface to solid...\r\n protected override get geometryCacheFilter(): ElementGeometryCacheFilter | undefined {\r\n return { parts: true, curves: false, surfaces: true, solids: true, other: false };\r\n }\r\n\r\n protected override getSubEntityFilter(): SubEntityFilter | undefined {\r\n return { nonPlanarFaces: true };\r\n }\r\n\r\n protected override async createSubEntityData(id: Id64String, hit: SubEntityLocationProps): Promise<SubEntityData> {\r\n const data = await super.createSubEntityData(id, hit);\r\n\r\n if (undefined !== hit.point && undefined !== hit.normal)\r\n data.toolData = FaceLocationData.create(hit.point, hit.normal);\r\n\r\n return data;\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 || !this.haveAcceptedSubEntities || this.points.length < (isAccept ? 2 : 1))\r\n return undefined;\r\n\r\n const direction = Vector3d.createStartEnd(this.points[0], isAccept ? this.points[1] : ev.point);\r\n if (direction.magnitude() < Geometry.smallMetricDistance)\r\n return undefined;\r\n\r\n const origin = this.points[0];\r\n const angle = Angle.createRadians(this.sweep);\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n const id = this.agenda.elements[0];\r\n\r\n const opts: ElementGeometryResultOptions = {\r\n wantGraphic: isAccept ? undefined : true,\r\n chordTolerance: computeChordToleranceFromPoint(ev.viewport, ev.point),\r\n requestId: `${this.toolId}:${id}`,\r\n writeChanges: isAccept ? true : undefined,\r\n };\r\n\r\n const faces = this.getAcceptedSubEntities();\r\n const params: SpinFacesProps = { faces, origin, direction, angle };\r\n\r\n let result = await ElementGeometryCacheTool.callCommand(\"spinFaces\", id, params, opts);\r\n\r\n // Spun face can be used to create a pocket...retry with negative sweep...\r\n if (undefined === result) {\r\n angle.setRadians(-angle.radians);\r\n result = await ElementGeometryCacheTool.callCommand(\"spinFaces\", id, params, opts);\r\n }\r\n\r\n return result;\r\n } catch (err) {\r\n return undefined;\r\n }\r\n }\r\n\r\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\r\n if (0 === this.points.length)\r\n return;\r\n\r\n const pts = this.points.slice();\r\n pts.push(ev.point.clone());\r\n\r\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 3);\r\n builder.addLineString(pts);\r\n\r\n context.addGraphic(builder.finish());\r\n\r\n super.onDynamicFrame(ev, context);\r\n }\r\n\r\n protected override async gatherInput(ev: BeButtonEvent): Promise<EventHandled | undefined> {\r\n if (this.haveAcceptedSubEntities)\r\n this.points.push(ev.point.clone());\r\n\r\n return super.gatherInput(ev);\r\n }\r\n\r\n protected override get wantAdditionalInput(): boolean {\r\n return super.wantAdditionalInput || this.points.length < 2;\r\n }\r\n\r\n protected override setupAccuDraw(): void {\r\n if (!this.haveAcceptedSubEntities || 0 !== this.points.length)\r\n return;\r\n\r\n const faceData = this.getAcceptedSubEntityData()?.toolData as FaceLocationData;\r\n if (undefined === faceData)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setModeRectangular();\r\n hints.setOrigin(faceData.point);\r\n hints.setNormal(faceData.normal);\r\n hints.sendHints(false);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new SpinFacesTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n"]}
|
|
@@ -146,6 +146,14 @@
|
|
|
146
146
|
"keyin": "editor hollow faces",
|
|
147
147
|
"flyover": "Hollow solids by offsetting faces"
|
|
148
148
|
},
|
|
149
|
+
"SweepFaces": {
|
|
150
|
+
"keyin": "editor sweep faces",
|
|
151
|
+
"flyover": "Sweep planar curves, surfaces, or faces of solids"
|
|
152
|
+
},
|
|
153
|
+
"SpinFaces": {
|
|
154
|
+
"keyin": "editor spin faces",
|
|
155
|
+
"flyover": "Spin planar curves, surfaces, or faces of solids"
|
|
156
|
+
},
|
|
149
157
|
"RoundEdges": {
|
|
150
158
|
"keyin": "editor round edges",
|
|
151
159
|
"flyover": "Round edges of solids and surfaces"
|
|
@@ -154,6 +162,10 @@
|
|
|
154
162
|
"keyin": "editor chamfer edges",
|
|
155
163
|
"flyover": "Chamfer edges of solids and surfaces"
|
|
156
164
|
},
|
|
165
|
+
"DeleteSubEntities": {
|
|
166
|
+
"keyin": "editor delete subentities",
|
|
167
|
+
"flyover": "Delete faces and edges of solids and surfaces"
|
|
168
|
+
},
|
|
157
169
|
"UndoAll": {
|
|
158
170
|
"keyin": "editor undo all",
|
|
159
171
|
"flyover": "Undo All"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/editor-frontend",
|
|
3
|
-
"version": "3.0.0-dev.
|
|
3
|
+
"version": "3.0.0-dev.131",
|
|
4
4
|
"description": "iModel.js frontend components",
|
|
5
5
|
"main": "lib/cjs/editor-frontend.js",
|
|
6
6
|
"module": "lib/esm/editor-frontend.js",
|
|
@@ -23,31 +23,22 @@
|
|
|
23
23
|
"url": "http://www.bentley.com"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
|
-
"@itwin/core-bentley": "^3.0.0-dev.
|
|
27
|
-
"@itwin/core-common": "^3.0.0-dev.
|
|
26
|
+
"@itwin/core-bentley": "^3.0.0-dev.131",
|
|
27
|
+
"@itwin/core-common": "^3.0.0-dev.131"
|
|
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/
|
|
35
|
-
"@itwin/
|
|
36
|
-
"@itwin/
|
|
37
|
-
"@itwin/
|
|
38
|
-
"@itwin/
|
|
39
|
-
"@types/chai": "^4.1.4",
|
|
40
|
-
"@types/mocha": "^8.2.2",
|
|
41
|
-
"@types/node": "14.14.31",
|
|
42
|
-
"@types/semver": "^5.5.0",
|
|
43
|
-
"chai": "^4.1.2",
|
|
34
|
+
"@itwin/build-tools": "3.0.0-dev.131",
|
|
35
|
+
"@itwin/certa": "3.0.0-dev.131",
|
|
36
|
+
"@itwin/core-bentley": "3.0.0-dev.131",
|
|
37
|
+
"@itwin/core-common": "3.0.0-dev.131",
|
|
38
|
+
"@itwin/eslint-plugin": "3.0.0-dev.131",
|
|
44
39
|
"cpx2": "^3.0.0",
|
|
45
|
-
"electron": "^14.0.0",
|
|
46
40
|
"eslint": "^7.11.0",
|
|
47
|
-
"glob": "^7.1.2",
|
|
48
|
-
"mocha": "^8.3.2",
|
|
49
41
|
"rimraf": "^3.0.2",
|
|
50
|
-
"source-map-loader": "^1.0.0",
|
|
51
42
|
"typescript": "~4.4.0"
|
|
52
43
|
},
|
|
53
44
|
"//dependencies": [
|
|
@@ -55,10 +46,10 @@
|
|
|
55
46
|
"NOTE: editor-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"
|
|
56
47
|
],
|
|
57
48
|
"dependencies": {
|
|
58
|
-
"@itwin/core-
|
|
59
|
-
"@itwin/
|
|
60
|
-
"@itwin/
|
|
61
|
-
"@itwin/appui-abstract": "3.0.0-dev.
|
|
49
|
+
"@itwin/core-frontend": "3.0.0-dev.131",
|
|
50
|
+
"@itwin/core-geometry": "3.0.0-dev.131",
|
|
51
|
+
"@itwin/editor-common": "3.0.0-dev.131",
|
|
52
|
+
"@itwin/appui-abstract": "3.0.0-dev.131"
|
|
62
53
|
},
|
|
63
54
|
"eslintConfig": {
|
|
64
55
|
"plugins": [
|