Skip to content

Commit 45fc54b

Browse files
committed
Enhance error handling in Geom2dGridEval classes by using std::optional for evaluation methods
1 parent 51d34fb commit 45fc54b

File tree

2 files changed

+102
-33
lines changed

2 files changed

+102
-33
lines changed

src/ModelingData/TKG2d/Geom2dGridEval/Geom2dGridEval_OffsetCurve.cxx

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ NCollection_Array1<gp_Pnt2d> Geom2dGridEval_OffsetCurve::EvaluateGrid(
4343
{
4444
const Geom2dGridEval::CurveD1& aBasis = aBasisD1.Value(i);
4545
gp_Pnt2d aP = aBasis.Point;
46-
Geom2d_OffsetCurveUtils::CalculateD0(aP, aBasis.D1, myOffset);
46+
if (!Geom2d_OffsetCurveUtils::CalculateD0(aP, aBasis.D1, myOffset))
47+
{
48+
return NCollection_Array1<gp_Pnt2d>();
49+
}
4750
aResult.SetValue(i, aP);
4851
}
4952

@@ -78,7 +81,10 @@ NCollection_Array1<Geom2dGridEval::CurveD1> Geom2dGridEval_OffsetCurve::Evaluate
7881
const Geom2dGridEval::CurveD2& aBasis = aBasisD2.Value(i);
7982
gp_Pnt2d aP = aBasis.Point;
8083
gp_Vec2d aD1 = aBasis.D1;
81-
Geom2d_OffsetCurveUtils::CalculateD1(aP, aD1, aBasis.D2, myOffset);
84+
if (!Geom2d_OffsetCurveUtils::CalculateD1(aP, aD1, aBasis.D2, myOffset))
85+
{
86+
return NCollection_Array1<Geom2dGridEval::CurveD1>();
87+
}
8288
aResult.ChangeValue(i) = {aP, aD1};
8389
}
8490

@@ -121,17 +127,23 @@ NCollection_Array1<Geom2dGridEval::CurveD2> Geom2dGridEval_OffsetCurve::Evaluate
121127
if (aD1.SquareMagnitude() <= gp::Resolution())
122128
{
123129
gp_Vec2d aDummyD4;
124-
isDirectionChange =
125-
Geom2d_OffsetCurveUtils::AdjustDerivative(*myBasis,
126-
3,
127-
theParams.Value(theParams.Lower() + i - 1),
128-
aD1,
129-
aD2,
130-
aD3,
131-
aDummyD4);
130+
if (!Geom2d_OffsetCurveUtils::AdjustDerivative(*myBasis,
131+
3,
132+
theParams.Value(theParams.Lower() + i - 1),
133+
aD1,
134+
aD2,
135+
aD3,
136+
aDummyD4,
137+
isDirectionChange))
138+
{
139+
return NCollection_Array1<Geom2dGridEval::CurveD2>();
140+
}
132141
}
133142

134-
Geom2d_OffsetCurveUtils::CalculateD2(aP, aD1, aD2, aD3, isDirectionChange, myOffset);
143+
if (!Geom2d_OffsetCurveUtils::CalculateD2(aP, aD1, aD2, aD3, isDirectionChange, myOffset))
144+
{
145+
return NCollection_Array1<Geom2dGridEval::CurveD2>();
146+
}
135147
aResult.ChangeValue(i) = {aP, aD1, aD2};
136148
}
137149

@@ -170,17 +182,34 @@ NCollection_Array1<Geom2dGridEval::CurveD3> Geom2dGridEval_OffsetCurve::Evaluate
170182
gp_Vec2d aD1 = aBasis.D1;
171183
gp_Vec2d aD2 = aBasis.D2;
172184
gp_Vec2d aD3 = aBasis.D3;
173-
gp_Vec2d aD4 = myBasis->DN(aParam, 4);
185+
std::optional<gp_Vec2d> aD4Opt = myBasis->EvalDN(aParam, 4);
186+
if (!aD4Opt)
187+
{
188+
return NCollection_Array1<Geom2dGridEval::CurveD3>();
189+
}
190+
gp_Vec2d aD4 = *aD4Opt;
174191

175192
// Check for direction change at singular points
176193
bool isDirectionChange = false;
177194
if (aD1.SquareMagnitude() <= gp::Resolution())
178195
{
179-
isDirectionChange =
180-
Geom2d_OffsetCurveUtils::AdjustDerivative(*myBasis, 4, aParam, aD1, aD2, aD3, aD4);
196+
if (!Geom2d_OffsetCurveUtils::AdjustDerivative(*myBasis,
197+
4,
198+
aParam,
199+
aD1,
200+
aD2,
201+
aD3,
202+
aD4,
203+
isDirectionChange))
204+
{
205+
return NCollection_Array1<Geom2dGridEval::CurveD3>();
206+
}
181207
}
182208

183-
Geom2d_OffsetCurveUtils::CalculateD3(aP, aD1, aD2, aD3, aD4, isDirectionChange, myOffset);
209+
if (!Geom2d_OffsetCurveUtils::CalculateD3(aP, aD1, aD2, aD3, aD4, isDirectionChange, myOffset))
210+
{
211+
return NCollection_Array1<Geom2dGridEval::CurveD3>();
212+
}
184213
aResult.ChangeValue(i) = {aP, aD1, aD2, aD3};
185214
}
186215

@@ -204,7 +233,11 @@ NCollection_Array1<gp_Vec2d> Geom2dGridEval_OffsetCurve::EvaluateGridDN(
204233
if (theN == 1)
205234
{
206235
NCollection_Array1<Geom2dGridEval::CurveD1> aD1Grid = EvaluateGridD1(theParams);
207-
NCollection_Array1<gp_Vec2d> aResult(1, aNbParams);
236+
if (aD1Grid.IsEmpty())
237+
{
238+
return NCollection_Array1<gp_Vec2d>();
239+
}
240+
NCollection_Array1<gp_Vec2d> aResult(1, aNbParams);
208241
for (int i = 1; i <= aNbParams; ++i)
209242
{
210243
aResult.SetValue(i, aD1Grid.Value(i).D1);
@@ -214,7 +247,11 @@ NCollection_Array1<gp_Vec2d> Geom2dGridEval_OffsetCurve::EvaluateGridDN(
214247
else if (theN == 2)
215248
{
216249
NCollection_Array1<Geom2dGridEval::CurveD2> aD2Grid = EvaluateGridD2(theParams);
217-
NCollection_Array1<gp_Vec2d> aResult(1, aNbParams);
250+
if (aD2Grid.IsEmpty())
251+
{
252+
return NCollection_Array1<gp_Vec2d>();
253+
}
254+
NCollection_Array1<gp_Vec2d> aResult(1, aNbParams);
218255
for (int i = 1; i <= aNbParams; ++i)
219256
{
220257
aResult.SetValue(i, aD2Grid.Value(i).D2);
@@ -224,7 +261,11 @@ NCollection_Array1<gp_Vec2d> Geom2dGridEval_OffsetCurve::EvaluateGridDN(
224261
else if (theN == 3)
225262
{
226263
NCollection_Array1<Geom2dGridEval::CurveD3> aD3Grid = EvaluateGridD3(theParams);
227-
NCollection_Array1<gp_Vec2d> aResult(1, aNbParams);
264+
if (aD3Grid.IsEmpty())
265+
{
266+
return NCollection_Array1<gp_Vec2d>();
267+
}
268+
NCollection_Array1<gp_Vec2d> aResult(1, aNbParams);
228269
for (int i = 1; i <= aNbParams; ++i)
229270
{
230271
aResult.SetValue(i, aD3Grid.Value(i).D3);

src/ModelingData/TKG2d/Geom2dGridEval/Geom2dGridEval_OtherCurve.cxx

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ NCollection_Array1<gp_Pnt2d> Geom2dGridEval_OtherCurve::EvaluateGrid(
2828

2929
for (int i = theParams.Lower(); i <= theParams.Upper(); ++i)
3030
{
31-
aResult.SetValue(i - theParams.Lower() + 1, myCurve.get().Value(theParams.Value(i)));
31+
std::optional<gp_Pnt2d> aP = myCurve.get().EvalD0(theParams.Value(i));
32+
if (!aP)
33+
{
34+
return NCollection_Array1<gp_Pnt2d>();
35+
}
36+
aResult.SetValue(i - theParams.Lower() + 1, *aP);
3237
}
3338

3439
return aResult;
@@ -49,10 +54,12 @@ NCollection_Array1<Geom2dGridEval::CurveD1> Geom2dGridEval_OtherCurve::EvaluateG
4954

5055
for (int i = theParams.Lower(); i <= theParams.Upper(); ++i)
5156
{
52-
gp_Pnt2d aPoint;
53-
gp_Vec2d aD1;
54-
myCurve.get().D1(theParams.Value(i), aPoint, aD1);
55-
aResult.ChangeValue(i - theParams.Lower() + 1) = {aPoint, aD1};
57+
std::optional<Geom2d_Curve::ResD1> aD1 = myCurve.get().EvalD1(theParams.Value(i));
58+
if (!aD1)
59+
{
60+
return NCollection_Array1<Geom2dGridEval::CurveD1>();
61+
}
62+
aResult.ChangeValue(i - theParams.Lower() + 1) = {aD1->Point, aD1->D1};
5663
}
5764

5865
return aResult;
@@ -73,10 +80,12 @@ NCollection_Array1<Geom2dGridEval::CurveD2> Geom2dGridEval_OtherCurve::EvaluateG
7380

7481
for (int i = theParams.Lower(); i <= theParams.Upper(); ++i)
7582
{
76-
gp_Pnt2d aPoint;
77-
gp_Vec2d aD1, aD2;
78-
myCurve.get().D2(theParams.Value(i), aPoint, aD1, aD2);
79-
aResult.ChangeValue(i - theParams.Lower() + 1) = {aPoint, aD1, aD2};
83+
std::optional<Geom2d_Curve::ResD2> aD2 = myCurve.get().EvalD2(theParams.Value(i));
84+
if (!aD2)
85+
{
86+
return NCollection_Array1<Geom2dGridEval::CurveD2>();
87+
}
88+
aResult.ChangeValue(i - theParams.Lower() + 1) = {aD2->Point, aD2->D1, aD2->D2};
8089
}
8190

8291
return aResult;
@@ -97,10 +106,12 @@ NCollection_Array1<Geom2dGridEval::CurveD3> Geom2dGridEval_OtherCurve::EvaluateG
97106

98107
for (int i = theParams.Lower(); i <= theParams.Upper(); ++i)
99108
{
100-
gp_Pnt2d aPoint;
101-
gp_Vec2d aD1, aD2, aD3;
102-
myCurve.get().D3(theParams.Value(i), aPoint, aD1, aD2, aD3);
103-
aResult.ChangeValue(i - theParams.Lower() + 1) = {aPoint, aD1, aD2, aD3};
109+
std::optional<Geom2d_Curve::ResD3> aD3 = myCurve.get().EvalD3(theParams.Value(i));
110+
if (!aD3)
111+
{
112+
return NCollection_Array1<Geom2dGridEval::CurveD3>();
113+
}
114+
aResult.ChangeValue(i - theParams.Lower() + 1) = {aD3->Point, aD3->D1, aD3->D2, aD3->D3};
104115
}
105116

106117
return aResult;
@@ -124,6 +135,10 @@ NCollection_Array1<gp_Vec2d> Geom2dGridEval_OtherCurve::EvaluateGridDN(
124135
if (theN == 1)
125136
{
126137
NCollection_Array1<Geom2dGridEval::CurveD1> aD1Grid = EvaluateGridD1(theParams);
138+
if (aD1Grid.IsEmpty())
139+
{
140+
return NCollection_Array1<gp_Vec2d>();
141+
}
127142
for (int i = 1; i <= aNb; ++i)
128143
{
129144
aResult.SetValue(i, aD1Grid.Value(i).D1);
@@ -132,6 +147,10 @@ NCollection_Array1<gp_Vec2d> Geom2dGridEval_OtherCurve::EvaluateGridDN(
132147
else if (theN == 2)
133148
{
134149
NCollection_Array1<Geom2dGridEval::CurveD2> aD2Grid = EvaluateGridD2(theParams);
150+
if (aD2Grid.IsEmpty())
151+
{
152+
return NCollection_Array1<gp_Vec2d>();
153+
}
135154
for (int i = 1; i <= aNb; ++i)
136155
{
137156
aResult.SetValue(i, aD2Grid.Value(i).D2);
@@ -140,17 +159,26 @@ NCollection_Array1<gp_Vec2d> Geom2dGridEval_OtherCurve::EvaluateGridDN(
140159
else if (theN == 3)
141160
{
142161
NCollection_Array1<Geom2dGridEval::CurveD3> aD3Grid = EvaluateGridD3(theParams);
162+
if (aD3Grid.IsEmpty())
163+
{
164+
return NCollection_Array1<gp_Vec2d>();
165+
}
143166
for (int i = 1; i <= aNb; ++i)
144167
{
145168
aResult.SetValue(i, aD3Grid.Value(i).D3);
146169
}
147170
}
148171
else
149172
{
150-
// For orders > 3, use adaptor DN method
173+
// For orders > 3, use adaptor EvalDN method
151174
for (int i = theParams.Lower(); i <= theParams.Upper(); ++i)
152175
{
153-
aResult.SetValue(i - theParams.Lower() + 1, myCurve.get().DN(theParams.Value(i), theN));
176+
std::optional<gp_Vec2d> aDN = myCurve.get().EvalDN(theParams.Value(i), theN);
177+
if (!aDN)
178+
{
179+
return NCollection_Array1<gp_Vec2d>();
180+
}
181+
aResult.SetValue(i - theParams.Lower() + 1, *aDN);
154182
}
155183
}
156184
return aResult;

0 commit comments

Comments
 (0)