@itwin/core-markup 3.0.0-dev.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +657 -0
- package/LICENSE.md +9 -0
- package/README.md +11 -0
- package/lib/Markup.d.ts +312 -0
- package/lib/Markup.d.ts.map +1 -0
- package/lib/Markup.js +409 -0
- package/lib/Markup.js.map +1 -0
- package/lib/MarkupTool.d.ts +39 -0
- package/lib/MarkupTool.d.ts.map +1 -0
- package/lib/MarkupTool.js +82 -0
- package/lib/MarkupTool.js.map +1 -0
- package/lib/RedlineTool.d.ts +146 -0
- package/lib/RedlineTool.d.ts.map +1 -0
- package/lib/RedlineTool.js +498 -0
- package/lib/RedlineTool.js.map +1 -0
- package/lib/SelectTool.d.ts +127 -0
- package/lib/SelectTool.d.ts.map +1 -0
- package/lib/SelectTool.js +718 -0
- package/lib/SelectTool.js.map +1 -0
- package/lib/SvgJsExt.d.ts +86 -0
- package/lib/SvgJsExt.d.ts.map +1 -0
- package/lib/SvgJsExt.js +186 -0
- package/lib/SvgJsExt.js.map +1 -0
- package/lib/TextEdit.d.ts +44 -0
- package/lib/TextEdit.d.ts.map +1 -0
- package/lib/TextEdit.js +185 -0
- package/lib/TextEdit.js.map +1 -0
- package/lib/Undo.d.ts +47 -0
- package/lib/Undo.d.ts.map +1 -0
- package/lib/Undo.js +142 -0
- package/lib/Undo.js.map +1 -0
- package/lib/core-markup.d.ts +19 -0
- package/lib/core-markup.d.ts.map +1 -0
- package/lib/core-markup.js +35 -0
- package/lib/core-markup.js.map +1 -0
- package/lib/public/Markup/rotate.png +0 -0
- package/lib/public/locales/en/MarkupTools.json +98 -0
- package/package.json +81 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkupTool.js","sourceRoot":"","sources":["../src/MarkupTool.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 MarkupTools\r\n */\r\n\r\nimport { XAndY } from \"@itwin/core-geometry\";\r\nimport { BeButton, BeTouchEvent, CoordinateLockOverrides, EventHandled, IModelApp, PrimitiveTool, Viewport } from \"@itwin/core-frontend\";\r\nimport { G, LinkedHTMLElement, Element as MarkupElement, Text as MarkupText } from \"@svgdotjs/svg.js\";\r\nimport { Markup, MarkupApp } from \"./Markup\";\r\n\r\n/** Base class for all tools that operate on Markup elements.\r\n * @public\r\n */\r\nexport abstract class MarkupTool extends PrimitiveTool {\r\n public markup!: Markup;\r\n public static toolKey = \"MarkupTools:tools.Markup.\";\r\n public override requireWriteableTarget(): boolean { return false; }\r\n public override isCompatibleViewport(vp: Viewport | undefined, isSelectedViewChange: boolean): boolean { return (super.isCompatibleViewport(vp, isSelectedViewChange) && undefined !== vp && vp === IModelApp.toolAdmin.markupView); }\r\n public override async onInstall(): Promise<boolean> { if (undefined === MarkupApp.markup) return false; this.markup = MarkupApp.markup; return super.onInstall(); }\r\n public override async onPostInstall() { await super.onPostInstall(); this.setupAndPromptForNextAction(); }\r\n public override async onUnsuspend() { this.showPrompt(); }\r\n public async onRestartTool() { return this.exitTool(); }\r\n\r\n protected showPrompt(): void { }\r\n protected setupAndPromptForNextAction(): void {\r\n IModelApp.toolAdmin.toolState.coordLockOvr = CoordinateLockOverrides.All; // Don't adjust point to ACS or grid...\r\n this.showPrompt();\r\n }\r\n protected outputMarkupPrompt(msg: string) { IModelApp.notifications.outputPromptByKey(MarkupTool.toolKey + msg); }\r\n\r\n public override async onTouchMoveStart(ev: BeTouchEvent, startEv: BeTouchEvent): Promise<EventHandled> {\r\n if (startEv.isSingleTouch)\r\n await IModelApp.toolAdmin.convertTouchMoveStartToButtonDownAndMotion(startEv, ev);\r\n return EventHandled.Yes; // View tools are not allowed during redlining; use touch events to create markup and don't pass event to IdleTool...\r\n }\r\n\r\n public override async onTouchMove(ev: BeTouchEvent): Promise<void> { return IModelApp.toolAdmin.convertTouchMoveToMotion(ev); }\r\n public override async onTouchComplete(ev: BeTouchEvent): Promise<void> { return IModelApp.toolAdmin.convertTouchEndToButtonUp(ev); }\r\n public override async onTouchCancel(ev: BeTouchEvent): Promise<void> { return IModelApp.toolAdmin.convertTouchEndToButtonUp(ev, BeButton.Reset); }\r\n\r\n public override async undoPreviousStep(): Promise<boolean> {\r\n if (await this.onUndoPreviousStep()) // first see if this tool has an \"oops\" operation.\r\n return true; // yes, we're done\r\n this.markup.undo.doUndo(); // otherwise undo the last change by previous tools\r\n return true;\r\n }\r\n\r\n public override async redoPreviousStep(): Promise<boolean> {\r\n if (await this.onRedoPreviousStep())\r\n return true;\r\n this.markup.undo.doRedo();\r\n return true;\r\n }\r\n\r\n /** Find the topmost MarkupElement at the specified point in the markup view.\r\n * @param pt the point in view coordinates\r\n * @returns The topmost element, or undefined if no elements under pt.\r\n */\r\n public pickElement(pt: XAndY): MarkupElement | undefined {\r\n const markup = this.markup;\r\n const rect = markup.markupDiv.getBoundingClientRect();\r\n const node = document.elementFromPoint(pt.x + rect.left, pt.y + rect.top) as LinkedHTMLElement | null;\r\n if (!node || !node.instance)\r\n return undefined;\r\n const el = node.instance;\r\n return el.getChildOrGroupOf(markup.svgMarkup!);\r\n }\r\n protected setCurrentStyle(element: MarkupElement, canBeFilled: boolean): void {\r\n element.css(MarkupApp.props.active.element);\r\n if (!canBeFilled)\r\n element.css({ fill: \"none\" });\r\n }\r\n\r\n protected setCurrentTextStyle(element: MarkupElement): void { element.css(MarkupApp.props.active.text); }\r\n\r\n /** @internal */\r\n public createBoxedText(g: G, text: MarkupText) {\r\n const boxedText = g.group().addClass(MarkupApp.boxedTextClass);\r\n const outline = text.getOutline(3);\r\n this.setCurrentStyle(outline, true);\r\n outline.css({ \"stroke-width\": 1 });\r\n outline.addTo(boxedText);\r\n text.addTo(boxedText); // make sure the text is on top\r\n return boxedText;\r\n }\r\n\r\n}\r\n"]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/** @packageDocumentation
|
|
2
|
+
* @module MarkupTools
|
|
3
|
+
*/
|
|
4
|
+
import { Point3d } from "@itwin/core-geometry";
|
|
5
|
+
import { BeButtonEvent, EventHandled } from "@itwin/core-frontend";
|
|
6
|
+
import { G, Marker, Element as MarkupElement } from "@svgdotjs/svg.js";
|
|
7
|
+
import { MarkupTool } from "./MarkupTool";
|
|
8
|
+
/** Base class for tools that place new Markup elements
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export declare abstract class RedlineTool extends MarkupTool {
|
|
12
|
+
protected _minPoints: number;
|
|
13
|
+
protected _nRequiredPoints: number;
|
|
14
|
+
protected readonly _points: Point3d[];
|
|
15
|
+
protected onAdded(el: MarkupElement): void;
|
|
16
|
+
protected isComplete(_ev: BeButtonEvent): boolean;
|
|
17
|
+
protected setupAndPromptForNextAction(): void;
|
|
18
|
+
protected createMarkup(_svgMarkup: G, _ev: BeButtonEvent, _isDynamics: boolean): void;
|
|
19
|
+
protected clearDynamicsMarkup(_isDynamics: boolean): void;
|
|
20
|
+
onRestartTool(): Promise<void>;
|
|
21
|
+
onCleanup(): Promise<void>;
|
|
22
|
+
onReinitialize(): Promise<void>;
|
|
23
|
+
onUndoPreviousStep(): Promise<boolean>;
|
|
24
|
+
onMouseMotion(ev: BeButtonEvent): Promise<void>;
|
|
25
|
+
onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled>;
|
|
26
|
+
onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled>;
|
|
27
|
+
protected provideToolAssistance(mainInstrKey: string, singlePoint?: boolean): void;
|
|
28
|
+
}
|
|
29
|
+
/** Tool for placing Markup Lines
|
|
30
|
+
* @public
|
|
31
|
+
*/
|
|
32
|
+
export declare class LineTool extends RedlineTool {
|
|
33
|
+
static toolId: string;
|
|
34
|
+
static iconSpec: string;
|
|
35
|
+
protected showPrompt(): void;
|
|
36
|
+
protected createMarkup(svgMarkup: G, ev: BeButtonEvent, isDynamics: boolean): void;
|
|
37
|
+
}
|
|
38
|
+
/** Tool for placing Markup Rectangles
|
|
39
|
+
* @public
|
|
40
|
+
*/
|
|
41
|
+
export declare class RectangleTool extends RedlineTool {
|
|
42
|
+
protected _cornerRadius?: number | undefined;
|
|
43
|
+
static toolId: string;
|
|
44
|
+
static iconSpec: string;
|
|
45
|
+
constructor(_cornerRadius?: number | undefined);
|
|
46
|
+
protected showPrompt(): void;
|
|
47
|
+
protected createMarkup(svgMarkup: G, ev: BeButtonEvent, isDynamics: boolean): void;
|
|
48
|
+
}
|
|
49
|
+
/** Tool for placing Markup Polygons
|
|
50
|
+
* @public
|
|
51
|
+
*/
|
|
52
|
+
export declare class PolygonTool extends RedlineTool {
|
|
53
|
+
protected _numSides?: number | undefined;
|
|
54
|
+
static toolId: string;
|
|
55
|
+
static iconSpec: string;
|
|
56
|
+
constructor(_numSides?: number | undefined);
|
|
57
|
+
protected showPrompt(): void;
|
|
58
|
+
protected getPoints(points: number[], center: Point3d, edge: Point3d, numSides: number, inscribe: boolean): boolean;
|
|
59
|
+
protected createMarkup(svgMarkup: G, ev: BeButtonEvent, isDynamics: boolean): void;
|
|
60
|
+
}
|
|
61
|
+
/** Tool for placing Markup Clouds
|
|
62
|
+
* @public
|
|
63
|
+
*/
|
|
64
|
+
export declare class CloudTool extends RedlineTool {
|
|
65
|
+
static toolId: string;
|
|
66
|
+
static iconSpec: string;
|
|
67
|
+
protected _cloud?: MarkupElement;
|
|
68
|
+
protected showPrompt(): void;
|
|
69
|
+
protected createMarkup(svgMarkup: G, ev: BeButtonEvent, isDynamics: boolean): void;
|
|
70
|
+
protected clearDynamicsMarkup(isDynamics: boolean): void;
|
|
71
|
+
}
|
|
72
|
+
/** Tool for placing Markup Circles
|
|
73
|
+
* @public
|
|
74
|
+
*/
|
|
75
|
+
export declare class CircleTool extends RedlineTool {
|
|
76
|
+
static toolId: string;
|
|
77
|
+
static iconSpec: string;
|
|
78
|
+
protected showPrompt(): void;
|
|
79
|
+
protected createMarkup(svgMarkup: G, ev: BeButtonEvent, isDynamics: boolean): void;
|
|
80
|
+
}
|
|
81
|
+
/** Tool for placing Markup Ellipses
|
|
82
|
+
* @public
|
|
83
|
+
*/
|
|
84
|
+
export declare class EllipseTool extends RedlineTool {
|
|
85
|
+
static toolId: string;
|
|
86
|
+
static iconSpec: string;
|
|
87
|
+
protected showPrompt(): void;
|
|
88
|
+
protected createMarkup(svgMarkup: G, ev: BeButtonEvent, isDynamics: boolean): void;
|
|
89
|
+
}
|
|
90
|
+
/** Tool for placing Markup Arrows
|
|
91
|
+
* @public
|
|
92
|
+
*/
|
|
93
|
+
export declare class ArrowTool extends RedlineTool {
|
|
94
|
+
protected _arrowPos?: string | undefined;
|
|
95
|
+
static toolId: string;
|
|
96
|
+
static iconSpec: string;
|
|
97
|
+
/** ctor for ArrowTool
|
|
98
|
+
* @param _arrowPos "start", "end", or "both". If undefined = "end".
|
|
99
|
+
*/
|
|
100
|
+
constructor(_arrowPos?: string | undefined);
|
|
101
|
+
protected showPrompt(): void;
|
|
102
|
+
protected getOrCreateArrowMarker(color: string): Marker;
|
|
103
|
+
protected createMarkup(svgMarkup: G, ev: BeButtonEvent, isDynamics: boolean): void;
|
|
104
|
+
}
|
|
105
|
+
/** Tool for measuring distances and placing Markups of them
|
|
106
|
+
* @public
|
|
107
|
+
*/
|
|
108
|
+
export declare class DistanceTool extends ArrowTool {
|
|
109
|
+
static toolId: string;
|
|
110
|
+
static iconSpec: string;
|
|
111
|
+
protected readonly _startPointWorld: Point3d;
|
|
112
|
+
protected showPrompt(): void;
|
|
113
|
+
protected setupAndPromptForNextAction(): void;
|
|
114
|
+
protected getFormattedDistance(distance: number): string | undefined;
|
|
115
|
+
protected createMarkup(svgMarkup: G, ev: BeButtonEvent, isDynamics: boolean): void;
|
|
116
|
+
onDataButtonDown(ev: BeButtonEvent): Promise<EventHandled>;
|
|
117
|
+
}
|
|
118
|
+
/** Tool for placing Markup freehand sketches
|
|
119
|
+
* @public
|
|
120
|
+
*/
|
|
121
|
+
export declare class SketchTool extends RedlineTool {
|
|
122
|
+
static toolId: string;
|
|
123
|
+
static iconSpec: string;
|
|
124
|
+
protected _minDistSquared: number;
|
|
125
|
+
protected showPrompt(): void;
|
|
126
|
+
protected createMarkup(svgMarkup: G, ev: BeButtonEvent, isDynamics: boolean): void;
|
|
127
|
+
onMouseMotion(ev: BeButtonEvent): Promise<void>;
|
|
128
|
+
}
|
|
129
|
+
/** Tool for placing SVG symbols on a Markup
|
|
130
|
+
* @public
|
|
131
|
+
*/
|
|
132
|
+
export declare class SymbolTool extends RedlineTool {
|
|
133
|
+
protected _symbolData?: string | undefined;
|
|
134
|
+
protected _applyCurrentStyle?: boolean | undefined;
|
|
135
|
+
static toolId: string;
|
|
136
|
+
static iconSpec: string;
|
|
137
|
+
protected _symbol?: MarkupElement;
|
|
138
|
+
constructor(_symbolData?: string | undefined, _applyCurrentStyle?: boolean | undefined);
|
|
139
|
+
onInstall(): Promise<boolean>;
|
|
140
|
+
protected showPrompt(): void;
|
|
141
|
+
protected createMarkup(svgMarkup: G, ev: BeButtonEvent, isDynamics: boolean): void;
|
|
142
|
+
onDataButtonUp(ev: BeButtonEvent): Promise<EventHandled>;
|
|
143
|
+
onResetButtonUp(_ev: BeButtonEvent): Promise<EventHandled>;
|
|
144
|
+
protected clearDynamicsMarkup(isDynamics: boolean): void;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=RedlineTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedlineTool.d.ts","sourceRoot":"","sources":["../src/RedlineTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,498 @@
|
|
|
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 MarkupTools
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SymbolTool = exports.SketchTool = exports.DistanceTool = exports.ArrowTool = exports.EllipseTool = exports.CircleTool = exports.CloudTool = exports.PolygonTool = exports.RectangleTool = exports.LineTool = exports.RedlineTool = void 0;
|
|
11
|
+
// cspell:ignore rtmp stmp
|
|
12
|
+
const core_geometry_1 = require("@itwin/core-geometry");
|
|
13
|
+
const core_frontend_1 = require("@itwin/core-frontend");
|
|
14
|
+
const svg_js_1 = require("@svgdotjs/svg.js");
|
|
15
|
+
const Markup_1 = require("./Markup");
|
|
16
|
+
const MarkupTool_1 = require("./MarkupTool");
|
|
17
|
+
/** Base class for tools that place new Markup elements
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
class RedlineTool extends MarkupTool_1.MarkupTool {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(...arguments);
|
|
23
|
+
this._minPoints = 1;
|
|
24
|
+
this._nRequiredPoints = 2;
|
|
25
|
+
this._points = [];
|
|
26
|
+
}
|
|
27
|
+
onAdded(el) {
|
|
28
|
+
const markup = this.markup;
|
|
29
|
+
const undo = markup.undo;
|
|
30
|
+
undo.performOperation(this.keyin, () => undo.onAdded(el));
|
|
31
|
+
markup.selected.restart(el);
|
|
32
|
+
}
|
|
33
|
+
isComplete(_ev) { return this._points.length >= this._nRequiredPoints; }
|
|
34
|
+
setupAndPromptForNextAction() {
|
|
35
|
+
super.setupAndPromptForNextAction();
|
|
36
|
+
this.markup.disablePick();
|
|
37
|
+
core_frontend_1.IModelApp.toolAdmin.setCursor(0 === this._points.length ? core_frontend_1.IModelApp.viewManager.crossHairCursor : core_frontend_1.IModelApp.viewManager.dynamicsCursor);
|
|
38
|
+
}
|
|
39
|
+
createMarkup(_svgMarkup, _ev, _isDynamics) { }
|
|
40
|
+
clearDynamicsMarkup(_isDynamics) { this.markup.svgDynamics.clear(); }
|
|
41
|
+
async onRestartTool() { return this.exitTool(); } // Default to single shot and return control to select tool...
|
|
42
|
+
async onCleanup() { this.clearDynamicsMarkup(false); }
|
|
43
|
+
async onReinitialize() {
|
|
44
|
+
this.clearDynamicsMarkup(false);
|
|
45
|
+
return super.onReinitialize();
|
|
46
|
+
}
|
|
47
|
+
async onUndoPreviousStep() {
|
|
48
|
+
return (0 === this._points.length) ? false : (this.onReinitialize(), true);
|
|
49
|
+
}
|
|
50
|
+
async onMouseMotion(ev) {
|
|
51
|
+
if (undefined === ev.viewport || this._points.length < this._minPoints)
|
|
52
|
+
return;
|
|
53
|
+
this.clearDynamicsMarkup(true);
|
|
54
|
+
this.createMarkup(this.markup.svgDynamics, ev, true);
|
|
55
|
+
}
|
|
56
|
+
async onDataButtonDown(ev) {
|
|
57
|
+
if (undefined === ev.viewport)
|
|
58
|
+
return core_frontend_1.EventHandled.No;
|
|
59
|
+
this._points.push(Markup_1.MarkupApp.convertVpToVb(ev.viewPoint));
|
|
60
|
+
if (!this.isComplete(ev)) {
|
|
61
|
+
this.setupAndPromptForNextAction();
|
|
62
|
+
return core_frontend_1.EventHandled.No;
|
|
63
|
+
}
|
|
64
|
+
this.createMarkup(this.markup.svgMarkup, ev, false);
|
|
65
|
+
await this.onReinitialize();
|
|
66
|
+
return core_frontend_1.EventHandled.No;
|
|
67
|
+
}
|
|
68
|
+
async onResetButtonUp(_ev) {
|
|
69
|
+
await this.onReinitialize();
|
|
70
|
+
return core_frontend_1.EventHandled.No;
|
|
71
|
+
}
|
|
72
|
+
provideToolAssistance(mainInstrKey, singlePoint = false) {
|
|
73
|
+
const mainInstruction = core_frontend_1.ToolAssistance.createInstruction(this.iconSpec, core_frontend_1.IModelApp.i18n.translate(mainInstrKey));
|
|
74
|
+
const mouseInstructions = [];
|
|
75
|
+
const touchInstructions = [];
|
|
76
|
+
const acceptMsg = core_frontend_1.CoreTools.translate("ElementSet.Inputs.AcceptPoint");
|
|
77
|
+
const rejectMsg = core_frontend_1.CoreTools.translate("ElementSet.Inputs.Exit");
|
|
78
|
+
if (!core_frontend_1.ToolAssistance.createTouchCursorInstructions(touchInstructions))
|
|
79
|
+
touchInstructions.push(core_frontend_1.ToolAssistance.createInstruction(singlePoint ? core_frontend_1.ToolAssistanceImage.OneTouchTap : core_frontend_1.ToolAssistanceImage.OneTouchDrag, acceptMsg, false, core_frontend_1.ToolAssistanceInputMethod.Touch));
|
|
80
|
+
mouseInstructions.push(core_frontend_1.ToolAssistance.createInstruction(core_frontend_1.ToolAssistanceImage.LeftClick, acceptMsg, false, core_frontend_1.ToolAssistanceInputMethod.Mouse));
|
|
81
|
+
touchInstructions.push(core_frontend_1.ToolAssistance.createInstruction(core_frontend_1.ToolAssistanceImage.TwoTouchTap, rejectMsg, false, core_frontend_1.ToolAssistanceInputMethod.Touch));
|
|
82
|
+
mouseInstructions.push(core_frontend_1.ToolAssistance.createInstruction(core_frontend_1.ToolAssistanceImage.RightClick, rejectMsg, false, core_frontend_1.ToolAssistanceInputMethod.Mouse));
|
|
83
|
+
const sections = [];
|
|
84
|
+
sections.push(core_frontend_1.ToolAssistance.createSection(mouseInstructions, core_frontend_1.ToolAssistance.inputsLabel));
|
|
85
|
+
sections.push(core_frontend_1.ToolAssistance.createSection(touchInstructions, core_frontend_1.ToolAssistance.inputsLabel));
|
|
86
|
+
const instructions = core_frontend_1.ToolAssistance.createInstructions(mainInstruction, sections);
|
|
87
|
+
core_frontend_1.IModelApp.notifications.setToolAssistance(instructions);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.RedlineTool = RedlineTool;
|
|
91
|
+
/** Tool for placing Markup Lines
|
|
92
|
+
* @public
|
|
93
|
+
*/
|
|
94
|
+
class LineTool extends RedlineTool {
|
|
95
|
+
showPrompt() { this.provideToolAssistance(core_frontend_1.CoreTools.tools + (0 === this._points.length ? "ElementSet.Prompts.StartPoint" : "ElementSet.Prompts.EndPoint")); }
|
|
96
|
+
createMarkup(svgMarkup, ev, isDynamics) {
|
|
97
|
+
if (this._points.length < (isDynamics ? this._nRequiredPoints - 1 : this._nRequiredPoints))
|
|
98
|
+
return;
|
|
99
|
+
const start = this._points[0];
|
|
100
|
+
const end = isDynamics ? Markup_1.MarkupApp.convertVpToVb(ev.viewPoint) : this._points[1];
|
|
101
|
+
const element = svgMarkup.line(start.x, start.y, end.x, end.y);
|
|
102
|
+
this.setCurrentStyle(element, false);
|
|
103
|
+
if (!isDynamics)
|
|
104
|
+
this.onAdded(element);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.LineTool = LineTool;
|
|
108
|
+
LineTool.toolId = "Markup.Line";
|
|
109
|
+
LineTool.iconSpec = "icon-line";
|
|
110
|
+
/** Tool for placing Markup Rectangles
|
|
111
|
+
* @public
|
|
112
|
+
*/
|
|
113
|
+
class RectangleTool extends RedlineTool {
|
|
114
|
+
constructor(_cornerRadius) {
|
|
115
|
+
super();
|
|
116
|
+
this._cornerRadius = _cornerRadius;
|
|
117
|
+
} // Specify radius to create a rectangle with rounded corners.
|
|
118
|
+
showPrompt() { this.provideToolAssistance(core_frontend_1.CoreTools.tools + (0 === this._points.length ? "ElementSet.Prompts.StartCorner" : "ElementSet.Prompts.OppositeCorner")); }
|
|
119
|
+
createMarkup(svgMarkup, ev, isDynamics) {
|
|
120
|
+
if (this._points.length < (isDynamics ? this._nRequiredPoints - 1 : this._nRequiredPoints))
|
|
121
|
+
return;
|
|
122
|
+
const start = this._points[0];
|
|
123
|
+
const end = isDynamics ? Markup_1.MarkupApp.convertVpToVb(ev.viewPoint) : this._points[1];
|
|
124
|
+
const vec = start.vectorTo(end);
|
|
125
|
+
const width = Math.abs(vec.x);
|
|
126
|
+
const height = Math.abs(vec.y);
|
|
127
|
+
if (width < 1 || height < 1)
|
|
128
|
+
return;
|
|
129
|
+
const offset = core_geometry_1.Point3d.create(vec.x < 0 ? end.x : start.x, vec.y < 0 ? end.y : start.y); // define location by corner points...
|
|
130
|
+
const element = svgMarkup.rect(width, height).move(offset.x, offset.y);
|
|
131
|
+
this.setCurrentStyle(element, true);
|
|
132
|
+
if (undefined !== this._cornerRadius)
|
|
133
|
+
element.radius(this._cornerRadius);
|
|
134
|
+
if (!isDynamics)
|
|
135
|
+
this.onAdded(element);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.RectangleTool = RectangleTool;
|
|
139
|
+
RectangleTool.toolId = "Markup.Rectangle";
|
|
140
|
+
RectangleTool.iconSpec = "icon-rectangle";
|
|
141
|
+
/** Tool for placing Markup Polygons
|
|
142
|
+
* @public
|
|
143
|
+
*/
|
|
144
|
+
class PolygonTool extends RedlineTool {
|
|
145
|
+
constructor(_numSides) {
|
|
146
|
+
super();
|
|
147
|
+
this._numSides = _numSides;
|
|
148
|
+
} // Specify number of polygon sides. Default if undefined is 5.
|
|
149
|
+
showPrompt() { this.provideToolAssistance(MarkupTool_1.MarkupTool.toolKey + (0 === this._points.length ? "Polygon.Prompts.FirstPoint" : "Polygon.Prompts.NextPoint")); }
|
|
150
|
+
getPoints(points, center, edge, numSides, inscribe) {
|
|
151
|
+
if (numSides < 3 || numSides > 100)
|
|
152
|
+
return false;
|
|
153
|
+
let radius = center.distanceXY(edge);
|
|
154
|
+
if (radius < 1)
|
|
155
|
+
return false;
|
|
156
|
+
const delta = (Math.PI * 2.0) / numSides;
|
|
157
|
+
const vec = center.vectorTo(edge);
|
|
158
|
+
let angle = core_geometry_1.Vector3d.unitX().planarRadiansTo(vec, core_geometry_1.Vector3d.unitZ());
|
|
159
|
+
if (!inscribe) {
|
|
160
|
+
const theta = delta * 0.5;
|
|
161
|
+
angle -= theta;
|
|
162
|
+
radius /= Math.cos(theta);
|
|
163
|
+
}
|
|
164
|
+
const rtmp = core_geometry_1.Point3d.create();
|
|
165
|
+
const stmp = core_geometry_1.Point3d.create();
|
|
166
|
+
for (let i = 0; i < numSides; i++, angle += delta) {
|
|
167
|
+
rtmp.x = radius * Math.cos(angle);
|
|
168
|
+
rtmp.y = radius * Math.sin(angle);
|
|
169
|
+
rtmp.z = 0.0;
|
|
170
|
+
center.plus(rtmp, stmp);
|
|
171
|
+
points.push(stmp.x);
|
|
172
|
+
points.push(stmp.y);
|
|
173
|
+
}
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
createMarkup(svgMarkup, ev, isDynamics) {
|
|
177
|
+
if (this._points.length < (isDynamics ? this._nRequiredPoints - 1 : this._nRequiredPoints))
|
|
178
|
+
return;
|
|
179
|
+
const center = this._points[0];
|
|
180
|
+
const edge = isDynamics ? Markup_1.MarkupApp.convertVpToVb(ev.viewPoint) : this._points[1];
|
|
181
|
+
const pts = [];
|
|
182
|
+
if (!this.getPoints(pts, center, edge, undefined !== this._numSides ? this._numSides : 5, true))
|
|
183
|
+
return;
|
|
184
|
+
const element = svgMarkup.polygon(pts);
|
|
185
|
+
this.setCurrentStyle(element, true);
|
|
186
|
+
if (!isDynamics)
|
|
187
|
+
this.onAdded(element);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.PolygonTool = PolygonTool;
|
|
191
|
+
PolygonTool.toolId = "Markup.Polygon";
|
|
192
|
+
PolygonTool.iconSpec = "icon-polygon";
|
|
193
|
+
/** Tool for placing Markup Clouds
|
|
194
|
+
* @public
|
|
195
|
+
*/
|
|
196
|
+
class CloudTool extends RedlineTool {
|
|
197
|
+
showPrompt() { this.provideToolAssistance(core_frontend_1.CoreTools.tools + (0 === this._points.length ? "ElementSet.Prompts.StartCorner" : "ElementSet.Prompts.OppositeCorner")); }
|
|
198
|
+
createMarkup(svgMarkup, ev, isDynamics) {
|
|
199
|
+
if (this._points.length < (isDynamics ? this._nRequiredPoints - 1 : this._nRequiredPoints))
|
|
200
|
+
return;
|
|
201
|
+
const start = this._points[0];
|
|
202
|
+
const end = isDynamics ? Markup_1.MarkupApp.convertVpToVb(ev.viewPoint) : this._points[1];
|
|
203
|
+
const vec = start.vectorTo(end);
|
|
204
|
+
const width = Math.abs(vec.x);
|
|
205
|
+
const height = Math.abs(vec.y);
|
|
206
|
+
if (width < 10 || height < 10)
|
|
207
|
+
return;
|
|
208
|
+
if (undefined === this._cloud) {
|
|
209
|
+
this._cloud = svgMarkup.path(Markup_1.MarkupApp.props.active.cloud.path);
|
|
210
|
+
}
|
|
211
|
+
else if (!isDynamics) {
|
|
212
|
+
svgMarkup.add(this._cloud);
|
|
213
|
+
}
|
|
214
|
+
const offset = core_geometry_1.Point3d.create(vec.x < 0 ? end.x : start.x, vec.y < 0 ? end.y : start.y); // define location by corner points...
|
|
215
|
+
this._cloud.move(offset.x, offset.y);
|
|
216
|
+
this._cloud.width(width);
|
|
217
|
+
this._cloud.height(height);
|
|
218
|
+
this.setCurrentStyle(this._cloud, true);
|
|
219
|
+
if (!isDynamics)
|
|
220
|
+
this.onAdded(this._cloud);
|
|
221
|
+
}
|
|
222
|
+
clearDynamicsMarkup(isDynamics) {
|
|
223
|
+
if (!isDynamics)
|
|
224
|
+
super.clearDynamicsMarkup(isDynamics); // For dynamics we don't create a new cloud each frame, we just set the width/height...
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.CloudTool = CloudTool;
|
|
228
|
+
CloudTool.toolId = "Markup.Cloud";
|
|
229
|
+
CloudTool.iconSpec = "icon-cloud";
|
|
230
|
+
/** Tool for placing Markup Circles
|
|
231
|
+
* @public
|
|
232
|
+
*/
|
|
233
|
+
class CircleTool extends RedlineTool {
|
|
234
|
+
showPrompt() { this.provideToolAssistance(MarkupTool_1.MarkupTool.toolKey + (0 === this._points.length ? "Circle.Prompts.FirstPoint" : "Circle.Prompts.NextPoint")); }
|
|
235
|
+
createMarkup(svgMarkup, ev, isDynamics) {
|
|
236
|
+
if (this._points.length < (isDynamics ? this._nRequiredPoints - 1 : this._nRequiredPoints))
|
|
237
|
+
return;
|
|
238
|
+
const start = this._points[0];
|
|
239
|
+
const end = isDynamics ? Markup_1.MarkupApp.convertVpToVb(ev.viewPoint) : this._points[1];
|
|
240
|
+
const radius = start.distanceXY(end);
|
|
241
|
+
if (radius < 1)
|
|
242
|
+
return;
|
|
243
|
+
const element = svgMarkup.circle(radius * 2.0).center(start.x, start.y);
|
|
244
|
+
this.setCurrentStyle(element, true);
|
|
245
|
+
if (!isDynamics)
|
|
246
|
+
this.onAdded(element);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.CircleTool = CircleTool;
|
|
250
|
+
CircleTool.toolId = "Markup.Circle";
|
|
251
|
+
CircleTool.iconSpec = "icon-circle";
|
|
252
|
+
/** Tool for placing Markup Ellipses
|
|
253
|
+
* @public
|
|
254
|
+
*/
|
|
255
|
+
class EllipseTool extends RedlineTool {
|
|
256
|
+
showPrompt() { this.provideToolAssistance(core_frontend_1.CoreTools.tools + (0 === this._points.length ? "ElementSet.Prompts.StartCorner" : "ElementSet.Prompts.OppositeCorner")); }
|
|
257
|
+
createMarkup(svgMarkup, ev, isDynamics) {
|
|
258
|
+
if (this._points.length < (isDynamics ? this._nRequiredPoints - 1 : this._nRequiredPoints))
|
|
259
|
+
return;
|
|
260
|
+
const start = this._points[0];
|
|
261
|
+
const end = isDynamics ? Markup_1.MarkupApp.convertVpToVb(ev.viewPoint) : this._points[1];
|
|
262
|
+
const vec = start.vectorTo(end);
|
|
263
|
+
const width = Math.abs(vec.x);
|
|
264
|
+
const height = Math.abs(vec.y);
|
|
265
|
+
if (width < 1 || height < 1)
|
|
266
|
+
return;
|
|
267
|
+
const offset = core_geometry_1.Point3d.create(vec.x < 0 ? end.x : start.x, vec.y < 0 ? end.y : start.y); // define location by corner points...
|
|
268
|
+
const element = svgMarkup.ellipse(width, height).move(offset.x, offset.y);
|
|
269
|
+
this.setCurrentStyle(element, true);
|
|
270
|
+
if (!isDynamics)
|
|
271
|
+
this.onAdded(element);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
exports.EllipseTool = EllipseTool;
|
|
275
|
+
EllipseTool.toolId = "Markup.Ellipse";
|
|
276
|
+
EllipseTool.iconSpec = "icon-ellipse";
|
|
277
|
+
/** Tool for placing Markup Arrows
|
|
278
|
+
* @public
|
|
279
|
+
*/
|
|
280
|
+
class ArrowTool extends RedlineTool {
|
|
281
|
+
/** ctor for ArrowTool
|
|
282
|
+
* @param _arrowPos "start", "end", or "both". If undefined = "end".
|
|
283
|
+
*/
|
|
284
|
+
constructor(_arrowPos) {
|
|
285
|
+
super();
|
|
286
|
+
this._arrowPos = _arrowPos;
|
|
287
|
+
}
|
|
288
|
+
showPrompt() { this.provideToolAssistance(core_frontend_1.CoreTools.tools + (0 === this._points.length ? "ElementSet.Prompts.StartPoint" : "ElementSet.Prompts.EndPoint")); }
|
|
289
|
+
getOrCreateArrowMarker(color) {
|
|
290
|
+
// NOTE: Flashing doesn't currently affect markers, need support for "context-stroke" and "context-fill". For now encode color in name...
|
|
291
|
+
const arrowProps = Markup_1.MarkupApp.props.active.arrow;
|
|
292
|
+
const arrowLength = arrowProps.length;
|
|
293
|
+
const arrowWidth = arrowProps.width;
|
|
294
|
+
const arrowMarkerId = `ArrowMarker${arrowLength}x${arrowWidth}-${color}`;
|
|
295
|
+
let marker = (0, svg_js_1.SVG)(`#${arrowMarkerId}`);
|
|
296
|
+
if (null === marker) {
|
|
297
|
+
marker = this.markup.svgMarkup.marker(arrowLength, arrowWidth).id(arrowMarkerId);
|
|
298
|
+
marker.polygon([0, 0, arrowLength, arrowWidth * 0.5, 0, arrowWidth]);
|
|
299
|
+
marker.attr("orient", "auto-start-reverse");
|
|
300
|
+
marker.attr("overflow", "visible"); // Don't clip the stroke that is being applied to allow the specified start/end to be used directly while hiding the arrow tail fully under the arrow head...
|
|
301
|
+
marker.attr("refX", arrowLength);
|
|
302
|
+
marker.css({ stroke: color, fill: color });
|
|
303
|
+
}
|
|
304
|
+
return marker;
|
|
305
|
+
}
|
|
306
|
+
createMarkup(svgMarkup, ev, isDynamics) {
|
|
307
|
+
if (this._points.length < (isDynamics ? this._nRequiredPoints - 1 : this._nRequiredPoints))
|
|
308
|
+
return;
|
|
309
|
+
const start = this._points[0];
|
|
310
|
+
const end = isDynamics ? Markup_1.MarkupApp.convertVpToVb(ev.viewPoint) : this._points[1];
|
|
311
|
+
const vec = start.vectorTo(end);
|
|
312
|
+
if (!vec.normalizeInPlace())
|
|
313
|
+
return;
|
|
314
|
+
const element = svgMarkup.line(start.x, start.y, end.x, end.y);
|
|
315
|
+
this.setCurrentStyle(element, false);
|
|
316
|
+
const marker = this.getOrCreateArrowMarker(element.css("stroke"));
|
|
317
|
+
const addToStart = ("start" === this._arrowPos || "both" === this._arrowPos);
|
|
318
|
+
const addToEnd = ("end" === this._arrowPos || "both" === this._arrowPos);
|
|
319
|
+
if (addToStart)
|
|
320
|
+
element.marker("start", marker);
|
|
321
|
+
if (addToEnd || !addToStart)
|
|
322
|
+
element.marker("end", marker);
|
|
323
|
+
if (!isDynamics)
|
|
324
|
+
this.onAdded(element);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
exports.ArrowTool = ArrowTool;
|
|
328
|
+
ArrowTool.toolId = "Markup.Arrow";
|
|
329
|
+
ArrowTool.iconSpec = "icon-callout";
|
|
330
|
+
/** Tool for measuring distances and placing Markups of them
|
|
331
|
+
* @public
|
|
332
|
+
*/
|
|
333
|
+
class DistanceTool extends ArrowTool {
|
|
334
|
+
constructor() {
|
|
335
|
+
super(...arguments);
|
|
336
|
+
this._startPointWorld = new core_geometry_1.Point3d();
|
|
337
|
+
}
|
|
338
|
+
showPrompt() { this.provideToolAssistance(core_frontend_1.CoreTools.tools + (0 === this._points.length ? "ElementSet.Prompts.StartPoint" : "ElementSet.Prompts.EndPoint")); }
|
|
339
|
+
setupAndPromptForNextAction() { core_frontend_1.IModelApp.accuSnap.enableSnap(true); core_frontend_1.IModelApp.toolAdmin.toolState.coordLockOvr = core_frontend_1.CoordinateLockOverrides.None; super.setupAndPromptForNextAction(); }
|
|
340
|
+
getFormattedDistance(distance) {
|
|
341
|
+
const formatterSpec = core_frontend_1.IModelApp.quantityFormatter.findFormatterSpecByQuantityType(core_frontend_1.QuantityType.Length);
|
|
342
|
+
if (undefined === formatterSpec)
|
|
343
|
+
return undefined;
|
|
344
|
+
return core_frontend_1.IModelApp.quantityFormatter.formatQuantity(distance, formatterSpec);
|
|
345
|
+
}
|
|
346
|
+
createMarkup(svgMarkup, ev, isDynamics) {
|
|
347
|
+
if (this._points.length < (isDynamics ? this._nRequiredPoints - 1 : this._nRequiredPoints))
|
|
348
|
+
return;
|
|
349
|
+
const start = this._points[0];
|
|
350
|
+
const end = isDynamics ? Markup_1.MarkupApp.convertVpToVb(ev.viewPoint) : this._points[1];
|
|
351
|
+
const vec = start.vectorTo(end);
|
|
352
|
+
if (!vec.normalizeInPlace())
|
|
353
|
+
return;
|
|
354
|
+
const formatterSpec = core_frontend_1.IModelApp.quantityFormatter.findFormatterSpecByQuantityType(core_frontend_1.QuantityType.Length);
|
|
355
|
+
if (undefined === formatterSpec)
|
|
356
|
+
return;
|
|
357
|
+
const distanceLine = svgMarkup.line(start.x, start.y, end.x, end.y);
|
|
358
|
+
this.setCurrentStyle(distanceLine, false);
|
|
359
|
+
const marker = this.getOrCreateArrowMarker(distanceLine.css("stroke"));
|
|
360
|
+
distanceLine.marker("start", marker);
|
|
361
|
+
distanceLine.marker("end", marker);
|
|
362
|
+
const loc = start.interpolate(0.5, end);
|
|
363
|
+
const distance = core_frontend_1.IModelApp.quantityFormatter.formatQuantity(this._startPointWorld.distance(ev.point), formatterSpec);
|
|
364
|
+
const text = svgMarkup.plain(distance).addClass(Markup_1.MarkupApp.textClass).attr("text-anchor", "middle").translate(loc.x, loc.y);
|
|
365
|
+
this.setCurrentTextStyle(text);
|
|
366
|
+
const textWithBg = this.createBoxedText(svgMarkup, text);
|
|
367
|
+
if (!isDynamics) {
|
|
368
|
+
const markup = this.markup;
|
|
369
|
+
const undo = markup.undo;
|
|
370
|
+
undo.performOperation(this.keyin, () => { undo.onAdded(distanceLine); undo.onAdded(textWithBg); });
|
|
371
|
+
markup.selected.restart(textWithBg); // Select text+box so that user can freely position relative to distance line...
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
async onDataButtonDown(ev) {
|
|
375
|
+
if (undefined === await core_frontend_1.IModelApp.quantityFormatter.getFormatterSpecByQuantityType(core_frontend_1.QuantityType.Length)) {
|
|
376
|
+
await this.onReinitialize();
|
|
377
|
+
return core_frontend_1.EventHandled.No;
|
|
378
|
+
}
|
|
379
|
+
if (0 === this._points.length)
|
|
380
|
+
this._startPointWorld.setFrom(ev.point);
|
|
381
|
+
return super.onDataButtonDown(ev);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
exports.DistanceTool = DistanceTool;
|
|
385
|
+
DistanceTool.toolId = "Markup.Distance";
|
|
386
|
+
DistanceTool.iconSpec = "icon-distance";
|
|
387
|
+
/** Tool for placing Markup freehand sketches
|
|
388
|
+
* @public
|
|
389
|
+
*/
|
|
390
|
+
class SketchTool extends RedlineTool {
|
|
391
|
+
constructor() {
|
|
392
|
+
super(...arguments);
|
|
393
|
+
this._minDistSquared = 100;
|
|
394
|
+
}
|
|
395
|
+
showPrompt() { this.provideToolAssistance(core_frontend_1.CoreTools.tools + (0 === this._points.length ? "ElementSet.Prompts.StartPoint" : "ElementSet.Prompts.EndPoint")); }
|
|
396
|
+
createMarkup(svgMarkup, ev, isDynamics) {
|
|
397
|
+
if (this._points.length < (isDynamics ? this._nRequiredPoints - 1 : this._nRequiredPoints))
|
|
398
|
+
return;
|
|
399
|
+
const pts = [];
|
|
400
|
+
const evPt = Markup_1.MarkupApp.convertVpToVb(ev.viewPoint);
|
|
401
|
+
this._points.forEach((pt) => { pts.push(pt.x); pts.push(pt.y); });
|
|
402
|
+
if (isDynamics && !evPt.isAlmostEqualXY(this._points[this._points.length - 1])) {
|
|
403
|
+
pts.push(evPt.x);
|
|
404
|
+
pts.push(evPt.y);
|
|
405
|
+
}
|
|
406
|
+
const isClosed = (this._points.length > 2 && (this._points[0].distanceSquaredXY(isDynamics ? evPt : this._points[this._points.length - 1]) < this._minDistSquared * 2));
|
|
407
|
+
const element = isClosed ? svgMarkup.polygon(pts) : svgMarkup.polyline(pts);
|
|
408
|
+
this.setCurrentStyle(element, isClosed);
|
|
409
|
+
if (!isDynamics)
|
|
410
|
+
this.onAdded(element);
|
|
411
|
+
}
|
|
412
|
+
async onMouseMotion(ev) {
|
|
413
|
+
const evPt = Markup_1.MarkupApp.convertVpToVb(ev.viewPoint);
|
|
414
|
+
if (undefined !== ev.viewport && this._points.length > 0 && evPt.distanceSquaredXY(this._points[this._points.length - 1]) > this._minDistSquared)
|
|
415
|
+
this._points.push(evPt);
|
|
416
|
+
return super.onMouseMotion(ev);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
exports.SketchTool = SketchTool;
|
|
420
|
+
SketchTool.toolId = "Markup.Sketch";
|
|
421
|
+
SketchTool.iconSpec = "icon-draw";
|
|
422
|
+
/** Tool for placing SVG symbols on a Markup
|
|
423
|
+
* @public
|
|
424
|
+
*/
|
|
425
|
+
class SymbolTool extends RedlineTool {
|
|
426
|
+
constructor(_symbolData, _applyCurrentStyle) {
|
|
427
|
+
super();
|
|
428
|
+
this._symbolData = _symbolData;
|
|
429
|
+
this._applyCurrentStyle = _applyCurrentStyle;
|
|
430
|
+
}
|
|
431
|
+
async onInstall() { if (undefined === this._symbolData)
|
|
432
|
+
return false; return super.onInstall(); }
|
|
433
|
+
showPrompt() { this.provideToolAssistance(0 === this._points.length ? (`${MarkupTool_1.MarkupTool.toolKey}Symbol.Prompts.FirstPoint`) : `${core_frontend_1.CoreTools.tools}ElementSet.Prompts.OppositeCorner`, true); }
|
|
434
|
+
createMarkup(svgMarkup, ev, isDynamics) {
|
|
435
|
+
if (undefined === this._symbolData)
|
|
436
|
+
return;
|
|
437
|
+
if (this._points.length < this._minPoints)
|
|
438
|
+
return;
|
|
439
|
+
const start = this._points[0];
|
|
440
|
+
const end = isDynamics ? Markup_1.MarkupApp.convertVpToVb(ev.viewPoint) : this._points[this._points.length - 1];
|
|
441
|
+
const vec = start.vectorTo(end);
|
|
442
|
+
const width = Math.abs(vec.x);
|
|
443
|
+
const height = Math.abs(vec.y);
|
|
444
|
+
if ((width < 10 || height < 10) && (isDynamics || this._points.length !== this._minPoints))
|
|
445
|
+
return;
|
|
446
|
+
if (undefined === this._symbol) {
|
|
447
|
+
const symbol = svgMarkup.group().svg(this._symbolData); // creating group instead of using symbol because of inability to flash/hilite multi-color symbol instance...
|
|
448
|
+
if (0 === symbol.children().length) {
|
|
449
|
+
symbol.remove();
|
|
450
|
+
this._symbolData = undefined;
|
|
451
|
+
}
|
|
452
|
+
try {
|
|
453
|
+
symbol.flatten(symbol);
|
|
454
|
+
}
|
|
455
|
+
catch (_a) { }
|
|
456
|
+
this._symbol = symbol;
|
|
457
|
+
}
|
|
458
|
+
else if (!isDynamics) {
|
|
459
|
+
svgMarkup.add(this._symbol);
|
|
460
|
+
}
|
|
461
|
+
const offset = core_geometry_1.Point3d.create(vec.x < 0 ? end.x : start.x, vec.y < 0 ? end.y : start.y); // define location by corner points...
|
|
462
|
+
if (!isDynamics && this._points.length === this._minPoints)
|
|
463
|
+
this._symbol.size(ev.viewport.viewRect.width * 0.1).center(offset.x, offset.y);
|
|
464
|
+
else if (!ev.isShiftKey)
|
|
465
|
+
this._symbol.size(width).move(offset.x, offset.y);
|
|
466
|
+
else
|
|
467
|
+
this._symbol.size(width, height).move(offset.x, offset.y);
|
|
468
|
+
if (this._applyCurrentStyle) {
|
|
469
|
+
const active = Markup_1.MarkupApp.props.active; // Apply color and transparency only; using active stroke-width, etc. for pre-defined symbols is likely undesirable...
|
|
470
|
+
this._symbol.forElementsOfGroup((child) => {
|
|
471
|
+
const css = window.getComputedStyle(child.node);
|
|
472
|
+
const toValue = (val, newVal) => (!val || val === "none") ? "none" : newVal;
|
|
473
|
+
child.css({ "fill": toValue(css.fill, active.element.fill), "stroke": toValue(css.stroke, active.element.stroke), "fill-opacity": active.element["fill-opacity"], "stroke-opacity": active.element["stroke-opacity"] });
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
if (!isDynamics)
|
|
477
|
+
this.onAdded(this._symbol);
|
|
478
|
+
}
|
|
479
|
+
async onDataButtonUp(ev) {
|
|
480
|
+
if (undefined === ev.viewport || this._points.length !== this._minPoints)
|
|
481
|
+
return core_frontend_1.EventHandled.No;
|
|
482
|
+
this.createMarkup(this.markup.svgMarkup, ev, false);
|
|
483
|
+
await this.onReinitialize();
|
|
484
|
+
return core_frontend_1.EventHandled.No;
|
|
485
|
+
}
|
|
486
|
+
async onResetButtonUp(_ev) {
|
|
487
|
+
await this.onReinitialize();
|
|
488
|
+
return core_frontend_1.EventHandled.No;
|
|
489
|
+
}
|
|
490
|
+
clearDynamicsMarkup(isDynamics) {
|
|
491
|
+
if (!isDynamics)
|
|
492
|
+
super.clearDynamicsMarkup(isDynamics); // For dynamics we don't create a new symbol each frame, we just set the width/height...
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
exports.SymbolTool = SymbolTool;
|
|
496
|
+
SymbolTool.toolId = "Markup.Symbol";
|
|
497
|
+
SymbolTool.iconSpec = "icon-symbol";
|
|
498
|
+
//# sourceMappingURL=RedlineTool.js.map
|