mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2024-11-11 16:19:17 +05:00
ParaView / PARAVIS improvements 2014: 2.6.3/2.6.4: Geometry & Mesh plug-ins in the ParaVis module
This commit is contained in:
parent
cbdcb3694d
commit
4b8228f9ab
@ -35,6 +35,12 @@
|
||||
#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))
|
||||
|
||||
@ -159,4 +165,68 @@ 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;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -91,80 +91,16 @@ Standard_Integer VTKPlugin_ExportDriver::Execute( TFunction_Logbook& log ) const
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user