#include <TopoDS.hxx>
#include <TopTools_ListOfShape.hxx>
+
+#include <TopExp.hxx>
+#include <vtkAppendPolyData.h>
+#include <vtkPolyData.h>
+#include <BRepBuilderAPI_Copy.hxx>
+
#define MAX2(X, Y) (Abs(X) > Abs(Y) ? Abs(X) : Abs(Y))
#define MAX3(X, Y, Z) (MAX2(MAX2(X,Y), Z))
}
}
}
+
+ 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;
+
+ 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();
+
+ myVertexSource->Delete();
+ myIsolatedEdgeSource->Delete();
+ myOneFaceEdgeSource->Delete();
+ mySharedEdgeSource->Delete();
+ myWireframeFaceSource->Delete();
+ myShadingFaceSource->Delete();
+
+ vtkPolyData* ret = vtkPolyData::New();
+ ret->ShallowCopy(myAppendFilter->GetOutput());
+ myAppendFilter->Delete();
+ return ret;
+ }
+ catch(Standard_Failure) {
+ return 0;
+ }
+ }
}
class GEOM_EdgeSource;
class GEOM_WireframeFace;
class GEOM_ShadingFace;
-
+class vtkPolyData;
namespace GEOM
{
// moved from GEOM_AssemblyBuilder
GEOM_EdgeSource* theSharedEdgeSource,
GEOM_WireframeFace* theWireframeFaceSource,
GEOM_ShadingFace* theShadingFaceSource);
+
+ OCC2VTK_EXPORT vtkPolyData* GetData(const TopoDS_Shape& theShape, float theDeflection);
}
#endif // OCC2VTK_TOOLS_H
MESSAGE( "Export VTK into file " << aFileName );
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( myWireframeFaceSource->GetOutputPort() ); // iso-lines are unnecessary
- 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, aDeflection );
-
- 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();
-
// Set "C" numeric locale to save numbers correctly
Kernel_Utils::Localizer loc;
- vtkPolyDataWriter* aWriter = vtkPolyDataWriter::New();
- aWriter->SetInputConnection( myAppendFilter->GetOutputPort() );
+ vtkPolyData* pd = GEOM::GetData( aShape, aDeflection );
+ vtkPolyDataWriter* aWriter = vtkPolyDataWriter::New();
+ aWriter->SetInputData( pd );
aWriter->SetFileName( aFileName.ToCString() );
aWriter->Write();
aWriter->Delete();
-
- myVertexSource->Delete();
- myIsolatedEdgeSource->Delete();
- myOneFaceEdgeSource->Delete();
- mySharedEdgeSource->Delete();
- myWireframeFaceSource->Delete();
- myShadingFaceSource->Delete();
-
- myAppendFilter->Delete();
-
- if(!wasMeshed)
- BRepTools::Clean(aShape);
+ pd->Delete(); //instanciated by the GEOM::GetData(...) method
return 1;
}