This commit is contained in:
eap 2009-11-05 08:44:26 +00:00
parent 4d5accf2df
commit 708462a58f
5 changed files with 247 additions and 247 deletions

View File

@ -28,7 +28,7 @@
#include "DriverMED_Family.h" #include "DriverMED_Family.h"
#include "MED_Factory.hxx" #include "MED_Factory.hxx"
#include <sstream> #include <sstream>
using namespace std; using namespace std;
@ -139,11 +139,11 @@ DriverMED_Family
DriverMED_FamilyPtrList DriverMED_FamilyPtrList
DriverMED_Family DriverMED_Family
::MakeFamilies(const SMESHDS_SubMeshPtrMap& theSubMeshes, ::MakeFamilies(const SMESHDS_SubMeshPtrMap& theSubMeshes,
const SMESHDS_GroupBasePtrList& theGroups, const SMESHDS_GroupBasePtrList& theGroups,
const bool doGroupOfNodes, const bool doGroupOfNodes,
const bool doGroupOfEdges, const bool doGroupOfEdges,
const bool doGroupOfFaces, const bool doGroupOfFaces,
const bool doGroupOfVolumes) const bool doGroupOfVolumes)
{ {
DriverMED_FamilyPtrList aFamilies; DriverMED_FamilyPtrList aFamilies;
@ -189,7 +189,7 @@ DriverMED_Family
aFamilies.erase(aCurrIter); aFamilies.erase(aCurrIter);
} }
if (aFam2->IsEmpty()) if (aFam2->IsEmpty())
break; break;
} }
} }
// The rest elements of family // The rest elements of family
@ -218,7 +218,7 @@ DriverMED_Family
aFam1->Split(aFam2, aCommon); aFam1->Split(aFam2, aCommon);
if (!aCommon->IsEmpty()) if (!aCommon->IsEmpty())
{ {
aCommon->SetGroupAttributVal(0); aCommon->SetGroupAttributVal(0);
aFamilies.push_back(aCommon); aFamilies.push_back(aCommon);
} }
if (aFam1->IsEmpty()) if (aFam1->IsEmpty())
@ -226,7 +226,7 @@ DriverMED_Family
aFamilies.erase(aCurrIter); aFamilies.erase(aCurrIter);
} }
if (aFam2->IsEmpty()) if (aFam2->IsEmpty())
break; break;
} }
} }
// The rest elements of group // The rest elements of group
@ -310,7 +310,7 @@ DriverMED_Family
//============================================================================= //=============================================================================
MED::PFamilyInfo MED::PFamilyInfo
DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper, DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper,
const MED::PMeshInfo& theMeshInfo) const const MED::PMeshInfo& theMeshInfo) const
{ {
ostringstream aStr; ostringstream aStr;
aStr << "FAM_" << myId; aStr << "FAM_" << myId;
@ -332,20 +332,20 @@ DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper,
MED::PFamilyInfo anInfo; MED::PFamilyInfo anInfo;
if(myId == 0 || myGroupAttributVal == 0){ if(myId == 0 || myGroupAttributVal == 0){
anInfo = theWrapper->CrFamilyInfo(theMeshInfo, anInfo = theWrapper->CrFamilyInfo(theMeshInfo,
aValue, aValue,
myId, myId,
myGroupNames); myGroupNames);
}else{ }else{
MED::TStringVector anAttrDescs (1, ""); // 1 attribute with empty description, MED::TStringVector anAttrDescs (1, ""); // 1 attribute with empty description,
MED::TIntVector anAttrIds (1, myId); // Id=0, MED::TIntVector anAttrIds (1, myId); // Id=0,
MED::TIntVector anAttrVals (1, myGroupAttributVal); MED::TIntVector anAttrVals (1, myGroupAttributVal);
anInfo = theWrapper->CrFamilyInfo(theMeshInfo, anInfo = theWrapper->CrFamilyInfo(theMeshInfo,
aValue, aValue,
myId, myId,
myGroupNames, myGroupNames,
anAttrDescs, anAttrDescs,
anAttrIds, anAttrIds,
anAttrVals); anAttrVals);
} }
// cout << endl; // cout << endl;
@ -413,7 +413,7 @@ void DriverMED_Family::Init (SMESHDS_GroupBase* theGroup)
DriverMED_FamilyPtrList DriverMED_FamilyPtrList
DriverMED_Family DriverMED_Family
::SplitByType (SMESHDS_SubMesh* theSubMesh, ::SplitByType (SMESHDS_SubMesh* theSubMesh,
const int theId) const int theId)
{ {
DriverMED_FamilyPtrList aFamilies; DriverMED_FamilyPtrList aFamilies;
DriverMED_FamilyPtr aNodesFamily (new DriverMED_Family); DriverMED_FamilyPtr aNodesFamily (new DriverMED_Family);

View File

@ -68,16 +68,16 @@ class MESHDRIVERMED_EXPORT DriverMED_Family
static static
DriverMED_FamilyPtrList DriverMED_FamilyPtrList
MakeFamilies (const SMESHDS_SubMeshPtrMap& theSubMeshes, MakeFamilies (const SMESHDS_SubMeshPtrMap& theSubMeshes,
const SMESHDS_GroupBasePtrList& theGroups, const SMESHDS_GroupBasePtrList& theGroups,
const bool doGroupOfNodes, const bool doGroupOfNodes,
const bool doGroupOfEdges, const bool doGroupOfEdges,
const bool doGroupOfFaces, const bool doGroupOfFaces,
const bool doGroupOfVolumes); const bool doGroupOfVolumes);
//! Create TFamilyInfo for this family //! Create TFamilyInfo for this family
MED::PFamilyInfo MED::PFamilyInfo
GetFamilyInfo (const MED::PWrapper& theWrapper, GetFamilyInfo (const MED::PWrapper& theWrapper,
const MED::PMeshInfo& theMeshInfo) const; const MED::PMeshInfo& theMeshInfo) const;
//! Returns elements of this family //! Returns elements of this family
const ElementsSet& GetElements () const; const ElementsSet& GetElements () const;
@ -113,7 +113,7 @@ class MESHDRIVERMED_EXPORT DriverMED_Family
static static
DriverMED_FamilyPtrList DriverMED_FamilyPtrList
SplitByType(SMESHDS_SubMesh* theSubMesh, SplitByType(SMESHDS_SubMesh* theSubMesh,
const int theId); const int theId);
/*! Remove from <Elements> elements, common with <by>, /*! Remove from <Elements> elements, common with <by>,
@ -121,7 +121,7 @@ class MESHDRIVERMED_EXPORT DriverMED_Family
Create family <common> from common elements, with combined groups list. Create family <common> from common elements, with combined groups list.
*/ */
void Split (DriverMED_FamilyPtr by, void Split (DriverMED_FamilyPtr by,
DriverMED_FamilyPtr common); DriverMED_FamilyPtr common);
//! Check, if this family has empty list of elements //! Check, if this family has empty list of elements
bool IsEmpty () const; bool IsEmpty () const;

View File

@ -79,9 +79,9 @@ DriverMED_R_SMESHDS_Mesh
aResult = DRS_EMPTY; aResult = DRS_EMPTY;
if(TInt aNbMeshes = aMed->GetNbMeshes()){ if(TInt aNbMeshes = aMed->GetNbMeshes()){
for(int iMesh = 0; iMesh < aNbMeshes; iMesh++){ for(int iMesh = 0; iMesh < aNbMeshes; iMesh++){
// Reading the MED mesh // Reading the MED mesh
//--------------------- //---------------------
PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1); PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1);
std::string aMeshName; std::string aMeshName;
if (myMeshId != -1) { if (myMeshId != -1) {
@ -91,76 +91,76 @@ DriverMED_R_SMESHDS_Mesh
} else { } else {
aMeshName = myMeshName; aMeshName = myMeshName;
} }
if(MYDEBUG) MESSAGE("Perform - aMeshName : "<<aMeshName<<"; "<<aMeshInfo->GetName()); if(MYDEBUG) MESSAGE("Perform - aMeshName : "<<aMeshName<<"; "<<aMeshInfo->GetName());
if(aMeshName != aMeshInfo->GetName()) continue; if(aMeshName != aMeshInfo->GetName()) continue;
aResult = DRS_OK; aResult = DRS_OK;
//TInt aMeshDim = aMeshInfo->GetDim(); //TInt aMeshDim = aMeshInfo->GetDim();
// Reading MED families to the temporary structure // Reading MED families to the temporary structure
//------------------------------------------------ //------------------------------------------------
TErr anErr; TErr anErr;
TInt aNbFams = aMed->GetNbFamilies(aMeshInfo); TInt aNbFams = aMed->GetNbFamilies(aMeshInfo);
if(MYDEBUG) MESSAGE("Read " << aNbFams << " families"); if(MYDEBUG) MESSAGE("Read " << aNbFams << " families");
for (TInt iFam = 0; iFam < aNbFams; iFam++) { for (TInt iFam = 0; iFam < aNbFams; iFam++) {
PFamilyInfo aFamilyInfo = aMed->GetPFamilyInfo(aMeshInfo,iFam+1,&anErr); PFamilyInfo aFamilyInfo = aMed->GetPFamilyInfo(aMeshInfo,iFam+1,&anErr);
if(anErr >= 0){ if(anErr >= 0){
TInt aFamId = aFamilyInfo->GetId(); TInt aFamId = aFamilyInfo->GetId();
if(MYDEBUG) MESSAGE("Family " << aFamId << " :"); if(MYDEBUG) MESSAGE("Family " << aFamId << " :");
DriverMED_FamilyPtr aFamily (new DriverMED_Family); DriverMED_FamilyPtr aFamily (new DriverMED_Family);
TInt aNbGrp = aFamilyInfo->GetNbGroup(); TInt aNbGrp = aFamilyInfo->GetNbGroup();
if(MYDEBUG) MESSAGE("belong to " << aNbGrp << " groups"); if(MYDEBUG) MESSAGE("belong to " << aNbGrp << " groups");
bool isAttrOk = false; bool isAttrOk = false;
if(aFamilyInfo->GetNbAttr() == aNbGrp) if(aFamilyInfo->GetNbAttr() == aNbGrp)
isAttrOk = true; isAttrOk = true;
for (TInt iGr = 0; iGr < aNbGrp; iGr++) { for (TInt iGr = 0; iGr < aNbGrp; iGr++) {
std::string aGroupName = aFamilyInfo->GetGroupName(iGr); std::string aGroupName = aFamilyInfo->GetGroupName(iGr);
if(isAttrOk){ if(isAttrOk){
TInt anAttrVal = aFamilyInfo->GetAttrVal(iGr); TInt anAttrVal = aFamilyInfo->GetAttrVal(iGr);
aFamily->SetGroupAttributVal(anAttrVal); aFamily->SetGroupAttributVal(anAttrVal);
} }
if(MYDEBUG) MESSAGE(aGroupName); if(MYDEBUG) MESSAGE(aGroupName);
aFamily->AddGroupName(aGroupName); aFamily->AddGroupName(aGroupName);
} }
aFamily->SetId( aFamId ); aFamily->SetId( aFamId );
myFamilies[aFamId] = aFamily; myFamilies[aFamId] = aFamily;
} }
} }
if (aMeshInfo->GetType() == MED::eSTRUCTURE){ if (aMeshInfo->GetType() == MED::eSTRUCTURE){
/*bool aRes = */buildMeshGrille(aMed,aMeshInfo); /*bool aRes = */buildMeshGrille(aMed,aMeshInfo);
continue; continue;
} }
// Reading MED nodes to the corresponding SMDS structure // Reading MED nodes to the corresponding SMDS structure
//------------------------------------------------------ //------------------------------------------------------
PNodeInfo aNodeInfo = aMed->GetPNodeInfo(aMeshInfo); PNodeInfo aNodeInfo = aMed->GetPNodeInfo(aMeshInfo);
if (!aNodeInfo) { if (!aNodeInfo) {
aResult = DRS_FAIL; aResult = DRS_FAIL;
continue; continue;
} }
PCoordHelper aCoordHelper = GetCoordHelper(aNodeInfo); PCoordHelper aCoordHelper = GetCoordHelper(aNodeInfo);
EBooleen anIsNodeNum = aNodeInfo->IsElemNum(); EBooleen anIsNodeNum = aNodeInfo->IsElemNum();
TInt aNbElems = aNodeInfo->GetNbElem(); TInt aNbElems = aNodeInfo->GetNbElem();
if(MYDEBUG) MESSAGE("Perform - aNodeInfo->GetNbElem() = "<<aNbElems<<"; anIsNodeNum = "<<anIsNodeNum); if(MYDEBUG) MESSAGE("Perform - aNodeInfo->GetNbElem() = "<<aNbElems<<"; anIsNodeNum = "<<anIsNodeNum);
DriverMED_FamilyPtr aFamily; DriverMED_FamilyPtr aFamily;
for(TInt iElem = 0; iElem < aNbElems; iElem++){ for(TInt iElem = 0; iElem < aNbElems; iElem++){
TCCoordSlice aCoordSlice = aNodeInfo->GetCoordSlice(iElem); TCCoordSlice aCoordSlice = aNodeInfo->GetCoordSlice(iElem);
double aCoords[3] = {0.0, 0.0, 0.0}; double aCoords[3] = {0.0, 0.0, 0.0};
for(TInt iDim = 0; iDim < 3; iDim++) for(TInt iDim = 0; iDim < 3; iDim++)
aCoords[iDim] = aCoordHelper->GetCoord(aCoordSlice,iDim); aCoords[iDim] = aCoordHelper->GetCoord(aCoordSlice,iDim);
const SMDS_MeshNode* aNode; const SMDS_MeshNode* aNode;
if(anIsNodeNum) { if(anIsNodeNum) {
aNode = myMesh->AddNodeWithID aNode = myMesh->AddNodeWithID
(aCoords[0],aCoords[1],aCoords[2],aNodeInfo->GetElemNum(iElem)); (aCoords[0],aCoords[1],aCoords[2],aNodeInfo->GetElemNum(iElem));
} else { } else {
aNode = myMesh->AddNode aNode = myMesh->AddNode
(aCoords[0],aCoords[1],aCoords[2]); (aCoords[0],aCoords[1],aCoords[2]);
} }
//cout<<aNode->GetID()<<": "<<aNode->X()<<", "<<aNode->Y()<<", "<<aNode->Z()<<endl; //cout<<aNode->GetID()<<": "<<aNode->X()<<", "<<aNode->Y()<<", "<<aNode->Z()<<endl;
@ -174,44 +174,44 @@ DriverMED_R_SMESHDS_Mesh
} }
} }
// Reading pre information about all MED cells // Reading pre information about all MED cells
//-------------------------------------------- //--------------------------------------------
typedef MED::TVector<int> TNodeIds; typedef MED::TVector<int> TNodeIds;
bool takeNumbers = true; // initially we trust the numbers from file 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(); MED::TEntityInfo::iterator anEntityIter = aEntityInfo.begin();
for(; anEntityIter != aEntityInfo.end(); anEntityIter++){ for(; anEntityIter != aEntityInfo.end(); anEntityIter++){
const EEntiteMaillage& anEntity = anEntityIter->first; const EEntiteMaillage& anEntity = anEntityIter->first;
if(anEntity == eNOEUD) continue; if(anEntity == eNOEUD) continue;
// Reading MED cells to the corresponding SMDS structure // Reading MED cells to the corresponding SMDS structure
//------------------------------------------------------ //------------------------------------------------------
const MED::TGeom2Size& aGeom2Size = anEntityIter->second; const MED::TGeom2Size& aGeom2Size = anEntityIter->second;
MED::TGeom2Size::const_iterator aGeom2SizeIter = aGeom2Size.begin(); MED::TGeom2Size::const_iterator aGeom2SizeIter = aGeom2Size.begin();
for(; aGeom2SizeIter != aGeom2Size.end(); aGeom2SizeIter++){ for(; aGeom2SizeIter != aGeom2Size.end(); aGeom2SizeIter++){
const EGeometrieElement& aGeom = aGeom2SizeIter->first; const EGeometrieElement& aGeom = aGeom2SizeIter->first;
switch(aGeom) { switch(aGeom) {
// case ePOINT1: ## PAL16410 // case ePOINT1: ## PAL16410
// break; // break;
case ePOLYGONE: { case ePOLYGONE: {
PPolygoneInfo aPolygoneInfo = aMed->GetPPolygoneInfo(aMeshInfo,anEntity,aGeom); PPolygoneInfo aPolygoneInfo = aMed->GetPPolygoneInfo(aMeshInfo,anEntity,aGeom);
EBooleen anIsElemNum = takeNumbers ? aPolygoneInfo->IsElemNum() : eFAUX; EBooleen anIsElemNum = takeNumbers ? aPolygoneInfo->IsElemNum() : eFAUX;
TInt aNbElem = aPolygoneInfo->GetNbElem(); TInt aNbElem = aPolygoneInfo->GetNbElem();
for(TInt iElem = 0; iElem < aNbElem; iElem++){ for(TInt iElem = 0; iElem < aNbElem; iElem++){
MED::TCConnSlice aConnSlice = aPolygoneInfo->GetConnSlice(iElem); MED::TCConnSlice aConnSlice = aPolygoneInfo->GetConnSlice(iElem);
TInt aNbConn = aPolygoneInfo->GetNbConn(iElem); TInt aNbConn = aPolygoneInfo->GetNbConn(iElem);
TNodeIds aNodeIds(aNbConn); TNodeIds aNodeIds(aNbConn);
#ifdef _EDF_NODE_IDS_ #ifdef _EDF_NODE_IDS_
if(anIsNodeNum) if(anIsNodeNum)
for(TInt iConn = 0; iConn < aNbConn; iConn++) for(TInt iConn = 0; iConn < aNbConn; iConn++)
aNodeIds[iConn] = aNodeInfo->GetElemNum(aConnSlice[iConn] - 1); aNodeIds[iConn] = aNodeInfo->GetElemNum(aConnSlice[iConn] - 1);
else else
for(TInt iConn = 0; iConn < aNbConn; iConn++) for(TInt iConn = 0; iConn < aNbConn; iConn++)
aNodeIds[iConn] = aConnSlice[iConn]; aNodeIds[iConn] = aConnSlice[iConn];
#else #else
for(TInt iConn = 0; iConn < aNbConn; iConn++) for(TInt iConn = 0; iConn < aNbConn; iConn++)
aNodeIds[iConn] = aConnSlice[iConn]; aNodeIds[iConn] = aConnSlice[iConn];
#endif #endif
bool isRenum = false; bool isRenum = false;
SMDS_MeshElement* anElement = NULL; SMDS_MeshElement* anElement = NULL;
@ -221,12 +221,12 @@ DriverMED_R_SMESHDS_Mesh
try{ try{
#endif #endif
if(anIsElemNum){ if(anIsElemNum){
TInt anElemId = aPolygoneInfo->GetElemNum(iElem); TInt anElemId = aPolygoneInfo->GetElemNum(iElem);
anElement = myMesh->AddPolygonalFaceWithID(aNodeIds,anElemId); anElement = myMesh->AddPolygonalFaceWithID(aNodeIds,anElemId);
} }
if(!anElement){ if(!anElement){
std::vector<const SMDS_MeshNode*> aNodes(aNbConn); std::vector<const SMDS_MeshNode*> aNodes(aNbConn);
for(TInt iConn = 0; iConn < aNbConn; iConn++) for(TInt iConn = 0; iConn < aNbConn; iConn++)
aNodes[iConn] = FindNode(myMesh,aNodeIds[iConn]); aNodes[iConn] = FindNode(myMesh,aNodeIds[iConn]);
anElement = myMesh->AddPolygonalFace(aNodes); anElement = myMesh->AddPolygonalFace(aNodes);
isRenum = anIsElemNum; isRenum = anIsElemNum;
@ -256,80 +256,80 @@ DriverMED_R_SMESHDS_Mesh
} }
} }
break; break;
} }
case ePOLYEDRE: { case ePOLYEDRE: {
PPolyedreInfo aPolyedreInfo = aMed->GetPPolyedreInfo(aMeshInfo,anEntity,aGeom); PPolyedreInfo aPolyedreInfo = aMed->GetPPolyedreInfo(aMeshInfo,anEntity,aGeom);
EBooleen anIsElemNum = takeNumbers ? aPolyedreInfo->IsElemNum() : eFAUX; EBooleen anIsElemNum = takeNumbers ? aPolyedreInfo->IsElemNum() : eFAUX;
TInt aNbElem = aPolyedreInfo->GetNbElem(); TInt aNbElem = aPolyedreInfo->GetNbElem();
for(TInt iElem = 0; iElem < aNbElem; iElem++){ for(TInt iElem = 0; iElem < aNbElem; iElem++){
MED::TCConnSliceArr aConnSliceArr = aPolyedreInfo->GetConnSliceArr(iElem); MED::TCConnSliceArr aConnSliceArr = aPolyedreInfo->GetConnSliceArr(iElem);
TInt aNbFaces = aConnSliceArr.size(); TInt aNbFaces = aConnSliceArr.size();
typedef MED::TVector<int> TQuantities; typedef MED::TVector<int> TQuantities;
TQuantities aQuantities(aNbFaces); TQuantities aQuantities(aNbFaces);
TInt aNbNodes = aPolyedreInfo->GetNbNodes(iElem); TInt aNbNodes = aPolyedreInfo->GetNbNodes(iElem);
TNodeIds aNodeIds(aNbNodes); TNodeIds aNodeIds(aNbNodes);
for(TInt iFace = 0, iNode = 0; iFace < aNbFaces; iFace++){ for(TInt iFace = 0, iNode = 0; iFace < aNbFaces; iFace++){
MED::TCConnSlice aConnSlice = aConnSliceArr[iFace]; MED::TCConnSlice aConnSlice = aConnSliceArr[iFace];
TInt aNbConn = aConnSlice.size(); TInt aNbConn = aConnSlice.size();
aQuantities[iFace] = aNbConn; aQuantities[iFace] = aNbConn;
#ifdef _EDF_NODE_IDS_ #ifdef _EDF_NODE_IDS_
if(anIsNodeNum) if(anIsNodeNum)
for(TInt iConn = 0; iConn < aNbConn; iConn++) for(TInt iConn = 0; iConn < aNbConn; iConn++)
aNodeIds[iNode++] = aNodeInfo->GetElemNum(aConnSlice[iConn] - 1); aNodeIds[iNode++] = aNodeInfo->GetElemNum(aConnSlice[iConn] - 1);
else else
for(TInt iConn = 0; iConn < aNbConn; iConn++) for(TInt iConn = 0; iConn < aNbConn; iConn++)
aNodeIds[iNode++] = aConnSlice[iConn]; aNodeIds[iNode++] = aConnSlice[iConn];
#else #else
for(TInt iConn = 0; iConn < aNbConn; iConn++) for(TInt iConn = 0; iConn < aNbConn; iConn++)
aNodeIds[iNode++] = aConnSlice[iConn]; aNodeIds[iNode++] = aConnSlice[iConn];
#endif #endif
} }
bool isRenum = false; bool isRenum = false;
SMDS_MeshElement* anElement = NULL; SMDS_MeshElement* anElement = NULL;
TInt aFamNum = aPolyedreInfo->GetFamNum(iElem); TInt aFamNum = aPolyedreInfo->GetFamNum(iElem);
#ifndef _DEXCEPT_ #ifndef _DEXCEPT_
try{ try{
#endif #endif
if(anIsElemNum){ if(anIsElemNum){
TInt anElemId = aPolyedreInfo->GetElemNum(iElem); TInt anElemId = aPolyedreInfo->GetElemNum(iElem);
anElement = myMesh->AddPolyhedralVolumeWithID(aNodeIds,aQuantities,anElemId); anElement = myMesh->AddPolyhedralVolumeWithID(aNodeIds,aQuantities,anElemId);
} }
if(!anElement){ if(!anElement){
std::vector<const SMDS_MeshNode*> aNodes(aNbNodes); std::vector<const SMDS_MeshNode*> aNodes(aNbNodes);
for(TInt iConn = 0; iConn < aNbNodes; iConn++) for(TInt iConn = 0; iConn < aNbNodes; iConn++)
aNodes[iConn] = FindNode(myMesh,aNodeIds[iConn]); aNodes[iConn] = FindNode(myMesh,aNodeIds[iConn]);
anElement = myMesh->AddPolyhedralVolume(aNodes,aQuantities); anElement = myMesh->AddPolyhedralVolume(aNodes,aQuantities);
isRenum = anIsElemNum; isRenum = anIsElemNum;
} }
#ifndef _DEXCEPT_ #ifndef _DEXCEPT_
}catch(const std::exception& exc){ }catch(const std::exception& exc){
aResult = DRS_FAIL; aResult = DRS_FAIL;
}catch(...){ }catch(...){
aResult = DRS_FAIL; aResult = DRS_FAIL;
} }
#endif #endif
if(!anElement){ if(!anElement){
aResult = DRS_WARN_SKIP_ELEM; aResult = DRS_WARN_SKIP_ELEM;
}else{ }else{
if(isRenum){ if(isRenum){
anIsElemNum = eFAUX; anIsElemNum = eFAUX;
takeNumbers = false; takeNumbers = false;
if (aResult < DRS_WARN_RENUMBER) if (aResult < DRS_WARN_RENUMBER)
aResult = DRS_WARN_RENUMBER; aResult = DRS_WARN_RENUMBER;
} }
if ( checkFamilyID ( aFamily, aFamNum )) { if ( checkFamilyID ( aFamily, aFamNum )) {
// Save reference to this element from its family // Save reference to this element from its family
aFamily->AddElement(anElement); aFamily->AddElement(anElement);
aFamily->SetType(anElement->GetType()); aFamily->SetType(anElement->GetType());
} }
} }
} }
break; break;
} }
default: { default: {
PCellInfo aCellInfo = aMed->GetPCellInfo(aMeshInfo,anEntity,aGeom); PCellInfo aCellInfo = aMed->GetPCellInfo(aMeshInfo,anEntity,aGeom);
EBooleen anIsElemNum = takeNumbers ? aCellInfo->IsElemNum() : eFAUX; EBooleen anIsElemNum = takeNumbers ? aCellInfo->IsElemNum() : eFAUX;
TInt aNbElems = aCellInfo->GetNbElem(); TInt aNbElems = aCellInfo->GetNbElem();
@ -747,10 +747,10 @@ std::list<std::string> DriverMED_R_SMESHDS_Mesh::GetMeshNames(Status& theStatus)
if (TInt aNbMeshes = aMed->GetNbMeshes()) { if (TInt aNbMeshes = aMed->GetNbMeshes()) {
for (int iMesh = 0; iMesh < aNbMeshes; iMesh++) { for (int iMesh = 0; iMesh < aNbMeshes; iMesh++) {
// Reading the MED mesh // Reading the MED mesh
//--------------------- //---------------------
PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1); PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1);
aMeshNames.push_back(aMeshInfo->GetName()); aMeshNames.push_back(aMeshInfo->GetName());
} }
} }
}catch(const std::exception& exc){ }catch(const std::exception& exc){
@ -807,10 +807,10 @@ void DriverMED_R_SMESHDS_Mesh::GetGroup(SMESHDS_Group* theGroup)
for (; anElemsIter != anElements.end(); anElemsIter++) for (; anElemsIter != anElements.end(); anElemsIter++)
{ {
element = *anElemsIter; element = *anElemsIter;
theGroup->SMDSGroup().Add(element); theGroup->SMDSGroup().Add(element);
int aGroupAttrVal = aFamily->GetGroupAttributVal(); int aGroupAttrVal = aFamily->GetGroupAttributVal();
if( aGroupAttrVal != 0) if( aGroupAttrVal != 0)
theGroup->SetColorGroup(aGroupAttrVal); theGroup->SetColorGroup(aGroupAttrVal);
} }
if ( element ) if ( element )
theGroup->SetType( theGroup->SMDSGroup().GetType() ); theGroup->SetType( theGroup->SMDSGroup().GetType() );
@ -924,7 +924,7 @@ bool DriverMED_R_SMESHDS_Mesh::checkFamilyID(DriverMED_FamilyPtr & aFamily, int
* \return TRUE, if successfully. Else FALSE * \return TRUE, if successfully. Else FALSE
*/ */
bool DriverMED_R_SMESHDS_Mesh::buildMeshGrille(const MED::PWrapper& theWrapper, bool DriverMED_R_SMESHDS_Mesh::buildMeshGrille(const MED::PWrapper& theWrapper,
const MED::PMeshInfo& theMeshInfo) const MED::PMeshInfo& theMeshInfo)
{ {
bool res = true; bool res = true;
@ -944,10 +944,10 @@ bool DriverMED_R_SMESHDS_Mesh::buildMeshGrille(const MED::PWrapper& theWrapper,
if((aGrilleInfo->myFamNumNode).size() > 0){ if((aGrilleInfo->myFamNumNode).size() > 0){
TInt aFamNum = aGrilleInfo->GetFamNumNode(iNode); TInt aFamNum = aGrilleInfo->GetFamNumNode(iNode);
if ( checkFamilyID ( aFamily, aFamNum )) if ( checkFamilyID ( aFamily, aFamNum ))
{ {
aFamily->AddElement(aNode); aFamily->AddElement(aNode);
aFamily->SetType(SMDSAbs_Node); aFamily->SetType(SMDSAbs_Node);
} }
} }
} }
@ -959,38 +959,38 @@ bool DriverMED_R_SMESHDS_Mesh::buildMeshGrille(const MED::PWrapper& theWrapper,
switch(aGrilleInfo->GetGeom()){ switch(aGrilleInfo->GetGeom()){
case MED::eSEG2: case MED::eSEG2:
if(aNodeIds.size() != 2){ if(aNodeIds.size() != 2){
res = false; res = false;
EXCEPTION(std::runtime_error,"buildMeshGrille Error. Incorrect size of ids 2!="<<aNodeIds.size()); EXCEPTION(std::runtime_error,"buildMeshGrille Error. Incorrect size of ids 2!="<<aNodeIds.size());
} }
anElement = myMesh->AddEdgeWithID(aNodeIds[0], anElement = myMesh->AddEdgeWithID(aNodeIds[0],
aNodeIds[1], aNodeIds[1],
iCell); iCell);
break; break;
case MED::eQUAD4: case MED::eQUAD4:
if(aNodeIds.size() != 4){ if(aNodeIds.size() != 4){
res = false; res = false;
EXCEPTION(std::runtime_error,"buildMeshGrille Error. Incorrect size of ids 4!="<<aNodeIds.size()); EXCEPTION(std::runtime_error,"buildMeshGrille Error. Incorrect size of ids 4!="<<aNodeIds.size());
} }
anElement = myMesh->AddFaceWithID(aNodeIds[0], anElement = myMesh->AddFaceWithID(aNodeIds[0],
aNodeIds[2], aNodeIds[2],
aNodeIds[3], aNodeIds[3],
aNodeIds[1], aNodeIds[1],
iCell); iCell);
break; break;
case MED::eHEXA8: case MED::eHEXA8:
if(aNodeIds.size() != 8){ if(aNodeIds.size() != 8){
res = false; res = false;
EXCEPTION(std::runtime_error,"buildMeshGrille Error. Incorrect size of ids 8!="<<aNodeIds.size()); EXCEPTION(std::runtime_error,"buildMeshGrille Error. Incorrect size of ids 8!="<<aNodeIds.size());
} }
anElement = myMesh->AddVolumeWithID(aNodeIds[0], anElement = myMesh->AddVolumeWithID(aNodeIds[0],
aNodeIds[2], aNodeIds[2],
aNodeIds[3], aNodeIds[3],
aNodeIds[1], aNodeIds[1],
aNodeIds[4], aNodeIds[4],
aNodeIds[6], aNodeIds[6],
aNodeIds[7], aNodeIds[7],
aNodeIds[5], aNodeIds[5],
iCell); iCell);
break; break;
default: default:
break; break;
@ -999,8 +999,8 @@ bool DriverMED_R_SMESHDS_Mesh::buildMeshGrille(const MED::PWrapper& theWrapper,
if((aGrilleInfo->myFamNum).size() > 0){ if((aGrilleInfo->myFamNum).size() > 0){
TInt aFamNum = aGrilleInfo->GetFamNum(iCell); TInt aFamNum = aGrilleInfo->GetFamNum(iCell);
if ( checkFamilyID ( aFamily, aFamNum )){ if ( checkFamilyID ( aFamily, aFamNum )){
aFamily->AddElement(anElement); aFamily->AddElement(anElement);
aFamily->SetType(anElement->GetType()); aFamily->SetType(anElement->GetType());
} }
} }
} }

View File

@ -62,7 +62,7 @@ class MESHDRIVERMED_EXPORT DriverMED_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh
bool checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const; bool checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const;
bool buildMeshGrille(const MED::PWrapper& theWrapper, bool buildMeshGrille(const MED::PWrapper& theWrapper,
const MED::PMeshInfo& theMeshInfo); const MED::PMeshInfo& theMeshInfo);
private: private:
std::string myMeshName; std::string myMeshName;

View File

@ -54,7 +54,7 @@ DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh():
{} {}
void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName, void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName,
MED::EVersion theId) MED::EVersion theId)
{ {
myMed = CrWrapper(theFileName,theId); myMed = CrWrapper(theFileName,theId);
Driver_SMESHDS_Mesh::SetFile(theFileName); Driver_SMESHDS_Mesh::SetFile(theFileName);
@ -189,9 +189,9 @@ namespace{
TUnit* myUnit; TUnit* myUnit;
public: public:
TCoordHelper(const SMDS_NodeIteratorPtr& theNodeIter, TCoordHelper(const SMDS_NodeIteratorPtr& theNodeIter,
TGetCoord* theGetCoord, TGetCoord* theGetCoord,
TName* theName, TName* theName,
TUnit* theUnit = aUnit): TUnit* theUnit = aUnit):
myNodeIter(theNodeIter), myNodeIter(theNodeIter),
myGetCoord(theGetCoord), myGetCoord(theGetCoord),
myName(theName), myName(theName),
@ -200,7 +200,7 @@ namespace{
virtual ~TCoordHelper(){} virtual ~TCoordHelper(){}
bool Next(){ bool Next(){
return myNodeIter->more() && return myNodeIter->more() &&
(myCurrentNode = myNodeIter->next()); (myCurrentNode = myNodeIter->next());
} }
const SMDS_MeshNode* GetNode(){ const SMDS_MeshNode* GetNode(){
return myCurrentNode; return myCurrentNode;
@ -352,33 +352,33 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
bool anIsYDimension = false; bool anIsYDimension = false;
bool anIsZDimension = false; bool anIsZDimension = false;
{ {
SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator();
double aBounds[6]; double aBounds[6];
if(aNodesIter->more()){ if(aNodesIter->more()){
const SMDS_MeshNode* aNode = aNodesIter->next(); const SMDS_MeshNode* aNode = aNodesIter->next();
aBounds[0] = aBounds[1] = aNode->X(); aBounds[0] = aBounds[1] = aNode->X();
aBounds[2] = aBounds[3] = aNode->Y(); aBounds[2] = aBounds[3] = aNode->Y();
aBounds[4] = aBounds[5] = aNode->Z(); aBounds[4] = aBounds[5] = aNode->Z();
} }
while(aNodesIter->more()){ while(aNodesIter->more()){
const SMDS_MeshNode* aNode = aNodesIter->next(); const SMDS_MeshNode* aNode = aNodesIter->next();
aBounds[0] = min(aBounds[0],aNode->X()); aBounds[0] = min(aBounds[0],aNode->X());
aBounds[1] = max(aBounds[1],aNode->X()); aBounds[1] = max(aBounds[1],aNode->X());
aBounds[2] = min(aBounds[2],aNode->Y()); aBounds[2] = min(aBounds[2],aNode->Y());
aBounds[3] = max(aBounds[3],aNode->Y()); aBounds[3] = max(aBounds[3],aNode->Y());
aBounds[4] = min(aBounds[4],aNode->Z()); aBounds[4] = min(aBounds[4],aNode->Z());
aBounds[5] = max(aBounds[5],aNode->Z()); aBounds[5] = max(aBounds[5],aNode->Z());
} }
double EPS = 1.0E-7; double EPS = 1.0E-7;
anIsXDimension = (aBounds[1] - aBounds[0]) + abs(aBounds[1]) + abs(aBounds[0]) > EPS; anIsXDimension = (aBounds[1] - aBounds[0]) + abs(aBounds[1]) + abs(aBounds[0]) > EPS;
anIsYDimension = (aBounds[3] - aBounds[2]) + abs(aBounds[3]) + abs(aBounds[2]) > EPS; anIsYDimension = (aBounds[3] - aBounds[2]) + abs(aBounds[3]) + abs(aBounds[2]) > EPS;
anIsZDimension = (aBounds[5] - aBounds[4]) + abs(aBounds[5]) + abs(aBounds[4]) > EPS; anIsZDimension = (aBounds[5] - aBounds[4]) + abs(aBounds[5]) + abs(aBounds[4]) > EPS;
aMeshDimension = anIsXDimension + anIsYDimension + anIsZDimension; aMeshDimension = anIsXDimension + anIsYDimension + anIsZDimension;
if(!aMeshDimension) if(!aMeshDimension)
aMeshDimension = 3; aMeshDimension = 3;
// PAL16857(SMESH not conform to the MED convention): // PAL16857(SMESH not conform to the MED convention):
if ( aMeshDimension == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane if ( aMeshDimension == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane
aMeshDimension = 3; aMeshDimension = 3;
@ -395,24 +395,24 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator();
switch(aMeshDimension){ switch(aMeshDimension){
case 3: case 3:
aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYZGetCoord,aXYZName)); aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYZGetCoord,aXYZName));
break; break;
case 2: case 2:
if(anIsXDimension && anIsYDimension) if(anIsXDimension && anIsYDimension)
aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYGetCoord,aXYName)); aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYGetCoord,aXYName));
if(anIsYDimension && anIsZDimension) if(anIsYDimension && anIsZDimension)
aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aYZGetCoord,aYZName)); aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aYZGetCoord,aYZName));
if(anIsXDimension && anIsZDimension) if(anIsXDimension && anIsZDimension)
aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXZGetCoord,aXZName)); aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXZGetCoord,aXZName));
break; break;
case 1: case 1:
if(anIsXDimension) if(anIsXDimension)
aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXGetCoord,aXName)); aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXGetCoord,aXName));
if(anIsYDimension) if(anIsYDimension)
aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aYGetCoord,aYName)); aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aYGetCoord,aYName));
if(anIsZDimension) if(anIsZDimension)
aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aZGetCoord,aZName)); aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aZGetCoord,aZName));
break; break;
} }
} }
@ -495,7 +495,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
// coordinates // coordinates
TCoordSlice aTCoordSlice = aNodeInfo->GetCoordSlice( iNode ); TCoordSlice aTCoordSlice = aNodeInfo->GetCoordSlice( iNode );
for(TInt iCoord = 0; iCoord < aMeshDimension; iCoord++){ for(TInt iCoord = 0; iCoord < aMeshDimension; iCoord++){
aTCoordSlice[iCoord] = aCoordHelperPtr->GetCoord(iCoord); aTCoordSlice[iCoord] = aCoordHelperPtr->GetCoord(iCoord);
} }
// node number // node number
int aNodeID = aCoordHelperPtr->GetID(); int aNodeID = aCoordHelperPtr->GetID();