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.
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)
{
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)
{
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;
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()
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 :
"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."
//===========================================================
IVtkDraw_HighlightAndSelectionPipeline::IVtkDraw_HighlightAndSelectionPipeline (const TopoDS_Shape& theShape,
- const Standard_Integer theShapeID)
+ const Standard_Integer theShapeID,
+ const Handle(Prs3d_Drawer)& theDrawerLink)
: Standard_Transient()
{
/* ===========================
* ======================== */
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);
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)
public:
IVtkDraw_HighlightAndSelectionPipeline (const TopoDS_Shape& theShape,
- const Standard_Integer theShapeID);
+ const Standard_Integer theShapeID,
+ const Handle(Prs3d_Drawer)& theDrawerLink);
~IVtkDraw_HighlightAndSelectionPipeline() {}
public:
#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),
{
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);
}
//============================================================================
// 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)
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
anOcctShape,
aTypeOfSel,
aDeflection,
- myOCCTDrawer->DeviationAngle(),
- isAutoTriangulation);
+ aDrawer->DeviationAngle(),
+ aDrawer->IsAutoTriangulation());
}
catch (const Standard_Failure& anException)
{
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
private:
IVtkOCC_Shape::Handle myShape;
Bnd_Box myBndBox;
- Handle(Prs3d_Drawer) myOCCTDrawer;
};
#endif // __IVTKOCC_SELECTABLEOBJECT_H__
// 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();
}
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
{
}
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))
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;
}
}
//! @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
//!
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
};
#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.
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()
{
//================================================================
// Function : addEdges
-// Purpose :
+// Purpose :
//================================================================
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,
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,
//================================================================
// Function : addEdge
-// Purpose :
+// Purpose :
//================================================================
void IVtkOCC_ShapeMesher::addEdge (const TopoDS_Edge& theEdge,
const IVtk_IdType theShapeId,
}
// 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;
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())
//================================================================
// 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())
{
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();
//================================================================
// Function : addShadedFace
-// Purpose :
+// Purpose :
//================================================================
void IVtkOCC_ShapeMesher::addShadedFace (const TopoDS_Face& theFace,
const IVtk_IdType theShapeId)
// 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;
// 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);
}
// 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.
#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 )
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.
//! 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.
//! 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.
//!
//! 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.
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__
IMPLEMENT_STANDARD_RTTIEXT(IVtkOCC_ShapePickerAlgo,IVtk_IShapePickerAlgo)
-// Handle implementation
-
-
//================================================================
// Function : Constructor
-// Purpose :
+// Purpose :
//================================================================
IVtkOCC_ShapePickerAlgo::IVtkOCC_ShapePickerAlgo() :
myViewerSelector (new IVtkOCC_ViewerSelector())
//================================================================
// Function : Destructor
-// Purpose :
+// Purpose :
//================================================================
IVtkOCC_ShapePickerAlgo::~IVtkOCC_ShapePickerAlgo()
{ }
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;
}
// 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 =
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);
}
}
{
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 =
myViewerSelector->RemoveSelectableObject(aSelObj);
myViewerSelector->Clear();
aShapeImpl->SetSelectableObject(NULL);
-}
\ No newline at end of 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)
//============================================================================
//============================================================================
IVtkOCC_ViewerSelector::IVtkOCC_ViewerSelector()
: SelectMgr_ViewerSelector(),
-myPixTol(2),
-myToUpdateTol(Standard_True)
+ myPixTol(2),
+ myToUpdateTol(Standard_True)
{
}
//! @brief Class that implements OCCT selection algorithm.
//!
//! Inspired by StdSelect_ViewerSelector3d class from OCCT 6.5.1
-
class IVtkOCC_ViewerSelector : public SelectMgr_ViewerSelector
{
public:
};
DEFINE_STANDARD_HANDLE( IVtkOCC_ViewerSelector, SelectMgr_ViewerSelector )
+
#endif // __IVTKOCC_VIEWERSELECTOR_H__
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();
//================================================================
// Function : Constructor
-// Purpose :
+// Purpose :
//================================================================
IVtkTools_ShapeDataSource::IVtkTools_ShapeDataSource()
-: myPolyData (new IVtkVTK_ShapeData),
+: myPolyData (new IVtkVTK_ShapeData()),
myIsFastTransformMode (Standard_False),
myIsTransformOnly (Standard_False)
{
//================================================================
// 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
{
//================================================================
// 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
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
//! 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; }
//! @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
//! @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.
//! 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.
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();
// 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
--- /dev/null
+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