X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Mesh.cxx;h=50c79329676349c7da612d027644a3c3ebac9dec;hp=6d03700c7ea0d1e6bf190fe378dd2a169c2d2c52;hb=e4737e85f0da6d3f90fd08f6be1c2825195fe16f;hpb=51569f091c2d18be76ea9bd3e68ca0247cc731c3 diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 6d03700c7..50c793296 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -37,12 +37,14 @@ #include "utilities.h" -#include "Mesh_Writer.h" #include "DriverMED_W_SMESHDS_Mesh.h" -#include "DriverDAT_W_SMESHDS_Mesh.h" -#include "DriverUNV_W_SMESHDS_Mesh.h" +#include "DriverDAT_W_SMDS_Mesh.h" +#include "DriverUNV_W_SMDS_Mesh.h" +#include "DriverSTL_W_SMDS_Mesh.h" #include "DriverMED_R_SMESHDS_Mesh.h" +#include "DriverUNV_R_SMDS_Mesh.h" +#include "DriverSTL_R_SMDS_Mesh.h" #include #include @@ -51,19 +53,12 @@ #include #include "Utils_ExceptHandlers.hxx" +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Mesh::SMESH_Mesh() -{ - MESSAGE("SMESH_Mesh::SMESH_Mesh"); - _id = -1; - ASSERT(0); -} //============================================================================= /*! @@ -74,7 +69,7 @@ SMESH_Mesh::SMESH_Mesh() SMESH_Mesh::SMESH_Mesh(int localId, int studyId, SMESH_Gen * gen, SMESHDS_Document * myDocument) : _groupId( 0 ) { - MESSAGE("SMESH_Mesh::SMESH_Mesh(int localId)"); + INFOS("SMESH_Mesh::SMESH_Mesh(int localId)"); _id = localId; _studyId = studyId; _gen = gen; @@ -92,7 +87,7 @@ SMESH_Mesh::SMESH_Mesh(int localId, int studyId, SMESH_Gen * gen, SMESHDS_Docume SMESH_Mesh::~SMESH_Mesh() { - MESSAGE("SMESH_Mesh::~SMESH_Mesh"); + INFOS("SMESH_Mesh::~SMESH_Mesh"); // delete groups map < int, SMESH_Group * >::iterator itg; @@ -109,16 +104,41 @@ SMESH_Mesh::~SMESH_Mesh() //============================================================================= void SMESH_Mesh::ShapeToMesh(const TopoDS_Shape & aShape){ - MESSAGE("SMESH_Mesh::ShapeToMesh"); - if (_isShapeToMesh) - throw - SALOME_Exception(LOCALIZED - ("a shape to mesh as already been defined")); - _isShapeToMesh = true; - _myMeshDS->ShapeToMesh(aShape); + if(MYDEBUG) MESSAGE("SMESH_Mesh::ShapeToMesh"); + if (_isShapeToMesh) + throw + SALOME_Exception(LOCALIZED + ("a shape to mesh as already been defined")); + _isShapeToMesh = true; + _myMeshDS->ShapeToMesh(aShape); + + // NRI : 24/02/03 + //EAP: 1/9/04 TopExp::MapShapes(aShape, _subShapes); USE the same map of _myMeshDS +} - // NRI : 24/02/03 - TopExp::MapShapes(aShape, _subShapes); +//======================================================================= +//function : UNVToMesh +//purpose : +//======================================================================= + +int SMESH_Mesh::UNVToMesh(const char* theFileName) +{ + if(MYDEBUG) MESSAGE("UNVToMesh - theFileName = "<NbNodes() = "<<_myMeshDS->NbNodes()); + MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); + MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); + MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); + } + return 1; } //======================================================================= @@ -128,37 +148,66 @@ void SMESH_Mesh::ShapeToMesh(const TopoDS_Shape & aShape){ int SMESH_Mesh::MEDToMesh(const char* theFileName, const char* theMeshName) { - MESSAGE("MEDToMesh - theFileName = "< myReader(new DriverMED_R_SMESHDS_Mesh); - myReader->SetMesh(_myMeshDS); - myReader->SetMeshId(-1); - myReader->SetFile(theFileName); - myReader->SetMeshName(theMeshName); - DriverMED_R_SMESHDS_Mesh::ReadStatus status = myReader->ReadMySelf(); - MESSAGE("MEDToMesh - _myMeshDS->NbNodes() = "<<_myMeshDS->NbNodes()); - MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); - MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); - MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); + DriverMED_R_SMESHDS_Mesh myReader; + myReader.SetMesh(_myMeshDS); + myReader.SetMeshId(-1); + myReader.SetFile(theFileName); + myReader.SetMeshName(theMeshName); + Driver_Mesh::Status status = myReader.Perform(); + if(MYDEBUG){ + MESSAGE("MEDToMesh - _myMeshDS->NbNodes() = "<<_myMeshDS->NbNodes()); + MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); + MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); + MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); + } // Reading groups (sub-meshes are out of scope of MED import functionality) - list aGroupNames = myReader->GetGroupNames(); - MESSAGE("MEDToMesh - Nb groups = "< aGroupNames = myReader.GetGroupNames(); + if(MYDEBUG) MESSAGE("MEDToMesh - Nb groups = "<::iterator it = aGroupNames.begin(); it != aGroupNames.end(); it++ ) { SMESH_Group* aGroup = AddGroup( SMDSAbs_All, it->c_str(), anId ); if ( aGroup ) { - MESSAGE("MEDToMesh - group added: "<c_str()); - SMESHDS_Group* aGroupDS = aGroup->GetGroupDS(); - aGroupDS->SetStoreName( it->c_str() ); - myReader->GetGroup( aGroupDS ); + if(MYDEBUG) MESSAGE("MEDToMesh - group added: "<c_str()); + SMESHDS_Group* aGroupDS = dynamic_cast( aGroup->GetGroupDS() ); + if ( aGroupDS ) { + aGroupDS->SetStoreName( it->c_str() ); + myReader.GetGroup( aGroupDS ); + } } } return (int) status; } +//======================================================================= +//function : STLToMesh +//purpose : +//======================================================================= + +int SMESH_Mesh::STLToMesh(const char* theFileName) +{ + if(MYDEBUG) MESSAGE("UNVToMesh - theFileName = "<NbNodes() = "<<_myMeshDS->NbNodes()); + MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); + MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); + MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); + } + return 1; +} + //============================================================================= /*! * @@ -167,23 +216,45 @@ int SMESH_Mesh::MEDToMesh(const char* theFileName, const char* theMeshName) SMESH_Hypothesis::Hypothesis_Status SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, - int anHypId) throw(SALOME_Exception) + int anHypId ) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - MESSAGE("SMESH_Mesh::AddHypothesis"); + if(MYDEBUG) MESSAGE("SMESH_Mesh::AddHypothesis"); + + SMESH_subMesh *subMesh = GetSubMesh(aSubShape); + SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS(); + if ( subMeshDS && subMeshDS->IsComplexSubmesh() ) + { + // 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()) + { + ret = AddHypothesis( itS.Value(), anHypId ); + if ( !SMESH_Hypothesis::IsStatusFatal( ret ) && ret > aWorstNotFatal ) + aWorstNotFatal = ret; + if ( ret < aBestRet ) + aBestRet = ret; + } + if ( SMESH_Hypothesis::IsStatusFatal( aBestRet )) + return aBestRet; + return aWorstNotFatal; + } StudyContextStruct *sc = _gen->GetStudyContext(_studyId); if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) { - MESSAGE("Hypothesis ID does not give an hypothesis"); - SCRUTE(_studyId); - SCRUTE(anHypId); + if(MYDEBUG) MESSAGE("Hypothesis ID does not give an hypothesis"); + if(MYDEBUG) { + SCRUTE(_studyId); + SCRUTE(anHypId); + } throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); } - SMESH_subMesh *subMesh = GetSubMesh(aSubShape); SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; - SCRUTE( anHyp->GetName() ); + if(MYDEBUG) SCRUTE( anHyp->GetName() ); int event; bool isGlobalHyp = IsMainShape( aSubShape ); @@ -194,7 +265,7 @@ SMESH_Hypothesis::Hypothesis_Status string hypName = anHyp->GetName(); if ( hypName == "NotConformAllowed" ) { - MESSAGE( "Hypotesis can be only global" ); + if(MYDEBUG) MESSAGE( "Hypotesis can be only global" ); return SMESH_Hypothesis::HYP_INCOMPATIBLE; } } @@ -222,7 +293,7 @@ SMESH_Hypothesis::Hypothesis_Status } subMesh->DumpAlgoState(true); - SCRUTE(ret); + if(MYDEBUG) SCRUTE(ret); return ret; } @@ -237,43 +308,63 @@ SMESH_Hypothesis::Hypothesis_Status int anHypId)throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - MESSAGE("SMESH_Mesh::RemoveHypothesis"); - - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); - if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); - - SMESH_subMesh *subMesh = GetSubMesh(aSubShape); - SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; - int hypType = anHyp->GetType(); - SCRUTE(hypType); - int event; - - // shape - - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::REMOVE_HYP; - else - event = SMESH_subMesh::REMOVE_ALGO; - SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); - - // subShapes - if (!SMESH_Hypothesis::IsStatusFatal(ret) && - !subMesh->IsApplicableHypotesis( anHyp )) // is removed from father - { - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::REMOVE_FATHER_HYP; - else - event = SMESH_subMesh::REMOVE_FATHER_ALGO; - SMESH_Hypothesis::Hypothesis_Status ret2 = - subMesh->SubMeshesAlgoStateEngine(event, anHyp); - if (ret2 > ret) // more severe - ret = ret2; - } + if(MYDEBUG) MESSAGE("SMESH_Mesh::RemoveHypothesis"); + + SMESH_subMesh *subMesh = GetSubMesh(aSubShape); + SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS(); + if ( subMeshDS && subMeshDS->IsComplexSubmesh() ) + { + // 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()) + { + ret = RemoveHypothesis( itS.Value(), anHypId ); + if ( !SMESH_Hypothesis::IsStatusFatal( ret ) && ret > aWorstNotFatal ) + aWorstNotFatal = ret; + if ( ret < aBestRet ) + aBestRet = ret; + } + if ( SMESH_Hypothesis::IsStatusFatal( aBestRet )) + return aBestRet; + return aWorstNotFatal; + } - subMesh->DumpAlgoState(true); - SCRUTE(ret); - return ret; + StudyContextStruct *sc = _gen->GetStudyContext(_studyId); + if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) + throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); + + SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; + int hypType = anHyp->GetType(); + if(MYDEBUG) SCRUTE(hypType); + int event; + + // shape + + if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) + event = SMESH_subMesh::REMOVE_HYP; + else + event = SMESH_subMesh::REMOVE_ALGO; + SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); + + // subShapes + if (!SMESH_Hypothesis::IsStatusFatal(ret) && + !subMesh->IsApplicableHypotesis( anHyp )) // is removed from father + { + if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) + event = SMESH_subMesh::REMOVE_FATHER_HYP; + else + event = SMESH_subMesh::REMOVE_FATHER_ALGO; + SMESH_Hypothesis::Hypothesis_Status ret2 = + subMesh->SubMeshesAlgoStateEngine(event, anHyp); + if (ret2 > ret) // more severe + ret = ret2; + } + + subMesh->DumpAlgoState(true); + if(MYDEBUG) SCRUTE(ret); + return ret; } //============================================================================= @@ -284,7 +375,7 @@ SMESH_Hypothesis::Hypothesis_Status SMESHDS_Mesh * SMESH_Mesh::GetMeshDS() { - return _myMeshDS; + return _myMeshDS; } //============================================================================= @@ -294,23 +385,10 @@ SMESHDS_Mesh * SMESH_Mesh::GetMeshDS() //============================================================================= const list& - SMESH_Mesh::GetHypothesisList(const TopoDS_Shape & aSubShape) const - throw(SALOME_Exception) +SMESH_Mesh::GetHypothesisList(const TopoDS_Shape & aSubShape) const + throw(SALOME_Exception) { Unexpect aCatch(SalomeException); -// MESSAGE("SMESH_Mesh::GetHypothesisList"); -// _subShapeHypothesisList.clear(); -// const list& listHyp = -// _myMeshDS->GetHypothesis(aSubShape); - -// list::const_iterator it=listHyp.begin(); -// while (it!=listHyp.end()) -// { -// const SMESHDS_Hypothesis *anHyp = *it; -// _subShapeHypothesisList.push_back(anHyp); -// it++; -// } -// return _subShapeHypothesisList; return _myMeshDS->GetHypothesis(aSubShape); } @@ -323,8 +401,8 @@ const list& const list & SMESH_Mesh::GetLog() throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - MESSAGE("SMESH_Mesh::GetLog"); - return _myMeshDS->GetScript()->GetCommands(); + if(MYDEBUG) MESSAGE("SMESH_Mesh::GetLog"); + return _myMeshDS->GetScript()->GetCommands(); } //============================================================================= @@ -335,8 +413,8 @@ const list & SMESH_Mesh::GetLog() throw(SALOME_Exception) void SMESH_Mesh::ClearLog() throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - MESSAGE("SMESH_Mesh::ClearLog"); - _myMeshDS->GetScript()->Clear(); + if(MYDEBUG) MESSAGE("SMESH_Mesh::ClearLog"); + _myMeshDS->GetScript()->Clear(); } //============================================================================= @@ -347,8 +425,8 @@ void SMESH_Mesh::ClearLog() throw(SALOME_Exception) int SMESH_Mesh::GetId() { - MESSAGE("SMESH_Mesh::GetId"); - return _id; + if(MYDEBUG) MESSAGE("SMESH_Mesh::GetId"); + return _id; } //============================================================================= @@ -359,7 +437,7 @@ int SMESH_Mesh::GetId() SMESH_Gen *SMESH_Mesh::GetGen() { - return _gen; + return _gen; } //============================================================================= @@ -372,38 +450,26 @@ SMESH_subMesh *SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - //MESSAGE("SMESH_Mesh::GetSubMesh"); - SMESH_subMesh *aSubMesh; - int index = _subShapes.FindIndex(aSubShape); - - if (_mapSubMesh.find(index) != _mapSubMesh.end()) - { - aSubMesh = _mapSubMesh[index]; - } - else - { - aSubMesh = new SMESH_subMesh(index, this, _myMeshDS, aSubShape); - _mapSubMesh[index] = aSubMesh; - } + SMESH_subMesh *aSubMesh; + int index = _myMeshDS->ShapeToIndex(aSubShape); + + // for submeshes on GEOM Group + if ( !index && aSubShape.ShapeType() == TopAbs_COMPOUND ) { + TopoDS_Iterator it( aSubShape ); + if ( it.More() ) + index = _myMeshDS->AddCompoundSubmesh( aSubShape, it.Value().ShapeType() ); + } - /* NRI 24/02/2003 - * int index = -1; - * if (_subShapes.Contains(aSubShape)) - * { - * index = _subShapes.FindIndex(aSubShape); - * ASSERT(_mapSubMesh.find(index) != _mapSubMesh.end()); - * aSubMesh = _mapSubMesh[index]; - * //MESSAGE("found submesh " << index); - * } - * else - * { - * index = _subShapes.Add(aSubShape); - * aSubMesh = new SMESH_subMesh(index, this, _myMeshDS, aSubShape); - * _mapSubMesh[index] = aSubMesh; - * //MESSAGE("created submesh " << index); - * } - */ - return aSubMesh; + if (_mapSubMesh.find(index) != _mapSubMesh.end()) + { + aSubMesh = _mapSubMesh[index]; + } + else + { + aSubMesh = new SMESH_subMesh(index, this, _myMeshDS, aSubShape); + _mapSubMesh[index] = aSubMesh; + } + return aSubMesh; } //============================================================================= @@ -412,54 +478,23 @@ throw(SALOME_Exception) * if it does not exist. */ //============================================================================= -// -// * Given a subShape, find if there is a subMesh associated to this subShape -// * or to a collection of shapes containing this subShape. Collection = -// * compsolid, shell, wire. -// * -// * WARNING : with arg = compsolid, shell or wire returns always NULL. -// * with a face inside a shell, and submesh created for both, if arg is face, -// * returns first created submesh of the two. -// * subMesh is not created, return may be NULL. SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const TopoDS_Shape & aSubShape) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - //MESSAGE("SMESH_Mesh::GetSubMeshContaining"); - bool isFound = false; - SMESH_subMesh *aSubMesh = NULL; - - int index = _subShapes.FindIndex(aSubShape); - if (_mapSubMesh.find(index) != _mapSubMesh.end()) - { - aSubMesh = _mapSubMesh[index]; - isFound = true; - } - - /* NRI 24/02/2003 - * int index = -1; - * if (_subShapes.Contains(aSubShape)) - * { - * index = _subShapes.FindIndex(aSubShape); - * ASSERT(_mapSubMesh.find(index) != _mapSubMesh.end()); - * aSubMesh = _mapSubMesh[index]; - * isFound = true; - * //MESSAGE("found submesh " << index); - * } - */ - -// map::iterator itsm; -// for (itsm = _mapSubMesh.begin(); itsm != _mapSubMesh.end(); itsm++) -// { -// aSubMesh = (*itsm).second; -// isFound = aSubMesh->Contains(aSubShape); -// if (isFound) break; -// } - - if (!isFound) - aSubMesh = NULL; - return aSubMesh; + bool isFound = false; + SMESH_subMesh *aSubMesh = NULL; + + int index = _myMeshDS->ShapeToIndex(aSubShape); + if (_mapSubMesh.find(index) != _mapSubMesh.end()) + { + aSubMesh = _mapSubMesh[index]; + isFound = true; + } + if (!isFound) + aSubMesh = NULL; + return aSubMesh; } //======================================================================= @@ -470,8 +505,6 @@ throw(SALOME_Exception) bool SMESH_Mesh::IsUsedHypothesis(SMESHDS_Hypothesis * anHyp, const TopoDS_Shape & aSubShape) { - //MESSAGE( "SMESH_Mesh::IsUsedHypothesis" ); - // check if anHyp is applicable to aSubShape SMESH_subMesh * subMesh = GetSubMeshContaining( aSubShape ); if (!subMesh || @@ -535,7 +568,7 @@ const list < SMESH_subMesh * >& throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - MESSAGE("SMESH_Mesh::GetSubMeshUsingHypothesis"); + if(MYDEBUG) MESSAGE("SMESH_Mesh::GetSubMeshUsingHypothesis"); map < int, SMESH_subMesh * >::iterator itsm; _subMeshesUsingHypothesisList.clear(); for (itsm = _mapSubMesh.begin(); itsm != _mapSubMesh.end(); itsm++) @@ -556,51 +589,64 @@ throw(SALOME_Exception) void SMESH_Mesh::ExportMED(const char *file, const char* theMeshName, bool theAutoGroups) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - std::auto_ptr myWriter(new DriverMED_W_SMESHDS_Mesh); - myWriter ->SetFile ( file ); - myWriter ->SetMesh ( _myMeshDS ); + DriverMED_W_SMESHDS_Mesh myWriter; + myWriter.SetFile ( file ); + myWriter.SetMesh ( _myMeshDS ); if ( !theMeshName ) - myWriter->SetMeshId ( _idDoc ); + myWriter.SetMeshId ( _idDoc ); else { - myWriter->SetMeshId ( -1 ); - myWriter->SetMeshName( theMeshName ); + myWriter.SetMeshId ( -1 ); + myWriter.SetMeshName( theMeshName ); } if ( theAutoGroups ) { - myWriter->AddGroupOfNodes(); - myWriter->AddGroupOfEdges(); - myWriter->AddGroupOfFaces(); - myWriter->AddGroupOfVolumes(); + myWriter.AddGroupOfNodes(); + myWriter.AddGroupOfEdges(); + myWriter.AddGroupOfFaces(); + myWriter.AddGroupOfVolumes(); } for ( map::iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) { - SMESH_Group* aGroup = it->second; - SMESHDS_Group* aGroupDS = aGroup->GetGroupDS(); - aGroupDS->SetStoreName( aGroup->GetName() ); - myWriter->AddGroup( aGroupDS ); + SMESH_Group* aGroup = it->second; + SMESHDS_GroupBase* aGroupDS = aGroup->GetGroupDS(); + if ( aGroupDS ) { + aGroupDS->SetStoreName( aGroup->GetName() ); + myWriter.AddGroup( aGroupDS ); + } } - myWriter->Add(); + myWriter.Perform(); } void SMESH_Mesh::ExportDAT(const char *file) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - Mesh_Writer *myWriter = new DriverDAT_W_SMESHDS_Mesh; - myWriter->SetFile(string(file)); - myWriter->SetMesh(_myMeshDS); - myWriter->SetMeshId(_idDoc); - myWriter->Add(); + DriverDAT_W_SMDS_Mesh myWriter; + myWriter.SetFile(string(file)); + myWriter.SetMesh(_myMeshDS); + myWriter.SetMeshId(_idDoc); + myWriter.Perform(); } void SMESH_Mesh::ExportUNV(const char *file) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - Mesh_Writer *myWriter = new DriverUNV_W_SMESHDS_Mesh; - myWriter->SetFile(string(file)); - myWriter->SetMesh(_myMeshDS); - myWriter->SetMeshId(_idDoc); - myWriter->Add(); + DriverUNV_W_SMDS_Mesh myWriter; + myWriter.SetFile(string(file)); + myWriter.SetMesh(_myMeshDS); + myWriter.SetMeshId(_idDoc); + myWriter.Perform(); +} + +void SMESH_Mesh::ExportSTL(const char *file, const bool isascii) throw(SALOME_Exception) +{ + Unexpect aCatch(SalomeException); + DriverSTL_W_SMDS_Mesh myWriter; + myWriter.SetFile(string(file)); + myWriter.SetIsAscii( isascii ); + myWriter.SetMesh(_myMeshDS); + myWriter.SetMeshId(_idDoc); + myWriter.Perform(); } //============================================================================= @@ -611,7 +657,7 @@ void SMESH_Mesh::ExportUNV(const char *file) throw(SALOME_Exception) int SMESH_Mesh::NbNodes() throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - return _myMeshDS->NbNodes(); + return _myMeshDS->NbNodes(); } //============================================================================= @@ -622,7 +668,7 @@ int SMESH_Mesh::NbNodes() throw(SALOME_Exception) int SMESH_Mesh::NbEdges() throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - return _myMeshDS->NbEdges(); + return _myMeshDS->NbEdges(); } //============================================================================= @@ -633,7 +679,7 @@ int SMESH_Mesh::NbEdges() throw(SALOME_Exception) int SMESH_Mesh::NbFaces() throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - return _myMeshDS->NbFaces(); + return _myMeshDS->NbFaces(); } /////////////////////////////////////////////////////////////////////////////// @@ -642,11 +688,11 @@ int SMESH_Mesh::NbFaces() throw(SALOME_Exception) int SMESH_Mesh::NbTriangles() throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - int Nb = 0; - - SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); - while(itFaces->more()) if(itFaces->next()->NbNodes()==3) Nb++; - return Nb; + int Nb = 0; + + SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); + while(itFaces->more()) if(itFaces->next()->NbNodes()==3) Nb++; + return Nb; } /////////////////////////////////////////////////////////////////////////////// @@ -655,11 +701,11 @@ int SMESH_Mesh::NbTriangles() throw(SALOME_Exception) int SMESH_Mesh::NbQuadrangles() throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - int Nb = 0; - - SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); - while(itFaces->more()) if(itFaces->next()->NbNodes()==4) Nb++; - return Nb; + int Nb = 0; + + SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); + while(itFaces->more()) if(itFaces->next()->NbNodes()==4) Nb++; + return Nb; } //============================================================================= @@ -670,43 +716,43 @@ int SMESH_Mesh::NbQuadrangles() throw(SALOME_Exception) int SMESH_Mesh::NbVolumes() throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - return _myMeshDS->NbVolumes(); + return _myMeshDS->NbVolumes(); } 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++; - return Nb; + int Nb = 0; + SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); + while(itVolumes->more()) if(itVolumes->next()->NbNodes()==4) Nb++; + return Nb; } 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++; - return Nb; + int Nb = 0; + SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); + while(itVolumes->more()) if(itVolumes->next()->NbNodes()==8) Nb++; + return Nb; } 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++; - return Nb; + int Nb = 0; + SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); + while(itVolumes->more()) if(itVolumes->next()->NbNodes()==5) Nb++; + return Nb; } 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++; - return Nb; + int Nb = 0; + SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); + while(itVolumes->more()) if(itVolumes->next()->NbNodes()==6) Nb++; + return Nb; } //============================================================================= @@ -717,7 +763,7 @@ int SMESH_Mesh::NbPrisms() throw(SALOME_Exception) int SMESH_Mesh::NbSubMesh() throw(SALOME_Exception) { Unexpect aCatch(SalomeException); - return _myMeshDS->NbSubMesh(); + return _myMeshDS->NbSubMesh(); } //======================================================================= @@ -727,7 +773,7 @@ int SMESH_Mesh::NbSubMesh() throw(SALOME_Exception) bool SMESH_Mesh::IsNotConformAllowed() const { - MESSAGE("SMESH_Mesh::IsNotConformAllowed"); + if(MYDEBUG) MESSAGE("SMESH_Mesh::IsNotConformAllowed"); const list& listHyp = _myMeshDS->GetHypothesis( _myMeshDS->ShapeToMesh() ); @@ -761,12 +807,14 @@ bool SMESH_Mesh::IsMainShape(const TopoDS_Shape& theShape) const SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType, const char* theName, - int& theId) + int& theId, + const TopoDS_Shape& theShape) { if (_mapGroup.find(_groupId) != _mapGroup.end()) return NULL; - SMESH_Group* aGroup = new SMESH_Group (this, theType, theName); theId = _groupId; + SMESH_Group* aGroup = new SMESH_Group (theId, this, theType, theName, theShape); + GetMeshDS()->AddGroup( aGroup->GetGroupDS() ); _mapGroup[_groupId++] = aGroup; return aGroup; } @@ -811,8 +859,9 @@ void SMESH_Mesh::RemoveGroup (const int theGroupID) { if (_mapGroup.find(theGroupID) == _mapGroup.end()) return; - delete _mapGroup[theGroupID]; + GetMeshDS()->RemoveGroup( _mapGroup[theGroupID]->GetGroupDS() ); _mapGroup.erase (theGroupID); + delete _mapGroup[theGroupID]; } //=======================================================================