0030146: Visualization - exception during attempt to display Edge without geometry
authorkgv <kgv@opencascade.com>
Thu, 20 Sep 2018 08:40:19 +0000 (11:40 +0300)
committerbugmaster <bugmaster@opencascade.com>
Sat, 22 Sep 2018 14:48:53 +0000 (17:48 +0300)
StdPrs_ToolRFace no skips curves with NULL curves.
Code has been cleaned up from duplicated checks, redundant casts
and dummy Adaptor2d_Curve2dPtr typedef.

StdSelect_BRepSelectionTool::GetSensitiveForFace() now catches
Standard_NullObject exception to skip invalid Edges.

17 files changed:
src/Adaptor2d/Adaptor2d_Curve2dPtr.hxx [deleted file]
src/Adaptor2d/FILES
src/BRepAdaptor/BRepAdaptor_Curve.cxx
src/BRepAdaptor/BRepAdaptor_Curve.hxx
src/Geom2dAdaptor/Geom2dAdaptor_Curve.cxx
src/Geom2dAdaptor/Geom2dAdaptor_Curve.hxx
src/GeomAdaptor/GeomAdaptor_Curve.cxx
src/GeomAdaptor/GeomAdaptor_Curve.hxx
src/StdPrs/StdPrs_Isolines.cxx
src/StdPrs/StdPrs_ToolRFace.cxx
src/StdPrs/StdPrs_ToolRFace.hxx
src/StdPrs/StdPrs_WFDeflectionRestrictedFace.cxx
src/StdPrs/StdPrs_WFRestrictedFace.cxx
src/StdSelect/StdSelect_BRepSelectionTool.cxx
src/VrmlConverter/VrmlConverter_WFDeflectionRestrictedFace.cxx
src/VrmlConverter/VrmlConverter_WFRestrictedFace.cxx
tests/bugs/vis/bug30146 [new file with mode: 0644]

diff --git a/src/Adaptor2d/Adaptor2d_Curve2dPtr.hxx b/src/Adaptor2d/Adaptor2d_Curve2dPtr.hxx
deleted file mode 100644 (file)
index 1c781d4..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Created on: 1992-10-08
-// Created by: Isabelle GRIGNON
-// Copyright (c) 1992-1999 Matra Datavision
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#ifndef _Adaptor2d_Curve2dPtr_HeaderFile
-#define _Adaptor2d_Curve2dPtr_HeaderFile
-
-class Adaptor2d_Curve2d;
-typedef Adaptor2d_Curve2d* Adaptor2d_Curve2dPtr;
-
-#endif // _Adaptor2d_Curve2dPtr_HeaderFile
index c202b55..7096ea2 100644 (file)
@@ -1,6 +1,5 @@
 Adaptor2d_Curve2d.cxx
 Adaptor2d_Curve2d.hxx
-Adaptor2d_Curve2dPtr.hxx
 Adaptor2d_GenHCurve2d.gxx
 Adaptor2d_GenHCurve2d.lxx
 Adaptor2d_HCurve2d.cxx
index 4960d8d..4b75698 100644 (file)
@@ -75,6 +75,18 @@ BRepAdaptor_Curve::BRepAdaptor_Curve(const TopoDS_Edge& E,
 }
 
 //=======================================================================
+//function : Reset
+//purpose  :
+//=======================================================================
+void BRepAdaptor_Curve::Reset()
+{
+  myCurve.Reset();
+  myConSurf.Nullify();
+  myEdge.Nullify();
+  myTrsf = gp_Trsf();
+}
+
+//=======================================================================
 //function : Initialize
 //purpose  : 
 //=======================================================================
index 96a87a7..640505d 100644 (file)
@@ -86,7 +86,10 @@ public:
   //! is  raised if  the edge does  not have a pcurve on
   //! the face.
   Standard_EXPORT BRepAdaptor_Curve(const TopoDS_Edge& E, const TopoDS_Face& F);
-  
+
+  //! Reset currently loaded curve (undone Load()).
+  Standard_EXPORT void Reset();
+
   //! Sets  the Curve <me>  to acces to the  geometry of
   //! edge <E>.
   Standard_EXPORT void Initialize (const TopoDS_Edge& E);
index ad98572..63bb442 100644 (file)
@@ -168,6 +168,19 @@ Geom2dAdaptor_Curve::Geom2dAdaptor_Curve(const Handle(Geom2d_Curve)& theCrv,
   Load(theCrv, theUFirst, theULast);
 }
 
+//=======================================================================
+//function : Reset
+//purpose  :
+//=======================================================================
+void Geom2dAdaptor_Curve::Reset()
+{
+  myTypeCurve = GeomAbs_OtherCurve;
+  myCurve.Nullify();
+  myCurveCache.Nullify();
+  myNestedEvaluator.Nullify();
+  myBSplineCurve.Nullify();
+  myFirst = myLast = 0.0;
+}
 
 //=======================================================================
 //function : Load
index 6ecbf6a..a230c34 100644 (file)
@@ -68,7 +68,10 @@ public:
   
   //! ConstructionError is raised if Ufirst>Ulast
   Standard_EXPORT Geom2dAdaptor_Curve(const Handle(Geom2d_Curve)& C, const Standard_Real UFirst, const Standard_Real ULast);
-  
+
+  //! Reset currently loaded curve (undone Load()).
+  Standard_EXPORT void Reset();
+
     void Load (const Handle(Geom2d_Curve)& C);
   
   //! ConstructionError is raised if Ufirst>Ulast
index 0215eef..89f9f57 100644 (file)
@@ -124,6 +124,19 @@ GeomAbs_Shape GeomAdaptor_Curve::LocalContinuity(const Standard_Real U1,
   }
 }
 
+//=======================================================================
+//function : Reset
+//purpose  :
+//=======================================================================
+void GeomAdaptor_Curve::Reset()
+{
+  myTypeCurve = GeomAbs_OtherCurve;
+  myCurve.Nullify();
+  myNestedEvaluator.Nullify();
+  myBSplineCurve.Nullify();
+  myCurveCache.Nullify();
+  myFirst = myLast = 0.0;
+}
 
 //=======================================================================
 //function : Load
index 6904809..6e13887 100644 (file)
@@ -70,7 +70,10 @@ public:
   
   //! ConstructionError is raised if Ufirst>Ulast
     GeomAdaptor_Curve(const Handle(Geom_Curve)& C, const Standard_Real UFirst, const Standard_Real ULast);
-  
+
+    //! Reset currently loaded curve (undone Load()).
+    Standard_EXPORT void Reset();
+
     void Load (const Handle(Geom_Curve)& C);
   
   //! ConstructionError is raised if Ufirst>Ulast
index 8a7227f..6a5febf 100644 (file)
@@ -387,12 +387,7 @@ void StdPrs_Isolines::addOnSurface (const Handle(BRepAdaptor_HSurface)& theSurfa
     for (anEdgeTool.Init(); anEdgeTool.More(); anEdgeTool.Next())
     {
       TopAbs_Orientation anOrientation = anEdgeTool.Orientation();
-      if (anOrientation != TopAbs_FORWARD && anOrientation != TopAbs_REVERSED)
-      {
-        continue;
-      }
-
-      Adaptor2d_Curve2dPtr anEdgeCurve = anEdgeTool.Value();
+      const Adaptor2d_Curve2d* anEdgeCurve = &anEdgeTool.Value();
       if (anEdgeCurve->GetType() != GeomAbs_Line)
       {
         GCPnts_QuasiUniformDeflection aSampler (*anEdgeCurve, aSamplerDeflection);
index 464c617..5450da2 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
+#include <StdPrs_ToolRFace.hxx>
 
 #include <Adaptor2d_Curve2d.hxx>
 #include <BRep_Tool.hxx>
 #include <BRepAdaptor_HSurface.hxx>
-#include <Geom2d_TrimmedCurve.hxx>
-#include <StdPrs_ToolRFace.hxx>
 #include <TopoDS.hxx>
 
 //=======================================================================
 //function : StdPrs_ToolRFace
-//purpose  : 
+//purpose  :
 //=======================================================================
 StdPrs_ToolRFace::StdPrs_ToolRFace()
+: myHasNullCurves (Standard_False)
 {
 }
 
 //=======================================================================
 //function : StdPrs_ToolRFace
-//purpose  : 
+//purpose  :
 //=======================================================================
-
-StdPrs_ToolRFace::StdPrs_ToolRFace(const Handle(BRepAdaptor_HSurface)& aSurface) :
-       myFace(((BRepAdaptor_Surface*)&(aSurface->Surface()))->Face())
+StdPrs_ToolRFace::StdPrs_ToolRFace (const Handle(BRepAdaptor_HSurface)& theSurface)
+: myFace (theSurface->ChangeSurface().Face()),
+  myHasNullCurves (Standard_False)
 {
   myFace.Orientation(TopAbs_FORWARD);
 }
 
 //=======================================================================
-//function : IsOriented
-//purpose  : 
-//=======================================================================
-
-Standard_Boolean StdPrs_ToolRFace::IsOriented () const {
-  
-  return Standard_True;
-
-}
-
-//=======================================================================
-//function : Init
-//purpose  : 
-//=======================================================================
-
-void StdPrs_ToolRFace::Init() 
-{
-  myExplorer.Init(myFace,TopAbs_EDGE);
-  if (myExplorer.More()) {
-    Standard_Real U1,U2;
-    const Handle(Geom2d_Curve)& C = 
-      BRep_Tool::CurveOnSurface(TopoDS::Edge(myExplorer.Current()),
-                               myFace,
-                               U1,U2);
-    DummyCurve.Load(C,U1,U2);
-  }
-}
-
-//=======================================================================
-//function : More
-//purpose  : 
-//=======================================================================
-
-Standard_Boolean StdPrs_ToolRFace::More() const
-{
-  return myExplorer.More();
-}
-
-//=======================================================================
-//function : Next
-//purpose  : 
+//function : next
+//purpose  :
 //=======================================================================
-
-void StdPrs_ToolRFace::Next()
+void StdPrs_ToolRFace::next()
 {
-  myExplorer.Next();
-
-  if (myExplorer.More()) {
+  Standard_Real aParamU1, aParamU2;
+  for (; myExplorer.More(); myExplorer.Next())
+  {
     // skip INTERNAL and EXTERNAL edges
-    while (myExplorer.More() && (myExplorer.Current().Orientation() == TopAbs_INTERNAL 
-                              || myExplorer.Current().Orientation() == TopAbs_EXTERNAL)) 
-       myExplorer.Next();
-    if (myExplorer.More()) {
-      Standard_Real U1,U2;
-      const Handle(Geom2d_Curve)& C = 
-       BRep_Tool::CurveOnSurface(TopoDS::Edge(myExplorer.Current()),
-                                 myFace,
-                                 U1,U2);
-      if ( !C.IsNull() )
-       DummyCurve.Load(C,U1,U2);
+    if (myExplorer.Current().Orientation() != TopAbs_FORWARD
+     && myExplorer.Current().Orientation() != TopAbs_REVERSED)
+    {
+      continue;
     }
-  }
-}
-
-//=======================================================================
-//function : Value
-//purpose  : 
-//=======================================================================
 
-Adaptor2d_Curve2dPtr StdPrs_ToolRFace::Value() const
-{
-  return (Adaptor2d_Curve2dPtr)&DummyCurve;
-}
-
-//=======================================================================
-//function : Orientation
-//purpose  : 
-//=======================================================================
+    if (Handle(Geom2d_Curve) aCurve = BRep_Tool::CurveOnSurface (TopoDS::Edge (myExplorer.Current()), myFace, aParamU1, aParamU2))
+    {
+      myCurve.Load (aCurve, aParamU1, aParamU2);
+      return;
+    }
+    else
+    {
+      myHasNullCurves = Standard_True;
+    }
+  }
 
-TopAbs_Orientation StdPrs_ToolRFace::Orientation () const {
-  return myExplorer.Current().Orientation();
+  myCurve.Reset();
 }
-
index 6a5e837..09cfdfd 100644 (file)
 #include <TopoDS_Face.hxx>
 #include <TopExp_Explorer.hxx>
 #include <Geom2dAdaptor_Curve.hxx>
-#include <Standard_Boolean.hxx>
-#include <Adaptor2d_Curve2dPtr.hxx>
 #include <TopAbs_Orientation.hxx>
 class BRepAdaptor_HSurface;
 
-
-
+//! Iterator over 2D curves restricting a face (skipping internal/external edges).
+//! In addition, the algorithm skips NULL curves - IsInvalidGeometry() can be checked if this should be handled within algorithm.
 class StdPrs_ToolRFace 
 {
 public:
 
   DEFINE_STANDARD_ALLOC
 
-  
+  //! Empty constructor.
   Standard_EXPORT StdPrs_ToolRFace();
-  
+
+  //! Constructor with initialization.
   Standard_EXPORT StdPrs_ToolRFace(const Handle(BRepAdaptor_HSurface)& aSurface);
   
-  Standard_EXPORT Standard_Boolean IsOriented() const;
+  //! Return TRUE indicating that iterator looks only for oriented edges.
+  Standard_Boolean IsOriented() const { return Standard_True; }
   
-  Standard_EXPORT void Init();
-  
-  Standard_EXPORT Standard_Boolean More() const;
-  
-  Standard_EXPORT void Next();
-  
-  Standard_EXPORT Adaptor2d_Curve2dPtr Value() const;
-  
-  Standard_EXPORT TopAbs_Orientation Orientation() const;
-
+  //! Move iterator to the first element.
+  void Init()
+  {
+    myExplorer.Init (myFace, TopAbs_EDGE);
+    next();
+  }
 
+  //! Return TRUE if iterator points to the curve.
+  Standard_Boolean More() const { return myExplorer.More(); }
 
+  //! Go to the next curve in the face.
+  void Next()
+  {
+    myExplorer.Next();
+    next();
+  }
 
-protected:
-
-
+  //! Return current curve.
+  const Adaptor2d_Curve2d& Value() const { return myCurve; }
 
+  //! Return current edge orientation.
+  TopAbs_Orientation Orientation() const { return myExplorer.Current().Orientation(); }
 
+  //! Return TRUE if NULL curves have been skipped.
+  Standard_Boolean IsInvalidGeometry() const { return myHasNullCurves; }
 
 private:
 
+  //! Find nearest valid item for the iterator.
+  Standard_EXPORT void next();
 
+private:
 
   TopoDS_Face myFace;
   TopExp_Explorer myExplorer;
-  Geom2dAdaptor_Curve DummyCurve;
-
+  Geom2dAdaptor_Curve myCurve;
+  Standard_Boolean myHasNullCurves;
 
 };
 
-
-
-
-
-
-
 #endif // _StdPrs_ToolRFace_HeaderFile
index 40520ee..d212da9 100644 (file)
@@ -146,8 +146,7 @@ void StdPrs_WFDeflectionRestrictedFace::Add
   
   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
     TopAbs_Orientation Orient = ToolRst.Orientation();
-    if ( Orient == TopAbs_FORWARD || Orient == TopAbs_REVERSED ) {
-      Adaptor2d_Curve2dPtr TheRCurve = ToolRst.Value();
+      const Adaptor2d_Curve2d* TheRCurve = &ToolRst.Value();
       if (TheRCurve->GetType() != GeomAbs_Line) {
         GCPnts_QuasiUniformDeflection UDP(*TheRCurve, ddefle);
        if (UDP.IsDone()) {
@@ -180,7 +179,6 @@ void StdPrs_WFDeflectionRestrictedFace::Add
                tabP.Append(P1);
              }
            }
-         }
        }
 #ifdef OCCT_DEBUG
        else {
@@ -385,7 +383,7 @@ Standard_Boolean StdPrs_WFDeflectionRestrictedFace::Match
   UMax = VMax = RealFirst();
   
   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
-    Adaptor2d_Curve2dPtr TheRCurve = ToolRst.Value();
+    const Adaptor2d_Curve2d* TheRCurve = &ToolRst.Value();
     u = TheRCurve->FirstParameter();
     v = TheRCurve->LastParameter();
     step = ( v - u) / nbPoints;
@@ -438,8 +436,7 @@ Standard_Boolean StdPrs_WFDeflectionRestrictedFace::Match
   gp_Pnt dummypnt;
   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
     TopAbs_Orientation Orient = ToolRst.Orientation();
-    if ( Orient == TopAbs_FORWARD || Orient == TopAbs_REVERSED ) {
-      Adaptor2d_Curve2dPtr TheRCurve = ToolRst.Value();
+      const Adaptor2d_Curve2d* TheRCurve = &ToolRst.Value();
       GCPnts_QuasiUniformDeflection UDP(*TheRCurve, Deflection);
       if (UDP.IsDone()) {
        Standard_Integer NumberOfPoints = UDP.NbPoints();
@@ -462,7 +459,6 @@ Standard_Boolean StdPrs_WFDeflectionRestrictedFace::Match
        cout << "Cannot evaluate curve on surface"<<endl;
       }
 #endif
-    }
   }
   
   // draw the isos
index 725ed93..dba70eb 100755 (executable)
@@ -55,8 +55,8 @@ void StdPrs_WFRestrictedFace::Add
 
   for (aToolRst.Init(); aToolRst.More(); aToolRst.Next())
   {
-    Adaptor2d_Curve2dPtr aRCurve = aToolRst.Value();
-    BndLib_Add2dCurve::Add(*aRCurve, Precision::PConfusion(), aBndBox);
+    const Adaptor2d_Curve2d& aRCurve = aToolRst.Value();
+    BndLib_Add2dCurve::Add(aRCurve, Precision::PConfusion(), aBndBox);
   }
   if (!aBndBox.IsVoid())
     aBndBox.Get(aUMin, aVMin, aUMax, aVMax);
@@ -116,35 +116,32 @@ void StdPrs_WFRestrictedFace::Add
   for (aToolRst.Init(); aToolRst.More(); aToolRst.Next())
   {
     TopAbs_Orientation anOrientation = aToolRst.Orientation();
-    if (anOrientation == TopAbs_FORWARD || anOrientation == TopAbs_REVERSED)
+    const Adaptor2d_Curve2d* aRCurve = &aToolRst.Value();
+    anU1 = aRCurve->FirstParameter();
+    anU2 = aRCurve->LastParameter();
+    if (aRCurve->GetType() != GeomAbs_Line)
     {
-      Adaptor2d_Curve2dPtr aRCurve = aToolRst.Value();
-      anU1 = aRCurve->FirstParameter();
-      anU2 = aRCurve->LastParameter();
-      if (aRCurve->GetType() != GeomAbs_Line)
+      aDU = (anU2-anU1)/(aNbPoints-1);
+      aPoint2 = aRCurve->Value(anU1);
+      for (anI = 2; anI <= aNbPoints; ++anI)
       {
-        aDU = (anU2-anU1)/(aNbPoints-1);
-        aPoint2 = aRCurve->Value(anU1);
-        for (anI = 2; anI <= aNbPoints; ++anI)
-        {
-          anU = anU1 + (anI-1)*aDU;
-          aPoint1 = aPoint2;
-          aPoint2 = aRCurve->Value(anU);
-          if(anOrientation == TopAbs_FORWARD )
-            anIsoBuild.Trim(aPoint1,aPoint2);
-          else
-            anIsoBuild.Trim(aPoint2,aPoint1);
-        }
-      }
-      else {
-        aPoint1 = aRCurve->Value(anU1);
-        aPoint2 = aRCurve->Value(anU2);
+        anU = anU1 + (anI-1)*aDU;
+        aPoint1 = aPoint2;
+        aPoint2 = aRCurve->Value(anU);
         if(anOrientation == TopAbs_FORWARD )
           anIsoBuild.Trim(aPoint1,aPoint2);
         else
           anIsoBuild.Trim(aPoint2,aPoint1);
       }
     }
+    else {
+      aPoint1 = aRCurve->Value(anU1);
+      aPoint2 = aRCurve->Value(anU2);
+      if(anOrientation == TopAbs_FORWARD )
+        anIsoBuild.Trim(aPoint1,aPoint2);
+      else
+        anIsoBuild.Trim(aPoint2,aPoint1);
+    }
   }
 
   // Draw the isos
@@ -243,7 +240,7 @@ Standard_Boolean StdPrs_WFRestrictedFace::Match
 
   for (aToolRst.Init(); aToolRst.More(); aToolRst.Next())
   {
-    Adaptor2d_Curve2dPtr aRCurve = aToolRst.Value();
+    const Adaptor2d_Curve2d* aRCurve = &aToolRst.Value();
     anU = aRCurve->FirstParameter();
     aV = aRCurve->LastParameter();
     if (aRCurve->GetType() != GeomAbs_Line)
@@ -319,32 +316,29 @@ Standard_Boolean StdPrs_WFRestrictedFace::Match
   for (aToolRst.Init(); aToolRst.More(); aToolRst.Next())
   {
     TopAbs_Orientation Orient = aToolRst.Orientation();
-    if (Orient == TopAbs_FORWARD || Orient == TopAbs_REVERSED)
-    {
-      Adaptor2d_Curve2dPtr aRCurve = aToolRst.Value();
-      anU1 = aRCurve->FirstParameter();
-      anU2 = aRCurve->LastParameter();
-      if (aRCurve->GetType() != GeomAbs_Line) {
-        aDU = (anU2-anU1)/(aNbPoints-1);
-        aPoint2 = aRCurve->Value(anU1);
-        for (anI = 2; anI <= aNbPoints; anI++) {
-          anU = anU1 + (anI-1)*aDU;
-          aPoint1 = aPoint2;
-          aPoint2 = aRCurve->Value(anU);
-          if(Orient == TopAbs_FORWARD )
-            anIsoBuild.Trim(aPoint1,aPoint2);
-          else
-            anIsoBuild.Trim(aPoint2,aPoint1);
-        }
-      }
-      else {
-        aPoint1 = aRCurve->Value(anU1);
-        aPoint2 = aRCurve->Value(anU2);
+    const Adaptor2d_Curve2d* aRCurve = &aToolRst.Value();
+    anU1 = aRCurve->FirstParameter();
+    anU2 = aRCurve->LastParameter();
+    if (aRCurve->GetType() != GeomAbs_Line) {
+      aDU = (anU2-anU1)/(aNbPoints-1);
+      aPoint2 = aRCurve->Value(anU1);
+      for (anI = 2; anI <= aNbPoints; anI++) {
+        anU = anU1 + (anI-1)*aDU;
+        aPoint1 = aPoint2;
+        aPoint2 = aRCurve->Value(anU);
         if(Orient == TopAbs_FORWARD )
           anIsoBuild.Trim(aPoint1,aPoint2);
         else
           anIsoBuild.Trim(aPoint2,aPoint1);
-      }          
+      }
+    }
+    else {
+      aPoint1 = aRCurve->Value(anU1);
+      aPoint2 = aRCurve->Value(anU2);
+      if(Orient == TopAbs_FORWARD )
+        anIsoBuild.Trim(aPoint1,aPoint2);
+      else
+        anIsoBuild.Trim(aPoint2,aPoint1);
     }
   }
 
index d7f6195..5dc8b6e 100644 (file)
@@ -621,7 +621,16 @@ Standard_Boolean StdSelect_BRepSelectionTool::GetSensitiveForFace (const TopoDS_
   BRepAdaptor_Curve cu3d;
   for (BRepTools_WireExplorer aWireExplorer (aWire); aWireExplorer.More(); aWireExplorer.Next())
   {
-    cu3d.Initialize (aWireExplorer.Current());
+    try
+    {
+      OCC_CATCH_SIGNALS
+      cu3d.Initialize (aWireExplorer.Current());
+    }
+    catch (Standard_NullObject)
+    {
+      continue;
+    }
+
     Standard_Real wf = 0.0, wl = 0.0;
     BRep_Tool::Range (aWireExplorer.Current(), wf, wl);
     if (Abs (wf - wl) <= Precision::Confusion())
index 89c9410..fe1239e 100644 (file)
@@ -144,8 +144,7 @@ void VrmlConverter_WFDeflectionRestrictedFace::Add
   gp_Pnt dummypnt;
   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
     TopAbs_Orientation Orient = ToolRst.Orientation();
-    if ( Orient == TopAbs_FORWARD || Orient == TopAbs_REVERSED ) {
-      Adaptor2d_Curve2dPtr TheRCurve = ToolRst.Value();
+      const Adaptor2d_Curve2d* TheRCurve = &ToolRst.Value();
       if (TheRCurve->GetType() != GeomAbs_Line) {
         GCPnts_QuasiUniformDeflection UDP(*TheRCurve, Deflection);
        if (UDP.IsDone()) {
@@ -178,7 +177,6 @@ void VrmlConverter_WFDeflectionRestrictedFace::Add
        else
          isobuild.Trim(P2,P1);
       }
-    }
   }
 
   // draw the isos
index 3517908..db8fd3f 100644 (file)
@@ -52,8 +52,8 @@ void VrmlConverter_WFRestrictedFace::Add
   Bnd_Box2d B;
   
   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
-    Adaptor2d_Curve2dPtr TheRCurve = ToolRst.Value();
-    BndLib_Add2dCurve::Add(*TheRCurve, Precision::PConfusion(), B);
+    const Adaptor2d_Curve2d& TheRCurve = ToolRst.Value();
+    BndLib_Add2dCurve::Add(TheRCurve, Precision::PConfusion(), B);
   }
 
   B.Get(UMin, VMin, UMax, VMax);
@@ -97,8 +97,7 @@ void VrmlConverter_WFRestrictedFace::Add
 
   for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
     TopAbs_Orientation Orient = ToolRst.Orientation();
-    if ( Orient == TopAbs_FORWARD || Orient == TopAbs_REVERSED ) {
-      Adaptor2d_Curve2dPtr TheRCurve = ToolRst.Value();
+      const Adaptor2d_Curve2d* TheRCurve = &ToolRst.Value();
       U1 = TheRCurve->FirstParameter();
       U2 = TheRCurve->LastParameter();
       if (TheRCurve->GetType() != GeomAbs_Line) {
@@ -121,8 +120,7 @@ void VrmlConverter_WFRestrictedFace::Add
          isobuild.Trim(P1,P2);
        else
          isobuild.Trim(P2,P1);
-      }          
-    }
+      }
   }
 
 
diff --git a/tests/bugs/vis/bug30146 b/tests/bugs/vis/bug30146
new file mode 100644 (file)
index 0000000..98e8bed
--- /dev/null
@@ -0,0 +1,18 @@
+puts "============="
+puts "0030146: Visualization - e x c e p t i o n during attempt to display Edge without geometry"
+puts "============="
+
+pload MODELING VISUALIZATION
+
+restore [locate_data_file CTO904_cts20176a.rle] a
+incmesh a 0.1
+tclean -geom a
+
+vclear
+vinit View1
+vviewparams -scale 3.69 -proj 0.30 0.94 0.14 -up -0.46 0.013 0.88 -at 103.9 -59.94 -27.08
+vdisplay -dispMode 0 a
+vdump ${imagedir}/${casename}_wireframe.png
+
+vdisplay -dispMode 1 a
+vdump ${imagedir}/${casename}_shaded.png