X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FDriverMED%2FDriverMED_R_SMESHDS_Mesh.cxx;h=1433e3208a970c74ef6d00e1f498552e3100d94d;hp=c37f1e60adddd7e446dc350fafc35d799db410ed;hb=0cf919dde01c300a8f74d697198fba6538560c22;hpb=c3bf92bd87b770fd81631a3853f7f5bb1ac6a4e8 diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx index c37f1e60a..1433e3208 100644 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx @@ -26,117 +26,131 @@ #include "DriverMED_R_SMESHDS_Mesh.h" #include "DriverMED_R_SMDS_Mesh.h" +#include "SMESHDS_Mesh.hxx" #include "utilities.h" #include "DriverMED_Family.h" #include "SMESHDS_Group.hxx" -#include "MEDA_Wrapper.hxx" +#include "MED_Factory.hxx" #include "MED_Utilities.hxx" #include -DriverMED_R_SMESHDS_Mesh::DriverMED_R_SMESHDS_Mesh() - : - myMesh (NULL), - myFile (""), - myFileId (-1), - myMeshId (-1) -{ -} - -DriverMED_R_SMESHDS_Mesh::~DriverMED_R_SMESHDS_Mesh() -{ -// map::iterator aFamsIter = myFamilies.begin(); -// for (; aFamsIter != myFamilies.end(); aFamsIter++) -// { -// delete (*aFamsIter).second; -// } -} - -void DriverMED_R_SMESHDS_Mesh::SetMesh(SMDS_Mesh * aMesh) -{ - myMesh = aMesh; -} +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif -void DriverMED_R_SMESHDS_Mesh::SetFile(string aFile) -{ - myFile = aFile; -} +#define _EDF_NODE_IDS_ -void DriverMED_R_SMESHDS_Mesh::SetFileId(med_idt aFileId) -{ - myFileId = aFileId; -} - -void DriverMED_R_SMESHDS_Mesh::SetMeshId(int aMeshId) -{ - myMeshId = aMeshId; -} +using namespace MED; void DriverMED_R_SMESHDS_Mesh::SetMeshName(string theMeshName) { myMeshName = theMeshName; } -void DriverMED_R_SMESHDS_Mesh::Read() -{ - - string myClass = string("SMDS_Mesh"); - string myExtension = string("MED"); - - DriverMED_R_SMDS_Mesh *myReader = new DriverMED_R_SMDS_Mesh; - - myReader->SetMesh(myMesh); - myReader->SetMeshId(myMeshId); - myReader->SetFile(myFile); - myReader->SetFileId(-1); - - myReader->Read(); +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 = "<SetMesh(myMesh); - myReader->SetMeshId(myMeshId); +enum ECoordName{eX, eY, eZ, eNone}; +typedef TFloat (*TGetCoord)(MED::PNodeInfo&, TInt); - SCRUTE(myFileId); - myReader->SetFileId(myFileId); +template +TFloat GetCoord(MED::PNodeInfo& thePNodeInfo, TInt theElemId){ + return thePNodeInfo->GetNodeCoord(theElemId,TheCoordId); +} - myReader->Read(); +template<> +TFloat GetCoord(MED::PNodeInfo& thePNodeInfo, TInt theElemId){ + return 0.0; } -static const SMDS_MeshNode* -FindNode(const SMDS_Mesh* theMesh, med_int 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 = "<, + &GetCoord, + &GetCoord +}; + + +static TGetCoord aXYGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord +}; + +static TGetCoord aYZGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord +}; + +static TGetCoord aXZGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord +}; + + +static TGetCoord aXGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord +}; + +static TGetCoord aYGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord +}; + +static TGetCoord aZGetCoord[3] = { + &GetCoord, + &GetCoord, + &GetCoord +}; + + +class TCoordHelper{ + MED::PNodeInfo myPNodeInfo; + TGetCoord* myGetCoord; +public: + TCoordHelper(const MED::PNodeInfo& thePNodeInfo, + TGetCoord* theGetCoord): + myPNodeInfo(thePNodeInfo), + myGetCoord(theGetCoord) + {} + virtual ~TCoordHelper(){} + TFloat GetCoord(TInt theElemId, TInt theCoodId){ + return (*myGetCoord[theCoodId])(myPNodeInfo,theElemId); + } +}; +typedef boost::shared_ptr TCoordHelperPtr; -DriverMED_R_SMESHDS_Mesh::ReadStatus DriverMED_R_SMESHDS_Mesh::ReadMySelf() +Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform() { - ReadStatus result = DRS_FAIL; + Status aResult = DRS_FAIL; try{ - using namespace MEDA; - myFamilies.clear(); - MESSAGE("ReadMySelf - myFile : "<GetNbMeshes()){ for(int iMesh = 0; iMesh < aNbMeshes; iMesh++){ // Reading the MED mesh //--------------------- - PMeshInfo aMeshInfo = aMed.GetMeshInfo(iMesh); + PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1); string aMeshName; if (myMeshId != -1) { ostringstream aMeshNameStr; @@ -145,45 +159,82 @@ DriverMED_R_SMESHDS_Mesh::ReadStatus DriverMED_R_SMESHDS_Mesh::ReadMySelf() } else { aMeshName = myMeshName; } - MESSAGE("ReadMySelf - aMeshName : "<GetName()); + if(MYDEBUG) MESSAGE("Perform - aMeshName : "<GetName()); if(aMeshName != aMeshInfo->GetName()) continue; - result = DRS_OK; - med_int aMeshDim = aMeshInfo->GetDim(); + aResult = DRS_OK; + //TInt aMeshDim = aMeshInfo->GetDim(); // Reading MED families to the temporary structure //------------------------------------------------ - med_int aNbFams = aMed.GetNbFamilies(aMeshInfo); - MESSAGE("Read " << aNbFams << " families"); - for (med_int iFam = 0; iFam < aNbFams; iFam++) { - PFamilyInfo aFamilyInfo = aMed.GetFamilyInfo(aMeshInfo, iFam); - med_int aFamId = aFamilyInfo->GetId(); - MESSAGE("Family " << aFamId << " :"); - -//if (aFamId >= FIRST_VALID_FAMILY) { + 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); - - med_int aNbGrp = aFamilyInfo->GetNbGroup(); - MESSAGE("belong to " << aNbGrp << " groups"); - for (med_int iGr = 0; iGr < aNbGrp; iGr++) { + + TInt aNbGrp = aFamilyInfo->GetNbGroup(); + if(MYDEBUG) MESSAGE("belong to " << aNbGrp << " groups"); + for (TInt iGr = 0; iGr < aNbGrp; iGr++) { string aGroupName = aFamilyInfo->GetGroupName(iGr); - MESSAGE(aGroupName); + if(MYDEBUG) MESSAGE(aGroupName); aFamily->AddGroupName(aGroupName); } -// aFamily->SetId(aFamId); myFamilies[aFamId] = aFamily; -// } + } } // Reading MED nodes to the corresponding SMDS structure //------------------------------------------------------ - PNodeInfo aNodeInfo = aMed.GetNodeInfo(aMeshInfo); - med_booleen anIsNodeNum = aNodeInfo->IsElemNum(); - med_int aNbElems = aNodeInfo->GetNbElem(); - MESSAGE("ReadMySelf - aNodeInfo->GetNbElem() = "<IsElemNum(); + TInt aNbElems = aNodeInfo->GetNbElem(); + if(MYDEBUG) MESSAGE("Perform - aNodeInfo->GetNbElem() = "<X()<<", "<Y()<<", "<Z()<GetFamNum(iElem); + TInt aFamNum = aNodeInfo->GetFamNum(iElem); if (myFamilies.find(aFamNum) != myFamilies.end()) { myFamilies[aFamNum]->AddElement(aNode); @@ -206,226 +257,239 @@ DriverMED_R_SMESHDS_Mesh::ReadStatus DriverMED_R_SMESHDS_Mesh::ReadMySelf() // Reading pre information about all MED cells //-------------------------------------------- bool takeNumbers = true; // initially we trust the numbers from file - MED::TEntityInfo aEntityInfo = aMed.GetEntityInfo(aMeshInfo); + MED::TEntityInfo aEntityInfo = aMed->GetEntityInfo(aMeshInfo); MED::TEntityInfo::iterator anEntityIter = aEntityInfo.begin(); for(; anEntityIter != aEntityInfo.end(); anEntityIter++){ - const med_entite_maillage& anEntity = anEntityIter->first; - if(anEntity == MED_NOEUD) continue; + const EEntiteMaillage& anEntity = anEntityIter->first; + if(anEntity == eNOEUD) continue; // Reading MED cells to the corresponding SMDS structure //------------------------------------------------------ const MED::TGeom& aTGeom = anEntityIter->second; MED::TGeom::const_iterator anTGeomIter = aTGeom.begin(); for(; anTGeomIter != aTGeom.end(); anTGeomIter++){ - const med_geometrie_element& aGeom = anTGeomIter->first; - if(aGeom == MED_POINT1) continue; - PCellInfo aCellInfo = aMed.GetCellInfo(aMeshInfo,anEntity,aGeom); - med_booleen anIsElemNum = takeNumbers ? aCellInfo->IsElemNum() : MED_FAUX; - med_int aNbElems = aCellInfo->GetNbElem(); - MESSAGE("ReadMySelf - anEntity = "<GetElemNum(iElem)<<": "; - //else - // cout<GetFamNum(iElem); + TInt aFamNum = aCellInfo->GetFamNum(iElem); try{ switch(aGeom){ - case MED_SEG2: - case MED_SEG3: + case eSEG2: + case eSEG3: if(anIsElemNum) - anElement = myMesh->AddEdgeWithID(aNodeIds.at(0), - aNodeIds.at(1), + anElement = myMesh->AddEdgeWithID(aNodeIds[0], + aNodeIds[1], aCellInfo->GetElemNum(iElem)); if (!anElement) { - anElement = myMesh->AddEdge(FindNode(myMesh,aNodeIds.at(0)), - FindNode(myMesh,aNodeIds.at(1))); + anElement = myMesh->AddEdge(FindNode(myMesh,aNodeIds[0]), + FindNode(myMesh,aNodeIds[1])); isRenum = anIsElemNum; } break; - case MED_TRIA3: - case MED_TRIA6: + case eTRIA3: + case eTRIA6: aNbNodes = 3; if(anIsElemNum) - anElement = myMesh->AddFaceWithID(aNodeIds.at(0), - aNodeIds.at(1), - aNodeIds.at(2), + anElement = myMesh->AddFaceWithID(aNodeIds[0], + aNodeIds[1], + aNodeIds[2], aCellInfo->GetElemNum(iElem)); if (!anElement) { - anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds.at(0)), - FindNode(myMesh,aNodeIds.at(1)), - FindNode(myMesh,aNodeIds.at(2))); + anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds[0]), + FindNode(myMesh,aNodeIds[1]), + FindNode(myMesh,aNodeIds[2])); isRenum = anIsElemNum; } break; - case MED_QUAD4: - case MED_QUAD8: + case eQUAD4: + case eQUAD8: aNbNodes = 4; // There is some differnce between SMDS and MED if(anIsElemNum) - anElement = myMesh->AddFaceWithID(aNodeIds.at(0), - aNodeIds.at(1), - aNodeIds.at(2), - aNodeIds.at(3), + anElement = myMesh->AddFaceWithID(aNodeIds[0], + aNodeIds[1], + aNodeIds[2], + aNodeIds[3], aCellInfo->GetElemNum(iElem)); if (!anElement) { - anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds.at(0)), - FindNode(myMesh,aNodeIds.at(1)), - FindNode(myMesh,aNodeIds.at(2)), - FindNode(myMesh,aNodeIds.at(3))); + anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds[0]), + FindNode(myMesh,aNodeIds[1]), + FindNode(myMesh,aNodeIds[2]), + FindNode(myMesh,aNodeIds[3])); isRenum = anIsElemNum; } break; - case MED_TETRA4: - case MED_TETRA10: + case eTETRA4: + case eTETRA10: aNbNodes = 4; if(anIsElemNum) - anElement = myMesh->AddVolumeWithID(aNodeIds.at(0), - aNodeIds.at(1), - aNodeIds.at(2), - aNodeIds.at(3), + anElement = myMesh->AddVolumeWithID(aNodeIds[0], + aNodeIds[1], + aNodeIds[2], + aNodeIds[3], aCellInfo->GetElemNum(iElem)); if (!anElement) { - anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds.at(0)), - FindNode(myMesh,aNodeIds.at(1)), - FindNode(myMesh,aNodeIds.at(2)), - FindNode(myMesh,aNodeIds.at(3))); + anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), + FindNode(myMesh,aNodeIds[1]), + FindNode(myMesh,aNodeIds[2]), + FindNode(myMesh,aNodeIds[3])); isRenum = anIsElemNum; } break; - case MED_PYRA5: - case MED_PYRA13: + case ePYRA5: + case ePYRA13: aNbNodes = 5; // There is some differnce between SMDS and MED if(anIsElemNum) - anElement = myMesh->AddVolumeWithID(aNodeIds.at(0), - aNodeIds.at(1), - aNodeIds.at(2), - aNodeIds.at(3), - aNodeIds.at(4), + anElement = myMesh->AddVolumeWithID(aNodeIds[0], + aNodeIds[1], + aNodeIds[2], + aNodeIds[3], + aNodeIds[4], aCellInfo->GetElemNum(iElem)); if (!anElement) { - anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds.at(0)), - FindNode(myMesh,aNodeIds.at(1)), - FindNode(myMesh,aNodeIds.at(2)), - FindNode(myMesh,aNodeIds.at(3)), - FindNode(myMesh,aNodeIds.at(4))); + 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 MED_PENTA6: - case MED_PENTA15: + case ePENTA6: + case ePENTA15: aNbNodes = 6; if(anIsElemNum) - anElement = myMesh->AddVolumeWithID(aNodeIds.at(0), - aNodeIds.at(1), - aNodeIds.at(2), - aNodeIds.at(3), - aNodeIds.at(4), - aNodeIds.at(5), + 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.at(0)), - FindNode(myMesh,aNodeIds.at(1)), - FindNode(myMesh,aNodeIds.at(2)), - FindNode(myMesh,aNodeIds.at(3)), - FindNode(myMesh,aNodeIds.at(4)), - FindNode(myMesh,aNodeIds.at(5))); + 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 MED_HEXA8: - case MED_HEXA20: + case eHEXA8: + case eHEXA20: aNbNodes = 8; if(anIsElemNum) - anElement = myMesh->AddVolumeWithID(aNodeIds.at(0), - aNodeIds.at(1), - aNodeIds.at(2), - aNodeIds.at(3), - aNodeIds.at(4), - aNodeIds.at(5), - aNodeIds.at(6), - aNodeIds.at(7), + 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.at(0)), - FindNode(myMesh,aNodeIds.at(1)), - FindNode(myMesh,aNodeIds.at(2)), - FindNode(myMesh,aNodeIds.at(3)), - FindNode(myMesh,aNodeIds.at(4)), - FindNode(myMesh,aNodeIds.at(5)), - FindNode(myMesh,aNodeIds.at(6)), - FindNode(myMesh,aNodeIds.at(7))); + 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; } }catch(const std::exception& exc){ //INFOS("Follow exception was cought:\n\t"<GetNbMeshes()) { for (int iMesh = 0; iMesh < aNbMeshes; iMesh++) { // Reading the MED mesh //--------------------- - PMeshInfo aMeshInfo = aMed.GetMeshInfo(iMesh); + PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1); aMeshNames.push_back(aMeshInfo->GetName()); } } }catch(const std::exception& exc){ INFOS("Follow exception was cought:\n\t"< DriverMED_R_SMESHDS_Mesh::GetGroupNames() void DriverMED_R_SMESHDS_Mesh::GetGroup(SMESHDS_Group* theGroup) { string aGroupName (theGroup->GetStoreName()); - MESSAGE("Get Group " << aGroupName); + if(MYDEBUG) MESSAGE("Get Group " << aGroupName); map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) @@ -517,10 +582,14 @@ void DriverMED_R_SMESHDS_Mesh::GetGroup(SMESHDS_Group* theGroup) { const set& anElements = aFamily->GetElements(); set::iterator anElemsIter = anElements.begin(); + const SMDS_MeshElement * element = 0; for (; anElemsIter != anElements.end(); anElemsIter++) { - theGroup->SMDS_MeshGroup::Add(*anElemsIter); + element = *anElemsIter; + theGroup->SMDSGroup().Add(element); } + if ( element ) + theGroup->SetType( element->GetType() ); } } } @@ -560,10 +629,6 @@ void DriverMED_R_SMESHDS_Mesh::GetSubMesh (SMESHDS_SubMesh* theSubMesh, void DriverMED_R_SMESHDS_Mesh::CreateAllSubMeshes () { - SMESHDS_Mesh* aSMESHDSMesh = dynamic_cast(myMesh); - if (!aSMESHDSMesh) { - EXCEPTION(runtime_error,"Can not cast SMDS_Mesh to SMESHDS_Mesh"); - } map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) { @@ -583,18 +648,28 @@ void DriverMED_R_SMESHDS_Mesh::CreateAllSubMeshes () { for (; anElemsIter != anElements.end(); anElemsIter++) { - const SMDS_MeshNode* node = static_cast(*anElemsIter); - aSMESHDSMesh->SetNodeInVolume(node, Id); -// aSMESHDSMesh->SetNodeOnFace(node, Id); -// aSMESHDSMesh->SetNodeOnEdge(node, Id); -// aSMESHDSMesh->SetNodeOnVertex(node, Id); + 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++) { - aSMESHDSMesh->SetMeshElementOnShape(*anElemsIter, Id); + myMesh->SetMeshElementOnShape(*anElemsIter, Id); } } }