Added support of visualization of STRUCTURE mesh.

Bug PAL11384.
This commit is contained in:
enk 2006-05-25 13:22:04 +00:00
parent 1366d8ffba
commit a166931ff3
2 changed files with 92 additions and 4 deletions

View File

@ -84,9 +84,6 @@ DriverMED_R_SMESHDS_Mesh
//---------------------
PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1);
if (aMeshInfo->GetType() != MED::eNON_STRUCTURE)
continue; // not implemented yet
string aMeshName;
if (myMeshId != -1) {
ostringstream aMeshNameStr;
@ -126,9 +123,14 @@ DriverMED_R_SMESHDS_Mesh
}
}
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)
continue;
@ -890,3 +892,86 @@ 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;iDim<aMeshDim;iDim++)
aCoords[(int)iDim] = aMEDNodeCoord[(int)iDim];
aNode = myMesh->AddNodeWithID(aCoords[0],aCoords[1],aCoords[2],(int)iNode);
}
/* not implemented FAMILY
TInt aFamNum = aNodeInfo->GetFamNum(iElem);
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){
aRes = false;
EXCEPTION(runtime_error,"buildMeshGrille Error. Incorrect size of ids 2!="<<aNodeIds.size());
}
anElement = myMesh->AddEdgeWithID(aNodeIds[0],
aNodeIds[1],
iCell);
break;
case MED::eQUAD4:
if(aNodeIds.size() != 4){
aRes = false;
EXCEPTION(runtime_error,"buildMeshGrille Error. Incorrect size of ids 4!="<<aNodeIds.size());
}
anElement = myMesh->AddFaceWithID(aNodeIds[0],
aNodeIds[2],
aNodeIds[3],
aNodeIds[1],
iCell);
break;
case MED::eHEXA8:
if(aNodeIds.size() != 8){
aRes = false;
EXCEPTION(runtime_error,"buildMeshGrille Error. Incorrect size of ids 8!="<<aNodeIds.size());
}
anElement = myMesh->AddVolumeWithID(aNodeIds[0],
aNodeIds[2],
aNodeIds[3],
aNodeIds[1],
aNodeIds[4],
aNodeIds[6],
aNodeIds[7],
aNodeIds[5],
iCell);
break;
default:
break;
}
}
return res;
}

View File

@ -60,6 +60,9 @@ class DriverMED_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh
*/
bool checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const;
bool buildMeshGrille(const MED::PWrapper& theWrapper,
const MED::PMeshInfo& theMeshInfo);
private:
std::string myMeshName;
std::map<int, DriverMED_FamilyPtr> myFamilies;