From 3483c644536ada397bf80db3f7fcf622cb6ed22f Mon Sep 17 00:00:00 2001 From: kgv Date: Fri, 26 Mar 2021 12:37:10 +0300 Subject: [PATCH] 0032247: VIS, IVtkOCC_ShapeMesher - allow disabling auto-triangulation behavior 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. --- src/IVtk/IVtk_IShapeMesher.cxx | 15 +- src/IVtk/IVtk_IShapeMesher.hxx | 4 + src/IVtkDraw/IVtkDraw.cxx | 119 ++++++++- ...IVtkDraw_HighlightAndSelectionPipeline.cxx | 5 +- ...IVtkDraw_HighlightAndSelectionPipeline.hxx | 5 +- src/IVtkOCC/IVtkOCC_SelectableObject.cxx | 67 ++--- src/IVtkOCC/IVtkOCC_SelectableObject.hxx | 1 - src/IVtkOCC/IVtkOCC_Shape.cxx | 33 ++- src/IVtkOCC/IVtkOCC_Shape.hxx | 19 +- src/IVtkOCC/IVtkOCC_ShapeMesher.cxx | 233 +++++++----------- src/IVtkOCC/IVtkOCC_ShapeMesher.hxx | 65 ++--- src/IVtkOCC/IVtkOCC_ShapePickerAlgo.cxx | 62 ++--- src/IVtkOCC/IVtkOCC_ViewerSelector.cxx | 6 +- src/IVtkOCC/IVtkOCC_ViewerSelector.hxx | 2 +- src/IVtkTools/IVtkTools_DisplayModeFilter.hxx | 2 +- src/IVtkTools/IVtkTools_ShapeDataSource.cxx | 158 ++++++------ src/IVtkTools/IVtkTools_ShapeDataSource.hxx | 5 +- src/IVtkTools/IVtkTools_ShapeObject.hxx | 2 +- src/IVtkTools/IVtkTools_ShapePicker.hxx | 2 +- src/IVtkTools/IVtkTools_SubPolyDataFilter.hxx | 2 +- src/IVtkVTK/IVtkVTK_View.cxx | 1 - tests/vtk/ivtk/autotriang | 19 ++ 22 files changed, 433 insertions(+), 394 deletions(-) create mode 100644 tests/vtk/ivtk/autotriang diff --git a/src/IVtk/IVtk_IShapeMesher.cxx b/src/IVtk/IVtk_IShapeMesher.cxx index 10f18405ab..afd9f68205 100644 --- a/src/IVtk/IVtk_IShapeMesher.cxx +++ b/src/IVtk/IVtk_IShapeMesher.cxx @@ -17,10 +17,10 @@ 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) { diff --git a/src/IVtk/IVtk_IShapeMesher.hxx b/src/IVtk/IVtk_IShapeMesher.hxx index 6f740b436b..62bcbbe4af 100644 --- a/src/IVtk/IVtk_IShapeMesher.hxx +++ b/src/IVtk/IVtk_IShapeMesher.hxx @@ -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; diff --git a/src/IVtkDraw/IVtkDraw.cxx b/src/IVtkDraw/IVtkDraw.cxx index b3edff3b2d..b459f0c4ab 100644 --- a/src/IVtkDraw/IVtkDraw.cxx +++ b/src/IVtkDraw/IVtkDraw.cxx @@ -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." diff --git a/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.cxx b/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.cxx index 07328f16fd..b6fa1399aa 100644 --- a/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.cxx +++ b/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.cxx @@ -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::New(); - IVtkOCC_Shape::Handle anIVtkShape = new IVtkOCC_Shape (theShape); + IVtkOCC_Shape::Handle anIVtkShape = new IVtkOCC_Shape (theShape, theDrawerLink); anIVtkShape->SetId (theShapeID); vtkSmartPointer aDataSource = vtkSmartPointer::New(); aDataSource->SetShape (anIVtkShape); diff --git a/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.hxx b/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.hxx index 9e8a4e028a..7084def3b3 100644 --- a/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.hxx +++ b/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.hxx @@ -37,6 +37,8 @@ typedef NCollection_DataMap > DisplayModeFiltersMap; typedef NCollection_DataMap > 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: diff --git a/src/IVtkOCC/IVtkOCC_SelectableObject.cxx b/src/IVtkOCC/IVtkOCC_SelectableObject.cxx index 51656276a0..f17a1cbf52 100644 --- a/src/IVtkOCC/IVtkOCC_SelectableObject.cxx +++ b/src/IVtkOCC/IVtkOCC_SelectableObject.cxx @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -27,12 +28,9 @@ 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 diff --git a/src/IVtkOCC/IVtkOCC_SelectableObject.hxx b/src/IVtkOCC/IVtkOCC_SelectableObject.hxx index 2a80cb82ce..1488d6e53a 100644 --- a/src/IVtkOCC/IVtkOCC_SelectableObject.hxx +++ b/src/IVtkOCC/IVtkOCC_SelectableObject.hxx @@ -73,7 +73,6 @@ private: private: IVtkOCC_Shape::Handle myShape; Bnd_Box myBndBox; - Handle(Prs3d_Drawer) myOCCTDrawer; }; #endif // __IVTKOCC_SELECTABLEOBJECT_H__ diff --git a/src/IVtkOCC/IVtkOCC_Shape.cxx b/src/IVtkOCC/IVtkOCC_Shape.cxx index fd12c1db86..1d9a065fdb 100644 --- a/src/IVtkOCC/IVtkOCC_Shape.cxx +++ b/src/IVtkOCC/IVtkOCC_Shape.cxx @@ -14,20 +14,29 @@ // commercial license or contractual agreement. #include + #include 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)) diff --git a/src/IVtkOCC/IVtkOCC_Shape.hxx b/src/IVtkOCC/IVtkOCC_Shape.hxx index 11a4f160ec..31f3fb8ce2 100644 --- a/src/IVtkOCC/IVtkOCC_Shape.hxx +++ b/src/IVtkOCC/IVtkOCC_Shape.hxx @@ -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 }; diff --git a/src/IVtkOCC/IVtkOCC_ShapeMesher.cxx b/src/IVtkOCC/IVtkOCC_ShapeMesher.cxx index a06571dcc4..f0caffdcf6 100644 --- a/src/IVtkOCC/IVtkOCC_ShapeMesher.cxx +++ b/src/IVtkOCC/IVtkOCC_ShapeMesher.cxx @@ -15,54 +15,62 @@ #include -#include #include #include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include #include #include #include -#include #include #include -#include #include #include #include -#include -#include #include #include +#include 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()) + if (IVtkOCC_Shape::Handle aShape = GetShapeObj()) { - return; + return aShape->Attributes()->DeviationCoefficient(); } + return 0.0; +} - //Clean triangulation before compute incremental mesh - BRepTools::Clean (anOcctShape); - - //Compute triangulation - Standard_Real aDeflection = GetDeflection(); - if (aDeflection < Precision::Confusion()) +//================================================================ +// Function : GetDeviationAngle +// Purpose : +//================================================================ +Standard_Real IVtkOCC_ShapeMesher::GetDeviationAngle() const +{ + if (IVtkOCC_Shape::Handle aShape = GetShapeObj()) { - return; - } - - 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) - { - 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 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. diff --git a/src/IVtkOCC/IVtkOCC_ShapeMesher.hxx b/src/IVtkOCC/IVtkOCC_ShapeMesher.hxx index e2327d128d..d369c2d5ae 100644 --- a/src/IVtkOCC/IVtkOCC_ShapeMesher.hxx +++ b/src/IVtkOCC/IVtkOCC_ShapeMesher.hxx @@ -16,24 +16,22 @@ #ifndef __IVTKOCC_SHAPEMESHER_H__ #define __IVTKOCC_SHAPEMESHER_H__ -#include #include #include #include -#include #include #include #include #include #include -#include -#include #include typedef NCollection_DataMap IVtk_ShapeTypeMap; typedef NCollection_Sequence IVtk_Polyline; typedef NCollection_List 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; - } + //! Main constructor. + Standard_EXPORT IVtkOCC_ShapeMesher(); - virtual ~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__ diff --git a/src/IVtkOCC/IVtkOCC_ShapePickerAlgo.cxx b/src/IVtkOCC/IVtkOCC_ShapePickerAlgo.cxx index f649d5ad5f..4f1dcfd0e0 100644 --- a/src/IVtkOCC/IVtkOCC_ShapePickerAlgo.cxx +++ b/src/IVtkOCC/IVtkOCC_ShapePickerAlgo.cxx @@ -23,12 +23,9 @@ 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); - - // Get selectable object from the shape implementation. - Handle(IVtkOCC_SelectableObject) aSelObj = - Handle(IVtkOCC_SelectableObject)::DownCast(aShapeImpl->GetSelectableObject()); - - if (!aSelObj.IsNull()) - { - IVtk_SelectionMode aSelMode; - for (aSelMode = SM_Shape; aSelMode <= SM_Compound; aSelMode = (IVtk_SelectionMode)(aSelMode + 1)) - { - if (myViewerSelector->IsActive (aSelObj, aSelMode)) - { - aRes.Append (aSelMode); - } - } - } + return IVtk_SelectionModeList(); } + // Get shape implementation from shape interface. + Handle(IVtkOCC_Shape) aShapeImpl = Handle(IVtkOCC_Shape)::DownCast(theShape); + + // 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)) + { + 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 +} diff --git a/src/IVtkOCC/IVtkOCC_ViewerSelector.cxx b/src/IVtkOCC/IVtkOCC_ViewerSelector.cxx index 56d7cc0943..cecbca2a78 100644 --- a/src/IVtkOCC/IVtkOCC_ViewerSelector.cxx +++ b/src/IVtkOCC/IVtkOCC_ViewerSelector.cxx @@ -14,11 +14,11 @@ // commercial license or contractual agreement. #include + #include #include #include - 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) { } diff --git a/src/IVtkOCC/IVtkOCC_ViewerSelector.hxx b/src/IVtkOCC/IVtkOCC_ViewerSelector.hxx index 58a4ef9bb4..a818f9fcd4 100644 --- a/src/IVtkOCC/IVtkOCC_ViewerSelector.hxx +++ b/src/IVtkOCC/IVtkOCC_ViewerSelector.hxx @@ -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__ diff --git a/src/IVtkTools/IVtkTools_DisplayModeFilter.hxx b/src/IVtkTools/IVtkTools_DisplayModeFilter.hxx index 35d81df80d..a81e331e45 100644 --- a/src/IVtkTools/IVtkTools_DisplayModeFilter.hxx +++ b/src/IVtkTools/IVtkTools_DisplayModeFilter.hxx @@ -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(); diff --git a/src/IVtkTools/IVtkTools_ShapeDataSource.cxx b/src/IVtkTools/IVtkTools_ShapeDataSource.cxx index 2223e7a22b..3f21035edb 100644 --- a/src/IVtkTools/IVtkTools_ShapeDataSource.cxx +++ b/src/IVtkTools/IVtkTools_ShapeDataSource.cxx @@ -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 aPolyData = vtkPolyData::GetData (theOutputVector); - if (aPolyData.GetPointer() != NULL) + if (aPolyData.GetPointer() == NULL) { - aPolyData->Allocate(); - vtkSmartPointer aPts = vtkSmartPointer::New(); - aPolyData->SetPoints (aPts); + return 1; + } - vtkSmartPointer aTransformedData; - TopoDS_Shape aShape = myOccShape->GetShape(); - TopLoc_Location aShapeLoc = aShape.Location(); + aPolyData->Allocate(); + vtkSmartPointer aPts = vtkSmartPointer::New(); + aPolyData->SetPoints (aPts); - if (myIsTransformOnly) + vtkSmartPointer aTransformedData; + TopoDS_Shape aShape = myOccShape->GetShape(); + const TopLoc_Location aShapeLoc = aShape.Location(); + if (myIsTransformOnly) + { + vtkSmartPointer aPrevData = myPolyData->getVtkPolyData(); + if (!aShapeLoc.IsIdentity()) { - vtkSmartPointer 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 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 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 IVtkTools_ShapeDataSource::SubShapeIDs() { - vtkSmartPointer arr = - GetOutput()->GetCellData()->GetArray(IVtkVTK_ShapeData::ARRNAME_SUBSHAPE_IDS()); - return vtkSmartPointer( - vtkIdTypeArray::SafeDownCast(arr.GetPointer()) ); + vtkSmartPointer anArr = GetOutput()->GetCellData()->GetArray(IVtkVTK_ShapeData::ARRNAME_SUBSHAPE_IDS()); + return vtkSmartPointer (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 IVtkTools_ShapeDataSource::transform (vtkPolyData* theSource, const gp_Trsf& theTrsf) const @@ -205,10 +187,12 @@ vtkSmartPointer IVtkTools_ShapeDataSource::transform (vtkPolyData* vtkSmartPointer aTransform = vtkSmartPointer::New(); vtkSmartPointer aMx = vtkSmartPointer::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 aTrsfFilter diff --git a/src/IVtkTools/IVtkTools_ShapeDataSource.hxx b/src/IVtkTools/IVtkTools_ShapeDataSource.hxx index 32ec632a2f..094d12ca15 100644 --- a/src/IVtkTools/IVtkTools_ShapeDataSource.hxx +++ b/src/IVtkTools/IVtkTools_ShapeDataSource.hxx @@ -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 diff --git a/src/IVtkTools/IVtkTools_ShapeObject.hxx b/src/IVtkTools/IVtkTools_ShapeObject.hxx index 6fff02468f..f7a891816f 100644 --- a/src/IVtkTools/IVtkTools_ShapeObject.hxx +++ b/src/IVtkTools/IVtkTools_ShapeObject.hxx @@ -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. diff --git a/src/IVtkTools/IVtkTools_ShapePicker.hxx b/src/IVtkTools/IVtkTools_ShapePicker.hxx index d1421355c1..95d0dc19f1 100644 --- a/src/IVtkTools/IVtkTools_ShapePicker.hxx +++ b/src/IVtkTools/IVtkTools_ShapePicker.hxx @@ -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. diff --git a/src/IVtkTools/IVtkTools_SubPolyDataFilter.hxx b/src/IVtkTools/IVtkTools_SubPolyDataFilter.hxx index e263a020f5..1ea839c5ad 100644 --- a/src/IVtkTools/IVtkTools_SubPolyDataFilter.hxx +++ b/src/IVtkTools/IVtkTools_SubPolyDataFilter.hxx @@ -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(); diff --git a/src/IVtkVTK/IVtkVTK_View.cxx b/src/IVtkVTK/IVtkVTK_View.cxx index f0165bec15..1544edfa64 100644 --- a/src/IVtkVTK/IVtkVTK_View.cxx +++ b/src/IVtkVTK/IVtkVTK_View.cxx @@ -13,7 +13,6 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #include // 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 index 0000000000..30289c4472 --- /dev/null +++ b/tests/vtk/ivtk/autotriang @@ -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