X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FDriverMED%2FDriverMED_R_SMESHDS_Mesh.cxx;h=99f892d14e1ab10815817b5400f50d0f2a88d412;hb=adc76cf234693fd9a7bb24ea76b6f43eb0bc7b9b;hp=8388327d91af7d64048b6ee04b50f72f003a7606;hpb=87fd8ca50b1fe004fc046c66c5b5df6199861981;p=modules%2Fsmesh.git diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx index 8388327d9..99f892d14 100644 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx @@ -1,29 +1,28 @@ -// SMESH DriverMED : driver to read and write 'med' files +// Copyright (C) 2007-2008 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. // -// Copyright (C) 2003 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. -// -// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// 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 "DriverMED_R_SMDS_Mesh.h" #include "SMESHDS_Mesh.hxx" @@ -34,12 +33,14 @@ #include "SMESHDS_Group.hxx" #include "MED_Factory.hxx" +#include "MED_CoordUtils.hxx" #include "MED_Utilities.hxx" #include #ifdef _DEBUG_ static int MYDEBUG = 0; +//#define _DEXCEPT_ #else static int MYDEBUG = 0; #endif @@ -48,7 +49,9 @@ static int MYDEBUG = 0; using namespace MED; -void DriverMED_R_SMESHDS_Mesh::SetMeshName(string theMeshName) +void +DriverMED_R_SMESHDS_Mesh +::SetMeshName(std::string theMeshName) { myMeshName = theMeshName; } @@ -57,93 +60,21 @@ 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 = "< -TFloat GetCoord(MED::PNodeInfo& thePNodeInfo, TInt theElemId){ - return thePNodeInfo->GetNodeCoord(theElemId,TheCoordId); + EXCEPTION(std::runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "< -TFloat GetCoord(MED::PNodeInfo& thePNodeInfo, TInt 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{ - 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; - -Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform() +Driver_Mesh::Status +DriverMED_R_SMESHDS_Mesh +::Perform() { Status aResult = DRS_FAIL; +#ifndef _DEXCEPT_ try{ +#endif myFamilies.clear(); if(MYDEBUG) MESSAGE("Perform - myFile : "<GetNbMeshes()){ @@ -151,9 +82,10 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform() // Reading the MED mesh //--------------------- PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1); - string aMeshName; + + std::string aMeshName; if (myMeshId != -1) { - ostringstream aMeshNameStr; + std::ostringstream aMeshNameStr; aMeshNameStr<GetName()); if(aMeshName != aMeshInfo->GetName()) continue; aResult = DRS_OK; + //TInt aMeshDim = aMeshInfo->GetDim(); // Reading MED families to the temporary structure @@ -179,64 +112,49 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform() 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); + std::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 = */buildMeshGrille(aMed,aMeshInfo); + continue; + } + // Reading MED nodes to the corresponding SMDS structure //------------------------------------------------------ - PNodeInfo aNodeInfo = aMed->GetPNodeInfo(aMeshInfo); + PNodeInfo aNodeInfo = aMed->GetPNodeInfo(aMeshInfo); + if (!aNodeInfo) { + aResult = DRS_FAIL; + continue; + } - TCoordHelperPtr aCoordHelperPtr; - { - TInt aMeshDimension = aMeshInfo->GetDim(); - bool anIsDimPresent[3] = {false, false, false}; - for(TInt 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; - } - } + PCoordHelper aCoordHelper = GetCoordHelper(aNodeInfo); EBooleen anIsNodeNum = aNodeInfo->IsElemNum(); TInt aNbElems = aNodeInfo->GetNbElem(); if(MYDEBUG) MESSAGE("Perform - aNodeInfo->GetNbElem() = "<GetFamNum(iPE); - - try { - if (anIsElemNum) { - anElement = myMesh->AddPolyhedralVolumeWithID - (nodes_ids, quantities, aPolyedreInfo->GetElemNum(iPE)); - } - if (!anElement) { - std::vector nodes (nbPENodes); - for (int inode = 0; inode < nbPENodes; inode++) { - nodes[inode] = FindNode(myMesh, nodes_ids[inode]); + const SMDS_MeshElement* anElement = NULL; + TInt aFamNum = aCellInfo->GetFamNum(iElem); +#ifndef _DEXCEPT_ + try{ +#endif + //MESSAGE("Try to create element # " << iElem << " with id = " + // << aCellInfo->GetElemNum(iElem)); + switch(aGeom) { + 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; } - anElement = myMesh->AddPolyhedralVolume(nodes, quantities); - 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 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 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; + // 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 ePYRA13: + aNbNodes = 13; + // There is some differnce between SMDS and MED + 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 ePOINT1: + anElement = FindNode(myMesh,aNodeIds[0]); + break; } - } catch (const std::exception& exc) { +#ifndef _DEXCEPT_ + }catch(const std::exception& exc){ + //INFOS("Follow exception was cought:\n\t"<AddElement(anElement); - aFamily->SetType(anElement->GetType()); + myFamilies[aFamNum]->AddElement(anElement); + myFamilies[aFamNum]->SetType(anElement->GetType()); } } - } // for (int iPE = 0; iPE < nbPolyedres; iPE++) - continue; - - } else { - } - - PCellInfo aCellInfo = aMed->GetPCellInfo(aMeshInfo,anEntity,aGeom); - EBooleen anIsElemNum = takeNumbers ? aCellInfo->IsElemNum() : eFAUX; - TInt aNbElems = aCellInfo->GetNbElem(); - if(MYDEBUG) 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], - aCellInfo->GetElemNum(iElem)); - if (!anElement) { - anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds[0]), - FindNode(myMesh,aNodeIds[1]), - 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], - 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 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; - } - }catch(const std::exception& exc){ - //INFOS("Follow exception was cought:\n\t"<AddElement(anElement); - aFamily->SetType(anElement->GetType()); - } } - } - } - } - break; + }} + } + } } } +#ifndef _DEXCEPT_ }catch(const std::exception& exc){ INFOS("Follow exception was cought:\n\t"< DriverMED_R_SMESHDS_Mesh::GetMeshNames(Status& theStatus) return aMeshNames; } -list DriverMED_R_SMESHDS_Mesh::GetGroupNamesAndTypes() +std::list DriverMED_R_SMESHDS_Mesh::GetGroupNamesAndTypes() { - list aResult; - set aResGroupNames; + std::list aResult; + std::set aResGroupNames; - map::iterator aFamsIter = myFamilies.begin(); + std::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(); + std::set::const_iterator aGrNamesIter = aGroupNames.begin(); for (; aGrNamesIter != aGroupNames.end(); aGrNamesIter++) { TNameAndType aNameAndType = make_pair( *aGrNamesIter, aFamily->GetType() ); @@ -745,25 +785,28 @@ list DriverMED_R_SMESHDS_Mesh::GetGroupNamesAndTypes() void DriverMED_R_SMESHDS_Mesh::GetGroup(SMESHDS_Group* theGroup) { - string aGroupName (theGroup->GetStoreName()); + std::string aGroupName (theGroup->GetStoreName()); if(MYDEBUG) MESSAGE("Get Group " << aGroupName); - map::iterator aFamsIter = myFamilies.begin(); + std::map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) { DriverMED_FamilyPtr aFamily = (*aFamsIter).second; if (aFamily->GetType() == theGroup->GetType() && aFamily->MemberOf(aGroupName)) { - const set& anElements = aFamily->GetElements(); - set::const_iterator anElemsIter = anElements.begin(); + const std::set& anElements = aFamily->GetElements(); + std::set::const_iterator anElemsIter = anElements.begin(); const SMDS_MeshElement * element = 0; for (; anElemsIter != anElements.end(); anElemsIter++) { element = *anElemsIter; theGroup->SMDSGroup().Add(element); + int aGroupAttrVal = aFamily->GetGroupAttributVal(); + if( aGroupAttrVal != 0) + theGroup->SetColorGroup(aGroupAttrVal); } if ( element ) - theGroup->SetType( element->GetType() ); + theGroup->SetType( theGroup->SMDSGroup().GetType() ); } } } @@ -773,15 +816,15 @@ void DriverMED_R_SMESHDS_Mesh::GetSubMesh (SMESHDS_SubMesh* theSubMesh, { char submeshGrpName[ 30 ]; sprintf( submeshGrpName, "SubMesh %d", theId ); - string aName (submeshGrpName); - map::iterator aFamsIter = myFamilies.begin(); + std::string aName (submeshGrpName); + std::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(); + const std::set& anElements = aFamily->GetElements(); + std::set::const_iterator anElemsIter = anElements.begin(); if (aFamily->GetType() == SMDSAbs_Node) { for (; anElemsIter != anElements.end(); anElemsIter++) @@ -803,21 +846,21 @@ void DriverMED_R_SMESHDS_Mesh::GetSubMesh (SMESHDS_SubMesh* theSubMesh, void DriverMED_R_SMESHDS_Mesh::CreateAllSubMeshes () { - map::iterator aFamsIter = myFamilies.begin(); + std::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(); + std::set::iterator aGrNamesIter = aGroupNames.begin(); for (; aGrNamesIter != aGroupNames.end(); aGrNamesIter++) { - string aName = *aGrNamesIter; + std::string aName = *aGrNamesIter; // Check, if this is a Group or SubMesh name - if (aName.substr(0, 7) == string("SubMesh")) + if (aName.substr(0, 7) == std::string("SubMesh")) { - int Id = atoi(string(aName).substr(7).c_str()); - set anElements = aFamily->GetElements(); - set::iterator anElemsIter = anElements.begin(); + int Id = atoi(std::string(aName).substr(7).c_str()); + std::set anElements = aFamily->GetElements(); + std::set::iterator anElemsIter = anElements.begin(); if (aFamily->GetType() == SMDSAbs_Node) { for (; anElemsIter != anElements.end(); anElemsIter++) @@ -859,7 +902,7 @@ void DriverMED_R_SMESHDS_Mesh::CreateAllSubMeshes () bool DriverMED_R_SMESHDS_Mesh::checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const { if ( !aFamily || aFamily->GetId() != anID ) { - map::const_iterator i_fam = myFamilies.find(anID); + std::map::const_iterator i_fam = myFamilies.find(anID); if ( i_fam == myFamilies.end() ) return false; aFamily = i_fam->second; @@ -867,3 +910,93 @@ bool DriverMED_R_SMESHDS_Mesh::checkFamilyID(DriverMED_FamilyPtr & aFamily, int 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 + * \return TRUE, if successfully. Else FALSE + */ +bool DriverMED_R_SMESHDS_Mesh::buildMeshGrille(const MED::PWrapper& theWrapper, + const MED::PMeshInfo& theMeshInfo) +{ + 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],(int)iNode); + + if((aGrilleInfo->myFamNumNode).size() > 0){ + TInt aFamNum = aGrilleInfo->GetFamNumNode(iNode); + if ( checkFamilyID ( aFamily, aFamNum )) + { + 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(std::runtime_error,"buildMeshGrille Error. Incorrect size of ids 2!="<AddEdgeWithID(aNodeIds[0], + aNodeIds[1], + iCell); + break; + case MED::eQUAD4: + if(aNodeIds.size() != 4){ + res = false; + EXCEPTION(std::runtime_error,"buildMeshGrille Error. Incorrect size of ids 4!="<AddFaceWithID(aNodeIds[0], + aNodeIds[2], + aNodeIds[3], + aNodeIds[1], + iCell); + break; + case MED::eHEXA8: + if(aNodeIds.size() != 8){ + res = false; + EXCEPTION(std::runtime_error,"buildMeshGrille Error. Incorrect size of ids 8!="<AddVolumeWithID(aNodeIds[0], + aNodeIds[2], + aNodeIds[3], + aNodeIds[1], + aNodeIds[4], + aNodeIds[6], + aNodeIds[7], + aNodeIds[5], + iCell); + break; + default: + break; + } + + if((aGrilleInfo->myFamNum).size() > 0){ + TInt aFamNum = aGrilleInfo->GetFamNum(iCell); + if ( checkFamilyID ( aFamily, aFamNum )){ + aFamily->AddElement(anElement); + aFamily->SetType(anElement->GetType()); + } + } + } + + return res; +}