// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // SMESH DriverMED : driver to read and write 'med' files // File : DriverMED_R_SMESHDS_Mesh.cxx // Module : SMESH #include "DriverMED_R_SMESHDS_Mesh.h" #include "SMESHDS_Mesh.hxx" #include "utilities.h" #include "DriverMED_Family.h" #include "SMESHDS_Group.hxx" #include "MED_Factory.hxx" #include "MED_CoordUtils.hxx" #include "MED_Utilities.hxx" #include #include #ifdef _DEBUG_ static int MYDEBUG = 1; //#define _DEXCEPT_ #else static int MYDEBUG = 0; #endif #define _EDF_NODE_IDS_ using namespace MED; using namespace std; typedef std::map TID2FamilyMap; namespace DriverMED { bool buildMeshGrille(const MED::PWrapper& theWrapper, const MED::PMeshInfo& theMeshInfo, SMESHDS_Mesh* theMesh, const TID2FamilyMap& myFamilies); /*! * \brief Ensure aFamily has a required ID * \param aFamily - a family to check * \param anID - an ID aFamily should have * \param myFamilies - a map of the family ID to the Family * \retval bool - true if successful */ bool checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID, const TID2FamilyMap& myFamilies); } void DriverMED_R_SMESHDS_Mesh ::SetMeshName(string theMeshName) { myMeshName = theMeshName; } static const SMDS_MeshNode* FindNode(const SMDS_Mesh* theMesh, TInt theId) { const SMDS_MeshNode* aNode = theMesh->FindNode(theId); if(aNode) return aNode; EXCEPTION(runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "<GetNbMeshes()){ for(int iMesh = 0; iMesh < aNbMeshes; iMesh++){ // Reading the MED mesh //--------------------- PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1); string aMeshName; if (myMeshId != -1) { ostringstream aMeshNameStr; aMeshNameStr<GetName()); if(aMeshName != aMeshInfo->GetName()) continue; aResult = DRS_OK; // Reading MED families to the temporary structure //------------------------------------------------ TErr anErr; TInt aNbFams = aMed->GetNbFamilies(aMeshInfo); if(MYDEBUG) MESSAGE("Read " << aNbFams << " families"); for (TInt iFam = 0; iFam < aNbFams; iFam++) { PFamilyInfo aFamilyInfo = aMed->GetPFamilyInfo(aMeshInfo,iFam+1,&anErr); if(anErr >= 0){ TInt aFamId = aFamilyInfo->GetId(); if(MYDEBUG) MESSAGE("Family " << aFamId << " :"); DriverMED_FamilyPtr aFamily (new DriverMED_Family); TInt aNbGrp = aFamilyInfo->GetNbGroup(); if(MYDEBUG) MESSAGE("belong to " << aNbGrp << " groups"); bool isAttrOk = false; if(aFamilyInfo->GetNbAttr() == aNbGrp) isAttrOk = true; for (TInt iGr = 0; iGr < aNbGrp; iGr++) { string aGroupName = aFamilyInfo->GetGroupName(iGr); if(isAttrOk){ TInt anAttrVal = aFamilyInfo->GetAttrVal(iGr); aFamily->SetGroupAttributVal(anAttrVal); } if(MYDEBUG) MESSAGE(aGroupName); aFamily->AddGroupName(aGroupName); } aFamily->SetId( aFamId ); myFamilies[aFamId] = aFamily; } } if (aMeshInfo->GetType() == MED::eSTRUCTURE){ /*bool aRes = */DriverMED::buildMeshGrille(aMed,aMeshInfo,myMesh,myFamilies); continue; } // Reading MED nodes to the corresponding SMDS structure //------------------------------------------------------ PNodeInfo aNodeInfo = aMed->GetPNodeInfo(aMeshInfo); if (!aNodeInfo) { aResult = DRS_FAIL; continue; } aMeshInfo->myDim=aMeshInfo->mySpaceDim;// ignore meshdim in MEDFile because it can be false PCoordHelper aCoordHelper = GetCoordHelper(aNodeInfo); EBooleen anIsNodeNum = aNodeInfo->IsElemNum(); TInt aNbElems = aNodeInfo->GetNbElem(); if(MYDEBUG) MESSAGE("Perform - aNodeInfo->GetNbElem() = "<GetFamNum(iElem); #ifndef _DEXCEPT_ try{ #endif //MESSAGE("Try to create element # " << iElem << " with id = " // << aCellInfo->GetElemNum(iElem)); switch(aGeom) { case ePOINT1: //anElement = FindNode(myMesh,aNodeIds[0]); if(anIsElemNum) anElement = myMesh->Add0DElementWithID (aNodeIds[0], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->Add0DElement(FindNode(myMesh,aNodeIds[0])); isRenum = anIsElemNum; } break; case eSEG2: if(anIsElemNum) anElement = myMesh->AddEdgeWithID(aNodeIds[0], aNodeIds[1], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddEdge(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1])); isRenum = anIsElemNum; } break; case eSEG3: if(anIsElemNum) anElement = myMesh->AddEdgeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddEdge(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2])); isRenum = anIsElemNum; } break; case eTRIA3: aNbNodes = 3; if(anIsElemNum) anElement = myMesh->AddFaceWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2])); isRenum = anIsElemNum; } break; case eTRIA6: aNbNodes = 6; if(anIsElemNum) anElement = myMesh->AddFaceWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5])); isRenum = anIsElemNum; } break; case eTRIA7: aNbNodes = 7; if(anIsElemNum) anElement = myMesh->AddFaceWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aNodeIds[6], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5]), FindNode(myMesh,aNodeIds[6])); isRenum = anIsElemNum; } break; case eQUAD4: aNbNodes = 4; if(anIsElemNum) anElement = myMesh->AddFaceWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3])); isRenum = anIsElemNum; } break; case eQUAD8: aNbNodes = 8; if(anIsElemNum) anElement = myMesh->AddFaceWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aNodeIds[6], aNodeIds[7], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5]), FindNode(myMesh,aNodeIds[6]), FindNode(myMesh,aNodeIds[7])); isRenum = anIsElemNum; } break; case eQUAD9: aNbNodes = 9; if(anIsElemNum) anElement = myMesh->AddFaceWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aNodeIds[6], aNodeIds[7], aNodeIds[8], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5]), FindNode(myMesh,aNodeIds[6]), FindNode(myMesh,aNodeIds[7]), FindNode(myMesh,aNodeIds[8])); isRenum = anIsElemNum; } break; case eTETRA4: aNbNodes = 4; if(anIsElemNum) anElement = myMesh->AddVolumeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3])); isRenum = anIsElemNum; } break; case eTETRA10: aNbNodes = 10; if(anIsElemNum) anElement = myMesh->AddVolumeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aNodeIds[6], aNodeIds[7], aNodeIds[8], aNodeIds[9], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5]), FindNode(myMesh,aNodeIds[6]), FindNode(myMesh,aNodeIds[7]), FindNode(myMesh,aNodeIds[8]), FindNode(myMesh,aNodeIds[9])); isRenum = anIsElemNum; } break; case ePYRA5: aNbNodes = 5; if(anIsElemNum) anElement = myMesh->AddVolumeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4])); isRenum = anIsElemNum; } break; case ePYRA13: aNbNodes = 13; if(anIsElemNum) anElement = myMesh->AddVolumeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aNodeIds[6], aNodeIds[7], aNodeIds[8], aNodeIds[9], aNodeIds[10], aNodeIds[11], aNodeIds[12], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5]), FindNode(myMesh,aNodeIds[6]), FindNode(myMesh,aNodeIds[7]), FindNode(myMesh,aNodeIds[8]), FindNode(myMesh,aNodeIds[9]), FindNode(myMesh,aNodeIds[10]), FindNode(myMesh,aNodeIds[11]), FindNode(myMesh,aNodeIds[12])); isRenum = anIsElemNum; } break; case ePENTA6: aNbNodes = 6; if(anIsElemNum) anElement = myMesh->AddVolumeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5])); isRenum = anIsElemNum; } break; case ePENTA15: aNbNodes = 15; if(anIsElemNum) anElement = myMesh->AddVolumeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aNodeIds[6], aNodeIds[7], aNodeIds[8], aNodeIds[9], aNodeIds[10], aNodeIds[11], aNodeIds[12], aNodeIds[13], aNodeIds[14], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5]), FindNode(myMesh,aNodeIds[6]), FindNode(myMesh,aNodeIds[7]), FindNode(myMesh,aNodeIds[8]), FindNode(myMesh,aNodeIds[9]), FindNode(myMesh,aNodeIds[10]), FindNode(myMesh,aNodeIds[11]), FindNode(myMesh,aNodeIds[12]), FindNode(myMesh,aNodeIds[13]), FindNode(myMesh,aNodeIds[14])); isRenum = anIsElemNum; } break; case eHEXA8: aNbNodes = 8; if(anIsElemNum) anElement = myMesh->AddVolumeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aNodeIds[6], aNodeIds[7], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5]), FindNode(myMesh,aNodeIds[6]), FindNode(myMesh,aNodeIds[7])); isRenum = anIsElemNum; } break; case eHEXA20: aNbNodes = 20; if(anIsElemNum) anElement = myMesh->AddVolumeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aNodeIds[6], aNodeIds[7], aNodeIds[8], aNodeIds[9], aNodeIds[10], aNodeIds[11], aNodeIds[12], aNodeIds[13], aNodeIds[14], aNodeIds[15], aNodeIds[16], aNodeIds[17], aNodeIds[18], aNodeIds[19], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5]), FindNode(myMesh,aNodeIds[6]), FindNode(myMesh,aNodeIds[7]), FindNode(myMesh,aNodeIds[8]), FindNode(myMesh,aNodeIds[9]), FindNode(myMesh,aNodeIds[10]), FindNode(myMesh,aNodeIds[11]), FindNode(myMesh,aNodeIds[12]), FindNode(myMesh,aNodeIds[13]), FindNode(myMesh,aNodeIds[14]), FindNode(myMesh,aNodeIds[15]), FindNode(myMesh,aNodeIds[16]), FindNode(myMesh,aNodeIds[17]), FindNode(myMesh,aNodeIds[18]), FindNode(myMesh,aNodeIds[19])); isRenum = anIsElemNum; } break; case eHEXA27: aNbNodes = 27; if(anIsElemNum) anElement = myMesh->AddVolumeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aNodeIds[6], aNodeIds[7], aNodeIds[8], aNodeIds[9], aNodeIds[10], aNodeIds[11], aNodeIds[12], aNodeIds[13], aNodeIds[14], aNodeIds[15], aNodeIds[16], aNodeIds[17], aNodeIds[18], aNodeIds[19], aNodeIds[20], aNodeIds[21], aNodeIds[22], aNodeIds[23], aNodeIds[24], aNodeIds[25], aNodeIds[26], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5]), FindNode(myMesh,aNodeIds[6]), FindNode(myMesh,aNodeIds[7]), FindNode(myMesh,aNodeIds[8]), FindNode(myMesh,aNodeIds[9]), FindNode(myMesh,aNodeIds[10]), FindNode(myMesh,aNodeIds[11]), FindNode(myMesh,aNodeIds[12]), FindNode(myMesh,aNodeIds[13]), FindNode(myMesh,aNodeIds[14]), FindNode(myMesh,aNodeIds[15]), FindNode(myMesh,aNodeIds[16]), FindNode(myMesh,aNodeIds[17]), FindNode(myMesh,aNodeIds[18]), FindNode(myMesh,aNodeIds[19]), FindNode(myMesh,aNodeIds[20]), FindNode(myMesh,aNodeIds[21]), FindNode(myMesh,aNodeIds[22]), FindNode(myMesh,aNodeIds[23]), FindNode(myMesh,aNodeIds[24]), FindNode(myMesh,aNodeIds[25]), FindNode(myMesh,aNodeIds[26])); isRenum = anIsElemNum; } break; case eOCTA12: aNbNodes = 12; if(anIsElemNum) anElement = myMesh->AddVolumeWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], aNodeIds[3], aNodeIds[4], aNodeIds[5], aNodeIds[6], aNodeIds[7], aNodeIds[8], aNodeIds[9], aNodeIds[10], aNodeIds[11], aCellInfo->GetElemNum(iElem)); if (!anElement) { anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), FindNode(myMesh,aNodeIds[1]), FindNode(myMesh,aNodeIds[2]), FindNode(myMesh,aNodeIds[3]), FindNode(myMesh,aNodeIds[4]), FindNode(myMesh,aNodeIds[5]), FindNode(myMesh,aNodeIds[6]), FindNode(myMesh,aNodeIds[7]), FindNode(myMesh,aNodeIds[8]), FindNode(myMesh,aNodeIds[9]), FindNode(myMesh,aNodeIds[10]), FindNode(myMesh,aNodeIds[11])); isRenum = anIsElemNum; } break; } // switch(aGeom) #ifndef _DEXCEPT_ }catch(const std::exception& exc){ INFOS("The following exception was caught:\n\t"<AddElement(anElement); myFamilies[aFamNum]->SetType(anElement->GetType()); } } } }} } } if (aDescendingEntitiesMap.Extent()) isDescConn = true; // Mantis issue 0020483 } // for(int iMesh = 0; iMesh < aNbMeshes; iMesh++) } // if aNbMeshes #ifndef _DEXCEPT_ }catch(const std::exception& exc){ INFOS("The following exception was caught:\n\t"<compactMesh(); // Mantis issue 0020483 if (aResult == DRS_OK && isDescConn) { INFOS("There are some elements in descending connectivity in med file. They were not read !!!"); aResult = DRS_WARN_DESCENDING; } if(MYDEBUG) MESSAGE("Perform - aResult status = "< DriverMED_R_SMESHDS_Mesh::GetMeshNames(Status& theStatus) { list aMeshNames; try { if(MYDEBUG) MESSAGE("GetMeshNames - myFile : " << myFile); theStatus = DRS_OK; PWrapper aMed = CrWrapper(myFile); if (TInt aNbMeshes = aMed->GetNbMeshes()) { for (int iMesh = 0; iMesh < aNbMeshes; iMesh++) { // Reading the MED mesh //--------------------- PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1); aMeshNames.push_back(aMeshInfo->GetName()); } } } catch(const std::exception& exc) { INFOS("Following exception was caught:\n\t"< DriverMED_R_SMESHDS_Mesh::GetGroupNamesAndTypes() { list aResult; set aResGroupNames; map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) { DriverMED_FamilyPtr aFamily = (*aFamsIter).second; const MED::TStringSet& aGroupNames = aFamily->GetGroupNames(); set::const_iterator aGrNamesIter = aGroupNames.begin(); for (; aGrNamesIter != aGroupNames.end(); aGrNamesIter++) { const set< SMDSAbs_ElementType >& types = aFamily->GetTypes(); set< SMDSAbs_ElementType >::const_iterator type = types.begin(); for ( ; type != types.end(); ++type ) { TNameAndType aNameAndType = make_pair( *aGrNamesIter, *type ); if ( aResGroupNames.insert( aNameAndType ).second ) { aResult.push_back( aNameAndType ); } } } } return aResult; } void DriverMED_R_SMESHDS_Mesh::GetGroup(SMESHDS_Group* theGroup) { string aGroupName (theGroup->GetStoreName()); if(MYDEBUG) MESSAGE("Get Group " << aGroupName); map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) { DriverMED_FamilyPtr aFamily = (*aFamsIter).second; if (aFamily->GetTypes().count( theGroup->GetType() ) && aFamily->MemberOf(aGroupName)) { const set& anElements = aFamily->GetElements(); set::const_iterator anElemsIter = anElements.begin(); for (; anElemsIter != anElements.end(); anElemsIter++) { const SMDS_MeshElement * element = *anElemsIter; if ( element->GetType() == theGroup->GetType() ) // Issue 0020576 theGroup->SMDSGroup().Add(element); } int aGroupAttrVal = aFamily->GetGroupAttributVal(); if( aGroupAttrVal != 0) theGroup->SetColorGroup(aGroupAttrVal); // if ( element ) -- Issue 0020576 // theGroup->SetType( theGroup->SMDSGroup().GetType() ); } } } void DriverMED_R_SMESHDS_Mesh::GetSubMesh (SMESHDS_SubMesh* theSubMesh, const int theId) { char submeshGrpName[ 30 ]; sprintf( submeshGrpName, "SubMesh %d", theId ); string aName (submeshGrpName); map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) { DriverMED_FamilyPtr aFamily = (*aFamsIter).second; if (aFamily->MemberOf(aName)) { const set& anElements = aFamily->GetElements(); set::const_iterator anElemsIter = anElements.begin(); if (aFamily->GetType() == SMDSAbs_Node) { for (; anElemsIter != anElements.end(); anElemsIter++) { const SMDS_MeshNode* node = static_cast(*anElemsIter); theSubMesh->AddNode(node); } } else { for (; anElemsIter != anElements.end(); anElemsIter++) { theSubMesh->AddElement(*anElemsIter); } } } } } void DriverMED_R_SMESHDS_Mesh::CreateAllSubMeshes () { map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) { DriverMED_FamilyPtr aFamily = (*aFamsIter).second; MED::TStringSet aGroupNames = aFamily->GetGroupNames(); set::iterator aGrNamesIter = aGroupNames.begin(); for (; aGrNamesIter != aGroupNames.end(); aGrNamesIter++) { string aName = *aGrNamesIter; // Check, if this is a Group or SubMesh name if (aName.substr(0, 7) == string("SubMesh")) { int Id = atoi(string(aName).substr(7).c_str()); set anElements = aFamily->GetElements(); set::iterator anElemsIter = anElements.begin(); if (aFamily->GetType() == SMDSAbs_Node) { for (; anElemsIter != anElements.end(); anElemsIter++) { SMDS_MeshNode* node = const_cast ( static_cast( *anElemsIter )); // find out a shape type TopoDS_Shape aShape = myMesh->IndexToShape( Id ); int aShapeType = ( aShape.IsNull() ? -1 : aShape.ShapeType() ); switch ( aShapeType ) { case TopAbs_FACE: myMesh->SetNodeOnFace(node, Id); break; case TopAbs_EDGE: myMesh->SetNodeOnEdge(node, Id); break; case TopAbs_VERTEX: myMesh->SetNodeOnVertex(node, Id); break; default: myMesh->SetNodeInVolume(node, Id); } } } else { for (; anElemsIter != anElements.end(); anElemsIter++) { myMesh->SetMeshElementOnShape(*anElemsIter, Id); } } } } } } /*! * \brief Ensure aFamily to have required ID * \param aFamily - a family to check and update * \param anID - an ID aFamily should have * \retval bool - true if successful */ bool DriverMED::checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID, const TID2FamilyMap& myFamilies) { if ( !aFamily || aFamily->GetId() != anID ) { map::const_iterator i_fam = myFamilies.find(anID); if ( i_fam == myFamilies.end() ) return false; aFamily = i_fam->second; } return ( aFamily->GetId() == anID ); } /*! * \brief Reading the structured mesh and convert to non structured * (by filling of smesh structure for non structured mesh) * \param theWrapper - PWrapper const pointer * \param theMeshInfo - PMeshInfo const pointer * \param myFamilies - a map of the family ID to the Family * \return TRUE, if successfully. Else FALSE */ bool DriverMED::buildMeshGrille(const MED::PWrapper& theWrapper, const MED::PMeshInfo& theMeshInfo, SMESHDS_Mesh* myMesh, const TID2FamilyMap& myFamilies) { bool res = true; MED::PGrilleInfo aGrilleInfo = theWrapper->GetPGrilleInfo(theMeshInfo); MED::TInt aNbNodes = aGrilleInfo->GetNbNodes(); MED::TInt aNbCells = aGrilleInfo->GetNbCells(); MED::TInt aMeshDim = theMeshInfo->GetDim(); DriverMED_FamilyPtr aFamily; for(MED::TInt iNode=0;iNode < aNbNodes; iNode++){ double aCoords[3] = {0.0, 0.0, 0.0}; const SMDS_MeshNode* aNode; MED::TNodeCoord aMEDNodeCoord = aGrilleInfo->GetCoord(iNode); for(MED::TInt iDim=0;iDimAddNodeWithID(aCoords[0],aCoords[1],aCoords[2],iNode+1); if (!aNode) { EXCEPTION(runtime_error,"buildMeshGrille Error. Node not created! "<<(int)iNode); } if((aGrilleInfo->myFamNumNode).size() > 0){ TInt aFamNum = aGrilleInfo->GetFamNumNode(iNode); if ( DriverMED::checkFamilyID ( aFamily, aFamNum, myFamilies )) { aFamily->AddElement(aNode); aFamily->SetType(SMDSAbs_Node); } } } SMDS_MeshElement* anElement = NULL; MED::TIntVector aNodeIds; for(MED::TInt iCell=0;iCell < aNbCells; iCell++){ aNodeIds = aGrilleInfo->GetConn(iCell); switch(aGrilleInfo->GetGeom()){ case MED::eSEG2: if(aNodeIds.size() != 2){ res = false; EXCEPTION(runtime_error,"buildMeshGrille Error. Incorrect size of ids 2!="<AddEdgeWithID(aNodeIds[0]+1, aNodeIds[1]+1, iCell+1); break; case MED::eQUAD4: if(aNodeIds.size() != 4){ res = false; EXCEPTION(runtime_error,"buildMeshGrille Error. Incorrect size of ids 4!="<AddFaceWithID(aNodeIds[0]+1, aNodeIds[2]+1, aNodeIds[3]+1, aNodeIds[1]+1, iCell+1); break; case MED::eHEXA8: if(aNodeIds.size() != 8){ res = false; EXCEPTION(runtime_error,"buildMeshGrille Error. Incorrect size of ids 8!="<AddVolumeWithID(aNodeIds[0]+1, aNodeIds[2]+1, aNodeIds[3]+1, aNodeIds[1]+1, aNodeIds[4]+1, aNodeIds[6]+1, aNodeIds[7]+1, aNodeIds[5]+1, iCell+1); break; default: break; } if (!anElement) { EXCEPTION(runtime_error,"buildMeshGrille Error. Element not created! "<myFamNum).size() > 0){ TInt aFamNum = aGrilleInfo->GetFamNum(iCell); if ( DriverMED::checkFamilyID ( aFamily, aFamNum, myFamilies )){ aFamily->AddElement(anElement); aFamily->SetType(anElement->GetType()); } } } return res; }