From: vkuzin Date: Fri, 13 Aug 2021 11:43:22 +0000 (+0300) Subject: Fixed exception when trying to calculate line and edge normal X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=029eadf7fc314601b05b2416c65930b178958149;p=occt-copy.git Fixed exception when trying to calculate line and edge normal --- diff --git a/src/HLRBRep/HLRBRep_Data.cxx b/src/HLRBRep/HLRBRep_Data.cxx index 72b0fdf316..a69882877b 100644 --- a/src/HLRBRep/HLRBRep_Data.cxx +++ b/src/HLRBRep/HLRBRep_Data.cxx @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -1545,41 +1546,44 @@ Standard_Boolean HLRBRep_Data::OrientOutLine (const Standard_Integer I, HLRBRep_ V.Transform(TI); Standard_Real curv = HLRBRep_EdgeFaceTool::CurvatureValue (iFaceGeom,pu,pv,V); - gp_Vec Nm = mySLProps.Normal(); - if (curv == 0) { + gp_Vec Nm; + if (mySLProps.IsNormalDefined()) { + Nm = mySLProps.Normal(); + if (curv == 0) { #ifdef OCCT_DEBUG - std::cout << "HLRBRep_Data::OrientOutLine " << I; - std::cout << " Edge " << myFE << " : "; - std::cout << "CurvatureValue == 0." << std::endl; + std::cout << "HLRBRep_Data::OrientOutLine " << I; + std::cout << " Edge " << myFE << " : "; + std::cout << "CurvatureValue == 0." << std::endl; #endif - } - if (curv > 0) - Nm.Reverse(); - Tg.Transform(T); - Pt.Transform(T); - Nm.Transform(T); - Nm.Cross(Tg); - if (Tg.Magnitude() < gp::Resolution()) { + } + if (curv > 0) + Nm.Reverse(); + Tg.Transform(T); + Pt.Transform(T); + Nm.Transform(T); + Nm.Cross(Tg); + if (Tg.Magnitude() < gp::Resolution()) { #ifdef OCCT_DEBUG - std::cout << "HLRBRep_Data::OrientOutLine " << I; - std::cout << " Edge " << myFE << " : "; - std::cout << "Tg.Magnitude() == 0." << std::endl; + std::cout << "HLRBRep_Data::OrientOutLine " << I; + std::cout << " Edge " << myFE << " : "; + std::cout << "Tg.Magnitude() == 0." << std::endl; #endif - } - if (myProj.Perspective()) - r = Nm.Z() * myProj.Focus() - - ( Nm.X() * Pt.X() + Nm.Y() * Pt.Y() + Nm.Z() * Pt.Z() ); - else - r = Nm.Z(); - myFEOri = (r > 0) ? TopAbs_FORWARD : TopAbs_REVERSED; - if (!FD.Cut() && FD.Closed() && FirstInversion) { - if ((eb1->Orientation(ie1) == myFEOri) != + } + if (myProj.Perspective()) + r = Nm.Z() * myProj.Focus() - + (Nm.X() * Pt.X() + Nm.Y() * Pt.Y() + Nm.Z() * Pt.Z()); + else + r = Nm.Z(); + myFEOri = (r > 0) ? TopAbs_FORWARD : TopAbs_REVERSED; + if (!FD.Cut() && FD.Closed() && FirstInversion) { + if ((eb1->Orientation(ie1) == myFEOri) != (FD.Orientation() == TopAbs_FORWARD)) { - FirstInversion = Standard_False; - inverted = Standard_True; + FirstInversion = Standard_False; + inverted = Standard_True; + } } + eb1->Orientation(ie1, myFEOri); } - eb1->Orientation(ie1,myFEOri); } else { #ifdef OCCT_DEBUG @@ -1627,19 +1631,22 @@ void HLRBRep_Data::OrientOthEdge (const Standard_Integer I, if (HLRBRep_EdgeFaceTool::UVPoint(p,myFEGeom,iFaceGeom,pu,pv)) { gp_Pnt Pt = EC.Value3D(p); mySLProps.SetParameters(pu,pv); - gp_Vec Nm = mySLProps.Normal(); - Pt.Transform(T); - Nm.Transform(T); - if (myProj.Perspective()) { - r = Nm.Z() * myProj.Focus() - - ( Nm.X() * Pt.X() + Nm.Y() * Pt.Y() + Nm.Z() * Pt.Z() ); - } - else { - r = Nm.Z(); - } - if (r < 0) { - myFEOri = TopAbs::Reverse(myFEOri); - eb1->Orientation(ie1,myFEOri); + gp_Vec Nm; + if (mySLProps.IsNormalDefined()) { + Nm = mySLProps.Normal(); + Pt.Transform(T); + Nm.Transform(T); + if (myProj.Perspective()) { + r = Nm.Z() * myProj.Focus() - + (Nm.X() * Pt.X() + Nm.Y() * Pt.Y() + Nm.Z() * Pt.Z()); + } + else { + r = Nm.Z(); + } + if (r < 0) { + myFEOri = TopAbs::Reverse(myFEOri); + eb1->Orientation(ie1, myFEOri); + } } } #ifdef OCCT_DEBUG