SMESH_subMesh *subMesh = GetSubMesh(aSubShape);
SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS();
- if ( subMeshDS && subMeshDS->IsComplexSubmesh() )
+ if ( subMeshDS && subMeshDS->IsComplexSubmesh() ) // group of sub-shapes and maybe of not sub-
{
+ MESSAGE("AddHypothesis() to complex submesh");
// return the worst but not fatal state of all group memebers
SMESH_Hypothesis::Hypothesis_Status aBestRet, aWorstNotFatal, ret;
aBestRet = SMESH_Hypothesis::HYP_BAD_DIM;
aWorstNotFatal = SMESH_Hypothesis::HYP_OK;
for ( TopoDS_Iterator itS ( aSubShape ); itS.More(); itS.Next())
{
+ if ( !GetMeshDS()->ShapeToIndex( itS.Value() ))
+ continue; // not sub-shape
ret = AddHypothesis( itS.Value(), anHypId );
if ( !SMESH_Hypothesis::IsStatusFatal( ret ) && ret > aWorstNotFatal )
aWorstNotFatal = ret;
aWorstNotFatal = SMESH_Hypothesis::HYP_OK;
for ( TopoDS_Iterator itS ( aSubShape ); itS.More(); itS.Next())
{
+ if ( !GetMeshDS()->ShapeToIndex( itS.Value() ))
+ continue; // not sub-shape
ret = RemoveHypothesis( itS.Value(), anHypId );
if ( !SMESH_Hypothesis::IsStatusFatal( ret ) && ret > aWorstNotFatal )
aWorstNotFatal = ret;
return aSubMesh;
}
+//=============================================================================
+/*!
+ * Get the SMESH_subMesh object implementation. Dont create it, return null
+ * if it does not exist.
+ */
+//=============================================================================
+
+SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const int aShapeID)
+throw(SALOME_Exception)
+{
+ Unexpect aCatch(SalomeException);
+
+ map <int, SMESH_subMesh *>::iterator i_sm = _mapSubMesh.find(aShapeID);
+ if (i_sm == _mapSubMesh.end())
+ return NULL;
+ return i_sm->second;
+}
+
//=======================================================================
//function : IsUsedHypothesis
//purpose : Return True if anHyp is used to mesh aSubShape
int Nb = 0;
SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator();
- while(itFaces->more()) if(itFaces->next()->NbNodes()==3) Nb++;
+ //while(itFaces->more()) if(itFaces->next()->NbNodes()==3) Nb++;
+ const SMDS_MeshFace * curFace;
+ while (itFaces->more()) {
+ curFace = itFaces->next();
+ if (!curFace->IsPoly() && curFace->NbNodes() == 3) Nb++;
+ }
return Nb;
}
int Nb = 0;
SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator();
- while(itFaces->more()) if(itFaces->next()->NbNodes()==4) Nb++;
+ //while(itFaces->more()) if(itFaces->next()->NbNodes()==4) Nb++;
+ const SMDS_MeshFace * curFace;
+ while (itFaces->more()) {
+ curFace = itFaces->next();
+ if (!curFace->IsPoly() && curFace->NbNodes() == 4) Nb++;
+ }
+ return Nb;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+/// Return the number of polygonal faces in the mesh. This method run in O(n)
+///////////////////////////////////////////////////////////////////////////////
+int SMESH_Mesh::NbPolygons() throw(SALOME_Exception)
+{
+ Unexpect aCatch(SalomeException);
+ int Nb = 0;
+ SMDS_FaceIteratorPtr itFaces = _myMeshDS->facesIterator();
+ while (itFaces->more())
+ if (itFaces->next()->IsPoly()) Nb++;
return Nb;
}
Unexpect aCatch(SalomeException);
int Nb = 0;
SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator();
- while(itVolumes->more()) if(itVolumes->next()->NbNodes()==4) Nb++;
+ //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==4) Nb++;
+ const SMDS_MeshVolume * curVolume;
+ while (itVolumes->more()) {
+ curVolume = itVolumes->next();
+ if (!curVolume->IsPoly() && curVolume->NbNodes() == 4) Nb++;
+ }
return Nb;
}
Unexpect aCatch(SalomeException);
int Nb = 0;
SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator();
- while(itVolumes->more()) if(itVolumes->next()->NbNodes()==8) Nb++;
+ //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==8) Nb++;
+ const SMDS_MeshVolume * curVolume;
+ while (itVolumes->more()) {
+ curVolume = itVolumes->next();
+ if (!curVolume->IsPoly() && curVolume->NbNodes() == 8) Nb++;
+ }
return Nb;
}
Unexpect aCatch(SalomeException);
int Nb = 0;
SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator();
- while(itVolumes->more()) if(itVolumes->next()->NbNodes()==5) Nb++;
+ //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==5) Nb++;
+ const SMDS_MeshVolume * curVolume;
+ while (itVolumes->more()) {
+ curVolume = itVolumes->next();
+ if (!curVolume->IsPoly() && curVolume->NbNodes() == 5) Nb++;
+ }
return Nb;
}
Unexpect aCatch(SalomeException);
int Nb = 0;
SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator();
- while(itVolumes->more()) if(itVolumes->next()->NbNodes()==6) Nb++;
+ //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==6) Nb++;
+ const SMDS_MeshVolume * curVolume;
+ while (itVolumes->more()) {
+ curVolume = itVolumes->next();
+ if (!curVolume->IsPoly() && curVolume->NbNodes() == 6) Nb++;
+ }
+ return Nb;
+}
+
+int SMESH_Mesh::NbPolyhedrons() throw(SALOME_Exception)
+{
+ Unexpect aCatch(SalomeException);
+ int Nb = 0;
+ SMDS_VolumeIteratorPtr itVolumes = _myMeshDS->volumesIterator();
+ while (itVolumes->more())
+ if (itVolumes->next()->IsPoly()) Nb++;
return Nb;
}
save << "===========================================================================" << endl;
return save;
}
+
+//=======================================================================
+//function : GetElementType
+//purpose : Returns type of mesh element with certain id
+//=======================================================================
+SMDSAbs_ElementType SMESH_Mesh::GetElementType( const int id, const bool iselem )
+{
+ return _myMeshDS->GetElementType( id, iselem );
+}