@itwin/editor-frontend 4.5.0-dev.9 → 4.6.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/CHANGELOG.md +46 -1
  2. package/LICENSE.md +1 -1
  3. package/README.md +0 -29
  4. package/lib/cjs/CreateElementTool.d.ts +64 -2
  5. package/lib/cjs/CreateElementTool.d.ts.map +1 -1
  6. package/lib/cjs/CreateElementTool.js +65 -4
  7. package/lib/cjs/CreateElementTool.js.map +1 -1
  8. package/lib/cjs/EditTool.d.ts +5 -0
  9. package/lib/cjs/EditTool.d.ts.map +1 -1
  10. package/lib/cjs/EditTool.js +10 -14
  11. package/lib/cjs/EditTool.js.map +1 -1
  12. package/lib/cjs/EditToolIpc.d.ts +1 -5
  13. package/lib/cjs/EditToolIpc.d.ts.map +1 -1
  14. package/lib/cjs/EditToolIpc.js +1 -5
  15. package/lib/cjs/EditToolIpc.js.map +1 -1
  16. package/lib/cjs/ModifyElementTool.js.map +1 -1
  17. package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
  18. package/lib/cjs/ProjectLocation/ProjectGeolocation.js.map +1 -1
  19. package/lib/cjs/TransformElementsTool.d.ts +17 -98
  20. package/lib/cjs/TransformElementsTool.d.ts.map +1 -1
  21. package/lib/cjs/TransformElementsTool.js +15 -412
  22. package/lib/cjs/TransformElementsTool.js.map +1 -1
  23. package/lib/cjs/UndoRedoTool.js.map +1 -1
  24. package/lib/cjs/editor-frontend.d.ts +0 -6
  25. package/lib/cjs/editor-frontend.d.ts.map +1 -1
  26. package/lib/cjs/editor-frontend.js +0 -6
  27. package/lib/cjs/editor-frontend.js.map +1 -1
  28. package/lib/esm/CreateElementTool.d.ts +64 -2
  29. package/lib/esm/CreateElementTool.d.ts.map +1 -1
  30. package/lib/esm/CreateElementTool.js +65 -4
  31. package/lib/esm/CreateElementTool.js.map +1 -1
  32. package/lib/esm/EditTool.d.ts +5 -0
  33. package/lib/esm/EditTool.d.ts.map +1 -1
  34. package/lib/esm/EditTool.js +10 -14
  35. package/lib/esm/EditTool.js.map +1 -1
  36. package/lib/esm/EditToolIpc.d.ts +1 -5
  37. package/lib/esm/EditToolIpc.d.ts.map +1 -1
  38. package/lib/esm/EditToolIpc.js +0 -4
  39. package/lib/esm/EditToolIpc.js.map +1 -1
  40. package/lib/esm/ModifyElementTool.js.map +1 -1
  41. package/lib/esm/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
  42. package/lib/esm/ProjectLocation/ProjectGeolocation.js.map +1 -1
  43. package/lib/esm/TransformElementsTool.d.ts +17 -98
  44. package/lib/esm/TransformElementsTool.d.ts.map +1 -1
  45. package/lib/esm/TransformElementsTool.js +16 -413
  46. package/lib/esm/TransformElementsTool.js.map +1 -1
  47. package/lib/esm/UndoRedoTool.js.map +1 -1
  48. package/lib/esm/editor-frontend.d.ts +0 -6
  49. package/lib/esm/editor-frontend.d.ts.map +1 -1
  50. package/lib/esm/editor-frontend.js +0 -6
  51. package/lib/esm/editor-frontend.js.map +1 -1
  52. package/lib/public/locales/en/Editor.json +79 -490
  53. package/package.json +14 -14
  54. package/lib/cjs/DeleteElementsTool.d.ts +0 -14
  55. package/lib/cjs/DeleteElementsTool.d.ts.map +0 -1
  56. package/lib/cjs/DeleteElementsTool.js +0 -42
  57. package/lib/cjs/DeleteElementsTool.js.map +0 -1
  58. package/lib/cjs/ElementGeometryTool.d.ts +0 -148
  59. package/lib/cjs/ElementGeometryTool.d.ts.map +0 -1
  60. package/lib/cjs/ElementGeometryTool.js +0 -705
  61. package/lib/cjs/ElementGeometryTool.js.map +0 -1
  62. package/lib/cjs/ModifyCurveTools.d.ts +0 -140
  63. package/lib/cjs/ModifyCurveTools.d.ts.map +0 -1
  64. package/lib/cjs/ModifyCurveTools.js +0 -777
  65. package/lib/cjs/ModifyCurveTools.js.map +0 -1
  66. package/lib/cjs/SketchTools.d.ts +0 -308
  67. package/lib/cjs/SketchTools.d.ts.map +0 -1
  68. package/lib/cjs/SketchTools.js +0 -1708
  69. package/lib/cjs/SketchTools.js.map +0 -1
  70. package/lib/cjs/SolidModelingTools.d.ts +0 -381
  71. package/lib/cjs/SolidModelingTools.d.ts.map +0 -1
  72. package/lib/cjs/SolidModelingTools.js +0 -1453
  73. package/lib/cjs/SolidModelingTools.js.map +0 -1
  74. package/lib/cjs/SolidPrimitiveTools.d.ts +0 -322
  75. package/lib/cjs/SolidPrimitiveTools.d.ts.map +0 -1
  76. package/lib/cjs/SolidPrimitiveTools.js +0 -1376
  77. package/lib/cjs/SolidPrimitiveTools.js.map +0 -1
  78. package/lib/esm/DeleteElementsTool.d.ts +0 -14
  79. package/lib/esm/DeleteElementsTool.d.ts.map +0 -1
  80. package/lib/esm/DeleteElementsTool.js +0 -39
  81. package/lib/esm/DeleteElementsTool.js.map +0 -1
  82. package/lib/esm/ElementGeometryTool.d.ts +0 -148
  83. package/lib/esm/ElementGeometryTool.d.ts.map +0 -1
  84. package/lib/esm/ElementGeometryTool.js +0 -697
  85. package/lib/esm/ElementGeometryTool.js.map +0 -1
  86. package/lib/esm/ModifyCurveTools.d.ts +0 -140
  87. package/lib/esm/ModifyCurveTools.d.ts.map +0 -1
  88. package/lib/esm/ModifyCurveTools.js +0 -772
  89. package/lib/esm/ModifyCurveTools.js.map +0 -1
  90. package/lib/esm/SketchTools.d.ts +0 -308
  91. package/lib/esm/SketchTools.d.ts.map +0 -1
  92. package/lib/esm/SketchTools.js +0 -1704
  93. package/lib/esm/SketchTools.js.map +0 -1
  94. package/lib/esm/SolidModelingTools.d.ts +0 -381
  95. package/lib/esm/SolidModelingTools.d.ts.map +0 -1
  96. package/lib/esm/SolidModelingTools.js +0 -1445
  97. package/lib/esm/SolidModelingTools.js.map +0 -1
  98. package/lib/esm/SolidPrimitiveTools.d.ts +0 -322
  99. package/lib/esm/SolidPrimitiveTools.d.ts.map +0 -1
  100. package/lib/esm/SolidPrimitiveTools.js +0 -1372
  101. package/lib/esm/SolidPrimitiveTools.js.map +0 -1
@@ -4,15 +4,13 @@
4
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
5
  *--------------------------------------------------------------------------------------------*/
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.RotateElementsTool = exports.RotateAbout = exports.RotateMethod = exports.CopyElementsTool = exports.MoveElementsTool = exports.TransformElementsTool = exports.TransformGraphicsProvider = void 0;
7
+ exports.TransformElementsTool = exports.TransformGraphicsProvider = void 0;
8
8
  /** @packageDocumentation
9
9
  * @module Editing
10
10
  */
11
- const appui_abstract_1 = require("@itwin/appui-abstract");
12
11
  const core_bentley_1 = require("@itwin/core-bentley");
13
12
  const core_common_1 = require("@itwin/core-common");
14
13
  const core_frontend_1 = require("@itwin/core-frontend");
15
- const core_geometry_1 = require("@itwin/core-geometry");
16
14
  const editor_common_1 = require("@itwin/editor-common");
17
15
  const EditTool_1 = require("./EditTool");
18
16
  const EditToolIpc_1 = require("./EditToolIpc");
@@ -133,6 +131,20 @@ class TransformGraphicsProvider {
133
131
  }
134
132
  exports.TransformGraphicsProvider = TransformGraphicsProvider;
135
133
  /** Edit tool base class for applying a transform to element placements.
134
+ * Example of a tool that would translate elements:
135
+ * ```ts
136
+ * class SampleMoveElementsTool extends TransformElementsTool {
137
+ * public static override toolId = "SampleMoveElements";
138
+ * public static override iconSpec = "icon-move";
139
+ * protected calculateTransform(ev: BeButtonEvent): Transform | undefined {
140
+ * return (this.anchorPoint ? Transform.createTranslation(ev.point.minus(this.anchorPoint)) : undefined);
141
+ * }
142
+ * public async onRestartTool(): Promise<void> {
143
+ * const tool = new SampleMoveElementsTool();
144
+ * if (!await tool.run()) return this.exitTool();
145
+ * }
146
+ * }
147
+ * ```
136
148
  * @beta
137
149
  */
138
150
  class TransformElementsTool extends core_frontend_1.ElementSetTool {
@@ -248,413 +260,4 @@ class TransformElementsTool extends core_frontend_1.ElementSetTool {
248
260
  }
249
261
  }
250
262
  exports.TransformElementsTool = TransformElementsTool;
251
- /** @alpha Move elements by applying translation to placement. */
252
- class MoveElementsTool extends TransformElementsTool {
253
- calculateTransform(ev) {
254
- if (undefined === this.anchorPoint)
255
- return undefined;
256
- return core_geometry_1.Transform.createTranslation(ev.point.minus(this.anchorPoint));
257
- }
258
- provideToolAssistance(_mainInstrText, _additionalInstr) {
259
- let mainMsg;
260
- if (!this.isSelectByPoints && !this.wantAdditionalElements)
261
- mainMsg = core_frontend_1.CoreTools.translate(this.wantAdditionalInput ? "ElementSet.Prompts.StartPoint" : "ElementSet.Prompts.EndPoint");
262
- super.provideToolAssistance(mainMsg);
263
- }
264
- async onRestartTool() {
265
- const tool = new MoveElementsTool();
266
- if (!await tool.run())
267
- return this.exitTool();
268
- }
269
- }
270
- MoveElementsTool.toolId = "MoveElements";
271
- MoveElementsTool.iconSpec = "icon-move";
272
- exports.MoveElementsTool = MoveElementsTool;
273
- /** Create new elements with translation applied to placement.
274
- * This is a brute force implementation strictly for example and testing purposes.
275
- * The new elements are Generic:PhysicalObject or BisCore:DrawingGraphic using the model and category of original.
276
- * Does not preserve assemblies and geometric elements without geometry are not copied.
277
- * Using loadProps to return json format geometry to the frontend for each element in the tool agenda is very inefficient.
278
- * Applications that wish to support copy are expected to sub-class TransformElementsTool and register their
279
- * own EditCommand that can correctly copy their application elements.
280
- * @alpha
281
- */
282
- class CopyElementsTool extends MoveElementsTool {
283
- static get minArgs() { return 0; }
284
- static get maxArgs() { return 1; }
285
- get numCopiesProperty() {
286
- if (!this._numCopiesProperty)
287
- this._numCopiesProperty = new appui_abstract_1.DialogProperty(appui_abstract_1.PropertyDescriptionHelper.buildNumberEditorDescription("numCopies", EditTool_1.EditTools.translate("CopyElements.Label.NumCopies"), { type: appui_abstract_1.PropertyEditorParamTypes.Range, minimum: 1 }), 1);
288
- return this._numCopiesProperty;
289
- }
290
- get numCopies() { return this.numCopiesProperty.value; }
291
- set numCopies(value) { this.numCopiesProperty.value = value; }
292
- get wantMakeCopy() { return this.numCopies > 0; }
293
- updateAnchorLocation(transform) {
294
- // Account for additional copies for repeat operation anchor point...
295
- for (let iCopy = 0; iCopy < this.numCopies; ++iCopy)
296
- super.updateAnchorLocation(transform);
297
- }
298
- async doTransformedCopy(ids, transform, numCopies) {
299
- if (numCopies < 1 || 0 === ids.length)
300
- return undefined;
301
- this._startedCmd = await this.startCommand();
302
- const newIds = [];
303
- for (const id of ids) {
304
- // NOTE: For testing only. Using loadProps to return json format geometry to the frontend for each element in the tool agenda is very inefficient.
305
- const props = await this.iModel.elements.loadProps(id, { wantGeometry: true, wantBRepData: true });
306
- if (undefined === props.placement)
307
- continue;
308
- const placement = (0, core_common_1.isPlacement2dProps)(props.placement) ? core_common_1.Placement2d.fromJSON(props.placement) : core_common_1.Placement3d.fromJSON(props.placement);
309
- if (!placement.isValid)
310
- continue; // Ignore assembly parents w/o geometry, etc...
311
- const classFullName = (placement.is3d ? "Generic:PhysicalObject" : "BisCore:DrawingGraphic");
312
- const newProps = { classFullName, model: props.model, category: props.category, code: core_common_1.Code.createEmpty(), placement, geom: props.geom };
313
- let newId;
314
- for (let iCopy = 0; iCopy < numCopies; ++iCopy) {
315
- placement.multiplyTransform(transform);
316
- newId = await EditToolIpc_1.basicManipulationIpc.insertGeometricElement(newProps);
317
- }
318
- if (undefined !== newId)
319
- newIds.push(newId); // When numCopies > 1 ids are return for just the final copy...
320
- }
321
- return (0 === newIds.length ? undefined : newIds);
322
- }
323
- async transformAndCopyAgenda(transform) {
324
- try {
325
- const newIds = await this.doTransformedCopy(this.agenda.elements, transform, this.numCopies);
326
- if (undefined !== newIds)
327
- await this.saveChanges();
328
- return newIds;
329
- }
330
- catch (err) {
331
- core_frontend_1.IModelApp.notifications.outputMessage(new core_frontend_1.NotifyMessageDetails(core_frontend_1.OutputMessagePriority.Error, core_bentley_1.BentleyError.getErrorMessage(err) || "An unknown error occurred."));
332
- return undefined;
333
- }
334
- }
335
- async applyToolSettingPropertyChange(updatedValue) {
336
- // NOTE: Don't call changeToolSettingPropertyValue, value of numCopies should not be saved...
337
- if (updatedValue.propertyName !== this.numCopiesProperty.name || undefined === updatedValue.value.value)
338
- return false;
339
- this.numCopies = updatedValue.value.value;
340
- return true;
341
- }
342
- supplyToolSettingsProperties() {
343
- // NOTE: Don't call initializeToolSettingPropertyValues, value of numCopies is not saved...
344
- const toolSettings = new Array();
345
- toolSettings.push(this.numCopiesProperty.toDialogItem({ rowPriority: 1, columnIndex: 2 }));
346
- return toolSettings;
347
- }
348
- async onRestartTool() {
349
- const tool = new CopyElementsTool();
350
- tool.numCopies = this.numCopies; // Preserve numCopies on restart...
351
- if (!await tool.run())
352
- return this.exitTool();
353
- }
354
- /** The keyin takes the following arguments, all of which are optional:
355
- * - `numCopies=number` Number of copies of each element to create, default is 1.
356
- */
357
- async parseAndRun(...inputArgs) {
358
- for (const arg of inputArgs) {
359
- const parts = arg.split("=");
360
- if (2 !== parts.length)
361
- continue;
362
- if (parts[0].toLowerCase().startsWith("num")) {
363
- const copies = Number.parseInt(parts[1], 10);
364
- if (copies >= 1)
365
- this.numCopies = copies; // NOTE: Don't call saveToolSettingPropertyValue, always default to single copy...
366
- }
367
- }
368
- return this.run();
369
- }
370
- }
371
- CopyElementsTool.toolId = "CopyElements";
372
- CopyElementsTool.iconSpec = "icon-move"; // Need better icon...
373
- exports.CopyElementsTool = CopyElementsTool;
374
- /** @alpha */
375
- var RotateMethod;
376
- (function (RotateMethod) {
377
- RotateMethod[RotateMethod["By3Points"] = 0] = "By3Points";
378
- RotateMethod[RotateMethod["ByAngle"] = 1] = "ByAngle";
379
- })(RotateMethod = exports.RotateMethod || (exports.RotateMethod = {}));
380
- /** @alpha */
381
- var RotateAbout;
382
- (function (RotateAbout) {
383
- RotateAbout[RotateAbout["Point"] = 0] = "Point";
384
- RotateAbout[RotateAbout["Origin"] = 1] = "Origin";
385
- RotateAbout[RotateAbout["Center"] = 2] = "Center";
386
- })(RotateAbout = exports.RotateAbout || (exports.RotateAbout = {}));
387
- /** @alpha Rotate elements by applying transform to placement. */
388
- class RotateElementsTool extends TransformElementsTool {
389
- constructor() {
390
- super(...arguments);
391
- this.havePivotPoint = false;
392
- this.haveFinalPoint = false;
393
- }
394
- static get minArgs() { return 0; }
395
- static get maxArgs() { return 3; }
396
- static methodMessage(str) { return EditTool_1.EditTools.translate(`RotateElements.Method.${str}`); }
397
- get methodProperty() {
398
- if (!this._methodProperty)
399
- this._methodProperty = new appui_abstract_1.DialogProperty(appui_abstract_1.PropertyDescriptionHelper.buildEnumPicklistEditorDescription("rotateMethod", EditTool_1.EditTools.translate("RotateElements.Label.Method"), RotateElementsTool.getMethodChoices()), RotateMethod.By3Points);
400
- return this._methodProperty;
401
- }
402
- get rotateMethod() { return this.methodProperty.value; }
403
- set rotateMethod(method) { this.methodProperty.value = method; }
404
- static aboutMessage(str) { return EditTool_1.EditTools.translate(`RotateElements.About.${str}`); }
405
- get aboutProperty() {
406
- if (!this._aboutProperty)
407
- this._aboutProperty = new appui_abstract_1.DialogProperty(appui_abstract_1.PropertyDescriptionHelper.buildEnumPicklistEditorDescription("rotateAbout", EditTool_1.EditTools.translate("RotateElements.Label.About"), RotateElementsTool.getAboutChoices()), RotateAbout.Point);
408
- return this._aboutProperty;
409
- }
410
- get rotateAbout() { return this.aboutProperty.value; }
411
- set rotateAbout(method) { this.aboutProperty.value = method; }
412
- get angleProperty() {
413
- if (!this._angleProperty)
414
- this._angleProperty = new appui_abstract_1.DialogProperty(new core_frontend_1.AngleDescription("rotateAngle", EditTool_1.EditTools.translate("RotateElements.Label.Angle")), 0.0);
415
- return this._angleProperty;
416
- }
417
- get rotateAngle() { return this.angleProperty.value; }
418
- set rotateAngle(value) { this.angleProperty.value = value; }
419
- get requireAcceptForSelectionSetDynamics() { return RotateMethod.ByAngle !== this.rotateMethod; }
420
- calculateTransform(ev) {
421
- if (undefined === ev.viewport)
422
- return undefined;
423
- if (RotateMethod.ByAngle === this.rotateMethod) {
424
- const rotMatrix = core_frontend_1.AccuDrawHintBuilder.getCurrentRotation(ev.viewport, true, true);
425
- if (undefined === rotMatrix)
426
- return undefined;
427
- const invMatrix = rotMatrix.inverse();
428
- if (undefined === invMatrix)
429
- return undefined;
430
- const angMatrix = core_geometry_1.YawPitchRollAngles.createRadians(this.rotateAngle, 0, 0).toMatrix3d();
431
- if (undefined === angMatrix)
432
- return undefined;
433
- angMatrix.multiplyMatrixMatrix(invMatrix, invMatrix);
434
- rotMatrix.multiplyMatrixMatrix(invMatrix, rotMatrix);
435
- return core_geometry_1.Transform.createFixedPointAndMatrix(ev.point, rotMatrix);
436
- }
437
- if (undefined === this.anchorPoint || undefined === this.xAxisPoint)
438
- return undefined;
439
- const vec1 = core_geometry_1.Vector3d.createStartEnd(this.anchorPoint, this.xAxisPoint);
440
- const vec2 = core_geometry_1.Vector3d.createStartEnd(this.anchorPoint, ev.point);
441
- if (!vec1.normalizeInPlace() || !vec2.normalizeInPlace())
442
- return undefined;
443
- const dot = vec1.dotProduct(vec2);
444
- if (dot > (1.0 - core_geometry_1.Geometry.smallAngleRadians))
445
- return undefined;
446
- if (dot < (-1.0 + core_geometry_1.Geometry.smallAngleRadians)) {
447
- const rotMatrix = core_frontend_1.AccuDrawHintBuilder.getCurrentRotation(ev.viewport, true, true);
448
- if (undefined === rotMatrix)
449
- return undefined;
450
- const invMatrix = rotMatrix.inverse();
451
- if (undefined === invMatrix)
452
- return undefined;
453
- const angMatrix = core_geometry_1.YawPitchRollAngles.createRadians(Math.PI, 0, 0).toMatrix3d(); // 180 degree rotation...
454
- if (undefined === angMatrix)
455
- return undefined;
456
- angMatrix.multiplyMatrixMatrix(invMatrix, invMatrix);
457
- rotMatrix.multiplyMatrixMatrix(invMatrix, rotMatrix);
458
- return core_geometry_1.Transform.createFixedPointAndMatrix(this.anchorPoint, rotMatrix);
459
- }
460
- const zVec = vec1.unitCrossProduct(vec2);
461
- if (undefined === zVec)
462
- return undefined;
463
- const yVec = zVec.unitCrossProduct(vec1);
464
- if (undefined === yVec)
465
- return undefined;
466
- const matrix1 = core_geometry_1.Matrix3d.createRows(vec1, yVec, zVec);
467
- zVec.unitCrossProduct(vec2, yVec);
468
- const matrix2 = core_geometry_1.Matrix3d.createColumns(vec2, yVec, zVec);
469
- const matrix = matrix2.multiplyMatrixMatrix(matrix1);
470
- if (undefined === matrix)
471
- return undefined;
472
- return core_geometry_1.Transform.createFixedPointAndMatrix(this.anchorPoint, matrix);
473
- }
474
- transformAgendaDynamics(transform, context) {
475
- if (RotateAbout.Point === this.rotateAbout)
476
- return super.transformAgendaDynamics(transform, context);
477
- if (undefined === this._graphicsProvider)
478
- return;
479
- const rotatePoint = core_geometry_1.Point3d.create();
480
- for (const data of this._graphicsProvider.data) {
481
- if (RotateAbout.Origin === this.rotateAbout)
482
- rotatePoint.setFrom(data.placement.origin);
483
- else
484
- rotatePoint.setFrom(data.placement.calculateRange().center);
485
- const rotateTrans = core_geometry_1.Transform.createFixedPointAndMatrix(rotatePoint, transform.matrix);
486
- this._graphicsProvider.addSingleGraphic(data.graphic, rotateTrans, context);
487
- }
488
- }
489
- async transformAgenda(transform) {
490
- if (RotateAbout.Point === this.rotateAbout)
491
- return super.transformAgenda(transform);
492
- try {
493
- this._startedCmd = await this.startCommand();
494
- if (core_common_1.IModelStatus.Success === await EditToolIpc_1.basicManipulationIpc.rotatePlacement(this.agenda.compressIds(), transform.matrix.toJSON(), RotateAbout.Center === this.rotateAbout))
495
- await this.saveChanges();
496
- }
497
- catch (err) {
498
- core_frontend_1.IModelApp.notifications.outputMessage(new core_frontend_1.NotifyMessageDetails(core_frontend_1.OutputMessagePriority.Error, core_bentley_1.BentleyError.getErrorMessage(err) || "An unknown error occurred."));
499
- }
500
- }
501
- onDynamicFrame(ev, context) {
502
- const transform = this.calculateTransform(ev);
503
- if (undefined !== transform)
504
- return this.transformAgendaDynamics(transform, context);
505
- if (undefined === this.anchorPoint)
506
- return;
507
- const builder = context.createGraphic({ type: core_frontend_1.GraphicType.WorldOverlay });
508
- builder.setSymbology(context.viewport.getContrastToBackgroundColor(), core_common_1.ColorDef.black, 1, core_common_1.LinePixels.Code2);
509
- builder.addLineString([this.anchorPoint.clone(), ev.point.clone()]);
510
- context.addGraphic(builder.finish());
511
- }
512
- get wantAdditionalInput() {
513
- if (RotateMethod.ByAngle === this.rotateMethod)
514
- return super.wantAdditionalInput;
515
- return !this.haveFinalPoint;
516
- }
517
- wantProcessAgenda(ev) {
518
- if (RotateMethod.ByAngle === this.rotateMethod)
519
- return super.wantProcessAgenda(ev);
520
- if (!this.havePivotPoint)
521
- this.havePivotPoint = true; // Uses anchorPoint...
522
- else if (undefined === this.xAxisPoint)
523
- this.xAxisPoint = ev.point.clone();
524
- else if (!this.haveFinalPoint)
525
- this.haveFinalPoint = true; // Uses button event...
526
- return super.wantProcessAgenda(ev);
527
- }
528
- setupAndPromptForNextAction() {
529
- super.setupAndPromptForNextAction();
530
- if (RotateMethod.ByAngle === this.rotateMethod)
531
- return;
532
- if (undefined === this.anchorPoint || undefined === this.xAxisPoint)
533
- return;
534
- const hints = new core_frontend_1.AccuDrawHintBuilder();
535
- hints.setXAxis(core_geometry_1.Vector3d.createStartEnd(this.anchorPoint, this.xAxisPoint));
536
- hints.setOrigin(this.anchorPoint);
537
- hints.setModePolar();
538
- hints.sendHints();
539
- }
540
- provideToolAssistance(_mainInstrText, _additionalInstr) {
541
- let mainMsg;
542
- if (RotateMethod.ByAngle === this.rotateMethod) {
543
- if (!this.isSelectByPoints && !this.wantAdditionalElements && this.wantAdditionalInput)
544
- mainMsg = EditTool_1.EditTools.translate("RotateElements.Prompts.IdentifyPoint");
545
- }
546
- else {
547
- if (!this.isSelectByPoints && !this.wantAdditionalElements) {
548
- if (!this.havePivotPoint)
549
- mainMsg = EditTool_1.EditTools.translate("RotateElements.Prompts.IdentifyPoint");
550
- else if (undefined === this.xAxisPoint)
551
- mainMsg = EditTool_1.EditTools.translate("RotateElements.Prompts.DefineStart");
552
- else
553
- mainMsg = EditTool_1.EditTools.translate("RotateElements.Prompts.DefineAmount");
554
- }
555
- }
556
- super.provideToolAssistance(mainMsg);
557
- }
558
- async applyToolSettingPropertyChange(updatedValue) {
559
- if (!this.changeToolSettingPropertyValue(updatedValue))
560
- return false;
561
- if (this.methodProperty.name === updatedValue.propertyName)
562
- await this.onRestartTool(); // calling restart, not reinitialize to not exit tool for selection set...
563
- return true;
564
- }
565
- supplyToolSettingsProperties() {
566
- const toolSettings = new Array();
567
- toolSettings.push(this.methodProperty.toDialogItem({ rowPriority: 1, columnIndex: 2 }));
568
- toolSettings.push(this.aboutProperty.toDialogItem({ rowPriority: 2, columnIndex: 2 }));
569
- if (RotateMethod.ByAngle === this.rotateMethod)
570
- toolSettings.push(this.angleProperty.toDialogItem({ rowPriority: 3, columnIndex: 2 }));
571
- return toolSettings;
572
- }
573
- async onRestartTool() {
574
- const tool = new RotateElementsTool();
575
- if (!await tool.run())
576
- return this.exitTool();
577
- }
578
- async onInstall() {
579
- if (!await super.onInstall())
580
- return false;
581
- // Setup initial values here instead of supplyToolSettingsProperties to support keyin args w/o appui-react...
582
- this.initializeToolSettingPropertyValues([this.methodProperty, this.aboutProperty, this.angleProperty]);
583
- return true;
584
- }
585
- /** The keyin takes the following arguments, all of which are optional:
586
- * - `method=0|1` How rotate angle will be specified. 0 for by 3 points, 1 for by specified angle.
587
- * - `about=0|1|2` Location to rotate about. 0 for point, 1 for placement origin, and 2 for center of range.
588
- * - `angle=number` Rotation angle in degrees when not defining angle by points.
589
- */
590
- async parseAndRun(...inputArgs) {
591
- let rotateMethod;
592
- let rotateAbout;
593
- let rotateAngle;
594
- for (const arg of inputArgs) {
595
- const parts = arg.split("=");
596
- if (2 !== parts.length)
597
- continue;
598
- if (parts[0].toLowerCase().startsWith("me")) {
599
- const method = Number.parseInt(parts[1], 10);
600
- if (!Number.isNaN(method)) {
601
- switch (method) {
602
- case 0:
603
- rotateMethod = RotateMethod.By3Points;
604
- break;
605
- case 1:
606
- rotateMethod = RotateMethod.ByAngle;
607
- break;
608
- }
609
- }
610
- }
611
- else if (parts[0].toLowerCase().startsWith("ab")) {
612
- const about = Number.parseInt(parts[1], 10);
613
- if (!Number.isNaN(about)) {
614
- switch (about) {
615
- case 0:
616
- rotateAbout = RotateAbout.Point;
617
- break;
618
- case 1:
619
- rotateAbout = RotateAbout.Origin;
620
- break;
621
- case 2:
622
- rotateAbout = RotateAbout.Center;
623
- break;
624
- }
625
- }
626
- }
627
- else if (parts[0].toLowerCase().startsWith("an")) {
628
- const angle = Number.parseFloat(parts[1]);
629
- if (!Number.isNaN(angle)) {
630
- rotateAngle = core_geometry_1.Angle.createDegrees(angle).radians;
631
- }
632
- }
633
- }
634
- // Update current session values so keyin args are picked up for tool settings/restart...
635
- if (undefined !== rotateMethod)
636
- this.saveToolSettingPropertyValue(this.methodProperty, { value: rotateMethod });
637
- if (undefined !== rotateAbout)
638
- this.saveToolSettingPropertyValue(this.aboutProperty, { value: rotateAbout });
639
- if (undefined !== rotateAngle)
640
- this.saveToolSettingPropertyValue(this.angleProperty, { value: rotateAngle });
641
- return this.run();
642
- }
643
- }
644
- RotateElementsTool.toolId = "RotateElements";
645
- RotateElementsTool.iconSpec = "icon-rotate";
646
- RotateElementsTool.getMethodChoices = () => {
647
- return [
648
- { label: RotateElementsTool.methodMessage("3Points"), value: RotateMethod.By3Points },
649
- { label: RotateElementsTool.methodMessage("Angle"), value: RotateMethod.ByAngle },
650
- ];
651
- };
652
- RotateElementsTool.getAboutChoices = () => {
653
- return [
654
- { label: RotateElementsTool.aboutMessage("Point"), value: RotateAbout.Point },
655
- { label: RotateElementsTool.aboutMessage("Origin"), value: RotateAbout.Origin },
656
- { label: RotateElementsTool.aboutMessage("Center"), value: RotateAbout.Center },
657
- ];
658
- };
659
- exports.RotateElementsTool = RotateElementsTool;
660
263
  //# sourceMappingURL=TransformElementsTool.js.map
@@ -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\n/** @packageDocumentation\r\n * @module Editing\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/** Geometric element id, placement, and RenderGraphic managed by [[TransformGraphicsProvider]].\r\n * @beta\r\n */\r\nexport interface TransformGraphicsData {\r\n id: Id64String;\r\n placement: Placement;\r\n graphic: RenderGraphicOwner;\r\n}\r\n\r\n/** A class for creating and managing RenderGraphics representing geometric elements for the purpose of interactive tool dynamics.\r\n * @beta\r\n */\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/** Edit tool base class for applying a transform to element placements.\r\n * @beta\r\n */\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":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Editing\n */\n\nimport { BentleyError, Id64, Id64Arg, Id64String } from \"@itwin/core-bentley\";\nimport { GeometricElementProps, IModelStatus, isPlacement2dProps, PersistentGraphicsRequestProps, Placement, Placement2d, Placement3d } from \"@itwin/core-common\";\nimport { AccuDrawHintBuilder, BeButtonEvent, DynamicsContext, ElementSetTool, GraphicBranch, IModelApp, IModelConnection, IpcApp, ModifyElementSource, NotifyMessageDetails, OutputMessagePriority, readElementGraphics, RenderGraphic, RenderGraphicOwner } from \"@itwin/core-frontend\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { editorBuiltInCmdIds } from \"@itwin/editor-common\";\nimport { EditTools } from \"./EditTool\";\nimport { basicManipulationIpc } from \"./EditToolIpc\";\n\n/** Geometric element id, placement, and RenderGraphic managed by [[TransformGraphicsProvider]].\n * @beta\n */\nexport interface TransformGraphicsData {\n id: Id64String;\n placement: Placement;\n graphic: RenderGraphicOwner;\n}\n\n/** A class for creating and managing RenderGraphics representing geometric elements for the purpose of interactive tool dynamics.\n * @beta\n */\nexport class TransformGraphicsProvider {\n public readonly iModel: IModelConnection;\n public readonly data: TransformGraphicsData[];\n public readonly pending: Map<Id64String, string>;\n public readonly prefix: string;\n /** Chord tolerance to use to stroke the element's geometry in meters. */\n public chordTolerance = 0.01;\n\n constructor(iModel: IModelConnection, prefix: string) {\n this.iModel = iModel;\n this.prefix = prefix;\n this.data = new Array<TransformGraphicsData>();\n this.pending = new Map<Id64String, string>();\n }\n\n private getRequestId(id: Id64String): string { return `${this.prefix}-${id}`; }\n private getToleranceLog10(): number { return Math.floor(Math.log10(this.chordTolerance)); }\n\n private async createRequest(id: Id64String): Promise<TransformGraphicsData | undefined> {\n const elementProps = (await this.iModel.elements.getProps(id)) as GeometricElementProps[];\n if (0 === elementProps.length)\n return;\n\n const placementProps = elementProps[0].placement;\n if (undefined === placementProps)\n return;\n\n const placement = isPlacement2dProps(placementProps) ? Placement2d.fromJSON(placementProps) : Placement3d.fromJSON(placementProps);\n if (!placement.isValid)\n return; // Ignore assembly parents w/o geometry, etc...\n\n const requestProps: PersistentGraphicsRequestProps = {\n id: this.getRequestId(id),\n elementId: id,\n toleranceLog10: this.getToleranceLog10(),\n };\n\n this.pending.set(id, requestProps.id); // keep track of requests so they can be cancelled...\n\n const graphicData = await IModelApp.tileAdmin.requestElementGraphics(this.iModel, requestProps);\n if (undefined === graphicData)\n return;\n\n const graphic = await readElementGraphics(graphicData, this.iModel, elementProps[0].model, placement.is3d, { noFlash: true, noHilite: true });\n if (undefined === graphic)\n return;\n\n return { id, placement, graphic: IModelApp.renderSystem.createGraphicOwner(graphic) };\n }\n\n private disposeOfGraphics(): void {\n this.data.forEach((data) => {\n data.graphic.disposeGraphic();\n });\n\n this.data.length = 0;\n }\n\n private async cancelPendingRequests(): Promise<void> {\n const requests = new Array<string>();\n for (const [_key, id] of this.pending)\n requests.push(id);\n\n this.pending.clear();\n if (0 === requests.length)\n return;\n\n return IpcApp.appFunctionIpc.cancelElementGraphicsRequests(this.iModel.key, requests);\n }\n\n /** Call to request a RenderGraphic for the supplied element id.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public async createSingleGraphic(id: Id64String): Promise<boolean> {\n try {\n const info = await this.createRequest(id);\n\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined === info?.graphic)\n return false;\n\n this.data.push(info);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Call to request RenderGraphics for the supplied element ids. Does not wait for results as\n * generating graphics for a large number of elements can take time. Instead an array of [[RenderGraphicOwner]]\n * is populated as requests are resolved and the current dynamics frame displays what is available.\n * @see [[cleanupGraphics]] Must be called when the tool exits.\n */\n public createGraphics(elements: Id64Arg): void {\n if (0 === Id64.sizeOf(elements))\n return;\n\n try {\n for (const id of Id64.iterable(elements)) {\n const promise = this.createRequest(id);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n promise.then((info) => {\n if (undefined !== info?.id)\n this.pending.delete(info.id);\n\n if (undefined !== info?.graphic)\n this.data.push(info);\n });\n }\n } catch { }\n }\n\n /** Call to dispose of [[RenderGraphic]] held by [[RenderGraphicOwner]] and cancel requests that are still pending.\n * @note Must be called when the tool exits to avoid leaks of graphics memory or other webgl resources.\n */\n public async cleanupGraphics(): Promise<void> {\n await this.cancelPendingRequests();\n this.disposeOfGraphics();\n }\n\n public addSingleGraphic(graphic: RenderGraphic, transform: Transform, context: DynamicsContext): void {\n const branch = new GraphicBranch(false);\n branch.add(graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n\n public addGraphics(transform: Transform, context: DynamicsContext): void {\n if (0 === this.data.length)\n return;\n\n const branch = new GraphicBranch(false);\n for (const data of this.data)\n branch.add(data.graphic);\n\n const branchGraphic = context.createBranch(branch, transform);\n context.addGraphic(branchGraphic);\n }\n}\n\n/** Edit tool base class for applying a transform to element placements.\n * Example of a tool that would translate elements:\n * ```ts\n * class SampleMoveElementsTool extends TransformElementsTool {\n * public static override toolId = \"SampleMoveElements\";\n * public static override iconSpec = \"icon-move\";\n * protected calculateTransform(ev: BeButtonEvent): Transform | undefined {\n * return (this.anchorPoint ? Transform.createTranslation(ev.point.minus(this.anchorPoint)) : undefined);\n * }\n * public async onRestartTool(): Promise<void> {\n * const tool = new SampleMoveElementsTool();\n * if (!await tool.run()) return this.exitTool();\n * }\n * }\n * ```\n * @beta\n */\nexport abstract class TransformElementsTool extends ElementSetTool {\n protected override get allowSelectionSet(): boolean { return true; }\n protected override get allowGroups(): boolean { return true; }\n protected override get allowDragSelect(): boolean { return true; }\n protected override get controlKeyContinuesSelection(): boolean { return true; }\n protected override get wantAccuSnap(): boolean { return true; }\n protected override get wantDynamics(): boolean { return true; }\n protected get wantMakeCopy(): boolean { return false; }\n protected get wantRepeatOperation(): boolean { return this.wantMakeCopy && !this.agenda.isEmpty; }\n protected _graphicsProvider?: TransformGraphicsProvider;\n protected _startedCmd?: string;\n\n protected abstract calculateTransform(ev: BeButtonEvent): Transform | undefined;\n\n protected async createAgendaGraphics(changed: boolean): Promise<void> {\n if (changed) {\n if (undefined === this._graphicsProvider)\n return; // Not yet needed...\n } else {\n if (undefined !== this._graphicsProvider)\n return; // Use existing graphics...\n }\n\n if (undefined === this._graphicsProvider)\n this._graphicsProvider = new TransformGraphicsProvider(this.iModel, this.toolId);\n else\n await this._graphicsProvider.cleanupGraphics();\n\n if (1 === this.agenda.length) {\n await this._graphicsProvider.createSingleGraphic(this.agenda.elements[0]);\n return;\n }\n\n this._graphicsProvider.createGraphics(this.agenda.elements);\n }\n\n protected async clearAgendaGraphics(): Promise<void> {\n if (undefined === this._graphicsProvider)\n return;\n await this._graphicsProvider.cleanupGraphics();\n this._graphicsProvider = undefined;\n }\n\n protected override async onAgendaModified(): Promise<void> {\n await this.createAgendaGraphics(true);\n }\n\n protected override async initAgendaDynamics(): Promise<boolean> {\n await this.createAgendaGraphics(false);\n return super.initAgendaDynamics();\n }\n\n protected transformAgendaDynamics(transform: Transform, context: DynamicsContext): void {\n if (undefined !== this._graphicsProvider)\n this._graphicsProvider.addGraphics(transform, context);\n }\n\n public override onDynamicFrame(ev: BeButtonEvent, context: DynamicsContext): void {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n this.transformAgendaDynamics(transform, context);\n }\n\n protected updateAnchorLocation(transform: Transform): void {\n // Update anchor point to support creating additional copies (repeat vs. restart)...\n if (undefined === this.anchorPoint)\n return;\n\n transform.multiplyPoint3d(this.anchorPoint, this.anchorPoint);\n\n const hints = new AccuDrawHintBuilder();\n hints.setOrigin(this.anchorPoint);\n hints.sendHints();\n }\n\n protected async startCommand(): Promise<string> {\n if (undefined !== this._startedCmd)\n return this._startedCmd;\n return EditTools.startCommand<string>({ commandId: editorBuiltInCmdIds.cmdBasicManipulation, iModelKey: this.iModel.key });\n }\n\n protected async replaceAgenda(newIds: Id64Arg | undefined): Promise<void> {\n this.agenda.clear();\n\n if (undefined !== newIds)\n this.agenda.add(newIds);\n\n if (this.isSelectionSetModify) {\n if (this.agenda.isEmpty)\n this.iModel.selectionSet.emptyAll();\n else\n this.iModel.selectionSet.replace(this.agenda.elements);\n\n this.agenda.setSource(ModifyElementSource.SelectionSet);\n this.setPreferredElementSource(); // Update \"use selection set\" flag...\n }\n\n return this.onAgendaModified();\n }\n\n protected async transformAndCopyAgenda(_transform: Transform): Promise<Id64Arg | undefined> {\n return undefined;\n }\n\n protected async transformAgenda(transform: Transform): Promise<void> {\n try {\n this._startedCmd = await this.startCommand();\n if (IModelStatus.Success === await basicManipulationIpc.transformPlacement(this.agenda.compressIds(), transform.toJSON()))\n await this.saveChanges();\n } catch (err) {\n IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Error, BentleyError.getErrorMessage(err) || \"An unknown error occurred.\"));\n }\n }\n\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\n const transform = this.calculateTransform(ev);\n if (undefined === transform)\n return;\n\n if (this.wantMakeCopy)\n await this.replaceAgenda(await this.transformAndCopyAgenda(transform));\n else\n await this.transformAgenda(transform);\n\n this.updateAnchorLocation(transform);\n }\n\n public override async onProcessComplete(): Promise<void> {\n if (this.wantRepeatOperation)\n return; // Continue with current agenda instead of restarting (ex. create additional copies)\n return super.onProcessComplete();\n }\n\n public override async onCleanup() {\n await this.clearAgendaGraphics();\n return super.onCleanup();\n }\n}\n\n"]}