@itwin/core-frontend 5.11.0-dev.14 → 5.11.0-dev.15

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 (55) hide show
  1. package/lib/cjs/AccuDraw.d.ts +2 -0
  2. package/lib/cjs/AccuDraw.d.ts.map +1 -1
  3. package/lib/cjs/AccuDraw.js +7 -0
  4. package/lib/cjs/AccuDraw.js.map +1 -1
  5. package/lib/cjs/IModelApp.d.ts.map +1 -1
  6. package/lib/cjs/IModelApp.js +2 -0
  7. package/lib/cjs/IModelApp.js.map +1 -1
  8. package/lib/cjs/core-frontend.d.ts +1 -0
  9. package/lib/cjs/core-frontend.d.ts.map +1 -1
  10. package/lib/cjs/core-frontend.js +1 -0
  11. package/lib/cjs/core-frontend.js.map +1 -1
  12. package/lib/cjs/tools/AccuDrawShortcutTool.d.ts +29 -0
  13. package/lib/cjs/tools/AccuDrawShortcutTool.d.ts.map +1 -0
  14. package/lib/cjs/tools/AccuDrawShortcutTool.js +139 -0
  15. package/lib/cjs/tools/AccuDrawShortcutTool.js.map +1 -0
  16. package/lib/cjs/tools/AccuDrawTool.d.ts +13 -68
  17. package/lib/cjs/tools/AccuDrawTool.d.ts.map +1 -1
  18. package/lib/cjs/tools/AccuDrawTool.js +103 -129
  19. package/lib/cjs/tools/AccuDrawTool.js.map +1 -1
  20. package/lib/cjs/tools/SetupCameraTools.d.ts +89 -0
  21. package/lib/cjs/tools/SetupCameraTools.d.ts.map +1 -0
  22. package/lib/cjs/tools/SetupCameraTools.js +444 -0
  23. package/lib/cjs/tools/SetupCameraTools.js.map +1 -0
  24. package/lib/cjs/tools/ViewTool.d.ts +0 -81
  25. package/lib/cjs/tools/ViewTool.d.ts.map +1 -1
  26. package/lib/cjs/tools/ViewTool.js +1 -417
  27. package/lib/cjs/tools/ViewTool.js.map +1 -1
  28. package/lib/esm/AccuDraw.d.ts +2 -0
  29. package/lib/esm/AccuDraw.d.ts.map +1 -1
  30. package/lib/esm/AccuDraw.js +7 -0
  31. package/lib/esm/AccuDraw.js.map +1 -1
  32. package/lib/esm/IModelApp.d.ts.map +1 -1
  33. package/lib/esm/IModelApp.js +2 -0
  34. package/lib/esm/IModelApp.js.map +1 -1
  35. package/lib/esm/core-frontend.d.ts +1 -0
  36. package/lib/esm/core-frontend.d.ts.map +1 -1
  37. package/lib/esm/core-frontend.js +1 -0
  38. package/lib/esm/core-frontend.js.map +1 -1
  39. package/lib/esm/tools/AccuDrawShortcutTool.d.ts +29 -0
  40. package/lib/esm/tools/AccuDrawShortcutTool.d.ts.map +1 -0
  41. package/lib/esm/tools/AccuDrawShortcutTool.js +134 -0
  42. package/lib/esm/tools/AccuDrawShortcutTool.js.map +1 -0
  43. package/lib/esm/tools/AccuDrawTool.d.ts +13 -68
  44. package/lib/esm/tools/AccuDrawTool.d.ts.map +1 -1
  45. package/lib/esm/tools/AccuDrawTool.js +102 -128
  46. package/lib/esm/tools/AccuDrawTool.js.map +1 -1
  47. package/lib/esm/tools/SetupCameraTools.d.ts +89 -0
  48. package/lib/esm/tools/SetupCameraTools.d.ts.map +1 -0
  49. package/lib/esm/tools/SetupCameraTools.js +439 -0
  50. package/lib/esm/tools/SetupCameraTools.js.map +1 -0
  51. package/lib/esm/tools/ViewTool.d.ts +0 -81
  52. package/lib/esm/tools/ViewTool.d.ts.map +1 -1
  53. package/lib/esm/tools/ViewTool.js +2 -416
  54. package/lib/esm/tools/ViewTool.js.map +1 -1
  55. package/package.json +20 -20
@@ -0,0 +1,444 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module Tools
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SetupWalkCameraTool = exports.SetupCameraTool = void 0;
11
+ const core_geometry_1 = require("@itwin/core-geometry");
12
+ const core_common_1 = require("@itwin/core-common");
13
+ const appui_abstract_1 = require("@itwin/appui-abstract");
14
+ const AccuDraw_1 = require("../AccuDraw");
15
+ const IModelApp_1 = require("../IModelApp");
16
+ const FormattedQuantityDescription_1 = require("../properties/FormattedQuantityDescription");
17
+ const ViewStatus_1 = require("../ViewStatus");
18
+ const Tool_1 = require("./Tool");
19
+ const PrimitiveTool_1 = require("./PrimitiveTool");
20
+ const ToolAssistance_1 = require("./ToolAssistance");
21
+ const ToolSettings_1 = require("./ToolSettings");
22
+ const ViewTool_1 = require("./ViewTool");
23
+ const EditManipulator_1 = require("./EditManipulator");
24
+ const GraphicType_1 = require("../common/render/GraphicType");
25
+ const viewHandleWeight = {
26
+ normal: 2,
27
+ bold: 3,
28
+ thin: 1,
29
+ fatDot: 8,
30
+ };
31
+ /** A tool that sets the view camera by two points. This is a PrimitiveTool and not a ViewTool to allow the view to be panned, zoomed, and rotated while defining the points.
32
+ * To show tool settings for specifying camera and target heights above the snap point, make sure formatting and parsing data are cached before the tool starts
33
+ * by calling QuantityFormatter.onInitialized at app startup.
34
+ * @public
35
+ */
36
+ class SetupCameraTool extends PrimitiveTool_1.PrimitiveTool {
37
+ static toolId = "View.SetupCamera";
38
+ static iconSpec = "icon-camera-location";
39
+ viewport;
40
+ _haveEyePt = false;
41
+ _eyePtWorld = core_geometry_1.Point3d.create();
42
+ _targetPtWorld = core_geometry_1.Point3d.create();
43
+ isCompatibleViewport(vp, isSelectedViewChange) { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp.view.allow3dManipulations()); }
44
+ isValidLocation(_ev, _isButtonEvent) { return true; }
45
+ requireWriteableTarget() { return false; }
46
+ async onPostInstall() {
47
+ await super.onPostInstall();
48
+ this.setupAndPromptForNextAction();
49
+ }
50
+ async onUnsuspend() { this.provideToolAssistance(); }
51
+ setupAndPromptForNextAction() {
52
+ IModelApp_1.IModelApp.accuSnap.enableSnap(true);
53
+ this.provideToolAssistance();
54
+ }
55
+ async onResetButtonUp(_ev) {
56
+ if (this._haveEyePt)
57
+ await this.onReinitialize();
58
+ else
59
+ await this.exitTool();
60
+ return Tool_1.EventHandled.Yes;
61
+ }
62
+ provideToolAssistance() {
63
+ const mainInstruction = ToolAssistance_1.ToolAssistance.createInstruction(this.iconSpec, ViewTool_1.ViewTool.translate(this._haveEyePt ? "SetupCamera.Prompts.NextPoint" : "SetupCamera.Prompts.FirstPoint"));
64
+ const mouseInstructions = [];
65
+ const touchInstructions = [];
66
+ const acceptMsg = Tool_1.CoreTools.translate("ElementSet.Inputs.AcceptPoint");
67
+ const rejectMsg = Tool_1.CoreTools.translate(this._haveEyePt ? "ElementSet.Inputs.Restart" : "ElementSet.Inputs.Exit");
68
+ if (!ToolAssistance_1.ToolAssistance.createTouchCursorInstructions(touchInstructions))
69
+ touchInstructions.push(ToolAssistance_1.ToolAssistance.createInstruction(ToolAssistance_1.ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistance_1.ToolAssistanceInputMethod.Touch));
70
+ mouseInstructions.push(ToolAssistance_1.ToolAssistance.createInstruction(ToolAssistance_1.ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistance_1.ToolAssistanceInputMethod.Mouse));
71
+ touchInstructions.push(ToolAssistance_1.ToolAssistance.createInstruction(ToolAssistance_1.ToolAssistanceImage.TwoTouchTap, rejectMsg, false, ToolAssistance_1.ToolAssistanceInputMethod.Touch));
72
+ mouseInstructions.push(ToolAssistance_1.ToolAssistance.createInstruction(ToolAssistance_1.ToolAssistanceImage.RightClick, rejectMsg, false, ToolAssistance_1.ToolAssistanceInputMethod.Mouse));
73
+ const sections = [];
74
+ sections.push(ToolAssistance_1.ToolAssistance.createSection(mouseInstructions, ToolAssistance_1.ToolAssistance.inputsLabel));
75
+ sections.push(ToolAssistance_1.ToolAssistance.createSection(touchInstructions, ToolAssistance_1.ToolAssistance.inputsLabel));
76
+ const instructions = ToolAssistance_1.ToolAssistance.createInstructions(mainInstruction, sections);
77
+ IModelApp_1.IModelApp.notifications.setToolAssistance(instructions);
78
+ }
79
+ async onRestartTool() {
80
+ const tool = new SetupCameraTool();
81
+ if (!await tool.run())
82
+ return this.exitTool();
83
+ }
84
+ getAdjustedEyePoint() { return this.useCameraHeight ? this._eyePtWorld.plusScaled(core_geometry_1.Vector3d.unitZ(), this.cameraHeight) : this._eyePtWorld; }
85
+ getAdjustedTargetPoint() { return this.useTargetHeight ? this._targetPtWorld.plusScaled(core_geometry_1.Vector3d.unitZ(), this.targetHeight) : this._targetPtWorld; }
86
+ async onDataButtonDown(ev) {
87
+ if (undefined === ev.viewport) {
88
+ return Tool_1.EventHandled.Yes;
89
+ }
90
+ else if (undefined === this.viewport) {
91
+ if (!ev.viewport.view.allow3dManipulations())
92
+ return Tool_1.EventHandled.Yes;
93
+ this.viewport = ev.viewport;
94
+ }
95
+ else if (this.viewport.view.iModel !== ev.viewport.view.iModel) {
96
+ if (this._haveEyePt)
97
+ return Tool_1.EventHandled.Yes;
98
+ this.viewport = ev.viewport;
99
+ return Tool_1.EventHandled.Yes;
100
+ }
101
+ if (this._haveEyePt) {
102
+ this._targetPtWorld.setFrom(ev.point);
103
+ this.doManipulation();
104
+ await this.onReinitialize();
105
+ }
106
+ else {
107
+ this._eyePtWorld.setFrom(ev.point);
108
+ this._targetPtWorld.setFrom(this._eyePtWorld);
109
+ this._haveEyePt = true;
110
+ this.setupAndPromptForNextAction();
111
+ }
112
+ return Tool_1.EventHandled.Yes;
113
+ }
114
+ async onMouseMotion(ev) {
115
+ if (!this._haveEyePt)
116
+ return;
117
+ this._targetPtWorld.setFrom(ev.point);
118
+ IModelApp_1.IModelApp.viewManager.invalidateDecorationsAllViews();
119
+ }
120
+ static drawCameraFrustum(context, vp, eyePtWorld, targetPtWorld, eyeSnapPtWorld, targetSnapPtWorld) {
121
+ if (!vp.view.is3d() || vp.view.iModel !== context.viewport.view.iModel)
122
+ return;
123
+ const zVec = core_geometry_1.Vector3d.createStartEnd(eyePtWorld, targetPtWorld);
124
+ const focusDist = zVec.normalizeWithLength(zVec).mag;
125
+ if (focusDist <= core_geometry_1.Constant.oneMillimeter) // eye and target are too close together
126
+ return;
127
+ const xVec = new core_geometry_1.Vector3d();
128
+ const yVec = core_geometry_1.Vector3d.unitZ();
129
+ if (yVec.crossProduct(zVec).normalizeWithLength(xVec).mag < core_geometry_1.Geometry.smallMetricDistance)
130
+ return;
131
+ if (zVec.crossProduct(xVec).normalizeWithLength(yVec).mag < core_geometry_1.Geometry.smallMetricDistance)
132
+ return;
133
+ const lensAngle = ToolSettings_1.ToolSettings.walkCameraAngle;
134
+ const extentX = Math.tan(lensAngle.radians / 2.0) * focusDist;
135
+ const extentY = extentX * (vp.view.extents.y / vp.view.extents.x);
136
+ const pt1 = targetPtWorld.plusScaled(xVec, -extentX);
137
+ pt1.plusScaled(yVec, extentY, pt1);
138
+ const pt2 = targetPtWorld.plusScaled(xVec, extentX);
139
+ pt2.plusScaled(yVec, extentY, pt2);
140
+ const pt3 = targetPtWorld.plusScaled(xVec, extentX);
141
+ pt3.plusScaled(yVec, -extentY, pt3);
142
+ const pt4 = targetPtWorld.plusScaled(xVec, -extentX);
143
+ pt4.plusScaled(yVec, -extentY, pt4);
144
+ const color = EditManipulator_1.EditManipulator.HandleUtils.adjustForBackgroundColor(core_common_1.ColorDef.black, vp);
145
+ const builderHid = context.createGraphicBuilder(GraphicType_1.GraphicType.WorldOverlay);
146
+ builderHid.setSymbology(color, color, viewHandleWeight.bold);
147
+ builderHid.addLineString([eyePtWorld, targetPtWorld]);
148
+ builderHid.setSymbology(color, color, viewHandleWeight.thin, core_common_1.LinePixels.Code2);
149
+ builderHid.addLineString([eyePtWorld, pt1]);
150
+ builderHid.addLineString([eyePtWorld, pt2]);
151
+ builderHid.addLineString([eyePtWorld, pt3]);
152
+ builderHid.addLineString([eyePtWorld, pt4]);
153
+ builderHid.addLineString([pt1, pt2, pt3, pt4, pt1]);
154
+ if (eyeSnapPtWorld)
155
+ builderHid.addLineString([eyeSnapPtWorld, eyePtWorld]);
156
+ if (targetSnapPtWorld)
157
+ builderHid.addLineString([targetSnapPtWorld, targetPtWorld]);
158
+ builderHid.setSymbology(color, color, viewHandleWeight.fatDot);
159
+ builderHid.addPointString([eyePtWorld, targetPtWorld]);
160
+ if (eyeSnapPtWorld)
161
+ builderHid.addPointString([eyeSnapPtWorld]);
162
+ if (targetSnapPtWorld)
163
+ builderHid.addPointString([targetSnapPtWorld]);
164
+ context.addDecorationFromBuilder(builderHid);
165
+ const backColor = core_common_1.ColorDef.from(0, 0, 255, 200);
166
+ const sideColor = context.viewport.hilite.color.withAlpha(25);
167
+ const builderVis = context.createGraphicBuilder(GraphicType_1.GraphicType.WorldDecoration);
168
+ builderVis.setSymbology(color, color, viewHandleWeight.normal);
169
+ builderVis.addLineString([eyePtWorld, pt1]);
170
+ builderVis.addLineString([eyePtWorld, pt2]);
171
+ builderVis.addLineString([eyePtWorld, pt3]);
172
+ builderVis.addLineString([eyePtWorld, pt4]);
173
+ builderVis.addLineString([pt1, pt2, pt3, pt4, pt1]);
174
+ builderVis.setSymbology(color, backColor, viewHandleWeight.thin);
175
+ builderVis.addShape([pt1, pt2, pt3, pt4]);
176
+ builderVis.setSymbology(color, sideColor, viewHandleWeight.thin);
177
+ builderVis.addShape([eyePtWorld, pt1, pt2]);
178
+ builderVis.addShape([eyePtWorld, pt2, pt3]);
179
+ builderVis.addShape([eyePtWorld, pt3, pt4]);
180
+ builderVis.addShape([eyePtWorld, pt4, pt1]);
181
+ context.addDecorationFromBuilder(builderVis);
182
+ }
183
+ decorate(context) {
184
+ if (!this._haveEyePt || undefined === this.viewport)
185
+ return;
186
+ SetupCameraTool.drawCameraFrustum(context, this.viewport, this.getAdjustedEyePoint(), this.getAdjustedTargetPoint(), this.useCameraHeight ? this._eyePtWorld : undefined, this.useTargetHeight ? this._targetPtWorld : undefined);
187
+ }
188
+ decorateSuspended(context) { this.decorate(context); }
189
+ doManipulation() {
190
+ const vp = this.viewport;
191
+ if (undefined === vp)
192
+ return;
193
+ const view = vp.view;
194
+ if (!view.is3d() || !view.allow3dManipulations())
195
+ return;
196
+ const eyePoint = this.getAdjustedEyePoint();
197
+ const targetPoint = this.getAdjustedTargetPoint();
198
+ const lensAngle = ToolSettings_1.ToolSettings.walkCameraAngle;
199
+ if (ViewStatus_1.ViewStatus.Success !== view.lookAt({ eyePoint, targetPoint, upVector: core_geometry_1.Vector3d.unitZ(), lensAngle }))
200
+ return;
201
+ vp.synchWithView({ animateFrustumChange: true });
202
+ }
203
+ _useCameraHeightProperty;
204
+ get useCameraHeightProperty() {
205
+ if (!this._useCameraHeightProperty)
206
+ this._useCameraHeightProperty = new appui_abstract_1.DialogProperty(appui_abstract_1.PropertyDescriptionHelper.buildLockPropertyDescription("useCameraHeight"), false, undefined, false);
207
+ return this._useCameraHeightProperty;
208
+ }
209
+ get useCameraHeight() { return this.useCameraHeightProperty.value; }
210
+ set useCameraHeight(option) { this.useCameraHeightProperty.value = option; }
211
+ _cameraHeightProperty;
212
+ get cameraHeightProperty() {
213
+ if (!this._cameraHeightProperty)
214
+ this._cameraHeightProperty = new appui_abstract_1.DialogProperty((0, FormattedQuantityDescription_1.createQuantityDescription)({
215
+ name: "cameraHeight",
216
+ displayLabel: ViewTool_1.ViewTool.translate("SetupCamera.Labels.CameraHeight"),
217
+ kindOfQuantityName: "DefaultToolsUnits.LENGTH",
218
+ persistenceUnitName: "Units.M",
219
+ }), 0.0);
220
+ return this._cameraHeightProperty;
221
+ }
222
+ get cameraHeight() { return this.cameraHeightProperty.value; }
223
+ set cameraHeight(value) { this.cameraHeightProperty.value = value; }
224
+ _useTargetHeightProperty;
225
+ get useTargetHeightProperty() {
226
+ if (!this._useTargetHeightProperty)
227
+ this._useTargetHeightProperty = new appui_abstract_1.DialogProperty(appui_abstract_1.PropertyDescriptionHelper.buildLockPropertyDescription("useTargetHeight"), false, undefined, false);
228
+ return this._useTargetHeightProperty;
229
+ }
230
+ get useTargetHeight() { return this.useTargetHeightProperty.value; }
231
+ set useTargetHeight(value) { this.useTargetHeightProperty.value = value; }
232
+ _targetHeightProperty;
233
+ get targetHeightProperty() {
234
+ if (!this._targetHeightProperty)
235
+ this._targetHeightProperty = new appui_abstract_1.DialogProperty((0, FormattedQuantityDescription_1.createQuantityDescription)({
236
+ name: "targetHeight",
237
+ displayLabel: ViewTool_1.ViewTool.translate("SetupCamera.Labels.TargetHeight"),
238
+ kindOfQuantityName: "DefaultToolsUnits.LENGTH",
239
+ persistenceUnitName: "Units.M",
240
+ }), 0.0);
241
+ return this._targetHeightProperty;
242
+ }
243
+ get targetHeight() { return this.targetHeightProperty.value; }
244
+ set targetHeight(value) { this.targetHeightProperty.value = value; }
245
+ getToolSettingLockProperty(property) {
246
+ if (property === this.cameraHeightProperty)
247
+ return this.useCameraHeightProperty;
248
+ else if (property === this.targetHeightProperty)
249
+ return this.useTargetHeightProperty;
250
+ return undefined;
251
+ }
252
+ async applyToolSettingPropertyChange(updatedValue) {
253
+ return this.changeToolSettingPropertyValue(updatedValue);
254
+ }
255
+ supplyToolSettingsProperties() {
256
+ this.initializeToolSettingPropertyValues([this.useCameraHeightProperty, this.useTargetHeightProperty, this.cameraHeightProperty, this.targetHeightProperty]);
257
+ const cameraHeightLock = this.useCameraHeightProperty.toDialogItem({ rowPriority: 1, columnIndex: 0 });
258
+ const targetHeightLock = this.useTargetHeightProperty.toDialogItem({ rowPriority: 2, columnIndex: 0 });
259
+ const toolSettings = new Array();
260
+ toolSettings.push(this.cameraHeightProperty.toDialogItem({ rowPriority: 1, columnIndex: 1 }, cameraHeightLock));
261
+ toolSettings.push(this.targetHeightProperty.toDialogItem({ rowPriority: 2, columnIndex: 1 }, targetHeightLock));
262
+ return toolSettings;
263
+ }
264
+ }
265
+ exports.SetupCameraTool = SetupCameraTool;
266
+ /** A tool that sets a walk tool starting position by a floor point and look direction. This is a PrimitiveTool and not a ViewTool to allow the view to be panned, zoomed, and rotated while defining the points.
267
+ * @public
268
+ */
269
+ class SetupWalkCameraTool extends PrimitiveTool_1.PrimitiveTool {
270
+ static toolId = "View.SetupWalkCamera";
271
+ static iconSpec = "icon-camera-location";
272
+ viewport;
273
+ _haveEyePt = false;
274
+ _eyePtWorld = core_geometry_1.Point3d.create();
275
+ _targetPtWorld = core_geometry_1.Point3d.create();
276
+ isCompatibleViewport(vp, isSelectedViewChange) { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp.view.allow3dManipulations()); }
277
+ isValidLocation(_ev, _isButtonEvent) { return true; }
278
+ requireWriteableTarget() { return false; }
279
+ async onPostInstall() {
280
+ await super.onPostInstall();
281
+ this.setupAndPromptForNextAction();
282
+ }
283
+ async onUnsuspend() { this.provideToolAssistance(); }
284
+ setupAndPromptForNextAction() {
285
+ IModelApp_1.IModelApp.accuSnap.enableSnap(true);
286
+ this.provideToolAssistance();
287
+ }
288
+ async onResetButtonUp(_ev) {
289
+ if (this._haveEyePt)
290
+ await this.onReinitialize();
291
+ else
292
+ await this.exitTool();
293
+ return Tool_1.EventHandled.Yes;
294
+ }
295
+ provideToolAssistance() {
296
+ const mainInstruction = ToolAssistance_1.ToolAssistance.createInstruction(this.iconSpec, ViewTool_1.ViewTool.translate(this._haveEyePt ? "SetupWalkCamera.Prompts.NextPoint" : "SetupWalkCamera.Prompts.FirstPoint"));
297
+ const mouseInstructions = [];
298
+ const touchInstructions = [];
299
+ const acceptMsg = Tool_1.CoreTools.translate("ElementSet.Inputs.AcceptPoint");
300
+ const rejectMsg = Tool_1.CoreTools.translate(this._haveEyePt ? "ElementSet.Inputs.Restart" : "ElementSet.Inputs.Exit");
301
+ if (!ToolAssistance_1.ToolAssistance.createTouchCursorInstructions(touchInstructions))
302
+ touchInstructions.push(ToolAssistance_1.ToolAssistance.createInstruction(ToolAssistance_1.ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistance_1.ToolAssistanceInputMethod.Touch));
303
+ mouseInstructions.push(ToolAssistance_1.ToolAssistance.createInstruction(ToolAssistance_1.ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistance_1.ToolAssistanceInputMethod.Mouse));
304
+ touchInstructions.push(ToolAssistance_1.ToolAssistance.createInstruction(ToolAssistance_1.ToolAssistanceImage.TwoTouchTap, rejectMsg, false, ToolAssistance_1.ToolAssistanceInputMethod.Touch));
305
+ mouseInstructions.push(ToolAssistance_1.ToolAssistance.createInstruction(ToolAssistance_1.ToolAssistanceImage.RightClick, rejectMsg, false, ToolAssistance_1.ToolAssistanceInputMethod.Mouse));
306
+ const sections = [];
307
+ sections.push(ToolAssistance_1.ToolAssistance.createSection(mouseInstructions, ToolAssistance_1.ToolAssistance.inputsLabel));
308
+ sections.push(ToolAssistance_1.ToolAssistance.createSection(touchInstructions, ToolAssistance_1.ToolAssistance.inputsLabel));
309
+ const instructions = ToolAssistance_1.ToolAssistance.createInstructions(mainInstruction, sections);
310
+ IModelApp_1.IModelApp.notifications.setToolAssistance(instructions);
311
+ }
312
+ async onRestartTool() {
313
+ const tool = new SetupWalkCameraTool();
314
+ if (!await tool.run())
315
+ return this.exitTool();
316
+ }
317
+ getAdjustedEyePoint() { return this._eyePtWorld.plusScaled(core_geometry_1.Vector3d.unitZ(), ToolSettings_1.ToolSettings.walkEyeHeight); }
318
+ getAdjustedTargetPoint() { return core_geometry_1.Point3d.create(this._targetPtWorld.x, this._targetPtWorld.y, this.getAdjustedEyePoint().z); }
319
+ async onDataButtonDown(ev) {
320
+ if (undefined === ev.viewport) {
321
+ return Tool_1.EventHandled.Yes;
322
+ }
323
+ else if (undefined === this.viewport) {
324
+ if (!ev.viewport.view.allow3dManipulations())
325
+ return Tool_1.EventHandled.Yes;
326
+ this.viewport = ev.viewport;
327
+ }
328
+ else if (this.viewport.view.iModel !== ev.viewport.view.iModel) {
329
+ if (this._haveEyePt)
330
+ return Tool_1.EventHandled.Yes;
331
+ this.viewport = ev.viewport;
332
+ return Tool_1.EventHandled.Yes;
333
+ }
334
+ if (this._haveEyePt) {
335
+ this._targetPtWorld.setFrom(ev.point);
336
+ this.doManipulation();
337
+ await this.onReinitialize();
338
+ }
339
+ else {
340
+ this._eyePtWorld.setFrom(ev.point);
341
+ this._targetPtWorld.setFrom(this._eyePtWorld);
342
+ this._haveEyePt = true;
343
+ this.setupAndPromptForNextAction();
344
+ }
345
+ return Tool_1.EventHandled.Yes;
346
+ }
347
+ async onMouseMotion(ev) {
348
+ if (!this._haveEyePt)
349
+ return;
350
+ this._targetPtWorld.setFrom(ev.point);
351
+ IModelApp_1.IModelApp.viewManager.invalidateDecorationsAllViews();
352
+ }
353
+ static getFigurePoints() {
354
+ const figurePts = [];
355
+ figurePts.push(core_geometry_1.Point3d.create(1.064, -0.014));
356
+ figurePts.push(core_geometry_1.Point3d.create(1.051, 0.039));
357
+ figurePts.push(core_geometry_1.Point3d.create(1.008, 0.058));
358
+ figurePts.push(core_geometry_1.Point3d.create(0.962, 0.048));
359
+ figurePts.push(core_geometry_1.Point3d.create(0.920, 0.026));
360
+ figurePts.push(core_geometry_1.Point3d.create(0.898, 0.026));
361
+ figurePts.push(core_geometry_1.Point3d.create(0.853, 0.094));
362
+ figurePts.push(core_geometry_1.Point3d.create(0.741, 0.120));
363
+ figurePts.push(core_geometry_1.Point3d.create(0.652, 0.091));
364
+ figurePts.push(core_geometry_1.Point3d.create(0.514, 0.107));
365
+ figurePts.push(core_geometry_1.Point3d.create(0.304, 0.108));
366
+ figurePts.push(core_geometry_1.Point3d.create(0.040, 0.135));
367
+ figurePts.push(core_geometry_1.Point3d.create(-0.023, 0.133));
368
+ figurePts.push(core_geometry_1.Point3d.create(-0.031, 0.088));
369
+ figurePts.push(core_geometry_1.Point3d.create(0.041, 0.068));
370
+ figurePts.push(core_geometry_1.Point3d.create(0.299, 0.035));
371
+ figurePts.push(core_geometry_1.Point3d.create(0.447, -0.015));
372
+ figurePts.push(core_geometry_1.Point3d.create(0.267, -0.042));
373
+ figurePts.push(core_geometry_1.Point3d.create(0.019, -0.036));
374
+ figurePts.push(core_geometry_1.Point3d.create(-0.027, -0.146));
375
+ figurePts.push(core_geometry_1.Point3d.create(-0.005, -0.179));
376
+ figurePts.push(core_geometry_1.Point3d.create(0.056, -0.108));
377
+ figurePts.push(core_geometry_1.Point3d.create(0.270, -0.122));
378
+ figurePts.push(core_geometry_1.Point3d.create(0.483, -0.120));
379
+ figurePts.push(core_geometry_1.Point3d.create(0.649, -0.145));
380
+ figurePts.push(core_geometry_1.Point3d.create(0.715, -0.186));
381
+ figurePts.push(core_geometry_1.Point3d.create(0.865, -0.135));
382
+ figurePts.push(core_geometry_1.Point3d.create(0.905, -0.039));
383
+ figurePts.push(core_geometry_1.Point3d.create(0.948, -0.035));
384
+ figurePts.push(core_geometry_1.Point3d.create(0.979, -0.051));
385
+ figurePts.push(core_geometry_1.Point3d.create(1.037, -0.046));
386
+ figurePts.push(figurePts[0].clone());
387
+ return figurePts;
388
+ }
389
+ static getFigureTransform(vp, base, direction, scale) {
390
+ const boresite = AccuDraw_1.AccuDrawHintBuilder.getBoresite(base, vp);
391
+ if (Math.abs(direction.dotProduct(boresite.direction)) >= 0.9999)
392
+ return undefined;
393
+ const matrix = core_geometry_1.Matrix3d.createRigidFromColumns(direction, boresite.direction, core_geometry_1.AxisOrder.XZY);
394
+ if (undefined === matrix)
395
+ return undefined;
396
+ matrix.scaleColumnsInPlace(scale, scale, scale);
397
+ return core_geometry_1.Transform.createRefs(base.clone(), matrix);
398
+ }
399
+ static drawFigure(context, vp, groundPt, eyeHeight) {
400
+ if (!vp.view.is3d() || vp.view.iModel !== context.viewport.view.iModel)
401
+ return;
402
+ const transform = this.getFigureTransform(context.viewport, groundPt, core_geometry_1.Vector3d.unitZ(), eyeHeight);
403
+ if (undefined === transform)
404
+ return;
405
+ const figurePts = this.getFigurePoints();
406
+ const color = EditManipulator_1.EditManipulator.HandleUtils.adjustForBackgroundColor(core_common_1.ColorDef.black, vp);
407
+ const fill = core_common_1.ColorDef.from(255, 245, 225, 100);
408
+ const builderShadow = context.createGraphicBuilder(GraphicType_1.GraphicType.WorldOverlay);
409
+ builderShadow.setSymbology(color, core_common_1.ColorDef.black.withAlpha(30), viewHandleWeight.thin);
410
+ builderShadow.addArc(core_geometry_1.Arc3d.createXY(groundPt, eyeHeight * 0.22), true, true);
411
+ context.addDecorationFromBuilder(builderShadow);
412
+ const builderHid = context.createGraphicBuilder(GraphicType_1.GraphicType.WorldDecoration, transform);
413
+ builderHid.setSymbology(color, fill, viewHandleWeight.thin);
414
+ builderHid.addShape(figurePts); // Copies points...
415
+ context.addDecorationFromBuilder(builderHid);
416
+ const builderVis = context.createGraphicBuilder(GraphicType_1.GraphicType.WorldOverlay, transform);
417
+ builderVis.setSymbology(color, color, viewHandleWeight.normal);
418
+ builderVis.addLineString(figurePts); // Owns points...
419
+ context.addDecorationFromBuilder(builderVis);
420
+ }
421
+ decorate(context) {
422
+ if (!this._haveEyePt || undefined === this.viewport)
423
+ return;
424
+ SetupWalkCameraTool.drawFigure(context, this.viewport, this._eyePtWorld, ToolSettings_1.ToolSettings.walkEyeHeight);
425
+ SetupCameraTool.drawCameraFrustum(context, this.viewport, this.getAdjustedEyePoint(), this.getAdjustedTargetPoint(), this._eyePtWorld, this._targetPtWorld);
426
+ }
427
+ decorateSuspended(context) { this.decorate(context); }
428
+ doManipulation() {
429
+ const vp = this.viewport;
430
+ if (undefined === vp)
431
+ return;
432
+ const view = vp.view;
433
+ if (!view.is3d() || !view.allow3dManipulations())
434
+ return;
435
+ const eyePoint = this.getAdjustedEyePoint();
436
+ const targetPoint = this.getAdjustedTargetPoint();
437
+ const lensAngle = ToolSettings_1.ToolSettings.walkCameraAngle;
438
+ if (ViewStatus_1.ViewStatus.Success !== view.lookAt({ eyePoint, targetPoint, upVector: core_geometry_1.Vector3d.unitZ(), lensAngle }))
439
+ return;
440
+ vp.synchWithView({ animateFrustumChange: true });
441
+ }
442
+ }
443
+ exports.SetupWalkCameraTool = SetupWalkCameraTool;
444
+ //# sourceMappingURL=SetupCameraTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SetupCameraTools.js","sourceRoot":"","sources":["../../../src/tools/SetupCameraTools.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tools\r\n */\r\n\r\nimport { Arc3d, AxisOrder, Constant, Geometry, Matrix3d, Point3d, Transform, Vector3d } from \"@itwin/core-geometry\";\r\nimport { ColorDef, LinePixels } from \"@itwin/core-common\";\r\nimport { DialogItem, DialogProperty, DialogPropertySyncItem, PropertyDescriptionHelper } from \"@itwin/appui-abstract\";\r\nimport { AccuDrawHintBuilder } from \"../AccuDraw\";\r\nimport { IModelApp } from \"../IModelApp\";\r\nimport { createQuantityDescription } from \"../properties/FormattedQuantityDescription\";\r\nimport { DecorateContext } from \"../ViewContext\";\r\nimport { ScreenViewport, Viewport } from \"../Viewport\";\r\nimport { ViewStatus } from \"../ViewStatus\";\r\nimport { BeButtonEvent, CoreTools, EventHandled } from \"./Tool\";\r\nimport { PrimitiveTool } from \"./PrimitiveTool\";\r\nimport { ToolAssistance, ToolAssistanceImage, ToolAssistanceInputMethod, ToolAssistanceInstruction, ToolAssistanceSection } from \"./ToolAssistance\";\r\nimport { ToolSettings } from \"./ToolSettings\";\r\nimport { ViewTool } from \"./ViewTool\";\r\nimport { EditManipulator } from \"./EditManipulator\";\r\nimport { GraphicType } from \"../common/render/GraphicType\";\r\n\r\nconst viewHandleWeight = {\r\n normal: 2,\r\n bold: 3,\r\n thin: 1,\r\n fatDot: 8,\r\n};\r\n\r\n/** A tool that sets the view camera by two points. This is a PrimitiveTool and not a ViewTool to allow the view to be panned, zoomed, and rotated while defining the points.\r\n * To show tool settings for specifying camera and target heights above the snap point, make sure formatting and parsing data are cached before the tool starts\r\n * by calling QuantityFormatter.onInitialized at app startup.\r\n * @public\r\n */\r\nexport class SetupCameraTool extends PrimitiveTool {\r\n public static override toolId = \"View.SetupCamera\";\r\n public static override iconSpec = \"icon-camera-location\";\r\n public viewport?: ScreenViewport;\r\n protected _haveEyePt: boolean = false;\r\n protected _eyePtWorld: Point3d = Point3d.create();\r\n protected _targetPtWorld: Point3d = Point3d.create();\r\n\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp.view.allow3dManipulations()); }\r\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; }\r\n public override requireWriteableTarget(): boolean { return false; }\r\n public override async onPostInstall() {\r\n await super.onPostInstall();\r\n this.setupAndPromptForNextAction();\r\n }\r\n\r\n public override async onUnsuspend() { this.provideToolAssistance(); }\r\n protected setupAndPromptForNextAction(): void {\r\n IModelApp.accuSnap.enableSnap(true);\r\n this.provideToolAssistance();\r\n }\r\n\r\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\r\n if (this._haveEyePt)\r\n await this.onReinitialize();\r\n else\r\n await this.exitTool();\r\n\r\n return EventHandled.Yes;\r\n }\r\n\r\n protected provideToolAssistance(): void {\r\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, ViewTool.translate(this._haveEyePt ? \"SetupCamera.Prompts.NextPoint\" : \"SetupCamera.Prompts.FirstPoint\"));\r\n const mouseInstructions: ToolAssistanceInstruction[] = [];\r\n const touchInstructions: ToolAssistanceInstruction[] = [];\r\n\r\n const acceptMsg = CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\");\r\n const rejectMsg = CoreTools.translate(this._haveEyePt ? \"ElementSet.Inputs.Restart\" : \"ElementSet.Inputs.Exit\");\r\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistanceInputMethod.Touch));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistanceInputMethod.Mouse));\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rejectMsg, false, ToolAssistanceInputMethod.Touch));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rejectMsg, false, ToolAssistanceInputMethod.Mouse));\r\n\r\n const sections: ToolAssistanceSection[] = [];\r\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\r\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\r\n\r\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\r\n IModelApp.notifications.setToolAssistance(instructions);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new SetupCameraTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n protected getAdjustedEyePoint() { return this.useCameraHeight ? this._eyePtWorld.plusScaled(Vector3d.unitZ(), this.cameraHeight) : this._eyePtWorld; }\r\n protected getAdjustedTargetPoint() { return this.useTargetHeight ? this._targetPtWorld.plusScaled(Vector3d.unitZ(), this.targetHeight) : this._targetPtWorld; }\r\n\r\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\r\n if (undefined === ev.viewport) {\r\n return EventHandled.Yes;\r\n } else if (undefined === this.viewport) {\r\n if (!ev.viewport.view.allow3dManipulations())\r\n return EventHandled.Yes;\r\n this.viewport = ev.viewport;\r\n } else if (this.viewport.view.iModel !== ev.viewport.view.iModel) {\r\n if (this._haveEyePt)\r\n return EventHandled.Yes;\r\n this.viewport = ev.viewport;\r\n return EventHandled.Yes;\r\n }\r\n\r\n if (this._haveEyePt) {\r\n this._targetPtWorld.setFrom(ev.point);\r\n this.doManipulation();\r\n await this.onReinitialize();\r\n } else {\r\n this._eyePtWorld.setFrom(ev.point);\r\n this._targetPtWorld.setFrom(this._eyePtWorld);\r\n this._haveEyePt = true;\r\n this.setupAndPromptForNextAction();\r\n }\r\n\r\n return EventHandled.Yes;\r\n }\r\n\r\n public override async onMouseMotion(ev: BeButtonEvent) {\r\n if (!this._haveEyePt)\r\n return;\r\n this._targetPtWorld.setFrom(ev.point);\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n\r\n public static drawCameraFrustum(context: DecorateContext, vp: ScreenViewport, eyePtWorld: Point3d, targetPtWorld: Point3d, eyeSnapPtWorld?: Point3d, targetSnapPtWorld?: Point3d) {\r\n if (!vp.view.is3d() || vp.view.iModel !== context.viewport.view.iModel)\r\n return;\r\n\r\n const zVec = Vector3d.createStartEnd(eyePtWorld, targetPtWorld);\r\n const focusDist = zVec.normalizeWithLength(zVec).mag;\r\n if (focusDist <= Constant.oneMillimeter) // eye and target are too close together\r\n return;\r\n\r\n const xVec = new Vector3d();\r\n const yVec = Vector3d.unitZ();\r\n if (yVec.crossProduct(zVec).normalizeWithLength(xVec).mag < Geometry.smallMetricDistance)\r\n return;\r\n if (zVec.crossProduct(xVec).normalizeWithLength(yVec).mag < Geometry.smallMetricDistance)\r\n return;\r\n\r\n const lensAngle = ToolSettings.walkCameraAngle;\r\n const extentX = Math.tan(lensAngle.radians / 2.0) * focusDist;\r\n const extentY = extentX * (vp.view.extents.y / vp.view.extents.x);\r\n\r\n const pt1 = targetPtWorld.plusScaled(xVec, -extentX);\r\n pt1.plusScaled(yVec, extentY, pt1);\r\n const pt2 = targetPtWorld.plusScaled(xVec, extentX);\r\n pt2.plusScaled(yVec, extentY, pt2);\r\n const pt3 = targetPtWorld.plusScaled(xVec, extentX);\r\n pt3.plusScaled(yVec, -extentY, pt3);\r\n const pt4 = targetPtWorld.plusScaled(xVec, -extentX);\r\n pt4.plusScaled(yVec, -extentY, pt4);\r\n\r\n const color = EditManipulator.HandleUtils.adjustForBackgroundColor(ColorDef.black, vp);\r\n const builderHid = context.createGraphicBuilder(GraphicType.WorldOverlay);\r\n\r\n builderHid.setSymbology(color, color, viewHandleWeight.bold);\r\n builderHid.addLineString([eyePtWorld, targetPtWorld]);\r\n\r\n builderHid.setSymbology(color, color, viewHandleWeight.thin, LinePixels.Code2);\r\n builderHid.addLineString([eyePtWorld, pt1]);\r\n builderHid.addLineString([eyePtWorld, pt2]);\r\n builderHid.addLineString([eyePtWorld, pt3]);\r\n builderHid.addLineString([eyePtWorld, pt4]);\r\n builderHid.addLineString([pt1, pt2, pt3, pt4, pt1]);\r\n\r\n if (eyeSnapPtWorld)\r\n builderHid.addLineString([eyeSnapPtWorld, eyePtWorld]);\r\n if (targetSnapPtWorld)\r\n builderHid.addLineString([targetSnapPtWorld, targetPtWorld]);\r\n\r\n builderHid.setSymbology(color, color, viewHandleWeight.fatDot);\r\n builderHid.addPointString([eyePtWorld, targetPtWorld]);\r\n\r\n if (eyeSnapPtWorld)\r\n builderHid.addPointString([eyeSnapPtWorld]);\r\n if (targetSnapPtWorld)\r\n builderHid.addPointString([targetSnapPtWorld]);\r\n\r\n context.addDecorationFromBuilder(builderHid);\r\n\r\n const backColor = ColorDef.from(0, 0, 255, 200);\r\n const sideColor = context.viewport.hilite.color.withAlpha(25);\r\n const builderVis = context.createGraphicBuilder(GraphicType.WorldDecoration);\r\n\r\n builderVis.setSymbology(color, color, viewHandleWeight.normal);\r\n builderVis.addLineString([eyePtWorld, pt1]);\r\n builderVis.addLineString([eyePtWorld, pt2]);\r\n builderVis.addLineString([eyePtWorld, pt3]);\r\n builderVis.addLineString([eyePtWorld, pt4]);\r\n builderVis.addLineString([pt1, pt2, pt3, pt4, pt1]);\r\n\r\n builderVis.setSymbology(color, backColor, viewHandleWeight.thin);\r\n builderVis.addShape([pt1, pt2, pt3, pt4]);\r\n\r\n builderVis.setSymbology(color, sideColor, viewHandleWeight.thin);\r\n builderVis.addShape([eyePtWorld, pt1, pt2]);\r\n builderVis.addShape([eyePtWorld, pt2, pt3]);\r\n builderVis.addShape([eyePtWorld, pt3, pt4]);\r\n builderVis.addShape([eyePtWorld, pt4, pt1]);\r\n\r\n context.addDecorationFromBuilder(builderVis);\r\n }\r\n\r\n public override decorate(context: DecorateContext): void {\r\n if (!this._haveEyePt || undefined === this.viewport)\r\n return;\r\n SetupCameraTool.drawCameraFrustum(context, this.viewport, this.getAdjustedEyePoint(), this.getAdjustedTargetPoint(), this.useCameraHeight ? this._eyePtWorld : undefined, this.useTargetHeight ? this._targetPtWorld : undefined);\r\n }\r\n\r\n public override decorateSuspended(context: DecorateContext): void { this.decorate(context); }\r\n\r\n private doManipulation(): void {\r\n const vp = this.viewport;\r\n if (undefined === vp)\r\n return;\r\n\r\n const view = vp.view;\r\n if (!view.is3d() || !view.allow3dManipulations())\r\n return;\r\n\r\n const eyePoint = this.getAdjustedEyePoint();\r\n const targetPoint = this.getAdjustedTargetPoint();\r\n const lensAngle = ToolSettings.walkCameraAngle;\r\n if (ViewStatus.Success !== view.lookAt({ eyePoint, targetPoint, upVector: Vector3d.unitZ(), lensAngle }))\r\n return;\r\n\r\n vp.synchWithView({ animateFrustumChange: true });\r\n }\r\n\r\n private _useCameraHeightProperty: DialogProperty<boolean> | undefined;\r\n public get useCameraHeightProperty() {\r\n if (!this._useCameraHeightProperty)\r\n this._useCameraHeightProperty = new DialogProperty<boolean>(\r\n PropertyDescriptionHelper.buildLockPropertyDescription(\"useCameraHeight\"), false, undefined, false);\r\n return this._useCameraHeightProperty;\r\n }\r\n public get useCameraHeight(): boolean { return this.useCameraHeightProperty.value; }\r\n public set useCameraHeight(option: boolean) { this.useCameraHeightProperty.value = option; }\r\n\r\n private _cameraHeightProperty: DialogProperty<number> | undefined;\r\n public get cameraHeightProperty() {\r\n if (!this._cameraHeightProperty)\r\n this._cameraHeightProperty = new DialogProperty<number>(createQuantityDescription({\r\n name: \"cameraHeight\",\r\n displayLabel: ViewTool.translate(\"SetupCamera.Labels.CameraHeight\"),\r\n kindOfQuantityName: \"DefaultToolsUnits.LENGTH\",\r\n persistenceUnitName: \"Units.M\",\r\n }), 0.0);\r\n return this._cameraHeightProperty;\r\n }\r\n public get cameraHeight(): number { return this.cameraHeightProperty.value; }\r\n public set cameraHeight(value: number) { this.cameraHeightProperty.value = value; }\r\n\r\n private _useTargetHeightProperty: DialogProperty<boolean> | undefined;\r\n public get useTargetHeightProperty() {\r\n if (!this._useTargetHeightProperty)\r\n this._useTargetHeightProperty = new DialogProperty<boolean>(\r\n PropertyDescriptionHelper.buildLockPropertyDescription(\"useTargetHeight\"), false, undefined, false);\r\n return this._useTargetHeightProperty;\r\n }\r\n public get useTargetHeight(): boolean { return this.useTargetHeightProperty.value; }\r\n public set useTargetHeight(value: boolean) { this.useTargetHeightProperty.value = value; }\r\n\r\n private _targetHeightProperty: DialogProperty<number> | undefined;\r\n public get targetHeightProperty() {\r\n if (!this._targetHeightProperty)\r\n this._targetHeightProperty = new DialogProperty<number>(createQuantityDescription({\r\n name: \"targetHeight\",\r\n displayLabel: ViewTool.translate(\"SetupCamera.Labels.TargetHeight\"),\r\n kindOfQuantityName: \"DefaultToolsUnits.LENGTH\",\r\n persistenceUnitName: \"Units.M\",\r\n }), 0.0);\r\n return this._targetHeightProperty;\r\n }\r\n public get targetHeight(): number { return this.targetHeightProperty.value; }\r\n public set targetHeight(value: number) { this.targetHeightProperty.value = value; }\r\n\r\n protected override getToolSettingLockProperty(property: DialogProperty<any>): DialogProperty<boolean> | undefined {\r\n if (property === this.cameraHeightProperty)\r\n return this.useCameraHeightProperty;\r\n else if (property === this.targetHeightProperty)\r\n return this.useTargetHeightProperty;\r\n return undefined;\r\n }\r\n\r\n public override async applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean> {\r\n return this.changeToolSettingPropertyValue(updatedValue);\r\n }\r\n\r\n public override supplyToolSettingsProperties(): DialogItem[] | undefined {\r\n this.initializeToolSettingPropertyValues([this.useCameraHeightProperty, this.useTargetHeightProperty, this.cameraHeightProperty, this.targetHeightProperty]);\r\n\r\n const cameraHeightLock = this.useCameraHeightProperty.toDialogItem({ rowPriority: 1, columnIndex: 0 });\r\n const targetHeightLock = this.useTargetHeightProperty.toDialogItem({ rowPriority: 2, columnIndex: 0 });\r\n\r\n const toolSettings = new Array<DialogItem>();\r\n toolSettings.push(this.cameraHeightProperty.toDialogItem({ rowPriority: 1, columnIndex: 1 }, cameraHeightLock));\r\n toolSettings.push(this.targetHeightProperty.toDialogItem({ rowPriority: 2, columnIndex: 1 }, targetHeightLock));\r\n return toolSettings;\r\n }\r\n}\r\n\r\n/** A tool that sets a walk tool starting position by a floor point and look direction. This is a PrimitiveTool and not a ViewTool to allow the view to be panned, zoomed, and rotated while defining the points.\r\n * @public\r\n */\r\nexport class SetupWalkCameraTool extends PrimitiveTool {\r\n public static override toolId = \"View.SetupWalkCamera\";\r\n public static override iconSpec = \"icon-camera-location\";\r\n public viewport?: ScreenViewport;\r\n protected _haveEyePt: boolean = false;\r\n protected _eyePtWorld: Point3d = Point3d.create();\r\n protected _targetPtWorld: Point3d = Point3d.create();\r\n\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp.view.allow3dManipulations()); }\r\n public override isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean { return true; }\r\n public override requireWriteableTarget(): boolean { return false; }\r\n public override async onPostInstall() {\r\n await super.onPostInstall();\r\n this.setupAndPromptForNextAction();\r\n }\r\n\r\n public override async onUnsuspend() { this.provideToolAssistance(); }\r\n protected setupAndPromptForNextAction(): void {\r\n IModelApp.accuSnap.enableSnap(true);\r\n this.provideToolAssistance();\r\n }\r\n\r\n public override async onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled> {\r\n if (this._haveEyePt)\r\n await this.onReinitialize();\r\n else\r\n await this.exitTool();\r\n\r\n return EventHandled.Yes;\r\n }\r\n\r\n protected provideToolAssistance(): void {\r\n const mainInstruction = ToolAssistance.createInstruction(this.iconSpec, ViewTool.translate(this._haveEyePt ? \"SetupWalkCamera.Prompts.NextPoint\" : \"SetupWalkCamera.Prompts.FirstPoint\"));\r\n const mouseInstructions: ToolAssistanceInstruction[] = [];\r\n const touchInstructions: ToolAssistanceInstruction[] = [];\r\n\r\n const acceptMsg = CoreTools.translate(\"ElementSet.Inputs.AcceptPoint\");\r\n const rejectMsg = CoreTools.translate(this._haveEyePt ? \"ElementSet.Inputs.Restart\" : \"ElementSet.Inputs.Exit\");\r\n if (!ToolAssistance.createTouchCursorInstructions(touchInstructions))\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.OneTouchTap, acceptMsg, false, ToolAssistanceInputMethod.Touch));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.LeftClick, acceptMsg, false, ToolAssistanceInputMethod.Mouse));\r\n touchInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.TwoTouchTap, rejectMsg, false, ToolAssistanceInputMethod.Touch));\r\n mouseInstructions.push(ToolAssistance.createInstruction(ToolAssistanceImage.RightClick, rejectMsg, false, ToolAssistanceInputMethod.Mouse));\r\n\r\n const sections: ToolAssistanceSection[] = [];\r\n sections.push(ToolAssistance.createSection(mouseInstructions, ToolAssistance.inputsLabel));\r\n sections.push(ToolAssistance.createSection(touchInstructions, ToolAssistance.inputsLabel));\r\n\r\n const instructions = ToolAssistance.createInstructions(mainInstruction, sections);\r\n IModelApp.notifications.setToolAssistance(instructions);\r\n }\r\n\r\n public async onRestartTool(): Promise<void> {\r\n const tool = new SetupWalkCameraTool();\r\n if (!await tool.run())\r\n return this.exitTool();\r\n }\r\n\r\n protected getAdjustedEyePoint() { return this._eyePtWorld.plusScaled(Vector3d.unitZ(), ToolSettings.walkEyeHeight); }\r\n protected getAdjustedTargetPoint() { return Point3d.create(this._targetPtWorld.x, this._targetPtWorld.y, this.getAdjustedEyePoint().z); }\r\n\r\n public override async onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled> {\r\n if (undefined === ev.viewport) {\r\n return EventHandled.Yes;\r\n } else if (undefined === this.viewport) {\r\n if (!ev.viewport.view.allow3dManipulations())\r\n return EventHandled.Yes;\r\n this.viewport = ev.viewport;\r\n } else if (this.viewport.view.iModel !== ev.viewport.view.iModel) {\r\n if (this._haveEyePt)\r\n return EventHandled.Yes;\r\n this.viewport = ev.viewport;\r\n return EventHandled.Yes;\r\n }\r\n\r\n if (this._haveEyePt) {\r\n this._targetPtWorld.setFrom(ev.point);\r\n this.doManipulation();\r\n await this.onReinitialize();\r\n } else {\r\n this._eyePtWorld.setFrom(ev.point);\r\n this._targetPtWorld.setFrom(this._eyePtWorld);\r\n this._haveEyePt = true;\r\n this.setupAndPromptForNextAction();\r\n }\r\n\r\n return EventHandled.Yes;\r\n }\r\n\r\n public override async onMouseMotion(ev: BeButtonEvent) {\r\n if (!this._haveEyePt)\r\n return;\r\n this._targetPtWorld.setFrom(ev.point);\r\n IModelApp.viewManager.invalidateDecorationsAllViews();\r\n }\r\n\r\n private static getFigurePoints(): Point3d[] {\r\n const figurePts: Point3d[] = [];\r\n figurePts.push(Point3d.create(1.064, -0.014));\r\n figurePts.push(Point3d.create(1.051, 0.039));\r\n figurePts.push(Point3d.create(1.008, 0.058));\r\n figurePts.push(Point3d.create(0.962, 0.048));\r\n figurePts.push(Point3d.create(0.920, 0.026));\r\n figurePts.push(Point3d.create(0.898, 0.026));\r\n figurePts.push(Point3d.create(0.853, 0.094));\r\n figurePts.push(Point3d.create(0.741, 0.120));\r\n figurePts.push(Point3d.create(0.652, 0.091));\r\n figurePts.push(Point3d.create(0.514, 0.107));\r\n figurePts.push(Point3d.create(0.304, 0.108));\r\n figurePts.push(Point3d.create(0.040, 0.135));\r\n figurePts.push(Point3d.create(-0.023, 0.133));\r\n figurePts.push(Point3d.create(-0.031, 0.088));\r\n figurePts.push(Point3d.create(0.041, 0.068));\r\n figurePts.push(Point3d.create(0.299, 0.035));\r\n figurePts.push(Point3d.create(0.447, -0.015));\r\n figurePts.push(Point3d.create(0.267, -0.042));\r\n figurePts.push(Point3d.create(0.019, -0.036));\r\n figurePts.push(Point3d.create(-0.027, -0.146));\r\n figurePts.push(Point3d.create(-0.005, -0.179));\r\n figurePts.push(Point3d.create(0.056, -0.108));\r\n figurePts.push(Point3d.create(0.270, -0.122));\r\n figurePts.push(Point3d.create(0.483, -0.120));\r\n figurePts.push(Point3d.create(0.649, -0.145));\r\n figurePts.push(Point3d.create(0.715, -0.186));\r\n figurePts.push(Point3d.create(0.865, -0.135));\r\n figurePts.push(Point3d.create(0.905, -0.039));\r\n figurePts.push(Point3d.create(0.948, -0.035));\r\n figurePts.push(Point3d.create(0.979, -0.051));\r\n figurePts.push(Point3d.create(1.037, -0.046));\r\n figurePts.push(figurePts[0].clone());\r\n return figurePts;\r\n }\r\n\r\n private static getFigureTransform(vp: Viewport, base: Point3d, direction: Vector3d, scale: number): Transform | undefined {\r\n const boresite = AccuDrawHintBuilder.getBoresite(base, vp);\r\n if (Math.abs(direction.dotProduct(boresite.direction)) >= 0.9999)\r\n return undefined;\r\n\r\n const matrix = Matrix3d.createRigidFromColumns(direction, boresite.direction, AxisOrder.XZY);\r\n if (undefined === matrix)\r\n return undefined;\r\n\r\n matrix.scaleColumnsInPlace(scale, scale, scale);\r\n return Transform.createRefs(base.clone(), matrix);\r\n }\r\n\r\n public static drawFigure(context: DecorateContext, vp: Viewport, groundPt: Point3d, eyeHeight: number): void {\r\n if (!vp.view.is3d() || vp.view.iModel !== context.viewport.view.iModel)\r\n return;\r\n\r\n const transform = this.getFigureTransform(context.viewport, groundPt, Vector3d.unitZ(), eyeHeight);\r\n if (undefined === transform)\r\n return;\r\n\r\n const figurePts = this.getFigurePoints();\r\n const color = EditManipulator.HandleUtils.adjustForBackgroundColor(ColorDef.black, vp);\r\n const fill = ColorDef.from(255, 245, 225, 100);\r\n\r\n const builderShadow = context.createGraphicBuilder(GraphicType.WorldOverlay);\r\n builderShadow.setSymbology(color, ColorDef.black.withAlpha(30), viewHandleWeight.thin);\r\n builderShadow.addArc(Arc3d.createXY(groundPt, eyeHeight * 0.22), true, true);\r\n context.addDecorationFromBuilder(builderShadow);\r\n\r\n const builderHid = context.createGraphicBuilder(GraphicType.WorldDecoration, transform);\r\n builderHid.setSymbology(color, fill, viewHandleWeight.thin);\r\n builderHid.addShape(figurePts); // Copies points...\r\n context.addDecorationFromBuilder(builderHid);\r\n\r\n const builderVis = context.createGraphicBuilder(GraphicType.WorldOverlay, transform);\r\n builderVis.setSymbology(color, color, viewHandleWeight.normal);\r\n builderVis.addLineString(figurePts); // Owns points...\r\n context.addDecorationFromBuilder(builderVis);\r\n }\r\n\r\n public override decorate(context: DecorateContext): void {\r\n if (!this._haveEyePt || undefined === this.viewport)\r\n return;\r\n SetupWalkCameraTool.drawFigure(context, this.viewport, this._eyePtWorld, ToolSettings.walkEyeHeight);\r\n SetupCameraTool.drawCameraFrustum(context, this.viewport, this.getAdjustedEyePoint(), this.getAdjustedTargetPoint(), this._eyePtWorld, this._targetPtWorld);\r\n }\r\n\r\n public override decorateSuspended(context: DecorateContext): void { this.decorate(context); }\r\n\r\n private doManipulation(): void {\r\n const vp = this.viewport;\r\n if (undefined === vp)\r\n return;\r\n\r\n const view = vp.view;\r\n if (!view.is3d() || !view.allow3dManipulations())\r\n return;\r\n\r\n const eyePoint = this.getAdjustedEyePoint();\r\n const targetPoint = this.getAdjustedTargetPoint();\r\n const lensAngle = ToolSettings.walkCameraAngle;\r\n if (ViewStatus.Success !== view.lookAt({ eyePoint, targetPoint, upVector: Vector3d.unitZ(), lensAngle }))\r\n return;\r\n\r\n vp.synchWithView({ animateFrustumChange: true });\r\n }\r\n}\r\n"]}
@@ -2,14 +2,12 @@
2
2
  * @module Tools
3
3
  */
4
4
  import { Angle, Plane3dByOriginAndUnitNormal, Point3d, Range3d } from "@itwin/core-geometry";
5
- import { DialogItem, DialogProperty, DialogPropertySyncItem } from "@itwin/appui-abstract";
6
5
  import { StandardViewId } from "../StandardView";
7
6
  import { Animator, MarginOptions, ViewChangeOptions } from "../ViewAnimation";
8
7
  import { DecorateContext } from "../ViewContext";
9
8
  import { DepthPointSource, ScreenViewport, Viewport } from "../Viewport";
10
9
  import { ViewPose } from "../ViewPose";
11
10
  import { ViewStatus } from "../ViewStatus";
12
- import { PrimitiveTool } from "./PrimitiveTool";
13
11
  import { BeButtonEvent, BeModifierKeys, BeTouchEvent, BeWheelEvent, EventHandled, InteractiveTool } from "./Tool";
14
12
  import { ToolAssistanceInstruction } from "./ToolAssistance";
15
13
  /** @internal */
@@ -477,84 +475,5 @@ export declare class ViewToggleCameraTool extends ViewTool {
477
475
  onInstall(): Promise<boolean>;
478
476
  onPostInstall(): Promise<void>;
479
477
  }
480
- /** A tool that sets the view camera by two points. This is a PrimitiveTool and not a ViewTool to allow the view to be panned, zoomed, and rotated while defining the points.
481
- * To show tool settings for specifying camera and target heights above the snap point, make sure formatting and parsing data are cached before the tool starts
482
- * by calling QuantityFormatter.onInitialized at app startup.
483
- * @public
484
- */
485
- export declare class SetupCameraTool extends PrimitiveTool {
486
- static toolId: string;
487
- static iconSpec: string;
488
- viewport?: ScreenViewport;
489
- protected _haveEyePt: boolean;
490
- protected _eyePtWorld: Point3d;
491
- protected _targetPtWorld: Point3d;
492
- isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean;
493
- isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean;
494
- requireWriteableTarget(): boolean;
495
- onPostInstall(): Promise<void>;
496
- onUnsuspend(): Promise<void>;
497
- protected setupAndPromptForNextAction(): void;
498
- onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled>;
499
- protected provideToolAssistance(): void;
500
- onRestartTool(): Promise<void>;
501
- protected getAdjustedEyePoint(): Point3d;
502
- protected getAdjustedTargetPoint(): Point3d;
503
- onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled>;
504
- onMouseMotion(ev: BeButtonEvent): Promise<void>;
505
- static drawCameraFrustum(context: DecorateContext, vp: ScreenViewport, eyePtWorld: Point3d, targetPtWorld: Point3d, eyeSnapPtWorld?: Point3d, targetSnapPtWorld?: Point3d): void;
506
- decorate(context: DecorateContext): void;
507
- decorateSuspended(context: DecorateContext): void;
508
- private doManipulation;
509
- private _useCameraHeightProperty;
510
- get useCameraHeightProperty(): DialogProperty<boolean>;
511
- get useCameraHeight(): boolean;
512
- set useCameraHeight(option: boolean);
513
- private _cameraHeightProperty;
514
- get cameraHeightProperty(): DialogProperty<number>;
515
- get cameraHeight(): number;
516
- set cameraHeight(value: number);
517
- private _useTargetHeightProperty;
518
- get useTargetHeightProperty(): DialogProperty<boolean>;
519
- get useTargetHeight(): boolean;
520
- set useTargetHeight(value: boolean);
521
- private _targetHeightProperty;
522
- get targetHeightProperty(): DialogProperty<number>;
523
- get targetHeight(): number;
524
- set targetHeight(value: number);
525
- protected getToolSettingLockProperty(property: DialogProperty<any>): DialogProperty<boolean> | undefined;
526
- applyToolSettingPropertyChange(updatedValue: DialogPropertySyncItem): Promise<boolean>;
527
- supplyToolSettingsProperties(): DialogItem[] | undefined;
528
- }
529
- /** A tool that sets a walk tool starting position by a floor point and look direction. This is a PrimitiveTool and not a ViewTool to allow the view to be panned, zoomed, and rotated while defining the points.
530
- * @public
531
- */
532
- export declare class SetupWalkCameraTool extends PrimitiveTool {
533
- static toolId: string;
534
- static iconSpec: string;
535
- viewport?: ScreenViewport;
536
- protected _haveEyePt: boolean;
537
- protected _eyePtWorld: Point3d;
538
- protected _targetPtWorld: Point3d;
539
- isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean;
540
- isValidLocation(_ev: BeButtonEvent, _isButtonEvent: boolean): boolean;
541
- requireWriteableTarget(): boolean;
542
- onPostInstall(): Promise<void>;
543
- onUnsuspend(): Promise<void>;
544
- protected setupAndPromptForNextAction(): void;
545
- onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled>;
546
- protected provideToolAssistance(): void;
547
- onRestartTool(): Promise<void>;
548
- protected getAdjustedEyePoint(): Point3d;
549
- protected getAdjustedTargetPoint(): Point3d;
550
- onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled>;
551
- onMouseMotion(ev: BeButtonEvent): Promise<void>;
552
- private static getFigurePoints;
553
- private static getFigureTransform;
554
- static drawFigure(context: DecorateContext, vp: Viewport, groundPt: Point3d, eyeHeight: number): void;
555
- decorate(context: DecorateContext): void;
556
- decorateSuspended(context: DecorateContext): void;
557
- private doManipulation;
558
- }
559
478
  export {};
560
479
  //# sourceMappingURL=ViewTool.d.ts.map