From e7cf13445bc3478ff9e3b8d3dc6d242300961437 Mon Sep 17 00:00:00 2001 From: ema Date: Tue, 25 Nov 2014 15:50:47 +0300 Subject: [PATCH] Implementation of 2.6.3/2.6.4 improvements --- src/OCC2VTK/OCC2VTK_Tools.cxx | 80 +++++++++++++++++++++++++++++++++++ src/OCC2VTK/OCC2VTK_Tools.h | 4 +- 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/src/OCC2VTK/OCC2VTK_Tools.cxx b/src/OCC2VTK/OCC2VTK_Tools.cxx index e9b592035..b9b16b135 100755 --- a/src/OCC2VTK/OCC2VTK_Tools.cxx +++ b/src/OCC2VTK/OCC2VTK_Tools.cxx @@ -35,6 +35,12 @@ #include #include + +#include +#include +#include +#include + #define MAX2(X, Y) (Abs(X) > Abs(Y) ? Abs(X) : Abs(Y)) #define MAX3(X, Y, Z) (MAX2(MAX2(X,Y), Z)) @@ -159,4 +165,78 @@ namespace GEOM } } } + + vtkPolyData* GetData(const TopoDS_Shape& theShape, float theDeflection) + { + BRepBuilderAPI_Copy aCopy(theShape); + if(!aCopy.IsDone()) + { + return 0; + } + TopoDS_Shape aShape = aCopy.Shape(); + + try + { + GEOM_VertexSource* myVertexSource = GEOM_VertexSource::New(); + GEOM_EdgeSource* myIsolatedEdgeSource = GEOM_EdgeSource::New(); + GEOM_EdgeSource* myOneFaceEdgeSource = GEOM_EdgeSource::New(); + GEOM_EdgeSource* mySharedEdgeSource = GEOM_EdgeSource::New(); + GEOM_WireframeFace* myWireframeFaceSource = GEOM_WireframeFace::New(); + GEOM_ShadingFace* myShadingFaceSource = GEOM_ShadingFace::New(); + + vtkAppendPolyData* myAppendFilter = vtkAppendPolyData::New(); + myAppendFilter->AddInputConnection( myVertexSource->GetOutputPort() ); + myAppendFilter->AddInputConnection( myIsolatedEdgeSource->GetOutputPort() ); + myAppendFilter->AddInputConnection( myOneFaceEdgeSource->GetOutputPort() ); + myAppendFilter->AddInputConnection( mySharedEdgeSource->GetOutputPort() ); + + myAppendFilter->AddInputConnection( myShadingFaceSource->GetOutputPort() ); + + bool anIsVector = false; + + // Is shape triangulated? + bool wasMeshed = true; + TopExp_Explorer ex; + TopLoc_Location aLoc; + for (ex.Init(aShape, TopAbs_FACE); ex.More(); ex.Next()) + { + const TopoDS_Face& aFace = TopoDS::Face(ex.Current()); + Handle(Poly_Triangulation) aPoly = BRep_Tool::Triangulation(aFace,aLoc); + if(aPoly.IsNull()) + { + wasMeshed = false; + break; + } + } + GEOM::MeshShape( aShape, theDeflection ); + TopExp_Explorer aVertexExp( aShape, TopAbs_VERTEX ); + for( ; aVertexExp.More(); aVertexExp.Next() ) + { + const TopoDS_Vertex& aVertex = TopoDS::Vertex( aVertexExp.Current() ); + myVertexSource->AddVertex( aVertex ); + } + + TopTools_IndexedDataMapOfShapeListOfShape anEdgeMap; + TopExp::MapShapesAndAncestors( aShape, TopAbs_EDGE, TopAbs_FACE, anEdgeMap ); + + GEOM::SetShape( aShape, + anEdgeMap, + anIsVector, + 0, + myIsolatedEdgeSource, + myOneFaceEdgeSource, + mySharedEdgeSource, + myWireframeFaceSource, + myShadingFaceSource ); + + myAppendFilter->Update(); + + return myAppendFilter->GetOutput(); + } + catch(Standard_Failure) + { + return 0; + } + } + } diff --git a/src/OCC2VTK/OCC2VTK_Tools.h b/src/OCC2VTK/OCC2VTK_Tools.h index 523ca14b9..9ca546550 100755 --- a/src/OCC2VTK/OCC2VTK_Tools.h +++ b/src/OCC2VTK/OCC2VTK_Tools.h @@ -29,7 +29,7 @@ class GEOM_VertexSource; class GEOM_EdgeSource; class GEOM_WireframeFace; class GEOM_ShadingFace; - +class vtkPolyData; namespace GEOM { // moved from GEOM_AssemblyBuilder @@ -47,6 +47,8 @@ namespace GEOM GEOM_EdgeSource* theSharedEdgeSource, GEOM_WireframeFace* theWireframeFaceSource, GEOM_ShadingFace* theShadingFaceSource); + + OCC2VTK_EXPORT vtkPolyData* GetData(const TopoDS_Shape& theShape, float theDeflection); } #endif // OCC2VTK_TOOLS_H -- 2.39.2