@equinor/esv-intersection 3.0.4 → 3.0.7

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 +162 -160
  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 +29 -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 +72 -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,472 @@
1
+ import { SHOE_LENGTH, SHOE_WIDTH } from '../constants';
2
+
3
+ export function assertNever(x: never): never {
4
+ throw new Error(`Unexpected object: ${JSON.stringify(x)}`);
5
+ }
6
+
7
+ /**
8
+ * The closure type of the outline
9
+ */
10
+ export type OutlineClosure = 'None' | 'TopAndBottom' | 'Top' | 'Bottom';
11
+
12
+ export interface HoleSize {
13
+ kind: 'hole';
14
+ id: string;
15
+ diameter: number;
16
+ start: number;
17
+ end: number;
18
+ }
19
+
20
+ export interface CasingWindow {
21
+ id: string;
22
+ start: number;
23
+ end: number;
24
+ }
25
+
26
+ export interface Casing {
27
+ kind: 'casing';
28
+ id: string;
29
+ diameter: number;
30
+ start: number;
31
+ end: number;
32
+ hasShoe: boolean;
33
+ innerDiameter: number;
34
+ windows?: CasingWindow[];
35
+ }
36
+
37
+ interface SymbolComponent {
38
+ id: string;
39
+ diameter: number;
40
+ start: number;
41
+ end: number;
42
+ symbolKey: string;
43
+ }
44
+
45
+ export interface PAndASymbol extends SymbolComponent {
46
+ kind: 'pAndASymbol';
47
+ }
48
+
49
+ export const isPAndASymbol = (item: PAndA): item is PAndASymbol => item.kind === 'pAndASymbol';
50
+
51
+ export interface CementSqueeze {
52
+ kind: 'cementSqueeze';
53
+ id: string;
54
+ start: number;
55
+ end: number;
56
+ /**
57
+ * Referenced Casing and Completion ids
58
+ */
59
+ referenceIds: string[];
60
+ }
61
+
62
+ export const isCementSqueeze = (item: PAndA): item is CementSqueeze => item.kind === 'cementSqueeze';
63
+
64
+ export interface CementPlug {
65
+ kind: 'cementPlug';
66
+ id: string;
67
+ start: number;
68
+ end: number;
69
+ /**
70
+ * Referenced Casing, Completion ids
71
+ */
72
+ referenceIds: string[];
73
+ }
74
+
75
+ export const isCementPlug = (item: PAndA): item is CementSqueeze => item.kind === 'cementPlug';
76
+
77
+ export type PAndA = PAndASymbol | CementSqueeze | CementPlug;
78
+
79
+ interface BaseCompletion {
80
+ id: string;
81
+ diameter: number;
82
+ start: number;
83
+ end: number;
84
+ }
85
+
86
+ export interface Screen extends BaseCompletion {
87
+ kind: 'screen';
88
+ }
89
+ export interface Tubing extends BaseCompletion {
90
+ kind: 'tubing';
91
+ }
92
+
93
+ export interface CompletionSymbol extends BaseCompletion {
94
+ kind: 'completionSymbol';
95
+ symbolKey: string;
96
+ }
97
+
98
+ export type Completion = Tubing | Screen | CompletionSymbol;
99
+
100
+ export const foldCompletion =
101
+ <T>(fScreen: (obj: Screen) => T, fTubing: (obj: Tubing) => T, fSymbol: (obj: CompletionSymbol) => T) =>
102
+ (completion: Completion): T => {
103
+ switch (completion.kind) {
104
+ case 'screen':
105
+ return fScreen(completion);
106
+ case 'tubing':
107
+ return fTubing(completion);
108
+ case 'completionSymbol':
109
+ return fSymbol(completion);
110
+ default:
111
+ return assertNever(completion);
112
+ }
113
+ };
114
+
115
+ export interface Cement {
116
+ kind: 'cement';
117
+ id: string;
118
+ /**
119
+ * Referenced Casing and Completion ids
120
+ */
121
+ referenceIds: string[];
122
+ toc: number;
123
+ }
124
+
125
+ /**
126
+ * 'Open hole' and 'Open hole screen' are not included as they are not visualized and also not included in the ruleset
127
+ */
128
+ export type PerforationSubKind =
129
+ | 'Perforation'
130
+ | 'Open hole gravel pack'
131
+ | 'Open hole frac pack'
132
+ | 'Cased hole frac pack'
133
+ | 'Cased hole gravel pack'
134
+ | 'Cased hole fracturation';
135
+
136
+ export interface Perforation {
137
+ kind: 'perforation';
138
+ subKind: PerforationSubKind;
139
+ id: string;
140
+ start: number;
141
+ end: number;
142
+ /**
143
+ * is the perforation open or sealed?
144
+ */
145
+ isOpen: boolean;
146
+ }
147
+
148
+ export const foldPerforationSubKind = <T>(
149
+ options: {
150
+ Perforation: (kind: 'Perforation') => T;
151
+ OpenHoleGravelPack: (kind: 'Open hole gravel pack') => T;
152
+ OpenHoleFracPack: (kind: 'Open hole frac pack') => T;
153
+ CasedHoleGravelPack: (kind: 'Cased hole gravel pack') => T;
154
+ CasedHoleFracPack: (kind: 'Cased hole frac pack') => T;
155
+ CasedHoleFracturation: (kind: 'Cased hole fracturation') => T;
156
+ },
157
+ subKind: PerforationSubKind,
158
+ ) => {
159
+ switch (subKind) {
160
+ case 'Perforation':
161
+ return options.Perforation(subKind);
162
+
163
+ case 'Open hole gravel pack':
164
+ return options.OpenHoleGravelPack(subKind);
165
+
166
+ case 'Open hole frac pack':
167
+ return options.OpenHoleFracPack(subKind);
168
+
169
+ case 'Cased hole fracturation':
170
+ return options.CasedHoleFracturation(subKind);
171
+
172
+ case 'Cased hole frac pack':
173
+ return options.CasedHoleFracPack(subKind);
174
+
175
+ case 'Cased hole gravel pack':
176
+ return options.CasedHoleGravelPack(subKind);
177
+
178
+ default:
179
+ return assertNever(subKind);
180
+ }
181
+ };
182
+
183
+ export const shouldPerforationStartAtHoleDiameter = (perf: Perforation) =>
184
+ foldPerforationSubKind(
185
+ {
186
+ Perforation: () => true,
187
+ OpenHoleGravelPack: () => true,
188
+ OpenHoleFracPack: () => false,
189
+ CasedHoleFracturation: () => false,
190
+ CasedHoleGravelPack: () => false,
191
+ CasedHoleFracPack: () => false,
192
+ },
193
+ perf.subKind,
194
+ );
195
+
196
+ export const shouldPerforationStartAtCasingDiameter = (perf: Perforation) =>
197
+ foldPerforationSubKind(
198
+ {
199
+ Perforation: () => false,
200
+ OpenHoleGravelPack: () => false,
201
+ OpenHoleFracPack: () => true,
202
+ CasedHoleFracturation: () => true,
203
+ CasedHoleGravelPack: () => true,
204
+ CasedHoleFracPack: () => true,
205
+ },
206
+ perf.subKind,
207
+ );
208
+
209
+ export const hasPacking = (perf: Perforation): boolean =>
210
+ foldPerforationSubKind(
211
+ {
212
+ Perforation: () => false,
213
+ OpenHoleGravelPack: () => true,
214
+ OpenHoleFracPack: () => true,
215
+ CasedHoleFracturation: () => false,
216
+ CasedHoleGravelPack: () => true,
217
+ CasedHoleFracPack: () => true,
218
+ },
219
+ perf.subKind,
220
+ );
221
+
222
+ export function hasFracLines(perf: Perforation): boolean {
223
+ return foldPerforationSubKind(
224
+ {
225
+ Perforation: () => false,
226
+ OpenHoleGravelPack: () => false,
227
+ OpenHoleFracPack: () => true,
228
+ CasedHoleFracturation: () => true,
229
+ CasedHoleGravelPack: () => false,
230
+ CasedHoleFracPack: () => true,
231
+ },
232
+ perf.subKind,
233
+ );
234
+ }
235
+
236
+ export function hasSpikes(perf: Perforation): boolean {
237
+ return foldPerforationSubKind(
238
+ {
239
+ Perforation: () => true,
240
+ OpenHoleGravelPack: () => false,
241
+ OpenHoleFracPack: () => false,
242
+ CasedHoleFracturation: () => false,
243
+ CasedHoleGravelPack: () => false,
244
+ CasedHoleFracPack: () => false,
245
+ },
246
+ perf.subKind,
247
+ );
248
+ }
249
+
250
+ export function isSubkindCasedHoleGravelPack(perf: Perforation): boolean {
251
+ return foldPerforationSubKind(
252
+ {
253
+ Perforation: () => false,
254
+ OpenHoleGravelPack: () => false,
255
+ OpenHoleFracPack: () => false,
256
+ CasedHoleFracturation: () => false,
257
+ CasedHoleGravelPack: () => true,
258
+ CasedHoleFracPack: () => false,
259
+ },
260
+ perf.subKind,
261
+ );
262
+ }
263
+
264
+ export function isSubKindPerforation(perf: Perforation): boolean {
265
+ return foldPerforationSubKind(
266
+ {
267
+ Perforation: () => true,
268
+ OpenHoleGravelPack: () => false,
269
+ OpenHoleFracPack: () => false,
270
+ CasedHoleFracturation: () => false,
271
+ CasedHoleGravelPack: () => false,
272
+ CasedHoleFracPack: () => false,
273
+ },
274
+ perf.subKind,
275
+ );
276
+ }
277
+
278
+ export function isSubKindCasedHoleFracPack(perf: Perforation): boolean {
279
+ return foldPerforationSubKind(
280
+ {
281
+ Perforation: () => false,
282
+ OpenHoleGravelPack: () => false,
283
+ OpenHoleFracPack: () => false,
284
+ CasedHoleFracturation: () => false,
285
+ CasedHoleGravelPack: () => false,
286
+ CasedHoleFracPack: () => true,
287
+ },
288
+ perf.subKind,
289
+ );
290
+ }
291
+
292
+ export function isOpenHoleFracPack(perf: Perforation) {
293
+ return foldPerforationSubKind(
294
+ {
295
+ Perforation: () => false,
296
+ OpenHoleGravelPack: () => false,
297
+ OpenHoleFracPack: () => true,
298
+ CasedHoleFracturation: () => false,
299
+ CasedHoleGravelPack: () => false,
300
+ CasedHoleFracPack: () => false,
301
+ },
302
+ perf.subKind,
303
+ );
304
+ }
305
+
306
+ export const isSubKindCasedHoleFracturation = (perf: Perforation): boolean => perf.subKind === 'Cased hole fracturation';
307
+
308
+ export const intersect = (a: Perforation, b: Perforation): boolean => {
309
+ return a.start < b.end && a.end > b.start;
310
+ };
311
+
312
+ export interface SchematicData {
313
+ holeSizes: HoleSize[];
314
+ casings: Casing[];
315
+ cements: Cement[];
316
+ completion: Completion[];
317
+ pAndA: PAndA[];
318
+ symbols: {
319
+ [key: string]: string;
320
+ };
321
+ perforations: Perforation[];
322
+ }
323
+
324
+ export interface InternalLayerOptions {
325
+ holeLayerId: string;
326
+ casingLayerId: string;
327
+ completionLayerId: string;
328
+ cementLayerId: string;
329
+ pAndALayerId: string;
330
+ perforationLayerId: string;
331
+ }
332
+
333
+ export const defaultInternalLayerOptions = (layerId: string): InternalLayerOptions => ({
334
+ holeLayerId: `${layerId}-hole`,
335
+ casingLayerId: `${layerId}-casing`,
336
+ completionLayerId: `${layerId}-completion`,
337
+ cementLayerId: `${layerId}-cement`,
338
+ pAndALayerId: `${layerId}-pAndA`,
339
+ perforationLayerId: `${layerId}-perforation`,
340
+ });
341
+
342
+ export interface HoleOptions {
343
+ firstColor: string;
344
+ secondColor: string;
345
+ lineColor: string;
346
+ }
347
+
348
+ export const defaultHoleOptions: HoleOptions = {
349
+ firstColor: '#8c541d',
350
+ secondColor: '#eee3d8',
351
+ lineColor: '#8b4513',
352
+ };
353
+
354
+ export interface CasingShoeSize {
355
+ width: number;
356
+ length: number;
357
+ }
358
+
359
+ export interface WindowOptions {
360
+ dashColor: string;
361
+ dashLength: number;
362
+ spaceLength: number;
363
+ }
364
+
365
+ export interface CasingOptions {
366
+ solidColor: string;
367
+ lineColor: string;
368
+ shoeSize: CasingShoeSize;
369
+ windowOptions: WindowOptions;
370
+ }
371
+
372
+ export const defaultCasingOptions: CasingOptions = {
373
+ solidColor: '#dcdcdc',
374
+ lineColor: '#575757',
375
+ shoeSize: {
376
+ width: SHOE_WIDTH,
377
+ length: SHOE_LENGTH,
378
+ },
379
+ windowOptions: {
380
+ dashColor: '#dc0000',
381
+ dashLength: 5,
382
+ spaceLength: 3,
383
+ },
384
+ };
385
+
386
+ export interface PerforationOptions {
387
+ stroke: string;
388
+ yellow: string;
389
+ grey: string;
390
+ red: string;
391
+ outline: string;
392
+ transparent: string;
393
+ spikeWidth: number;
394
+ spikeLength: number;
395
+ packingOpacity: number;
396
+ fracLineLength: number;
397
+ fracLineCurve: number;
398
+ scalingFactor: number;
399
+ }
400
+
401
+ export const defaultPerforationOptions: PerforationOptions = {
402
+ stroke: 'rgba(0, 0, 0, 0.25)',
403
+ yellow: '#FFFC00',
404
+ grey: 'gray',
405
+ red: '#FF5050',
406
+ outline: 'black',
407
+ transparent: 'rgba(255, 255, 255, 0)',
408
+ spikeWidth: 50,
409
+ spikeLength: 50,
410
+ packingOpacity: 0.7,
411
+ fracLineCurve: 10,
412
+ fracLineLength: 25,
413
+ scalingFactor: 25,
414
+ };
415
+
416
+ export interface CementOptions {
417
+ firstColor: string;
418
+ secondColor: string;
419
+ scalingFactor: number;
420
+ }
421
+
422
+ export const defaultCementOptions: CementOptions = {
423
+ firstColor: '#c7b9ab',
424
+ secondColor: '#5b5b5b',
425
+ scalingFactor: 4,
426
+ };
427
+
428
+ export interface CementSqueezeOptions {
429
+ firstColor: string;
430
+ secondColor: string;
431
+ scalingFactor: number;
432
+ }
433
+
434
+ export const defaultCementSqueezeOptions: CementSqueezeOptions = {
435
+ firstColor: '#8b6713',
436
+ secondColor: '#000000',
437
+ scalingFactor: 4,
438
+ };
439
+
440
+ export interface ScreenOptions {
441
+ scalingFactor: number;
442
+ lineColor: string;
443
+ }
444
+
445
+ export const defaultScreenOptions: ScreenOptions = {
446
+ scalingFactor: 4,
447
+ lineColor: '#63666a',
448
+ };
449
+
450
+ export interface TubingOptions {
451
+ innerColor: string;
452
+ outerColor: string;
453
+ scalingFactor: number;
454
+ }
455
+
456
+ export const defaultTubingOptions: TubingOptions = {
457
+ scalingFactor: 1,
458
+ innerColor: '#eeeeff',
459
+ outerColor: '#777788',
460
+ };
461
+
462
+ export interface CementPlugOptions {
463
+ firstColor: string;
464
+ secondColor: string;
465
+ scalingFactor: number;
466
+ }
467
+
468
+ export const defaultCementPlugOptions: CementPlugOptions = {
469
+ firstColor: '#c7b9ab',
470
+ secondColor: '#000000',
471
+ scalingFactor: 4,
472
+ };
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "declarationDir": "../dist",
5
+ "emitDeclarationOnly": true,
6
+ "rootDir": "."
7
+ },
8
+ "include": ["."]
9
+ }
@@ -0,0 +1,66 @@
1
+ import Vector2 from '@equinor/videx-vector2';
2
+ import { Vector } from 'curve-interpolator/dist/src/core/interfaces';
3
+
4
+ type fx = (n: number) => Vector;
5
+
6
+ /*
7
+ * Methods for calculating length of a curve
8
+ */
9
+ export class ArcLength {
10
+ /**
11
+ * Calculate using an adaptive bisect method
12
+ * @param {Number} func Curve function returning [x,y]
13
+ * @param {Number} minLimit Min limit
14
+ * @param {Number} maxLimit Max limit
15
+ * @param {Number} tolerance Result tolerance
16
+ * @param {Number} minDepth Min recursive depth before accepting solution
17
+ * @param {Number} maxDepth Max recursive depth
18
+ */
19
+ static bisect(
20
+ func: fx,
21
+ minLimit: number = 0,
22
+ maxLimit: number = 1,
23
+ tolerance: number = 0.005,
24
+ minDepth: number = 4,
25
+ maxDepth: number = 10,
26
+ ): number {
27
+ const calcRec = (a: number, b: number, aVal: number[], bVal: number[], span: number, tolerance: number, depth: number = 0): number => {
28
+ const mid = (a + b) / 2;
29
+ const midVal = func(mid) as number[];
30
+ const spanA = Vector2.distance(aVal, midVal);
31
+ const spanB = Vector2.distance(midVal, bVal);
32
+ const length = spanA + spanB;
33
+ if ((depth >= minDepth && Math.abs(length - span) < tolerance) || depth >= maxDepth) {
34
+ return length;
35
+ }
36
+ const tol = tolerance / 2;
37
+ const d = depth + 1;
38
+ return calcRec(a, mid, aVal, midVal, spanA, tol, d) + calcRec(mid, b, midVal, bVal, spanB, tol, d);
39
+ };
40
+ const aVal = func(minLimit) as number[];
41
+ const bVal = func(maxLimit) as number[];
42
+ const span = Vector2.distance(aVal, bVal);
43
+ const res = calcRec(minLimit, maxLimit, aVal, bVal, span, tolerance);
44
+ return res;
45
+ }
46
+
47
+ /**
48
+ * Calculate using trapezoid method
49
+ * @param {Number} func Curve function returning [x,y]
50
+ * @param {Number} minLimit Min limit
51
+ * @param {Number} maxLimit Max limit
52
+ * @param {Number} segments Number of segments
53
+ */
54
+ static trapezoid(func: fx, minLimit: number = 0, maxLimit: number = 1, segments: number = 1000): number {
55
+ let length = 0;
56
+ let lastPos = func(minLimit) as number[];
57
+ const step = (maxLimit - minLimit) / (segments - 1);
58
+ for (let i = 1; i < segments; i++) {
59
+ const pos = func(minLimit + i * step) as number[];
60
+ const delta = Vector2.distance(lastPos, pos);
61
+ length += delta;
62
+ lastPos = pos;
63
+ }
64
+ return length;
65
+ }
66
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Find index where value[index] =< searchValue and value[index+1] >= searchValue using binary search
3
+ * @param {Number} values Array of sorted values
4
+ * @param {Number} searchValue Value to search for
5
+ */
6
+ export class BinarySearch {
7
+ static search(values: number[], searchValue: number): number {
8
+ let il = 0;
9
+ let ih = values.length - 1;
10
+ let i = Math.floor(il + ih / 2);
11
+ while (i > il && i < ih) {
12
+ const v = values[i];
13
+ const v1 = values[i + 1];
14
+ if (v <= searchValue && v1 >= searchValue) {
15
+ return i;
16
+ }
17
+ if (searchValue < v) {
18
+ ih = i;
19
+ } else {
20
+ il = i;
21
+ }
22
+ i = Math.floor(il + ih / 2);
23
+ }
24
+ return i;
25
+ }
26
+ }
@@ -0,0 +1,22 @@
1
+ import { color, Color } from 'd3-color';
2
+
3
+ const RADIX_SIXTEEN = 16;
4
+ const HEX_STRING_LENGTH = 6;
5
+ /**
6
+ * Convert color string to number
7
+ */
8
+ export function convertColor(colorStr: string): number {
9
+ const c: Color = color(colorStr);
10
+ const d: string = c.formatHex();
11
+ const n: number = parseInt(d.replace('#', '0x'));
12
+ return n;
13
+ }
14
+
15
+ export function colorToCSSColor(color: number | string): string {
16
+ if (typeof color === 'string') {
17
+ return color;
18
+ }
19
+
20
+ const colorHexString = color.toString(RADIX_SIXTEEN);
21
+ return `#${colorHexString.padStart(HEX_STRING_LENGTH, '0')}`;
22
+ }
@@ -0,0 +1 @@
1
+ export * from './text';
@@ -0,0 +1,78 @@
1
+ import { clamp } from '@equinor/videx-math';
2
+
3
+ type fx = (n: number) => number;
4
+
5
+ /*
6
+ * Methods for finding root of a function
7
+ */
8
+ export class RootFinder {
9
+ /**
10
+ * Find root using newthons method
11
+ * @param {Number} func f(x)
12
+ * @param {Number} precision Accuracy of result
13
+ * @param {Number} maxIterations Max number of iterations to use
14
+ * @param {Number} start Starting position
15
+ * @param {Number} minLimit Min limit of result
16
+ * @param {Number} maxLimit Max limit of result
17
+ */
18
+ static newton(func: fx, precision: number = 0.01, maxIterations: number = 1000, start = 0.5, minLimit = 0, maxLimit = 1): number {
19
+ const h = 0.0001;
20
+ let t = start;
21
+ for (let i = 0; i < maxIterations; i++) {
22
+ const v = func(t);
23
+ if (Math.abs(v) < precision) {
24
+ return clamp(t, minLimit, maxLimit);
25
+ }
26
+ const d = (func(t + h) - v) / h;
27
+ t = t - v / d;
28
+ }
29
+ return null;
30
+ }
31
+
32
+ /**
33
+ * Find root using bisect method
34
+ * @param {Number} func f(x)
35
+ * @param {Number} precision Accuracy of result
36
+ * @param {Number} maxIterations Max number of iterations to use
37
+ * @param {Number} start Starting position
38
+ * @param {Number} minLimit Min limit of result
39
+ * @param {Number} maxLimit Max limit of result
40
+ */
41
+ static bisect(func: fx, precision: number = 0.01, maxIterations: number = 1000, start = 0.5, minLimit = 0, maxLimit = 1): number {
42
+ let tl = minLimit;
43
+ let th = maxLimit;
44
+ let t = start;
45
+ let v;
46
+ let i;
47
+ for (i = 0; i < maxIterations; i++) {
48
+ v = func(t);
49
+ if (Math.abs(v) < precision) {
50
+ return t;
51
+ }
52
+ if (v < 0) {
53
+ th = t;
54
+ } else {
55
+ tl = t;
56
+ }
57
+ t = (th + tl) / 2;
58
+ }
59
+ return t;
60
+ }
61
+
62
+ /**
63
+ * Find root by trying available methods
64
+ * @param {Number} func f(x)
65
+ * @param {Number} precision Accuracy of result
66
+ * @param {Number} maxIterations Max number of iterations to use
67
+ * @param {Number} start Starting position
68
+ * @param {Number} minLimit Min limit of result
69
+ * @param {Number} maxLimit Max limit of result
70
+ */
71
+ static findRoot(func: fx, precision: number = 0.01, maxIterations: number = 1000, start = 0.5, minLimit = 0, maxLimit = 1): number {
72
+ let t = RootFinder.newton(func, precision, maxIterations, start);
73
+ if (t == null) {
74
+ t = RootFinder.bisect(func, precision, maxIterations, start, minLimit, maxLimit);
75
+ }
76
+ return t;
77
+ }
78
+ }