Skip to content

Commit c6d1d4f

Browse files
authored
[Bug fix]: Several bug fixes in intersection module (#1406)
1 parent 62bcfb7 commit c6d1d4f

File tree

7 files changed

+169
-118
lines changed

7 files changed

+169
-118
lines changed

frontend/src/modules/ModuleSerializedStateMap.ts

Lines changed: 133 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -24,108 +24,137 @@ import type { SerializedSettings as WellCompletionsSettings } from "@modules/Wel
2424
import type { SerializedSettings as WellLogViewerSettings } from "@modules/WellLogViewer/settings/persistence";
2525

2626
export type ModuleSerializedStateMap = {
27-
"2DViewer": {
28-
settings?: Partial<M_2DViewerSettings>;
29-
view?: Partial<M_2DViewerView>;
30-
};
31-
"3DViewer": {
32-
settings?: Partial<M_3DViewerSettings>;
33-
view?: Partial<M_3DViewerView>;
34-
};
35-
DbgWorkbenchSpy: {
36-
settings?: never;
37-
view?: never;
38-
};
39-
DistributionPlot: {
40-
settings?: Partial<DistributionPlotSettings>;
41-
view?: never;
42-
};
43-
FlowNetwork: {
44-
settings?: Partial<FlowNetworkSettings>;
45-
view?: never;
46-
};
47-
InplaceVolumesPlot: {
48-
settings?: Partial<InplaceVolumesPlotSettings>;
49-
view?: never;
50-
};
51-
InplaceVolumesTable: {
52-
settings?: Partial<InplaceVolumesTableSettings>;
53-
view?: never;
54-
};
55-
Intersection: {
56-
settings?: Partial<IntersectionSettings>;
57-
view?: never;
58-
};
59-
Map: {
60-
settings?: never;
61-
view?: never;
62-
};
63-
MyModule: {
64-
settings?: never;
65-
view?: never;
66-
};
67-
MyModule2: {
68-
settings?: never;
69-
view?: never;
70-
};
71-
ParameterDistributions: {
72-
settings?: Partial<ParameterDistributionsSettings>;
73-
view?: never;
74-
};
75-
ParameterResponseCorrelationBarPlot: {
76-
settings?: Partial<ParameterResponseCorrelationBarPlotSettings>;
77-
view?: never;
78-
};
79-
ParameterResponseCorrelationMatrixPlot: {
80-
settings?: Partial<ParameterResponseCorrelationMatrixPlotSettings>;
81-
view?: never;
82-
};
83-
ParameterResponseCorrelationParallelCoordsPlot: {
84-
settings?: Partial<ParameterResponseCorrelationParallelCoordsPlotSettings>;
85-
view?: never;
86-
};
87-
ParameterResponseCrossPlot: {
88-
settings?: Partial<ParameterResponseCrossPlotSettings>;
89-
view?: never;
90-
};
91-
Pvt: {
92-
settings?: never;
93-
view?: never;
94-
};
95-
Rft: {
96-
settings?: never;
97-
view?: never;
98-
};
99-
SensitivityPlot: {
100-
settings?: Partial<SensitivityPlotSettings>;
101-
view?: never;
102-
};
103-
SimulationTimeSeries: {
104-
settings?: Partial<SimulationTimeSeriesSettings>;
105-
view?: Partial<SimulationTimeSeriesView>;
106-
};
107-
SimulationTimeSeriesSensitivity: {
108-
settings?: Partial<SimulationTimeSeriesSensitivitySettings>;
109-
view?: Partial<SimulationTimeSeriesSensitivityView>;
110-
};
111-
SubsurfaceMap: {
112-
settings?: never;
113-
view?: never;
114-
};
115-
TopographicMap: {
116-
settings?: never;
117-
view?: never;
118-
};
119-
Vfp: {
120-
settings?: never;
121-
view?: never;
122-
};
123-
WellCompletions: {
124-
settings?: Partial<WellCompletionsSettings>;
125-
view?: never;
126-
};
127-
WellLogViewer: {
128-
settings?: Partial<WellLogViewerSettings>;
129-
view?: never;
130-
};
27+
"2DViewer": {
28+
settings?: Partial<M_2DViewerSettings>,
29+
view?: Partial<M_2DViewerView>,
30+
},
31+
"3DViewer": {
32+
settings?: Partial<M_3DViewerSettings>,
33+
view?: Partial<M_3DViewerView>,
34+
},
35+
"3DViewerNew": {
36+
settings?: never,
37+
view?: never,
38+
},
39+
"DbgWorkbenchSpy": {
40+
settings?: never,
41+
view?: never,
42+
},
43+
"DistributionPlot": {
44+
settings?: Partial<DistributionPlotSettings>,
45+
view?: never,
46+
},
47+
"FlowNetwork": {
48+
settings?: Partial<FlowNetworkSettings>,
49+
view?: never,
50+
},
51+
"Grid3D": {
52+
settings?: never,
53+
view?: never,
54+
},
55+
"Grid3DIntersection": {
56+
settings?: never,
57+
view?: never,
58+
},
59+
"InplaceVolumesPlot": {
60+
settings?: Partial<InplaceVolumesPlotSettings>,
61+
view?: never,
62+
},
63+
"InplaceVolumesTable": {
64+
settings?: Partial<InplaceVolumesTableSettings>,
65+
view?: never,
66+
},
67+
"InplaceVolumetrics": {
68+
settings?: never,
69+
view?: never,
70+
},
71+
"Intersection": {
72+
settings?: Partial<IntersectionSettings>,
73+
view?: never,
74+
},
75+
"Map": {
76+
settings?: never,
77+
view?: never,
78+
},
79+
"MyModule": {
80+
settings?: never,
81+
view?: never,
82+
},
83+
"MyModule2": {
84+
settings?: never,
85+
view?: never,
86+
},
87+
"ParameterDistributions": {
88+
settings?: Partial<ParameterDistributionsSettings>,
89+
view?: never,
90+
},
91+
"ParameterResponseCorrelationBarPlot": {
92+
settings?: Partial<ParameterResponseCorrelationBarPlotSettings>,
93+
view?: never,
94+
},
95+
"ParameterResponseCorrelationMatrixPlot": {
96+
settings?: Partial<ParameterResponseCorrelationMatrixPlotSettings>,
97+
view?: never,
98+
},
99+
"ParameterResponseCorrelationParallelCoordsPlot": {
100+
settings?: Partial<ParameterResponseCorrelationParallelCoordsPlotSettings>,
101+
view?: never,
102+
},
103+
"ParameterResponseCrossPlot": {
104+
settings?: Partial<ParameterResponseCrossPlotSettings>,
105+
view?: never,
106+
},
107+
"Pvt": {
108+
settings?: never,
109+
view?: never,
110+
},
111+
"Rft": {
112+
settings?: never,
113+
view?: never,
114+
},
115+
"SeismicIntersection": {
116+
settings?: never,
117+
view?: never,
118+
},
119+
"SensitivityPlot": {
120+
settings?: Partial<SensitivityPlotSettings>,
121+
view?: never,
122+
},
123+
"SimulationTimeSeries": {
124+
settings?: Partial<SimulationTimeSeriesSettings>,
125+
view?: Partial<SimulationTimeSeriesView>,
126+
},
127+
"SimulationTimeSeriesMatrix": {
128+
settings?: never,
129+
view?: never,
130+
},
131+
"SimulationTimeSeriesSensitivity": {
132+
settings?: Partial<SimulationTimeSeriesSensitivitySettings>,
133+
view?: Partial<SimulationTimeSeriesSensitivityView>,
134+
},
135+
"StructuralUncertaintyIntersection": {
136+
settings?: never,
137+
view?: never,
138+
},
139+
"SubsurfaceMap": {
140+
settings?: never,
141+
view?: never,
142+
},
143+
"TimeSeriesParameterDistribution": {
144+
settings?: never,
145+
view?: never,
146+
},
147+
"Vfp": {
148+
settings?: never,
149+
view?: never,
150+
},
151+
"WellCompletions": {
152+
settings?: Partial<WellCompletionsSettings>,
153+
view?: never,
154+
},
155+
"WellLogViewer": {
156+
settings?: Partial<WellLogViewerSettings>,
157+
view?: never,
158+
},
131159
};
160+

frontend/src/modules/_shared/components/EsvIntersection/interaction/FanchartIntersectionCalculator.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ export class FanchartIntersectionCalculator implements IntersectionCalculator {
3131
const y1 = p1[1];
3232
const x2 = p2[0];
3333
const y2 = p2[1];
34+
35+
// Handle vertical line (x2 === x1) - cannot interpolate
36+
if (x2 === x1) {
37+
return y1;
38+
}
39+
3440
return y1 + ((x - x1) * (y2 - y1)) / (x2 - x1);
3541
}
3642

frontend/src/modules/_shared/components/EsvIntersection/interaction/HighlightOverlay.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,16 @@ export class HighlightOverlay {
135135
}
136136
if (item.shape === HighlightItemShape.POINTS) {
137137
for (const point of item.points) {
138-
const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
139-
circle.setAttribute("cx", xScale(point[0]).toString());
140-
circle.setAttribute("cy", yScale(point[1]).toString());
141-
circle.setAttribute("r", "5");
142-
circle.setAttribute("fill", item.color);
143-
svgLayer.appendChild(circle);
138+
try {
139+
const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
140+
circle.setAttribute("cx", xScale(point[0]).toString());
141+
circle.setAttribute("cy", yScale(point[1]).toString());
142+
circle.setAttribute("r", "5");
143+
circle.setAttribute("fill", item.color);
144+
svgLayer.appendChild(circle);
145+
} catch (error) {
146+
console.error("Error drawing highlight items:", error);
147+
}
144148
}
145149
}
146150
}

frontend/src/modules/_shared/components/EsvIntersection/interaction/LineIntersectionCalculator.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ export class LineIntersectionCalculator implements IntersectionCalculator {
155155
} {
156156
let nearestPoint = this._points[startIndex];
157157
let smallestDistance = this.calcPointDistance(nearestPoint, point);
158-
let nearestPointIndex = 0;
158+
let nearestPointIndex = startIndex;
159159

160160
if (startIndex === endIndex) {
161161
return {
@@ -164,7 +164,7 @@ export class LineIntersectionCalculator implements IntersectionCalculator {
164164
};
165165
}
166166

167-
for (let i = startIndex + 1; i < endIndex; i++) {
167+
for (let i = startIndex + 1; i <= endIndex; i++) {
168168
const distance = this.calcPointDistance(this._points[i], point);
169169
if (distance < smallestDistance) {
170170
nearestPoint = this._points[i];
@@ -182,7 +182,7 @@ export class LineIntersectionCalculator implements IntersectionCalculator {
182182

183183
if (nearestPointIndex === endIndex) {
184184
return {
185-
p1: nearestPoint,
185+
p1: this._points[endIndex - 1],
186186
p2: this._points[endIndex],
187187
};
188188
}
@@ -238,8 +238,16 @@ export class LineIntersectionCalculator implements IntersectionCalculator {
238238
const scalarProduct = p1ToPointVector[0] * p1ToP2Vector[0] + p1ToPointVector[1] * p1ToP2Vector[1];
239239

240240
const p1ToP2Length = this.calcPointDistance(lineSegment.p1, lineSegment.p2);
241+
242+
// Handle degenerate case where p1 and p2 are the same point
243+
if (p1ToP2Length === 0) {
244+
return [lineSegment.p1[0], lineSegment.p1[1]];
245+
}
246+
241247
const scalar = scalarProduct / p1ToP2Length ** 2;
242-
const result = [p1ToP2Vector[0] * scalar, p1ToP2Vector[1] * scalar];
248+
// Clamp scalar to [0, 1] to keep the result within the line segment
249+
const clampedScalar = Math.max(0, Math.min(1, scalar));
250+
const result = [p1ToP2Vector[0] * clampedScalar, p1ToP2Vector[1] * clampedScalar];
243251

244252
const resultVector = [lineSegment.p1[0] + result[0], lineSegment.p1[1] + result[1]];
245253

frontend/src/modules/_shared/components/EsvIntersection/interaction/LineSetIntersectionCalculator.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
import type { IntersectedItem, IntersectionCalculator } from "../types/types";
32
import { IntersectionItemShape } from "../types/types";
43
import { calcDistance } from "../utils/geometry";
@@ -29,6 +28,12 @@ export class LineSetIntersectionCalculator implements IntersectionCalculator {
2928
const y1 = p1[1];
3029
const x2 = p2[0];
3130
const y2 = p2[1];
31+
32+
// Handle vertical line (x2 === x1) - cannot interpolate
33+
if (x2 === x1) {
34+
return y1;
35+
}
36+
3237
return y1 + ((x - x1) * (y2 - y1)) / (x2 - x1);
3338
}
3439

frontend/src/modules/_shared/components/EsvIntersection/utils/intersectionConversion.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { Controller, Layer } from "@equinor/esv-intersection";
22

3-
43
import { FanchartIntersectionCalculator } from "../interaction/FanchartIntersectionCalculator";
54
import type { IntersectionHandlerOptions } from "../interaction/IntersectionHandler";
65
import { LineIntersectionCalculator } from "../interaction/LineIntersectionCalculator";
@@ -81,7 +80,7 @@ export function getColorFromLayerData(layer: Layer<unknown>, index: number): str
8180
}
8281

8382
if (isStatisticalFanchartsCanvasLayer(layer) && layer.data) {
84-
return layer.data.fancharts[index].color ?? "#000";
83+
return layer.data.fancharts[index]?.color ?? "#000";
8584
}
8685

8786
if (isCalloutCanvasLayer(layer) && layer.data) {

frontend/src/modules/_shared/components/EsvIntersection/utils/readoutItemUtils.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ export function esvReadoutToGenericReadout(
467467
): GenericReadoutItem {
468468
return {
469469
label: makeLabelFromLayer(readout.layer, layerIdToNameMap) ?? getLabelFromLayerData(readout),
470-
color: getColorFromLayerData(readout.layer, index),
470+
color: getColorFromLayerData(readout.layer, readout.index),
471471
info: esvReadoutToInfoItems(readout),
472472
};
473473
}

0 commit comments

Comments
 (0)