@equinor/esv-intersection 3.0.4 → 3.0.6

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 (169) hide show
  1. package/README.md +18 -3
  2. package/dist/components/axis.d.ts +48 -0
  3. package/dist/components/axis.d.ts.map +1 -0
  4. package/dist/components/index.d.ts +2 -0
  5. package/dist/components/index.d.ts.map +1 -0
  6. package/dist/constants.d.ts +1 -0
  7. package/dist/constants.d.ts.map +1 -0
  8. package/dist/control/ExtendedCurveInterpolator.d.ts +59 -0
  9. package/dist/control/ExtendedCurveInterpolator.d.ts.map +1 -0
  10. package/dist/control/IntersectionReferenceSystem.d.ts +97 -0
  11. package/dist/control/IntersectionReferenceSystem.d.ts.map +1 -0
  12. package/dist/control/LayerManager.d.ts +77 -0
  13. package/dist/control/LayerManager.d.ts.map +1 -0
  14. package/dist/control/MainController.d.ts +155 -0
  15. package/dist/control/MainController.d.ts.map +1 -0
  16. package/dist/control/ZoomPanHandler.d.ts +159 -0
  17. package/dist/control/ZoomPanHandler.d.ts.map +1 -0
  18. package/dist/control/index.d.ts +6 -0
  19. package/dist/control/index.d.ts.map +1 -0
  20. package/dist/control/interfaces.d.ts +38 -0
  21. package/dist/control/interfaces.d.ts.map +1 -0
  22. package/dist/control/overlay.d.ts +21 -0
  23. package/dist/control/overlay.d.ts.map +1 -0
  24. package/dist/datautils/colortable.d.ts +2 -0
  25. package/dist/datautils/colortable.d.ts.map +1 -0
  26. package/dist/datautils/findsample.d.ts +3 -0
  27. package/dist/datautils/findsample.d.ts.map +1 -0
  28. package/dist/datautils/index.d.ts +7 -0
  29. package/dist/datautils/index.d.ts.map +1 -0
  30. package/dist/datautils/interfaces.d.ts +64 -0
  31. package/dist/datautils/interfaces.d.ts.map +1 -0
  32. package/dist/datautils/picks.d.ts +75 -0
  33. package/dist/datautils/picks.d.ts.map +1 -0
  34. package/dist/datautils/schematicShapeGenerator.d.ts +60 -0
  35. package/dist/datautils/schematicShapeGenerator.d.ts.map +1 -0
  36. package/dist/datautils/seismicimage.d.ts +46 -0
  37. package/dist/datautils/seismicimage.d.ts.map +1 -0
  38. package/dist/datautils/surfacedata.d.ts +11 -0
  39. package/dist/datautils/surfacedata.d.ts.map +1 -0
  40. package/dist/datautils/trajectory.d.ts +15 -0
  41. package/dist/datautils/trajectory.d.ts.map +1 -0
  42. package/dist/index.cjs +1 -1
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.mjs +141 -143
  47. package/dist/index.mjs.map +1 -1
  48. package/dist/index.umd.js +1 -1
  49. package/dist/index.umd.js.map +1 -1
  50. package/dist/interfaces.d.ts +1 -0
  51. package/dist/interfaces.d.ts.map +1 -0
  52. package/dist/layers/CalloutCanvasLayer.d.ts +61 -0
  53. package/dist/layers/CalloutCanvasLayer.d.ts.map +1 -0
  54. package/dist/layers/CustomDisplayObjects/ComplexRope.d.ts +22 -0
  55. package/dist/layers/CustomDisplayObjects/ComplexRope.d.ts.map +1 -0
  56. package/dist/layers/CustomDisplayObjects/ComplexRopeGeometry.d.ts +24 -0
  57. package/dist/layers/CustomDisplayObjects/ComplexRopeGeometry.d.ts.map +1 -0
  58. package/dist/layers/CustomDisplayObjects/FixedWidthSimpleRope.d.ts +21 -0
  59. package/dist/layers/CustomDisplayObjects/FixedWidthSimpleRope.d.ts.map +1 -0
  60. package/dist/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.d.ts +27 -0
  61. package/dist/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.d.ts.map +1 -0
  62. package/dist/layers/CustomDisplayObjects/UniformTextureStretchRope.d.ts +18 -0
  63. package/dist/layers/CustomDisplayObjects/UniformTextureStretchRope.d.ts.map +1 -0
  64. package/dist/layers/CustomDisplayObjects/UniformTextureStretchRopeGeometry.d.ts +25 -0
  65. package/dist/layers/CustomDisplayObjects/UniformTextureStretchRopeGeometry.d.ts.map +1 -0
  66. package/dist/layers/GeomodelCanvasLayer.d.ts +29 -0
  67. package/dist/layers/GeomodelCanvasLayer.d.ts.map +1 -0
  68. package/dist/layers/GeomodelLabelsLayer.d.ts +50 -0
  69. package/dist/layers/GeomodelLabelsLayer.d.ts.map +1 -0
  70. package/dist/layers/GeomodelLayerV2.d.ts +13 -0
  71. package/dist/layers/GeomodelLayerV2.d.ts.map +1 -0
  72. package/dist/layers/GridLayer.d.ts +30 -0
  73. package/dist/layers/GridLayer.d.ts.map +1 -0
  74. package/dist/layers/ImageCanvasLayer.d.ts +21 -0
  75. package/dist/layers/ImageCanvasLayer.d.ts.map +1 -0
  76. package/dist/layers/ReferenceLineLayer.d.ts +30 -0
  77. package/dist/layers/ReferenceLineLayer.d.ts.map +1 -0
  78. package/dist/layers/SchematicLayer.d.ts +114 -0
  79. package/dist/layers/SchematicLayer.d.ts.map +1 -0
  80. package/dist/layers/SeismicCanvasLayer.d.ts +19 -0
  81. package/dist/layers/SeismicCanvasLayer.d.ts.map +1 -0
  82. package/dist/layers/WellborePathLayer.d.ts +18 -0
  83. package/dist/layers/WellborePathLayer.d.ts.map +1 -0
  84. package/dist/layers/base/CanvasLayer.d.ts +20 -0
  85. package/dist/layers/base/CanvasLayer.d.ts.map +1 -0
  86. package/dist/layers/base/HTMLLayer.d.ts +14 -0
  87. package/dist/layers/base/HTMLLayer.d.ts.map +1 -0
  88. package/dist/layers/base/Layer.d.ts +70 -0
  89. package/dist/layers/base/Layer.d.ts.map +1 -0
  90. package/dist/layers/base/PixiLayer.d.ts +33 -0
  91. package/dist/layers/base/PixiLayer.d.ts.map +1 -0
  92. package/dist/layers/base/SVGLayer.d.ts +14 -0
  93. package/dist/layers/base/SVGLayer.d.ts.map +1 -0
  94. package/dist/layers/base/index.d.ts +6 -0
  95. package/dist/layers/base/index.d.ts.map +1 -0
  96. package/dist/layers/index.d.ts +17 -0
  97. package/dist/layers/index.d.ts.map +1 -0
  98. package/dist/layers/schematicInterfaces.d.ts +210 -0
  99. package/dist/layers/schematicInterfaces.d.ts.map +1 -0
  100. package/dist/utils/arc-length.d.ts +24 -0
  101. package/dist/utils/arc-length.d.ts.map +1 -0
  102. package/dist/utils/binary-search.d.ts +9 -0
  103. package/dist/utils/binary-search.d.ts.map +1 -0
  104. package/dist/utils/color.d.ts +6 -0
  105. package/dist/utils/color.d.ts.map +1 -0
  106. package/dist/utils/index.d.ts +2 -0
  107. package/dist/utils/index.d.ts.map +1 -0
  108. package/dist/utils/root-finder.d.ts +35 -0
  109. package/dist/utils/root-finder.d.ts.map +1 -0
  110. package/dist/utils/text.d.ts +15 -0
  111. package/dist/utils/text.d.ts.map +1 -0
  112. package/dist/utils/vectorUtils.d.ts +16 -0
  113. package/dist/utils/vectorUtils.d.ts.map +1 -0
  114. package/dist/vendor/pixi-dashed-line/index.d.ts +57 -0
  115. package/dist/vendor/pixi-dashed-line/index.d.ts.map +1 -0
  116. package/package.json +28 -21
  117. package/src/.eslintrc.json +5 -0
  118. package/src/components/axis.ts +247 -0
  119. package/src/components/index.ts +1 -0
  120. package/src/control/ExtendedCurveInterpolator.ts +155 -0
  121. package/src/control/IntersectionReferenceSystem.ts +391 -0
  122. package/src/control/LayerManager.ts +294 -0
  123. package/src/control/MainController.ts +296 -0
  124. package/src/control/ZoomPanHandler.ts +436 -0
  125. package/src/control/index.ts +5 -0
  126. package/src/control/interfaces.ts +42 -0
  127. package/src/control/overlay.ts +118 -0
  128. package/src/datautils/colortable.ts +14 -0
  129. package/src/datautils/findsample.ts +64 -0
  130. package/src/datautils/index.ts +6 -0
  131. package/src/datautils/interfaces.ts +68 -0
  132. package/src/datautils/picks.ts +328 -0
  133. package/src/datautils/schematicShapeGenerator.ts +1008 -0
  134. package/src/datautils/seismicimage.ts +180 -0
  135. package/src/datautils/surfacedata.ts +317 -0
  136. package/src/datautils/trajectory.ts +206 -0
  137. package/src/layers/CalloutCanvasLayer.ts +338 -0
  138. package/src/layers/CustomDisplayObjects/ComplexRope.ts +44 -0
  139. package/src/layers/CustomDisplayObjects/ComplexRopeGeometry.ts +184 -0
  140. package/src/layers/CustomDisplayObjects/FixedWidthSimpleRope.ts +41 -0
  141. package/src/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.ts +149 -0
  142. package/src/layers/CustomDisplayObjects/UniformTextureStretchRope.ts +39 -0
  143. package/src/layers/CustomDisplayObjects/UniformTextureStretchRopeGeometry.ts +174 -0
  144. package/src/layers/GeomodelCanvasLayer.ts +176 -0
  145. package/src/layers/GeomodelLabelsLayer.ts +615 -0
  146. package/src/layers/GeomodelLayerV2.ts +111 -0
  147. package/src/layers/GridLayer.ts +145 -0
  148. package/src/layers/ImageCanvasLayer.ts +55 -0
  149. package/src/layers/ReferenceLineLayer.ts +185 -0
  150. package/src/layers/SchematicLayer.ts +870 -0
  151. package/src/layers/SeismicCanvasLayer.ts +46 -0
  152. package/src/layers/WellborePathLayer.ts +129 -0
  153. package/src/layers/base/CanvasLayer.ts +102 -0
  154. package/src/layers/base/HTMLLayer.ts +70 -0
  155. package/src/layers/base/Layer.ts +217 -0
  156. package/src/layers/base/PixiLayer.ts +190 -0
  157. package/src/layers/base/SVGLayer.ts +63 -0
  158. package/src/layers/base/index.ts +5 -0
  159. package/src/layers/index.ts +16 -0
  160. package/src/layers/schematicInterfaces.ts +472 -0
  161. package/src/tsconfig.json +9 -0
  162. package/src/utils/arc-length.ts +66 -0
  163. package/src/utils/binary-search.ts +26 -0
  164. package/src/utils/color.ts +22 -0
  165. package/src/utils/index.ts +1 -0
  166. package/src/utils/root-finder.ts +78 -0
  167. package/src/utils/text.ts +88 -0
  168. package/src/utils/vectorUtils.ts +67 -0
  169. package/src/vendor/pixi-dashed-line/index.ts +390 -0
@@ -0,0 +1,46 @@
1
+ import { CanvasLayer } from './base/CanvasLayer';
2
+ import { OnUpdateEvent, OnMountEvent, OnRescaleEvent } from '../interfaces';
3
+
4
+ export type SeismicCanvasDataOptions = {
5
+ x: number;
6
+ y: number;
7
+ width: number;
8
+ height: number;
9
+ };
10
+
11
+ export type SeismicCanvasData = {
12
+ image: CanvasImageSource | OffscreenCanvas;
13
+ options: SeismicCanvasDataOptions;
14
+ };
15
+
16
+ export class SeismicCanvasLayer extends CanvasLayer<SeismicCanvasData> {
17
+ override onMount(event: OnMountEvent): void {
18
+ super.onMount(event);
19
+ }
20
+
21
+ override onUpdate(event: OnUpdateEvent<SeismicCanvasData>): void {
22
+ super.onUpdate(event);
23
+
24
+ this.clearCanvas();
25
+
26
+ this.render();
27
+ }
28
+
29
+ override onRescale(event: OnRescaleEvent): void {
30
+ super.onRescale(event);
31
+ this.setTransform(event);
32
+ this.render();
33
+ }
34
+
35
+ render(): void {
36
+ if (!this.data || !this.ctx || !this.data.image) {
37
+ return;
38
+ }
39
+ const { ctx } = this;
40
+ const { options, image } = this.data;
41
+
42
+ this.clearCanvas();
43
+
44
+ ctx.drawImage(image, options.x, options.y, options.width, options.height);
45
+ }
46
+ }
@@ -0,0 +1,129 @@
1
+ import {
2
+ line,
3
+ curveCatmullRom,
4
+ curveLinear,
5
+ curveBasis,
6
+ curveBasisClosed,
7
+ curveBundle,
8
+ curveCardinal,
9
+ curveMonotoneX,
10
+ curveMonotoneY,
11
+ curveNatural,
12
+ curveStep,
13
+ curveStepAfter,
14
+ curveStepBefore,
15
+ } from 'd3-shape';
16
+ import { SVGLayer } from './base/SVGLayer';
17
+ import { OnUpdateEvent, OnRescaleEvent } from '../interfaces';
18
+ import { LayerOptions } from '..';
19
+
20
+ const CURVE_CATMULL_ROM_ALPHA = 0.7;
21
+ const CURVE_CARDINAL_TENSION = 0.9;
22
+ const CURVE_BUNDLE_BETA = 1.0;
23
+
24
+ export interface WellborepathLayerOptions<T extends [number, number][]> extends LayerOptions<T> {
25
+ stroke: string;
26
+ strokeWidth: string;
27
+ curveType?: string;
28
+ tension?: number;
29
+ }
30
+
31
+ export class WellborepathLayer<T extends [number, number][]> extends SVGLayer<T> {
32
+ rescaleEvent: OnRescaleEvent;
33
+
34
+ constructor(id?: string, options?: WellborepathLayerOptions<T>) {
35
+ super(id, options);
36
+ this.options = {
37
+ ...this.options,
38
+ ...options,
39
+ };
40
+ this.render = this.render.bind(this);
41
+ }
42
+
43
+ override onUpdate(event: OnUpdateEvent<T>): void {
44
+ super.onUpdate(event);
45
+ this.render();
46
+ }
47
+
48
+ override onRescale(event: OnRescaleEvent): void {
49
+ super.onRescale(event);
50
+ if (!this.elm) {
51
+ return;
52
+ }
53
+ this.rescaleEvent = event;
54
+ this.render();
55
+ }
56
+
57
+ render(): void {
58
+ const { strokeWidth, stroke } = this.options as WellborepathLayerOptions<T>;
59
+
60
+ if (!this.elm) {
61
+ return;
62
+ }
63
+ this.elm.select('g').remove();
64
+
65
+ const data = this.data || (this.referenceSystem && (this.referenceSystem.projectedPath as [number, number][]));
66
+ if (!data || !this.rescaleEvent) {
67
+ return;
68
+ }
69
+
70
+ this.elm
71
+ .append('g')
72
+ .attr('class', 'well-path')
73
+ .append('path')
74
+ .attr('d', this.renderWellborePath(data))
75
+ .attr('stroke-width', strokeWidth || '2px')
76
+ .attr('stroke', stroke || 'red')
77
+ .attr('fill', 'none');
78
+ }
79
+
80
+ private renderWellborePath(data: [number, number][]): string {
81
+ const { xScale, yScale } = this.rescaleEvent;
82
+ const transformedData: [number, number][] = data.map((d) => [xScale(d[0]), yScale(d[1])]);
83
+
84
+ // TODO: Might be a good idea to move something like this to a shared function in a base class
85
+ let curveFactory;
86
+ const { curveType, tension } = this.options as WellborepathLayerOptions<T>;
87
+ switch (curveType) {
88
+ default:
89
+ case 'curveCatmullRom':
90
+ curveFactory = curveCatmullRom.alpha(tension || CURVE_CATMULL_ROM_ALPHA);
91
+ break;
92
+ case 'curveLinear':
93
+ curveFactory = curveLinear;
94
+ break;
95
+ case 'curveBasis':
96
+ curveFactory = curveBasis;
97
+ break;
98
+ case 'curveBasisClosed':
99
+ curveFactory = curveBasisClosed;
100
+ break;
101
+ case 'curveBundle':
102
+ curveFactory = curveBundle.beta(tension || CURVE_BUNDLE_BETA);
103
+ break;
104
+ case 'curveCardinal':
105
+ curveFactory = curveCardinal.tension(tension || CURVE_CARDINAL_TENSION);
106
+ break;
107
+ case 'curveMonotoneX':
108
+ curveFactory = curveMonotoneX;
109
+ break;
110
+ case 'curveMonotoneY':
111
+ curveFactory = curveMonotoneY;
112
+ break;
113
+ case 'curveNatural':
114
+ curveFactory = curveNatural;
115
+ break;
116
+ case 'curveStep':
117
+ curveFactory = curveStep;
118
+ break;
119
+ case 'curveStepAfter':
120
+ curveFactory = curveStepAfter;
121
+ break;
122
+ case 'curveStepBefore':
123
+ curveFactory = curveStepBefore;
124
+ break;
125
+ }
126
+
127
+ return line().curve(curveFactory)(transformedData);
128
+ }
129
+ }
@@ -0,0 +1,102 @@
1
+ import { Layer } from './Layer';
2
+ import { OnMountEvent, OnUpdateEvent, OnResizeEvent, OnRescaleEvent } from '../../interfaces';
3
+ import { DEFAULT_LAYER_HEIGHT, DEFAULT_LAYER_WIDTH } from '../../constants';
4
+
5
+ export abstract class CanvasLayer<T> extends Layer<T> {
6
+ ctx: CanvasRenderingContext2D;
7
+ elm: HTMLElement;
8
+ canvas: HTMLCanvasElement;
9
+
10
+ onOpacityChanged(_opacity: number): void {
11
+ if (this.canvas) {
12
+ this.updateStyle();
13
+ }
14
+ }
15
+
16
+ onOrderChanged(_order: number): void {
17
+ if (this.canvas) {
18
+ this.updateStyle();
19
+ }
20
+ }
21
+
22
+ onInteractivityChanged(_interactive: boolean): void {
23
+ if (this.canvas) {
24
+ this.updateStyle();
25
+ }
26
+ }
27
+
28
+ override setVisibility(visible: boolean): void {
29
+ super.setVisibility(visible);
30
+ if (this.canvas) {
31
+ this.updateStyle(visible);
32
+ }
33
+ }
34
+
35
+ updateStyle(visible?: boolean): void {
36
+ const isVisible = visible || this.isVisible;
37
+ const visibility = isVisible ? 'visible' : 'hidden';
38
+ const interactive = this.interactive ? 'auto' : 'none';
39
+ this.canvas.setAttribute(
40
+ 'style',
41
+ `position:absolute;pointer-events:${interactive};z-index:${this.order};opacity:${this.opacity};visibility:${visibility}`,
42
+ );
43
+ }
44
+
45
+ override onMount(event: OnMountEvent): void {
46
+ super.onMount(event);
47
+ const { elm } = event;
48
+ const width = event.width || parseInt(elm.getAttribute('width'), 10) || DEFAULT_LAYER_WIDTH;
49
+ const height = event.height || parseInt(elm.getAttribute('height'), 10) || DEFAULT_LAYER_HEIGHT;
50
+ this.elm = elm;
51
+ let canvas: HTMLCanvasElement;
52
+ if (!this.canvas) {
53
+ canvas = document.createElement('canvas');
54
+ this.canvas = canvas;
55
+ event.elm.appendChild(canvas);
56
+ }
57
+ this.canvas.setAttribute('id', `${this.id}`);
58
+ this.canvas.setAttribute('width', `${width}px`);
59
+ this.canvas.setAttribute('height', `${height}px`);
60
+ this.canvas.setAttribute('class', 'canvas-layer');
61
+ this.updateStyle();
62
+ this.ctx = this.canvas.getContext('2d');
63
+ }
64
+
65
+ override onUnmount(): void {
66
+ super.onUnmount();
67
+ this.canvas.remove();
68
+ this.canvas = null;
69
+ }
70
+
71
+ override onResize(event: OnResizeEvent): void {
72
+ const { ctx } = this;
73
+ const { width, height } = event;
74
+
75
+ ctx.canvas.setAttribute('width', `${width}px`);
76
+ ctx.canvas.setAttribute('height', `${height}px`);
77
+ }
78
+
79
+ override onUpdate(event: OnUpdateEvent<T>): void {
80
+ super.onUpdate(event);
81
+ }
82
+
83
+ resetTransform(): void {
84
+ this.ctx.resetTransform();
85
+ }
86
+
87
+ setTransform(event: OnRescaleEvent): void {
88
+ this.resetTransform();
89
+ const flippedX = event.xBounds[0] > event.xBounds[1];
90
+ const flippedY = event.yBounds[0] > event.yBounds[1];
91
+ this.ctx.translate(event.xScale(0), event.yScale(0));
92
+ this.ctx.scale(event.xRatio * (flippedX ? -1 : 1), event.yRatio * (flippedY ? -1 : 1));
93
+ }
94
+
95
+ clearCanvas(): void {
96
+ const { ctx, canvas } = this;
97
+ ctx.save();
98
+ ctx.resetTransform();
99
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
100
+ ctx.restore();
101
+ }
102
+ }
@@ -0,0 +1,70 @@
1
+ import { select, Selection } from 'd3-selection';
2
+ import { Layer } from './Layer';
3
+ import { OnMountEvent, OnResizeEvent } from '../../interfaces';
4
+ import { DEFAULT_LAYER_HEIGHT, DEFAULT_LAYER_WIDTH } from '../../constants';
5
+
6
+ export abstract class HTMLLayer<T> extends Layer<T> {
7
+ elm: Selection<HTMLElement, unknown, null, undefined>;
8
+
9
+ override onMount(event: OnMountEvent): void {
10
+ super.onMount(event);
11
+ const { elm } = event;
12
+ const width = event.width || parseInt(elm.getAttribute('width'), 10) || DEFAULT_LAYER_WIDTH;
13
+ const height = event.height || parseInt(elm.getAttribute('height'), 10) || DEFAULT_LAYER_HEIGHT;
14
+
15
+ if (!this.elm) {
16
+ this.elm = select(elm).append('div');
17
+ this.elm.attr('id', `${this.id}`);
18
+ this.elm.attr('class', 'html-layer');
19
+ }
20
+ const interactive = this.interactive ? 'auto' : 'none';
21
+ this.elm
22
+ .style('position', 'absolute')
23
+ .style('height', `${height}px`)
24
+ .style('width', `${width}px`)
25
+ .style('opacity', this.opacity)
26
+ .style('overflow', 'hidden')
27
+ .style('pointer-events', interactive)
28
+ .style('z-index', this.order);
29
+ }
30
+
31
+ override onUnmount(): void {
32
+ super.onUnmount();
33
+ this.elm.remove();
34
+ this.elm = null;
35
+ }
36
+
37
+ override onResize(event: OnResizeEvent): void {
38
+ if (!this.elm) {
39
+ return;
40
+ }
41
+ super.onResize(event);
42
+ this.elm.style('height', `${event.height}px`).style('width', `${event.width}px`);
43
+ }
44
+
45
+ override setVisibility(visible: boolean): void {
46
+ super.setVisibility(visible);
47
+ if (this.elm) {
48
+ this.elm.attr('visibility', visible ? 'visible' : 'hidden');
49
+ }
50
+ }
51
+
52
+ onOpacityChanged(opacity: number): void {
53
+ if (this.elm) {
54
+ this.elm.style('opacity', opacity);
55
+ }
56
+ }
57
+
58
+ onOrderChanged(order: number): void {
59
+ if (this.elm) {
60
+ this.elm.style('z-index', order);
61
+ }
62
+ }
63
+
64
+ onInteractivityChanged(shouldBeInteractive: boolean): void {
65
+ if (this.elm) {
66
+ const interactive = shouldBeInteractive ? 'auto' : 'none';
67
+ this.elm.style('pointer-events', interactive);
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,217 @@
1
+ import { OnMountEvent, OnUnmountEvent, OnUpdateEvent, OnRescaleEvent, OnResizeEvent } from '../../interfaces';
2
+ import { IntersectionReferenceSystem } from '../../control';
3
+
4
+ const defaultOptions = {
5
+ order: 1,
6
+ layerOpacity: 1,
7
+ interactive: false,
8
+ };
9
+
10
+ export interface LayerOptions<T> {
11
+ order?: number;
12
+ layerOpacity?: number;
13
+ referenceSystem?: IntersectionReferenceSystem;
14
+ data?: T;
15
+ interactive?: boolean;
16
+
17
+ onMount?(event: OnMountEvent, layer: Layer<T>): void;
18
+ onUnmount?(event: OnUnmountEvent, layer: Layer<T>): void;
19
+ onUpdate?(event: OnUpdateEvent<T>, layer: Layer<T>): void;
20
+ onRescale?(event: OnRescaleEvent, layer: Layer<T>): void;
21
+ onResize?(event: OnResizeEvent, layer: Layer<T>): void;
22
+ }
23
+
24
+ export abstract class Layer<T> {
25
+ private _id: string;
26
+ private _order: number;
27
+ protected _options: LayerOptions<T>;
28
+ private loading: boolean;
29
+ private _element?: HTMLElement;
30
+ private _opacity: number;
31
+ private _referenceSystem?: IntersectionReferenceSystem = null;
32
+ private _data?: T;
33
+ private _visible: boolean;
34
+ private _interactive: boolean = false;
35
+
36
+ constructor(id?: string, options?: LayerOptions<T>) {
37
+ this._id = id || `layer-${Math.floor(Math.random() * 1000)}`;
38
+ const opts = options || defaultOptions;
39
+ this._order = opts.order || 1;
40
+ this._options = {
41
+ ...opts,
42
+ };
43
+ this.loading = false;
44
+ this._element = null;
45
+ this._opacity = opts.layerOpacity || 1;
46
+ this._visible = true;
47
+ this._interactive = opts.interactive || false;
48
+
49
+ if (options && options.data) {
50
+ this.setData(options.data);
51
+ }
52
+ this._referenceSystem = options && options.referenceSystem;
53
+
54
+ this.onMount = this.onMount.bind(this);
55
+ this.onUnmount = this.onUnmount.bind(this);
56
+ this.onUpdate = this.onUpdate.bind(this);
57
+ this.onRescale = this.onRescale.bind(this);
58
+ this.onResize = this.onResize.bind(this);
59
+ this.onOrderChanged = this.onOrderChanged.bind(this);
60
+ this.onOpacityChanged = this.onOpacityChanged.bind(this);
61
+ this.setVisibility = this.setVisibility.bind(this);
62
+ }
63
+
64
+ get id(): string {
65
+ return this._id;
66
+ }
67
+
68
+ get element(): HTMLElement {
69
+ return this._element;
70
+ }
71
+
72
+ get options(): LayerOptions<T> {
73
+ return this._options;
74
+ }
75
+
76
+ set options(options: LayerOptions<T>) {
77
+ this._options = options;
78
+ }
79
+
80
+ set isLoading(loading: boolean) {
81
+ this.loading = loading;
82
+ }
83
+
84
+ get isLoading(): boolean {
85
+ return this.loading;
86
+ }
87
+
88
+ set opacity(opacity: number) {
89
+ this._opacity = opacity;
90
+ this.onOpacityChanged(opacity);
91
+ }
92
+
93
+ get opacity(): number {
94
+ return this._opacity;
95
+ }
96
+
97
+ set order(order: number) {
98
+ this._order = order;
99
+ this.onOrderChanged(order);
100
+ }
101
+
102
+ get order(): number {
103
+ return this._order;
104
+ }
105
+
106
+ set interactive(shouldBeInteractive: boolean) {
107
+ this._interactive = shouldBeInteractive;
108
+ this.onInteractivityChanged(shouldBeInteractive);
109
+ }
110
+
111
+ get interactive(): boolean {
112
+ return this._interactive;
113
+ }
114
+
115
+ get referenceSystem(): IntersectionReferenceSystem {
116
+ return this._referenceSystem;
117
+ }
118
+
119
+ set referenceSystem(referenceSystem: IntersectionReferenceSystem) {
120
+ this._referenceSystem = referenceSystem;
121
+ }
122
+
123
+ get data(): T {
124
+ return this.getData();
125
+ }
126
+
127
+ set data(data: T) {
128
+ this.setData(data);
129
+ }
130
+
131
+ get isVisible(): boolean {
132
+ return this._visible;
133
+ }
134
+
135
+ getData(): T {
136
+ return this._data;
137
+ }
138
+
139
+ setData(data: T): void {
140
+ this._data = data;
141
+ // should not be called when there is no visual element to work with
142
+ if (this.element) {
143
+ this.onUpdate({ data });
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Clears data and (optionally) the reference system
149
+ * @param includeReferenceSystem - (optional) if true also removes reference system, default is true
150
+ */
151
+ clearData(includeReferenceSystem: boolean = true): void {
152
+ this._data = null;
153
+ if (includeReferenceSystem) {
154
+ this.referenceSystem = null;
155
+ }
156
+ this.onUpdate({});
157
+ }
158
+
159
+ setVisibility(visible: boolean, _layerId?: string): void {
160
+ this._visible = visible;
161
+ }
162
+
163
+ onMount(event: OnMountEvent): void {
164
+ this._element = event.elm;
165
+ if (this._options.onMount) {
166
+ this._options.onMount(event, this);
167
+ }
168
+ }
169
+
170
+ onUnmount(event?: OnUnmountEvent): void {
171
+ if (this._options.onUnmount) {
172
+ this._options.onUnmount(event, this);
173
+ }
174
+ }
175
+
176
+ onResize(event: OnResizeEvent): void {
177
+ if (this._options.onResize) {
178
+ this._options.onResize(event, this);
179
+ }
180
+ }
181
+
182
+ onUpdate(event: OnUpdateEvent<T>): void {
183
+ if (event.data) {
184
+ this._data = event.data;
185
+ }
186
+ if (this._options.onUpdate) {
187
+ this._options.onUpdate(event, this);
188
+ }
189
+ }
190
+
191
+ onRescale(event: OnRescaleEvent): void {
192
+ this.optionsRescale(event);
193
+ }
194
+
195
+ optionsRescale(event: OnRescaleEvent): void {
196
+ if (this._options.onRescale) {
197
+ this._options.onRescale(event, this);
198
+ }
199
+ }
200
+
201
+ abstract onOpacityChanged(opacity: number): void;
202
+
203
+ abstract onOrderChanged(order: number): void;
204
+
205
+ abstract onInteractivityChanged(interactive: boolean): void;
206
+
207
+ /**
208
+ *
209
+ * Some layers might be built up of several internal layers that should individually be visibility-togglable.
210
+ * Reasons for having multiple internal layers might be tightly related data between layers or need for sharing render context
211
+ *
212
+ * @returns list of internal layer ids
213
+ */
214
+ getInternalLayerIds(): string[] {
215
+ return [];
216
+ }
217
+ }