-
Notifications
You must be signed in to change notification settings - Fork 208
/
EmphasizeElementsTool.ts
167 lines (146 loc) · 5.57 KB
/
EmphasizeElementsTool.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module Tools
*/
import { Id64 } from "@itwin/core-bentley";
import { ColorDef } from "@itwin/core-common";
import { EmphasizeElements, IModelApp, QueryVisibleFeaturesOptions, ScreenViewport, Tool } from "@itwin/core-frontend";
import { parseArgs } from "./parseArgs";
/** Applies the `EmphasizeElements` API in some way to the selected Viewport.
* @beta
*/
export abstract class EmphasizeElementsTool extends Tool {
protected get _wantCreate(): boolean { return true; }
protected get _wantClear(): boolean { return false; }
protected abstract execute(emph: EmphasizeElements, vp: ScreenViewport): void;
public override async run(_args: any[]): Promise<boolean> {
const vp = IModelApp.viewManager.selectedView;
if (undefined === vp)
return true;
if (this._wantClear)
EmphasizeElements.clear(vp);
const emph = this._wantCreate ? EmphasizeElements.getOrCreate(vp) : EmphasizeElements.get(vp);
if (undefined !== emph)
this.execute(emph, vp);
return true;
}
}
const enum OverrideType { // eslint-disable-line no-restricted-syntax
None = 0,
Color = 1 << 0,
Emphasis = 1 << 1,
Both = Color | Emphasis,
}
/** If any elements are selected, emphasize them all by overriding their color to be orange; and de-emphasize all other elements by drawing them transparent grey.
* @beta
*/
export class EmphasizeSelectedElementsTool extends EmphasizeElementsTool {
public static override toolId = "EmphasizeSelectedElements";
public static override get minArgs() { return 0; }
public static override get maxArgs() { return 1; }
private _type = OverrideType.None;
public execute(emph: EmphasizeElements, vp: ScreenViewport): void {
if (OverrideType.None === (this._type & OverrideType.Color) || emph.overrideSelectedElements(vp, ColorDef.white, undefined, true, false)) {
emph.wantEmphasis = OverrideType.None !== (this._type & OverrideType.Emphasis);
if (emph.emphasizeSelectedElements(vp, undefined, true)) {
vp.isFadeOutActive = true;
return;
}
}
// Empty selection set - clear any previous overrides.
EmphasizeElements.clear(vp);
emph.wantEmphasis = false;
vp.isFadeOutActive = false;
}
public override async parseAndRun(...args: string[]): Promise<boolean> {
if (1 === args.length) {
switch (args[0].toLowerCase()[0]) {
case "n":
break;
case "c":
this._type = OverrideType.Color;
break;
case "e":
this._type = OverrideType.Emphasis;
break;
case "b":
this._type = OverrideType.Both;
break;
}
}
return this.run(args);
}
}
/** Isolate all selected elements so that *only* those elements will be drawn.
* @beta
*/
export class IsolateSelectedElementsTool extends EmphasizeElementsTool {
public static override toolId = "IsolateSelectedElements";
public execute(emph: EmphasizeElements, vp: ScreenViewport): void {
emph.isolateSelectedElements(vp, true, true);
}
}
/** Clear the set of isolated elements.
* @beta
*/
export class ClearIsolatedElementsTool extends EmphasizeElementsTool {
public static override toolId = "ClearIsolatedElements";
protected override get _wantCreate() { return false; }
public execute(emph: EmphasizeElements, vp: ScreenViewport): void {
emph.clearIsolatedElements(vp);
}
}
/** Reset [EmphasizeElements]($frontend) for the active [Viewport]($frontend).
* @beta
*/
export class ClearEmphasizedElementsTool extends EmphasizeElementsTool {
public static override toolId = "ClearEmphasizedElements";
protected override get _wantCreate() { return false; }
protected override get _wantClear() { return true; }
public execute(emph: EmphasizeElements, vp: ScreenViewport): void {
emph.clearEmphasizedElements(vp);
vp.isFadeOutActive = false;
}
}
/** Emphasize the set of elements currently visible in the view based on [Viewport.queryVisibleFeatures]($frontend).
* @beta
*/
export class EmphasizeVisibleElementsTool extends EmphasizeElementsTool {
public static override toolId = "EmphasizeVisibleElements";
public static override get minArgs() { return 1; }
public static override get maxArgs() { return 2; }
private _options: QueryVisibleFeaturesOptions = { source: "screen" };
protected override get _wantClear() { return true; }
public override async parseAndRun(...input: string[]): Promise<boolean> {
const args = parseArgs(input);
const includeNonLocatable = args.getBoolean("n");
let source: "screen" | "tiles";
switch (input[0].toLowerCase()) {
case "screen":
source = "screen";
break;
case "tiles":
source = "tiles";
break;
default:
return false;
}
this._options = { source, includeNonLocatable };
return this.run(input);
}
public execute(emph: EmphasizeElements, vp: ScreenViewport): void {
const elementIds = new Set<string>();
vp.queryVisibleFeatures(this._options, (features) => {
for (const feature of features) {
if (feature.iModel === vp.iModel && Id64.isValid(feature.elementId))
elementIds.add(feature.elementId);
}
});
emph.wantEmphasis = true;
if (emph.emphasizeElements(elementIds, vp))
vp.isFadeOutActive = true;
}
}