+
+//================================================================================
+//
+// Implementation of SMESH_MeshPartDS
+//
+SMESH_MeshPartDS::SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr meshPart):
+ SMESHDS_Mesh( /*meshID=*/-1, /*isEmbeddedMode=*/true)
+{
+ SMESH::SMESH_Mesh_var mesh = meshPart->GetMesh();
+ SMESH_Mesh_i* mesh_i = SMESH::DownCast<SMESH_Mesh_i*>( mesh );
+
+ _meshDS = mesh_i->GetImpl().GetMeshDS();
+
+ SetPersistentId( _meshDS->GetPersistentId() );
+
+ if ( mesh_i == SMESH::DownCast<SMESH_Mesh_i*>( meshPart ))
+ {
+ // <meshPart> is the whole mesh
+ myInfo = _meshDS->GetMeshInfo(); // copy mesh info;
+ // copy groups
+ set<SMESHDS_GroupBase*>& myGroupSet = const_cast<set<SMESHDS_GroupBase*>&>( GetGroups() );
+ myGroupSet = _meshDS->GetGroups();
+ }
+ else
+ {
+ TMeshInfo tmpInfo;
+ SMESH::long_array_var anIDs = meshPart->GetIDs();
+ SMESH::array_of_ElementType_var types = meshPart->GetTypes();
+ if ( types->length() == 1 && types[0] == SMESH::NODE ) // group of nodes
+ {
+ for (int i=0; i < anIDs->length(); i++)
+ if ( const SMDS_MeshNode * n = _meshDS->FindNode(anIDs[i]))
+ if ( _elements[ SMDSAbs_Node ].insert( n ).second )
+ tmpInfo.Add( n );
+ }
+ else
+ {
+ for (int i=0; i < anIDs->length(); i++)
+ if ( const SMDS_MeshElement * e = _meshDS->FindElement(anIDs[i]))
+ if ( _elements[ e->GetType() ].insert( e ).second )
+ {
+ tmpInfo.Add( e );
+ SMDS_ElemIteratorPtr nIt = e->nodesIterator();
+ while ( nIt->more() )
+ {
+ const SMDS_MeshNode * n = (const SMDS_MeshNode*) nIt->next();
+ if ( _elements[ SMDSAbs_Node ].insert( n ).second )
+ tmpInfo.Add( n );
+ }
+ }
+ }
+ myInfo = tmpInfo;
+
+ _meshDS = 0; // to enforce iteration on _elements and _nodes
+ }
+}
+// -------------------------------------------------------------------------------------
+SMESH_MeshPartDS::SMESH_MeshPartDS(const std::list< const SMDS_MeshElement* > & meshPart):
+ SMESHDS_Mesh( /*meshID=*/-1, /*isEmbeddedMode=*/true), _meshDS(0)
+{
+ TMeshInfo tmpInfo;
+ list< const SMDS_MeshElement* >::const_iterator partIt = meshPart.begin();
+ for ( ; partIt != meshPart.end(); ++partIt )
+ if ( const SMDS_MeshElement * e = *partIt )
+ if ( _elements[ e->GetType() ].insert( e ).second )
+ {
+ tmpInfo.Add( e );
+ SMDS_ElemIteratorPtr nIt = e->nodesIterator();
+ while ( nIt->more() )
+ {
+ const SMDS_MeshNode * n = (const SMDS_MeshNode*) nIt->next();
+ if ( _elements[ SMDSAbs_Node ].insert( n ).second )
+ tmpInfo.Add( n );
+ }
+ }
+ myInfo = tmpInfo;
+}
+// -------------------------------------------------------------------------------------
+SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementGeomIterator(SMDSAbs_GeometryType geomType) const
+{
+ if ( _meshDS ) return _meshDS->elementGeomIterator( geomType );
+
+ typedef SMDS_SetIterator
+ <const SMDS_MeshElement*,
+ TIDSortedElemSet::const_iterator,
+ SMDS::SimpleAccessor<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator>,
+ SMDS_MeshElement::GeomFilter
+ > TIter;
+
+ SMDSAbs_ElementType type = SMDS_MeshCell::toSmdsType( geomType );
+
+ return SMDS_ElemIteratorPtr( new TIter( _elements[type].begin(),
+ _elements[type].end(),
+ SMDS_MeshElement::GeomFilter( geomType )));
+}
+// -------------------------------------------------------------------------------------
+SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementEntityIterator(SMDSAbs_EntityType entity) const
+{
+ if ( _meshDS ) return _meshDS->elementEntityIterator( entity );
+
+ typedef SMDS_SetIterator
+ <const SMDS_MeshElement*,
+ TIDSortedElemSet::const_iterator,
+ SMDS::SimpleAccessor<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator>,
+ SMDS_MeshElement::EntityFilter
+ > TIter;
+
+ SMDSAbs_ElementType type = SMDS_MeshCell::toSmdsType( entity );
+
+ return SMDS_ElemIteratorPtr( new TIter( _elements[type].begin(),
+ _elements[type].end(),
+ SMDS_MeshElement::EntityFilter( entity )));
+}
+// -------------------------------------------------------------------------------------
+SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementsIterator(SMDSAbs_ElementType type) const
+{
+ typedef SMDS_SetIterator<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator > TIter;
+ if ( type == SMDSAbs_All && !_meshDS )
+ {
+ typedef vector< SMDS_ElemIteratorPtr > TIterVec;
+ TIterVec iterVec;
+ for ( int i = 0; i < SMDSAbs_NbElementTypes; ++i )
+ if ( !_elements[i].empty() && i != SMDSAbs_Node )
+ iterVec.push_back
+ ( SMDS_ElemIteratorPtr( new TIter( _elements[i].begin(), _elements[i].end() )));
+
+ typedef SMDS_IteratorOnIterators<const SMDS_MeshElement*, TIterVec > TIterOnIters;
+ return SMDS_ElemIteratorPtr( new TIterOnIters( iterVec ));
+ }
+ return _meshDS ? _meshDS->elementsIterator(type) : SMDS_ElemIteratorPtr
+ ( new TIter( _elements[type].begin(), _elements[type].end() ));
+}
+// -------------------------------------------------------------------------------------
+#define _GET_ITER_DEFINE( iterType, methName, elem, elemType) \
+ iterType SMESH_MeshPartDS::methName( bool idInceasingOrder) const \
+ { \
+ typedef SMDS_SetIterator<const elem*, TIDSortedElemSet::const_iterator > TIter; \
+ return _meshDS ? _meshDS->methName(idInceasingOrder) : iterType \
+ ( new TIter( _elements[elemType].begin(), _elements[elemType].end() )); \
+ }
+// -------------------------------------------------------------------------------------
+_GET_ITER_DEFINE( SMDS_NodeIteratorPtr, nodesIterator, SMDS_MeshNode, SMDSAbs_Node )
+_GET_ITER_DEFINE( SMDS_EdgeIteratorPtr, edgesIterator, SMDS_MeshEdge, SMDSAbs_Edge )
+_GET_ITER_DEFINE( SMDS_FaceIteratorPtr, facesIterator, SMDS_MeshFace, SMDSAbs_Face )
+_GET_ITER_DEFINE( SMDS_VolumeIteratorPtr, volumesIterator, SMDS_MeshVolume, SMDSAbs_Volume)
+#undef _GET_ITER_DEFINE
+//
+// END Implementation of SMESH_MeshPartDS
+//
+//================================================================================
+
+