X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOCC2VTK%2FOCC2VTK_Tools.cxx;h=b67dc829dd37d26a9a6fd20096cd0c6dc5870b16;hb=f312091eb5bf90096c0a8d4d0ed4be68f34fbd9b;hp=3614b390b56143db73defd402855484a2e9976c4;hpb=407cadd372e3b984e4edf56e5898d57c129432ef;p=modules%2Fgeom.git diff --git a/src/OCC2VTK/OCC2VTK_Tools.cxx b/src/OCC2VTK/OCC2VTK_Tools.cxx index 3614b390b..b67dc829d 100755 --- a/src/OCC2VTK/OCC2VTK_Tools.cxx +++ b/src/OCC2VTK/OCC2VTK_Tools.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -23,6 +23,7 @@ #include "GEOM_EdgeSource.h" #include "GEOM_WireframeFace.h" #include "GEOM_ShadingFace.h" +#include "GEOMUtils.hxx" #include #include @@ -35,74 +36,34 @@ #include #include -#define MAX2(X, Y) (Abs(X) > Abs(Y) ? Abs(X) : Abs(Y)) -#define MAX3(X, Y, Z) (MAX2(MAX2(X,Y), Z)) - -#define DEFAULT_DEFLECTION 0.001 +#include +#include +#include +#include namespace GEOM { - void MeshShape(const TopoDS_Shape theShape, - float& theDeflection, - bool theForced ) { - - Standard_Real aDeflection = theDeflection <= 0 ? DEFAULT_DEFLECTION : theDeflection; - - //If deflection <= 0, than return default deflection - if(theDeflection <= 0) - theDeflection = aDeflection; - - // Is shape triangulated? - Standard_Boolean alreadymeshed = Standard_True; - TopExp_Explorer ex; - TopLoc_Location aLoc; - for (ex.Init(theShape, 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()) { - alreadymeshed = Standard_False; - break; - } - } - - if(!alreadymeshed || theForced) { - Bnd_Box B; - BRepBndLib::Add(theShape, B); - if ( B.IsVoid() ) - return; // NPAL15983 (Bug when displaying empty groups) - Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; - B.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); - - // This magic line comes from Prs3d_ShadedShape.gxx in OCCT - aDeflection = MAX3(aXmax-aXmin, aYmax-aYmin, aZmax-aZmin) * aDeflection * 4; - - //Clean triangulation before compute incremental mesh - BRepTools::Clean(theShape); - - //Compute triangulation - BRepMesh_IncrementalMesh MESH(theShape,aDeflection); - } - } - - void SetShape(const TopoDS_Shape& theShape, - const TopTools_IndexedDataMapOfShapeListOfShape& theEdgeMap, - bool theIsVector, - GEOM_EdgeSource* theIsolatedEdgeSource, - GEOM_EdgeSource* theOneFaceEdgeSource, - GEOM_EdgeSource* theSharedEdgeSource, - GEOM_WireframeFace* theWireframeFaceSource, - GEOM_ShadingFace* theShadingFaceSource) + void ShapeToVTK( const TopoDS_Shape& theShape, + const TopTools_IndexedDataMapOfShapeListOfShape& theEdgeMap, + bool theIsVector, + GEOM_VertexSource* theStandaloneVertexSource, + GEOM_EdgeSource* theIsolatedEdgeSource, + GEOM_EdgeSource* theOneFaceEdgeSource, + GEOM_EdgeSource* theSharedEdgeSource, + GEOM_WireframeFace* theWireframeFaceSource, + GEOM_ShadingFace* theShadingFaceSource ) { if (theShape.ShapeType() == TopAbs_COMPOUND) { TopoDS_Iterator anItr(theShape); for (; anItr.More(); anItr.Next()) { - SetShape(anItr.Value(),theEdgeMap,theIsVector, - theIsolatedEdgeSource, - theOneFaceEdgeSource, - theSharedEdgeSource, - theWireframeFaceSource, - theShadingFaceSource); + ShapeToVTK( anItr.Value(),theEdgeMap,theIsVector, + theStandaloneVertexSource, + theIsolatedEdgeSource, + theOneFaceEdgeSource, + theSharedEdgeSource, + theWireframeFaceSource, + theShadingFaceSource ); } } @@ -123,6 +84,10 @@ namespace GEOM break; } case TopAbs_VERTEX: { + if ( theStandaloneVertexSource ) { + const TopoDS_Vertex& aVertex = TopoDS::Vertex(theShape); + theStandaloneVertexSource->AddVertex(aVertex); + } break; } default: { @@ -153,4 +118,69 @@ namespace GEOM } } } + + vtkPolyData* GetVTKData( const TopoDS_Shape& theShape, float theDeflection ) + { + vtkPolyData* ret = 0; + + BRepBuilderAPI_Copy aCopy(theShape); + if (aCopy.IsDone() ) { + + 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; + + GEOMUtils::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 ); + + ShapeToVTK( aShape, + anEdgeMap, + anIsVector, + 0, + myIsolatedEdgeSource, + myOneFaceEdgeSource, + mySharedEdgeSource, + myWireframeFaceSource, + myShadingFaceSource ); + + myAppendFilter->Update(); + + myVertexSource->Delete(); + myIsolatedEdgeSource->Delete(); + myOneFaceEdgeSource->Delete(); + mySharedEdgeSource->Delete(); + myWireframeFaceSource->Delete(); + myShadingFaceSource->Delete(); + + ret = vtkPolyData::New(); + ret->ShallowCopy(myAppendFilter->GetOutput()); + myAppendFilter->Delete(); + } + catch(Standard_Failure) { + } + } + return ret; + } }