@itwin/editor-frontend 4.0.0-dev.1 → 4.0.0-dev.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -1
- package/lib/cjs/CreateElementTool.d.ts +100 -100
- package/lib/cjs/CreateElementTool.js +325 -327
- package/lib/cjs/CreateElementTool.js.map +1 -1
- package/lib/cjs/DeleteElementsTool.d.ts +13 -13
- package/lib/cjs/DeleteElementsTool.js +38 -38
- package/lib/cjs/DeleteElementsTool.js.map +1 -1
- package/lib/cjs/EditTool.d.ts +38 -38
- package/lib/cjs/EditTool.js +80 -81
- package/lib/cjs/EditTool.js.map +1 -1
- package/lib/cjs/EditToolIpc.d.ts +18 -18
- package/lib/cjs/EditToolIpc.js +28 -28
- package/lib/cjs/ElementGeometryTool.d.ts +147 -147
- package/lib/cjs/ElementGeometryTool.js +704 -709
- package/lib/cjs/ElementGeometryTool.js.map +1 -1
- package/lib/cjs/ModifyCurveTools.d.ts +139 -139
- package/lib/cjs/ModifyCurveTools.js +776 -784
- package/lib/cjs/ModifyCurveTools.js.map +1 -1
- package/lib/cjs/ModifyElementTool.d.ts +47 -47
- package/lib/cjs/ModifyElementTool.js +177 -177
- package/lib/cjs/ModifyElementTool.js.map +1 -1
- package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.d.ts +135 -135
- package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.js +822 -822
- package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
- package/lib/cjs/ProjectLocation/ProjectGeolocation.d.ts +135 -135
- package/lib/cjs/ProjectLocation/ProjectGeolocation.js +532 -532
- package/lib/cjs/ProjectLocation/ProjectGeolocation.js.map +1 -1
- package/lib/cjs/SketchTools.d.ts +304 -304
- package/lib/cjs/SketchTools.js +1704 -1705
- package/lib/cjs/SketchTools.js.map +1 -1
- package/lib/cjs/SolidModelingTools.d.ts +380 -380
- package/lib/cjs/SolidModelingTools.js +1452 -1462
- package/lib/cjs/SolidModelingTools.js.map +1 -1
- package/lib/cjs/SolidPrimitiveTools.d.ts +318 -318
- package/lib/cjs/SolidPrimitiveTools.js +1372 -1378
- package/lib/cjs/SolidPrimitiveTools.js.map +1 -1
- package/lib/cjs/TransformElementsTool.d.ts +164 -164
- package/lib/cjs/TransformElementsTool.js +652 -652
- package/lib/cjs/TransformElementsTool.js.map +1 -1
- package/lib/cjs/UndoRedoTool.d.ts +16 -16
- package/lib/cjs/UndoRedoTool.js +41 -42
- package/lib/cjs/UndoRedoTool.js.map +1 -1
- package/lib/cjs/editor-frontend.d.ts +17 -17
- package/lib/cjs/editor-frontend.js +37 -33
- package/lib/cjs/editor-frontend.js.map +1 -1
- package/lib/esm/CreateElementTool.d.ts +100 -100
- package/lib/esm/CreateElementTool.js +317 -319
- package/lib/esm/CreateElementTool.js.map +1 -1
- package/lib/esm/DeleteElementsTool.d.ts +13 -13
- package/lib/esm/DeleteElementsTool.js +35 -34
- package/lib/esm/DeleteElementsTool.js.map +1 -1
- package/lib/esm/EditTool.d.ts +38 -38
- package/lib/esm/EditTool.js +77 -77
- package/lib/esm/EditTool.js.map +1 -1
- package/lib/esm/EditToolIpc.d.ts +18 -18
- package/lib/esm/EditToolIpc.js +24 -24
- package/lib/esm/ElementGeometryTool.d.ts +147 -147
- package/lib/esm/ElementGeometryTool.js +696 -701
- package/lib/esm/ElementGeometryTool.js.map +1 -1
- package/lib/esm/ModifyCurveTools.d.ts +139 -139
- package/lib/esm/ModifyCurveTools.js +771 -775
- package/lib/esm/ModifyCurveTools.js.map +1 -1
- package/lib/esm/ModifyElementTool.d.ts +47 -47
- package/lib/esm/ModifyElementTool.js +172 -172
- package/lib/esm/ModifyElementTool.js.map +1 -1
- package/lib/esm/ProjectLocation/ProjectExtentsDecoration.d.ts +135 -135
- package/lib/esm/ProjectLocation/ProjectExtentsDecoration.js +818 -814
- package/lib/esm/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
- package/lib/esm/ProjectLocation/ProjectGeolocation.d.ts +135 -135
- package/lib/esm/ProjectLocation/ProjectGeolocation.js +529 -526
- package/lib/esm/ProjectLocation/ProjectGeolocation.js.map +1 -1
- package/lib/esm/SketchTools.d.ts +304 -304
- package/lib/esm/SketchTools.js +1700 -1695
- package/lib/esm/SketchTools.js.map +1 -1
- package/lib/esm/SolidModelingTools.d.ts +380 -380
- package/lib/esm/SolidModelingTools.js +1444 -1437
- package/lib/esm/SolidModelingTools.js.map +1 -1
- package/lib/esm/SolidPrimitiveTools.d.ts +318 -318
- package/lib/esm/SolidPrimitiveTools.js +1368 -1367
- package/lib/esm/SolidPrimitiveTools.js.map +1 -1
- package/lib/esm/TransformElementsTool.d.ts +164 -164
- package/lib/esm/TransformElementsTool.js +647 -644
- package/lib/esm/TransformElementsTool.js.map +1 -1
- package/lib/esm/UndoRedoTool.d.ts +16 -16
- package/lib/esm/UndoRedoTool.js +38 -36
- package/lib/esm/UndoRedoTool.js.map +1 -1
- package/lib/esm/editor-frontend.d.ts +17 -17
- package/lib/esm/editor-frontend.js +21 -21
- package/package.json +21 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformElementsTool.js","sourceRoot":"","sources":["../../src/TransformElementsTool.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\r\nimport {\r\n DialogItem, DialogProperty, DialogPropertySyncItem, EnumerationChoice, PropertyDescriptionHelper, PropertyEditorParamTypes, RangeEditorParams,\r\n} from \"@itwin/appui-abstract\";\r\nimport { BentleyError, Id64, Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n Code, ColorDef, GeometricElementProps, IModelStatus, isPlacement2dProps, LinePixels, PersistentGraphicsRequestProps, Placement, Placement2d,\r\n Placement3d,\r\n} from \"@itwin/core-common\";\r\nimport {\r\n AccuDrawHintBuilder, AngleDescription, BeButtonEvent, CoreTools, DynamicsContext, ElementSetTool, GraphicBranch, GraphicType, IModelApp,\r\n IModelConnection, IpcApp, ModifyElementSource, NotifyMessageDetails, OutputMessagePriority, readElementGraphics, RenderGraphic, RenderGraphicOwner,\r\n ToolAssistanceInstruction,\r\n} from \"@itwin/core-frontend\";\r\nimport { Angle, Geometry, Matrix3d, Point3d, Transform, Vector3d, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\r\nimport { EditTools } from \"./EditTool\";\r\nimport { basicManipulationIpc } from \"./EditToolIpc\";\r\n\r\n/** @alpha */\r\nexport interface TransformGraphicsData {\r\n id: Id64String;\r\n placement: Placement;\r\n graphic: RenderGraphicOwner;\r\n}\r\n\r\n/** @alpha */\r\nexport class TransformGraphicsProvider {\r\n public readonly iModel: IModelConnection;\r\n public readonly data: TransformGraphicsData[];\r\n public readonly pending: Map<Id64String, string>;\r\n public readonly prefix: string;\r\n /** Chord tolerance to use to stroke the element's geometry in meters. */\r\n public chordTolerance = 0.01;\r\n\r\n constructor(iModel: IModelConnection, prefix: string) {\r\n this.iModel = iModel;\r\n this.prefix = prefix;\r\n this.data = new Array<TransformGraphicsData>();\r\n this.pending = new Map<Id64String, string>();\r\n }\r\n\r\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\r\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\r\n\r\n private async createRequest(id: Id64String): Promise<TransformGraphicsData | undefined> {\r\n const elementProps = (await this.iModel.elements.getProps(id)) as GeometricElementProps[];\r\n if (0 === elementProps.length)\r\n return;\r\n\r\n const placementProps = elementProps[0].placement;\r\n if (undefined === placementProps)\r\n return;\r\n\r\n const placement = isPlacement2dProps(placementProps) ? Placement2d.fromJSON(placementProps) : Placement3d.fromJSON(placementProps);\r\n if (!placement.isValid)\r\n return; // Ignore assembly parents w/o geometry, etc...\r\n\r\n const requestProps: PersistentGraphicsRequestProps = {\r\n id: this.getRequestId(id),\r\n elementId: id,\r\n toleranceLog10: this.getToleranceLog10(),\r\n };\r\n\r\n this.pending.set(id, requestProps.id); // keep track of requests so they can be cancelled...\r\n\r\n const graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\r\n if (undefined === graphicData)\r\n return;\r\n\r\n const graphic = await readElementGraphics(graphicData, this.iModel, elementProps[0].model, placement.is3d, { noFlash: true, noHilite: true });\r\n if (undefined === graphic)\r\n return;\r\n\r\n return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic) };\r\n }\r\n\r\n private disposeOfGraphics(): void {\r\n this.data.forEach((data) => {\r\n data.graphic.disposeGraphic();\r\n });\r\n\r\n this.data.length = 0;\r\n }\r\n\r\n private async cancelPendingRequests(): Promise<void> {\r\n const requests = new Array<string>();\r\n for (const [_key, id] of this.pending)\r\n requests.push(id);\r\n\r\n this.pending.clear();\r\n if (0 === requests.length)\r\n return;\r\n\r\n return IpcApp.appFunctionIpc.cancelElementGraphicsRequests(this.iModel.key, requests);\r\n }\r\n\r\n /** Call to request a RenderGraphic for the supplied element id.\r\n * @see [[cleanupGraphics]] Must be called when the tool exits.\r\n */\r\n public async createSingleGraphic(id: Id64String): Promise<boolean> {\r\n try {\r\n const info = await this.createRequest(id);\r\n\r\n if (undefined !== info?.id)\r\n this.pending.delete(info.id);\r\n\r\n if (undefined === info?.graphic)\r\n return false;\r\n\r\n this.data.push(info);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /** Call to request RenderGraphics for the supplied element ids. Does not wait for results as\r\n * generating graphics for a large number of elements can take time. Instead an array of [[RenderGraphicOwner]]\r\n * is populated as requests are resolved and the current dynamics frame displays what is available.\r\n * @see [[cleanupGraphics]] Must be called when the tool exits.\r\n */\r\n public createGraphics(elements: Id64Arg): void {\r\n if (0 === Id64.sizeOf(elements))\r\n return;\r\n\r\n try {\r\n for (const id of Id64.iterable(elements)) {\r\n const promise = this.createRequest(id);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n promise.then((info) => {\r\n if (undefined !== info?.id)\r\n this.pending.delete(info.id);\r\n\r\n if (undefined !== info?.graphic)\r\n this.data.push(info);\r\n });\r\n }\r\n } catch { }\r\n }\r\n\r\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]] and cancel requests that are still pending.\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 async cleanupGraphics(): Promise<void> {\r\n await this.cancelPendingRequests();\r\n this.disposeOfGraphics();\r\n }\r\n\r\n public addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\r\n const branch = new GraphicBranch(false);\r\n branch.add(graphic);\r\n\r\n const branchGraphic = context.createBranch(branch, transform);\r\n context.addGraphic(branchGraphic);\r\n }\r\n\r\n public addGraphics(transform: Transform, context: DynamicsContext): void {\r\n if (0 === this.data.length)\r\n return;\r\n\r\n const branch = new GraphicBranch(false);\r\n for (const data of this.data)\r\n branch.add(data.graphic);\r\n\r\n const branchGraphic = context.createBranch(branch, transform);\r\n context.addGraphic(branchGraphic);\r\n }\r\n}\r\n\r\n/** @alpha Base class for applying a transform to element placements. */\r\nexport abstract class TransformElementsTool extends ElementSetTool {\r\n protected override get allowSelectionSet(): boolean { return true; }\r\n protected override get allowGroups(): 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 wantAccuSnap(): boolean { return true; }\r\n protected override get wantDynamics(): boolean { return true; }\r\n protected get wantMakeCopy(): boolean { return false; }\r\n protected get wantRepeatOperation(): boolean { return this.wantMakeCopy && !this.agenda.isEmpty; }\r\n protected _graphicsProvider?: TransformGraphicsProvider;\r\n protected _startedCmd?: string;\r\n\r\n protected abstract calculateTransform(ev: BeButtonEvent): Transform | undefined;\r\n\r\n protected async createAgendaGraphics(changed: boolean): Promise<void> {\r\n if (changed) {\r\n if (undefined === this._graphicsProvider)\r\n return; // Not yet needed...\r\n } else {\r\n if (undefined !== this._graphicsProvider)\r\n return; // Use existing graphics...\r\n }\r\n\r\n if (undefined === this._graphicsProvider)\r\n this._graphicsProvider = new TransformGraphicsProvider(this.iModel, this.toolId);\r\n else\r\n await this._graphicsProvider.cleanupGraphics();\r\n\r\n if (1 === this.agenda.length) {\r\n await this._graphicsProvider.createSingleGraphic(this.agenda.elements[0]);\r\n return;\r\n }\r\n\r\n this._graphicsProvider.createGraphics(this.agenda.elements);\r\n }\r\n\r\n protected async clearAgendaGraphics(): Promise<void> {\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n await this._graphicsProvider.cleanupGraphics();\r\n this._graphicsProvider = undefined;\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n await this.createAgendaGraphics(true);\r\n }\r\n\r\n protected override async initAgendaDynamics(): Promise<boolean> {\r\n await this.createAgendaGraphics(false);\r\n return super.initAgendaDynamics();\r\n }\r\n\r\n protected transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\r\n if (undefined !== this._graphicsProvider)\r\n this._graphicsProvider.addGraphics(transform, context);\r\n }\r\n\r\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\r\n const transform = this.calculateTransform(ev);\r\n if (undefined === transform)\r\n return;\r\n this.transformAgendaDynamics(transform, context);\r\n }\r\n\r\n protected updateAnchorLocation(transform: Transform): void {\r\n // Update anchor point to support creating additional copies (repeat vs. restart)...\r\n if (undefined === this.anchorPoint)\r\n return;\r\n\r\n transform.multiplyPoint3d(this.anchorPoint, this.anchorPoint);\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setOrigin(this.anchorPoint);\r\n hints.sendHints();\r\n }\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>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\r\n }\r\n\r\n protected async replaceAgenda(newIds: Id64Arg | undefined): Promise<void> {\r\n this.agenda.clear();\r\n\r\n if (undefined !== newIds)\r\n this.agenda.add(newIds);\r\n\r\n if (this.isSelectionSetModify) {\r\n if (this.agenda.isEmpty)\r\n this.iModel.selectionSet.emptyAll();\r\n else\r\n this.iModel.selectionSet.replace(this.agenda.elements);\r\n\r\n this.agenda.setSource(ModifyElementSource.SelectionSet);\r\n this.setPreferredElementSource(); // Update \"use selection set\" flag...\r\n }\r\n\r\n return this.onAgendaModified();\r\n }\r\n\r\n protected async transformAndCopyAgenda(_transform: Transform): Promise<Id64Arg | undefined> {\r\n return undefined;\r\n }\r\n\r\n protected async transformAgenda(transform: Transform): Promise<void> {\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n if (IModelStatus.Success === await basicManipulationIpc.transformPlacement(this.agenda.compressIds(), transform.toJSON()))\r\n await this.saveChanges();\r\n } catch (err) {\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\r\n }\r\n }\r\n\r\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\r\n const transform = this.calculateTransform(ev);\r\n if (undefined === transform)\r\n return;\r\n\r\n if (this.wantMakeCopy)\r\n await this.replaceAgenda(await this.transformAndCopyAgenda(transform));\r\n else\r\n await this.transformAgenda(transform);\r\n\r\n this.updateAnchorLocation(transform);\r\n }\r\n\r\n public override async onProcessComplete(): Promise<void> {\r\n if (this.wantRepeatOperation)\r\n return; // Continue with current agenda instead of restarting (ex. create additional copies)\r\n return super.onProcessComplete();\r\n }\r\n\r\n public override async onCleanup() {\r\n await this.clearAgendaGraphics();\r\n return super.onCleanup();\r\n }\r\n}\r\n\r\n/** @alpha Move elements by applying translation to placement. */\r\nexport class MoveElementsTool extends TransformElementsTool {\r\n public static override toolId = \"MoveElements\";\r\n public static override iconSpec = \"icon-move\";\r\n\r\n protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\r\n if (undefined === this.anchorPoint)\r\n return undefined;\r\n return Transform.createTranslation(ev.point.minus(this.anchorPoint));\r\n }\r\n\r\n protected override provideToolAssistance(_mainInstrText?: string, _additionalInstr?: ToolAssistanceInstruction[]): void {\r\n let mainMsg;\r\n if (!this.isSelectByPoints && !this.wantAdditionalElements)\r\n mainMsg = CoreTools.translate(this.wantAdditionalInput ? \"ElementSet.Prompts.StartPoint\" : \"ElementSet.Prompts.EndPoint\");\r\n super.provideToolAssistance(mainMsg);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new MoveElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** Create new elements with translation applied to placement.\r\n * This is a brute force implementation strictly for example and testing purposes.\r\n * The new elements are Generic:PhysicalObject or BisCore:DrawingGraphic using the model and category of original.\r\n * Does not preserve assemblies and geometric elements without geometry are not copied.\r\n * Using loadProps to return json format geometry to the frontend for each element in the tool agenda is very inefficient.\r\n * Applications that wish to support copy are expected to sub-class TransformElementsTool and register their\r\n * own EditCommand that can correctly copy their application elements.\r\n * @alpha\r\n */\r\nexport class CopyElementsTool extends MoveElementsTool {\r\n public static override toolId = \"CopyElements\";\r\n public static override iconSpec = \"icon-move\"; // Need better icon...\r\n\r\n public static override get minArgs() { return 0; }\r\n public static override get maxArgs() { return 1; }\r\n\r\n private _numCopiesProperty: DialogProperty<number> | undefined;\r\n public get numCopiesProperty() {\r\n if (!this._numCopiesProperty)\r\n this._numCopiesProperty = new DialogProperty<number>(\r\n PropertyDescriptionHelper.buildNumberEditorDescription(\"numCopies\", EditTools.translate(\"CopyElements.Label.NumCopies\"),\r\n { type: PropertyEditorParamTypes.Range, minimum: 1 } as RangeEditorParams), 1);\r\n return this._numCopiesProperty;\r\n }\r\n\r\n public get numCopies(): number { return this.numCopiesProperty.value; }\r\n public set numCopies(value: number) { this.numCopiesProperty.value = value; }\r\n\r\n protected override get wantMakeCopy(): boolean { return this.numCopies > 0; }\r\n\r\n protected override updateAnchorLocation(transform: Transform): void {\r\n // Account for additional copies for repeat operation anchor point...\r\n for (let iCopy = 0; iCopy < this.numCopies; ++iCopy)\r\n super.updateAnchorLocation(transform);\r\n }\r\n\r\n protected async doTransformedCopy(ids: Id64Array, transform: Transform, numCopies: number): Promise<Id64Arg | undefined> {\r\n if (numCopies < 1 || 0 === ids.length)\r\n return undefined;\r\n\r\n this._startedCmd = await this.startCommand();\r\n const newIds: Id64Array = [];\r\n\r\n for (const id of ids) {\r\n // NOTE: For testing only. Using loadProps to return json format geometry to the frontend for each element in the tool agenda is very inefficient.\r\n const props = await this.iModel.elements.loadProps(id, { wantGeometry: true, wantBRepData: true }) as GeometricElementProps;\r\n if (undefined === props.placement)\r\n continue;\r\n\r\n const placement = isPlacement2dProps(props.placement) ? Placement2d.fromJSON(props.placement) : Placement3d.fromJSON(props.placement);\r\n if (!placement.isValid)\r\n continue; // Ignore assembly parents w/o geometry, etc...\r\n\r\n const classFullName = (placement.is3d ? \"Generic:PhysicalObject\" : \"BisCore:DrawingGraphic\");\r\n const newProps: GeometricElementProps = { classFullName, model: props.model, category: props.category, code: Code.createEmpty(), placement, geom: props.geom };\r\n let newId;\r\n\r\n for (let iCopy = 0; iCopy < numCopies; ++iCopy) {\r\n placement.multiplyTransform(transform);\r\n newId = await basicManipulationIpc.insertGeometricElement(newProps);\r\n }\r\n\r\n if (undefined !== newId)\r\n newIds.push(newId); // When numCopies > 1 ids are return for just the final copy...\r\n }\r\n\r\n return (0 === newIds.length ? undefined : newIds);\r\n }\r\n\r\n protected override async transformAndCopyAgenda(transform: Transform): Promise<Id64Arg | undefined> {\r\n try {\r\n const newIds = await this.doTransformedCopy(this.agenda.elements, transform, this.numCopies);\r\n if (undefined !== newIds)\r\n await this.saveChanges();\r\n return newIds;\r\n } catch (err) {\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\r\n return undefined;\r\n }\r\n }\r\n\r\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\r\n // NOTE: Don't call changeToolSettingPropertyValue, value of numCopies should not be saved...\r\n if (updatedValue.propertyName !== this.numCopiesProperty.name || undefined === updatedValue.value.value)\r\n return false;\r\n this.numCopies = updatedValue.value.value as number;\r\n return true;\r\n }\r\n\r\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\r\n // NOTE: Don't call initializeToolSettingPropertyValues, value of numCopies is not saved...\r\n const toolSettings = new Array<DialogItem>();\r\n toolSettings.push(this.numCopiesProperty.toDialogItem({ rowPriority: 1, columnIndex: 2 }));\r\n return toolSettings;\r\n }\r\n\r\n public override async onRestartTool(): Promise<void> {\r\n const tool = new CopyElementsTool();\r\n tool.numCopies = this.numCopies; // Preserve numCopies on restart...\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n /** The keyin takes the following arguments, all of which are optional:\r\n * - `numCopies=number` Number of copies of each element to create, default is 1.\r\n */\r\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\r\n for (const arg of inputArgs) {\r\n const parts = arg.split(\"=\");\r\n if (2 !== parts.length)\r\n continue;\r\n\r\n if (parts[0].toLowerCase().startsWith(\"num\")) {\r\n const copies = Number.parseInt(parts[1], 10);\r\n if (copies >= 1)\r\n this.numCopies = copies; // NOTE: Don't call saveToolSettingPropertyValue, always default to single copy...\r\n }\r\n }\r\n\r\n return this.run();\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport enum RotateMethod {\r\n By3Points,\r\n ByAngle,\r\n}\r\n\r\n/** @alpha */\r\nexport enum RotateAbout {\r\n Point,\r\n Origin,\r\n Center,\r\n}\r\n\r\n/** @alpha Rotate elements by applying transform to placement. */\r\nexport class RotateElementsTool extends TransformElementsTool {\r\n public static override toolId = \"RotateElements\";\r\n public static override iconSpec = \"icon-rotate\";\r\n\r\n protected xAxisPoint?: Point3d;\r\n protected havePivotPoint = false;\r\n protected haveFinalPoint = false;\r\n\r\n public static override get minArgs() { return 0; }\r\n public static override get maxArgs() { return 3; }\r\n\r\n private static methodMessage(str: string) { return EditTools.translate(`RotateElements.Method.${str}`); }\r\n private static getMethodChoices = (): EnumerationChoice[] => {\r\n return [\r\n { label: RotateElementsTool.methodMessage(\"3Points\"), value: RotateMethod.By3Points },\r\n { label: RotateElementsTool.methodMessage(\"Angle\"), value: RotateMethod.ByAngle },\r\n ];\r\n };\r\n\r\n private _methodProperty: DialogProperty<number> | undefined;\r\n public get methodProperty() {\r\n if (!this._methodProperty)\r\n this._methodProperty = new DialogProperty<number>(PropertyDescriptionHelper.buildEnumPicklistEditorDescription(\r\n \"rotateMethod\", EditTools.translate(\"RotateElements.Label.Method\"), RotateElementsTool.getMethodChoices()), RotateMethod.By3Points as number);\r\n return this._methodProperty;\r\n }\r\n\r\n public get rotateMethod(): RotateMethod { return this.methodProperty.value as RotateMethod; }\r\n public set rotateMethod(method: RotateMethod) { this.methodProperty.value = method; }\r\n\r\n private static aboutMessage(str: string) { return EditTools.translate(`RotateElements.About.${str}`); }\r\n private static getAboutChoices = (): EnumerationChoice[] => {\r\n return [\r\n { label: RotateElementsTool.aboutMessage(\"Point\"), value: RotateAbout.Point },\r\n { label: RotateElementsTool.aboutMessage(\"Origin\"), value: RotateAbout.Origin },\r\n { label: RotateElementsTool.aboutMessage(\"Center\"), value: RotateAbout.Center },\r\n ];\r\n };\r\n\r\n private _aboutProperty: DialogProperty<number> | undefined;\r\n public get aboutProperty() {\r\n if (!this._aboutProperty)\r\n this._aboutProperty = new DialogProperty<number>(PropertyDescriptionHelper.buildEnumPicklistEditorDescription(\r\n \"rotateAbout\", EditTools.translate(\"RotateElements.Label.About\"), RotateElementsTool.getAboutChoices()), RotateAbout.Point as number);\r\n return this._aboutProperty;\r\n }\r\n\r\n public get rotateAbout(): RotateAbout { return this.aboutProperty.value as RotateAbout; }\r\n public set rotateAbout(method: RotateAbout) { this.aboutProperty.value = method; }\r\n\r\n private _angleProperty: DialogProperty<number> | undefined;\r\n public get angleProperty() {\r\n if (!this._angleProperty)\r\n this._angleProperty = new DialogProperty<number>(new AngleDescription(\"rotateAngle\", EditTools.translate(\"RotateElements.Label.Angle\")), 0.0);\r\n return this._angleProperty;\r\n }\r\n\r\n public get rotateAngle(): number { return this.angleProperty.value; }\r\n public set rotateAngle(value: number) { this.angleProperty.value = value; }\r\n\r\n protected override get requireAcceptForSelectionSetDynamics(): boolean { return RotateMethod.ByAngle !== this.rotateMethod; }\r\n\r\n protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\r\n if (undefined === ev.viewport)\r\n return undefined;\r\n\r\n if (RotateMethod.ByAngle === this.rotateMethod) {\r\n const rotMatrix = AccuDrawHintBuilder.getCurrentRotation(ev.viewport, true, true);\r\n if (undefined === rotMatrix)\r\n return undefined;\r\n\r\n const invMatrix = rotMatrix.inverse();\r\n if (undefined === invMatrix)\r\n return undefined;\r\n\r\n const angMatrix = YawPitchRollAngles.createRadians(this.rotateAngle, 0, 0).toMatrix3d();\r\n if (undefined === angMatrix)\r\n return undefined;\r\n\r\n angMatrix.multiplyMatrixMatrix(invMatrix, invMatrix);\r\n rotMatrix.multiplyMatrixMatrix(invMatrix, rotMatrix);\r\n\r\n return Transform.createFixedPointAndMatrix(ev.point, rotMatrix);\r\n }\r\n\r\n if (undefined === this.anchorPoint || undefined === this.xAxisPoint)\r\n return undefined;\r\n\r\n const vec1 = Vector3d.createStartEnd(this.anchorPoint, this.xAxisPoint);\r\n const vec2 = Vector3d.createStartEnd(this.anchorPoint, ev.point);\r\n\r\n if (!vec1.normalizeInPlace() || !vec2.normalizeInPlace())\r\n return undefined;\r\n\r\n const dot = vec1.dotProduct(vec2);\r\n if (dot > (1.0 - Geometry.smallAngleRadians))\r\n return undefined;\r\n\r\n if (dot < (-1.0 + Geometry.smallAngleRadians)) {\r\n const rotMatrix = AccuDrawHintBuilder.getCurrentRotation(ev.viewport, true, true);\r\n if (undefined === rotMatrix)\r\n return undefined;\r\n\r\n const invMatrix = rotMatrix.inverse();\r\n if (undefined === invMatrix)\r\n return undefined;\r\n\r\n const angMatrix = YawPitchRollAngles.createRadians(Math.PI, 0, 0).toMatrix3d(); // 180 degree rotation...\r\n if (undefined === angMatrix)\r\n return undefined;\r\n\r\n angMatrix.multiplyMatrixMatrix(invMatrix, invMatrix);\r\n rotMatrix.multiplyMatrixMatrix(invMatrix, rotMatrix);\r\n\r\n return Transform.createFixedPointAndMatrix(this.anchorPoint, rotMatrix);\r\n }\r\n\r\n const zVec = vec1.unitCrossProduct(vec2);\r\n if (undefined === zVec)\r\n return undefined;\r\n\r\n const yVec = zVec.unitCrossProduct(vec1);\r\n if (undefined === yVec)\r\n return undefined;\r\n\r\n const matrix1 = Matrix3d.createRows(vec1, yVec, zVec);\r\n zVec.unitCrossProduct(vec2, yVec);\r\n const matrix2 = Matrix3d.createColumns(vec2, yVec, zVec);\r\n\r\n const matrix = matrix2.multiplyMatrixMatrix(matrix1);\r\n if (undefined === matrix)\r\n return undefined;\r\n\r\n return Transform.createFixedPointAndMatrix(this.anchorPoint, matrix);\r\n }\r\n\r\n protected override transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\r\n if (RotateAbout.Point === this.rotateAbout)\r\n return super.transformAgendaDynamics(transform, context);\r\n\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n\r\n const rotatePoint = Point3d.create();\r\n\r\n for (const data of this._graphicsProvider.data) {\r\n if (RotateAbout.Origin === this.rotateAbout)\r\n rotatePoint.setFrom(data.placement.origin);\r\n else\r\n rotatePoint.setFrom(data.placement.calculateRange().center);\r\n\r\n const rotateTrans = Transform.createFixedPointAndMatrix(rotatePoint, transform.matrix);\r\n this._graphicsProvider.addSingleGraphic(data.graphic, rotateTrans, context);\r\n }\r\n }\r\n\r\n protected override async transformAgenda(transform: Transform): Promise<void> {\r\n if (RotateAbout.Point === this.rotateAbout)\r\n return super.transformAgenda(transform);\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n if (IModelStatus.Success === await basicManipulationIpc.rotatePlacement(this.agenda.compressIds(), transform.matrix.toJSON(), RotateAbout.Center === this.rotateAbout))\r\n await this.saveChanges();\r\n } catch (err) {\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\r\n }\r\n }\r\n\r\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\r\n const transform = this.calculateTransform(ev);\r\n if (undefined !== transform)\r\n return this.transformAgendaDynamics(transform, context);\r\n\r\n if (undefined === this.anchorPoint)\r\n return;\r\n\r\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 1, LinePixels.Code2);\r\n builder.addLineString([this.anchorPoint.clone(), ev.point.clone()]);\r\n context.addGraphic(builder.finish());\r\n }\r\n\r\n protected override get wantAdditionalInput(): boolean {\r\n if (RotateMethod.ByAngle === this.rotateMethod)\r\n return super.wantAdditionalInput;\r\n\r\n return !this.haveFinalPoint;\r\n }\r\n\r\n protected override wantProcessAgenda(ev: BeButtonEvent): boolean {\r\n if (RotateMethod.ByAngle === this.rotateMethod)\r\n return super.wantProcessAgenda(ev);\r\n\r\n if (!this.havePivotPoint)\r\n this.havePivotPoint = true; // Uses anchorPoint...\r\n else if (undefined === this.xAxisPoint)\r\n this.xAxisPoint = ev.point.clone();\r\n else if (!this.haveFinalPoint)\r\n this.haveFinalPoint = true; // Uses button event...\r\n\r\n return super.wantProcessAgenda(ev);\r\n }\r\n\r\n protected override setupAndPromptForNextAction(): void {\r\n super.setupAndPromptForNextAction();\r\n\r\n if (RotateMethod.ByAngle === this.rotateMethod)\r\n return;\r\n\r\n if (undefined === this.anchorPoint || undefined === this.xAxisPoint)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setXAxis(Vector3d.createStartEnd(this.anchorPoint, this.xAxisPoint));\r\n hints.setOrigin(this.anchorPoint);\r\n hints.setModePolar();\r\n hints.sendHints();\r\n }\r\n\r\n protected override provideToolAssistance(_mainInstrText?: string, _additionalInstr?: ToolAssistanceInstruction[]): void {\r\n let mainMsg;\r\n if (RotateMethod.ByAngle === this.rotateMethod) {\r\n if (!this.isSelectByPoints && !this.wantAdditionalElements && this.wantAdditionalInput)\r\n mainMsg = EditTools.translate(\"RotateElements.Prompts.IdentifyPoint\");\r\n } else {\r\n if (!this.isSelectByPoints && !this.wantAdditionalElements) {\r\n if (!this.havePivotPoint)\r\n mainMsg = EditTools.translate(\"RotateElements.Prompts.IdentifyPoint\");\r\n else if (undefined === this.xAxisPoint)\r\n mainMsg = EditTools.translate(\"RotateElements.Prompts.DefineStart\");\r\n else\r\n mainMsg = EditTools.translate(\"RotateElements.Prompts.DefineAmount\");\r\n }\r\n }\r\n super.provideToolAssistance(mainMsg);\r\n }\r\n\r\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\r\n if (!this.changeToolSettingPropertyValue(updatedValue))\r\n return false;\r\n\r\n if (this.methodProperty.name === updatedValue.propertyName)\r\n await this.onRestartTool(); // calling restart, not reinitialize to not exit tool for selection set...\r\n\r\n return true;\r\n }\r\n\r\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\r\n const toolSettings = new Array<DialogItem>();\r\n\r\n toolSettings.push(this.methodProperty.toDialogItem({ rowPriority: 1, columnIndex: 2 }));\r\n toolSettings.push(this.aboutProperty.toDialogItem({ rowPriority: 2, columnIndex: 2 }));\r\n\r\n if (RotateMethod.ByAngle === this.rotateMethod)\r\n toolSettings.push(this.angleProperty.toDialogItem({ rowPriority: 3, columnIndex: 2 }));\r\n\r\n return toolSettings;\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new RotateElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n public override async onInstall(): Promise<boolean> {\r\n if (!await super.onInstall())\r\n return false;\r\n\r\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\r\n this.initializeToolSettingPropertyValues([this.methodProperty, this.aboutProperty, this.angleProperty]);\r\n\r\n return true;\r\n }\r\n\r\n /** The keyin takes the following arguments, all of which are optional:\r\n * - `method=0|1` How rotate angle will be specified. 0 for by 3 points, 1 for by specified angle.\r\n * - `about=0|1|2` Location to rotate about. 0 for point, 1 for placement origin, and 2 for center of range.\r\n * - `angle=number` Rotation angle in degrees when not defining angle by points.\r\n */\r\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\r\n let rotateMethod;\r\n let rotateAbout;\r\n let rotateAngle;\r\n\r\n for (const arg of inputArgs) {\r\n const parts = arg.split(\"=\");\r\n if (2 !== parts.length)\r\n continue;\r\n\r\n if (parts[0].toLowerCase().startsWith(\"me\")) {\r\n const method = Number.parseInt(parts[1], 10);\r\n if (!Number.isNaN(method)) {\r\n switch (method) {\r\n case 0:\r\n rotateMethod = RotateMethod.By3Points;\r\n break;\r\n case 1:\r\n rotateMethod = RotateMethod.ByAngle;\r\n break;\r\n }\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"ab\")) {\r\n const about = Number.parseInt(parts[1], 10);\r\n if (!Number.isNaN(about)) {\r\n switch (about) {\r\n case 0:\r\n rotateAbout = RotateAbout.Point;\r\n break;\r\n case 1:\r\n rotateAbout = RotateAbout.Origin;\r\n break;\r\n case 2:\r\n rotateAbout = RotateAbout.Center;\r\n break;\r\n }\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"an\")) {\r\n const angle = Number.parseFloat(parts[1]);\r\n if (!Number.isNaN(angle)) {\r\n rotateAngle = Angle.createDegrees(angle).radians;\r\n }\r\n }\r\n }\r\n\r\n // Update current session values so keyin args are picked up for tool settings/restart...\r\n if (undefined !== rotateMethod)\r\n this.saveToolSettingPropertyValue(this.methodProperty, { value: rotateMethod });\r\n\r\n if (undefined !== rotateAbout)\r\n this.saveToolSettingPropertyValue(this.aboutProperty, { value: rotateAbout });\r\n\r\n if (undefined !== rotateAngle)\r\n this.saveToolSettingPropertyValue(this.angleProperty, { value: rotateAngle });\r\n\r\n return this.run();\r\n }\r\n}\r\n\r\n"]}
|
|
1
|
+
{"version":3,"file":"TransformElementsTool.js","sourceRoot":"","sources":["../../src/TransformElementsTool.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\r\nimport {\r\n DialogItem, DialogProperty, DialogPropertySyncItem, EnumerationChoice, PropertyDescriptionHelper, PropertyEditorParamTypes, RangeEditorParams,\r\n} from \"@itwin/appui-abstract\";\r\nimport { BentleyError, Id64, Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n Code, ColorDef, GeometricElementProps, IModelStatus, isPlacement2dProps, LinePixels, PersistentGraphicsRequestProps, Placement, Placement2d,\r\n Placement3d,\r\n} from \"@itwin/core-common\";\r\nimport {\r\n AccuDrawHintBuilder, AngleDescription, BeButtonEvent, CoreTools, DynamicsContext, ElementSetTool, GraphicBranch, GraphicType, IModelApp,\r\n IModelConnection, IpcApp, ModifyElementSource, NotifyMessageDetails, OutputMessagePriority, readElementGraphics, RenderGraphic, RenderGraphicOwner,\r\n ToolAssistanceInstruction,\r\n} from \"@itwin/core-frontend\";\r\nimport { Angle, Geometry, Matrix3d, Point3d, Transform, Vector3d, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\r\nimport { EditTools } from \"./EditTool\";\r\nimport { basicManipulationIpc } from \"./EditToolIpc\";\r\n\r\n/** @alpha */\r\nexport interface TransformGraphicsData {\r\n id: Id64String;\r\n placement: Placement;\r\n graphic: RenderGraphicOwner;\r\n}\r\n\r\n/** @alpha */\r\nexport class TransformGraphicsProvider {\r\n public readonly iModel: IModelConnection;\r\n public readonly data: TransformGraphicsData[];\r\n public readonly pending: Map<Id64String, string>;\r\n public readonly prefix: string;\r\n /** Chord tolerance to use to stroke the element's geometry in meters. */\r\n public chordTolerance = 0.01;\r\n\r\n constructor(iModel: IModelConnection, prefix: string) {\r\n this.iModel = iModel;\r\n this.prefix = prefix;\r\n this.data = new Array<TransformGraphicsData>();\r\n this.pending = new Map<Id64String, string>();\r\n }\r\n\r\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\r\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\r\n\r\n private async createRequest(id: Id64String): Promise<TransformGraphicsData | undefined> {\r\n const elementProps = (await this.iModel.elements.getProps(id)) as GeometricElementProps[];\r\n if (0 === elementProps.length)\r\n return;\r\n\r\n const placementProps = elementProps[0].placement;\r\n if (undefined === placementProps)\r\n return;\r\n\r\n const placement = isPlacement2dProps(placementProps) ? Placement2d.fromJSON(placementProps) : Placement3d.fromJSON(placementProps);\r\n if (!placement.isValid)\r\n return; // Ignore assembly parents w/o geometry, etc...\r\n\r\n const requestProps: PersistentGraphicsRequestProps = {\r\n id: this.getRequestId(id),\r\n elementId: id,\r\n toleranceLog10: this.getToleranceLog10(),\r\n };\r\n\r\n this.pending.set(id, requestProps.id); // keep track of requests so they can be cancelled...\r\n\r\n const graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\r\n if (undefined === graphicData)\r\n return;\r\n\r\n const graphic = await readElementGraphics(graphicData, this.iModel, elementProps[0].model, placement.is3d, { noFlash: true, noHilite: true });\r\n if (undefined === graphic)\r\n return;\r\n\r\n return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic) };\r\n }\r\n\r\n private disposeOfGraphics(): void {\r\n this.data.forEach((data) => {\r\n data.graphic.disposeGraphic();\r\n });\r\n\r\n this.data.length = 0;\r\n }\r\n\r\n private async cancelPendingRequests(): Promise<void> {\r\n const requests = new Array<string>();\r\n for (const [_key, id] of this.pending)\r\n requests.push(id);\r\n\r\n this.pending.clear();\r\n if (0 === requests.length)\r\n return;\r\n\r\n return IpcApp.appFunctionIpc.cancelElementGraphicsRequests(this.iModel.key, requests);\r\n }\r\n\r\n /** Call to request a RenderGraphic for the supplied element id.\r\n * @see [[cleanupGraphics]] Must be called when the tool exits.\r\n */\r\n public async createSingleGraphic(id: Id64String): Promise<boolean> {\r\n try {\r\n const info = await this.createRequest(id);\r\n\r\n if (undefined !== info?.id)\r\n this.pending.delete(info.id);\r\n\r\n if (undefined === info?.graphic)\r\n return false;\r\n\r\n this.data.push(info);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /** Call to request RenderGraphics for the supplied element ids. Does not wait for results as\r\n * generating graphics for a large number of elements can take time. Instead an array of [[RenderGraphicOwner]]\r\n * is populated as requests are resolved and the current dynamics frame displays what is available.\r\n * @see [[cleanupGraphics]] Must be called when the tool exits.\r\n */\r\n public createGraphics(elements: Id64Arg): void {\r\n if (0 === Id64.sizeOf(elements))\r\n return;\r\n\r\n try {\r\n for (const id of Id64.iterable(elements)) {\r\n const promise = this.createRequest(id);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n promise.then((info) => {\r\n if (undefined !== info?.id)\r\n this.pending.delete(info.id);\r\n\r\n if (undefined !== info?.graphic)\r\n this.data.push(info);\r\n });\r\n }\r\n } catch { }\r\n }\r\n\r\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]] and cancel requests that are still pending.\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 async cleanupGraphics(): Promise<void> {\r\n await this.cancelPendingRequests();\r\n this.disposeOfGraphics();\r\n }\r\n\r\n public addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\r\n const branch = new GraphicBranch(false);\r\n branch.add(graphic);\r\n\r\n const branchGraphic = context.createBranch(branch, transform);\r\n context.addGraphic(branchGraphic);\r\n }\r\n\r\n public addGraphics(transform: Transform, context: DynamicsContext): void {\r\n if (0 === this.data.length)\r\n return;\r\n\r\n const branch = new GraphicBranch(false);\r\n for (const data of this.data)\r\n branch.add(data.graphic);\r\n\r\n const branchGraphic = context.createBranch(branch, transform);\r\n context.addGraphic(branchGraphic);\r\n }\r\n}\r\n\r\n/** @alpha Base class for applying a transform to element placements. */\r\nexport abstract class TransformElementsTool extends ElementSetTool {\r\n protected override get allowSelectionSet(): boolean { return true; }\r\n protected override get allowGroups(): 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 wantAccuSnap(): boolean { return true; }\r\n protected override get wantDynamics(): boolean { return true; }\r\n protected get wantMakeCopy(): boolean { return false; }\r\n protected get wantRepeatOperation(): boolean { return this.wantMakeCopy && !this.agenda.isEmpty; }\r\n protected _graphicsProvider?: TransformGraphicsProvider;\r\n protected _startedCmd?: string;\r\n\r\n protected abstract calculateTransform(ev: BeButtonEvent): Transform | undefined;\r\n\r\n protected async createAgendaGraphics(changed: boolean): Promise<void> {\r\n if (changed) {\r\n if (undefined === this._graphicsProvider)\r\n return; // Not yet needed...\r\n } else {\r\n if (undefined !== this._graphicsProvider)\r\n return; // Use existing graphics...\r\n }\r\n\r\n if (undefined === this._graphicsProvider)\r\n this._graphicsProvider = new TransformGraphicsProvider(this.iModel, this.toolId);\r\n else\r\n await this._graphicsProvider.cleanupGraphics();\r\n\r\n if (1 === this.agenda.length) {\r\n await this._graphicsProvider.createSingleGraphic(this.agenda.elements[0]);\r\n return;\r\n }\r\n\r\n this._graphicsProvider.createGraphics(this.agenda.elements);\r\n }\r\n\r\n protected async clearAgendaGraphics(): Promise<void> {\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n await this._graphicsProvider.cleanupGraphics();\r\n this._graphicsProvider = undefined;\r\n }\r\n\r\n protected override async onAgendaModified(): Promise<void> {\r\n await this.createAgendaGraphics(true);\r\n }\r\n\r\n protected override async initAgendaDynamics(): Promise<boolean> {\r\n await this.createAgendaGraphics(false);\r\n return super.initAgendaDynamics();\r\n }\r\n\r\n protected transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\r\n if (undefined !== this._graphicsProvider)\r\n this._graphicsProvider.addGraphics(transform, context);\r\n }\r\n\r\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\r\n const transform = this.calculateTransform(ev);\r\n if (undefined === transform)\r\n return;\r\n this.transformAgendaDynamics(transform, context);\r\n }\r\n\r\n protected updateAnchorLocation(transform: Transform): void {\r\n // Update anchor point to support creating additional copies (repeat vs. restart)...\r\n if (undefined === this.anchorPoint)\r\n return;\r\n\r\n transform.multiplyPoint3d(this.anchorPoint, this.anchorPoint);\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setOrigin(this.anchorPoint);\r\n hints.sendHints();\r\n }\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>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\r\n }\r\n\r\n protected async replaceAgenda(newIds: Id64Arg | undefined): Promise<void> {\r\n this.agenda.clear();\r\n\r\n if (undefined !== newIds)\r\n this.agenda.add(newIds);\r\n\r\n if (this.isSelectionSetModify) {\r\n if (this.agenda.isEmpty)\r\n this.iModel.selectionSet.emptyAll();\r\n else\r\n this.iModel.selectionSet.replace(this.agenda.elements);\r\n\r\n this.agenda.setSource(ModifyElementSource.SelectionSet);\r\n this.setPreferredElementSource(); // Update \"use selection set\" flag...\r\n }\r\n\r\n return this.onAgendaModified();\r\n }\r\n\r\n protected async transformAndCopyAgenda(_transform: Transform): Promise<Id64Arg | undefined> {\r\n return undefined;\r\n }\r\n\r\n protected async transformAgenda(transform: Transform): Promise<void> {\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n if (IModelStatus.Success === await basicManipulationIpc.transformPlacement(this.agenda.compressIds(), transform.toJSON()))\r\n await this.saveChanges();\r\n } catch (err) {\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\r\n }\r\n }\r\n\r\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\r\n const transform = this.calculateTransform(ev);\r\n if (undefined === transform)\r\n return;\r\n\r\n if (this.wantMakeCopy)\r\n await this.replaceAgenda(await this.transformAndCopyAgenda(transform));\r\n else\r\n await this.transformAgenda(transform);\r\n\r\n this.updateAnchorLocation(transform);\r\n }\r\n\r\n public override async onProcessComplete(): Promise<void> {\r\n if (this.wantRepeatOperation)\r\n return; // Continue with current agenda instead of restarting (ex. create additional copies)\r\n return super.onProcessComplete();\r\n }\r\n\r\n public override async onCleanup() {\r\n await this.clearAgendaGraphics();\r\n return super.onCleanup();\r\n }\r\n}\r\n\r\n/** @alpha Move elements by applying translation to placement. */\r\nexport class MoveElementsTool extends TransformElementsTool {\r\n public static override toolId = \"MoveElements\";\r\n public static override iconSpec = \"icon-move\";\r\n\r\n protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\r\n if (undefined === this.anchorPoint)\r\n return undefined;\r\n return Transform.createTranslation(ev.point.minus(this.anchorPoint));\r\n }\r\n\r\n protected override provideToolAssistance(_mainInstrText?: string, _additionalInstr?: ToolAssistanceInstruction[]): void {\r\n let mainMsg;\r\n if (!this.isSelectByPoints && !this.wantAdditionalElements)\r\n mainMsg = CoreTools.translate(this.wantAdditionalInput ? \"ElementSet.Prompts.StartPoint\" : \"ElementSet.Prompts.EndPoint\");\r\n super.provideToolAssistance(mainMsg);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new MoveElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n}\r\n\r\n/** Create new elements with translation applied to placement.\r\n * This is a brute force implementation strictly for example and testing purposes.\r\n * The new elements are Generic:PhysicalObject or BisCore:DrawingGraphic using the model and category of original.\r\n * Does not preserve assemblies and geometric elements without geometry are not copied.\r\n * Using loadProps to return json format geometry to the frontend for each element in the tool agenda is very inefficient.\r\n * Applications that wish to support copy are expected to sub-class TransformElementsTool and register their\r\n * own EditCommand that can correctly copy their application elements.\r\n * @alpha\r\n */\r\nexport class CopyElementsTool extends MoveElementsTool {\r\n public static override toolId = \"CopyElements\";\r\n public static override iconSpec = \"icon-move\"; // Need better icon...\r\n\r\n public static override get minArgs() { return 0; }\r\n public static override get maxArgs() { return 1; }\r\n\r\n private _numCopiesProperty: DialogProperty<number> | undefined;\r\n public get numCopiesProperty() {\r\n if (!this._numCopiesProperty)\r\n this._numCopiesProperty = new DialogProperty<number>(\r\n PropertyDescriptionHelper.buildNumberEditorDescription(\"numCopies\", EditTools.translate(\"CopyElements.Label.NumCopies\"),\r\n { type: PropertyEditorParamTypes.Range, minimum: 1 } as RangeEditorParams), 1);\r\n return this._numCopiesProperty;\r\n }\r\n\r\n public get numCopies(): number { return this.numCopiesProperty.value; }\r\n public set numCopies(value: number) { this.numCopiesProperty.value = value; }\r\n\r\n protected override get wantMakeCopy(): boolean { return this.numCopies > 0; }\r\n\r\n protected override updateAnchorLocation(transform: Transform): void {\r\n // Account for additional copies for repeat operation anchor point...\r\n for (let iCopy = 0; iCopy < this.numCopies; ++iCopy)\r\n super.updateAnchorLocation(transform);\r\n }\r\n\r\n protected async doTransformedCopy(ids: Id64Array, transform: Transform, numCopies: number): Promise<Id64Arg | undefined> {\r\n if (numCopies < 1 || 0 === ids.length)\r\n return undefined;\r\n\r\n this._startedCmd = await this.startCommand();\r\n const newIds: Id64Array = [];\r\n\r\n for (const id of ids) {\r\n // NOTE: For testing only. Using loadProps to return json format geometry to the frontend for each element in the tool agenda is very inefficient.\r\n const props = await this.iModel.elements.loadProps(id, { wantGeometry: true, wantBRepData: true }) as GeometricElementProps;\r\n if (undefined === props.placement)\r\n continue;\r\n\r\n const placement = isPlacement2dProps(props.placement) ? Placement2d.fromJSON(props.placement) : Placement3d.fromJSON(props.placement);\r\n if (!placement.isValid)\r\n continue; // Ignore assembly parents w/o geometry, etc...\r\n\r\n const classFullName = (placement.is3d ? \"Generic:PhysicalObject\" : \"BisCore:DrawingGraphic\");\r\n const newProps: GeometricElementProps = { classFullName, model: props.model, category: props.category, code: Code.createEmpty(), placement, geom: props.geom };\r\n let newId;\r\n\r\n for (let iCopy = 0; iCopy < numCopies; ++iCopy) {\r\n placement.multiplyTransform(transform);\r\n newId = await basicManipulationIpc.insertGeometricElement(newProps);\r\n }\r\n\r\n if (undefined !== newId)\r\n newIds.push(newId); // When numCopies > 1 ids are return for just the final copy...\r\n }\r\n\r\n return (0 === newIds.length ? undefined : newIds);\r\n }\r\n\r\n protected override async transformAndCopyAgenda(transform: Transform): Promise<Id64Arg | undefined> {\r\n try {\r\n const newIds = await this.doTransformedCopy(this.agenda.elements, transform, this.numCopies);\r\n if (undefined !== newIds)\r\n await this.saveChanges();\r\n return newIds;\r\n } catch (err) {\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\r\n return undefined;\r\n }\r\n }\r\n\r\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\r\n // NOTE: Don't call changeToolSettingPropertyValue, value of numCopies should not be saved...\r\n if (updatedValue.propertyName !== this.numCopiesProperty.name || undefined === updatedValue.value.value)\r\n return false;\r\n this.numCopies = updatedValue.value.value as number;\r\n return true;\r\n }\r\n\r\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\r\n // NOTE: Don't call initializeToolSettingPropertyValues, value of numCopies is not saved...\r\n const toolSettings = new Array<DialogItem>();\r\n toolSettings.push(this.numCopiesProperty.toDialogItem({ rowPriority: 1, columnIndex: 2 }));\r\n return toolSettings;\r\n }\r\n\r\n public override async onRestartTool(): Promise<void> {\r\n const tool = new CopyElementsTool();\r\n tool.numCopies = this.numCopies; // Preserve numCopies on restart...\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n /** The keyin takes the following arguments, all of which are optional:\r\n * - `numCopies=number` Number of copies of each element to create, default is 1.\r\n */\r\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\r\n for (const arg of inputArgs) {\r\n const parts = arg.split(\"=\");\r\n if (2 !== parts.length)\r\n continue;\r\n\r\n if (parts[0].toLowerCase().startsWith(\"num\")) {\r\n const copies = Number.parseInt(parts[1], 10);\r\n if (copies >= 1)\r\n this.numCopies = copies; // NOTE: Don't call saveToolSettingPropertyValue, always default to single copy...\r\n }\r\n }\r\n\r\n return this.run();\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport enum RotateMethod {\r\n By3Points,\r\n ByAngle,\r\n}\r\n\r\n/** @alpha */\r\nexport enum RotateAbout {\r\n Point,\r\n Origin,\r\n Center,\r\n}\r\n\r\n/** @alpha Rotate elements by applying transform to placement. */\r\nexport class RotateElementsTool extends TransformElementsTool {\r\n public static override toolId = \"RotateElements\";\r\n public static override iconSpec = \"icon-rotate\";\r\n\r\n protected xAxisPoint?: Point3d;\r\n protected havePivotPoint = false;\r\n protected haveFinalPoint = false;\r\n\r\n public static override get minArgs() { return 0; }\r\n public static override get maxArgs() { return 3; }\r\n\r\n private static methodMessage(str: string) { return EditTools.translate(`RotateElements.Method.${str}`); }\r\n private static getMethodChoices = (): EnumerationChoice[] => {\r\n return [\r\n { label: RotateElementsTool.methodMessage(\"3Points\"), value: RotateMethod.By3Points },\r\n { label: RotateElementsTool.methodMessage(\"Angle\"), value: RotateMethod.ByAngle },\r\n ];\r\n };\r\n\r\n private _methodProperty: DialogProperty<number> | undefined;\r\n public get methodProperty() {\r\n if (!this._methodProperty)\r\n this._methodProperty = new DialogProperty<number>(PropertyDescriptionHelper.buildEnumPicklistEditorDescription(\r\n \"rotateMethod\", EditTools.translate(\"RotateElements.Label.Method\"), RotateElementsTool.getMethodChoices()), RotateMethod.By3Points as number);\r\n return this._methodProperty;\r\n }\r\n\r\n public get rotateMethod(): RotateMethod { return this.methodProperty.value as RotateMethod; }\r\n public set rotateMethod(method: RotateMethod) { this.methodProperty.value = method; }\r\n\r\n private static aboutMessage(str: string) { return EditTools.translate(`RotateElements.About.${str}`); }\r\n private static getAboutChoices = (): EnumerationChoice[] => {\r\n return [\r\n { label: RotateElementsTool.aboutMessage(\"Point\"), value: RotateAbout.Point },\r\n { label: RotateElementsTool.aboutMessage(\"Origin\"), value: RotateAbout.Origin },\r\n { label: RotateElementsTool.aboutMessage(\"Center\"), value: RotateAbout.Center },\r\n ];\r\n };\r\n\r\n private _aboutProperty: DialogProperty<number> | undefined;\r\n public get aboutProperty() {\r\n if (!this._aboutProperty)\r\n this._aboutProperty = new DialogProperty<number>(PropertyDescriptionHelper.buildEnumPicklistEditorDescription(\r\n \"rotateAbout\", EditTools.translate(\"RotateElements.Label.About\"), RotateElementsTool.getAboutChoices()), RotateAbout.Point as number);\r\n return this._aboutProperty;\r\n }\r\n\r\n public get rotateAbout(): RotateAbout { return this.aboutProperty.value as RotateAbout; }\r\n public set rotateAbout(method: RotateAbout) { this.aboutProperty.value = method; }\r\n\r\n private _angleProperty: DialogProperty<number> | undefined;\r\n public get angleProperty() {\r\n if (!this._angleProperty)\r\n this._angleProperty = new DialogProperty<number>(new AngleDescription(\"rotateAngle\", EditTools.translate(\"RotateElements.Label.Angle\")), 0.0);\r\n return this._angleProperty;\r\n }\r\n\r\n public get rotateAngle(): number { return this.angleProperty.value; }\r\n public set rotateAngle(value: number) { this.angleProperty.value = value; }\r\n\r\n protected override get requireAcceptForSelectionSetDynamics(): boolean { return RotateMethod.ByAngle !== this.rotateMethod; }\r\n\r\n protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\r\n if (undefined === ev.viewport)\r\n return undefined;\r\n\r\n if (RotateMethod.ByAngle === this.rotateMethod) {\r\n const rotMatrix = AccuDrawHintBuilder.getCurrentRotation(ev.viewport, true, true);\r\n if (undefined === rotMatrix)\r\n return undefined;\r\n\r\n const invMatrix = rotMatrix.inverse();\r\n if (undefined === invMatrix)\r\n return undefined;\r\n\r\n const angMatrix = YawPitchRollAngles.createRadians(this.rotateAngle, 0, 0).toMatrix3d();\r\n if (undefined === angMatrix)\r\n return undefined;\r\n\r\n angMatrix.multiplyMatrixMatrix(invMatrix, invMatrix);\r\n rotMatrix.multiplyMatrixMatrix(invMatrix, rotMatrix);\r\n\r\n return Transform.createFixedPointAndMatrix(ev.point, rotMatrix);\r\n }\r\n\r\n if (undefined === this.anchorPoint || undefined === this.xAxisPoint)\r\n return undefined;\r\n\r\n const vec1 = Vector3d.createStartEnd(this.anchorPoint, this.xAxisPoint);\r\n const vec2 = Vector3d.createStartEnd(this.anchorPoint, ev.point);\r\n\r\n if (!vec1.normalizeInPlace() || !vec2.normalizeInPlace())\r\n return undefined;\r\n\r\n const dot = vec1.dotProduct(vec2);\r\n if (dot > (1.0 - Geometry.smallAngleRadians))\r\n return undefined;\r\n\r\n if (dot < (-1.0 + Geometry.smallAngleRadians)) {\r\n const rotMatrix = AccuDrawHintBuilder.getCurrentRotation(ev.viewport, true, true);\r\n if (undefined === rotMatrix)\r\n return undefined;\r\n\r\n const invMatrix = rotMatrix.inverse();\r\n if (undefined === invMatrix)\r\n return undefined;\r\n\r\n const angMatrix = YawPitchRollAngles.createRadians(Math.PI, 0, 0).toMatrix3d(); // 180 degree rotation...\r\n if (undefined === angMatrix)\r\n return undefined;\r\n\r\n angMatrix.multiplyMatrixMatrix(invMatrix, invMatrix);\r\n rotMatrix.multiplyMatrixMatrix(invMatrix, rotMatrix);\r\n\r\n return Transform.createFixedPointAndMatrix(this.anchorPoint, rotMatrix);\r\n }\r\n\r\n const zVec = vec1.unitCrossProduct(vec2);\r\n if (undefined === zVec)\r\n return undefined;\r\n\r\n const yVec = zVec.unitCrossProduct(vec1);\r\n if (undefined === yVec)\r\n return undefined;\r\n\r\n const matrix1 = Matrix3d.createRows(vec1, yVec, zVec);\r\n zVec.unitCrossProduct(vec2, yVec);\r\n const matrix2 = Matrix3d.createColumns(vec2, yVec, zVec);\r\n\r\n const matrix = matrix2.multiplyMatrixMatrix(matrix1);\r\n if (undefined === matrix)\r\n return undefined;\r\n\r\n return Transform.createFixedPointAndMatrix(this.anchorPoint, matrix);\r\n }\r\n\r\n protected override transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\r\n if (RotateAbout.Point === this.rotateAbout)\r\n return super.transformAgendaDynamics(transform, context);\r\n\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n\r\n const rotatePoint = Point3d.create();\r\n\r\n for (const data of this._graphicsProvider.data) {\r\n if (RotateAbout.Origin === this.rotateAbout)\r\n rotatePoint.setFrom(data.placement.origin);\r\n else\r\n rotatePoint.setFrom(data.placement.calculateRange().center);\r\n\r\n const rotateTrans = Transform.createFixedPointAndMatrix(rotatePoint, transform.matrix);\r\n this._graphicsProvider.addSingleGraphic(data.graphic, rotateTrans, context);\r\n }\r\n }\r\n\r\n protected override async transformAgenda(transform: Transform): Promise<void> {\r\n if (RotateAbout.Point === this.rotateAbout)\r\n return super.transformAgenda(transform);\r\n\r\n try {\r\n this._startedCmd = await this.startCommand();\r\n if (IModelStatus.Success === await basicManipulationIpc.rotatePlacement(this.agenda.compressIds(), transform.matrix.toJSON(), RotateAbout.Center === this.rotateAbout))\r\n await this.saveChanges();\r\n } catch (err) {\r\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\r\n }\r\n }\r\n\r\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\r\n const transform = this.calculateTransform(ev);\r\n if (undefined !== transform)\r\n return this.transformAgendaDynamics(transform, context);\r\n\r\n if (undefined === this.anchorPoint)\r\n return;\r\n\r\n const builder = context.createGraphic({ type: GraphicType.WorldOverlay });\r\n builder.setSymbology(context.viewport.getContrastToBackgroundColor(), ColorDef.black, 1, LinePixels.Code2);\r\n builder.addLineString([this.anchorPoint.clone(), ev.point.clone()]);\r\n context.addGraphic(builder.finish());\r\n }\r\n\r\n protected override get wantAdditionalInput(): boolean {\r\n if (RotateMethod.ByAngle === this.rotateMethod)\r\n return super.wantAdditionalInput;\r\n\r\n return !this.haveFinalPoint;\r\n }\r\n\r\n protected override wantProcessAgenda(ev: BeButtonEvent): boolean {\r\n if (RotateMethod.ByAngle === this.rotateMethod)\r\n return super.wantProcessAgenda(ev);\r\n\r\n if (!this.havePivotPoint)\r\n this.havePivotPoint = true; // Uses anchorPoint...\r\n else if (undefined === this.xAxisPoint)\r\n this.xAxisPoint = ev.point.clone();\r\n else if (!this.haveFinalPoint)\r\n this.haveFinalPoint = true; // Uses button event...\r\n\r\n return super.wantProcessAgenda(ev);\r\n }\r\n\r\n protected override setupAndPromptForNextAction(): void {\r\n super.setupAndPromptForNextAction();\r\n\r\n if (RotateMethod.ByAngle === this.rotateMethod)\r\n return;\r\n\r\n if (undefined === this.anchorPoint || undefined === this.xAxisPoint)\r\n return;\r\n\r\n const hints = new AccuDrawHintBuilder();\r\n hints.setXAxis(Vector3d.createStartEnd(this.anchorPoint, this.xAxisPoint));\r\n hints.setOrigin(this.anchorPoint);\r\n hints.setModePolar();\r\n hints.sendHints();\r\n }\r\n\r\n protected override provideToolAssistance(_mainInstrText?: string, _additionalInstr?: ToolAssistanceInstruction[]): void {\r\n let mainMsg;\r\n if (RotateMethod.ByAngle === this.rotateMethod) {\r\n if (!this.isSelectByPoints && !this.wantAdditionalElements && this.wantAdditionalInput)\r\n mainMsg = EditTools.translate(\"RotateElements.Prompts.IdentifyPoint\");\r\n } else {\r\n if (!this.isSelectByPoints && !this.wantAdditionalElements) {\r\n if (!this.havePivotPoint)\r\n mainMsg = EditTools.translate(\"RotateElements.Prompts.IdentifyPoint\");\r\n else if (undefined === this.xAxisPoint)\r\n mainMsg = EditTools.translate(\"RotateElements.Prompts.DefineStart\");\r\n else\r\n mainMsg = EditTools.translate(\"RotateElements.Prompts.DefineAmount\");\r\n }\r\n }\r\n super.provideToolAssistance(mainMsg);\r\n }\r\n\r\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\r\n if (!this.changeToolSettingPropertyValue(updatedValue))\r\n return false;\r\n\r\n if (this.methodProperty.name === updatedValue.propertyName)\r\n await this.onRestartTool(); // calling restart, not reinitialize to not exit tool for selection set...\r\n\r\n return true;\r\n }\r\n\r\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\r\n const toolSettings = new Array<DialogItem>();\r\n\r\n toolSettings.push(this.methodProperty.toDialogItem({ rowPriority: 1, columnIndex: 2 }));\r\n toolSettings.push(this.aboutProperty.toDialogItem({ rowPriority: 2, columnIndex: 2 }));\r\n\r\n if (RotateMethod.ByAngle === this.rotateMethod)\r\n toolSettings.push(this.angleProperty.toDialogItem({ rowPriority: 3, columnIndex: 2 }));\r\n\r\n return toolSettings;\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new RotateElementsTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n public override async onInstall(): Promise<boolean> {\r\n if (!await super.onInstall())\r\n return false;\r\n\r\n // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...\r\n this.initializeToolSettingPropertyValues([this.methodProperty, this.aboutProperty, this.angleProperty]);\r\n\r\n return true;\r\n }\r\n\r\n /** The keyin takes the following arguments, all of which are optional:\r\n * - `method=0|1` How rotate angle will be specified. 0 for by 3 points, 1 for by specified angle.\r\n * - `about=0|1|2` Location to rotate about. 0 for point, 1 for placement origin, and 2 for center of range.\r\n * - `angle=number` Rotation angle in degrees when not defining angle by points.\r\n */\r\n public override async parseAndRun(...inputArgs: string[]): Promise<boolean> {\r\n let rotateMethod;\r\n let rotateAbout;\r\n let rotateAngle;\r\n\r\n for (const arg of inputArgs) {\r\n const parts = arg.split(\"=\");\r\n if (2 !== parts.length)\r\n continue;\r\n\r\n if (parts[0].toLowerCase().startsWith(\"me\")) {\r\n const method = Number.parseInt(parts[1], 10);\r\n if (!Number.isNaN(method)) {\r\n switch (method) {\r\n case 0:\r\n rotateMethod = RotateMethod.By3Points;\r\n break;\r\n case 1:\r\n rotateMethod = RotateMethod.ByAngle;\r\n break;\r\n }\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"ab\")) {\r\n const about = Number.parseInt(parts[1], 10);\r\n if (!Number.isNaN(about)) {\r\n switch (about) {\r\n case 0:\r\n rotateAbout = RotateAbout.Point;\r\n break;\r\n case 1:\r\n rotateAbout = RotateAbout.Origin;\r\n break;\r\n case 2:\r\n rotateAbout = RotateAbout.Center;\r\n break;\r\n }\r\n }\r\n } else if (parts[0].toLowerCase().startsWith(\"an\")) {\r\n const angle = Number.parseFloat(parts[1]);\r\n if (!Number.isNaN(angle)) {\r\n rotateAngle = Angle.createDegrees(angle).radians;\r\n }\r\n }\r\n }\r\n\r\n // Update current session values so keyin args are picked up for tool settings/restart...\r\n if (undefined !== rotateMethod)\r\n this.saveToolSettingPropertyValue(this.methodProperty, { value: rotateMethod });\r\n\r\n if (undefined !== rotateAbout)\r\n this.saveToolSettingPropertyValue(this.aboutProperty, { value: rotateAbout });\r\n\r\n if (undefined !== rotateAngle)\r\n this.saveToolSettingPropertyValue(this.angleProperty, { value: rotateAngle });\r\n\r\n return this.run();\r\n }\r\n}\r\n\r\n"]}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { Tool } from "@itwin/core-frontend";
|
|
2
|
-
/** @alpha Undo all element changes */
|
|
3
|
-
export declare class UndoAllTool extends Tool {
|
|
4
|
-
static toolId: string;
|
|
5
|
-
run(): Promise<boolean>;
|
|
6
|
-
}
|
|
7
|
-
/** @alpha Undo active tool steps, or element changes */
|
|
8
|
-
export declare class UndoTool extends Tool {
|
|
9
|
-
static toolId: string;
|
|
10
|
-
run(): Promise<boolean>;
|
|
11
|
-
}
|
|
12
|
-
/** @alpha Redo active tool steps, or element changes */
|
|
13
|
-
export declare class RedoTool extends Tool {
|
|
14
|
-
static toolId: string;
|
|
15
|
-
run(): Promise<boolean>;
|
|
16
|
-
}
|
|
1
|
+
import { Tool } from "@itwin/core-frontend";
|
|
2
|
+
/** @alpha Undo all element changes */
|
|
3
|
+
export declare class UndoAllTool extends Tool {
|
|
4
|
+
static toolId: string;
|
|
5
|
+
run(): Promise<boolean>;
|
|
6
|
+
}
|
|
7
|
+
/** @alpha Undo active tool steps, or element changes */
|
|
8
|
+
export declare class UndoTool extends Tool {
|
|
9
|
+
static toolId: string;
|
|
10
|
+
run(): Promise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
/** @alpha Redo active tool steps, or element changes */
|
|
13
|
+
export declare class RedoTool extends Tool {
|
|
14
|
+
static toolId: string;
|
|
15
|
+
run(): Promise<boolean>;
|
|
16
|
+
}
|
|
17
17
|
//# sourceMappingURL=UndoRedoTool.d.ts.map
|
package/lib/esm/UndoRedoTool.js
CHANGED
|
@@ -1,37 +1,39 @@
|
|
|
1
|
-
/*---------------------------------------------------------------------------------------------
|
|
2
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
-
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
import { IModelApp, IpcApp, Tool } from "@itwin/core-frontend";
|
|
6
|
-
/** @alpha Undo all element changes */
|
|
7
|
-
|
|
8
|
-
async run() {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
UndoAllTool
|
|
21
|
-
/** @alpha Undo active tool steps, or element changes */
|
|
22
|
-
|
|
23
|
-
async run() {
|
|
24
|
-
await IModelApp.toolAdmin.doUndoOperation();
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
UndoTool.toolId = "Undo";
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { IModelApp, IpcApp, Tool } from "@itwin/core-frontend";
|
|
6
|
+
/** @alpha Undo all element changes */
|
|
7
|
+
class UndoAllTool extends Tool {
|
|
8
|
+
async run() {
|
|
9
|
+
const imodel = IModelApp.viewManager.selectedView?.view.iModel;
|
|
10
|
+
if (undefined === imodel || imodel.isReadonly || !imodel.isBriefcaseConnection)
|
|
11
|
+
return true;
|
|
12
|
+
await IpcApp.appFunctionIpc.reverseAllTxn(imodel.key);
|
|
13
|
+
// ### TODO Restart of primitive tool should be handled by Txn event listener...needs to happen even if not the active tool...
|
|
14
|
+
if (undefined !== IModelApp.toolAdmin.primitiveTool)
|
|
15
|
+
await IModelApp.toolAdmin.primitiveTool.onRestartTool();
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
UndoAllTool.toolId = "UndoAll";
|
|
20
|
+
export { UndoAllTool };
|
|
21
|
+
/** @alpha Undo active tool steps, or element changes */
|
|
22
|
+
class UndoTool extends Tool {
|
|
23
|
+
async run() {
|
|
24
|
+
await IModelApp.toolAdmin.doUndoOperation();
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
UndoTool.toolId = "Undo";
|
|
29
|
+
export { UndoTool };
|
|
30
|
+
/** @alpha Redo active tool steps, or element changes */
|
|
31
|
+
class RedoTool extends Tool {
|
|
32
|
+
async run() {
|
|
33
|
+
await IModelApp.toolAdmin.doRedoOperation();
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
RedoTool.toolId = "Redo";
|
|
38
|
+
export { RedoTool };
|
|
37
39
|
//# sourceMappingURL=UndoRedoTool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UndoRedoTool.js","sourceRoot":"","sources":["../../src/UndoRedoTool.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE/D,sCAAsC;AACtC,
|
|
1
|
+
{"version":3,"file":"UndoRedoTool.js","sourceRoot":"","sources":["../../src/UndoRedoTool.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE/D,sCAAsC;AACtC,MAAa,WAAY,SAAQ,IAAI;IAEnB,KAAK,CAAC,GAAG;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC;QAC/D,IAAI,SAAS,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,qBAAqB;YAC5E,OAAO,IAAI,CAAC;QAEd,MAAM,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEtD,8HAA8H;QAC9H,IAAI,SAAS,KAAK,SAAS,CAAC,SAAS,CAAC,aAAa;YACjD,MAAM,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;;AAZsB,kBAAM,GAAG,SAAS,CAAC;SAD/B,WAAW;AAgBxB,wDAAwD;AACxD,MAAa,QAAS,SAAQ,IAAI;IAEhB,KAAK,CAAC,GAAG;QACvB,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;;AAJsB,eAAM,GAAG,MAAM,CAAC;SAD5B,QAAQ;AAQrB,wDAAwD;AACxD,MAAa,QAAS,SAAQ,IAAI;IAEhB,KAAK,CAAC,GAAG;QACvB,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;;AAJsB,eAAM,GAAG,MAAM,CAAC;SAD5B,QAAQ","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\r\nimport { IModelApp, IpcApp, Tool } from \"@itwin/core-frontend\";\r\n\r\n/** @alpha Undo all element changes */\r\nexport class UndoAllTool extends Tool {\r\n public static override toolId = \"UndoAll\";\r\n public override async run(): Promise<boolean> {\r\n const imodel = IModelApp.viewManager.selectedView?.view.iModel;\r\n if (undefined === imodel || imodel.isReadonly || !imodel.isBriefcaseConnection)\r\n return true;\r\n\r\n await IpcApp.appFunctionIpc.reverseAllTxn(imodel.key);\r\n\r\n // ### TODO Restart of primitive tool should be handled by Txn event listener...needs to happen even if not the active tool...\r\n if (undefined !== IModelApp.toolAdmin.primitiveTool)\r\n await IModelApp.toolAdmin.primitiveTool.onRestartTool();\r\n return true;\r\n }\r\n}\r\n\r\n/** @alpha Undo active tool steps, or element changes */\r\nexport class UndoTool extends Tool {\r\n public static override toolId = \"Undo\";\r\n public override async run(): Promise<boolean> {\r\n await IModelApp.toolAdmin.doUndoOperation();\r\n return true;\r\n }\r\n}\r\n\r\n/** @alpha Redo active tool steps, or element changes */\r\nexport class RedoTool extends Tool {\r\n public static override toolId = \"Redo\";\r\n public override async run(): Promise<boolean> {\r\n await IModelApp.toolAdmin.doRedoOperation();\r\n return true;\r\n }\r\n}\r\n\r\n"]}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
/** @packageDocumentation
|
|
2
|
-
* @module Editing
|
|
3
|
-
*/
|
|
4
|
-
export * from "./CreateElementTool";
|
|
5
|
-
export * from "./DeleteElementsTool";
|
|
6
|
-
export * from "./EditTool";
|
|
7
|
-
export * from "./ElementGeometryTool";
|
|
8
|
-
export * from "./EditToolIpc";
|
|
9
|
-
export * from "./ModifyCurveTools";
|
|
10
|
-
export * from "./ModifyElementTool";
|
|
11
|
-
export * from "./ProjectLocation/ProjectExtentsDecoration";
|
|
12
|
-
export * from "./ProjectLocation/ProjectGeolocation";
|
|
13
|
-
export * from "./SketchTools";
|
|
14
|
-
export * from "./SolidModelingTools";
|
|
15
|
-
export * from "./SolidPrimitiveTools";
|
|
16
|
-
export * from "./TransformElementsTool";
|
|
17
|
-
export * from "./UndoRedoTool";
|
|
1
|
+
/** @packageDocumentation
|
|
2
|
+
* @module Editing
|
|
3
|
+
*/
|
|
4
|
+
export * from "./CreateElementTool";
|
|
5
|
+
export * from "./DeleteElementsTool";
|
|
6
|
+
export * from "./EditTool";
|
|
7
|
+
export * from "./ElementGeometryTool";
|
|
8
|
+
export * from "./EditToolIpc";
|
|
9
|
+
export * from "./ModifyCurveTools";
|
|
10
|
+
export * from "./ModifyElementTool";
|
|
11
|
+
export * from "./ProjectLocation/ProjectExtentsDecoration";
|
|
12
|
+
export * from "./ProjectLocation/ProjectGeolocation";
|
|
13
|
+
export * from "./SketchTools";
|
|
14
|
+
export * from "./SolidModelingTools";
|
|
15
|
+
export * from "./SolidPrimitiveTools";
|
|
16
|
+
export * from "./TransformElementsTool";
|
|
17
|
+
export * from "./UndoRedoTool";
|
|
18
18
|
//# sourceMappingURL=editor-frontend.d.ts.map
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
/*---------------------------------------------------------------------------------------------
|
|
2
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
-
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
/** @packageDocumentation
|
|
6
|
-
* @module Editing
|
|
7
|
-
*/
|
|
8
|
-
export * from "./CreateElementTool";
|
|
9
|
-
export * from "./DeleteElementsTool";
|
|
10
|
-
export * from "./EditTool";
|
|
11
|
-
export * from "./ElementGeometryTool";
|
|
12
|
-
export * from "./EditToolIpc";
|
|
13
|
-
export * from "./ModifyCurveTools";
|
|
14
|
-
export * from "./ModifyElementTool";
|
|
15
|
-
export * from "./ProjectLocation/ProjectExtentsDecoration";
|
|
16
|
-
export * from "./ProjectLocation/ProjectGeolocation";
|
|
17
|
-
export * from "./SketchTools";
|
|
18
|
-
export * from "./SolidModelingTools";
|
|
19
|
-
export * from "./SolidPrimitiveTools";
|
|
20
|
-
export * from "./TransformElementsTool";
|
|
21
|
-
export * from "./UndoRedoTool";
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
/** @packageDocumentation
|
|
6
|
+
* @module Editing
|
|
7
|
+
*/
|
|
8
|
+
export * from "./CreateElementTool";
|
|
9
|
+
export * from "./DeleteElementsTool";
|
|
10
|
+
export * from "./EditTool";
|
|
11
|
+
export * from "./ElementGeometryTool";
|
|
12
|
+
export * from "./EditToolIpc";
|
|
13
|
+
export * from "./ModifyCurveTools";
|
|
14
|
+
export * from "./ModifyElementTool";
|
|
15
|
+
export * from "./ProjectLocation/ProjectExtentsDecoration";
|
|
16
|
+
export * from "./ProjectLocation/ProjectGeolocation";
|
|
17
|
+
export * from "./SketchTools";
|
|
18
|
+
export * from "./SolidModelingTools";
|
|
19
|
+
export * from "./SolidPrimitiveTools";
|
|
20
|
+
export * from "./TransformElementsTool";
|
|
21
|
+
export * from "./UndoRedoTool";
|
|
22
22
|
//# sourceMappingURL=editor-frontend.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/editor-frontend",
|
|
3
|
-
"version": "4.0.0-dev.
|
|
3
|
+
"version": "4.0.0-dev.100",
|
|
4
4
|
"description": "iTwin.js frontend components",
|
|
5
5
|
"main": "lib/cjs/editor-frontend.js",
|
|
6
6
|
"module": "lib/esm/editor-frontend.js",
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
|
-
"url": "https://github.com/iTwin/itwinjs-core
|
|
11
|
+
"url": "https://github.com/iTwin/itwinjs-core.git",
|
|
12
|
+
"directory": "editor/frontend"
|
|
12
13
|
},
|
|
13
14
|
"keywords": [
|
|
14
15
|
"Bentley",
|
|
@@ -22,36 +23,36 @@
|
|
|
22
23
|
"url": "http://www.bentley.com"
|
|
23
24
|
},
|
|
24
25
|
"peerDependencies": {
|
|
25
|
-
"@itwin/appui-abstract": "^4.0.0-dev.
|
|
26
|
-
"@itwin/core-bentley": "^4.0.0-dev.
|
|
27
|
-
"@itwin/core-common": "^4.0.0-dev.
|
|
28
|
-
"@itwin/core-frontend": "^4.0.0-dev.
|
|
29
|
-
"@itwin/core-geometry": "^4.0.0-dev.
|
|
26
|
+
"@itwin/appui-abstract": "^4.0.0-dev.100",
|
|
27
|
+
"@itwin/core-bentley": "^4.0.0-dev.100",
|
|
28
|
+
"@itwin/core-common": "^4.0.0-dev.100",
|
|
29
|
+
"@itwin/core-frontend": "^4.0.0-dev.100",
|
|
30
|
+
"@itwin/core-geometry": "^4.0.0-dev.100"
|
|
30
31
|
},
|
|
31
32
|
"//devDependencies": [
|
|
32
33
|
"NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install",
|
|
33
34
|
"NOTE: All tools used by scripts in this package must be listed as devDependencies"
|
|
34
35
|
],
|
|
35
36
|
"devDependencies": {
|
|
36
|
-
"@itwin/
|
|
37
|
-
"@itwin/build-tools": "4.0.0-dev.1",
|
|
38
|
-
"@itwin/certa": "4.0.0-dev.1",
|
|
39
|
-
"@itwin/core-bentley": "4.0.0-dev.1",
|
|
40
|
-
"@itwin/core-common": "4.0.0-dev.1",
|
|
41
|
-
"@itwin/core-frontend": "4.0.0-dev.1",
|
|
42
|
-
"@itwin/core-geometry": "4.0.0-dev.1",
|
|
43
|
-
"@itwin/eslint-plugin": "4.0.0-dev.1",
|
|
37
|
+
"@itwin/eslint-plugin": "^4.0.0-dev.33",
|
|
44
38
|
"cpx2": "^3.0.0",
|
|
45
|
-
"eslint": "^
|
|
39
|
+
"eslint": "^8.36.0",
|
|
46
40
|
"rimraf": "^3.0.2",
|
|
47
|
-
"typescript": "~
|
|
41
|
+
"typescript": "~5.0.2",
|
|
42
|
+
"@itwin/appui-abstract": "4.0.0-dev.100",
|
|
43
|
+
"@itwin/core-bentley": "4.0.0-dev.100",
|
|
44
|
+
"@itwin/certa": "4.0.0-dev.100",
|
|
45
|
+
"@itwin/build-tools": "4.0.0-dev.100",
|
|
46
|
+
"@itwin/core-common": "4.0.0-dev.100",
|
|
47
|
+
"@itwin/core-frontend": "4.0.0-dev.100",
|
|
48
|
+
"@itwin/core-geometry": "4.0.0-dev.100"
|
|
48
49
|
},
|
|
49
50
|
"//dependencies": [
|
|
50
51
|
"NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API",
|
|
51
52
|
"NOTE: editor-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"
|
|
52
53
|
],
|
|
53
54
|
"dependencies": {
|
|
54
|
-
"@itwin/editor-common": "4.0.0-dev.
|
|
55
|
+
"@itwin/editor-common": "4.0.0-dev.100"
|
|
55
56
|
},
|
|
56
57
|
"eslintConfig": {
|
|
57
58
|
"plugins": [
|
|
@@ -60,8 +61,7 @@
|
|
|
60
61
|
"extends": "plugin:@itwin/itwinjs-recommended"
|
|
61
62
|
},
|
|
62
63
|
"scripts": {
|
|
63
|
-
"build": "npm run -s copy:locale && npm run -s build:cjs",
|
|
64
|
-
"build:ci": "npm run -s build && npm run -s build:esm",
|
|
64
|
+
"build": "npm run -s copy:locale && npm run -s build:cjs && npm run -s build:esm",
|
|
65
65
|
"build:cjs": "tsc 1>&2 --outDir lib/cjs",
|
|
66
66
|
"build:esm": "tsc 1>&2 --module ES2020 --outDir lib/esm",
|
|
67
67
|
"clean": "rimraf lib .rush/temp/package-deps*.json",
|
|
@@ -72,6 +72,5 @@
|
|
|
72
72
|
"pseudolocalize": "betools pseudolocalize --englishDir ./src/public/locales/en --out ./public/locales/en-PSEUDO",
|
|
73
73
|
"test": "",
|
|
74
74
|
"cover": ""
|
|
75
|
-
}
|
|
76
|
-
"readme": "# @itwin/editor-frontend\r\n\r\nCopyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md for license terms and full copyright notice.\r\n\r\n## Description\r\n\r\nThe __@itwin/editor-frontend__ package contains frontend classes for editing iModels.\r\n\r\n## Documentation\r\n\r\nSee the [iTwin.js](https://www.itwinjs.org) documentation for more information.\r\n\r\n## Key-ins\r\n\r\nThe following key-ins are available for this package.\r\n\r\n###### Enabled by `EditorOptions.registerUndoRedoTools`\r\n\r\n* `editor undo all` - Undo all changes to elements.\r\n* `editor undo single` - Undo last change to elements.\r\n* `editor redo` - Redo last undone change to elements.\r\n\r\n###### Enabled by `EditorOptions.registerBasicManipulationTools`\r\n\r\n* `editor delete elements` - Delete selected elements.\r\n* `editor move elements` - Move selected elements.\r\n* `editor rotate elements` - Rotate selected elements. Accepts 0-3 arguments:\r\n * `method=0|1` How rotate angle will be specified. 0 for by 3 points, 1 for by specified angle.\r\n * `about=0|1|2` Location to rotate about. 0 for point, 1 for placement origin, and 2 for center of range.\r\n * `angle=number` Rotation angle in degrees when not defining angle by points.\r\n\r\n###### Enabled by `EditorOptions.registerSketchTools`\r\n\r\n* `editor create arc` - Create a new arc element or add an arc to an existing open path. Accepts 0-3 arguments:\r\n * `method=0|1|2|3` How arc will be defined. 0 for center/start, 1 for start/center, 2 for start/mid/end, and 3 for start/end/mid.\r\n * `radius=number` Arc radius for start/center or center/start, 0 to define by points.\r\n * `sweep=number` Arc sweep angle in degrees for start/center or center/start, 0 to define by points.\r\n* `editor create linestring` - Create a new linestring element or add a linestring to an existing path.\r\n\r\n###### Enabled by `EditorOptions.registerProjectLocationTools`\r\n\r\n* `editor project location show` - Show the decoration for editing the iModel's project extents and geolocation.\r\n* `editor project location hide` - Hide the decoration preserving unsaved changes (call show to redisplay).\r\n* `editor project location cancel` - Clear the decoration and abandon unsaved changes.\r\n* `editor project location save` - Save the modified project extents or geolocation.\r\n\r\n* `editor project geolocation point` - Enter latitude, longitude, altitude, and north angle for a known location. Accepts 0-4 arguments:\r\n * `latitude=number` Latitude of accept point in degrees.\r\n * `longitude=number` Longitude of accept point in degrees.\r\n * `altitude=number` Height above ellipsoid of accept point.\r\n * `north=number` North direction in degrees of accept point.\r\n* `editor project geolocation north` - Define north direction by two points.\r\n* `editor project geolocation move` - Tweak geolocation by defining a translation from two points.\r\n\r\n## Project Extents and Geolocation\r\n\r\n### Usage\r\n\r\nRunning the `editor project location show` command, with a spatial view active, enables the display of the project extents and geolocation controls.\r\n\r\n\r\n\r\n1. A clip volume representing the current project extents.\r\n * The current size is shown in locate tooltip using the active distance formatting.\r\n2. Control to define the ECEF origin.\r\n * Click to run the `editor project geolocation point` command.\r\n * This control is not displayed when the imodel has a valid GCS defined.\r\n3. Control to define the north direction.\r\n * Click to run the `editor project geolocation north` command.\r\n * This control is not displayed when the imodel isn't geolocated.\r\n * When a GCS is defined, the current north direction is displayed for information purposes but can't be modified.\r\n4. Controls to define the project extents.\r\n * Click an arrow control to resize.\r\n\r\n> The decorations and controls are expected to be selectable and modifiable by the default tool.\r\n\r\n#### Changing the project extents\r\n\r\nUse the arrow controls (#4) to resize the project extents.\r\n\r\n> If making the project extents larger, it is helpful to have the background map displayed to avoid decoration clipping.\r\n\r\nWhile there isn't hard limit imposed on the size of the project extents, when any dimension exceeds the recommend maximum a warning symbol is displayed.\r\n\r\nFor the project extents height, the recommended maximum is 2 km.\r\n\r\n\r\n\r\nFor the project extents length and width, the recommended maximum when a GCS is defined is 350 km, and 20 km for imodels that aren't map projections (only ECEF transform defined). In addition to the warning symbols near the arrow controls, a red transparent fill is also displayed to help indicate the xy extents may be too large.\r\n\r\n\r\n\r\n#### Adding or Updating Geolocation\r\n\r\nIf an imodel is not currently geolocated, or is incorrectly geolocated without a valid GCS defined, the geolocation control (#2) will be displayed. Clicking on this control runs the `editor project geolocation point` command, and after snapping to a known coordinate you will be prompted to enter new values for latitude, longitude, altitude, and north angle.\r\n\r\nIf the imodel is already geolocated, the tool settings is populated with the current values for the snapped coordinate. If you don't know the north direction angle, not to worry, this can be defined interactively with another control once the model has an ECEF origin defined.\r\n\r\n\r\n\r\n##### Interactively Defining North Direction\r\n\r\nThe north direction can set interactively by 2 points, click on the north direction control (#3) to run the `editor project geolocation north` command.\r\n\r\n\r\n\r\nAfter zooming out far enough, only the north direction control will be displayed in the view. This may be helpful for seeing where the project is located on the globe or visually confirming the proper north direction.\r\n\r\n\r\n\r\n> The north direction control is only displayed *after* an imodel has been geolocated.\r\n\r\n##### Interactively Tweaking Lat/Long/Altitude\r\n\r\nIf the geolocation is *almost* correct, the latitude, longitude, and altitude can be interactively adjusted by defining a translation by 2 points.\r\n\r\nFor example, running the `editor project geolocation move` command can be used to correct an incorrect altitude for the building below that is half buried in the terrain.\r\n\r\n\r\n\r\nFirst identify a point on the building to move from, it can be helpful turning off map locate for this point if it's below the terrain. For the second point, with map locate re-enabled and the active snap mode set to nearest, identify a point on the terrain to complete the adjustment.\r\n\r\n> AccuDraw can be very helpful when adjusting altitude. Use the T/F/S shortcuts to orient the AccuDraw compass, use Enter (smartlock) to lock an axis to snap the 2nd point. For this example F and Enter were used to lock the up direction before changing to nearest snap for the 2nd point.\r\n\r\n\r\n\r\nNow we can see the building correctly adjusted for the terrain.\r\n\r\n\r\n\r\n#### Saving And Abandoning Changes\r\n\r\nTo abandon changes to the project extents or geolocation currently being previewed, run the `editor project location cancel` command.\r\n\r\nTo turn off the display of decorations while preserving unsaved changes, run the `editor project location hide` command. Use `editor project location show` to restore preview of unsaved changes.\r\n\r\nTo save the changes being previewed, run the `editor project location save` command.\r\n"
|
|
75
|
+
}
|
|
77
76
|
}
|