@equinor/esv-intersection 4.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/axis.d.ts.map +1 -1
- package/dist/control/ExtendedCurveInterpolator.d.ts.map +1 -1
- package/dist/control/IntersectionReferenceSystem.d.ts.map +1 -1
- package/dist/control/LayerManager.d.ts.map +1 -1
- package/dist/control/MainController.d.ts.map +1 -1
- package/dist/control/ZoomPanHandler.d.ts.map +1 -1
- package/dist/control/overlay.d.ts.map +1 -1
- package/dist/datautils/colortable.d.ts.map +1 -1
- package/dist/datautils/findsample.d.ts.map +1 -1
- package/dist/datautils/picks.d.ts.map +1 -1
- package/dist/datautils/schematicShapeGenerator.d.ts +5 -5
- package/dist/datautils/schematicShapeGenerator.d.ts.map +1 -1
- package/dist/datautils/seismicimage.d.ts.map +1 -1
- package/dist/datautils/surfacedata.d.ts.map +1 -1
- package/dist/datautils/trajectory.d.ts.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1240 -282
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/layers/CalloutCanvasLayer.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/ComplexRope.d.ts.map +1 -1
- package/dist/layers/CustomDisplayObjects/UniformTextureStretchRope.d.ts.map +1 -1
- package/dist/layers/GeomodelCanvasLayer.d.ts.map +1 -1
- package/dist/layers/GeomodelLabelsLayer.d.ts.map +1 -1
- package/dist/layers/GeomodelLayerV2.d.ts.map +1 -1
- package/dist/layers/GridLayer.d.ts.map +1 -1
- package/dist/layers/ImageCanvasLayer.d.ts.map +1 -1
- package/dist/layers/ReferenceLineLayer.d.ts.map +1 -1
- package/dist/layers/SchematicLayer.d.ts.map +1 -1
- package/dist/layers/WellborePathLayer.d.ts.map +1 -1
- package/dist/layers/base/CanvasLayer.d.ts.map +1 -1
- package/dist/layers/base/HTMLLayer.d.ts.map +1 -1
- package/dist/layers/base/Layer.d.ts.map +1 -1
- package/dist/layers/base/PixiLayer.d.ts.map +1 -1
- package/dist/layers/base/SVGLayer.d.ts.map +1 -1
- package/dist/layers/schematicInterfaces.d.ts.map +1 -1
- package/dist/utils/arc-length.d.ts.map +1 -1
- package/dist/utils/root-finder.d.ts.map +1 -1
- package/dist/utils/text.d.ts.map +1 -1
- package/dist/utils/vectorUtils.d.ts.map +1 -1
- package/dist/vendor/pixi-dashed-line/index.d.ts.map +1 -1
- package/package.json +2 -4
- package/src/components/axis.ts +40 -10
- package/src/control/ExtendedCurveInterpolator.ts +47 -9
- package/src/control/IntersectionReferenceSystem.ts +110 -30
- package/src/control/LayerManager.ts +76 -24
- package/src/control/MainController.ts +37 -8
- package/src/control/ZoomPanHandler.ts +76 -14
- package/src/control/overlay.ts +18 -6
- package/src/datautils/colortable.ts +7 -2
- package/src/datautils/findsample.ts +12 -2
- package/src/datautils/picks.ts +66 -18
- package/src/datautils/schematicShapeGenerator.ts +570 -146
- package/src/datautils/seismicimage.ts +36 -10
- package/src/datautils/surfacedata.ts +119 -40
- package/src/datautils/trajectory.ts +56 -17
- package/src/layers/CalloutCanvasLayer.ts +129 -26
- package/src/layers/CustomDisplayObjects/ComplexRope.ts +2 -1
- package/src/layers/CustomDisplayObjects/ComplexRopeGeometry.ts +5 -5
- package/src/layers/CustomDisplayObjects/UniformTextureStretchRope.ts +6 -2
- package/src/layers/GeomodelCanvasLayer.ts +10 -3
- package/src/layers/GeomodelLabelsLayer.ts +212 -87
- package/src/layers/GeomodelLayerV2.ts +8 -3
- package/src/layers/GridLayer.ts +14 -3
- package/src/layers/ImageCanvasLayer.ts +17 -3
- package/src/layers/ReferenceLineLayer.ts +31 -9
- package/src/layers/SchematicLayer.ts +499 -150
- package/src/layers/WellborePathLayer.ts +22 -7
- package/src/layers/base/CanvasLayer.ts +18 -4
- package/src/layers/base/HTMLLayer.ts +11 -3
- package/src/layers/base/Layer.ts +10 -2
- package/src/layers/base/PixiLayer.ts +27 -7
- package/src/layers/base/SVGLayer.ts +13 -3
- package/src/layers/schematicInterfaces.ts +16 -6
- package/src/utils/arc-length.ts +31 -5
- package/src/utils/root-finder.ts +32 -4
- package/src/utils/text.ts +34 -7
- package/src/utils/vectorUtils.ts +23 -6
- package/src/vendor/pixi-dashed-line/index.ts +66 -13
|
@@ -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) {
|
package/src/datautils/picks.ts
CHANGED
|
@@ -87,24 +87,43 @@ function getEntryPicks(formationPicks: PairedPickAndUnit[]): Annotation[] {
|
|
|
87
87
|
.map((p: PairedPickAndUnit) => mapPick(p.entryPick, 'strat-picks'));
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
function getFilteredExitPicks(
|
|
90
|
+
function getFilteredExitPicks(
|
|
91
|
+
formationPicks: PairedPickAndUnit[],
|
|
92
|
+
): Annotation[] {
|
|
91
93
|
if (!formationPicks) {
|
|
92
94
|
return [];
|
|
93
95
|
}
|
|
94
96
|
|
|
95
97
|
return (
|
|
96
98
|
formationPicks
|
|
97
|
-
.filter(
|
|
99
|
+
.filter(
|
|
100
|
+
(d: PairedPickAndUnit) =>
|
|
101
|
+
formationPicks.findIndex(
|
|
102
|
+
(p: PairedPickAndUnit) =>
|
|
103
|
+
Math.abs(p.entryPick.md - d.exitPick.md) < 0.5,
|
|
104
|
+
) === -1,
|
|
105
|
+
)
|
|
98
106
|
.map((p: PairedPickAndUnit) => mapPick(p.exitPick, 'strat-picks'))
|
|
99
107
|
// Remove duplicates from unitpicks filling in gaps in formation
|
|
100
|
-
.filter(
|
|
108
|
+
.filter(
|
|
109
|
+
(obj: Annotation, i: number, array: Annotation[]) =>
|
|
110
|
+
i ===
|
|
111
|
+
array.findIndex(
|
|
112
|
+
(v: Annotation) => v.title === obj.title && v.md === obj.md,
|
|
113
|
+
),
|
|
114
|
+
)
|
|
101
115
|
);
|
|
102
116
|
}
|
|
103
117
|
|
|
104
|
-
export const getPicksData = (picksData: {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
118
|
+
export const getPicksData = (picksData: {
|
|
119
|
+
unitPicks: PairedPickAndUnit[];
|
|
120
|
+
nonUnitPicks: PickWithId[];
|
|
121
|
+
}): Annotation[] =>
|
|
122
|
+
[
|
|
123
|
+
...getReferencePicks(picksData.nonUnitPicks),
|
|
124
|
+
...getEntryPicks(picksData.unitPicks),
|
|
125
|
+
...getFilteredExitPicks(picksData.unitPicks),
|
|
126
|
+
].sort((a, b) => a.md! - b.md!);
|
|
108
127
|
|
|
109
128
|
/**
|
|
110
129
|
* @param {Unit} u
|
|
@@ -134,7 +153,11 @@ const unitDto = (u: Unit): UnitDto => ({
|
|
|
134
153
|
* @param {number} arr.from
|
|
135
154
|
* @returns {[number, number][]}
|
|
136
155
|
*/
|
|
137
|
-
function findGaps(
|
|
156
|
+
function findGaps(
|
|
157
|
+
from: number,
|
|
158
|
+
to: number,
|
|
159
|
+
arr: { from: number; to: number; itm: PairedPickAndUnit }[],
|
|
160
|
+
): [number, number][] {
|
|
138
161
|
if (arr.length === 0) {
|
|
139
162
|
return [[from, to]];
|
|
140
163
|
}
|
|
@@ -166,12 +189,20 @@ const transformStratColumn = (units: Unit[]): UnitDto[] => units.map(unitDto);
|
|
|
166
189
|
* @param {Pick[]} picks picks
|
|
167
190
|
* @param {Unit[]} stratColumn strat column
|
|
168
191
|
*/
|
|
169
|
-
function joinPicksAndStratColumn(
|
|
192
|
+
function joinPicksAndStratColumn(
|
|
193
|
+
picks: Pick[],
|
|
194
|
+
stratColumn: Unit[],
|
|
195
|
+
): { joined: PickAndUnit[]; nonUnitPicks: PickWithId[] } {
|
|
170
196
|
const transformed = transformStratColumn(stratColumn);
|
|
171
197
|
const nonUnitPicks: PickWithId[] = [];
|
|
172
198
|
const joined: PickAndUnit[] = [];
|
|
173
199
|
picks.forEach((p: Pick) => {
|
|
174
|
-
const matches = transformed.filter(
|
|
200
|
+
const matches = transformed.filter(
|
|
201
|
+
(u: UnitDto) =>
|
|
202
|
+
p.pickIdentifier?.search(
|
|
203
|
+
new RegExp(`(${u.topSurface}|${u.baseSurface})`, 'i'),
|
|
204
|
+
) !== -1,
|
|
205
|
+
);
|
|
175
206
|
if (matches.length > 0) {
|
|
176
207
|
matches.forEach((u: UnitDto) =>
|
|
177
208
|
joined.push({
|
|
@@ -203,7 +234,12 @@ function pairJoinedPicks(joined: PickAndUnit[]): PairedPickAndUnit[] {
|
|
|
203
234
|
|
|
204
235
|
const sorted = joined
|
|
205
236
|
.filter((d: PickAndUnit) => d.level)
|
|
206
|
-
.sort(
|
|
237
|
+
.sort(
|
|
238
|
+
(a: PickAndUnit, b: PickAndUnit) =>
|
|
239
|
+
a.unitName.localeCompare(b.unitName) ||
|
|
240
|
+
a.md - b.md ||
|
|
241
|
+
a.ageTop - b.ageTop,
|
|
242
|
+
);
|
|
207
243
|
|
|
208
244
|
while (sorted.length > 0) {
|
|
209
245
|
current = sorted.shift()!;
|
|
@@ -225,7 +261,9 @@ function pairJoinedPicks(joined: PickAndUnit[]): PairedPickAndUnit[] {
|
|
|
225
261
|
let top: PickAndUnit | undefined;
|
|
226
262
|
let base: PickAndUnit | undefined;
|
|
227
263
|
|
|
228
|
-
const pairWith = sorted.find(
|
|
264
|
+
const pairWith = sorted.find(
|
|
265
|
+
(p: PickAndUnit) => p.identifier === pairWithName,
|
|
266
|
+
);
|
|
229
267
|
if (!pairWith) {
|
|
230
268
|
console.warn(`Unable to find ${pairWithName} pick for ${name}`);
|
|
231
269
|
if (isTop) {
|
|
@@ -237,7 +275,9 @@ function pairJoinedPicks(joined: PickAndUnit[]): PairedPickAndUnit[] {
|
|
|
237
275
|
if (base) {
|
|
238
276
|
console.warn(`Using ${base.identifier} as base for ${name}`);
|
|
239
277
|
} else {
|
|
240
|
-
console.warn(
|
|
278
|
+
console.warn(
|
|
279
|
+
`Unable to find a base pick for ${name} pick at ${top.md}, ignored`,
|
|
280
|
+
);
|
|
241
281
|
continue;
|
|
242
282
|
}
|
|
243
283
|
} else if (isBase) {
|
|
@@ -249,7 +289,9 @@ function pairJoinedPicks(joined: PickAndUnit[]): PairedPickAndUnit[] {
|
|
|
249
289
|
if (top) {
|
|
250
290
|
console.warn(`Using ${top.identifier} as top for ${name}`);
|
|
251
291
|
} else {
|
|
252
|
-
console.warn(
|
|
292
|
+
console.warn(
|
|
293
|
+
`Unable to find a top pick for ${name} pick at ${base.md}, ignored`,
|
|
294
|
+
);
|
|
253
295
|
continue;
|
|
254
296
|
}
|
|
255
297
|
} else {
|
|
@@ -290,7 +332,10 @@ function pairJoinedPicks(joined: PickAndUnit[]): PairedPickAndUnit[] {
|
|
|
290
332
|
* @param {Pick[]} picks picks
|
|
291
333
|
* @param {Unit[]} stratColumn strat column
|
|
292
334
|
*/
|
|
293
|
-
export function transformFormationData(
|
|
335
|
+
export function transformFormationData(
|
|
336
|
+
picks: Pick[],
|
|
337
|
+
stratColumn: Unit[],
|
|
338
|
+
): { unitPicks: PairedPickAndUnit[]; nonUnitPicks: PickWithId[] } {
|
|
294
339
|
const { joined, nonUnitPicks } = joinPicksAndStratColumn(picks, stratColumn);
|
|
295
340
|
const pairs = pairJoinedPicks(joined);
|
|
296
341
|
|
|
@@ -305,7 +350,10 @@ export function transformFormationData(picks: Pick[], stratColumn: Unit[]): { un
|
|
|
305
350
|
while (itemstack.length > 0) {
|
|
306
351
|
const first = itemstack.pop()!;
|
|
307
352
|
const group: PairedPickAndUnit[] = [];
|
|
308
|
-
while (
|
|
353
|
+
while (
|
|
354
|
+
itemstack.length > 0 &&
|
|
355
|
+
itemstack[itemstack.length - 1]?.level! > first.level
|
|
356
|
+
) {
|
|
309
357
|
group.push(itemstack.pop()!);
|
|
310
358
|
}
|
|
311
359
|
group.reverse();
|
|
@@ -313,11 +361,11 @@ export function transformFormationData(picks: Pick[], stratColumn: Unit[]): { un
|
|
|
313
361
|
const arr: { from: number; to: number; itm: PairedPickAndUnit }[] = [];
|
|
314
362
|
group.forEach((itm: PairedPickAndUnit) => {
|
|
315
363
|
const gaps = findGaps(itm.mdEntry, itm.mdExit, arr);
|
|
316
|
-
arr.push(...gaps.map(
|
|
364
|
+
arr.push(...gaps.map(g => ({ from: g[0], to: g[1], itm })));
|
|
317
365
|
});
|
|
318
366
|
arr.sort((a, b) => a.from - b.from);
|
|
319
367
|
unitPicks.push(
|
|
320
|
-
...arr.map(
|
|
368
|
+
...arr.map(d => ({
|
|
321
369
|
from: d.from,
|
|
322
370
|
to: d.to,
|
|
323
371
|
...d.itm,
|