Standard_Boolean isSeam, isLikeSeam;
- Handle(StepShape_Edge) StepEdge, StepEdge1;
Handle(StepShape_OrientedEdge) OrEdge1, OrEdge2;
Handle(StepGeom_Curve) StepCurve, StepCurve1, StepCurve2;
Handle(StepRepr_DefinitionalRepresentation) DRI, Dri1, Dri2;
for (j=1; j<=NbEdge; j++) {
OrEdge1 = EL->EdgeListValue(j);
- StepEdge = OrEdge1->EdgeElement();
- // if(j>1 && StepEdge == StepEdge1) theSame++; //gka 15.12.98
- StepEdge1 = StepEdge; //
- Handle(StepShape_EdgeCurve) EC = Handle(StepShape_EdgeCurve)::DownCast(StepEdge);
+
+ // see bug #29979: oriented edge contains another oriented edge
+ if (OrEdge1->EdgeElement()->IsKind (STANDARD_TYPE(StepShape_OrientedEdge)))
+ OrEdge1 = Handle(StepShape_OrientedEdge)::DownCast (OrEdge1->EdgeElement());
+
+ Handle(StepShape_EdgeCurve) EC = Handle(StepShape_EdgeCurve)::DownCast(OrEdge1->EdgeElement());
+ if (EC.IsNull())
+ {
+ TP->AddWarning (OrEdge1, "Edge does not contain EDGE_CURVE, skipped");
+ continue;
+ }
+
Handle(StepGeom_Curve) C = EC->EdgeGeometry();
if (!C.IsNull()) {
if (C->IsKind(STANDARD_TYPE(StepGeom_SurfaceCurve))) {
Handle(StepShape_EdgeCurve)::DownCast (OrEdge1->EdgeElement());
Handle(StepShape_EdgeCurve) EC2 =
Handle(StepShape_EdgeCurve)::DownCast (OrEdge2->EdgeElement());
+ if (EC1.IsNull() || EC2.IsNull()) // see #29979
+ {
+ continue;
+ }
Handle(StepShape_Vertex) Vs1, Vs2, Vs11, Vs22;
Vs1 = (OrEdge1->Orientation() ? EC1->EdgeEnd() : EC1->EdgeStart());
#endif
OrEdge1 = EL->EdgeListValue(j);
- StepEdge = OrEdge1->EdgeElement();
- Handle(StepShape_EdgeCurve) EC = Handle(StepShape_EdgeCurve)::DownCast(StepEdge);
+
+ // see bug #29979: oriented edge contains another oriented edge
+ if (OrEdge1->EdgeElement()->IsKind (STANDARD_TYPE(StepShape_OrientedEdge)))
+ OrEdge1 = Handle(StepShape_OrientedEdge)::DownCast (OrEdge1->EdgeElement());
+
+ Handle(StepShape_EdgeCurve) EC = Handle(StepShape_EdgeCurve)::DownCast(OrEdge1->EdgeElement());
+ if (EC.IsNull())
+ {
+ continue;
+ }
// ----------------
// Map the StepEdge
// --- or is like a seam curve ---
// --- (see CATIA cylinder) ---
// -------------------------------------------
- isLikeSeam = StepToTopoDS_GeometricTool::IsLikeSeam(SurfCurve, StepSurf, StepEdge, EL);
+ isLikeSeam = StepToTopoDS_GeometricTool::IsLikeSeam(SurfCurve, StepSurf, EC, EL);
- isSeam = StepToTopoDS_GeometricTool::IsSeamCurve(SurfCurve, StepSurf, StepEdge, EL);
+ isSeam = StepToTopoDS_GeometricTool::IsSeamCurve(SurfCurve, StepSurf, EC, EL);
if (isSeam || isLikeSeam) {
// isLikeSeam = Two faces on the same Surface
Standard_Integer forwardPC =
ShapeAnalysis_Curve().SelectForwardSeam(C2d1, C2d2);
if (forwardPC == 0) {
- TP->AddFail(StepEdge, " Seam curve not mapped");
+ TP->AddFail(EC, " Seam curve not mapped");
done = Standard_False;
myError = StepToTopoDS_TranslateEdgeLoopOther;
continue;
}
}
else {
- TP->AddFail(StepEdge, " Seam curve not mapped");
+ TP->AddFail(EC, " Seam curve not mapped");
done = Standard_False;
myError = StepToTopoDS_TranslateEdgeLoopOther;
continue;
B.UpdateEdge(E, C2d, Face, 0.);
}
else {
- TP->AddFail(StepEdge, " Edge: Trimming of 2D curve failed");
+ TP->AddFail(EC, " Edge: Trimming of 2D curve failed");
done = Standard_False;
myError = StepToTopoDS_TranslateEdgeLoopOther;
continue;
}
if (E.IsNull()) {
- TP->AddFail(StepEdge, " an Edge not mapped");
+ TP->AddFail(EC, " an Edge not mapped");
done = Standard_False;
myError = StepToTopoDS_TranslateEdgeLoopOther;
}
}
else { // The Edge is Not mapped => switch to next wire ?
- TP->AddFail(StepEdge, " an Edge not mapped");
+ TP->AddFail(EC," an Edge not mapped");
done = Standard_False;
myError = StepToTopoDS_TranslateEdgeLoopOther;
}
if (done) B.Add (W, E); // on le fait ici. Sauf si erreur rencontree ... !
else {
Handle(StepShape_Vertex) Vs1, Vs2;
- Vs1 = StepEdge->EdgeStart();
- Vs2 = StepEdge->EdgeEnd();
+ Vs1 = EC->EdgeStart();
+ Vs2 = EC->EdgeEnd();
if (!Vs1.IsNull() && !Vs2.IsNull() && Vs1==Vs2) {
done = Standard_True;
TP->AddFail(EL, " Edge with equal vertices failed, scipped");