@equinor/esv-intersection 3.0.8 → 3.0.10
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 +1 -2
- package/dist/components/axis.d.ts.map +1 -1
- package/dist/control/ExtendedCurveInterpolator.d.ts.map +1 -1
- package/dist/control/IntersectionReferenceSystem.d.ts +2 -6
- package/dist/control/IntersectionReferenceSystem.d.ts.map +1 -1
- package/dist/control/LayerManager.d.ts +2 -2
- package/dist/control/LayerManager.d.ts.map +1 -1
- package/dist/control/MainController.d.ts +3 -3
- package/dist/control/MainController.d.ts.map +1 -1
- package/dist/control/ZoomPanHandler.d.ts +5 -4
- package/dist/control/ZoomPanHandler.d.ts.map +1 -1
- package/dist/control/interfaces.d.ts +3 -4
- package/dist/control/interfaces.d.ts.map +1 -1
- package/dist/control/overlay.d.ts +3 -3
- package/dist/control/overlay.d.ts.map +1 -1
- package/dist/datautils/colortable.d.ts +1 -1
- package/dist/datautils/colortable.d.ts.map +1 -1
- package/dist/datautils/findsample.d.ts.map +1 -1
- package/dist/datautils/schematicShapeGenerator.d.ts +3 -3
- package/dist/datautils/schematicShapeGenerator.d.ts.map +1 -1
- package/dist/datautils/seismicimage.d.ts.map +1 -1
- package/dist/datautils/trajectory.d.ts +1 -1
- package/dist/datautils/trajectory.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1373 -1272
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/interfaces.d.ts +1 -2
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/layers/CalloutCanvasLayer.d.ts +2 -2
- package/dist/layers/CalloutCanvasLayer.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/ComplexRopeGeometry.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.d.ts.map +1 -1
- package/dist/layers/GeomodelCanvasLayer.d.ts +1 -1
- package/dist/layers/GeomodelCanvasLayer.d.ts.map +1 -1
- package/dist/layers/GeomodelLabelsLayer.d.ts +4 -4
- 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 +1 -1
- package/dist/layers/ImageCanvasLayer.d.ts.map +1 -1
- package/dist/layers/ReferenceLineLayer.d.ts +1 -2
- package/dist/layers/ReferenceLineLayer.d.ts.map +1 -1
- package/dist/layers/SchematicLayer.d.ts.map +1 -1
- package/dist/layers/WellborePathLayer.d.ts +1 -1
- package/dist/layers/WellborePathLayer.d.ts.map +1 -1
- package/dist/layers/base/CanvasLayer.d.ts +3 -3
- package/dist/layers/base/CanvasLayer.d.ts.map +1 -1
- package/dist/layers/base/HTMLLayer.d.ts +1 -1
- package/dist/layers/base/HTMLLayer.d.ts.map +1 -1
- package/dist/layers/base/Layer.d.ts +10 -10
- package/dist/layers/base/Layer.d.ts.map +1 -1
- package/dist/layers/base/PixiLayer.d.ts +4 -4
- package/dist/layers/base/PixiLayer.d.ts.map +1 -1
- package/dist/layers/base/SVGLayer.d.ts +1 -1
- package/dist/layers/base/SVGLayer.d.ts.map +1 -1
- package/dist/utils/arc-length.d.ts.map +1 -1
- package/dist/utils/color.d.ts.map +1 -1
- package/dist/utils/root-finder.d.ts +1 -1
- package/dist/utils/root-finder.d.ts.map +1 -1
- package/dist/utils/text.d.ts +2 -2
- 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 +11 -11
- package/src/components/axis.ts +23 -30
- package/src/control/ExtendedCurveInterpolator.ts +7 -7
- package/src/control/IntersectionReferenceSystem.ts +33 -41
- package/src/control/LayerManager.ts +33 -31
- package/src/control/MainController.ts +5 -7
- package/src/control/ZoomPanHandler.ts +50 -45
- package/src/control/interfaces.ts +3 -3
- package/src/control/overlay.ts +20 -16
- package/src/datautils/colortable.ts +4 -4
- package/src/datautils/findsample.ts +8 -7
- package/src/datautils/picks.ts +13 -13
- package/src/datautils/schematicShapeGenerator.ts +47 -17
- package/src/datautils/seismicimage.ts +12 -13
- package/src/datautils/surfacedata.ts +27 -26
- package/src/datautils/trajectory.ts +34 -32
- package/src/interfaces.ts +1 -1
- package/src/layers/CalloutCanvasLayer.ts +55 -58
- package/src/layers/CustomDisplayObjects/ComplexRopeGeometry.ts +23 -20
- package/src/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.ts +9 -10
- package/src/layers/CustomDisplayObjects/UniformTextureStretchRopeGeometry.ts +13 -13
- package/src/layers/GeomodelCanvasLayer.ts +43 -36
- package/src/layers/GeomodelLabelsLayer.ts +99 -96
- package/src/layers/GeomodelLayerV2.ts +11 -11
- package/src/layers/GridLayer.ts +25 -21
- package/src/layers/ImageCanvasLayer.ts +17 -11
- package/src/layers/ReferenceLineLayer.ts +53 -45
- package/src/layers/SchematicLayer.ts +78 -75
- package/src/layers/WellborePathLayer.ts +48 -46
- package/src/layers/base/CanvasLayer.ts +18 -18
- package/src/layers/base/HTMLLayer.ts +5 -5
- package/src/layers/base/Layer.ts +18 -18
- package/src/layers/base/PixiLayer.ts +24 -20
- package/src/layers/base/SVGLayer.ts +5 -5
- package/src/utils/arc-length.ts +3 -10
- package/src/utils/binary-search.ts +2 -2
- package/src/utils/color.ts +9 -5
- package/src/utils/root-finder.ts +4 -4
- package/src/utils/text.ts +5 -5
- package/src/utils/vectorUtils.ts +13 -6
- package/src/vendor/pixi-dashed-line/index.ts +3 -2
package/src/components/axis.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { axisRight, axisBottom } from 'd3-axis';
|
|
2
|
-
import {
|
|
2
|
+
import { Selection } from 'd3-selection';
|
|
3
3
|
import { ScaleLinear, scaleLinear } from 'd3-scale';
|
|
4
4
|
import { OnResizeEvent, OnRescaleEvent } from '../interfaces';
|
|
5
5
|
|
|
@@ -10,27 +10,20 @@ export type Options = {
|
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
export class Axis {
|
|
13
|
-
private mainGroup: Selection<
|
|
13
|
+
private mainGroup: Selection<SVGSVGElement, unknown, null, undefined>;
|
|
14
14
|
private _scaleX: ScaleLinear<number, number>;
|
|
15
15
|
private _scaleY: ScaleLinear<number, number>;
|
|
16
16
|
private _showLabels = true;
|
|
17
17
|
private _labelXDesc: string;
|
|
18
18
|
private _labelYDesc: string;
|
|
19
19
|
private _unitOfMeasure: string;
|
|
20
|
-
private _offsetX
|
|
21
|
-
private _offsetY
|
|
20
|
+
private _offsetX = 0;
|
|
21
|
+
private _offsetY = 0;
|
|
22
22
|
private _flipX = false;
|
|
23
23
|
private _flipY = false;
|
|
24
|
-
private visible
|
|
25
|
-
|
|
26
|
-
constructor(
|
|
27
|
-
mainGroup: Selection<SVGElement, unknown, null, undefined>,
|
|
28
|
-
showLabels = true,
|
|
29
|
-
labelXDesc: string,
|
|
30
|
-
labelYDesc: string,
|
|
31
|
-
unitOfMeasure: string,
|
|
32
|
-
options?: Options,
|
|
33
|
-
) {
|
|
24
|
+
private visible = true;
|
|
25
|
+
|
|
26
|
+
constructor(mainGroup: Axis['mainGroup'], showLabels = true, labelXDesc: string, labelYDesc: string, unitOfMeasure: string, options?: Options) {
|
|
34
27
|
this.mainGroup = mainGroup;
|
|
35
28
|
this._showLabels = showLabels;
|
|
36
29
|
this._labelXDesc = labelXDesc;
|
|
@@ -51,12 +44,12 @@ export class Axis {
|
|
|
51
44
|
this._scaleY = scaleLinear().domain([0, 1]).range([0, 1]);
|
|
52
45
|
}
|
|
53
46
|
|
|
54
|
-
private renderLabelx(): Selection<
|
|
47
|
+
private renderLabelx(): Selection<SVGTextElement, unknown, null, undefined> {
|
|
55
48
|
const { _labelXDesc: labelXDesc, _unitOfMeasure: unitOfMeasure, _showLabels, _scaleX: scaleX } = this;
|
|
56
49
|
const [, width] = scaleX.range();
|
|
57
50
|
const gx = this.renderGx();
|
|
58
51
|
|
|
59
|
-
let labelx = gx.select('text.axis-labelx');
|
|
52
|
+
let labelx: Selection<SVGTextElement, unknown, null, undefined> = gx.select('text.axis-labelx');
|
|
60
53
|
if (_showLabels) {
|
|
61
54
|
if (labelx.empty()) {
|
|
62
55
|
labelx = gx
|
|
@@ -71,16 +64,16 @@ export class Axis {
|
|
|
71
64
|
} else {
|
|
72
65
|
labelx.remove();
|
|
73
66
|
}
|
|
74
|
-
labelx.attr('transform', `translate(${width / 2},-4)`);
|
|
67
|
+
labelx.attr('transform', `translate(${width! / 2},-4)`);
|
|
75
68
|
return labelx;
|
|
76
69
|
}
|
|
77
70
|
|
|
78
|
-
private renderLabely(): Selection<
|
|
71
|
+
private renderLabely(): Selection<SVGTextElement, unknown, null, undefined> {
|
|
79
72
|
const { _labelYDesc: labelYDesc, _unitOfMeasure: unitOfMeasure, _showLabels, _scaleY } = this;
|
|
80
73
|
const [, height] = _scaleY.range();
|
|
81
74
|
const gy = this.renderGy();
|
|
82
75
|
|
|
83
|
-
let labely = gy.select('text.axis-labely');
|
|
76
|
+
let labely: Selection<SVGTextElement, unknown, null, undefined> = gy.select('text.axis-labely');
|
|
84
77
|
if (_showLabels) {
|
|
85
78
|
if (labely.empty()) {
|
|
86
79
|
labely = gy
|
|
@@ -92,16 +85,16 @@ export class Axis {
|
|
|
92
85
|
.style('font-size', '10px')
|
|
93
86
|
.text(`${labelYDesc} (${unitOfMeasure})`);
|
|
94
87
|
}
|
|
95
|
-
labely.attr('transform', `translate(-10,${height / 2})rotate(90)`);
|
|
88
|
+
labely.attr('transform', `translate(-10,${height! / 2})rotate(90)`);
|
|
96
89
|
} else {
|
|
97
90
|
labely.remove();
|
|
98
91
|
}
|
|
99
92
|
return labely;
|
|
100
93
|
}
|
|
101
94
|
|
|
102
|
-
private renderGy(): Selection<
|
|
95
|
+
private renderGy(): Selection<SVGGElement, unknown, null, undefined> {
|
|
103
96
|
const { _scaleX, _scaleY } = this;
|
|
104
|
-
const yAxis = axisRight(_scaleY) as (selection: Selection<
|
|
97
|
+
const yAxis = axisRight(_scaleY) as (selection: Selection<SVGGElement, unknown, null, undefined>, ...args: any[]) => void;
|
|
105
98
|
const [, width] = _scaleX.range();
|
|
106
99
|
const gy = this.createOrGet('y-axis');
|
|
107
100
|
gy.call(yAxis);
|
|
@@ -110,9 +103,9 @@ export class Axis {
|
|
|
110
103
|
return gy;
|
|
111
104
|
}
|
|
112
105
|
|
|
113
|
-
private renderGx(): Selection<
|
|
106
|
+
private renderGx(): Selection<SVGGElement, unknown, null, undefined> {
|
|
114
107
|
const { _scaleX, _scaleY } = this;
|
|
115
|
-
const xAxis = axisBottom(_scaleX) as (selection: Selection<
|
|
108
|
+
const xAxis = axisBottom(_scaleX) as (selection: Selection<SVGGElement, unknown, null, undefined>, ...args: any[]) => void;
|
|
116
109
|
const [, height] = _scaleY.range();
|
|
117
110
|
|
|
118
111
|
const gx = this.createOrGet('x-axis');
|
|
@@ -121,9 +114,9 @@ export class Axis {
|
|
|
121
114
|
return gx;
|
|
122
115
|
}
|
|
123
116
|
|
|
124
|
-
private createOrGet = (name: string): Selection<
|
|
117
|
+
private createOrGet = (name: string): Selection<SVGGElement, unknown, null, undefined> => {
|
|
125
118
|
const { mainGroup } = this;
|
|
126
|
-
let res = mainGroup.select(`g.${name}`);
|
|
119
|
+
let res: Selection<SVGGElement, unknown, null, undefined> = mainGroup.select(`g.${name}`);
|
|
127
120
|
if (res.empty()) {
|
|
128
121
|
res = mainGroup.append('g').attr('class', name);
|
|
129
122
|
}
|
|
@@ -142,8 +135,8 @@ export class Axis {
|
|
|
142
135
|
onRescale(event: OnRescaleEvent): void {
|
|
143
136
|
const { _scaleX, _scaleY, offsetX, offsetY } = this;
|
|
144
137
|
const { xScale, yScale } = event;
|
|
145
|
-
const xBounds = xScale.domain();
|
|
146
|
-
const yBounds = yScale.domain();
|
|
138
|
+
const xBounds = xScale.domain() as [number, number];
|
|
139
|
+
const yBounds = yScale.domain() as [number, number];
|
|
147
140
|
|
|
148
141
|
const xRange = xScale.range();
|
|
149
142
|
const yRange = yScale.range();
|
|
@@ -173,7 +166,7 @@ export class Axis {
|
|
|
173
166
|
|
|
174
167
|
flipX(flipX: boolean): Axis {
|
|
175
168
|
this._flipX = flipX;
|
|
176
|
-
const domain = this._scaleX.domain();
|
|
169
|
+
const domain = this._scaleX.domain() as [number, number];
|
|
177
170
|
const flip = flipX ? -1 : 1;
|
|
178
171
|
this._scaleX.domain([flip * domain[0], flip * domain[1]]);
|
|
179
172
|
return this;
|
|
@@ -181,7 +174,7 @@ export class Axis {
|
|
|
181
174
|
|
|
182
175
|
flipY(flipY: boolean): Axis {
|
|
183
176
|
this._flipY = flipY;
|
|
184
|
-
const domain = this._scaleY.domain();
|
|
177
|
+
const domain = this._scaleY.domain() as [number, number];
|
|
185
178
|
const flip = flipY ? -1 : 1;
|
|
186
179
|
this._scaleY.domain([flip * domain[0], flip * domain[1]]);
|
|
187
180
|
return this;
|
|
@@ -78,13 +78,13 @@ export class ExtendedCurveInterpolator extends CurveInterpolator {
|
|
|
78
78
|
this.generateArcLengthLookup();
|
|
79
79
|
}
|
|
80
80
|
const index = BinarySearch.search(this.arcLengthLookup, arcLength);
|
|
81
|
-
const v1 = this.arcLengthLookup[index]
|
|
82
|
-
const v2 = this.arcLengthLookup[index + 1]
|
|
81
|
+
const v1 = this.arcLengthLookup[index]!;
|
|
82
|
+
const v2 = this.arcLengthLookup[index + 1]!;
|
|
83
83
|
const t = (index + (arcLength - v1) / (v2 - v1)) / this.arcLengthLookup.length;
|
|
84
84
|
return t;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
generateArcLengthLookup(segments
|
|
87
|
+
generateArcLengthLookup(segments = 1000): void {
|
|
88
88
|
let lastPos = this.getPointAt(0);
|
|
89
89
|
let length = 0;
|
|
90
90
|
for (let i = 0; i < segments; i++) {
|
|
@@ -123,15 +123,15 @@ export class ExtendedCurveInterpolator extends CurveInterpolator {
|
|
|
123
123
|
|
|
124
124
|
if (from !== 0) {
|
|
125
125
|
const fromIndex = Math.floor(from * this.arcLengthLookup.length);
|
|
126
|
-
const fromLl = this.arcLengthLookup[fromIndex]
|
|
127
|
-
const fromLh = this.arcLengthLookup[fromIndex + 1]
|
|
126
|
+
const fromLl = this.arcLengthLookup[fromIndex]!;
|
|
127
|
+
const fromLh = this.arcLengthLookup[fromIndex + 1]!;
|
|
128
128
|
fromLength = fromLl + ((from * this.arcLengthLookup.length) % this.arcLengthLookup.length) * (fromLh - fromLl);
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
if (to !== 1) {
|
|
132
132
|
const toIndex = Math.floor(to * this.arcLengthLookup.length);
|
|
133
|
-
const toLl = this.arcLengthLookup[toIndex]
|
|
134
|
-
const toLh = this.arcLengthLookup[toIndex + 1]
|
|
133
|
+
const toLl = this.arcLengthLookup[toIndex]!;
|
|
134
|
+
const toLh = this.arcLengthLookup[toIndex + 1]!;
|
|
135
135
|
toLength = toLl + ((from * this.arcLengthLookup.length) % this.arcLengthLookup.length) * (toLh - toLl);
|
|
136
136
|
}
|
|
137
137
|
|
|
@@ -36,31 +36,23 @@ export interface ReferenceSystemOptions {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
export class IntersectionReferenceSystem {
|
|
39
|
-
options
|
|
39
|
+
options!: ReferenceSystemOptions;
|
|
40
40
|
|
|
41
41
|
path: number[][] = [];
|
|
42
42
|
|
|
43
43
|
projectedPath: number[][] = [];
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
private _offset = 0;
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
displacement!: number;
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
interpolators!: Interpolators;
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
startVector!: number[];
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
endVector!: number[];
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
interpolators: Interpolators;
|
|
58
|
-
|
|
59
|
-
startVector: number[];
|
|
60
|
-
|
|
61
|
-
endVector: number[];
|
|
62
|
-
|
|
63
|
-
_curtainPathCache: MDPoint[];
|
|
55
|
+
_curtainPathCache: MDPoint[] | undefined;
|
|
64
56
|
|
|
65
57
|
/**
|
|
66
58
|
* Creates a common reference system that layers and other components can use
|
|
@@ -93,15 +85,15 @@ export class IntersectionReferenceSystem {
|
|
|
93
85
|
|
|
94
86
|
this.projectedPath = IntersectionReferenceSystem.toDisplacement(path);
|
|
95
87
|
|
|
96
|
-
const [displacement] = this.projectedPath[this.projectedPath.length - 1]
|
|
97
|
-
this.displacement = displacement
|
|
88
|
+
const [displacement] = this.projectedPath[this.projectedPath.length - 1]!;
|
|
89
|
+
this.displacement = displacement!;
|
|
98
90
|
|
|
99
91
|
this.interpolators = {
|
|
100
92
|
curve: options.curveInterpolator || new ExtendedCurveInterpolator(path),
|
|
101
93
|
trajectory:
|
|
102
94
|
options.trajectoryInterpolator ||
|
|
103
95
|
new ExtendedCurveInterpolator(
|
|
104
|
-
path.map((d: number[]) => [d[0]
|
|
96
|
+
path.map((d: number[]) => [d[0]!, d[1]!]),
|
|
105
97
|
{ tension: tension || TENSION, arcDivisions: arcDivisions || ARC_DIVISIONS },
|
|
106
98
|
),
|
|
107
99
|
curtain:
|
|
@@ -160,7 +152,7 @@ export class IntersectionReferenceSystem {
|
|
|
160
152
|
let prevAngle = Math.PI * 2; // Always add first point
|
|
161
153
|
for (let i = this._offset; i <= this.length + this._offset; i += CURTAIN_SAMPLING_INTERVAL) {
|
|
162
154
|
const point = this.project(i);
|
|
163
|
-
const angle = Math.atan2(point[1]
|
|
155
|
+
const angle = Math.atan2(point[1]!, point[0]!);
|
|
164
156
|
|
|
165
157
|
// Reduce number of points on a straight line by angle since last point
|
|
166
158
|
if (Math.abs(angle - prevAngle) > CURTAIN_SAMPLING_ANGLE_THRESHOLD) {
|
|
@@ -183,7 +175,7 @@ export class IntersectionReferenceSystem {
|
|
|
183
175
|
/**
|
|
184
176
|
* Map a displacement back to length along the curve
|
|
185
177
|
*/
|
|
186
|
-
unproject(displacement: number): number {
|
|
178
|
+
unproject(displacement: number): number | undefined {
|
|
187
179
|
const { normalizedLength, calculateDisplacementFromBottom } = this.options;
|
|
188
180
|
const displacementFromStart = calculateDisplacementFromBottom ? this.displacement - displacement : displacement;
|
|
189
181
|
const length = normalizedLength || this.length;
|
|
@@ -197,9 +189,9 @@ export class IntersectionReferenceSystem {
|
|
|
197
189
|
|
|
198
190
|
const ls = this.interpolators.curtain.getIntersectsAsPositions(displacementFromStart, 0, 1);
|
|
199
191
|
if (ls && ls.length) {
|
|
200
|
-
return ls[0] * length + this._offset;
|
|
192
|
+
return ls[0]! * length + this._offset;
|
|
201
193
|
}
|
|
202
|
-
return
|
|
194
|
+
return undefined;
|
|
203
195
|
}
|
|
204
196
|
|
|
205
197
|
/**
|
|
@@ -208,7 +200,7 @@ export class IntersectionReferenceSystem {
|
|
|
208
200
|
getProjectedLength(length: number): number {
|
|
209
201
|
const { curtain } = this.interpolators;
|
|
210
202
|
const pl = this.project(length);
|
|
211
|
-
const l = pl[0] / curtain.maxX;
|
|
203
|
+
const l = pl[0]! / curtain.maxX;
|
|
212
204
|
return Number.isFinite(l) ? clamp(l, 0, 1) : 0;
|
|
213
205
|
}
|
|
214
206
|
|
|
@@ -229,21 +221,21 @@ export class IntersectionReferenceSystem {
|
|
|
229
221
|
const extensionStart = from < 0 ? -from : 0;
|
|
230
222
|
const extensionEnd = to > 1 ? to - 1 : 0;
|
|
231
223
|
|
|
232
|
-
const refStart = this.interpolators.trajectory.getPointAt(0) as number
|
|
233
|
-
const refEnd = this.interpolators.trajectory.getPointAt(1) as number
|
|
224
|
+
const refStart = this.interpolators.trajectory.getPointAt(0) as [number, number];
|
|
225
|
+
const refEnd = this.interpolators.trajectory.getPointAt(1) as [number, number];
|
|
234
226
|
|
|
235
|
-
let p0;
|
|
236
|
-
let p3;
|
|
227
|
+
let p0: [number, number];
|
|
228
|
+
let p3: [number, number];
|
|
237
229
|
let offset = 0;
|
|
238
230
|
const t0 = Math.max(0, from);
|
|
239
231
|
const t1 = Math.min(1, to);
|
|
240
|
-
const p1 = this.interpolators.trajectory.getPointAt(t0) as number
|
|
241
|
-
const p2 = this.interpolators.trajectory.getPointAt(t1) as number
|
|
232
|
+
const p1 = this.interpolators.trajectory.getPointAt(t0) as [number, number];
|
|
233
|
+
const p2 = this.interpolators.trajectory.getPointAt(t1) as [number, number];
|
|
242
234
|
|
|
243
235
|
if (extensionStart) {
|
|
244
236
|
p0 = [
|
|
245
|
-
refStart[0] + this.startVector[0] * extensionStart * this.displacement,
|
|
246
|
-
refStart[1] + this.startVector[1] * extensionStart * this.displacement,
|
|
237
|
+
refStart[0] + this.startVector[0]! * extensionStart * this.displacement,
|
|
238
|
+
refStart[1] + this.startVector[1]! * extensionStart * this.displacement,
|
|
247
239
|
];
|
|
248
240
|
offset = -Vector2.distance(p0, refStart);
|
|
249
241
|
} else if (from > 0) {
|
|
@@ -251,7 +243,7 @@ export class IntersectionReferenceSystem {
|
|
|
251
243
|
}
|
|
252
244
|
|
|
253
245
|
if (extensionEnd) {
|
|
254
|
-
p3 = [refEnd[0] + this.endVector[0] * extensionEnd * this.displacement, refEnd[1] + this.endVector[1] * extensionEnd * this.displacement];
|
|
246
|
+
p3 = [refEnd[0] + this.endVector[0]! * extensionEnd * this.displacement, refEnd[1] + this.endVector[1]! * extensionEnd * this.displacement];
|
|
255
247
|
}
|
|
256
248
|
const points = [];
|
|
257
249
|
const tl = to - from;
|
|
@@ -259,19 +251,19 @@ export class IntersectionReferenceSystem {
|
|
|
259
251
|
const curveSteps = Math.ceil(((t1 - t0) / tl) * steps);
|
|
260
252
|
const postSteps = steps - curveSteps - preSteps;
|
|
261
253
|
|
|
262
|
-
if (p0) {
|
|
254
|
+
if (p0!) {
|
|
263
255
|
points.push(p0);
|
|
264
256
|
for (let i = 1; i < preSteps; i++) {
|
|
265
257
|
const f = (i / preSteps) * extensionStart * this.displacement;
|
|
266
|
-
points.push([p0[0] - this.startVector[0] * f, p0[1] - this.startVector[1] * f]);
|
|
258
|
+
points.push([p0[0] - this.startVector[0]! * f, p0[1] - this.startVector[1]! * f]);
|
|
267
259
|
}
|
|
268
260
|
}
|
|
269
261
|
const curvePoints = this.interpolators.trajectory.getPoints(curveSteps - 1, null, t0, t1) as number[][]; // returns steps + 1 points
|
|
270
262
|
points.push(...curvePoints);
|
|
271
|
-
if (p3) {
|
|
263
|
+
if (p3!) {
|
|
272
264
|
for (let i = 1; i < postSteps - 1; i++) {
|
|
273
265
|
const f = (i / postSteps) * extensionEnd * this.displacement;
|
|
274
|
-
points.push([p2[0] + this.endVector[0] * f, p2[1] + this.endVector[1] * f]);
|
|
266
|
+
points.push([p2[0] + this.endVector[0]! * f, p2[1] + this.endVector[1]! * f]);
|
|
275
267
|
}
|
|
276
268
|
points.push(p3);
|
|
277
269
|
}
|
|
@@ -330,7 +322,7 @@ export class IntersectionReferenceSystem {
|
|
|
330
322
|
getTrajectoryVector(): number[] {
|
|
331
323
|
const { trajectoryAngle, calculateDisplacementFromBottom } = this.options;
|
|
332
324
|
|
|
333
|
-
if (isFinite(trajectoryAngle)) {
|
|
325
|
+
if (trajectoryAngle != null && isFinite(trajectoryAngle)) {
|
|
334
326
|
const angleInRad = radians(trajectoryAngle);
|
|
335
327
|
return new Vector2(Math.cos(angleInRad), Math.sin(angleInRad)).toArray();
|
|
336
328
|
}
|
|
@@ -351,11 +343,11 @@ export class IntersectionReferenceSystem {
|
|
|
351
343
|
* @returns {array}
|
|
352
344
|
*/
|
|
353
345
|
static toDisplacement(points: number[][], offset = 0): number[][] {
|
|
354
|
-
let p0: number[] = points[0]
|
|
346
|
+
let p0: number[] = points[0]!;
|
|
355
347
|
let l = 0;
|
|
356
348
|
const projected = points.map((p1: number[]) => {
|
|
357
|
-
const dx = p1[0] - p0[0]
|
|
358
|
-
const dy = p1[1] - p0[1]
|
|
349
|
+
const dx = p1[0]! - p0[0]!;
|
|
350
|
+
const dy = p1[1]! - p0[1]!;
|
|
359
351
|
l += Math.sqrt(dx ** 2 + dy ** 2);
|
|
360
352
|
p0 = p1;
|
|
361
353
|
return [offset > 0 ? offset - l : l, p1[2] || 0];
|
|
@@ -377,7 +369,7 @@ export class IntersectionReferenceSystem {
|
|
|
377
369
|
}
|
|
378
370
|
|
|
379
371
|
get length(): number {
|
|
380
|
-
return this.interpolators.curve
|
|
372
|
+
return this.interpolators.curve?.length ?? 0;
|
|
381
373
|
}
|
|
382
374
|
|
|
383
375
|
get offset(): number {
|
|
@@ -16,8 +16,8 @@ export class LayerManager {
|
|
|
16
16
|
|
|
17
17
|
private layers: Layer<unknown>[] = [];
|
|
18
18
|
|
|
19
|
-
private _axis: Axis;
|
|
20
|
-
private _svgContainer: Selection<
|
|
19
|
+
private _axis: Axis | undefined;
|
|
20
|
+
private _svgContainer: Selection<HTMLDivElement, unknown, null, undefined> | undefined;
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Handles layers and axis also holds a zoom and pan handler object
|
|
@@ -30,7 +30,7 @@ export class LayerManager {
|
|
|
30
30
|
this.layerContainer = document.createElement('div');
|
|
31
31
|
this.layerContainer.className = 'layer-container';
|
|
32
32
|
this.container.appendChild(this.layerContainer);
|
|
33
|
-
this.adjustToSize(+this.container.getAttribute('width'), +this.container.getAttribute('height'));
|
|
33
|
+
this.adjustToSize(+(this.container.getAttribute('width') ?? 0), +(this.container.getAttribute('height') ?? 0));
|
|
34
34
|
this._zoomPanHandler = new ZoomPanHandler(container, (event) => this.rescale(event));
|
|
35
35
|
if (scaleOptions) {
|
|
36
36
|
const { xMin, xMax, yMin, yMax, xBounds, yBounds } = scaleOptions;
|
|
@@ -71,7 +71,7 @@ export class LayerManager {
|
|
|
71
71
|
* Clears data from all mounted layers
|
|
72
72
|
* @param includeReferenceSystem - (optional) if true also removes reference system, default is true
|
|
73
73
|
*/
|
|
74
|
-
clearAllData(includeReferenceSystem
|
|
74
|
+
clearAllData(includeReferenceSystem = true): LayerManager {
|
|
75
75
|
this.layers.forEach((l) => l.clearData(includeReferenceSystem));
|
|
76
76
|
return this;
|
|
77
77
|
}
|
|
@@ -113,7 +113,7 @@ export class LayerManager {
|
|
|
113
113
|
return this;
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
getLayer(layerId: string): Layer<unknown> {
|
|
116
|
+
getLayer(layerId: string): Layer<unknown> | undefined {
|
|
117
117
|
return this.layers.find((l) => l.id === layerId || l.getInternalLayerIds().includes(layerId));
|
|
118
118
|
}
|
|
119
119
|
|
|
@@ -181,51 +181,57 @@ export class LayerManager {
|
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
showAxis(): LayerManager {
|
|
184
|
-
this._axis
|
|
184
|
+
this._axis?.show();
|
|
185
185
|
return this;
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
hideAxis(): LayerManager {
|
|
189
|
-
this._axis
|
|
189
|
+
this._axis?.hide();
|
|
190
190
|
return this;
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
showAxisLabels(): LayerManager {
|
|
194
|
-
this._axis
|
|
194
|
+
this._axis?.showLabels();
|
|
195
195
|
return this;
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
hideAxisLabels(): LayerManager {
|
|
199
|
-
this._axis
|
|
199
|
+
this._axis?.hideLabels();
|
|
200
200
|
return this;
|
|
201
201
|
}
|
|
202
202
|
|
|
203
203
|
setAxisOffset(x: number, y: number): LayerManager {
|
|
204
|
-
this._axis
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
l
|
|
209
|
-
|
|
210
|
-
|
|
204
|
+
if (this._axis) {
|
|
205
|
+
this._axis.offsetX = x;
|
|
206
|
+
this._axis.offsetY = y;
|
|
207
|
+
const gridLayers = this.layers.filter((l: Layer<unknown>): l is GridLayer<unknown> => l instanceof GridLayer);
|
|
208
|
+
gridLayers.forEach((l: GridLayer<unknown>) => {
|
|
209
|
+
l.offsetX = x;
|
|
210
|
+
l.offsetY = y;
|
|
211
|
+
});
|
|
212
|
+
}
|
|
211
213
|
return this;
|
|
212
214
|
}
|
|
213
215
|
|
|
214
216
|
setXAxisOffset(x: number): LayerManager {
|
|
215
|
-
this._axis
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
l
|
|
219
|
-
|
|
217
|
+
if (this._axis) {
|
|
218
|
+
this._axis.offsetX = x;
|
|
219
|
+
const gridLayers = this.layers.filter((l: Layer<unknown>): l is GridLayer<unknown> => l instanceof GridLayer);
|
|
220
|
+
gridLayers.forEach((l: GridLayer<unknown>) => {
|
|
221
|
+
l.offsetX = x;
|
|
222
|
+
});
|
|
223
|
+
}
|
|
220
224
|
return this;
|
|
221
225
|
}
|
|
222
226
|
|
|
223
227
|
setYAxisOffset(y: number): LayerManager {
|
|
224
|
-
this._axis
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
l
|
|
228
|
-
|
|
228
|
+
if (this._axis) {
|
|
229
|
+
this._axis.offsetY = y;
|
|
230
|
+
const gridLayers = this.layers.filter((l: Layer<unknown>): l is GridLayer<unknown> => l instanceof GridLayer);
|
|
231
|
+
gridLayers.forEach((l: GridLayer<unknown>) => {
|
|
232
|
+
l.offsetY = y;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
229
235
|
return this;
|
|
230
236
|
}
|
|
231
237
|
|
|
@@ -247,10 +253,6 @@ export class LayerManager {
|
|
|
247
253
|
destroy(): LayerManager {
|
|
248
254
|
this.removeAllLayers();
|
|
249
255
|
this.layerContainer.remove();
|
|
250
|
-
this.layerContainer = undefined;
|
|
251
|
-
this.container = undefined;
|
|
252
|
-
this.layers = undefined;
|
|
253
|
-
this._zoomPanHandler = undefined;
|
|
254
256
|
this._axis = undefined;
|
|
255
257
|
this._svgContainer = undefined;
|
|
256
258
|
|
|
@@ -261,7 +263,7 @@ export class LayerManager {
|
|
|
261
263
|
return this._zoomPanHandler;
|
|
262
264
|
}
|
|
263
265
|
|
|
264
|
-
get axis(): Axis {
|
|
266
|
+
get axis(): Axis | undefined {
|
|
265
267
|
return this._axis;
|
|
266
268
|
}
|
|
267
269
|
|
|
@@ -12,7 +12,7 @@ import { HORIZONTAL_AXIS_MARGIN, VERTICAL_AXIS_MARGIN } from '../constants';
|
|
|
12
12
|
* API for controlling data and layers
|
|
13
13
|
*/
|
|
14
14
|
export class Controller {
|
|
15
|
-
private _referenceSystem: IntersectionReferenceSystem;
|
|
15
|
+
private _referenceSystem: IntersectionReferenceSystem | undefined;
|
|
16
16
|
|
|
17
17
|
private layerManager: LayerManager;
|
|
18
18
|
private _overlay: Overlay<Controller>;
|
|
@@ -69,7 +69,7 @@ export class Controller {
|
|
|
69
69
|
* Clears data from all mounted layers
|
|
70
70
|
* @param includeReferenceSystem - (optional) if true also removes reference system, default is true
|
|
71
71
|
*/
|
|
72
|
-
clearAllData(includeReferenceSystem
|
|
72
|
+
clearAllData(includeReferenceSystem = true): Controller {
|
|
73
73
|
this.layerManager.clearAllData(includeReferenceSystem);
|
|
74
74
|
return this;
|
|
75
75
|
}
|
|
@@ -106,7 +106,7 @@ export class Controller {
|
|
|
106
106
|
* Find first layer with given id, returns undefined if none are found
|
|
107
107
|
* @param layerId string id
|
|
108
108
|
*/
|
|
109
|
-
getLayer(layerId: string): Layer<unknown> {
|
|
109
|
+
getLayer(layerId: string): Layer<unknown> | undefined {
|
|
110
110
|
return this.layerManager.getLayer(layerId);
|
|
111
111
|
}
|
|
112
112
|
|
|
@@ -259,8 +259,6 @@ export class Controller {
|
|
|
259
259
|
this.layerManager.destroy();
|
|
260
260
|
this._overlay.destroy();
|
|
261
261
|
this._referenceSystem = undefined;
|
|
262
|
-
this.layerManager = undefined;
|
|
263
|
-
this._overlay = undefined;
|
|
264
262
|
return this;
|
|
265
263
|
}
|
|
266
264
|
|
|
@@ -278,7 +276,7 @@ export class Controller {
|
|
|
278
276
|
return this._overlay;
|
|
279
277
|
}
|
|
280
278
|
|
|
281
|
-
get referenceSystem(): IntersectionReferenceSystem {
|
|
279
|
+
get referenceSystem(): IntersectionReferenceSystem | undefined {
|
|
282
280
|
return this._referenceSystem;
|
|
283
281
|
}
|
|
284
282
|
|
|
@@ -286,7 +284,7 @@ export class Controller {
|
|
|
286
284
|
return this.layerManager.zoomPanHandler;
|
|
287
285
|
}
|
|
288
286
|
|
|
289
|
-
get axis(): Axis {
|
|
287
|
+
get axis(): Axis | undefined {
|
|
290
288
|
return this.layerManager.axis;
|
|
291
289
|
}
|
|
292
290
|
|