@equinor/esv-intersection 3.0.9 → 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.
Files changed (107) hide show
  1. package/dist/components/axis.d.ts +1 -2
  2. package/dist/components/axis.d.ts.map +1 -1
  3. package/dist/control/ExtendedCurveInterpolator.d.ts.map +1 -1
  4. package/dist/control/IntersectionReferenceSystem.d.ts +2 -6
  5. package/dist/control/IntersectionReferenceSystem.d.ts.map +1 -1
  6. package/dist/control/LayerManager.d.ts +2 -2
  7. package/dist/control/LayerManager.d.ts.map +1 -1
  8. package/dist/control/MainController.d.ts +3 -3
  9. package/dist/control/MainController.d.ts.map +1 -1
  10. package/dist/control/ZoomPanHandler.d.ts +5 -4
  11. package/dist/control/ZoomPanHandler.d.ts.map +1 -1
  12. package/dist/control/interfaces.d.ts +3 -4
  13. package/dist/control/interfaces.d.ts.map +1 -1
  14. package/dist/control/overlay.d.ts +3 -3
  15. package/dist/control/overlay.d.ts.map +1 -1
  16. package/dist/datautils/colortable.d.ts +1 -1
  17. package/dist/datautils/colortable.d.ts.map +1 -1
  18. package/dist/datautils/findsample.d.ts.map +1 -1
  19. package/dist/datautils/schematicShapeGenerator.d.ts +3 -3
  20. package/dist/datautils/schematicShapeGenerator.d.ts.map +1 -1
  21. package/dist/datautils/seismicimage.d.ts.map +1 -1
  22. package/dist/datautils/trajectory.d.ts +1 -1
  23. package/dist/datautils/trajectory.d.ts.map +1 -1
  24. package/dist/index.cjs +2 -2
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.mjs +1373 -1272
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/index.umd.js +2 -2
  29. package/dist/index.umd.js.map +1 -1
  30. package/dist/interfaces.d.ts +1 -2
  31. package/dist/interfaces.d.ts.map +1 -1
  32. package/dist/layers/CalloutCanvasLayer.d.ts +2 -2
  33. package/dist/layers/CalloutCanvasLayer.d.ts.map +1 -1
  34. package/dist/layers/CustomDisplayObjects/ComplexRopeGeometry.d.ts.map +1 -1
  35. package/dist/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.d.ts.map +1 -1
  36. package/dist/layers/GeomodelCanvasLayer.d.ts +1 -1
  37. package/dist/layers/GeomodelCanvasLayer.d.ts.map +1 -1
  38. package/dist/layers/GeomodelLabelsLayer.d.ts +4 -4
  39. package/dist/layers/GeomodelLabelsLayer.d.ts.map +1 -1
  40. package/dist/layers/GeomodelLayerV2.d.ts.map +1 -1
  41. package/dist/layers/GridLayer.d.ts.map +1 -1
  42. package/dist/layers/ImageCanvasLayer.d.ts +1 -1
  43. package/dist/layers/ImageCanvasLayer.d.ts.map +1 -1
  44. package/dist/layers/ReferenceLineLayer.d.ts +1 -2
  45. package/dist/layers/ReferenceLineLayer.d.ts.map +1 -1
  46. package/dist/layers/SchematicLayer.d.ts.map +1 -1
  47. package/dist/layers/WellborePathLayer.d.ts +1 -1
  48. package/dist/layers/WellborePathLayer.d.ts.map +1 -1
  49. package/dist/layers/base/CanvasLayer.d.ts +3 -3
  50. package/dist/layers/base/CanvasLayer.d.ts.map +1 -1
  51. package/dist/layers/base/HTMLLayer.d.ts +1 -1
  52. package/dist/layers/base/HTMLLayer.d.ts.map +1 -1
  53. package/dist/layers/base/Layer.d.ts +10 -10
  54. package/dist/layers/base/Layer.d.ts.map +1 -1
  55. package/dist/layers/base/PixiLayer.d.ts +4 -4
  56. package/dist/layers/base/PixiLayer.d.ts.map +1 -1
  57. package/dist/layers/base/SVGLayer.d.ts +1 -1
  58. package/dist/layers/base/SVGLayer.d.ts.map +1 -1
  59. package/dist/utils/arc-length.d.ts.map +1 -1
  60. package/dist/utils/color.d.ts.map +1 -1
  61. package/dist/utils/root-finder.d.ts +1 -1
  62. package/dist/utils/root-finder.d.ts.map +1 -1
  63. package/dist/utils/text.d.ts +2 -2
  64. package/dist/utils/text.d.ts.map +1 -1
  65. package/dist/utils/vectorUtils.d.ts.map +1 -1
  66. package/dist/vendor/pixi-dashed-line/index.d.ts.map +1 -1
  67. package/package.json +11 -11
  68. package/src/components/axis.ts +23 -30
  69. package/src/control/ExtendedCurveInterpolator.ts +7 -7
  70. package/src/control/IntersectionReferenceSystem.ts +33 -41
  71. package/src/control/LayerManager.ts +33 -31
  72. package/src/control/MainController.ts +5 -7
  73. package/src/control/ZoomPanHandler.ts +50 -45
  74. package/src/control/interfaces.ts +3 -3
  75. package/src/control/overlay.ts +20 -16
  76. package/src/datautils/colortable.ts +4 -4
  77. package/src/datautils/findsample.ts +8 -7
  78. package/src/datautils/picks.ts +13 -13
  79. package/src/datautils/schematicShapeGenerator.ts +47 -17
  80. package/src/datautils/seismicimage.ts +12 -13
  81. package/src/datautils/surfacedata.ts +27 -26
  82. package/src/datautils/trajectory.ts +34 -32
  83. package/src/interfaces.ts +1 -1
  84. package/src/layers/CalloutCanvasLayer.ts +55 -58
  85. package/src/layers/CustomDisplayObjects/ComplexRopeGeometry.ts +23 -20
  86. package/src/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.ts +9 -10
  87. package/src/layers/CustomDisplayObjects/UniformTextureStretchRopeGeometry.ts +13 -13
  88. package/src/layers/GeomodelCanvasLayer.ts +43 -36
  89. package/src/layers/GeomodelLabelsLayer.ts +99 -96
  90. package/src/layers/GeomodelLayerV2.ts +11 -11
  91. package/src/layers/GridLayer.ts +25 -21
  92. package/src/layers/ImageCanvasLayer.ts +17 -11
  93. package/src/layers/ReferenceLineLayer.ts +53 -45
  94. package/src/layers/SchematicLayer.ts +78 -75
  95. package/src/layers/WellborePathLayer.ts +48 -46
  96. package/src/layers/base/CanvasLayer.ts +18 -18
  97. package/src/layers/base/HTMLLayer.ts +5 -5
  98. package/src/layers/base/Layer.ts +18 -18
  99. package/src/layers/base/PixiLayer.ts +24 -20
  100. package/src/layers/base/SVGLayer.ts +5 -5
  101. package/src/utils/arc-length.ts +3 -10
  102. package/src/utils/binary-search.ts +2 -2
  103. package/src/utils/color.ts +9 -5
  104. package/src/utils/root-finder.ts +4 -4
  105. package/src/utils/text.ts +5 -5
  106. package/src/utils/vectorUtils.ts +13 -6
  107. package/src/vendor/pixi-dashed-line/index.ts +3 -2
@@ -1,5 +1,5 @@
1
1
  import { axisRight, axisBottom } from 'd3-axis';
2
- import { BaseType, Selection } from 'd3-selection';
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<SVGElement, unknown, null, undefined>;
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: number = 0;
21
- private _offsetY: number = 0;
20
+ private _offsetX = 0;
21
+ private _offsetY = 0;
22
22
  private _flipX = false;
23
23
  private _flipY = false;
24
- private visible: boolean = true;
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<BaseType, unknown, null, undefined> {
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<BaseType, unknown, null, undefined> {
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<BaseType, unknown, null, undefined> {
95
+ private renderGy(): Selection<SVGGElement, unknown, null, undefined> {
103
96
  const { _scaleX, _scaleY } = this;
104
- const yAxis = axisRight(_scaleY) as (selection: Selection<SVGSVGElement, unknown, null, undefined>) => void;
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<BaseType, unknown, null, undefined> {
106
+ private renderGx(): Selection<SVGGElement, unknown, null, undefined> {
114
107
  const { _scaleX, _scaleY } = this;
115
- const xAxis = axisBottom(_scaleX) as (selection: Selection<SVGSVGElement, unknown, null, undefined>) => void;
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<BaseType, unknown, null, undefined> => {
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: number = 1000): void {
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: ReferenceSystemOptions;
39
+ options!: ReferenceSystemOptions;
40
40
 
41
41
  path: number[][] = [];
42
42
 
43
43
  projectedPath: number[][] = [];
44
44
 
45
- projectedTrajectory: number[][];
45
+ private _offset = 0;
46
46
 
47
- private _offset: number = 0;
47
+ displacement!: number;
48
48
 
49
- displacement: number;
49
+ interpolators!: Interpolators;
50
50
 
51
- depthReference: number;
51
+ startVector!: number[];
52
52
 
53
- wellboreId: number;
53
+ endVector!: number[];
54
54
 
55
- trajectoryOffset: number;
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], d[1]]),
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], point[0]);
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 null;
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.length;
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<HTMLElement, unknown, null, undefined>;
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: boolean = true): LayerManager {
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.show();
184
+ this._axis?.show();
185
185
  return this;
186
186
  }
187
187
 
188
188
  hideAxis(): LayerManager {
189
- this._axis.hide();
189
+ this._axis?.hide();
190
190
  return this;
191
191
  }
192
192
 
193
193
  showAxisLabels(): LayerManager {
194
- this._axis.showLabels();
194
+ this._axis?.showLabels();
195
195
  return this;
196
196
  }
197
197
 
198
198
  hideAxisLabels(): LayerManager {
199
- this._axis.hideLabels();
199
+ this._axis?.hideLabels();
200
200
  return this;
201
201
  }
202
202
 
203
203
  setAxisOffset(x: number, y: number): LayerManager {
204
- this._axis.offsetX = x;
205
- this._axis.offsetY = y;
206
- const gridLayers = this.layers.filter((l: Layer<unknown>) => l instanceof GridLayer<unknown>);
207
- gridLayers.forEach((l: GridLayer<unknown>) => {
208
- l.offsetX = x;
209
- l.offsetY = y;
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.offsetX = x;
216
- const gridLayers = this.layers.filter((l: Layer<unknown>) => l instanceof GridLayer<unknown>);
217
- gridLayers.forEach((l: GridLayer<unknown>) => {
218
- l.offsetX = x;
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.offsetY = y;
225
- const gridLayers = this.layers.filter((l: Layer<unknown>) => l instanceof GridLayer<unknown>);
226
- gridLayers.forEach((l: GridLayer<unknown>) => {
227
- l.offsetY = y;
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: boolean = true): Controller {
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