else
{
Bnd_Box box;
- BRepBndLib::Add( myShape, box );
if ( myShape.ShapeType() == TopAbs_FACE )
{
BRepAdaptor_Surface SA( TopoDS::Face( myShape ), /*useBoundaries=*/false );
if ( SA.GetType() == GeomAbs_BSplineSurface )
- {
- box.SetVoid();
BRepBndLib::AddOptimal( myShape, box,
/*useTriangulation=*/true, /*useShapeTolerance=*/true );
- }
}
+ if ( box.IsVoid() )
+ BRepBndLib::Add( myShape, box );
myBox.Clear();
myBox.Add( box.CornerMin() );
myBox.Add( box.CornerMax() );
#include <vtkCell.h>
#include <vtkIdList.h>
-_GetVtkNodes::_GetVtkNodes( vtkIdList* _vtkIdList,
+_GetVtkNodes::_GetVtkNodes( TVtkIdList& vtkIds,
SMDS_Mesh* mesh,
int vtkCellId,
- SMDSAbs_EntityType aType )
+ SMDSAbs_EntityType type )
{
- vtkUnstructuredGrid* grid = mesh->GetGrid();
- const std::vector<int>& interlace = SMDS_MeshCell::fromVtkOrder( aType );
+ vtkUnstructuredGrid* grid = mesh->GetGrid();
+ const std::vector<int>& interlace = SMDS_MeshCell::fromVtkOrder( type );
+ vtkIdType npts, *pts;
+ grid->GetCellPoints( vtkCellId, npts, pts );
+ vtkIds.resize( npts );
if ( interlace.empty() )
{
- grid->GetCellPoints( vtkCellId, _vtkIdList );
+ vtkIds.assign( pts, pts + npts );
}
else
{
- vtkIdType npts, *pts;
- grid->GetCellPoints( vtkCellId, npts, pts );
- _vtkIdList->SetNumberOfIds( npts );
- for (int i = 0; i < npts; i++)
- _vtkIdList->SetId(i, pts[interlace[i]]);
+ for (vtkIdType i = 0; i < npts; i++)
+ vtkIds[ i ] = pts[ interlace[i] ];
}
}
-_GetVtkNodesToUNV::_GetVtkNodesToUNV( vtkIdList* _vtkIdList,
+_GetVtkNodesToUNV::_GetVtkNodesToUNV( TVtkIdList& vtkIds,
SMDS_Mesh* mesh,
int vtkCellId,
- SMDSAbs_EntityType aType )
+ SMDSAbs_EntityType type )
{
- vtkIdType * pts, npts;
vtkUnstructuredGrid* grid = mesh->GetGrid();
- grid->GetCellPoints( (vtkIdType)vtkCellId, npts, pts );
+ vtkIdType npts, *pts;
+ grid->GetCellPoints( vtkCellId, npts, pts );
const int *ids = 0;
- switch (aType)
+ switch ( type )
{
case SMDSEntity_Quad_Edge:
{
case SMDSEntity_Polyhedra:
case SMDSEntity_Quad_Polyhedra:
default:
- const std::vector<int>& i = SMDS_MeshCell::interlacedSmdsOrder( aType, npts );
+ const std::vector<int>& i = SMDS_MeshCell::interlacedSmdsOrder( type, npts );
if ( !i.empty() )
ids = & i[0];
}
- _vtkIdList->SetNumberOfIds( npts );
+ vtkIds.resize( npts );
if ( ids )
for (int i = 0; i < npts; i++)
- _vtkIdList->SetId(i, pts[ids[i]]);
+ vtkIds[ i ] = pts[ ids[i] ];
else
- for (int i = 0; i < npts; i++)
- _vtkIdList->SetId(i, pts[i]);
+ vtkIds.assign( pts, pts + npts );
}
-_GetVtkNodesPolyh::_GetVtkNodesPolyh( vtkIdList* _vtkIdList,
+_GetVtkNodesPolyh::_GetVtkNodesPolyh( TVtkIdList& vtkIds,
SMDS_Mesh* mesh,
int vtkCellId,
- SMDSAbs_EntityType aType )
+ SMDSAbs_EntityType type )
{
vtkUnstructuredGrid* grid = mesh->GetGrid();
- switch (aType)
+ switch ( type )
{
case SMDSEntity_Polyhedra:
{
vtkIdType* ptIds = 0;
grid->GetFaceStream( vtkCellId, nFaces, ptIds );
int id = 0, nbNodesInFaces = 0;
- for (int i = 0; i < nFaces; i++)
+ for ( int i = 0; i < nFaces; i++ )
{
int nodesInFace = ptIds[id]; // nodeIds in ptIds[id+1 .. id+nodesInFace]
nbNodesInFaces += nodesInFace;
id += (nodesInFace + 1);
}
- _vtkIdList->SetNumberOfIds( nbNodesInFaces );
+ vtkIds.resize( nbNodesInFaces );
id = 0;
int n = 0;
- for (int i = 0; i < nFaces; i++)
+ for ( int i = 0; i < nFaces; i++ )
{
int nodesInFace = ptIds[id]; // nodeIds in ptIds[id+1 .. id+nodesInFace]
- for (int k = 1; k <= nodesInFace; k++)
- _vtkIdList->SetId(n++, ptIds[id + k]);
+ for ( int k = 1; k <= nodesInFace; k++ )
+ vtkIds[ n++ ] = ptIds[ id + k ];
id += (nodesInFace + 1);
}
break;
#include "SMDSAbs_ElementType.hxx"
#include <vtkCell.h>
-#include <vtkIdList.h>
+
+typedef std::vector< vtkIdType > TVtkIdList;
//--------------------------------------------------------------------------------
/*!
*/
struct _GetVtkNodes
{
- _GetVtkNodes( vtkIdList* nodeIds, SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type);
+ _GetVtkNodes( TVtkIdList& nodeIds, SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type);
};
struct _GetVtkNodesToUNV
{
- _GetVtkNodesToUNV( vtkIdList* nodeIds, SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type);
+ _GetVtkNodesToUNV( TVtkIdList& nodeIds, SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type);
};
struct _GetVtkNodesPolyh
{
- _GetVtkNodesPolyh( vtkIdList* nodeIds, SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type);
+ _GetVtkNodesPolyh( TVtkIdList& nodeIds, SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type);
};
//--------------------------------------------------------------------------------
typedef typename SMDS_ITERATOR::value_type result_type;
SMDS_VtkCellIterator(SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType aType)
- : _mesh(mesh), _index(0), _vtkIdList( vtkIdList::New() )
+ : _mesh(mesh), _index(0)
{
GET_VTK_NODES getNodes( _vtkIdList, mesh, vtkCellId, aType );
}
- virtual ~SMDS_VtkCellIterator() { _vtkIdList->Delete(); }
- virtual bool more() { return ( _index < _vtkIdList->GetNumberOfIds() ); }
+ virtual ~SMDS_VtkCellIterator() {}
+ virtual bool more() { return ( _index < _vtkIdList.size() ); }
virtual result_type next() {
- vtkIdType id = _vtkIdList->GetId( _index++ );
+ vtkIdType id = _vtkIdList[ _index++ ];
return static_cast<result_type>( _mesh->FindNodeVtk( id ));
}
protected:
SMDS_Mesh* _mesh;
- int _index;
- vtkIdList* _vtkIdList;
+ size_t _index;
+ TVtkIdList _vtkIdList;
};
//--------------------------------------------------------------------------------
using namespace std;
-typedef map< const SMDS_MeshElement*, int > TNodePointIDMap;
+typedef std::map< const SMDS_MeshElement*, int > TNodePointIDMap;
+typedef std::list< TopoDS_Edge > TWire;
#define smdsNode( elem ) static_cast<const SMDS_MeshNode*>( elem )
// If there are several wires, define the order of edges of inner wires:
// compute UV of inner edge-points using 2 methods: the one for in-face points
// and the one for on-edge points and then choose the best edge order
- // by the best correspondence of the 2 results
+ // by the best correspondence of the 2 results.
+ // The wires are sorted by number of edges to correspond to wires of the pattern
if ( nbWires > 1 )
{
// compute UV of inner edge-points using the method for in-face points
// and divide eList into a list of separate wires
bool aBool;
- list< list< TopoDS_Edge > > wireList;
+ list< TWire > wireList;
list<TopoDS_Edge>::iterator eIt = elIt;
list<int>::iterator nbEIt = nbVertexInWires.begin();
for ( nbEIt++; nbEIt != nbVertexInWires.end(); nbEIt++ )
{
int nbEdges = *nbEIt;
wireList.push_back( list< TopoDS_Edge >() );
- list< TopoDS_Edge > & wire = wireList.back();
+ TWire & wire = wireList.back();
for ( iE = 0 ; iE < nbEdges; eIt++, iE++ )
{
list< TPoint* > & ePoints = getShapePoints( *eIt );
// find points - edge correspondence for wires of unique size,
// edge order within a wire should be defined only
- list< list< TopoDS_Edge > >::iterator wlIt = wireList.begin();
+ list< TWire >::iterator wlIt = wireList.begin();
while ( wlIt != wireList.end() )
{
- list< TopoDS_Edge >& wire = (*wlIt);
+ TWire& wire = (*wlIt);
size_t nbEdges = wire.size();
wlIt++;
- if ( wlIt != wireList.end() && (*wlIt).size() != nbEdges ) // a unique size wire
+ if ( wlIt == wireList.end() || (*wlIt).size() != nbEdges ) // a unique size wire
{
// choose the best first edge of a wire
setFirstEdge( wire, id1 );
edgesPoints->insert( edgesPoints->end(), ePoints.begin(), (--ePoints.end()));
}
}
+ else
+ {
+ // skip same size wires
+ while ( wlIt != wireList.end() && (*wlIt).size() == nbEdges )
+ wlIt++;
+ }
id1 += nbEdges;
}
while ( wlIt != wireList.end() )
{
size_t nbSameSize = 0, nbEdges = (*wlIt).size();
- list< list< TopoDS_Edge > >::iterator wlIt2 = wlIt;
+ list< TWire >::iterator wlIt2 = wlIt;
wlIt2++;
while ( wlIt2 != wireList.end() && (*wlIt2).size() == nbEdges ) { // a same size wire
nbSameSize++;
for ( wlIt = wireList.begin(); wlIt != wireList.end(); wlIt++ )
{
- list< TopoDS_Edge >& wire = (*wlIt);
+ TWire& wire = (*wlIt);
eList.splice( eList.end(), wire, wire.begin(), wire.end() );
}
SMESH_Pattern::TPoint::TPoint()
{
#ifdef _DEBUG_
- myInitXYZ.SetCoord(0,0,0);
- myInitUV.SetCoord(0.,0.);
- myInitU = 0;
- myXYZ.SetCoord(0,0,0);
- myUV.SetCoord(0.,0.);
- myU = 0;
+ myInitXYZ.SetCoord(7,7,7);
+ myInitUV.SetCoord(7.,7.);
+ myInitU = 7;
+ myXYZ.SetCoord(7,7,7);
+ myUV.SetCoord(7.,7.);
+ myU = 7;
#endif
}
{
list< OwnListenerData >::iterator d;
for ( d = _ownListeners.begin(); d != _ownListeners.end(); ++d )
- if ( _father != d->mySubMesh->_father )
+ if ( _father != d->mySubMesh->_father &&
+ _father->FindMesh( d->myMeshID ))
d->mySubMesh->_father->Load();
// map< EventListener*, EventListenerData* >::iterator l_d = _eventListeners.begin();