@itwin/editor-frontend 3.7.17 → 3.8.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 (93) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/cjs/CreateElementTool.d.ts +100 -100
  3. package/lib/cjs/CreateElementTool.js +327 -327
  4. package/lib/cjs/CreateElementTool.js.map +1 -1
  5. package/lib/cjs/DeleteElementsTool.d.ts +13 -13
  6. package/lib/cjs/DeleteElementsTool.js +38 -38
  7. package/lib/cjs/DeleteElementsTool.js.map +1 -1
  8. package/lib/cjs/EditTool.d.ts +38 -38
  9. package/lib/cjs/EditTool.js +81 -81
  10. package/lib/cjs/EditTool.js.map +1 -1
  11. package/lib/cjs/EditToolIpc.d.ts +18 -18
  12. package/lib/cjs/EditToolIpc.js +28 -28
  13. package/lib/cjs/EditToolIpc.js.map +1 -1
  14. package/lib/cjs/ElementGeometryTool.d.ts +147 -147
  15. package/lib/cjs/ElementGeometryTool.js +709 -709
  16. package/lib/cjs/ElementGeometryTool.js.map +1 -1
  17. package/lib/cjs/ModifyCurveTools.d.ts +139 -139
  18. package/lib/cjs/ModifyCurveTools.js +784 -784
  19. package/lib/cjs/ModifyCurveTools.js.map +1 -1
  20. package/lib/cjs/ModifyElementTool.d.ts +47 -47
  21. package/lib/cjs/ModifyElementTool.js +177 -177
  22. package/lib/cjs/ModifyElementTool.js.map +1 -1
  23. package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.d.ts +135 -135
  24. package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.js +822 -822
  25. package/lib/cjs/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
  26. package/lib/cjs/ProjectLocation/ProjectGeolocation.d.ts +135 -135
  27. package/lib/cjs/ProjectLocation/ProjectGeolocation.js +532 -532
  28. package/lib/cjs/ProjectLocation/ProjectGeolocation.js.map +1 -1
  29. package/lib/cjs/SketchTools.d.ts +304 -304
  30. package/lib/cjs/SketchTools.js +1705 -1705
  31. package/lib/cjs/SketchTools.js.map +1 -1
  32. package/lib/cjs/SolidModelingTools.d.ts +380 -380
  33. package/lib/cjs/SolidModelingTools.js +1462 -1462
  34. package/lib/cjs/SolidModelingTools.js.map +1 -1
  35. package/lib/cjs/SolidPrimitiveTools.d.ts +318 -318
  36. package/lib/cjs/SolidPrimitiveTools.js +1378 -1378
  37. package/lib/cjs/SolidPrimitiveTools.js.map +1 -1
  38. package/lib/cjs/TransformElementsTool.d.ts +164 -164
  39. package/lib/cjs/TransformElementsTool.js +652 -652
  40. package/lib/cjs/TransformElementsTool.js.map +1 -1
  41. package/lib/cjs/UndoRedoTool.d.ts +16 -16
  42. package/lib/cjs/UndoRedoTool.js +42 -42
  43. package/lib/cjs/UndoRedoTool.js.map +1 -1
  44. package/lib/cjs/editor-frontend.d.ts +17 -17
  45. package/lib/cjs/editor-frontend.js +33 -33
  46. package/lib/cjs/editor-frontend.js.map +1 -1
  47. package/lib/esm/CreateElementTool.d.ts +100 -100
  48. package/lib/esm/CreateElementTool.js +319 -319
  49. package/lib/esm/CreateElementTool.js.map +1 -1
  50. package/lib/esm/DeleteElementsTool.d.ts +13 -13
  51. package/lib/esm/DeleteElementsTool.js +34 -34
  52. package/lib/esm/DeleteElementsTool.js.map +1 -1
  53. package/lib/esm/EditTool.d.ts +38 -38
  54. package/lib/esm/EditTool.js +77 -77
  55. package/lib/esm/EditTool.js.map +1 -1
  56. package/lib/esm/EditToolIpc.d.ts +18 -18
  57. package/lib/esm/EditToolIpc.js +24 -24
  58. package/lib/esm/EditToolIpc.js.map +1 -1
  59. package/lib/esm/ElementGeometryTool.d.ts +147 -147
  60. package/lib/esm/ElementGeometryTool.js +701 -701
  61. package/lib/esm/ElementGeometryTool.js.map +1 -1
  62. package/lib/esm/ModifyCurveTools.d.ts +139 -139
  63. package/lib/esm/ModifyCurveTools.js +775 -775
  64. package/lib/esm/ModifyCurveTools.js.map +1 -1
  65. package/lib/esm/ModifyElementTool.d.ts +47 -47
  66. package/lib/esm/ModifyElementTool.js +172 -172
  67. package/lib/esm/ModifyElementTool.js.map +1 -1
  68. package/lib/esm/ProjectLocation/ProjectExtentsDecoration.d.ts +135 -135
  69. package/lib/esm/ProjectLocation/ProjectExtentsDecoration.js +814 -814
  70. package/lib/esm/ProjectLocation/ProjectExtentsDecoration.js.map +1 -1
  71. package/lib/esm/ProjectLocation/ProjectGeolocation.d.ts +135 -135
  72. package/lib/esm/ProjectLocation/ProjectGeolocation.js +526 -526
  73. package/lib/esm/ProjectLocation/ProjectGeolocation.js.map +1 -1
  74. package/lib/esm/SketchTools.d.ts +304 -304
  75. package/lib/esm/SketchTools.js +1695 -1695
  76. package/lib/esm/SketchTools.js.map +1 -1
  77. package/lib/esm/SolidModelingTools.d.ts +380 -380
  78. package/lib/esm/SolidModelingTools.js +1437 -1437
  79. package/lib/esm/SolidModelingTools.js.map +1 -1
  80. package/lib/esm/SolidPrimitiveTools.d.ts +318 -318
  81. package/lib/esm/SolidPrimitiveTools.js +1367 -1367
  82. package/lib/esm/SolidPrimitiveTools.js.map +1 -1
  83. package/lib/esm/TransformElementsTool.d.ts +164 -164
  84. package/lib/esm/TransformElementsTool.js +644 -644
  85. package/lib/esm/TransformElementsTool.js.map +1 -1
  86. package/lib/esm/UndoRedoTool.d.ts +16 -16
  87. package/lib/esm/UndoRedoTool.js +36 -36
  88. package/lib/esm/UndoRedoTool.js.map +1 -1
  89. package/lib/esm/editor-frontend.d.ts +17 -17
  90. package/lib/esm/editor-frontend.js +21 -21
  91. package/lib/esm/editor-frontend.js.map +1 -1
  92. package/lib/public/locales/en/Editor.json +490 -490
  93. package/package.json +15 -15
@@ -1,173 +1,173 @@
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 { Id64 } from "@itwin/core-bentley";
6
- import { FeatureAppearance } from "@itwin/core-common";
7
- import { ElementSetTool, IModelApp } from "@itwin/core-frontend";
8
- import { computeChordToleranceFromPoint, DynamicGraphicsProvider } from "./CreateElementTool";
9
- /** @alpha Edit tool base class for updating existing elements. */
10
- export class ModifyElementTool extends ElementSetTool {
11
- constructor() {
12
- super(...arguments);
13
- this._checkedIds = new Map();
14
- }
15
- allowView(_vp) { return true; }
16
- isCompatibleViewport(vp, isSelectedViewChange) { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }
17
- onGeometryFilterChanged() { this._checkedIds.clear(); }
18
- async doAcceptElementForOperation(_id) { return false; }
19
- async acceptElementForOperation(id) {
20
- if (Id64.isInvalid(id) || Id64.isTransient(id))
21
- return false;
22
- let accept = this._checkedIds.get(id);
23
- if (undefined === accept) {
24
- if (this.agenda.isEmpty && this._checkedIds.size > 1000)
25
- this._checkedIds.clear(); // Limit auto-locate cache size to something reasonable...
26
- accept = await this.doAcceptElementForOperation(id);
27
- this._checkedIds.set(id, accept);
28
- }
29
- return accept;
30
- }
31
- async isElementValidForOperation(hit, out) {
32
- if (!await super.isElementValidForOperation(hit, out))
33
- return false;
34
- return this.acceptElementForOperation(hit.sourceId);
35
- }
36
- async postFilterIds(arg) {
37
- const ids = [];
38
- for (const id of Id64.iterable(arg)) {
39
- if (await this.acceptElementForOperation(id))
40
- ids.push(id);
41
- }
42
- return ids;
43
- }
44
- async getGroupIds(id) {
45
- return this.postFilterIds(await super.getGroupIds(id));
46
- }
47
- async getSelectionSetCandidates(ss) {
48
- return this.postFilterIds(await super.getSelectionSetCandidates(ss));
49
- }
50
- async getDragSelectCandidates(vp, origin, corner, method, overlap) {
51
- return this.postFilterIds(await super.getDragSelectCandidates(vp, origin, corner, method, overlap));
52
- }
53
- setupAccuDraw() { }
54
- setupAndPromptForNextAction() {
55
- this.setupAccuDraw();
56
- super.setupAndPromptForNextAction();
57
- }
58
- async doUpdateElement(_props) { return false; }
59
- async applyAgendaOperation(ev) {
60
- const geometry = this.getGeometryProps(ev, true);
61
- if (undefined === geometry)
62
- return false;
63
- const elemProps = this.getElementProps(ev);
64
- if (undefined === elemProps)
65
- return false;
66
- if ("flatbuffer" === geometry.format)
67
- elemProps.elementGeometryBuilderParams = { entryArray: geometry.data };
68
- else
69
- elemProps.geom = geometry.data;
70
- return this.doUpdateElement(elemProps);
71
- }
72
- async processAgenda(ev) {
73
- if (await this.applyAgendaOperation(ev))
74
- return this.saveChanges();
75
- }
76
- }
77
- /** @alpha Edit tool base class for updating existing elements that use dynamics to show intermediate results. */
78
- export class ModifyElementWithDynamicsTool extends ModifyElementTool {
79
- constructor() {
80
- super(...arguments);
81
- this._firstResult = true;
82
- }
83
- get wantAccuSnap() { return true; }
84
- get wantDynamics() { return true; }
85
- agendaAppearance(isDynamics) {
86
- if (isDynamics) {
87
- if (undefined === this._agendaAppearanceDynamic)
88
- this._agendaAppearanceDynamic = FeatureAppearance.fromTransparency(0.0);
89
- return this._agendaAppearanceDynamic;
90
- }
91
- if (undefined === this._agendaAppearanceDefault)
92
- this._agendaAppearanceDefault = FeatureAppearance.fromTransparency(0.9);
93
- return this._agendaAppearanceDefault;
94
- }
95
- get wantAgendaAppearanceOverride() { return false; }
96
- addFeatureOverrides(overrides, _vp) {
97
- if (this.agenda.isEmpty)
98
- return;
99
- const appearance = this.agendaAppearance(false);
100
- this.agenda.elements.forEach((elementId) => overrides.override({ elementId, appearance }));
101
- }
102
- updateAgendaAppearanceProvider(drop) {
103
- if (!this.wantAgendaAppearanceOverride)
104
- return;
105
- for (const vp of IModelApp.viewManager) {
106
- if (!this.allowView(vp))
107
- continue;
108
- if (drop || this.agenda.isEmpty)
109
- vp.dropFeatureOverrideProvider(this);
110
- else if (!vp.addFeatureOverrideProvider(this))
111
- vp.setFeatureOverrideProviderChanged();
112
- }
113
- }
114
- clearGraphics() {
115
- if (undefined === this._graphicsProvider)
116
- return;
117
- this._graphicsProvider.cleanupGraphic();
118
- this._graphicsProvider = undefined;
119
- }
120
- async createGraphics(ev) {
121
- if (!IModelApp.viewManager.inDynamicsMode)
122
- return; // Don't need to create graphic if dynamics aren't yet active...
123
- const geometry = this.getGeometryProps(ev, false);
124
- if (undefined === geometry) {
125
- this.clearGraphics();
126
- return;
127
- }
128
- const elemProps = this.getElementProps(ev);
129
- if (undefined === (elemProps === null || elemProps === void 0 ? void 0 : elemProps.placement)) {
130
- this.clearGraphics();
131
- return;
132
- }
133
- if (undefined === this._graphicsProvider) {
134
- if (this._firstResult) {
135
- this.updateAgendaAppearanceProvider();
136
- this._firstResult = false;
137
- }
138
- this._graphicsProvider = new DynamicGraphicsProvider(this.iModel, this.toolId);
139
- }
140
- // Set chord tolerance for non-linear/non-planar geometry...
141
- if (ev.viewport)
142
- this._graphicsProvider.chordTolerance = computeChordToleranceFromPoint(ev.viewport, ev.point);
143
- await this._graphicsProvider.createGraphic(elemProps.category, elemProps.placement, geometry);
144
- }
145
- onDynamicFrame(_ev, context) {
146
- if (undefined !== this._graphicsProvider)
147
- this._graphicsProvider.addGraphic(context);
148
- }
149
- async onMouseMotion(ev) {
150
- return this.createGraphics(ev);
151
- }
152
- async onUnsuspend() {
153
- if (!this._firstResult)
154
- this.updateAgendaAppearanceProvider();
155
- return super.onUnsuspend();
156
- }
157
- async onSuspend() {
158
- if (!this._firstResult)
159
- this.updateAgendaAppearanceProvider(true);
160
- return super.onSuspend();
161
- }
162
- async onPostInstall() {
163
- await super.onPostInstall();
164
- if (this.wantAgendaAppearanceOverride)
165
- this.agenda.manageHiliteState = false;
166
- }
167
- async onCleanup() {
168
- this.clearGraphics();
169
- this.updateAgendaAppearanceProvider(true);
170
- return super.onCleanup();
171
- }
172
- }
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 { Id64 } from "@itwin/core-bentley";
6
+ import { FeatureAppearance } from "@itwin/core-common";
7
+ import { ElementSetTool, IModelApp } from "@itwin/core-frontend";
8
+ import { computeChordToleranceFromPoint, DynamicGraphicsProvider } from "./CreateElementTool";
9
+ /** @alpha Edit tool base class for updating existing elements. */
10
+ export class ModifyElementTool extends ElementSetTool {
11
+ constructor() {
12
+ super(...arguments);
13
+ this._checkedIds = new Map();
14
+ }
15
+ allowView(_vp) { return true; }
16
+ isCompatibleViewport(vp, isSelectedViewChange) { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }
17
+ onGeometryFilterChanged() { this._checkedIds.clear(); }
18
+ async doAcceptElementForOperation(_id) { return false; }
19
+ async acceptElementForOperation(id) {
20
+ if (Id64.isInvalid(id) || Id64.isTransient(id))
21
+ return false;
22
+ let accept = this._checkedIds.get(id);
23
+ if (undefined === accept) {
24
+ if (this.agenda.isEmpty && this._checkedIds.size > 1000)
25
+ this._checkedIds.clear(); // Limit auto-locate cache size to something reasonable...
26
+ accept = await this.doAcceptElementForOperation(id);
27
+ this._checkedIds.set(id, accept);
28
+ }
29
+ return accept;
30
+ }
31
+ async isElementValidForOperation(hit, out) {
32
+ if (!await super.isElementValidForOperation(hit, out))
33
+ return false;
34
+ return this.acceptElementForOperation(hit.sourceId);
35
+ }
36
+ async postFilterIds(arg) {
37
+ const ids = [];
38
+ for (const id of Id64.iterable(arg)) {
39
+ if (await this.acceptElementForOperation(id))
40
+ ids.push(id);
41
+ }
42
+ return ids;
43
+ }
44
+ async getGroupIds(id) {
45
+ return this.postFilterIds(await super.getGroupIds(id));
46
+ }
47
+ async getSelectionSetCandidates(ss) {
48
+ return this.postFilterIds(await super.getSelectionSetCandidates(ss));
49
+ }
50
+ async getDragSelectCandidates(vp, origin, corner, method, overlap) {
51
+ return this.postFilterIds(await super.getDragSelectCandidates(vp, origin, corner, method, overlap));
52
+ }
53
+ setupAccuDraw() { }
54
+ setupAndPromptForNextAction() {
55
+ this.setupAccuDraw();
56
+ super.setupAndPromptForNextAction();
57
+ }
58
+ async doUpdateElement(_props) { return false; }
59
+ async applyAgendaOperation(ev) {
60
+ const geometry = this.getGeometryProps(ev, true);
61
+ if (undefined === geometry)
62
+ return false;
63
+ const elemProps = this.getElementProps(ev);
64
+ if (undefined === elemProps)
65
+ return false;
66
+ if ("flatbuffer" === geometry.format)
67
+ elemProps.elementGeometryBuilderParams = { entryArray: geometry.data };
68
+ else
69
+ elemProps.geom = geometry.data;
70
+ return this.doUpdateElement(elemProps);
71
+ }
72
+ async processAgenda(ev) {
73
+ if (await this.applyAgendaOperation(ev))
74
+ return this.saveChanges();
75
+ }
76
+ }
77
+ /** @alpha Edit tool base class for updating existing elements that use dynamics to show intermediate results. */
78
+ export class ModifyElementWithDynamicsTool extends ModifyElementTool {
79
+ constructor() {
80
+ super(...arguments);
81
+ this._firstResult = true;
82
+ }
83
+ get wantAccuSnap() { return true; }
84
+ get wantDynamics() { return true; }
85
+ agendaAppearance(isDynamics) {
86
+ if (isDynamics) {
87
+ if (undefined === this._agendaAppearanceDynamic)
88
+ this._agendaAppearanceDynamic = FeatureAppearance.fromTransparency(0.0);
89
+ return this._agendaAppearanceDynamic;
90
+ }
91
+ if (undefined === this._agendaAppearanceDefault)
92
+ this._agendaAppearanceDefault = FeatureAppearance.fromTransparency(0.9);
93
+ return this._agendaAppearanceDefault;
94
+ }
95
+ get wantAgendaAppearanceOverride() { return false; }
96
+ addFeatureOverrides(overrides, _vp) {
97
+ if (this.agenda.isEmpty)
98
+ return;
99
+ const appearance = this.agendaAppearance(false);
100
+ this.agenda.elements.forEach((elementId) => overrides.override({ elementId, appearance }));
101
+ }
102
+ updateAgendaAppearanceProvider(drop) {
103
+ if (!this.wantAgendaAppearanceOverride)
104
+ return;
105
+ for (const vp of IModelApp.viewManager) {
106
+ if (!this.allowView(vp))
107
+ continue;
108
+ if (drop || this.agenda.isEmpty)
109
+ vp.dropFeatureOverrideProvider(this);
110
+ else if (!vp.addFeatureOverrideProvider(this))
111
+ vp.setFeatureOverrideProviderChanged();
112
+ }
113
+ }
114
+ clearGraphics() {
115
+ if (undefined === this._graphicsProvider)
116
+ return;
117
+ this._graphicsProvider.cleanupGraphic();
118
+ this._graphicsProvider = undefined;
119
+ }
120
+ async createGraphics(ev) {
121
+ if (!IModelApp.viewManager.inDynamicsMode)
122
+ return; // Don't need to create graphic if dynamics aren't yet active...
123
+ const geometry = this.getGeometryProps(ev, false);
124
+ if (undefined === geometry) {
125
+ this.clearGraphics();
126
+ return;
127
+ }
128
+ const elemProps = this.getElementProps(ev);
129
+ if (undefined === (elemProps === null || elemProps === void 0 ? void 0 : elemProps.placement)) {
130
+ this.clearGraphics();
131
+ return;
132
+ }
133
+ if (undefined === this._graphicsProvider) {
134
+ if (this._firstResult) {
135
+ this.updateAgendaAppearanceProvider();
136
+ this._firstResult = false;
137
+ }
138
+ this._graphicsProvider = new DynamicGraphicsProvider(this.iModel, this.toolId);
139
+ }
140
+ // Set chord tolerance for non-linear/non-planar geometry...
141
+ if (ev.viewport)
142
+ this._graphicsProvider.chordTolerance = computeChordToleranceFromPoint(ev.viewport, ev.point);
143
+ await this._graphicsProvider.createGraphic(elemProps.category, elemProps.placement, geometry);
144
+ }
145
+ onDynamicFrame(_ev, context) {
146
+ if (undefined !== this._graphicsProvider)
147
+ this._graphicsProvider.addGraphic(context);
148
+ }
149
+ async onMouseMotion(ev) {
150
+ return this.createGraphics(ev);
151
+ }
152
+ async onUnsuspend() {
153
+ if (!this._firstResult)
154
+ this.updateAgendaAppearanceProvider();
155
+ return super.onUnsuspend();
156
+ }
157
+ async onSuspend() {
158
+ if (!this._firstResult)
159
+ this.updateAgendaAppearanceProvider(true);
160
+ return super.onSuspend();
161
+ }
162
+ async onPostInstall() {
163
+ await super.onPostInstall();
164
+ if (this.wantAgendaAppearanceOverride)
165
+ this.agenda.manageHiliteState = false;
166
+ }
167
+ async onCleanup() {
168
+ this.clearGraphics();
169
+ this.updateAgendaAppearanceProvider(true);
170
+ return super.onCleanup();
171
+ }
172
+ }
173
173
  //# sourceMappingURL=ModifyElementTool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ModifyElementTool.js","sourceRoot":"","sources":["../../src/ModifyElementTool.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\nimport { Id64, Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport { FeatureAppearance, FlatBufferGeometryStream, GeometricElementProps, JsonGeometryStream } from \"@itwin/core-common\";\r\nimport { BeButtonEvent, DynamicsContext, ElementSetTool, FeatureOverrideProvider, FeatureSymbology, HitDetail, IModelApp, LocateResponse, SelectionMethod, SelectionSet, Viewport } from \"@itwin/core-frontend\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\nimport { computeChordToleranceFromPoint, DynamicGraphicsProvider } from \"./CreateElementTool\";\r\n\r\n/** @alpha Edit tool base class for updating existing elements. */\r\nexport abstract class ModifyElementTool extends ElementSetTool {\r\n protected readonly _checkedIds = new Map<Id64String, boolean>();\r\n\r\n protected allowView(_vp: Viewport) { return true; }\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\r\n\r\n protected onGeometryFilterChanged(): void { this._checkedIds.clear(); }\r\n\r\n protected async doAcceptElementForOperation(_id: Id64String): Promise<boolean> { return false; }\r\n\r\n protected async acceptElementForOperation(id: Id64String): Promise<boolean> {\r\n if (Id64.isInvalid(id) || Id64.isTransient(id))\r\n return false;\r\n\r\n let accept = this._checkedIds.get(id);\r\n\r\n if (undefined === accept) {\r\n if (this.agenda.isEmpty && this._checkedIds.size > 1000)\r\n this._checkedIds.clear(); // Limit auto-locate cache size to something reasonable...\r\n\r\n accept = await this.doAcceptElementForOperation(id);\r\n this._checkedIds.set(id, accept);\r\n }\r\n\r\n return accept;\r\n }\r\n\r\n protected override async isElementValidForOperation(hit: HitDetail, out?: LocateResponse): Promise<boolean> {\r\n if (!await super.isElementValidForOperation(hit, out))\r\n return false;\r\n\r\n return this.acceptElementForOperation(hit.sourceId);\r\n }\r\n\r\n protected async postFilterIds(arg: Id64Arg): Promise<Id64Arg> {\r\n const ids: Id64Array = [];\r\n\r\n for (const id of Id64.iterable(arg)) {\r\n if (await this.acceptElementForOperation(id))\r\n ids.push(id);\r\n }\r\n\r\n return ids;\r\n }\r\n\r\n protected override async getGroupIds(id: Id64String): Promise<Id64Arg> {\r\n return this.postFilterIds(await super.getGroupIds(id));\r\n }\r\n\r\n protected override async getSelectionSetCandidates(ss: SelectionSet): Promise<Id64Arg> {\r\n return this.postFilterIds(await super.getSelectionSetCandidates(ss));\r\n }\r\n\r\n protected override async getDragSelectCandidates(vp: Viewport, origin: Point3d, corner: Point3d, method: SelectionMethod, overlap: boolean): Promise<Id64Arg> {\r\n return this.postFilterIds(await super.getDragSelectCandidates(vp, origin, corner, method, overlap));\r\n }\r\n\r\n protected setupAccuDraw(): void { }\r\n\r\n protected override setupAndPromptForNextAction(): void {\r\n this.setupAccuDraw();\r\n super.setupAndPromptForNextAction();\r\n }\r\n\r\n protected abstract getGeometryProps(ev: BeButtonEvent, isAccept: boolean): JsonGeometryStream | FlatBufferGeometryStream | undefined;\r\n protected abstract getElementProps(ev: BeButtonEvent): GeometricElementProps | undefined;\r\n\r\n protected async doUpdateElement(_props: GeometricElementProps): Promise<boolean> { return false; }\r\n\r\n protected async applyAgendaOperation(ev: BeButtonEvent): Promise<boolean> {\r\n const geometry = this.getGeometryProps(ev, true);\r\n if (undefined === geometry)\r\n return false;\r\n\r\n const elemProps = this.getElementProps(ev);\r\n if (undefined === elemProps)\r\n return false;\r\n\r\n if (\"flatbuffer\" === geometry.format)\r\n elemProps.elementGeometryBuilderParams = { entryArray: geometry.data };\r\n else\r\n elemProps.geom = geometry.data;\r\n\r\n return this.doUpdateElement(elemProps);\r\n }\r\n\r\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\r\n if (await this.applyAgendaOperation(ev))\r\n return this.saveChanges();\r\n }\r\n}\r\n\r\n/** @alpha Edit tool base class for updating existing elements that use dynamics to show intermediate results. */\r\nexport abstract class ModifyElementWithDynamicsTool extends ModifyElementTool implements FeatureOverrideProvider {\r\n protected _graphicsProvider?: DynamicGraphicsProvider;\r\n protected _firstResult = true;\r\n protected _agendaAppearanceDefault?: FeatureAppearance;\r\n protected _agendaAppearanceDynamic?: FeatureAppearance;\r\n\r\n protected override get wantAccuSnap(): boolean { return true; }\r\n protected override get wantDynamics(): boolean { return true; }\r\n\r\n protected agendaAppearance(isDynamics: boolean): FeatureAppearance {\r\n if (isDynamics) {\r\n if (undefined === this._agendaAppearanceDynamic)\r\n this._agendaAppearanceDynamic = FeatureAppearance.fromTransparency(0.0);\r\n\r\n return this._agendaAppearanceDynamic;\r\n }\r\n\r\n if (undefined === this._agendaAppearanceDefault)\r\n this._agendaAppearanceDefault = FeatureAppearance.fromTransparency(0.9);\r\n\r\n return this._agendaAppearanceDefault;\r\n }\r\n\r\n protected get wantAgendaAppearanceOverride(): boolean { return false; }\r\n\r\n public addFeatureOverrides(overrides: FeatureSymbology.Overrides, _vp: Viewport): void {\r\n if (this.agenda.isEmpty)\r\n return;\r\n\r\n const appearance = this.agendaAppearance(false);\r\n this.agenda.elements.forEach((elementId) => overrides.override({ elementId, appearance }));\r\n }\r\n\r\n protected updateAgendaAppearanceProvider(drop?: true): void {\r\n if (!this.wantAgendaAppearanceOverride)\r\n return;\r\n\r\n for (const vp of IModelApp.viewManager) {\r\n if (!this.allowView(vp))\r\n continue;\r\n\r\n if (drop || this.agenda.isEmpty)\r\n vp.dropFeatureOverrideProvider(this);\r\n else if (!vp.addFeatureOverrideProvider(this))\r\n vp.setFeatureOverrideProviderChanged();\r\n }\r\n }\r\n\r\n protected clearGraphics(): void {\r\n if (undefined === this._graphicsProvider)\r\n return;\r\n this._graphicsProvider.cleanupGraphic();\r\n this._graphicsProvider = undefined;\r\n }\r\n\r\n protected async createGraphics(ev: BeButtonEvent): Promise<void> {\r\n if (!IModelApp.viewManager.inDynamicsMode)\r\n return; // Don't need to create graphic if dynamics aren't yet active...\r\n\r\n const geometry = this.getGeometryProps(ev, false);\r\n if (undefined === geometry) {\r\n this.clearGraphics();\r\n return;\r\n }\r\n\r\n const elemProps = this.getElementProps(ev);\r\n if (undefined === elemProps?.placement) {\r\n this.clearGraphics();\r\n return;\r\n }\r\n\r\n if (undefined === this._graphicsProvider) {\r\n if (this._firstResult) {\r\n this.updateAgendaAppearanceProvider();\r\n this._firstResult = false;\r\n }\r\n this._graphicsProvider = new DynamicGraphicsProvider(this.iModel, this.toolId);\r\n }\r\n\r\n // Set chord tolerance for non-linear/non-planar geometry...\r\n if (ev.viewport)\r\n this._graphicsProvider.chordTolerance = computeChordToleranceFromPoint(ev.viewport, ev.point);\r\n\r\n await this._graphicsProvider.createGraphic(elemProps.category, elemProps.placement, geometry);\r\n }\r\n\r\n public override onDynamicFrame(_ev: BeButtonEvent, context: DynamicsContext): void {\r\n if (undefined !== this._graphicsProvider)\r\n this._graphicsProvider.addGraphic(context);\r\n }\r\n\r\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\r\n return this.createGraphics(ev);\r\n }\r\n\r\n public override async onUnsuspend(): Promise<void> {\r\n if (!this._firstResult)\r\n this.updateAgendaAppearanceProvider();\r\n return super.onUnsuspend();\r\n }\r\n\r\n public override async onSuspend(): Promise<void> {\r\n if (!this._firstResult)\r\n this.updateAgendaAppearanceProvider(true);\r\n return super.onSuspend();\r\n }\r\n\r\n public override async onPostInstall(): Promise<void> {\r\n await super.onPostInstall();\r\n if (this.wantAgendaAppearanceOverride)\r\n this.agenda.manageHiliteState = false;\r\n }\r\n\r\n public override async onCleanup(): Promise<void> {\r\n this.clearGraphics();\r\n this.updateAgendaAppearanceProvider(true);\r\n return super.onCleanup();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ModifyElementTool.js","sourceRoot":"","sources":["../../src/ModifyElementTool.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*--------------------------------------------------------------------------------------------*/\nimport { Id64, Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport { FeatureAppearance, FlatBufferGeometryStream, GeometricElementProps, JsonGeometryStream } from \"@itwin/core-common\";\nimport { BeButtonEvent, DynamicsContext, ElementSetTool, FeatureOverrideProvider, FeatureSymbology, HitDetail, IModelApp, LocateResponse, SelectionMethod, SelectionSet, Viewport } from \"@itwin/core-frontend\";\nimport { Point3d } from \"@itwin/core-geometry\";\nimport { computeChordToleranceFromPoint, DynamicGraphicsProvider } from \"./CreateElementTool\";\n\n/** @alpha Edit tool base class for updating existing elements. */\nexport abstract class ModifyElementTool extends ElementSetTool {\n protected readonly _checkedIds = new Map<Id64String, boolean>();\n\n protected allowView(_vp: Viewport) { return true; }\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && this.allowView(vp)); }\n\n protected onGeometryFilterChanged(): void { this._checkedIds.clear(); }\n\n protected async doAcceptElementForOperation(_id: Id64String): Promise<boolean> { return false; }\n\n protected async acceptElementForOperation(id: Id64String): Promise<boolean> {\n if (Id64.isInvalid(id) || Id64.isTransient(id))\n return false;\n\n let accept = this._checkedIds.get(id);\n\n if (undefined === accept) {\n if (this.agenda.isEmpty && this._checkedIds.size > 1000)\n this._checkedIds.clear(); // Limit auto-locate cache size to something reasonable...\n\n accept = await this.doAcceptElementForOperation(id);\n this._checkedIds.set(id, accept);\n }\n\n return accept;\n }\n\n protected override async isElementValidForOperation(hit: HitDetail, out?: LocateResponse): Promise<boolean> {\n if (!await super.isElementValidForOperation(hit, out))\n return false;\n\n return this.acceptElementForOperation(hit.sourceId);\n }\n\n protected async postFilterIds(arg: Id64Arg): Promise<Id64Arg> {\n const ids: Id64Array = [];\n\n for (const id of Id64.iterable(arg)) {\n if (await this.acceptElementForOperation(id))\n ids.push(id);\n }\n\n return ids;\n }\n\n protected override async getGroupIds(id: Id64String): Promise<Id64Arg> {\n return this.postFilterIds(await super.getGroupIds(id));\n }\n\n protected override async getSelectionSetCandidates(ss: SelectionSet): Promise<Id64Arg> {\n return this.postFilterIds(await super.getSelectionSetCandidates(ss));\n }\n\n protected override async getDragSelectCandidates(vp: Viewport, origin: Point3d, corner: Point3d, method: SelectionMethod, overlap: boolean): Promise<Id64Arg> {\n return this.postFilterIds(await super.getDragSelectCandidates(vp, origin, corner, method, overlap));\n }\n\n protected setupAccuDraw(): void { }\n\n protected override setupAndPromptForNextAction(): void {\n this.setupAccuDraw();\n super.setupAndPromptForNextAction();\n }\n\n protected abstract getGeometryProps(ev: BeButtonEvent, isAccept: boolean): JsonGeometryStream | FlatBufferGeometryStream | undefined;\n protected abstract getElementProps(ev: BeButtonEvent): GeometricElementProps | undefined;\n\n protected async doUpdateElement(_props: GeometricElementProps): Promise<boolean> { return false; }\n\n protected async applyAgendaOperation(ev: BeButtonEvent): Promise<boolean> {\n const geometry = this.getGeometryProps(ev, true);\n if (undefined === geometry)\n return false;\n\n const elemProps = this.getElementProps(ev);\n if (undefined === elemProps)\n return false;\n\n if (\"flatbuffer\" === geometry.format)\n elemProps.elementGeometryBuilderParams = { entryArray: geometry.data };\n else\n elemProps.geom = geometry.data;\n\n return this.doUpdateElement(elemProps);\n }\n\n public override async processAgenda(ev: BeButtonEvent): Promise<void> {\n if (await this.applyAgendaOperation(ev))\n return this.saveChanges();\n }\n}\n\n/** @alpha Edit tool base class for updating existing elements that use dynamics to show intermediate results. */\nexport abstract class ModifyElementWithDynamicsTool extends ModifyElementTool implements FeatureOverrideProvider {\n protected _graphicsProvider?: DynamicGraphicsProvider;\n protected _firstResult = true;\n protected _agendaAppearanceDefault?: FeatureAppearance;\n protected _agendaAppearanceDynamic?: FeatureAppearance;\n\n protected override get wantAccuSnap(): boolean { return true; }\n protected override get wantDynamics(): boolean { return true; }\n\n protected agendaAppearance(isDynamics: boolean): FeatureAppearance {\n if (isDynamics) {\n if (undefined === this._agendaAppearanceDynamic)\n this._agendaAppearanceDynamic = FeatureAppearance.fromTransparency(0.0);\n\n return this._agendaAppearanceDynamic;\n }\n\n if (undefined === this._agendaAppearanceDefault)\n this._agendaAppearanceDefault = FeatureAppearance.fromTransparency(0.9);\n\n return this._agendaAppearanceDefault;\n }\n\n protected get wantAgendaAppearanceOverride(): boolean { return false; }\n\n public addFeatureOverrides(overrides: FeatureSymbology.Overrides, _vp: Viewport): void {\n if (this.agenda.isEmpty)\n return;\n\n const appearance = this.agendaAppearance(false);\n this.agenda.elements.forEach((elementId) => overrides.override({ elementId, appearance }));\n }\n\n protected updateAgendaAppearanceProvider(drop?: true): void {\n if (!this.wantAgendaAppearanceOverride)\n return;\n\n for (const vp of IModelApp.viewManager) {\n if (!this.allowView(vp))\n continue;\n\n if (drop || this.agenda.isEmpty)\n vp.dropFeatureOverrideProvider(this);\n else if (!vp.addFeatureOverrideProvider(this))\n vp.setFeatureOverrideProviderChanged();\n }\n }\n\n protected clearGraphics(): void {\n if (undefined === this._graphicsProvider)\n return;\n this._graphicsProvider.cleanupGraphic();\n this._graphicsProvider = undefined;\n }\n\n protected async createGraphics(ev: BeButtonEvent): Promise<void> {\n if (!IModelApp.viewManager.inDynamicsMode)\n return; // Don't need to create graphic if dynamics aren't yet active...\n\n const geometry = this.getGeometryProps(ev, false);\n if (undefined === geometry) {\n this.clearGraphics();\n return;\n }\n\n const elemProps = this.getElementProps(ev);\n if (undefined === elemProps?.placement) {\n this.clearGraphics();\n return;\n }\n\n if (undefined === this._graphicsProvider) {\n if (this._firstResult) {\n this.updateAgendaAppearanceProvider();\n this._firstResult = false;\n }\n this._graphicsProvider = new DynamicGraphicsProvider(this.iModel, this.toolId);\n }\n\n // Set chord tolerance for non-linear/non-planar geometry...\n if (ev.viewport)\n this._graphicsProvider.chordTolerance = computeChordToleranceFromPoint(ev.viewport, ev.point);\n\n await this._graphicsProvider.createGraphic(elemProps.category, elemProps.placement, geometry);\n }\n\n public override onDynamicFrame(_ev: BeButtonEvent, context: DynamicsContext): void {\n if (undefined !== this._graphicsProvider)\n this._graphicsProvider.addGraphic(context);\n }\n\n public override async onMouseMotion(ev: BeButtonEvent): Promise<void> {\n return this.createGraphics(ev);\n }\n\n public override async onUnsuspend(): Promise<void> {\n if (!this._firstResult)\n this.updateAgendaAppearanceProvider();\n return super.onUnsuspend();\n }\n\n public override async onSuspend(): Promise<void> {\n if (!this._firstResult)\n this.updateAgendaAppearanceProvider(true);\n return super.onSuspend();\n }\n\n public override async onPostInstall(): Promise<void> {\n await super.onPostInstall();\n if (this.wantAgendaAppearanceOverride)\n this.agenda.manageHiliteState = false;\n }\n\n public override async onCleanup(): Promise<void> {\n this.clearGraphics();\n this.updateAgendaAppearanceProvider(true);\n return super.onCleanup();\n }\n}\n"]}