@equinor/esv-intersection 4.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/axis.d.ts.map +1 -1
- package/dist/control/ExtendedCurveInterpolator.d.ts.map +1 -1
- package/dist/control/IntersectionReferenceSystem.d.ts.map +1 -1
- package/dist/control/LayerManager.d.ts.map +1 -1
- package/dist/control/MainController.d.ts.map +1 -1
- package/dist/control/ZoomPanHandler.d.ts.map +1 -1
- package/dist/control/overlay.d.ts.map +1 -1
- package/dist/datautils/colortable.d.ts.map +1 -1
- package/dist/datautils/findsample.d.ts.map +1 -1
- package/dist/datautils/picks.d.ts.map +1 -1
- package/dist/datautils/schematicShapeGenerator.d.ts +5 -5
- package/dist/datautils/schematicShapeGenerator.d.ts.map +1 -1
- package/dist/datautils/seismicimage.d.ts.map +1 -1
- package/dist/datautils/surfacedata.d.ts.map +1 -1
- package/dist/datautils/trajectory.d.ts.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1240 -282
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/layers/CalloutCanvasLayer.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/ComplexRope.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/UniformTextureStretchRope.d.ts.map +1 -1
- package/dist/layers/GeomodelCanvasLayer.d.ts.map +1 -1
- package/dist/layers/GeomodelLabelsLayer.d.ts.map +1 -1
- package/dist/layers/GeomodelLayerV2.d.ts.map +1 -1
- package/dist/layers/GridLayer.d.ts.map +1 -1
- package/dist/layers/ImageCanvasLayer.d.ts.map +1 -1
- package/dist/layers/ReferenceLineLayer.d.ts.map +1 -1
- package/dist/layers/SchematicLayer.d.ts.map +1 -1
- package/dist/layers/WellborePathLayer.d.ts.map +1 -1
- package/dist/layers/base/CanvasLayer.d.ts.map +1 -1
- package/dist/layers/base/HTMLLayer.d.ts.map +1 -1
- package/dist/layers/base/Layer.d.ts.map +1 -1
- package/dist/layers/base/PixiLayer.d.ts.map +1 -1
- package/dist/layers/base/SVGLayer.d.ts.map +1 -1
- package/dist/layers/schematicInterfaces.d.ts.map +1 -1
- package/dist/utils/arc-length.d.ts.map +1 -1
- package/dist/utils/root-finder.d.ts.map +1 -1
- package/dist/utils/text.d.ts.map +1 -1
- package/dist/utils/vectorUtils.d.ts.map +1 -1
- package/dist/vendor/pixi-dashed-line/index.d.ts.map +1 -1
- package/package.json +2 -4
- package/src/components/axis.ts +40 -10
- package/src/control/ExtendedCurveInterpolator.ts +47 -9
- package/src/control/IntersectionReferenceSystem.ts +110 -30
- package/src/control/LayerManager.ts +76 -24
- package/src/control/MainController.ts +37 -8
- package/src/control/ZoomPanHandler.ts +76 -14
- package/src/control/overlay.ts +18 -6
- package/src/datautils/colortable.ts +7 -2
- package/src/datautils/findsample.ts +12 -2
- package/src/datautils/picks.ts +66 -18
- package/src/datautils/schematicShapeGenerator.ts +570 -146
- package/src/datautils/seismicimage.ts +36 -10
- package/src/datautils/surfacedata.ts +119 -40
- package/src/datautils/trajectory.ts +56 -17
- package/src/layers/CalloutCanvasLayer.ts +129 -26
- package/src/layers/CustomDisplayObjects/ComplexRope.ts +2 -1
- package/src/layers/CustomDisplayObjects/ComplexRopeGeometry.ts +5 -5
- package/src/layers/CustomDisplayObjects/UniformTextureStretchRope.ts +6 -2
- package/src/layers/GeomodelCanvasLayer.ts +10 -3
- package/src/layers/GeomodelLabelsLayer.ts +212 -87
- package/src/layers/GeomodelLayerV2.ts +8 -3
- package/src/layers/GridLayer.ts +14 -3
- package/src/layers/ImageCanvasLayer.ts +17 -3
- package/src/layers/ReferenceLineLayer.ts +31 -9
- package/src/layers/SchematicLayer.ts +499 -150
- package/src/layers/WellborePathLayer.ts +22 -7
- package/src/layers/base/CanvasLayer.ts +18 -4
- package/src/layers/base/HTMLLayer.ts +11 -3
- package/src/layers/base/Layer.ts +10 -2
- package/src/layers/base/PixiLayer.ts +27 -7
- package/src/layers/base/SVGLayer.ts +13 -3
- package/src/layers/schematicInterfaces.ts +16 -6
- package/src/utils/arc-length.ts +31 -5
- package/src/utils/root-finder.ts +32 -4
- package/src/utils/text.ts +34 -7
- package/src/utils/vectorUtils.ts +23 -6
- package/src/vendor/pixi-dashed-line/index.ts +66 -13
|
@@ -77,9 +77,13 @@ export class IntersectionReferenceSystem {
|
|
|
77
77
|
this.getTrajectory = this.getTrajectory.bind(this);
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
private setPath(
|
|
80
|
+
private setPath(
|
|
81
|
+
path: number[][],
|
|
82
|
+
options: ReferenceSystemOptions = {},
|
|
83
|
+
): void {
|
|
81
84
|
this.options = { ...defaultOptions, ...options };
|
|
82
|
-
const { arcDivisions, tension, calculateDisplacementFromBottom } =
|
|
85
|
+
const { arcDivisions, tension, calculateDisplacementFromBottom } =
|
|
86
|
+
this.options;
|
|
83
87
|
|
|
84
88
|
this.path = path;
|
|
85
89
|
|
|
@@ -94,11 +98,17 @@ export class IntersectionReferenceSystem {
|
|
|
94
98
|
options.trajectoryInterpolator ||
|
|
95
99
|
new ExtendedCurveInterpolator(
|
|
96
100
|
path.map((d: number[]) => [d[0]!, d[1]!]),
|
|
97
|
-
{
|
|
101
|
+
{
|
|
102
|
+
tension: tension || TENSION,
|
|
103
|
+
arcDivisions: arcDivisions || ARC_DIVISIONS,
|
|
104
|
+
},
|
|
98
105
|
),
|
|
99
106
|
curtain:
|
|
100
107
|
options.curtainInterpolator ||
|
|
101
|
-
new ExtendedCurveInterpolator(this.projectedPath, {
|
|
108
|
+
new ExtendedCurveInterpolator(this.projectedPath, {
|
|
109
|
+
tension: tension || TENSION,
|
|
110
|
+
arcDivisions: arcDivisions || ARC_DIVISIONS,
|
|
111
|
+
}),
|
|
102
112
|
};
|
|
103
113
|
|
|
104
114
|
const trajVector = this.getTrajectoryVector();
|
|
@@ -122,7 +132,13 @@ export class IntersectionReferenceSystem {
|
|
|
122
132
|
project(length: number): number[] {
|
|
123
133
|
const { curtain } = this.interpolators;
|
|
124
134
|
const { calculateDisplacementFromBottom } = this.options;
|
|
125
|
-
const cl = clamp(
|
|
135
|
+
const cl = clamp(
|
|
136
|
+
calculateDisplacementFromBottom
|
|
137
|
+
? this.length - (length - this._offset)
|
|
138
|
+
: length - this._offset,
|
|
139
|
+
0,
|
|
140
|
+
this.length,
|
|
141
|
+
);
|
|
126
142
|
const p = curtain.getPointAtArcLength(cl, this.options);
|
|
127
143
|
return p as number[];
|
|
128
144
|
}
|
|
@@ -146,11 +162,19 @@ export class IntersectionReferenceSystem {
|
|
|
146
162
|
* @param endMd in MD
|
|
147
163
|
* @param includeStartEnd guarantee to include the starting and end points
|
|
148
164
|
*/
|
|
149
|
-
getCurtainPath(
|
|
165
|
+
getCurtainPath(
|
|
166
|
+
startMd: number,
|
|
167
|
+
endMd: number,
|
|
168
|
+
includeStartEnd = false,
|
|
169
|
+
): MDPoint[] {
|
|
150
170
|
if (!this._curtainPathCache) {
|
|
151
171
|
const points: MDPoint[] = [];
|
|
152
172
|
let prevAngle = Math.PI * 2; // Always add first point
|
|
153
|
-
for (
|
|
173
|
+
for (
|
|
174
|
+
let i = this._offset;
|
|
175
|
+
i <= this.length + this._offset;
|
|
176
|
+
i += CURTAIN_SAMPLING_INTERVAL
|
|
177
|
+
) {
|
|
154
178
|
const point = this.project(i);
|
|
155
179
|
const angle = Math.atan2(point[1]!, point[0]!);
|
|
156
180
|
|
|
@@ -165,11 +189,13 @@ export class IntersectionReferenceSystem {
|
|
|
165
189
|
|
|
166
190
|
if (includeStartEnd) {
|
|
167
191
|
const startPoint = { point: this.project(startMd), md: startMd };
|
|
168
|
-
const pointsBetween = this._curtainPathCache.filter(
|
|
192
|
+
const pointsBetween = this._curtainPathCache.filter(
|
|
193
|
+
p => p.md > startMd && p.md < endMd,
|
|
194
|
+
);
|
|
169
195
|
const endPoint = { point: this.project(endMd), md: endMd };
|
|
170
196
|
return [startPoint, ...pointsBetween, endPoint];
|
|
171
197
|
}
|
|
172
|
-
return this._curtainPathCache.filter(
|
|
198
|
+
return this._curtainPathCache.filter(p => p.md >= startMd && p.md <= endMd);
|
|
173
199
|
}
|
|
174
200
|
|
|
175
201
|
/**
|
|
@@ -177,7 +203,9 @@ export class IntersectionReferenceSystem {
|
|
|
177
203
|
*/
|
|
178
204
|
unproject(displacement: number): number | undefined {
|
|
179
205
|
const { normalizedLength, calculateDisplacementFromBottom } = this.options;
|
|
180
|
-
const displacementFromStart = calculateDisplacementFromBottom
|
|
206
|
+
const displacementFromStart = calculateDisplacementFromBottom
|
|
207
|
+
? this.displacement - displacement
|
|
208
|
+
: displacement;
|
|
181
209
|
const length = normalizedLength || this.length;
|
|
182
210
|
|
|
183
211
|
if (displacementFromStart < 0) {
|
|
@@ -187,7 +215,11 @@ export class IntersectionReferenceSystem {
|
|
|
187
215
|
return length + (displacementFromStart - this.displacement);
|
|
188
216
|
}
|
|
189
217
|
|
|
190
|
-
const ls = this.interpolators.curtain.getIntersectsAsPositions(
|
|
218
|
+
const ls = this.interpolators.curtain.getIntersectsAsPositions(
|
|
219
|
+
displacementFromStart,
|
|
220
|
+
0,
|
|
221
|
+
1,
|
|
222
|
+
);
|
|
191
223
|
if (ls && ls.length) {
|
|
192
224
|
return ls[0]! * length + this._offset;
|
|
193
225
|
}
|
|
@@ -221,8 +253,14 @@ export class IntersectionReferenceSystem {
|
|
|
221
253
|
const extensionStart = from < 0 ? -from : 0;
|
|
222
254
|
const extensionEnd = to > 1 ? to - 1 : 0;
|
|
223
255
|
|
|
224
|
-
const refStart = this.interpolators.trajectory.getPointAt(0) as [
|
|
225
|
-
|
|
256
|
+
const refStart = this.interpolators.trajectory.getPointAt(0) as [
|
|
257
|
+
number,
|
|
258
|
+
number,
|
|
259
|
+
];
|
|
260
|
+
const refEnd = this.interpolators.trajectory.getPointAt(1) as [
|
|
261
|
+
number,
|
|
262
|
+
number,
|
|
263
|
+
];
|
|
226
264
|
|
|
227
265
|
let p0: [number, number];
|
|
228
266
|
let p3: [number, number];
|
|
@@ -243,7 +281,10 @@ export class IntersectionReferenceSystem {
|
|
|
243
281
|
}
|
|
244
282
|
|
|
245
283
|
if (extensionEnd) {
|
|
246
|
-
p3 = [
|
|
284
|
+
p3 = [
|
|
285
|
+
refEnd[0] + this.endVector[0]! * extensionEnd * this.displacement,
|
|
286
|
+
refEnd[1] + this.endVector[1]! * extensionEnd * this.displacement,
|
|
287
|
+
];
|
|
247
288
|
}
|
|
248
289
|
const points = [];
|
|
249
290
|
const tl = to - from;
|
|
@@ -255,15 +296,26 @@ export class IntersectionReferenceSystem {
|
|
|
255
296
|
points.push(p0);
|
|
256
297
|
for (let i = 1; i < preSteps; i++) {
|
|
257
298
|
const f = (i / preSteps) * extensionStart * this.displacement;
|
|
258
|
-
points.push([
|
|
299
|
+
points.push([
|
|
300
|
+
p0[0] - this.startVector[0]! * f,
|
|
301
|
+
p0[1] - this.startVector[1]! * f,
|
|
302
|
+
]);
|
|
259
303
|
}
|
|
260
304
|
}
|
|
261
|
-
const curvePoints = this.interpolators.trajectory.getPoints(
|
|
305
|
+
const curvePoints = this.interpolators.trajectory.getPoints(
|
|
306
|
+
curveSteps - 1,
|
|
307
|
+
null,
|
|
308
|
+
t0,
|
|
309
|
+
t1,
|
|
310
|
+
) as number[][]; // returns steps + 1 points
|
|
262
311
|
points.push(...curvePoints);
|
|
263
312
|
if (p3!) {
|
|
264
313
|
for (let i = 1; i < postSteps - 1; i++) {
|
|
265
314
|
const f = (i / postSteps) * extensionEnd * this.displacement;
|
|
266
|
-
points.push([
|
|
315
|
+
points.push([
|
|
316
|
+
p2[0] + this.endVector[0]! * f,
|
|
317
|
+
p2[1] + this.endVector[1]! * f,
|
|
318
|
+
]);
|
|
267
319
|
}
|
|
268
320
|
points.push(p3);
|
|
269
321
|
}
|
|
@@ -279,34 +331,56 @@ export class IntersectionReferenceSystem {
|
|
|
279
331
|
endExtensionLength = DEFAULT_END_EXTEND_LENGTH,
|
|
280
332
|
): Trajectory {
|
|
281
333
|
if (!isFinite(startExtensionLength) || startExtensionLength < 0.0) {
|
|
282
|
-
throw new Error(
|
|
334
|
+
throw new Error(
|
|
335
|
+
'Invalid parameter, getExtendedTrajectory() must be called with a valid and positive startExtensionLength parameter',
|
|
336
|
+
);
|
|
283
337
|
}
|
|
284
338
|
if (!isFinite(endExtensionLength) || endExtensionLength < 0.0) {
|
|
285
|
-
throw new Error(
|
|
339
|
+
throw new Error(
|
|
340
|
+
'Invalid parameter, getExtendedTrajectory() must be called with a valid and positive endExtensionLength parameter',
|
|
341
|
+
);
|
|
286
342
|
}
|
|
287
343
|
|
|
288
|
-
const totalLength =
|
|
289
|
-
|
|
290
|
-
const
|
|
291
|
-
|
|
344
|
+
const totalLength =
|
|
345
|
+
this.displacement + startExtensionLength + endExtensionLength;
|
|
346
|
+
const startExtensionNumPoints = Math.floor(
|
|
347
|
+
(startExtensionLength / totalLength) * numPoints,
|
|
348
|
+
);
|
|
349
|
+
const curveSteps = Math.max(
|
|
350
|
+
Math.ceil((this.displacement / totalLength) * numPoints),
|
|
351
|
+
1,
|
|
352
|
+
);
|
|
353
|
+
const endExtensionNumPoints =
|
|
354
|
+
numPoints - curveSteps - startExtensionNumPoints;
|
|
292
355
|
|
|
293
356
|
const points = [];
|
|
294
357
|
|
|
295
|
-
const refStart = new Vector2(
|
|
358
|
+
const refStart = new Vector2(
|
|
359
|
+
this.interpolators.trajectory.getPointAt(0.0) as number[],
|
|
360
|
+
);
|
|
296
361
|
const startVec = new Vector2(this.startVector);
|
|
297
|
-
const startExtensionStepLength =
|
|
362
|
+
const startExtensionStepLength =
|
|
363
|
+
startExtensionLength / startExtensionNumPoints;
|
|
298
364
|
for (let i = startExtensionNumPoints; i > 0; i--) {
|
|
299
365
|
const f = i * startExtensionStepLength;
|
|
300
366
|
const point = refStart.add(startVec.scale(f));
|
|
301
367
|
points.push(point.toArray());
|
|
302
368
|
}
|
|
303
369
|
|
|
304
|
-
const curveStepPoints = this.interpolators.trajectory.getPoints(
|
|
370
|
+
const curveStepPoints = this.interpolators.trajectory.getPoints(
|
|
371
|
+
curveSteps,
|
|
372
|
+
null,
|
|
373
|
+
0.0,
|
|
374
|
+
1.0,
|
|
375
|
+
) as number[][];
|
|
305
376
|
points.push(...curveStepPoints);
|
|
306
377
|
|
|
307
|
-
const refEnd = new Vector2(
|
|
378
|
+
const refEnd = new Vector2(
|
|
379
|
+
this.interpolators.trajectory.getPointAt(1.0) as number[],
|
|
380
|
+
);
|
|
308
381
|
const endVec = new Vector2(this.endVector);
|
|
309
|
-
const endExtensionStepLength =
|
|
382
|
+
const endExtensionStepLength =
|
|
383
|
+
endExtensionLength / (endExtensionNumPoints - 1); // -1 so last point is at end of extension
|
|
310
384
|
for (let i = 1; i < endExtensionNumPoints; i++) {
|
|
311
385
|
const f = i * endExtensionStepLength;
|
|
312
386
|
const point = refEnd.add(endVec.scale(f));
|
|
@@ -329,7 +403,9 @@ export class IntersectionReferenceSystem {
|
|
|
329
403
|
|
|
330
404
|
const trajectoryVec = IntersectionReferenceSystem.getDirectionVector(
|
|
331
405
|
this.interpolators.trajectory,
|
|
332
|
-
calculateDisplacementFromBottom
|
|
406
|
+
calculateDisplacementFromBottom
|
|
407
|
+
? THRESHOLD_DIRECTION_DISTANCE
|
|
408
|
+
: 1 - THRESHOLD_DIRECTION_DISTANCE,
|
|
333
409
|
calculateDisplacementFromBottom ? 0 : 1,
|
|
334
410
|
);
|
|
335
411
|
return trajectoryVec;
|
|
@@ -361,7 +437,11 @@ export class IntersectionReferenceSystem {
|
|
|
361
437
|
* @param from number between 0 and 1
|
|
362
438
|
* @param to number between 0 and 1
|
|
363
439
|
*/
|
|
364
|
-
static getDirectionVector(
|
|
440
|
+
static getDirectionVector(
|
|
441
|
+
interpolator: CurveInterpolator,
|
|
442
|
+
from: number,
|
|
443
|
+
to: number,
|
|
444
|
+
): number[] {
|
|
365
445
|
const p1 = interpolator.getPointAt(to);
|
|
366
446
|
const p2 = interpolator.getPointAt(from);
|
|
367
447
|
|
|
@@ -17,7 +17,9 @@ export class LayerManager {
|
|
|
17
17
|
private layers: Layer<unknown>[] = [];
|
|
18
18
|
|
|
19
19
|
private _axis: Axis | undefined;
|
|
20
|
-
private _svgContainer:
|
|
20
|
+
private _svgContainer:
|
|
21
|
+
| Selection<HTMLDivElement, unknown, null, undefined>
|
|
22
|
+
| undefined;
|
|
21
23
|
|
|
22
24
|
/**
|
|
23
25
|
* Handles layers and axis also holds a zoom and pan handler object
|
|
@@ -25,16 +27,30 @@ export class LayerManager {
|
|
|
25
27
|
* @param scaleOptions
|
|
26
28
|
* @param axisOptions
|
|
27
29
|
*/
|
|
28
|
-
constructor(
|
|
30
|
+
constructor(
|
|
31
|
+
container: HTMLElement,
|
|
32
|
+
scaleOptions?: ScaleOptions,
|
|
33
|
+
axisOptions?: AxisOptions,
|
|
34
|
+
) {
|
|
29
35
|
this.container = container;
|
|
30
36
|
this.layerContainer = document.createElement('div');
|
|
31
37
|
this.layerContainer.className = 'layer-container';
|
|
32
38
|
this.container.appendChild(this.layerContainer);
|
|
33
|
-
this.adjustToSize(
|
|
34
|
-
|
|
39
|
+
this.adjustToSize(
|
|
40
|
+
+(this.container.getAttribute('width') ?? 0),
|
|
41
|
+
+(this.container.getAttribute('height') ?? 0),
|
|
42
|
+
);
|
|
43
|
+
this._zoomPanHandler = new ZoomPanHandler(container, event =>
|
|
44
|
+
this.rescale(event),
|
|
45
|
+
);
|
|
35
46
|
if (scaleOptions) {
|
|
36
47
|
const { xMin, xMax, yMin, yMax, xBounds, yBounds } = scaleOptions;
|
|
37
|
-
if (
|
|
48
|
+
if (
|
|
49
|
+
xMin !== undefined &&
|
|
50
|
+
xMax !== undefined &&
|
|
51
|
+
yMin !== undefined &&
|
|
52
|
+
yMax !== undefined
|
|
53
|
+
) {
|
|
38
54
|
this._zoomPanHandler.setBounds([xMin, xMax], [yMin, yMax]);
|
|
39
55
|
}
|
|
40
56
|
if (xBounds && yBounds) {
|
|
@@ -56,7 +72,7 @@ export class LayerManager {
|
|
|
56
72
|
* @param layers array of layers
|
|
57
73
|
*/
|
|
58
74
|
addLayers(layers: Layer<unknown>[]): LayerManager {
|
|
59
|
-
layers.forEach(
|
|
75
|
+
layers.forEach(layer => this.addLayer(layer));
|
|
60
76
|
return this;
|
|
61
77
|
}
|
|
62
78
|
|
|
@@ -72,7 +88,7 @@ export class LayerManager {
|
|
|
72
88
|
* @param includeReferenceSystem - (optional) if true also removes reference system, default is true
|
|
73
89
|
*/
|
|
74
90
|
clearAllData(includeReferenceSystem = true): LayerManager {
|
|
75
|
-
this.layers.forEach(
|
|
91
|
+
this.layers.forEach(l => l.clearData(includeReferenceSystem));
|
|
76
92
|
return this;
|
|
77
93
|
}
|
|
78
94
|
|
|
@@ -81,7 +97,10 @@ export class LayerManager {
|
|
|
81
97
|
* @param layer Layer
|
|
82
98
|
* @param params extra params to pass to the onUpdate method
|
|
83
99
|
*/
|
|
84
|
-
addLayer(
|
|
100
|
+
addLayer(
|
|
101
|
+
layer: Layer<unknown>,
|
|
102
|
+
params?: LayerOptions<unknown>,
|
|
103
|
+
): LayerManager {
|
|
85
104
|
this.layers.push(layer);
|
|
86
105
|
this.initLayer(layer, params);
|
|
87
106
|
|
|
@@ -93,10 +112,10 @@ export class LayerManager {
|
|
|
93
112
|
* @param layerId name of layer
|
|
94
113
|
*/
|
|
95
114
|
removeLayer(layerId: string): LayerManager {
|
|
96
|
-
const layer = this.layers.find(
|
|
115
|
+
const layer = this.layers.find(l => l.id === layerId);
|
|
97
116
|
if (layer) {
|
|
98
117
|
layer.onUnmount();
|
|
99
|
-
this.layers = this.layers.filter(
|
|
118
|
+
this.layers = this.layers.filter(l => l.id !== layerId);
|
|
100
119
|
}
|
|
101
120
|
|
|
102
121
|
return this;
|
|
@@ -107,17 +126,22 @@ export class LayerManager {
|
|
|
107
126
|
*/
|
|
108
127
|
removeAllLayers(): LayerManager {
|
|
109
128
|
const { layers } = this;
|
|
110
|
-
layers.forEach(
|
|
129
|
+
layers.forEach(layer => {
|
|
111
130
|
this.removeLayer(layer.id);
|
|
112
131
|
});
|
|
113
132
|
return this;
|
|
114
133
|
}
|
|
115
134
|
|
|
116
135
|
getLayer(layerId: string): Layer<unknown> | undefined {
|
|
117
|
-
return this.layers.find(
|
|
136
|
+
return this.layers.find(
|
|
137
|
+
l => l.id === layerId || l.getInternalLayerIds().includes(layerId),
|
|
138
|
+
);
|
|
118
139
|
}
|
|
119
140
|
|
|
120
|
-
initLayer(
|
|
141
|
+
initLayer(
|
|
142
|
+
layer: Layer<unknown>,
|
|
143
|
+
params?: LayerOptions<unknown>,
|
|
144
|
+
): LayerManager {
|
|
121
145
|
const event: OnMountEvent = {
|
|
122
146
|
elm: this.layerContainer,
|
|
123
147
|
};
|
|
@@ -127,7 +151,12 @@ export class LayerManager {
|
|
|
127
151
|
layer.onRescale(rescaleEvent);
|
|
128
152
|
|
|
129
153
|
if (this._svgContainer) {
|
|
130
|
-
const highestZIndex =
|
|
154
|
+
const highestZIndex =
|
|
155
|
+
this.layers.length > 0
|
|
156
|
+
? this.layers.reduce((max, layers) =>
|
|
157
|
+
max.order > layers.order ? max : layers,
|
|
158
|
+
).order
|
|
159
|
+
: 1;
|
|
131
160
|
this._svgContainer.style('z-index', `${highestZIndex + 1}`);
|
|
132
161
|
}
|
|
133
162
|
|
|
@@ -160,8 +189,14 @@ export class LayerManager {
|
|
|
160
189
|
* @param height (required)
|
|
161
190
|
*/
|
|
162
191
|
adjustToSize(width: number, height: number): void {
|
|
163
|
-
const layersWidth = Math.max(
|
|
164
|
-
|
|
192
|
+
const layersWidth = Math.max(
|
|
193
|
+
this._axis ? width - HORIZONTAL_AXIS_MARGIN : width,
|
|
194
|
+
0,
|
|
195
|
+
);
|
|
196
|
+
const layersHeight = Math.max(
|
|
197
|
+
this._axis ? height - VERTICAL_AXIS_MARGIN : height,
|
|
198
|
+
0,
|
|
199
|
+
);
|
|
165
200
|
|
|
166
201
|
if (this._axis) {
|
|
167
202
|
const resizeEvent = { width, height };
|
|
@@ -169,7 +204,7 @@ export class LayerManager {
|
|
|
169
204
|
}
|
|
170
205
|
if (this.layers) {
|
|
171
206
|
const resizeEvent = { width: layersWidth, height: layersHeight };
|
|
172
|
-
this.layers.forEach(
|
|
207
|
+
this.layers.forEach(layer => layer.onResize(resizeEvent));
|
|
173
208
|
}
|
|
174
209
|
if (this._zoomPanHandler) {
|
|
175
210
|
this._zoomPanHandler.adjustToSize(layersWidth, layersHeight, true);
|
|
@@ -177,7 +212,7 @@ export class LayerManager {
|
|
|
177
212
|
}
|
|
178
213
|
|
|
179
214
|
setReferenceSystem(irs: IntersectionReferenceSystem): void {
|
|
180
|
-
this.layers.forEach(
|
|
215
|
+
this.layers.forEach(layer => (layer.referenceSystem = irs));
|
|
181
216
|
}
|
|
182
217
|
|
|
183
218
|
showAxis(): LayerManager {
|
|
@@ -204,7 +239,9 @@ export class LayerManager {
|
|
|
204
239
|
if (this._axis) {
|
|
205
240
|
this._axis.offsetX = x;
|
|
206
241
|
this._axis.offsetY = y;
|
|
207
|
-
const gridLayers = this.layers.filter(
|
|
242
|
+
const gridLayers = this.layers.filter(
|
|
243
|
+
(l: Layer<unknown>): l is GridLayer<unknown> => l instanceof GridLayer,
|
|
244
|
+
);
|
|
208
245
|
gridLayers.forEach((l: GridLayer<unknown>) => {
|
|
209
246
|
l.offsetX = x;
|
|
210
247
|
l.offsetY = y;
|
|
@@ -216,7 +253,9 @@ export class LayerManager {
|
|
|
216
253
|
setXAxisOffset(x: number): LayerManager {
|
|
217
254
|
if (this._axis) {
|
|
218
255
|
this._axis.offsetX = x;
|
|
219
|
-
const gridLayers = this.layers.filter(
|
|
256
|
+
const gridLayers = this.layers.filter(
|
|
257
|
+
(l: Layer<unknown>): l is GridLayer<unknown> => l instanceof GridLayer,
|
|
258
|
+
);
|
|
220
259
|
gridLayers.forEach((l: GridLayer<unknown>) => {
|
|
221
260
|
l.offsetX = x;
|
|
222
261
|
});
|
|
@@ -227,7 +266,9 @@ export class LayerManager {
|
|
|
227
266
|
setYAxisOffset(y: number): LayerManager {
|
|
228
267
|
if (this._axis) {
|
|
229
268
|
this._axis.offsetY = y;
|
|
230
|
-
const gridLayers = this.layers.filter(
|
|
269
|
+
const gridLayers = this.layers.filter(
|
|
270
|
+
(l: Layer<unknown>): l is GridLayer<unknown> => l instanceof GridLayer,
|
|
271
|
+
);
|
|
231
272
|
gridLayers.forEach((l: GridLayer<unknown>) => {
|
|
232
273
|
l.offsetY = y;
|
|
233
274
|
});
|
|
@@ -272,7 +313,9 @@ export class LayerManager {
|
|
|
272
313
|
this._axis.onRescale(event);
|
|
273
314
|
}
|
|
274
315
|
if (this.layers) {
|
|
275
|
-
this.layers.forEach(
|
|
316
|
+
this.layers.forEach(layer =>
|
|
317
|
+
layer.isVisible === true ? layer.onRescale(event) : {},
|
|
318
|
+
);
|
|
276
319
|
}
|
|
277
320
|
}
|
|
278
321
|
|
|
@@ -285,11 +328,20 @@ export class LayerManager {
|
|
|
285
328
|
.style('z-index', '10')
|
|
286
329
|
.style('pointer-events', 'none');
|
|
287
330
|
|
|
288
|
-
const svg = this._svgContainer
|
|
331
|
+
const svg = this._svgContainer
|
|
332
|
+
.append('svg')
|
|
333
|
+
.attr('height', `${container.offsetHeight}px`)
|
|
334
|
+
.attr('width', `${container.offsetWidth}px`);
|
|
289
335
|
|
|
290
336
|
const showLabels = true;
|
|
291
337
|
|
|
292
|
-
const axis = new Axis(
|
|
338
|
+
const axis = new Axis(
|
|
339
|
+
svg,
|
|
340
|
+
showLabels,
|
|
341
|
+
options.xLabel,
|
|
342
|
+
options.yLabel,
|
|
343
|
+
options.unitOfMeasure,
|
|
344
|
+
);
|
|
293
345
|
|
|
294
346
|
return axis;
|
|
295
347
|
};
|
|
@@ -30,13 +30,25 @@ export class Controller {
|
|
|
30
30
|
* @param options.referenceSystem (optional) sets reference system, takes priority over path if both are supplied
|
|
31
31
|
*/
|
|
32
32
|
constructor(options: ControllerOptions) {
|
|
33
|
-
const {
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
const {
|
|
34
|
+
container,
|
|
35
|
+
axisOptions,
|
|
36
|
+
scaleOptions,
|
|
37
|
+
referenceSystem,
|
|
38
|
+
layers,
|
|
39
|
+
path,
|
|
40
|
+
} = options;
|
|
41
|
+
|
|
42
|
+
this._referenceSystem =
|
|
43
|
+
referenceSystem || (path && new IntersectionReferenceSystem(path));
|
|
36
44
|
|
|
37
45
|
this._overlay = overlay(this, container);
|
|
38
46
|
|
|
39
|
-
this.layerManager = new LayerManager(
|
|
47
|
+
this.layerManager = new LayerManager(
|
|
48
|
+
this._overlay.elm.node() as HTMLElement,
|
|
49
|
+
scaleOptions,
|
|
50
|
+
axisOptions,
|
|
51
|
+
);
|
|
40
52
|
if (layers) {
|
|
41
53
|
this.layerManager.addLayers(layers);
|
|
42
54
|
this.setOverlayZIndex(layers);
|
|
@@ -136,8 +148,15 @@ export class Controller {
|
|
|
136
148
|
adjustToSize(width: number, height: number): Controller {
|
|
137
149
|
this.layerManager.adjustToSize(width, height);
|
|
138
150
|
|
|
139
|
-
const dimensions = {
|
|
140
|
-
|
|
151
|
+
const dimensions = {
|
|
152
|
+
width: Math.max(width - HORIZONTAL_AXIS_MARGIN, 0),
|
|
153
|
+
height: Math.max(height - VERTICAL_AXIS_MARGIN, 0),
|
|
154
|
+
};
|
|
155
|
+
this.overlay.elm.dispatch('resize', {
|
|
156
|
+
detail: dimensions,
|
|
157
|
+
bubbles: true,
|
|
158
|
+
cancelable: true,
|
|
159
|
+
});
|
|
141
160
|
|
|
142
161
|
return this;
|
|
143
162
|
}
|
|
@@ -149,7 +168,12 @@ export class Controller {
|
|
|
149
168
|
* @param displ - displacement
|
|
150
169
|
* @param duration - duration of transition
|
|
151
170
|
*/
|
|
152
|
-
setViewport(
|
|
171
|
+
setViewport(
|
|
172
|
+
cx?: number,
|
|
173
|
+
cy?: number,
|
|
174
|
+
displacement?: number,
|
|
175
|
+
duration?: number,
|
|
176
|
+
): Controller {
|
|
153
177
|
this.zoomPanHandler.setViewport(cx, cy, displacement, duration);
|
|
154
178
|
return this;
|
|
155
179
|
}
|
|
@@ -263,7 +287,12 @@ export class Controller {
|
|
|
263
287
|
}
|
|
264
288
|
|
|
265
289
|
private getHighestZIndex(layers: Layer<unknown>[]): number {
|
|
266
|
-
const highestZIndex =
|
|
290
|
+
const highestZIndex =
|
|
291
|
+
layers.length > 0
|
|
292
|
+
? layers.reduce((max, layers) =>
|
|
293
|
+
max.order > layers.order ? max : layers,
|
|
294
|
+
).order
|
|
295
|
+
: 1;
|
|
267
296
|
return highestZIndex;
|
|
268
297
|
}
|
|
269
298
|
|