@equinor/esv-intersection 3.1.9 → 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 +10 -10
- 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 +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +2533 -1570
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/layers/CalloutCanvasLayer.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/ComplexRope.d.ts +2 -3
- package/dist/layers/CustomDisplayObjects/ComplexRope.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/ComplexRopeGeometry.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/FixedWidthSimpleRope.d.ts +3 -4
- package/dist/layers/CustomDisplayObjects/FixedWidthSimpleRope.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.d.ts +4 -4
- package/dist/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/UniformTextureStretchRope.d.ts +3 -4
- package/dist/layers/CustomDisplayObjects/UniformTextureStretchRope.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/UniformTextureStretchRopeGeometry.d.ts +4 -4
- package/dist/layers/CustomDisplayObjects/UniformTextureStretchRopeGeometry.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 +6 -6
- 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 +7 -8
- 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 +6 -6
- package/dist/utils/vectorUtils.d.ts.map +1 -1
- package/dist/vendor/pixi-dashed-line/index.d.ts +13 -13
- package/dist/vendor/pixi-dashed-line/index.d.ts.map +1 -1
- package/package.json +4 -6
- 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 +591 -165
- 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 +11 -13
- package/src/layers/CustomDisplayObjects/ComplexRopeGeometry.ts +14 -13
- package/src/layers/CustomDisplayObjects/FixedWidthSimpleRope.ts +11 -14
- package/src/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.ts +13 -12
- package/src/layers/CustomDisplayObjects/UniformTextureStretchRope.ts +16 -17
- package/src/layers/CustomDisplayObjects/UniformTextureStretchRopeGeometry.ts +11 -11
- package/src/layers/GeomodelCanvasLayer.ts +10 -3
- package/src/layers/GeomodelLabelsLayer.ts +212 -87
- package/src/layers/GeomodelLayerV2.ts +11 -7
- 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 +533 -173
- 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 +36 -43
- 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 +27 -10
- package/src/vendor/pixi-dashed-line/index.ts +93 -39
|
@@ -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
|
|
|
@@ -34,7 +34,10 @@ export class ZoomPanHandler {
|
|
|
34
34
|
constructor(
|
|
35
35
|
elm: HTMLElement,
|
|
36
36
|
onRescale: RescaleFunction,
|
|
37
|
-
options: ZoomAndPanOptions = {
|
|
37
|
+
options: ZoomAndPanOptions = {
|
|
38
|
+
maxZoomLevel: DEFAULT_MAX_ZOOM_LEVEL,
|
|
39
|
+
minZoomLevel: DEFAULT_MIN_ZOOM_LEVEL,
|
|
40
|
+
},
|
|
38
41
|
) {
|
|
39
42
|
this.container = select(elm);
|
|
40
43
|
this.options = options;
|
|
@@ -180,7 +183,14 @@ export class ZoomPanHandler {
|
|
|
180
183
|
* Update translate extent (pan limits)
|
|
181
184
|
*/
|
|
182
185
|
updateTranslateExtent(): void {
|
|
183
|
-
const {
|
|
186
|
+
const {
|
|
187
|
+
width,
|
|
188
|
+
xSpan,
|
|
189
|
+
zFactor,
|
|
190
|
+
enableTranslateExtent,
|
|
191
|
+
translateBoundsX,
|
|
192
|
+
translateBoundsY,
|
|
193
|
+
} = this;
|
|
184
194
|
|
|
185
195
|
let x1 = -Infinity;
|
|
186
196
|
let y1 = -Infinity;
|
|
@@ -206,7 +216,19 @@ export class ZoomPanHandler {
|
|
|
206
216
|
* Create an event object from current state
|
|
207
217
|
*/
|
|
208
218
|
currentStateAsEvent(): OnRescaleEvent {
|
|
209
|
-
const {
|
|
219
|
+
const {
|
|
220
|
+
scaleX,
|
|
221
|
+
scaleY,
|
|
222
|
+
xBounds,
|
|
223
|
+
yBounds,
|
|
224
|
+
zFactor,
|
|
225
|
+
viewportRatio,
|
|
226
|
+
currentTransform,
|
|
227
|
+
xRatio,
|
|
228
|
+
yRatio,
|
|
229
|
+
width,
|
|
230
|
+
height,
|
|
231
|
+
} = this;
|
|
210
232
|
|
|
211
233
|
return {
|
|
212
234
|
xScale: scaleX.copy(),
|
|
@@ -236,7 +258,9 @@ export class ZoomPanHandler {
|
|
|
236
258
|
* Initialized handler
|
|
237
259
|
*/
|
|
238
260
|
init(): void {
|
|
239
|
-
this.zoom = zoom<HTMLElement, unknown>()
|
|
261
|
+
this.zoom = zoom<HTMLElement, unknown>()
|
|
262
|
+
.scaleExtent([this.options.minZoomLevel, this.options.maxZoomLevel])
|
|
263
|
+
.on('zoom', this.onZoom);
|
|
240
264
|
this.container.call(this.zoom);
|
|
241
265
|
}
|
|
242
266
|
|
|
@@ -287,8 +311,14 @@ export class ZoomPanHandler {
|
|
|
287
311
|
* @param duration - duration of transition
|
|
288
312
|
* @returns a merge of filter and payload
|
|
289
313
|
*/
|
|
290
|
-
setViewport(
|
|
291
|
-
|
|
314
|
+
setViewport(
|
|
315
|
+
cx?: number,
|
|
316
|
+
cy?: number,
|
|
317
|
+
displ?: number,
|
|
318
|
+
duration?: number,
|
|
319
|
+
): void {
|
|
320
|
+
const { zoom, container, calculateTransform, scaleX, scaleY, isXInverted } =
|
|
321
|
+
this;
|
|
292
322
|
|
|
293
323
|
if (cx == null || displ == null || isNaN(cx) || isNaN(displ)) {
|
|
294
324
|
const xd = scaleX.domain() as [number, number];
|
|
@@ -334,7 +364,10 @@ export class ZoomPanHandler {
|
|
|
334
364
|
/**
|
|
335
365
|
* Set bounds
|
|
336
366
|
*/
|
|
337
|
-
setTranslateBounds(
|
|
367
|
+
setTranslateBounds(
|
|
368
|
+
xBounds: [number, number],
|
|
369
|
+
yBounds: [number, number],
|
|
370
|
+
): void {
|
|
338
371
|
this.translateBoundsX = xBounds;
|
|
339
372
|
this.translateBoundsY = yBounds;
|
|
340
373
|
|
|
@@ -348,8 +381,18 @@ export class ZoomPanHandler {
|
|
|
348
381
|
adjustToSize(): void;
|
|
349
382
|
adjustToSize(autoAdjust: boolean): void;
|
|
350
383
|
adjustToSize(width: number, height: number, force: boolean): void;
|
|
351
|
-
adjustToSize(
|
|
352
|
-
|
|
384
|
+
adjustToSize(
|
|
385
|
+
widthOrAutoAdjust?: unknown,
|
|
386
|
+
height?: number,
|
|
387
|
+
force = false,
|
|
388
|
+
): void {
|
|
389
|
+
const {
|
|
390
|
+
width: oldWidth,
|
|
391
|
+
height: oldHeight,
|
|
392
|
+
scaleX,
|
|
393
|
+
scaleY,
|
|
394
|
+
recalculateZoomTransform,
|
|
395
|
+
} = this;
|
|
353
396
|
|
|
354
397
|
let w = 0;
|
|
355
398
|
let h = 0;
|
|
@@ -360,7 +403,8 @@ export class ZoomPanHandler {
|
|
|
360
403
|
} else {
|
|
361
404
|
const containerEl = this.container.node();
|
|
362
405
|
if (containerEl) {
|
|
363
|
-
const { width: containerWidth, height: containerHeight } =
|
|
406
|
+
const { width: containerWidth, height: containerHeight } =
|
|
407
|
+
containerEl.getBoundingClientRect();
|
|
364
408
|
w = containerWidth;
|
|
365
409
|
h = containerHeight;
|
|
366
410
|
}
|
|
@@ -389,7 +433,16 @@ export class ZoomPanHandler {
|
|
|
389
433
|
* @returns New transformation matrix
|
|
390
434
|
*/
|
|
391
435
|
calculateTransform(dx0: number, dx1: number, dy: number): ZoomTransform {
|
|
392
|
-
const {
|
|
436
|
+
const {
|
|
437
|
+
scaleX,
|
|
438
|
+
xSpan,
|
|
439
|
+
xBounds,
|
|
440
|
+
yBounds,
|
|
441
|
+
zFactor,
|
|
442
|
+
viewportRatio: ratio,
|
|
443
|
+
isXInverted,
|
|
444
|
+
isYInverted,
|
|
445
|
+
} = this;
|
|
393
446
|
|
|
394
447
|
const [rx1, rx2] = scaleX.range() as [number, number];
|
|
395
448
|
const displ = Math.abs(dx1 - dx0);
|
|
@@ -398,8 +451,11 @@ export class ZoomPanHandler {
|
|
|
398
451
|
|
|
399
452
|
const dy0 = dy - (isYInverted ? -displ : displ) / zFactor / ratio / 2;
|
|
400
453
|
|
|
401
|
-
const tx =
|
|
402
|
-
|
|
454
|
+
const tx =
|
|
455
|
+
(xBounds[0] - dx0) / (isXInverted ? -unitsPerPixels : unitsPerPixels);
|
|
456
|
+
const ty =
|
|
457
|
+
(yBounds[0] - dy0) /
|
|
458
|
+
((isYInverted ? -unitsPerPixels : unitsPerPixels) / zFactor);
|
|
403
459
|
|
|
404
460
|
return zoomIdentity.translate(tx, ty).scale(k);
|
|
405
461
|
}
|
|
@@ -408,7 +464,13 @@ export class ZoomPanHandler {
|
|
|
408
464
|
* Recalcualate the transform
|
|
409
465
|
*/
|
|
410
466
|
recalculateZoomTransform(): void {
|
|
411
|
-
const {
|
|
467
|
+
const {
|
|
468
|
+
scaleX,
|
|
469
|
+
scaleY,
|
|
470
|
+
container,
|
|
471
|
+
calculateTransform,
|
|
472
|
+
updateTranslateExtent,
|
|
473
|
+
} = this;
|
|
412
474
|
|
|
413
475
|
const [dx0, dx1] = scaleX.domain() as [number, number];
|
|
414
476
|
const [dy0, dy1] = scaleY.domain() as [number, number];
|
package/src/control/overlay.ts
CHANGED
|
@@ -10,11 +10,15 @@ export class Overlay<T> {
|
|
|
10
10
|
|
|
11
11
|
constructor(caller: T, container: HTMLElement) {
|
|
12
12
|
const con = select(container);
|
|
13
|
-
this.elm = con
|
|
13
|
+
this.elm = con
|
|
14
|
+
.append('div')
|
|
15
|
+
.attr('id', 'overlay')
|
|
16
|
+
.style('z-index', '11')
|
|
17
|
+
.style('position', 'absolute');
|
|
14
18
|
this.source = this.elm.node() ?? undefined;
|
|
15
19
|
|
|
16
20
|
const { elm } = this;
|
|
17
|
-
elm.on('resize',
|
|
21
|
+
elm.on('resize', event => {
|
|
18
22
|
const { width, height } = event.detail;
|
|
19
23
|
elm.style('width', `${width}px`).style('height', `${height}px`);
|
|
20
24
|
|
|
@@ -39,7 +43,7 @@ export class Overlay<T> {
|
|
|
39
43
|
});
|
|
40
44
|
});
|
|
41
45
|
|
|
42
|
-
elm.on('mousemove',
|
|
46
|
+
elm.on('mousemove', event => {
|
|
43
47
|
if (!this.enabled) {
|
|
44
48
|
return;
|
|
45
49
|
}
|
|
@@ -83,8 +87,15 @@ export class Overlay<T> {
|
|
|
83
87
|
});
|
|
84
88
|
}
|
|
85
89
|
|
|
86
|
-
create(
|
|
87
|
-
|
|
90
|
+
create(
|
|
91
|
+
key: string,
|
|
92
|
+
callbacks?: OverlayCallbacks<T>,
|
|
93
|
+
): HTMLElement | undefined {
|
|
94
|
+
const newElm = this.elm
|
|
95
|
+
.append('div')
|
|
96
|
+
.style('position', 'relative')
|
|
97
|
+
.style('pointer-events', 'none')
|
|
98
|
+
.node();
|
|
88
99
|
|
|
89
100
|
if (newElm != null) {
|
|
90
101
|
this.elements[key] = newElm;
|
|
@@ -119,4 +130,5 @@ export class Overlay<T> {
|
|
|
119
130
|
}
|
|
120
131
|
}
|
|
121
132
|
|
|
122
|
-
export const overlay = <T>(caller: T, container: HTMLElement): Overlay<T> =>
|
|
133
|
+
export const overlay = <T>(caller: T, container: HTMLElement): Overlay<T> =>
|
|
134
|
+
new Overlay<T>(caller, container);
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { scaleLinear } from 'd3-scale';
|
|
2
2
|
import { color } from 'd3-color';
|
|
3
3
|
|
|
4
|
-
export function createColorTable(
|
|
4
|
+
export function createColorTable(
|
|
5
|
+
colorMap: string[],
|
|
6
|
+
size: number,
|
|
7
|
+
): [number, number, number][] {
|
|
5
8
|
const colorDomain = colorMap.map((_v, i) => (i * size) / colorMap.length);
|
|
6
9
|
const colorScale = scaleLinear<string>().domain(colorDomain).range(colorMap);
|
|
7
10
|
|
|
8
|
-
const table = Array.from(new Array(size).keys()).map<
|
|
11
|
+
const table = Array.from(new Array(size).keys()).map<
|
|
12
|
+
[number, number, number]
|
|
13
|
+
>(i => {
|
|
9
14
|
const rgb = color(colorScale(i))?.rgb();
|
|
10
15
|
return rgb != null ? [rgb.r, rgb.g, rgb.b] : [0, 0, 0];
|
|
11
16
|
});
|
|
@@ -38,7 +38,12 @@ export function findIndexOfSample(data: number[][], pos: number): number {
|
|
|
38
38
|
for (let i = a; i < b; i++) {
|
|
39
39
|
const v1 = data[i]?.[0];
|
|
40
40
|
const v2 = data[i + 1]?.[0];
|
|
41
|
-
if (
|
|
41
|
+
if (
|
|
42
|
+
v1 != null &&
|
|
43
|
+
v2 != null &&
|
|
44
|
+
Math.min(v1, v2) <= pos &&
|
|
45
|
+
pos <= Math.max(v1, v2)
|
|
46
|
+
) {
|
|
42
47
|
index = i;
|
|
43
48
|
break;
|
|
44
49
|
}
|
|
@@ -47,7 +52,12 @@ export function findIndexOfSample(data: number[][], pos: number): number {
|
|
|
47
52
|
return index;
|
|
48
53
|
}
|
|
49
54
|
|
|
50
|
-
export function findSampleAtPos(
|
|
55
|
+
export function findSampleAtPos(
|
|
56
|
+
data: number[][],
|
|
57
|
+
pos: number,
|
|
58
|
+
topLimit = 0,
|
|
59
|
+
bottomLimit = 0,
|
|
60
|
+
): number {
|
|
51
61
|
let y = 0;
|
|
52
62
|
const index = findIndexOfSample(data, pos);
|
|
53
63
|
if (index !== -1) {
|