]> OCCT Git - occt.git/commitdiff
0032247: VIS, IVtkOCC_ShapeMesher - allow disabling auto-triangulation behavior
authorkgv <kgv@opencascade.com>
Fri, 26 Mar 2021 09:37:10 +0000 (12:37 +0300)
committerbugmaster <bugmaster@opencascade.com>
Wed, 31 Mar 2021 17:44:29 +0000 (20:44 +0300)
IVtkOCC_Shape now stores Prs3d_Drawer object used by IVtkOCC_ShapeMesher and IVtkOCC_SelectableObject.
IVtkOCC_ShapeMesher::internalBuild() made more consistent to AIS_Shape::Compute() in cleaning/triangulating shape.

Added command ivtkdefaults similar to vdefaults managing triangulation default parameters.

22 files changed:
src/IVtk/IVtk_IShapeMesher.cxx
src/IVtk/IVtk_IShapeMesher.hxx
src/IVtkDraw/IVtkDraw.cxx
src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.cxx
src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.hxx
src/IVtkOCC/IVtkOCC_SelectableObject.cxx
src/IVtkOCC/IVtkOCC_SelectableObject.hxx
src/IVtkOCC/IVtkOCC_Shape.cxx
src/IVtkOCC/IVtkOCC_Shape.hxx
src/IVtkOCC/IVtkOCC_ShapeMesher.cxx
src/IVtkOCC/IVtkOCC_ShapeMesher.hxx
src/IVtkOCC/IVtkOCC_ShapePickerAlgo.cxx
src/IVtkOCC/IVtkOCC_ViewerSelector.cxx
src/IVtkOCC/IVtkOCC_ViewerSelector.hxx
src/IVtkTools/IVtkTools_DisplayModeFilter.hxx
src/IVtkTools/IVtkTools_ShapeDataSource.cxx
src/IVtkTools/IVtkTools_ShapeDataSource.hxx
src/IVtkTools/IVtkTools_ShapeObject.hxx
src/IVtkTools/IVtkTools_ShapePicker.hxx
src/IVtkTools/IVtkTools_SubPolyDataFilter.hxx
src/IVtkVTK/IVtkVTK_View.cxx
tests/vtk/ivtk/autotriang [new file with mode: 0644]

index 10f18405ab6ac5c2e6345356c4becbc843769b2a..afd9f68205853df0c43bad5b38e33e3ab247f096 100644 (file)
 
 IMPLEMENT_STANDARD_RTTIEXT(IVtk_IShapeMesher,IVtk_Interface)
 
-// Handle implementation
-
-
-//! Executes the mesh generation algorithms. To be defined in implementation class.
+// ================================================================
+// Function : initialize
+// Purpose  :
+// ================================================================
 void IVtk_IShapeMesher::initialize (const IVtk_IShape::Handle&     theShape,
                                     const IVtk_IShapeData::Handle& theData)
 {
@@ -28,9 +28,10 @@ void IVtk_IShapeMesher::initialize (const IVtk_IShape::Handle&     theShape,
   myShapeData = theData;
 }
 
-//! Main entry point for building shape representation
-//! @param [in] shape IShape to be meshed
-//! @param [in] data IShapeData interface visualization data is passed to.
+// ================================================================
+// Function : Build
+// Purpose  :
+// ================================================================
 void IVtk_IShapeMesher::Build (const IVtk_IShape::Handle&     theShape,
                                const IVtk_IShapeData::Handle& theData)
 {
index 6f740b436b49d671f601b5f7abca9ece9b30faef..62bcbbe4af64cc2f18102f9a7aeb4439d3f920af 100644 (file)
@@ -31,11 +31,15 @@ public:
   typedef Handle(IVtk_IShapeMesher) Handle;
   virtual ~IVtk_IShapeMesher() { }
 
+  //! Main entry point for building shape representation
+  //! @param [in] shape IShape to be meshed
+  //! @param [in] data IShapeData interface visualization data is passed to.
   Standard_EXPORT void Build (const IVtk_IShape::Handle& theShape, const IVtk_IShapeData::Handle& theData);
 
   DEFINE_STANDARD_RTTIEXT(IVtk_IShapeMesher,IVtk_Interface)
 
 protected:
+  //! Executes the mesh generation algorithms. To be defined in implementation class.
   Standard_EXPORT virtual void initialize (const IVtk_IShape::Handle&     theShapeObj,
                                            const IVtk_IShapeData::Handle& theShapeData);
   virtual void internalBuild() = 0;
index b3edff3b2d1435ff53dade6be79417e25e1131ad..b459f0c4abc2750979624e4bd4192f4558dbf9bc 100644 (file)
@@ -167,6 +167,22 @@ static Handle(PipelinePtr) PipelineByActorName (const TCollection_AsciiString& t
   return PipelineByActor (anActor);
 }
 
+//! Create global presentation attributes.
+static Handle(Prs3d_Drawer) createDefaultDrawer()
+{
+  Handle(Prs3d_Drawer) aGlobalDrawer = new Prs3d_Drawer();
+  aGlobalDrawer->SetTypeOfDeflection (Aspect_TOD_RELATIVE);
+  aGlobalDrawer->SetDeviationCoefficient (0.0001);
+  return aGlobalDrawer;
+}
+
+//! Get global presentation attributes (analog of AIS_InteractiveContext::DefaultDrawer()).
+static const Handle(Prs3d_Drawer)& GetDefaultDrawer()
+{
+  static Handle(Prs3d_Drawer) aGlobalDrawer = createDefaultDrawer();
+  return aGlobalDrawer;
+}
+
 #ifdef _WIN32
 
 static Handle(WNT_Window)& GetWindow()
@@ -495,12 +511,105 @@ vtkActor* CreateActor (const Standard_Integer theId,
     return NULL;
   }
 
-  Handle(PipelinePtr) aPL = new PipelinePtr (theShape, theId);
+  Handle(PipelinePtr) aPL = new PipelinePtr (theShape, theId, GetDefaultDrawer());
   GetPipelines()->Bind (theId, aPL);
 
   return aPL->Actor();
 }
 
+
+//===============================================================================================
+//function : VtkDefaults
+//purpose  :
+//===============================================================================================
+static int VtkDefaults (Draw_Interpretor& theDi,
+                        Standard_Integer  theArgsNb,
+                        const char**      theArgVec)
+{
+  const Handle(Prs3d_Drawer)& aDefParams = GetDefaultDrawer();
+  if (theArgsNb < 2)
+  {
+    if (aDefParams->TypeOfDeflection() == Aspect_TOD_RELATIVE)
+    {
+      theDi << "DeflType:           relative\n"
+            << "DeviationCoeff:     " << aDefParams->DeviationCoefficient() << "\n";
+    }
+    else
+    {
+      theDi << "DeflType:           absolute\n"
+            << "AbsoluteDeflection: " << aDefParams->MaximalChordialDeviation() << "\n";
+    }
+    theDi << "AngularDeflection:  " << (180.0 * aDefParams->DeviationAngle() / M_PI) << "\n";
+    theDi << "AutoTriangulation:  " << (aDefParams->IsAutoTriangulation() ? "on" : "off") << "\n";
+    return 0;
+  }
+
+  for (Standard_Integer anArgIter = 1; anArgIter < theArgsNb; ++anArgIter)
+  {
+    TCollection_AsciiString anArg (theArgVec[anArgIter]);
+    anArg.UpperCase();
+    if (anArg == "-ABSDEFL"
+     || anArg == "-ABSOLUTEDEFLECTION"
+     || anArg == "-DEFL"
+     || anArg == "-DEFLECTION")
+    {
+      if (++anArgIter >= theArgsNb)
+      {
+        theDi << "Syntax error at " << anArg;
+        return 1;
+      }
+      aDefParams->SetTypeOfDeflection         (Aspect_TOD_ABSOLUTE);
+      aDefParams->SetMaximalChordialDeviation (Draw::Atof (theArgVec[anArgIter]));
+    }
+    else if (anArg == "-RELDEFL"
+          || anArg == "-RELATIVEDEFLECTION"
+          || anArg == "-DEVCOEFF"
+          || anArg == "-DEVIATIONCOEFF"
+          || anArg == "-DEVIATIONCOEFFICIENT")
+    {
+      if (++anArgIter >= theArgsNb)
+      {
+        theDi << "Syntax error at " << anArg;
+        return 1;
+      }
+      aDefParams->SetTypeOfDeflection     (Aspect_TOD_RELATIVE);
+      aDefParams->SetDeviationCoefficient (Draw::Atof (theArgVec[anArgIter]));
+    }
+    else if (anArg == "-ANGDEFL"
+          || anArg == "-ANGULARDEFL"
+          || anArg == "-ANGULARDEFLECTION")
+    {
+      if (++anArgIter >= theArgsNb)
+      {
+        theDi << "Syntax error at " << anArg;
+        return 1;
+      }
+      aDefParams->SetDeviationAngle (M_PI * Draw::Atof (theArgVec[anArgIter]) / 180.0);
+    }
+    else if (anArg == "-AUTOTR"
+          || anArg == "-AUTOTRIANG"
+          || anArg == "-AUTOTRIANGULATION")
+    {
+      ++anArgIter;
+      bool toTurnOn = true;
+      if (anArgIter >= theArgsNb
+      || !Draw::ParseOnOff (theArgVec[anArgIter], toTurnOn))
+      {
+        theDi << "Syntax error at '" << anArg << "'";
+        return 1;
+      }
+      aDefParams->SetAutoTriangulation (toTurnOn);
+    }
+    else
+    {
+      theDi << "Syntax error: unknown argument '" << anArg << "'";
+      return 1;
+    }
+  }
+
+  return 0;
+}
+
 //================================================================
 // Function : VtkDisplay
 // Purpose  : 
@@ -1509,6 +1618,14 @@ void IVtkDraw::Commands (Draw_Interpretor& theCommands)
               "ivtkclose : Closes the Vtk window.",
     __FILE__, VtkClose, group);
 
+  theCommands.Add("ivtkdefaults",
+               "ivtkdefaults [-absDefl value]"
+       "\n\t\t:              [-devCoeff value]"
+       "\n\t\t:              [-angDefl value]"
+       "\n\t\t:              [-autoTriang {off/on | 0/1}]"
+       "\n\t\t: Sets default VTK meshing parameters."
+    , __FILE__, VtkDefaults, group);
+
   theCommands.Add("ivtkrenderparams",
               "ivtkrenderparams [-depthPeeling NbLayers] [-shadows {on|off}]"
       "\n\t\t: Sets Vtk rendering parameters."
index 07328f16fdab4fb7cc1e58ed718b1df9a119a061..b6fa1399aa7235647aceff17e79389c3cddd700e 100644 (file)
@@ -39,7 +39,8 @@ IMPLEMENT_STANDARD_RTTIEXT(IVtkDraw_HighlightAndSelectionPipeline,Standard_Trans
 //===========================================================
 
 IVtkDraw_HighlightAndSelectionPipeline::IVtkDraw_HighlightAndSelectionPipeline (const TopoDS_Shape& theShape,
-                                                                                const Standard_Integer theShapeID)
+                                                                                const Standard_Integer theShapeID,
+                                                                                const Handle(Prs3d_Drawer)& theDrawerLink)
 : Standard_Transient()
 {
   /* ===========================
@@ -57,7 +58,7 @@ IVtkDraw_HighlightAndSelectionPipeline::IVtkDraw_HighlightAndSelectionPipeline (
    * ======================== */
 
   myActor = vtkSmartPointer<vtkActor>::New();
-  IVtkOCC_Shape::Handle anIVtkShape = new IVtkOCC_Shape (theShape);
+  IVtkOCC_Shape::Handle anIVtkShape = new IVtkOCC_Shape (theShape, theDrawerLink);
   anIVtkShape->SetId (theShapeID);
   vtkSmartPointer<IVtkTools_ShapeDataSource> aDataSource = vtkSmartPointer<IVtkTools_ShapeDataSource>::New();
   aDataSource->SetShape (anIVtkShape);
index 9e8a4e028a5f6d19182d96f18dd449acdbab6380..7084def3b37cbb28a4d50c489acc5811ec499861 100644 (file)
@@ -37,6 +37,8 @@
 typedef NCollection_DataMap <IVtk_IdType, vtkSmartPointer<IVtkTools_DisplayModeFilter> > DisplayModeFiltersMap;
 typedef NCollection_DataMap <IVtk_IdType, vtkSmartPointer<IVtkTools_SubPolyDataFilter> > SubShapesFiltersMap;
 
+class Prs3d_Drawer;
+
 class IVtkDraw_HighlightAndSelectionPipeline;
 DEFINE_STANDARD_HANDLE(IVtkDraw_HighlightAndSelectionPipeline, Standard_Transient)
 
@@ -61,7 +63,8 @@ public:
 public:
 
   IVtkDraw_HighlightAndSelectionPipeline (const TopoDS_Shape& theShape,
-                                          const Standard_Integer theShapeID);
+                                          const Standard_Integer theShapeID,
+                                          const Handle(Prs3d_Drawer)& theDrawerLink);
   ~IVtkDraw_HighlightAndSelectionPipeline() {}
 
 public:
index 51656276a00901e961b06d8c1433563db5d77aa8..f17a1cbf52d7e1f19a157b30f52dd7df45f7224f 100644 (file)
@@ -18,6 +18,7 @@
 #include <AIS_Shape.hxx>
 #include <BRepBndLib.hxx>
 #include <Message.hxx>
+#include <StdPrs_ToolTriangulatedShape.hxx>
 #include <Select3D_SensitiveBox.hxx>
 #include <SelectMgr_Selection.hxx>
 #include <Standard_ErrorHandler.hxx>
 
 IMPLEMENT_STANDARD_RTTIEXT(IVtkOCC_SelectableObject,SelectMgr_SelectableObject)
 
-// Handle implementation
-
-
 //============================================================================
 // Method:  Constructor
-// Purpose: Constructs a selectable object initialized by the given shape
+// Purpose:
 //============================================================================
 IVtkOCC_SelectableObject::IVtkOCC_SelectableObject (const IVtkOCC_Shape::Handle& theShape)
 : SelectMgr_SelectableObject (PrsMgr_TOP_AllView),
@@ -42,37 +40,35 @@ IVtkOCC_SelectableObject::IVtkOCC_SelectableObject (const IVtkOCC_Shape::Handle&
   {
     myShape->SetSelectableObject (this);
   }
-
-  // Minor stuff - but it facilitates usage of OCCT selection 
-  // classes dealing with deflection, see ComputeSelection() below
-  myOCCTDrawer = new Prs3d_Drawer();
 }
 
 //============================================================================
 // Method:  Constructor
-// Purpose: Constructs uninitialized selectable object.
-//          setShape() should be called later.
+// Purpose:
 //============================================================================
 IVtkOCC_SelectableObject::IVtkOCC_SelectableObject()
-: SelectMgr_SelectableObject (PrsMgr_TOP_AllView),
-  myShape (0)
-{ }
+: SelectMgr_SelectableObject (PrsMgr_TOP_AllView)
+{
+  //
+}
 
 //============================================================================
 // Method:  Destructor
-// Purpose: 
+// Purpose:
 //============================================================================
 IVtkOCC_SelectableObject::~IVtkOCC_SelectableObject()
-{ }
+{
+  //
+}
 
 //============================================================================
 // Method:  SetShape
-// Purpose: Sets the selectable shape
+// Purpose:
 //============================================================================
 void IVtkOCC_SelectableObject::SetShape (const IVtkOCC_Shape::Handle& theShape)
 {
   myShape = theShape;
-  if (! myShape.IsNull())
+  if (!myShape.IsNull())
   {
     myShape->SetSelectableObject (this);
   }
@@ -84,7 +80,7 @@ void IVtkOCC_SelectableObject::SetShape (const IVtkOCC_Shape::Handle& theShape)
 
 //============================================================================
 // Method:  ComputeSelection
-// Purpose: Internal method, computes selection data for viewer selector
+// Purpose:
 //============================================================================
 void IVtkOCC_SelectableObject::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
                                                  const Standard_Integer theMode)
@@ -94,33 +90,17 @@ void IVtkOCC_SelectableObject::ComputeSelection (const Handle(SelectMgr_Selectio
     return;
   }
 
-  TopoDS_Shape anOcctShape = myShape->GetShape();
-
-  if (anOcctShape.ShapeType() == TopAbs_COMPOUND && anOcctShape.NbChildren() == 0)
+  const TopoDS_Shape& anOcctShape = myShape->GetShape();
+  if (anOcctShape.ShapeType() == TopAbs_COMPOUND
+   && anOcctShape.NbChildren() == 0)
   {
     // Shape empty -> go away
     return;
   }
 
-  TopAbs_ShapeEnum aTypeOfSel = AIS_Shape::SelectionType (theMode);
-
-  Standard_Real aDeflection = myOCCTDrawer->MaximalChordialDeviation();
-  if (myOCCTDrawer->TypeOfDeflection() == Aspect_TOD_RELATIVE)
-  {
-    Bnd_Box aBndBox;
-    BRepBndLib::Add (anOcctShape, aBndBox);
-    if (!aBndBox.IsVoid())
-    {
-      Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
-      aBndBox.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
-      aDeflection = Max (aXmax - aXmin, Max (aYmax - aYmin, aZmax - aZmin)) * 
-        myOCCTDrawer->DeviationCoefficient();
-    }
-  }
-
-  // Assume the shape has been displayed already -> triangulation should exist
-  Standard_Boolean isAutoTriangulation = Standard_False;
-
+  const TopAbs_ShapeEnum aTypeOfSel = AIS_Shape::SelectionType (theMode);
+  const Handle(Prs3d_Drawer)& aDrawer = myShape->Attributes();
+  const Standard_Real aDeflection = StdPrs_ToolTriangulatedShape::GetDeflection (anOcctShape, aDrawer);
   try
   {
     OCC_CATCH_SIGNALS
@@ -129,8 +109,8 @@ void IVtkOCC_SelectableObject::ComputeSelection (const Handle(SelectMgr_Selectio
                                        anOcctShape,
                                        aTypeOfSel,
                                        aDeflection,
-                                       myOCCTDrawer->DeviationAngle(),
-                                       isAutoTriangulation);
+                                       aDrawer->DeviationAngle(),
+                                       aDrawer->IsAutoTriangulation());
   }
   catch (const Standard_Failure& anException)
   {
@@ -158,8 +138,7 @@ const Bnd_Box& IVtkOCC_SelectableObject::BoundingBox()
     return myBndBox;
   }
 
-  TopoDS_Shape anOcctShape = myShape->GetShape();
-
+  const TopoDS_Shape& anOcctShape = myShape->GetShape();
   if (anOcctShape.ShapeType() == TopAbs_COMPOUND && anOcctShape.NbChildren() == 0)
   {
     // Shape empty -> nothing to do
index 2a80cb82ce90b262fb57a1ffcb27acb947e83691..1488d6e53a62600520394840123e9ca0ef56a497 100644 (file)
@@ -73,7 +73,6 @@ private:
 private:
   IVtkOCC_Shape::Handle myShape;
   Bnd_Box               myBndBox;
-  Handle(Prs3d_Drawer)  myOCCTDrawer;
 };
 
 #endif // __IVTKOCC_SELECTABLEOBJECT_H__
index fd12c1db8694c7533a304d2d510ca8ff8a7ae5c3..1d9a065fdb5c113b2fdadc57d63a9af32dfca265 100644 (file)
 // commercial license or contractual agreement.
 
 #include <IVtkOCC_Shape.hxx>
+
 #include <TopExp.hxx>
 
 IMPLEMENT_STANDARD_RTTIEXT(IVtkOCC_Shape,IVtk_IShape)
 
-// Handle implementation
-
-
 //============================================================================
 // Method: Constructor
 // Purpose:
 //============================================================================
-IVtkOCC_Shape::IVtkOCC_Shape (const TopoDS_Shape& theShape)
-: myTopoDSShape (theShape)
+IVtkOCC_Shape::IVtkOCC_Shape (const TopoDS_Shape& theShape,
+                              const Handle(Prs3d_Drawer)& theDrawerLink)
+: myTopoDSShape (theShape),
+  myOCCTDrawer (new Prs3d_Drawer())
 {
+  if (!theDrawerLink.IsNull())
+  {
+    myOCCTDrawer->SetLink (theDrawerLink);
+  }
+  else
+  {
+    // these old defaults have been moved from IVtkOCC_ShapeMesher constructor
+    myOCCTDrawer->SetDeviationCoefficient (0.0001); // Aspect_TOD_RELATIVE
+  }
   buildSubShapeIdMap();
 }
 
@@ -38,26 +47,24 @@ IVtkOCC_Shape::IVtkOCC_Shape (const TopoDS_Shape& theShape)
 IVtkOCC_Shape::~IVtkOCC_Shape() { }
 
 //============================================================================
-// Method: getSubShapeId
-// Purpose: Returns unique ID of the given sub-shape within the top-level shape.
+// Method: GetSubShapeId
+// Purpose:
 //============================================================================
 IVtk_IdType IVtkOCC_Shape::GetSubShapeId (const TopoDS_Shape& theSubShape) const
 {
   Standard_Integer anIndex = theSubShape.IsSame (myTopoDSShape) ?
                              -1 :
                              mySubShapeIds.FindIndex (theSubShape);
-
-  if (!anIndex) // Not found in the map
+  if (anIndex == 0) // Not found in the map
   {
-    anIndex = -1;
+    return (IVtk_IdType )-1;
   }
-
   return (IVtk_IdType)anIndex;
 }
 
 //============================================================================
 // Method: getSubIds
-// Purpose: Get ids of sub-shapes composing a sub-shape with the given id.
+// Purpose:
 //============================================================================
 IVtk_ShapeIdList IVtkOCC_Shape::GetSubIds (const IVtk_IdType theId) const
 {
@@ -73,7 +80,7 @@ IVtk_ShapeIdList IVtkOCC_Shape::GetSubIds (const IVtk_IdType theId) const
   }
   else
   {
-    // Find all composing vertices, edges and faces of the the found sub-shape
+    // Find all composing vertices, edges and faces of the found sub-shape
     // and append their ids to the result.
     TopTools_IndexedMapOfShape aSubShapes;
     if (aShape.IsSame (myTopoDSShape))
index 11a4f160ec2c6de84345f475ee21d186be51499f..31f3fb8ce2457aaacc9abdff0868102f78386d77 100644 (file)
@@ -32,19 +32,23 @@ public:
 
   typedef Handle(IVtkOCC_Shape) Handle;
 
-  //! Constructor for OCC IShape implementation
-  Standard_EXPORT IVtkOCC_Shape (const TopoDS_Shape& theShape);
+  //! Constructor for OCC IShape implementation.
+  //! @param theShape [in] shape to display
+  //! @param theDrawerLink [in] default attributes to link
+  Standard_EXPORT IVtkOCC_Shape (const TopoDS_Shape& theShape,
+                                 const Handle(Prs3d_Drawer)& theDrawerLink = Handle(Prs3d_Drawer)());
 
   //! Destructor
   Standard_EXPORT virtual ~IVtkOCC_Shape();
 
+  //! Returns unique ID of the given sub-shape within the top-level shape.
   Standard_EXPORT IVtk_IdType GetSubShapeId (const IVtk_IShape::Handle&) const;
 
   DEFINE_STANDARD_RTTIEXT(IVtkOCC_Shape,IVtk_IShape)
 
   //! Get the wrapped original OCCT shape
   //! @return TopoDS_Shape the wrapped original OCCT shape
-  TopoDS_Shape GetShape() const
+  const TopoDS_Shape& GetShape() const
   {
     return myTopoDSShape;
   }
@@ -78,11 +82,17 @@ public:
   }
 
   //! @return Handle to the selectable object for this shape.
-  Handle(SelectMgr_SelectableObject) GetSelectableObject() const
+  const Handle(SelectMgr_SelectableObject)& GetSelectableObject() const
   {
     return mySelectable;
   }
 
+  //! Return presentation attributes.
+  const Handle(Prs3d_Drawer)& Attributes() const { return myOCCTDrawer; }
+
+  //! Set presentation attributes.
+  void SetAttributes (const Handle(Prs3d_Drawer)& theDrawer) { myOCCTDrawer = theDrawer; }
+
 private:
   //! @brief Build a map of sub-shapes by their IDs
   //!
@@ -94,6 +104,7 @@ private:
 private:
   TopTools_IndexedMapOfShape         mySubShapeIds; //!< Map of sub-shapes by their IDs
   TopoDS_Shape                       myTopoDSShape; //!< The wrapped main OCCT shape
+  Handle(Prs3d_Drawer)               myOCCTDrawer;  //!< presentation attributes
   Handle(SelectMgr_SelectableObject) mySelectable;  //!< Link to a holder of selection primitives
 };
 
index a06571dcc44c937c1380d0e6cd0dcafb87c94842..f0caffdcf6d73d2c54e02e744b589c94f06bf37c 100644 (file)
 
 #include <IVtkOCC_ShapeMesher.hxx>
 
-#include <Adaptor3d_IsoCurve.hxx>
 #include <Bnd_Box.hxx>
 #include <BRep_Tool.hxx>
-#include <BRepBndLib.hxx>
-#include <BRepMesh_DiscretFactory.hxx>
-#include <BRepMesh_DiscretRoot.hxx>
 #include <BRepTools.hxx>
-#include <Hatch_Hatcher.hxx>
-#include <GCPnts_QuasiUniformDeflection.hxx>
-#include <GCPnts_TangentialDeflection.hxx>
-#include <Geom_BezierSurface.hxx>
-#include <Geom_BSplineSurface.hxx>
-#include <Geom2dAdaptor_Curve.hxx>
-#include <GeomAdaptor_Curve.hxx>
-#include <gp_Dir2d.hxx>
-#include <gp_Pnt2d.hxx>
 #include <Message.hxx>
 #include <NCollection_Array1.hxx>
 #include <Poly_Polygon3D.hxx>
 #include <Poly_PolygonOnTriangulation.hxx>
 #include <Poly_Triangulation.hxx>
-#include <Precision.hxx>
 #include <Prs3d.hxx>
 #include <Prs3d_Drawer.hxx>
-#include <Prs3d_IsoAspect.hxx>
 #include <Standard_ErrorHandler.hxx>
 #include <StdPrs_Isolines.hxx>
 #include <StdPrs_ToolTriangulatedShape.hxx>
-#include <TColgp_SequenceOfPnt2d.hxx>
-#include <TColStd_Array1OfReal.hxx>
 #include <TopExp.hxx>
 #include <TopExp_Explorer.hxx>
+#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
 
 IMPLEMENT_STANDARD_RTTIEXT(IVtkOCC_ShapeMesher,IVtk_IShapeMesher)
 
-// Handle implementation
+//================================================================
+// Function : IVtkOCC_ShapeMesher
+// Purpose  :
+//================================================================
+IVtkOCC_ShapeMesher::IVtkOCC_ShapeMesher()
+{
+  //
+}
 
+//================================================================
+// Function : ~IVtkOCC_ShapeMesher
+// Purpose  :
+//================================================================
+IVtkOCC_ShapeMesher::~IVtkOCC_ShapeMesher()
+{
+  //
+}
 
 //================================================================
 // Function : internalBuild
-// Purpose  : 
+// Purpose  :
 //================================================================
 void IVtkOCC_ShapeMesher::internalBuild()
 {
-  // TODO: do we need any protection here so as not to triangualte
-  // the shape twice??? This can be done e.g. by checking if
-  // triangulation exists for TopoDS_Shape..
-  meshShape();
+  const TopoDS_Shape& anOcctShape = GetShapeObj()->GetShape();
+  if (anOcctShape.IsNull())
+  {
+    return;
+  }
+
+  const Handle(Prs3d_Drawer)& anOcctDrawer = GetShapeObj()->Attributes();
+  const Standard_Real aShapeDeflection = StdPrs_ToolTriangulatedShape::GetDeflection (anOcctShape, anOcctDrawer);
+  if (anOcctDrawer->IsAutoTriangulation())
+  {
+    StdPrs_ToolTriangulatedShape::ClearOnOwnDeflectionChange (anOcctShape, anOcctDrawer, true);
+    StdPrs_ToolTriangulatedShape::Tessellate (anOcctShape, anOcctDrawer);
+  }
 
   // Free vertices and free edges should always be shown.
   // Shared edges are needed in WF representation only.
@@ -71,83 +79,79 @@ void IVtkOCC_ShapeMesher::internalBuild()
   addEdges();
 
   // Build wireframe points and cells (lines for isolines)
-  addWireFrameFaces();
+  for (TopExp_Explorer aFaceIter (anOcctShape, TopAbs_FACE); aFaceIter.More(); aFaceIter.Next())
+  {
+    const TopoDS_Face& anOcctFace = TopoDS::Face (aFaceIter.Current());
+    try
+    {
+      OCC_CATCH_SIGNALS
+      addWFFace (anOcctFace, GetShapeObj()->GetSubShapeId (anOcctFace), aShapeDeflection);
+    }
+    catch (const Standard_Failure& anException)
+    {
+      Message::SendFail (TCollection_AsciiString("Error: addWireFrameFaces() wireframe presentation builder has failed (")
+                       + anException.GetMessageString() + ")");
+    }
+  }
 
   // Build shaded representation (based on Poly_Triangulation)
-  addShadedFaces();
+  for (TopExp_Explorer aFaceIter (anOcctShape, TopAbs_FACE); aFaceIter.More(); aFaceIter.Next())
+  {
+    const TopoDS_Face& anOcctFace = TopoDS::Face (aFaceIter.Current());
+    addShadedFace (anOcctFace, GetShapeObj()->GetSubShapeId (anOcctFace));
+  }
 }
 
 //================================================================
 // Function : GetShapeObj
-// Purpose  : 
+// Purpose  :
 //================================================================
 const IVtkOCC_Shape::Handle IVtkOCC_ShapeMesher::GetShapeObj() const
 {
-  return (IVtkOCC_Shape::Handle::DownCast(myShapeObj));
+  return IVtkOCC_Shape::Handle::DownCast(myShapeObj);
 }
 
 //================================================================
 // Function : GetDeflection
-// Purpose  : Returns absolute deflection used by this algorithm.
+// Purpose  :
 //================================================================
 Standard_Real IVtkOCC_ShapeMesher::GetDeflection() const
 {
-  if (myDeflection < Precision::Confusion()) // if not yet initialized
-  {
-    Handle(Prs3d_Drawer) aDefDrawer = new Prs3d_Drawer();
-    aDefDrawer->SetTypeOfDeflection (Aspect_TOD_RELATIVE);
-    aDefDrawer->SetDeviationCoefficient (GetDeviationCoeff());
-    myDeflection = StdPrs_ToolTriangulatedShape::GetDeflection (GetShapeObj()->GetShape(), aDefDrawer);
-  }
-
-  return myDeflection;
+  const TopoDS_Shape& anOcctShape = GetShapeObj()->GetShape();
+  return !anOcctShape.IsNull()
+        ? StdPrs_ToolTriangulatedShape::GetDeflection (anOcctShape, GetShapeObj()->Attributes())
+        : 0.0;
 }
 
 //================================================================
-// Function : meshShape
-// Purpose  : 
+// Function : GetDeflection
+// Purpose  :
 //================================================================
-void IVtkOCC_ShapeMesher::meshShape()
+Standard_Real IVtkOCC_ShapeMesher::GetDeviationCoeff() const
 {
-  const TopoDS_Shape& anOcctShape = GetShapeObj()->GetShape();
-  if (anOcctShape.IsNull())
-  {
-    return;
-  }
-
-  //Clean triangulation before compute incremental mesh
-  BRepTools::Clean (anOcctShape);
-
-  //Compute triangulation
-  Standard_Real aDeflection = GetDeflection();
-  if (aDeflection < Precision::Confusion())
+  if (IVtkOCC_Shape::Handle aShape = GetShapeObj())
   {
-    return;
+    return aShape->Attributes()->DeviationCoefficient();
   }
+  return 0.0;
+}
 
-  try
-  {
-    OCC_CATCH_SIGNALS
-
-    Handle(BRepMesh_DiscretRoot) anAlgo;
-    anAlgo = BRepMesh_DiscretFactory::Get().Discret (anOcctShape,
-                                                     aDeflection,
-                                                     GetDeviationAngle());
-    if (!anAlgo.IsNull())
-    {
-      anAlgo->Perform();
-    }
-  }
-  catch (const Standard_Failure& anException)
+//================================================================
+// Function : GetDeviationAngle
+// Purpose  :
+//================================================================
+Standard_Real IVtkOCC_ShapeMesher::GetDeviationAngle() const
+{
+  if (IVtkOCC_Shape::Handle aShape = GetShapeObj())
   {
-    Message::SendFail (TCollection_AsciiString("Error: IVtkOCC_ShapeMesher::meshShape() triangulation builder has failed (")
-                     + anException.GetMessageString() + ")");
+    return aShape->Attributes()->DeviationAngle();
   }
+  return 0.0;
 }
 
 //================================================================
 // Function : addFreeVertices
-// Purpose  : 
+// Purpose  :
 //================================================================
 void IVtkOCC_ShapeMesher::addFreeVertices()
 {
@@ -176,7 +180,7 @@ void IVtkOCC_ShapeMesher::addFreeVertices()
 
 //================================================================
 // Function : addEdges
-// Purpose  : 
+// Purpose  :
 //================================================================
 void IVtkOCC_ShapeMesher::addEdges()
 {
@@ -213,54 +217,9 @@ void IVtkOCC_ShapeMesher::addEdges()
   }
 }
 
-//================================================================
-// Function : addWireFrameFaces
-// Purpose  : 
-//================================================================
-void IVtkOCC_ShapeMesher::addWireFrameFaces()
-{
-  // Check the deflection value once for all faces
-  if (GetDeflection() < Precision::Confusion())
-  {
-    return;
-  }
-
-  TopExp_Explorer aFaceIter (GetShapeObj()->GetShape(), TopAbs_FACE);
-  for (; aFaceIter.More(); aFaceIter.Next())
-  {
-    const TopoDS_Face& anOcctFace = TopoDS::Face (aFaceIter.Current());
-    try
-    {
-      OCC_CATCH_SIGNALS
-      addWFFace (anOcctFace, 
-                 GetShapeObj()->GetSubShapeId (anOcctFace));
-    }
-    catch (const Standard_Failure& anException)
-    {
-      Message::SendFail (TCollection_AsciiString("Error: addWireFrameFaces() wireframe presentation builder has failed (")
-                       + anException.GetMessageString() + ")");
-    }
-  }
-}
-
-//================================================================
-// Function : addShadedFaces
-// Purpose  : 
-//================================================================
-void IVtkOCC_ShapeMesher::addShadedFaces()
-{
-  TopExp_Explorer aFaceIter (GetShapeObj()->GetShape(), TopAbs_FACE);
-  for (; aFaceIter.More(); aFaceIter.Next())
-  {
-    const TopoDS_Face& anOcctFace = TopoDS::Face (aFaceIter.Current());
-    addShadedFace (anOcctFace,
-                   GetShapeObj()->GetSubShapeId (anOcctFace));
-  }
-}
-
 //================================================================
 // Function : addVertex
-// Purpose  : 
+// Purpose  :
 //================================================================
 void IVtkOCC_ShapeMesher::addVertex (const TopoDS_Vertex& theVertex,
                                      const IVtk_IdType    theShapeId,
@@ -273,15 +232,14 @@ void IVtkOCC_ShapeMesher::addVertex (const TopoDS_Vertex& theVertex,
 
   gp_Pnt aPnt3d = BRep_Tool::Pnt (theVertex);
 
-  IVtk_PointId anId = 
-    myShapeData->InsertCoordinate (aPnt3d.X(), aPnt3d.Y(), aPnt3d.Z());
+  IVtk_PointId anId = myShapeData->InsertCoordinate (aPnt3d.X(), aPnt3d.Y(), aPnt3d.Z());
   myShapeData->InsertVertex (theShapeId, anId, theMeshType);
 
 }
 
 //================================================================
 // Function : processPolyline
-// Purpose  : 
+// Purpose  :
 //================================================================
 void IVtkOCC_ShapeMesher::processPolyline (Standard_Integer          theNbNodes,
                                       const TColgp_Array1OfPnt&      thePoints,
@@ -319,7 +277,7 @@ void IVtkOCC_ShapeMesher::processPolyline (Standard_Integer          theNbNodes,
 
 //================================================================
 // Function : addEdge
-// Purpose  : 
+// Purpose  :
 //================================================================
 void IVtkOCC_ShapeMesher::addEdge (const TopoDS_Edge&  theEdge,
                                    const IVtk_IdType   theShapeId,
@@ -331,7 +289,7 @@ void IVtkOCC_ShapeMesher::addEdge (const TopoDS_Edge&  theEdge,
   }
 
   // Two discrete representations of an OCCT edge are possible:
-  // 1. Polygon on trinagulation - holds Ids of points
+  // 1. Polygon on triangulation - holds Ids of points
   // contained in Poly_Triangulation object
   Handle(Poly_PolygonOnTriangulation) aPolyOnTriangulation;
   Handle(Poly_Triangulation) aTriangulation;
@@ -354,7 +312,7 @@ void IVtkOCC_ShapeMesher::addEdge (const TopoDS_Edge&  theEdge,
     return;
   }
 
-  // Handle a non-identity transofmation applied to the edge
+  // Handle a non-identity transformation applied to the edge
   gp_Trsf anEdgeTransf;
   bool noTransform = true;
   if (!aLocation.IsIdentity())
@@ -401,10 +359,11 @@ void IVtkOCC_ShapeMesher::addEdge (const TopoDS_Edge&  theEdge,
 
 //================================================================
 // Function : addWFFace
-// Purpose  : 
+// Purpose  :
 //================================================================
-void IVtkOCC_ShapeMesher::addWFFace (const TopoDS_Face& theFace,
-                                     const IVtk_IdType  theShapeId)
+void IVtkOCC_ShapeMesher::addWFFace (const TopoDS_Face&  theFace,
+                                     const IVtk_IdType   theShapeId,
+                                     const Standard_Real theDeflection)
 {
   if (theFace.IsNull())
   {
@@ -434,16 +393,8 @@ void IVtkOCC_ShapeMesher::addWFFace (const TopoDS_Face& theFace,
     return;
   }
 
-  const Standard_Real aDeflection = GetDeflection();
-  Handle(Prs3d_Drawer) aDrawer = new Prs3d_Drawer();
-  aDrawer->SetUIsoAspect (new Prs3d_IsoAspect (Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0f, myNbIsos[0]));
-  aDrawer->SetVIsoAspect (new Prs3d_IsoAspect (Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0f, myNbIsos[1]));
-  aDrawer->SetDeviationAngle (myDevAngle);
-  aDrawer->SetDeviationCoefficient (myDevCoeff);
-  aDrawer->SetMaximalChordialDeviation (aDeflection);
-
   Prs3d_NListOfSequenceOfPnt aPolylines;
-  StdPrs_Isolines::Add (theFace, aDrawer, aDeflection, aPolylines, aPolylines);
+  StdPrs_Isolines::Add (theFace, GetShapeObj()->Attributes(), theDeflection, aPolylines, aPolylines);
   for (Prs3d_NListOfSequenceOfPnt::Iterator aPolyIter (aPolylines); aPolyIter.More(); aPolyIter.Next())
   {
     const Handle(TColgp_HSequenceOfPnt)& aPoints = aPolyIter.Value();
@@ -467,7 +418,7 @@ void IVtkOCC_ShapeMesher::addWFFace (const TopoDS_Face& theFace,
 
 //================================================================
 // Function : addShadedFace
-// Purpose  : 
+// Purpose  :
 //================================================================
 void IVtkOCC_ShapeMesher::addShadedFace (const TopoDS_Face& theFace,
                                          const IVtk_IdType  theShapeId)
@@ -479,7 +430,7 @@ void IVtkOCC_ShapeMesher::addShadedFace (const TopoDS_Face& theFace,
 
   // Build triangulation of the face.
   TopLoc_Location aLoc;
-  Handle(Poly_Triangulation) anOcctTriangulation = BRep_Tool::Triangulation (theFace, aLoc);
+  const Handle(Poly_Triangulation)& anOcctTriangulation = BRep_Tool::Triangulation (theFace, aLoc);
   if (anOcctTriangulation.IsNull())
   {
     return;
@@ -499,9 +450,7 @@ void IVtkOCC_ShapeMesher::addShadedFace (const TopoDS_Face& theFace,
   // Keep inserted points id's of triangulation in an array.
   NCollection_Array1<IVtk_PointId> aPointIds (1, aNbPoints);
   IVtk_PointId anId;
-
-  Standard_Integer anI;
-  for (anI = 1; anI <= aNbPoints; anI++)
+  for (Standard_Integer anI = 1; anI <= aNbPoints; anI++)
   {
     gp_Pnt aPoint = anOcctTriangulation->Node (anI);
 
@@ -516,9 +465,9 @@ void IVtkOCC_ShapeMesher::addShadedFace (const TopoDS_Face& theFace,
   }
 
   // Create triangles on the created triangulation points.
-  Standard_Integer aNbTriangles = anOcctTriangulation->NbTriangles();
+  const Standard_Integer aNbTriangles = anOcctTriangulation->NbTriangles();
   Standard_Integer aN1, aN2, aN3;
-  for (anI = 1; anI <= aNbTriangles; anI++)
+  for (Standard_Integer anI = 1; anI <= aNbTriangles; anI++)
   {
     anOcctTriangulation->Triangle (anI).Get (aN1, aN2, aN3); // get indexes of triangle's points
     // Insert new triangle on these points into output shape data.
index e2327d128d6f4d589d564a52696b57a2d8db804a..d369c2d5ae9aa28ecda0f3122454fcf9d62dfde8 100644 (file)
 #ifndef __IVTKOCC_SHAPEMESHER_H__
 #define __IVTKOCC_SHAPEMESHER_H__
 
-#include <BRepAdaptor_Surface.hxx>
 #include <IVtkOCC_Shape.hxx>
 #include <IVtk_IShapeMesher.hxx>
 #include <TColgp_Array1OfPnt.hxx>
-#include <TColgp_SequenceOfPnt.hxx>
 #include <TColStd_Array1OfInteger.hxx>
 #include <TopoDS.hxx>
 #include <TopoDS_Edge.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Vertex.hxx>
-#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
-#include <TopTools_ListOfShape.hxx>
 #include <TopTools_ShapeMapHasher.hxx>
 
 typedef NCollection_DataMap <TopoDS_Shape, IVtk_MeshType, TopTools_ShapeMapHasher> IVtk_ShapeTypeMap;
 typedef NCollection_Sequence <gp_Pnt> IVtk_Polyline;
 typedef NCollection_List <IVtk_Polyline> IVtk_PolylineList;
 
+class Prs3d_Drawer;
+
 class IVtkOCC_ShapeMesher;
 DEFINE_STANDARD_HANDLE( IVtkOCC_ShapeMesher, IVtk_IShapeMesher )
 
@@ -47,19 +45,11 @@ DEFINE_STANDARD_HANDLE( IVtkOCC_ShapeMesher, IVtk_IShapeMesher )
 class IVtkOCC_ShapeMesher : public IVtk_IShapeMesher
 {
 public:
-  IVtkOCC_ShapeMesher (const Standard_Real& theDevCoeff = 0.0001,
-                       const Standard_Real& theDevAngle = 12.0 * M_PI / 180.0,
-                       const Standard_Integer theNbUIsos = 1,
-                       const Standard_Integer theNbVIsos = 1)
- : myDevCoeff (theDevCoeff),
-   myDevAngle (theDevAngle),
-   myDeflection (0.0)
-  {
-    myNbIsos[0] = theNbUIsos;
-    myNbIsos[1] = theNbVIsos;
-  }
-
-  virtual ~IVtkOCC_ShapeMesher() { }
+  //! Main constructor.
+  Standard_EXPORT IVtkOCC_ShapeMesher();
+
+  //! Destructor.
+  Standard_EXPORT virtual ~IVtkOCC_ShapeMesher();
 
   //! Returns absolute deflection used by this algorithm.
   //! This value is calculated on the basis of the shape's bounding box.
@@ -71,28 +61,19 @@ public:
 
   //! Returns relative deviation coefficient used by this algorithm.
   //! @return relative deviation coefficient
-  Standard_Real GetDeviationCoeff() const
-  {
-    return myDevCoeff;
-  }
+  Standard_EXPORT Standard_Real GetDeviationCoeff() const;
 
   //! Returns deviation angle used by this algorithm.
   //! This is the maximum allowed angle between the normals to the 
   //! curve/surface and the normals to polyline/faceted representation.
   //! @return deviation angle (in radians)
-  Standard_Real GetDeviationAngle() const
-  {
-    return myDevAngle;
-  }
+  Standard_EXPORT Standard_Real GetDeviationAngle() const;
 
 protected:
   //! Executes the mesh generation algorithms. To be defined in implementation class.
   Standard_EXPORT virtual void internalBuild() Standard_OVERRIDE;
 
 private:
-  //! Internal method, generates OCCT triangulation starting from TopoDS_Shape
-  //! @see IVtkOCC_ShapeMesher::addEdge, IVtkOCC_ShapeMesher::addShadedFace
-  void meshShape();
 
   //! Extracts free vertices from the shape (i.e. those not belonging to any edge)
   //! and passes the geometry to IPolyData. 
@@ -102,12 +83,6 @@ private:
   //! Adds all the edges (free and non-free) to IPolyData.
   void addEdges();
 
-  //! Adds wireframe representations of all faces to IPolyData.
-  void addWireFrameFaces();
-
-  //! Adds shaded representations of all faces to IPolyData.
-  void addShadedFaces();
-
   //! Adds the point coordinates, connectivity info and
   //! sub-shape ID for the OCCT vertex.
   //!
@@ -130,20 +105,22 @@ private:
   //! Generates wireframe representation of the given TopoDS_Face object
   //! with help of OCCT algorithms. The resulting polylines are passed to IPolyData
   //! interface and associated with the given sub-shape ID.
-  //! @param [in] faceToMesh TopoDS_Face object to build wireframe representation for.
-  //! @param [in] shapeId The face' sub-shape ID 
-  void addWFFace (const TopoDS_Face&   theFace,
-                  const IVtk_IdType    theShapeId);
+  //! @param [in] theFace TopoDS_Face object to build wireframe representation for
+  //! @param [in] theShapeId The face' sub-shape ID
+  //! @param [in] theDeflection curve deflection
+  void addWFFace (const TopoDS_Face&  theFace,
+                  const IVtk_IdType   theShapeId,
+                  const Standard_Real theDeflection);
 
   //! Creates shaded representation of the given TopoDS_Face object
   //! starting from OCCT triangulation that should be created in advance. 
   //! The resulting triangles are passed to IPolyData
   //! interface and associated with the given sub-shape ID.
-  //! @param [in] faceToMesh TopoDS_Face object to build shaded representation for.
-  //! @param [in] shapeId The face' sub-shape ID
+  //! @param [in] theFace    TopoDS_Face object to build shaded representation for
+  //! @param [in] theShapeId the face' sub-shape ID
   //! @see IVtkOCC_ShapeMesher::meshShape, IVtkOCC_ShapeMesher::addEdge
-  void addShadedFace (const TopoDS_Face&   theFace,
-                      const IVtk_IdType    theShapeId);
+  void addShadedFace (const TopoDS_Face&  theFace,
+                      const IVtk_IdType   theShapeId);
 
   //! Internal helper method that unpacks the input arrays of points and 
   //! connectivity and creates the polyline using IPolyData interface.
@@ -164,11 +141,7 @@ private:
   DEFINE_STANDARD_RTTIEXT(IVtkOCC_ShapeMesher,IVtk_IShapeMesher)
 
 private:
-  IVtk_ShapeTypeMap     myEdgesTypes;
-  Standard_Real         myDevCoeff;
-  Standard_Real         myDevAngle;
-  mutable Standard_Real myDeflection;
-  Standard_Integer      myNbIsos[2];
+  IVtk_ShapeTypeMap myEdgesTypes;
 };
 
 #endif //  __IVTKOCC_SHAPEMESHER_H__
index f649d5ad5fa12bfc886f201a6910058cb7c5ffb3..4f1dcfd0e06eb1f32499103d2f2dbb452b1a5138 100644 (file)
 
 IMPLEMENT_STANDARD_RTTIEXT(IVtkOCC_ShapePickerAlgo,IVtk_IShapePickerAlgo)
 
-// Handle implementation
-
-
 //================================================================
 // Function : Constructor
-// Purpose  : 
+// Purpose  :
 //================================================================
 IVtkOCC_ShapePickerAlgo::IVtkOCC_ShapePickerAlgo() :
 myViewerSelector (new IVtkOCC_ViewerSelector())
@@ -36,7 +33,7 @@ myViewerSelector (new IVtkOCC_ViewerSelector())
 
 //================================================================
 // Function : Destructor
-// Purpose  : 
+// Purpose  :
 //================================================================
 IVtkOCC_ShapePickerAlgo::~IVtkOCC_ShapePickerAlgo()
 { }
@@ -57,30 +54,29 @@ void IVtkOCC_ShapePickerAlgo::SetView (const IVtk_IView::Handle& theView)
 IVtk_SelectionModeList IVtkOCC_ShapePickerAlgo::GetSelectionModes (
                                   const IVtk_IShape::Handle& theShape) const
 {
-  IVtk_SelectionModeList aRes;
-
-  if (! theShape.IsNull())
+  if (theShape.IsNull())
   {
-    // Get shape implementation from shape interface.
-    Handle(IVtkOCC_Shape) aShapeImpl = Handle(IVtkOCC_Shape)::DownCast(theShape);
+    return IVtk_SelectionModeList();
+  }
 
-    // Get selectable object from the shape implementation.
-    Handle(IVtkOCC_SelectableObject) aSelObj = 
-      Handle(IVtkOCC_SelectableObject)::DownCast(aShapeImpl->GetSelectableObject());
+  // Get shape implementation from shape interface.
+  Handle(IVtkOCC_Shape) aShapeImpl = Handle(IVtkOCC_Shape)::DownCast(theShape);
 
-    if (!aSelObj.IsNull())
+  // Get selectable object from the shape implementation.
+  Handle(IVtkOCC_SelectableObject) aSelObj = Handle(IVtkOCC_SelectableObject)::DownCast(aShapeImpl->GetSelectableObject());
+  if (aSelObj.IsNull())
+  {
+    return IVtk_SelectionModeList();
+  }
+
+  IVtk_SelectionModeList aRes;
+  for (IVtk_SelectionMode aSelMode = SM_Shape; aSelMode <= SM_Compound; aSelMode = (IVtk_SelectionMode)(aSelMode + 1))
+  {
+    if (myViewerSelector->IsActive (aSelObj, aSelMode))
     {
-      IVtk_SelectionMode aSelMode;
-      for (aSelMode = SM_Shape; aSelMode <= SM_Compound; aSelMode = (IVtk_SelectionMode)(aSelMode + 1))
-      {
-        if (myViewerSelector->IsActive (aSelObj, aSelMode))
-        {
-          aRes.Append (aSelMode);
-        }
-      }
+      aRes.Append (aSelMode);
     }
   }
-
   return aRes;
 }
 
@@ -102,8 +98,7 @@ void IVtkOCC_ShapePickerAlgo::SetSelectionMode (const IVtk_IShape::Handle& theSh
   // are destroyed when shapes are deactivated...
 
   // Get shape implementation from shape interface.
-  Handle(IVtkOCC_Shape) aShapeImpl = 
-    Handle(IVtkOCC_Shape)::DownCast(theShape);
+  Handle(IVtkOCC_Shape) aShapeImpl = Handle(IVtkOCC_Shape)::DownCast(theShape);
 
   // Get selectable object from the shape implementation.
   Handle(IVtkOCC_SelectableObject) aSelObj = 
@@ -180,11 +175,9 @@ void IVtkOCC_ShapePickerAlgo::SetSelectionMode (const IVtk_ShapePtrList& theShap
                                                 const IVtk_SelectionMode theMode,
                                                 const bool /*theIsTurnOn*/)
 {
-  IVtk_IShape::Handle aShape;
-  IVtk_ShapePtrList::Iterator anIt (theShapes);
-  for (; anIt.More(); anIt.Next())
+  for (IVtk_ShapePtrList::Iterator anIt (theShapes); anIt.More(); anIt.Next())
   {
-    aShape = anIt.Value();
+    IVtk_IShape::Handle aShape = anIt.Value();
     SetSelectionMode (aShape, theMode);
   }
 }
@@ -371,8 +364,7 @@ void IVtkOCC_ShapePickerAlgo::RemoveSelectableObject(const IVtk_IShape::Handle&
 {
   clearPicked();
   // Get shape implementation from shape interface.
-  Handle(IVtkOCC_Shape) aShapeImpl =
-    Handle(IVtkOCC_Shape)::DownCast(theShape);
+  Handle(IVtkOCC_Shape) aShapeImpl = Handle(IVtkOCC_Shape)::DownCast(theShape);
 
   // Get selectable object from the shape implementation.
   Handle(IVtkOCC_SelectableObject) aSelObj =
@@ -381,4 +373,4 @@ void IVtkOCC_ShapePickerAlgo::RemoveSelectableObject(const IVtk_IShape::Handle&
   myViewerSelector->RemoveSelectableObject(aSelObj);
   myViewerSelector->Clear();
   aShapeImpl->SetSelectableObject(NULL);
-}
\ No newline at end of file
+}
index 56d7cc09437705b9fbc80ca4074c76246356b278..cecbca2a7800e0b7d644981cef66244ceefa5e6a 100644 (file)
 // commercial license or contractual agreement.
 
 #include <IVtkOCC_ViewerSelector.hxx>
+
 #include <Select3D_SensitiveBox.hxx>
 #include <TColgp_Array1OfPnt2d.hxx>
 #include <Graphic3d_Camera.hxx>
 
-
 IMPLEMENT_STANDARD_RTTIEXT(IVtkOCC_ViewerSelector,SelectMgr_ViewerSelector)
 
 //============================================================================
@@ -27,8 +27,8 @@ IMPLEMENT_STANDARD_RTTIEXT(IVtkOCC_ViewerSelector,SelectMgr_ViewerSelector)
 //============================================================================
 IVtkOCC_ViewerSelector::IVtkOCC_ViewerSelector()
 : SelectMgr_ViewerSelector(),
-myPixTol(2),
-myToUpdateTol(Standard_True) 
+  myPixTol(2),
+  myToUpdateTol(Standard_True)
 {
 }
 
index 58a4ef9bb4e1f64fa0305d5d481f40b408df6b58..a818f9fcd400bda34e68c18b7c6dcdbce1ca8969 100644 (file)
@@ -25,7 +25,6 @@
 //! @brief Class that implements OCCT selection algorithm.
 //!
 //! Inspired by StdSelect_ViewerSelector3d class from OCCT 6.5.1
-
 class IVtkOCC_ViewerSelector : public SelectMgr_ViewerSelector
 {
 public:
@@ -66,4 +65,5 @@ private:
 };
 
 DEFINE_STANDARD_HANDLE( IVtkOCC_ViewerSelector, SelectMgr_ViewerSelector )
+
 #endif // __IVTKOCC_VIEWERSELECTOR_H__
index 35d81df80de1179ffe6468df0821ac75d0b569a6..a81e331e45db02af304e06b3d982d4e06fa16f49 100644 (file)
@@ -60,7 +60,7 @@ public:
 
 protected:
   //! Filter cells according to the given set of ids.
-  virtual int RequestData (vtkInformation *, vtkInformationVector **, vtkInformationVector *);
+  virtual int RequestData (vtkInformation *, vtkInformationVector **, vtkInformationVector *) Standard_OVERRIDE;
 
   IVtkTools_DisplayModeFilter();
   virtual ~IVtkTools_DisplayModeFilter();
index 2223e7a22b289ed91a381424949e3754a8b98b98..3f21035edba88ad27bbc40d42c26917ebf98e7ea 100644 (file)
@@ -38,10 +38,10 @@ vtkStandardNewMacro(IVtkTools_ShapeDataSource)
 
 //================================================================
 // Function : Constructor
-// Purpose  : 
+// Purpose  :
 //================================================================
 IVtkTools_ShapeDataSource::IVtkTools_ShapeDataSource()
-: myPolyData (new IVtkVTK_ShapeData),
+: myPolyData (new IVtkVTK_ShapeData()),
   myIsFastTransformMode (Standard_False),
   myIsTransformOnly (Standard_False)
 {
@@ -51,130 +51,112 @@ IVtkTools_ShapeDataSource::IVtkTools_ShapeDataSource()
 
 //================================================================
 // Function : Destructor
-// Purpose  : 
+// Purpose  :
 //================================================================
 IVtkTools_ShapeDataSource::~IVtkTools_ShapeDataSource()
-{ }
+{
+  //
+}
 
 //================================================================
 // Function : SetShape
-// Purpose  : 
+// Purpose  :
 //================================================================
 void IVtkTools_ShapeDataSource::SetShape (const IVtkOCC_Shape::Handle& theOccShape)
 {
-  if (myIsFastTransformMode && !myOccShape.IsNull() &&
-      theOccShape->GetShape().IsPartner (myOccShape->GetShape() ) )
-  {
-    myIsTransformOnly = Standard_True;
-  }
-  else
-  {
-    myIsTransformOnly = Standard_False;
-  }
-
+  myIsTransformOnly = myIsFastTransformMode
+                  && !myOccShape.IsNull()
+                  &&  theOccShape->GetShape().IsPartner (myOccShape->GetShape());
   myOccShape = theOccShape;
   this->Modified();
 }
 
-//================================================================
-// Function : GetShape
-// Purpose  : 
-//================================================================
-IVtkOCC_Shape::Handle IVtkTools_ShapeDataSource::GetShape()
-{
-  return myOccShape;
-}
-
 //================================================================
 // Function : RequestData
-// Purpose  : 
+// Purpose  :
 //================================================================
 int IVtkTools_ShapeDataSource::RequestData(vtkInformation        *vtkNotUsed(theRequest),
                                            vtkInformationVector **vtkNotUsed(theInputVector),
                                            vtkInformationVector  *theOutputVector)
 {
   vtkSmartPointer<vtkPolyData> aPolyData = vtkPolyData::GetData (theOutputVector);
-  if (aPolyData.GetPointer() != NULL)
+  if (aPolyData.GetPointer() == NULL)
   {
-    aPolyData->Allocate();
-    vtkSmartPointer<vtkPoints> aPts = vtkSmartPointer<vtkPoints>::New();
-    aPolyData->SetPoints (aPts);
+    return 1;
+  }
 
-    vtkSmartPointer<vtkPolyData> aTransformedData;
-    TopoDS_Shape aShape = myOccShape->GetShape();
-    TopLoc_Location aShapeLoc = aShape.Location();
+  aPolyData->Allocate();
+  vtkSmartPointer<vtkPoints> aPts = vtkSmartPointer<vtkPoints>::New();
+  aPolyData->SetPoints (aPts);
 
-    if (myIsTransformOnly)
+  vtkSmartPointer<vtkPolyData> aTransformedData;
+  TopoDS_Shape aShape = myOccShape->GetShape();
+  const TopLoc_Location aShapeLoc = aShape.Location();
+  if (myIsTransformOnly)
+  {
+    vtkSmartPointer<vtkPolyData> aPrevData = myPolyData->getVtkPolyData();
+    if (!aShapeLoc.IsIdentity())
     {
-      vtkSmartPointer<vtkPolyData> aPrevData = myPolyData->getVtkPolyData();
-      if ( !aShapeLoc.IsIdentity() )
-      {
-        aTransformedData = this->transform (aPrevData, aShapeLoc);
-      }
-      else
-      {
-        aTransformedData = aPrevData;
-      }
+      aTransformedData = this->transform (aPrevData, aShapeLoc);
     }
     else
     {
-      IVtkOCC_Shape::Handle aShapeWrapperCopy;
-      if ( myIsFastTransformMode && !aShapeLoc.IsIdentity() )
-      {
-        // Reset location before meshing
-        aShape.Location (TopLoc_Location());
-        aShapeWrapperCopy = new IVtkOCC_Shape (aShape);
-        aShapeWrapperCopy->SetId (myOccShape->GetId());
-      }
-      else
-      {
-        aShapeWrapperCopy = myOccShape;
-      }
-
-      myPolyData = new IVtkVTK_ShapeData;
-      IVtkOCC_ShapeMesher::Handle aMesher = new IVtkOCC_ShapeMesher;
-      aMesher->Build (aShapeWrapperCopy, myPolyData);
-      vtkSmartPointer<vtkPolyData> aMeshData = myPolyData->getVtkPolyData();
-
-      if ( myIsFastTransformMode && !aShapeLoc.IsIdentity() )
-      {
-        aTransformedData = this->transform (aMeshData, aShapeLoc);
-      }
-      else
-      {
-        aTransformedData = aMeshData;
-      }
+      aTransformedData = aPrevData;
+    }
+  }
+  else
+  {
+    IVtkOCC_Shape::Handle aShapeWrapperCopy = myOccShape;
+    if (myIsFastTransformMode
+    && !aShapeLoc.IsIdentity())
+    {
+      // Reset location before meshing
+      aShape.Location (TopLoc_Location());
+      aShapeWrapperCopy = new IVtkOCC_Shape (aShape);
+      aShapeWrapperCopy->SetAttributes (myOccShape->Attributes());
+      aShapeWrapperCopy->SetId (myOccShape->GetId());
     }
 
-    aPolyData->CopyStructure (aTransformedData);  // Copy points and cells
-    aPolyData->CopyAttributes (aTransformedData); // Copy data arrays (sub-shapes IDs)
-
-    // We store the OccShape instance in a IVtkTools_ShapeObject
-    // wrapper in vtkInformation object of vtkDataObject, then pass it
-    // to the actors through pipelines, so selection logic can access
-    // OccShape easily given the actor instance.
-    IVtkTools_ShapeObject::SetShapeSource (this, aPolyData);
-    aPolyData->GetAttributes (vtkDataObject::CELL)->SetPedigreeIds (SubShapeIDs());
+    myPolyData = new IVtkVTK_ShapeData();
+    IVtkOCC_ShapeMesher::Handle aMesher = new IVtkOCC_ShapeMesher();
+    aMesher->Build (aShapeWrapperCopy, myPolyData);
+    vtkSmartPointer<vtkPolyData> aMeshData = myPolyData->getVtkPolyData();
+    if (myIsFastTransformMode
+    && !aShapeLoc.IsIdentity())
+    {
+      aTransformedData = this->transform (aMeshData, aShapeLoc);
+    }
+    else
+    {
+      aTransformedData = aMeshData;
+    }
   }
 
+  aPolyData->CopyStructure  (aTransformedData); // Copy points and cells
+  aPolyData->CopyAttributes (aTransformedData); // Copy data arrays (sub-shapes IDs)
+
+  // We store the OccShape instance in a IVtkTools_ShapeObject
+  // wrapper in vtkInformation object of vtkDataObject, then pass it
+  // to the actors through pipelines, so selection logic can access
+  // OccShape easily given the actor instance.
+  IVtkTools_ShapeObject::SetShapeSource (this, aPolyData);
+  aPolyData->GetAttributes (vtkDataObject::CELL)->SetPedigreeIds (SubShapeIDs());
   return 1;
 }
 
 //================================================================
 // Function : SubShapeIDs
-// Purpose  : 
+// Purpose  :
 //================================================================
 vtkSmartPointer<vtkIdTypeArray> IVtkTools_ShapeDataSource::SubShapeIDs()
 {
-  vtkSmartPointer<vtkDataArray> arr = 
-    GetOutput()->GetCellData()->GetArray(IVtkVTK_ShapeData::ARRNAME_SUBSHAPE_IDS());
-  return vtkSmartPointer<vtkIdTypeArray>( 
-    vtkIdTypeArray::SafeDownCast(arr.GetPointer()) );
+  vtkSmartPointer<vtkDataArray> anArr = GetOutput()->GetCellData()->GetArray(IVtkVTK_ShapeData::ARRNAME_SUBSHAPE_IDS());
+  return vtkSmartPointer<vtkIdTypeArray> (vtkIdTypeArray::SafeDownCast (anArr.GetPointer()));
 }
 
 //================================================================
 // Function : GetId
-// Purpose  : 
+// Purpose  :
 //================================================================
 IVtk_IdType IVtkTools_ShapeDataSource::GetId() const
 {
@@ -183,16 +165,16 @@ IVtk_IdType IVtkTools_ShapeDataSource::GetId() const
 
 //================================================================
 // Function : Contains
-// Purpose  : 
+// Purpose  :
 //================================================================
-Standard_Boolean IVtkTools_ShapeDataSource::Contains (const IVtkOCC_Shape::Handle& shape) const
+Standard_Boolean IVtkTools_ShapeDataSource::Contains (const IVtkOCC_Shape::Handle& theShape) const
 {
-  return ((myOccShape == shape) ? Standard_True : Standard_False);
+  return myOccShape == theShape;
 }
 
 //================================================================
 // Function : transform
-// Purpose  : 
+// Purpose  :
 //================================================================
 vtkSmartPointer<vtkPolyData> IVtkTools_ShapeDataSource::transform (vtkPolyData* theSource,
                                                                    const gp_Trsf& theTrsf) const
@@ -205,10 +187,12 @@ vtkSmartPointer<vtkPolyData> IVtkTools_ShapeDataSource::transform (vtkPolyData*
   vtkSmartPointer<vtkTransform> aTransform = vtkSmartPointer<vtkTransform>::New();
   vtkSmartPointer<vtkMatrix4x4> aMx = vtkSmartPointer<vtkMatrix4x4>::New();
   for (Standard_Integer aRow = 0; aRow < 3; ++aRow)
+  {
     for (Standard_Integer aCol = 0; aCol < 4; ++aCol)
     {
       aMx->SetElement (aRow, aCol, theTrsf.Value (aRow + 1, aCol + 1) );
     }
+  }
 
   aTransform->SetMatrix (aMx);
   vtkSmartPointer<vtkTransformPolyDataFilter> aTrsfFilter
index 32ec632a2f90a6dabc8aca7f640f8bd35964c09a..094d12ca1530310f2c89810511385c2402c64bbb 100644 (file)
@@ -51,7 +51,8 @@ public: //! @name Initialization
 
   //! Get the source OCCT shape.
   //! @return occShape OCCT shape wrapper.
-  IVtkOCC_Shape::Handle GetShape();
+  const IVtkOCC_Shape::Handle& GetShape() { return myOccShape; }
+
   inline void FastTransformModeOn() { myIsFastTransformMode = true; }
   inline void FastTransformModeOff() { myIsFastTransformMode = false; }
 
@@ -82,7 +83,7 @@ protected: //! @name Interface to override
   //! @param theOutputVector [in] the pointer to output data, that is filled in this method.
   virtual int RequestData(vtkInformation* theRequest,
                           vtkInformationVector** theInputVector,
-                          vtkInformationVector* theOutputVector);
+                          vtkInformationVector* theOutputVector) Standard_OVERRIDE;
 
 protected: //! @name Internals
 
index 6fff02468f310062120028bef0f92015b8ac1cbc..f7a891816f237b6d6b248232161a41c9711a71d8 100644 (file)
@@ -39,7 +39,7 @@ class IVtkTools_ShapeDataSource;
 //! @class IVtkTools_ShapeObject
 //! @brief VTK holder class for OCC shapes to pass them through pipelines.
 //!
-//! It is descendent of vtkObject (data). Logically it is a one of milestones of VTK pipeline.
+//! It is descendant of vtkObject (data). Logically it is a one of milestones of VTK pipeline.
 //! It stores data of OCC shape (the OccShape instance) in vtkInformation object of vtkDataObject.
 //! Then pass it to the actors through pipelines,
 //! so selection logic can access OccShape easily given the actor instance.
index d1421355c16896cfd08a011dd44d614adb52f829..95d0dc19f17270d253a5c32bfedcb213b05a668a 100644 (file)
@@ -49,7 +49,7 @@ public:
 
   //! Pick entities in the given point.
   //! @return Number of detected entities.
-  int Pick (double theX, double theY, double theZ, vtkRenderer *theRenderer = NULL);
+  virtual int Pick (double theX, double theY, double theZ, vtkRenderer *theRenderer = NULL) Standard_OVERRIDE;
 
   //! Pick entities in the given rectangle area.
   //! @return Number of detected entities.
index e263a020f5c0c81212b8934f3b9b0b850c6080d9..1ea839c5ad1dbe50637e8c99825a2b65ecdf2e1e 100644 (file)
@@ -60,7 +60,7 @@ public:
 protected:
   //! @brief Filter cells according to the given set of ids.
   //! Note: Data arrays are not passed through if filtering is turned on.
-  virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
+  virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) Standard_OVERRIDE;
 
   IVtkTools_SubPolyDataFilter();
   virtual ~IVtkTools_SubPolyDataFilter();
index f0165bec1568e1a6f79622fc03ee827e3773e17f..1544edfa6439b4a26e97ebaead1c6ad3b7a034ec 100644 (file)
@@ -13,7 +13,6 @@
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-
 #include <IVtkVTK_View.hxx>
 
 // prevent disabling some MSVC warning messages by VTK headers 
diff --git a/tests/vtk/ivtk/autotriang b/tests/vtk/ivtk/autotriang
new file mode 100644 (file)
index 0000000..30289c4
--- /dev/null
@@ -0,0 +1,19 @@
+puts "============"
+puts "0032247: VIS, IVtkOCC_ShapeMesher - allow disabling auto-triangulation behavior"
+puts "============"
+puts ""
+
+pload MODELING VIS
+psphere s 1
+explode s F
+tessellate r s_1 10 10
+trinfo r
+checktrinfo r -tri 200
+
+ivtkinit
+ivtkdefaults -autoTriang 0
+ivtkdisplay r
+ivtksetdispmode 1
+checktrinfo r -tri 200
+
+ivtkdump $imagedir/${casename}.png