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=e88e3598d5759df2ad66bbd208653e0c1588ecf6;hp=513454316ef57da8f9328384f0d6a4469eae7aad;hb=f4613e1c365b2624ab610d7eab4deab7d6f5b623;hpb=e4737e85f0da6d3f90fd08f6be1c2825195fe16f diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx index 513454316..e88e3598d 100644 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx @@ -33,118 +33,53 @@ #include "SMESHDS_Group.hxx" -#include "MEDA_Wrapper.hxx" +#include "MED_Factory.hxx" +#include "MED_CoordUtils.hxx" #include "MED_Utilities.hxx" #include +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif + #define _EDF_NODE_IDS_ -void DriverMED_R_SMESHDS_Mesh::SetMeshName(string theMeshName) +using namespace MED; + +void +DriverMED_R_SMESHDS_Mesh +::SetMeshName(string theMeshName) { myMeshName = theMeshName; } static const SMDS_MeshNode* -FindNode(const SMDS_Mesh* theMesh, med_int theId){ +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 = "< -med_float GetCoord(MEDA::PNodeInfo& thePNodeInfo, med_int theElemId){ - return thePNodeInfo->GetNodeCoord(theElemId,TheCoordId); -} - -template<> -med_float GetCoord(MEDA::PNodeInfo& thePNodeInfo, med_int theElemId){ - return 0.0; -} - - -static TGetCoord aXYZGetCoord[3] = { - &GetCoord, - &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{ - MEDA::PNodeInfo myPNodeInfo; - TGetCoord* myGetCoord; -public: - TCoordHelper(const MEDA::PNodeInfo& thePNodeInfo, - TGetCoord* theGetCoord): - myPNodeInfo(thePNodeInfo), - myGetCoord(theGetCoord) - {} - virtual ~TCoordHelper(){} - med_float GetCoord(med_int theElemId, med_int theCoodId){ - return (*myGetCoord[theCoodId])(myPNodeInfo,theElemId); - } -}; -typedef boost::shared_ptr TCoordHelperPtr; - - -Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform() +Driver_Mesh::Status +DriverMED_R_SMESHDS_Mesh +::Perform() { Status aResult = DRS_FAIL; try{ - using namespace MEDA; - myFamilies.clear(); - MESSAGE("Perform - 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; @@ -153,79 +88,49 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform() } else { aMeshName = myMeshName; } - MESSAGE("Perform - aMeshName : "<GetName()); + if(MYDEBUG) MESSAGE("Perform - aMeshName : "<GetName()); if(aMeshName != aMeshInfo->GetName()) continue; aResult = DRS_OK; - med_int aMeshDim = aMeshInfo->GetDim(); + //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 << " :"); - + 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); } myFamilies[aFamId] = aFamily; + } } // Reading MED nodes to the corresponding SMDS structure //------------------------------------------------------ - PNodeInfo aNodeInfo = aMed.GetNodeInfo(aMeshInfo); - - TCoordHelperPtr aCoordHelperPtr; - { - med_int aMeshDimension = aMeshInfo->GetDim(); - bool anIsDimPresent[3] = {false, false, false}; - for(med_int iDim = 0; iDim < aMeshDimension; iDim++){ - string aDimName = aNodeInfo->GetCoordName(iDim); - if(aDimName == "x" || aDimName == "X") - anIsDimPresent[eX] = true; - else if(aDimName == "y" || aDimName == "Y") - anIsDimPresent[eY] = true; - else if(aDimName == "z" || aDimName == "Z") - anIsDimPresent[eZ] = true; - } - switch(aMeshDimension){ - case 3: - aCoordHelperPtr.reset(new TCoordHelper(aNodeInfo,aXYZGetCoord)); - break; - case 2: - if(anIsDimPresent[eY] && anIsDimPresent[eZ]) - aCoordHelperPtr.reset(new TCoordHelper(aNodeInfo,aYZGetCoord)); - else if(anIsDimPresent[eX] && anIsDimPresent[eZ]) - aCoordHelperPtr.reset(new TCoordHelper(aNodeInfo,aXZGetCoord)); - else - aCoordHelperPtr.reset(new TCoordHelper(aNodeInfo,aXYGetCoord)); - break; - case 1: - if(anIsDimPresent[eY]) - aCoordHelperPtr.reset(new TCoordHelper(aNodeInfo,aYGetCoord)); - else if(anIsDimPresent[eZ]) - aCoordHelperPtr.reset(new TCoordHelper(aNodeInfo,aZGetCoord)); - else - aCoordHelperPtr.reset(new TCoordHelper(aNodeInfo,aXGetCoord)); - break; - } - } + PNodeInfo aNodeInfo = aMed->GetPNodeInfo(aMeshInfo); - med_booleen anIsNodeNum = aNodeInfo->IsElemNum(); - med_int aNbElems = aNodeInfo->GetNbElem(); - MESSAGE("Perform - aNodeInfo->GetNbElem() = "<GetNbElem() = "<X()<<", "<Y()<<", "<Z()<GetFamNum(iElem); + TInt aFamNum = aNodeInfo->GetFamNum(iElem); if (myFamilies.find(aFamNum) != myFamilies.end()) { myFamilies[aFamNum]->AddElement(aNode); @@ -247,237 +152,383 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform() // Reading pre information about all MED cells //-------------------------------------------- + typedef std::vector TNodeIds; 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("Perform - anEntity = "<GetFamNum(iElem); + try{ + //MESSAGE("Try to create element # " << iElem << " with id = " + // << aCellInfo->GetElemNum(iElem)); + switch(aGeom){ + case eSEG2: + case eSEG3: + 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 eTRIA3: + case eTRIA6: + aNbNodes = 3; + if(anIsElemNum) + anElement = myMesh->AddFaceWithID(aNodeIds[0], aNodeIds[1], aNodeIds[2], - aNodeIds[3], - aNodeIds[4], - aNodeIds[5], aCellInfo->GetElemNum(iElem)); - if (!anElement) { - anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds[0]), + 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 MED_HEXA8: - case MED_HEXA20: - aNbNodes = 8; - if(anIsElemNum) - anElement = myMesh->AddVolumeWithID(aNodeIds[0], + FindNode(myMesh,aNodeIds[2])); + isRenum = anIsElemNum; + } + break; + case eQUAD4: + case eQUAD8: + aNbNodes = 4; + // There is some differnce between SMDS and MED + 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->AddVolume(FindNode(myMesh,aNodeIds[0]), + 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; + FindNode(myMesh,aNodeIds[3])); + isRenum = anIsElemNum; + } + break; + case eTETRA4: + case eTETRA10: + 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 ePYRA5: + case ePYRA13: + aNbNodes = 5; + // There is some differnce between SMDS and MED + 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 ePENTA6: + case ePENTA15: + 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 eHEXA8: + case eHEXA20: + 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; } - break; + }catch(const std::exception& exc){ + //INFOS("Follow exception was cought:\n\t"<AddElement(anElement); - myFamilies[aFamNum]->SetType(anElement->GetType()); - } - } - } + if (!anElement) { + aResult = DRS_WARN_SKIP_ELEM; + } + else { + if (isRenum) { + anIsElemNum = eFAUX; + takeNumbers = false; + if (aResult < DRS_WARN_RENUMBER) + aResult = DRS_WARN_RENUMBER; + } + if (myFamilies.find(aFamNum) != myFamilies.end()) { + // Save reference to this element from its family + myFamilies[aFamNum]->AddElement(anElement); + myFamilies[aFamNum]->SetType(anElement->GetType()); + } + } + } + }} } } - break; } } }catch(const std::exception& exc){ @@ -487,7 +538,7 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform() INFOS("Unknown exception was cought !!!"); aResult = DRS_FAIL; } - MESSAGE("Perform - aResult status = "<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()); } } @@ -551,7 +600,7 @@ list 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++) @@ -565,7 +614,7 @@ void DriverMED_R_SMESHDS_Mesh::GetGroup(SMESHDS_Group* theGroup) for (; anElemsIter != anElements.end(); anElemsIter++) { element = *anElemsIter; - theGroup->SMDSGroup().Add(element); + theGroup->SMDSGroup().Add(element); } if ( element ) theGroup->SetType( element->GetType() );