X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Mesh.cxx;h=d4497448fd32b96f40963be8cfc1e179cf23d757;hp=06dd09d73e758a8a6d9297986c2da72c0aae0d02;hb=ab6b16e673b44c983e261331181bcec90be2e920;hpb=935adb05a1481e5d73714c87a8570178afc3f5a4 diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 06dd09d73..d4497448f 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -267,14 +267,17 @@ SMESH_Hypothesis::Hypothesis_Status 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; @@ -380,6 +383,8 @@ SMESH_Hypothesis::Hypothesis_Status 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; @@ -660,6 +665,24 @@ throw(SALOME_Exception) 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 ::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 @@ -833,7 +856,12 @@ int SMESH_Mesh::NbTriangles() throw(SALOME_Exception) 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; } @@ -846,7 +874,25 @@ int SMESH_Mesh::NbQuadrangles() throw(SALOME_Exception) 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; } @@ -866,7 +912,12 @@ int SMESH_Mesh::NbTetras() throw(SALOME_Exception) 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; } @@ -875,7 +926,12 @@ int SMESH_Mesh::NbHexas() throw(SALOME_Exception) 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; } @@ -884,7 +940,12 @@ int SMESH_Mesh::NbPyramids() throw(SALOME_Exception) 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; } @@ -893,7 +954,22 @@ int SMESH_Mesh::NbPrisms() throw(SALOME_Exception) 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; } @@ -992,8 +1068,8 @@ void SMESH_Mesh::RemoveGroup (const int theGroupID) if (_mapGroup.find(theGroupID) == _mapGroup.end()) return; GetMeshDS()->RemoveGroup( _mapGroup[theGroupID]->GetGroupDS() ); - delete _mapGroup[theGroupID]; _mapGroup.erase (theGroupID); + delete _mapGroup[theGroupID]; } //============================================================================= @@ -1004,11 +1080,10 @@ void SMESH_Mesh::RemoveGroup (const int theGroupID) //============================================================================= const SMESH_Hypothesis* SMESH_Mesh::IsLocal1DHypothesis (const TopoDS_Shape& theEdge) { - SMESH_HypoFilter filter( SMESH_HypoFilter::HasDim( 1 )); - filter.AndNot( SMESH_HypoFilter::IsAlgo() ); - filter.AndNot( SMESH_HypoFilter::IsGlobal( GetMeshDS()->ShapeToMesh() )); + SMESH_HypoFilter hypo ( SMESH_HypoFilter::HasDim( 1 )); + hypo.AndNot( hypo.IsAlgo() ).AndNot( hypo.IsAssignedTo( GetMeshDS()->ShapeToMesh() )); - return GetHypothesis( theEdge, filter, true ); + return GetHypothesis( theEdge, hypo, true ); } //============================================================================= @@ -1031,7 +1106,8 @@ bool SMESH_Mesh::IsPropagatedHypothesis (const TopoDS_Shape& theEdge, { int nbChains = _mapPropagationChains.Extent(); for (int i = 1; i <= nbChains; i++) { - const TopTools_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromIndex(i); + //const TopTools_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromIndex(i); + const SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromIndex(i); if (aChain.Contains(theEdge)) { theMainEdge = _mapPropagationChains.FindKey(i); return true; @@ -1052,7 +1128,7 @@ bool SMESH_Mesh::IsReversedInChain (const TopoDS_Shape& theEdge, if ( !theMainEdge.IsNull() && !theEdge.IsNull() && _mapPropagationChains.Contains( theMainEdge )) { - const TopTools_IndexedMapOfShape& aChain = + const SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromKey( theMainEdge ); int index = aChain.FindIndex( theEdge ); if ( index ) @@ -1068,7 +1144,7 @@ bool SMESH_Mesh::IsReversedInChain (const TopoDS_Shape& theEdge, //============================================================================= void SMESH_Mesh::CleanMeshOnPropagationChain (const TopoDS_Shape& theMainEdge) { - const TopTools_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromKey(theMainEdge); + const SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromKey(theMainEdge); int i, nbEdges = aChain.Extent(); for (i = 1; i <= nbEdges; i++) { TopoDS_Shape anEdge = aChain.FindKey(i); @@ -1135,7 +1211,7 @@ bool SMESH_Mesh::RemovePropagationChain (const TopoDS_Shape& theMainEdge) TopoDS_Vertex anEmptyShape; BRep_Builder BB; BB.MakeVertex(anEmptyShape, gp_Pnt(0,0,0), 0.1); - TopTools_IndexedMapOfShape anEmptyMap; + SMESH_IndexedMapOfShape anEmptyMap; _mapPropagationChains.Substitute(i, anEmptyShape, anEmptyMap); } @@ -1153,7 +1229,7 @@ bool SMESH_Mesh::BuildPropagationChain (const TopoDS_Shape& theMainEdge) // Add new chain, if there is no if (!_mapPropagationChains.Contains(theMainEdge)) { - TopTools_IndexedMapOfShape aNewChain; + SMESH_IndexedMapOfShape aNewChain; _mapPropagationChains.Add(theMainEdge, aNewChain); } @@ -1165,7 +1241,7 @@ bool SMESH_Mesh::BuildPropagationChain (const TopoDS_Shape& theMainEdge) } // Edges, on which the 1D hypothesis will be propagated from - TopTools_IndexedMapOfShape& aChain = _mapPropagationChains.ChangeFromKey(theMainEdge); + SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.ChangeFromKey(theMainEdge); if (aChain.Extent() > 0) { CleanMeshOnPropagationChain(theMainEdge); aChain.Clear(); @@ -1342,3 +1418,12 @@ ostream& SMESH_Mesh::Dump(ostream& save) 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 ); +}