@equinor/esv-intersection 3.0.0-beta.4 → 3.0.0-beta.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 (76) hide show
  1. package/README.md +0 -1
  2. package/dist/components/axis.d.ts +1 -1
  3. package/dist/control/ZoomPanHandler.d.ts +1 -1
  4. package/dist/datautils/picks.d.ts +6 -6
  5. package/dist/datautils/schematicShapeGenerator.d.ts +7 -8
  6. package/dist/datautils/seismicimage.d.ts +1 -1
  7. package/dist/index.esm.js +1 -1
  8. package/dist/index.js +1 -1
  9. package/dist/index.umd.js +1 -272
  10. package/dist/interfaces.d.ts +1 -1
  11. package/dist/layers/CalloutCanvasLayer.d.ts +2 -2
  12. package/dist/layers/CustomDisplayObjects/ComplexRope.d.ts +1 -1
  13. package/dist/layers/GeomodelCanvasLayer.d.ts +1 -1
  14. package/dist/layers/ImageCanvasLayer.d.ts +1 -1
  15. package/dist/layers/ReferenceLineLayer.d.ts +29 -0
  16. package/dist/layers/SchematicLayer.d.ts +10 -1
  17. package/dist/layers/SeismicCanvasLayer.d.ts +2 -3
  18. package/dist/layers/index.d.ts +1 -0
  19. package/dist/layers/schematicInterfaces.d.ts +13 -12
  20. package/dist/utils/arc-length.d.ts +1 -1
  21. package/dist/utils/root-finder.d.ts +1 -1
  22. package/package.json +38 -33
  23. package/src/components/axis.ts +247 -0
  24. package/src/components/index.ts +1 -0
  25. package/src/constants.ts +17 -0
  26. package/src/control/ExtendedCurveInterpolator.ts +155 -0
  27. package/src/control/IntersectionReferenceSystem.ts +391 -0
  28. package/src/control/LayerManager.ts +294 -0
  29. package/src/control/MainController.ts +296 -0
  30. package/src/control/ZoomPanHandler.ts +436 -0
  31. package/src/control/index.ts +5 -0
  32. package/src/control/interfaces.ts +42 -0
  33. package/src/control/overlay.ts +118 -0
  34. package/src/datautils/camelcase.ts +28 -0
  35. package/src/datautils/colortable.ts +14 -0
  36. package/src/datautils/findsample.ts +64 -0
  37. package/src/datautils/index.ts +6 -0
  38. package/src/datautils/interfaces.ts +68 -0
  39. package/src/datautils/picks.ts +328 -0
  40. package/src/datautils/schematicShapeGenerator.ts +1013 -0
  41. package/src/datautils/seismicimage.ts +180 -0
  42. package/src/datautils/surfacedata.ts +318 -0
  43. package/src/datautils/trajectory.ts +206 -0
  44. package/src/index.ts +6 -0
  45. package/src/interfaces.ts +99 -0
  46. package/src/layers/CalloutCanvasLayer.ts +338 -0
  47. package/src/layers/CustomDisplayObjects/ComplexRope.ts +45 -0
  48. package/src/layers/CustomDisplayObjects/ComplexRopeGeometry.ts +190 -0
  49. package/src/layers/CustomDisplayObjects/FixedWidthSimpleRope.ts +41 -0
  50. package/src/layers/CustomDisplayObjects/FixedWidthSimpleRopeGeometry.ts +149 -0
  51. package/src/layers/CustomDisplayObjects/UniformTextureStretchRope.ts +39 -0
  52. package/src/layers/CustomDisplayObjects/UniformTextureStretchRopeGeometry.ts +174 -0
  53. package/src/layers/GeomodelCanvasLayer.ts +176 -0
  54. package/src/layers/GeomodelLabelsLayer.ts +619 -0
  55. package/src/layers/GeomodelLayerV2.ts +110 -0
  56. package/src/layers/GridLayer.ts +145 -0
  57. package/src/layers/ImageCanvasLayer.ts +55 -0
  58. package/src/layers/ReferenceLineLayer.ts +185 -0
  59. package/src/layers/SchematicLayer.ts +896 -0
  60. package/src/layers/SeismicCanvasLayer.ts +46 -0
  61. package/src/layers/WellborePathLayer.ts +129 -0
  62. package/src/layers/base/CanvasLayer.ts +102 -0
  63. package/src/layers/base/HTMLLayer.ts +70 -0
  64. package/src/layers/base/Layer.ts +217 -0
  65. package/src/layers/base/PixiLayer.ts +190 -0
  66. package/src/layers/base/SVGLayer.ts +63 -0
  67. package/src/layers/base/index.ts +5 -0
  68. package/src/layers/index.ts +16 -0
  69. package/src/layers/schematicInterfaces.ts +470 -0
  70. package/src/utils/arc-length.ts +66 -0
  71. package/src/utils/binary-search.ts +26 -0
  72. package/src/utils/color.ts +22 -0
  73. package/src/utils/index.ts +1 -0
  74. package/src/utils/root-finder.ts +78 -0
  75. package/src/utils/text.ts +88 -0
  76. package/src/utils/vectorUtils.ts +67 -0
@@ -0,0 +1,110 @@
1
+ import { Graphics } from 'pixi.js';
2
+ import { PixiLayer } from './base/PixiLayer';
3
+ import { OnUpdateEvent, OnRescaleEvent } from '../interfaces';
4
+ import { SurfaceArea, SurfaceData, SurfaceLine } from '../datautils';
5
+ import { SURFACE_LINE_WIDTH } from '../constants';
6
+
7
+ const DEFAULT_Y_BOTTOM = 10000;
8
+
9
+ export class GeomodelLayerV2<T extends SurfaceData> extends PixiLayer<T> {
10
+ private isPreRendered: boolean = false;
11
+
12
+ onRescale(event: OnRescaleEvent): void {
13
+ super.onRescale(event);
14
+
15
+ if (!this.isPreRendered) {
16
+ this.clearLayer();
17
+ this.preRender();
18
+ }
19
+
20
+ this.render();
21
+ }
22
+
23
+ onUpdate(event: OnUpdateEvent<T>): void {
24
+ super.onUpdate(event);
25
+
26
+ this.isPreRendered = false;
27
+ this.clearLayer();
28
+ this.preRender();
29
+ this.render();
30
+ }
31
+
32
+ preRender(): void {
33
+ const { data }: { data: SurfaceData } = this;
34
+
35
+ if (!data) {
36
+ return;
37
+ }
38
+
39
+ data.areas.forEach((a: SurfaceArea) => this.generateAreaPolygon(a));
40
+ data.lines.forEach((l: SurfaceLine) => this.generateSurfaceLine(l));
41
+
42
+ this.isPreRendered = true;
43
+ }
44
+
45
+ createPolygons = (data: number[][]): number[][] => {
46
+ const polygons: number[][] = [];
47
+ let polygon: number[] = null;
48
+
49
+ // Start generating polygons
50
+ for (let i = 0; i < data.length; i++) {
51
+ // Generate top of polygon as long as we have valid values
52
+ const topIsValid = !!data[i][1];
53
+ if (topIsValid) {
54
+ if (polygon === null) {
55
+ polygon = [];
56
+ }
57
+ polygon.push(data[i][0], data[i][1]);
58
+ }
59
+
60
+ const endIsReached = i === data.length - 1;
61
+ if (!topIsValid || endIsReached) {
62
+ if (polygon) {
63
+ // Generate bottom of polygon
64
+ for (let j: number = !topIsValid ? i - 1 : i; j >= 0; j--) {
65
+ if (!data[j][1]) {
66
+ break;
67
+ }
68
+ polygon.push(data[j][0], data[j][2] || DEFAULT_Y_BOTTOM);
69
+ }
70
+ polygons.push(polygon);
71
+ polygon = null;
72
+ }
73
+ }
74
+ }
75
+ return polygons;
76
+ };
77
+
78
+ generateAreaPolygon = (s: SurfaceArea): void => {
79
+ const g = new Graphics();
80
+ g.lineStyle(1, s.color as number, 1);
81
+ g.beginFill(s.color as number);
82
+ const polygons = this.createPolygons(s.data);
83
+ polygons.forEach((polygon: number[]) => g.drawPolygon(polygon));
84
+ g.endFill();
85
+ this.addChild(g);
86
+ };
87
+
88
+ generateSurfaceLine = (s: SurfaceLine): void => {
89
+ const g = new Graphics();
90
+ const { data: d } = s;
91
+
92
+ const alignment = 0.5;
93
+ g.lineStyle(SURFACE_LINE_WIDTH, s.color as number, 1, alignment, true);
94
+
95
+ let penDown = false;
96
+ for (let i = 0; i < d.length; i++) {
97
+ if (d[i][1]) {
98
+ if (penDown) {
99
+ g.lineTo(d[i][0], d[i][1]);
100
+ } else {
101
+ g.moveTo(d[i][0], d[i][1]);
102
+ penDown = true;
103
+ }
104
+ } else {
105
+ penDown = false;
106
+ }
107
+ }
108
+ this.addChild(g);
109
+ };
110
+ }
@@ -0,0 +1,145 @@
1
+ import { CanvasLayer } from './base/CanvasLayer';
2
+ import { OnUpdateEvent, OnRescaleEvent } from '../interfaces';
3
+ import { ScaleLinear } from 'd3-scale';
4
+ import { LayerOptions } from './base/Layer';
5
+
6
+ // constants
7
+ const MINORCOLOR: string = 'lightgray';
8
+ const MAJORCOLOR: string = 'gray';
9
+ const MINORWIDTH: number = 0.25;
10
+ const MAJORWIDTH: number = 0.75;
11
+
12
+ const defaultOptions = {
13
+ minorColor: MINORCOLOR,
14
+ majorColor: MAJORCOLOR,
15
+ minorWidth: MINORWIDTH,
16
+ majorWidth: MAJORWIDTH,
17
+ };
18
+
19
+ export interface GridLayerOptions<T> extends LayerOptions<T> {
20
+ majorWidth?: number;
21
+ majorColor?: string;
22
+ minorWidth?: number;
23
+ minorColor?: string;
24
+ }
25
+
26
+ export interface OnGridLayerUpdateEvent<T> extends OnUpdateEvent<T> {
27
+ xScale?: ScaleLinear<number, number, never>;
28
+ yScale?: ScaleLinear<number, number, never>;
29
+ }
30
+
31
+ export class GridLayer<T> extends CanvasLayer<T> {
32
+ private _offsetX: number = 0;
33
+ private _offsetY: number = 0;
34
+
35
+ constructor(id?: string, options?: GridLayerOptions<T>) {
36
+ super(id, options);
37
+ this.options = {
38
+ ...this.options,
39
+ ...(options || defaultOptions),
40
+ };
41
+ this.render = this.render.bind(this);
42
+ }
43
+
44
+ onUpdate(event: OnGridLayerUpdateEvent<T>): void {
45
+ super.onUpdate(event);
46
+ this.render(event);
47
+ }
48
+
49
+ onRescale(event: OnRescaleEvent): void {
50
+ super.onRescale(event);
51
+ this.render(event);
52
+ }
53
+
54
+ render(event: OnRescaleEvent | OnGridLayerUpdateEvent<T>): void {
55
+ const { ctx } = this;
56
+ const { minorWidth, minorColor, majorWidth, majorColor } = this.options as GridLayerOptions<T>;
57
+
58
+ if (!ctx) {
59
+ return;
60
+ }
61
+
62
+ this.clearCanvas();
63
+
64
+ if (!(event.xScale || event.yScale)) {
65
+ return;
66
+ }
67
+
68
+ const xScale = event.xScale.copy();
69
+ const yScale = event.yScale.copy();
70
+
71
+ const xDomain = xScale.domain();
72
+ const yDomain = yScale.domain();
73
+
74
+ const offsetX = this.offsetX;
75
+ const offsetY = this.offsetY;
76
+
77
+ xScale.domain([xDomain[0] - offsetX, xDomain[1] - offsetX]);
78
+ yScale.domain([yDomain[0] - offsetY, yDomain[1] - offsetY]);
79
+
80
+ const [rx1, rx2] = xScale.range();
81
+ const [ry1, ry2] = yScale.range();
82
+
83
+ ctx.lineWidth = minorWidth || MINORWIDTH;
84
+ ctx.strokeStyle = minorColor || MINORCOLOR;
85
+
86
+ // minor grid lines
87
+ const xminticks = this.mapMinorTicks(xScale.ticks());
88
+ const yminticks = this.mapMinorTicks(yScale.ticks());
89
+ this.renderTicksX(xScale, xminticks, ry1, ry2);
90
+ this.renderTicksY(yScale, yminticks, rx1, rx2);
91
+
92
+ ctx.lineWidth = majorWidth || MAJORWIDTH;
93
+ ctx.strokeStyle = majorColor || MAJORCOLOR;
94
+
95
+ // major grid lines
96
+ this.renderTicksX(xScale, xScale.ticks(), ry1, ry2);
97
+ this.renderTicksY(yScale, yScale.ticks(), rx1, rx2);
98
+ ctx.restore();
99
+ }
100
+
101
+ private renderTicksX(xscale: ScaleLinear<number, number, never>, xticks: number[], ry1: number, ry2: number): void {
102
+ xticks.forEach((tx: number) => {
103
+ const x = xscale(tx);
104
+ this.ctx.beginPath();
105
+ this.ctx.moveTo(x, ry1);
106
+ this.ctx.lineTo(x, ry2);
107
+ this.ctx.stroke();
108
+ });
109
+ }
110
+
111
+ private renderTicksY(yscale: ScaleLinear<number, number, never>, yticks: number[], rx1: number, rx2: number): void {
112
+ yticks.forEach((ty: number) => {
113
+ const y = yscale(ty);
114
+ this.ctx.beginPath();
115
+ this.ctx.moveTo(rx1, y);
116
+ this.ctx.lineTo(rx2, y);
117
+ this.ctx.stroke();
118
+ });
119
+ }
120
+
121
+ private mapMinorTicks(ticks: number[]): number[] {
122
+ let xminticks: number[] = [];
123
+ if (ticks.length >= 2) {
124
+ xminticks = ticks.map((v: number) => v + (ticks[1] - ticks[0]) / 2);
125
+ xminticks.pop();
126
+ }
127
+ return xminticks;
128
+ }
129
+
130
+ get offsetX(): number {
131
+ return this._offsetX;
132
+ }
133
+
134
+ set offsetX(offset: number) {
135
+ this._offsetX = offset;
136
+ }
137
+
138
+ get offsetY(): number {
139
+ return this._offsetY;
140
+ }
141
+
142
+ set offsetY(offset: number) {
143
+ this._offsetY = offset;
144
+ }
145
+ }
@@ -0,0 +1,55 @@
1
+ import { CanvasLayer } from './base/CanvasLayer';
2
+ import { OnUpdateEvent, OnMountEvent, OnRescaleEvent } from '../interfaces';
3
+ import { ScaleLinear } from 'd3-scale';
4
+
5
+ export interface OnImageLayerUpdateEvent<T> extends OnUpdateEvent<T> {
6
+ url: string;
7
+ xScale: ScaleLinear<number, number, never>;
8
+ yScale: ScaleLinear<number, number, never>;
9
+ xRatio?: number;
10
+ yRatio?: number;
11
+ x?: number;
12
+ y?: number;
13
+ }
14
+
15
+ export type OnImageLayerRescaleEvent<T> = OnImageLayerUpdateEvent<T> & OnRescaleEvent;
16
+
17
+ export class ImageLayer<T> extends CanvasLayer<T> {
18
+ img: HTMLImageElement;
19
+
20
+ onMount(event: OnMountEvent): void {
21
+ super.onMount(event);
22
+ const img = document.createElement('img');
23
+ this.img = img;
24
+ this.isLoading = true;
25
+ }
26
+
27
+ onUpdate(event: OnImageLayerUpdateEvent<T>): void {
28
+ super.onUpdate(event);
29
+ this.img.src = event.url;
30
+ this.render(event);
31
+ }
32
+
33
+ onRescale(event: OnImageLayerRescaleEvent<T>): void {
34
+ super.onRescale(event);
35
+ this.setTransform(event);
36
+ this.render(event);
37
+ }
38
+
39
+ render(event: OnImageLayerUpdateEvent<T>): void {
40
+ const width = parseInt(this.elm.getAttribute('width'), 10);
41
+ const height = parseInt(this.elm.getAttribute('height'), 10);
42
+ const { xScale, yScale, xRatio, yRatio, x, y } = event;
43
+ const calcWidth = width * (xRatio || 1);
44
+ const calcHeight = height * (yRatio || 1);
45
+ this.clearCanvas();
46
+ if (this.isLoading) {
47
+ this.img.onload = (): void => {
48
+ this.isLoading = false;
49
+ this.ctx.drawImage(this.img, xScale(x || 0), yScale(y || 0), calcWidth, calcHeight);
50
+ };
51
+ } else {
52
+ this.ctx.drawImage(this.img, xScale(x || 0), yScale(y || 0), calcWidth, calcHeight);
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,185 @@
1
+ import { calcSize } from '../utils';
2
+ import { CanvasLayer, LayerOptions } from './base';
3
+ import { assertNever } from './schematicInterfaces';
4
+ import { OnUpdateEvent, OnRescaleEvent, OnMountEvent } from '../interfaces';
5
+ import { ScaleLinear } from 'd3-scale';
6
+
7
+ export type ReferenceLineType = 'wavy' | 'dashed' | 'solid';
8
+
9
+ export type ReferenceLine = {
10
+ text?: string;
11
+ lineType: ReferenceLineType;
12
+ color: string;
13
+ depth: number;
14
+ lineWidth?: number;
15
+ textColor?: string;
16
+ fontSize?: string;
17
+ };
18
+
19
+ export interface ReferenceLineLayerOptions extends LayerOptions<ReferenceLine[]> {}
20
+
21
+ const foldReferenceLine = <T>(
22
+ options: {
23
+ wavy: (wavy: ReferenceLine) => T;
24
+ dashed: (dashed: ReferenceLine) => T;
25
+ solid: (solid: ReferenceLine) => T;
26
+ },
27
+ refLine: ReferenceLine,
28
+ ): T => {
29
+ switch (refLine.lineType) {
30
+ case 'wavy':
31
+ return options.wavy(refLine);
32
+
33
+ case 'dashed':
34
+ return options.dashed(refLine);
35
+
36
+ case 'solid':
37
+ return options.solid(refLine);
38
+
39
+ default:
40
+ return assertNever(refLine.lineType);
41
+ }
42
+ };
43
+
44
+ export class ReferenceLineLayer extends CanvasLayer<ReferenceLine[]> {
45
+ yScale: ScaleLinear<number, number, never> | null = null;
46
+ xScale: ScaleLinear<number, number, never> | null = null;
47
+
48
+ onMount(event: OnMountEvent) {
49
+ super.onMount(event);
50
+ }
51
+
52
+ onUpdate(event: OnUpdateEvent<ReferenceLine[]>) {
53
+ super.onUpdate(event);
54
+ this.clearCanvas();
55
+ this.render();
56
+ }
57
+
58
+ onRescale(event: OnRescaleEvent) {
59
+ super.onRescale(event);
60
+ this.yScale = event.yScale;
61
+ this.xScale = event.xScale;
62
+ this.resetTransform();
63
+ this.render();
64
+ }
65
+
66
+ private drawDashed(dashed: ReferenceLine) {
67
+ const { ctx } = this;
68
+ const { canvas } = this;
69
+ const y = this.yScale(dashed.depth);
70
+ ctx.save();
71
+ ctx.strokeStyle = dashed.color;
72
+ this.setCtxLineStyle(ctx, dashed);
73
+ this.setCtxLineWidth(ctx, dashed);
74
+ ctx.beginPath();
75
+ ctx.moveTo(0, y);
76
+ ctx.lineTo(canvas.width, y);
77
+ ctx.stroke();
78
+ ctx.restore();
79
+ if (dashed.text) {
80
+ this.drawText(ctx, dashed, ctx.canvas.width, y);
81
+ }
82
+ }
83
+
84
+ private drawSolid(solid: ReferenceLine) {
85
+ const { ctx } = this;
86
+ const { canvas } = this;
87
+ const y = this.yScale(solid.depth);
88
+ ctx.save();
89
+ ctx.strokeStyle = solid.color;
90
+ this.setCtxLineStyle(ctx, solid);
91
+ this.setCtxLineWidth(ctx, solid);
92
+ ctx.beginPath();
93
+ ctx.moveTo(0, y);
94
+ ctx.lineTo(canvas.width, y);
95
+ ctx.stroke();
96
+ ctx.restore();
97
+ if (solid.text) {
98
+ this.drawText(ctx, solid, ctx.canvas.width, y);
99
+ }
100
+ }
101
+
102
+ private drawWavy(wavy: ReferenceLine): void {
103
+ const factor = 4;
104
+ const min = 2.5;
105
+ const max = 500;
106
+ const { ctx } = this;
107
+ const { canvas } = this;
108
+ const waveHeight = calcSize(factor, min, max, this.yScale);
109
+ const wavePeriod = waveHeight * 2;
110
+ const y = this.yScale(wavy.depth) - waveHeight;
111
+ const steps = Math.ceil(canvas.width / wavePeriod) + 1;
112
+ const xOffset = this.xScale(0) % wavePeriod;
113
+ ctx.save();
114
+ ctx.strokeStyle = wavy.color;
115
+ this.setCtxLineStyle(ctx, wavy);
116
+ this.setCtxLineWidth(ctx, wavy);
117
+ for (let i = -1; i < steps; i++) {
118
+ ctx.beginPath();
119
+ ctx.arc(i * wavePeriod + xOffset + waveHeight, y, waveHeight, 0, Math.PI);
120
+ ctx.stroke();
121
+ }
122
+ ctx.restore();
123
+ if (wavy.text) {
124
+ this.drawText(ctx, wavy, ctx.canvas.width, y);
125
+ }
126
+ }
127
+
128
+ private drawText(ctx: CanvasRenderingContext2D, refLine: ReferenceLine, x: number, y: number) {
129
+ const textColor = refLine.textColor || '#000';
130
+ const fontSize = refLine.fontSize || '10px sans-serif';
131
+ const textOffsetX = 10;
132
+ ctx.save();
133
+ ctx.strokeStyle = textColor;
134
+ ctx.font = fontSize;
135
+ ctx.textAlign = 'end';
136
+ ctx.textBaseline = 'bottom';
137
+ ctx.fillText(refLine.text, x - textOffsetX, y);
138
+ ctx.restore();
139
+ }
140
+
141
+ private setCtxLineStyle(ctx: CanvasRenderingContext2D, refLine: ReferenceLine): void {
142
+ const a = 8;
143
+ const b = 10;
144
+ foldReferenceLine(
145
+ {
146
+ solid: () => {
147
+ ctx.setLineDash([]);
148
+ },
149
+ dashed: () => {
150
+ ctx.setLineDash([a, b]);
151
+ },
152
+ wavy: () => {
153
+ ctx.setLineDash([]);
154
+ },
155
+ },
156
+ refLine,
157
+ );
158
+ }
159
+
160
+ private setCtxLineWidth(ctx: CanvasRenderingContext2D, refLine: ReferenceLine) {
161
+ const defaultLineWidth = 1;
162
+ ctx.lineWidth = refLine.lineWidth || defaultLineWidth;
163
+ }
164
+
165
+ private render() {
166
+ if (!this.ctx || !this.yScale || !this.xScale) {
167
+ return;
168
+ }
169
+
170
+ requestAnimationFrame(() => {
171
+ this.clearCanvas();
172
+
173
+ this.data?.forEach((refLine) => {
174
+ foldReferenceLine(
175
+ {
176
+ solid: (solid) => this.drawSolid(solid),
177
+ dashed: (dashed) => this.drawDashed(dashed),
178
+ wavy: (wavy) => this.drawWavy(wavy),
179
+ },
180
+ refLine,
181
+ );
182
+ });
183
+ });
184
+ }
185
+ }