From: eap Date: Mon, 23 Jan 2012 08:02:02 +0000 (+0000) Subject: 0021198: EDF 1548 GEOM: Writing of coordinates system into exported UNV files X-Git-Tag: V6_5_0a1~193 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=5b637a30b41cd44ecfb2b3ac1429df6d7bb0db77;p=modules%2Fsmesh.git 0021198: EDF 1548 GEOM: Writing of coordinates system into exported UNV files Read/write CS and units. Use vector instead of map as TDataSet --- diff --git a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx index ea8c52af8..01bcefe30 100644 --- a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx @@ -26,9 +26,11 @@ #include "utilities.h" +#include "UNV164_Structure.hxx" #include "UNV2411_Structure.hxx" #include "UNV2412_Structure.hxx" #include "UNV2417_Structure.hxx" +#include "UNV2420_Structure.hxx" #include "UNV_Utilities.hxx" #include @@ -42,6 +44,52 @@ static int MYDEBUG = 1; static int MYDEBUG = 0; #endif +namespace +{ + /*! + * \brief Move node coordinates to the global Cartesian CS + */ + void transformNodes( UNV2411::TDataSet::const_iterator fromNode, + UNV2411::TDataSet::const_iterator endNode, + const UNV2420::TRecord & csRecord ) + { + const int csLabel = fromNode->exp_coord_sys_num; + + UNV2411::TDataSet::const_iterator nodeIt; + + // apply Transformation Matrix + if ( !csRecord.isIdentityMatrix() ) + { + for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt ) + { + const UNV2411::TRecord& nodeRec = *nodeIt; + if ( nodeRec.exp_coord_sys_num == csLabel ) + csRecord.ApplyMatrix( (double*) nodeRec.coord ); + } + } + + // transform from Cylindrical CS + if ( csRecord.coord_sys_type == UNV2420::Cylindrical ) + { + for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt ) + { + const UNV2411::TRecord& nodeRec = *nodeIt; + if ( nodeRec.exp_coord_sys_num == csLabel ) + csRecord.FromCylindricalCS( (double*) nodeRec.coord ); + } + } + // transform from Spherical CS + else if ( csRecord.coord_sys_type == UNV2420::Spherical ) + { + for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt ) + { + const UNV2411::TRecord& nodeRec = *nodeIt; + if ( nodeRec.exp_coord_sys_num == csLabel ) + csRecord.FromSphericalCS( (double*) nodeRec.coord ); + } + } + } +} DriverUNV_R_SMDS_Mesh::~DriverUNV_R_SMDS_Mesh() { @@ -55,49 +103,89 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() Kernel_Utils::Localizer loc; Status aResult = DRS_OK; std::ifstream in_stream(myFile.c_str()); - try{ + try + { { + // Read Units + UNV164::TRecord aUnitsRecord; + UNV164::Read( in_stream, aUnitsRecord ); + + // Read Coordinate systems + UNV2420::TDataSet aCoordSysDataSet; + UNV2420::Read(in_stream, myMeshName, aCoordSysDataSet); + + // Read nodes using namespace UNV2411; TDataSet aDataSet2411; UNV2411::Read(in_stream,aDataSet2411); if(MYDEBUG) MESSAGE("Perform - aDataSet2411.size() = "<exp_coord_sys_num == csIter->coord_sys_label ) + { + transformNodes( nodeIter, aDataSet2411.end(), *csIter ); + break; + } + } + } + // Move nodes to SI unit system + const double lenFactor = aUnitsRecord.factors[ UNV164::LENGTH_FACTOR ]; + if ( lenFactor != 1. ) + { + TDataSet::iterator nodeIter = aDataSet2411.begin(), nodeEnd; + for ( nodeEnd = aDataSet2411.end(); nodeIter != nodeEnd; nodeIter++) + { + UNV2411::TRecord& nodeRec = *nodeIter; + nodeRec.coord[0] *= lenFactor; + nodeRec.coord[1] *= lenFactor; + nodeRec.coord[2] *= lenFactor; + } + } + + // Create nodes in the mesh TDataSet::const_iterator anIter = aDataSet2411.begin(); - for(; anIter != aDataSet2411.end(); anIter++){ - const TNodeLab& aLabel = anIter->first; - const TRecord& aRec = anIter->second; - //MESSAGE("AddNodeWithID " << aLabel << " " << aRec.coord[0] << " " << aRec.coord[1] << " " << aRec.coord[2]); - myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aLabel); + for(; anIter != aDataSet2411.end(); anIter++) + { + const TRecord& aRec = *anIter; + myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aRec.label); } } { using namespace UNV2412; - in_stream.seekg(0); TDataSet aDataSet2412; UNV2412::Read(in_stream,aDataSet2412); TDataSet::const_iterator anIter = aDataSet2412.begin(); if(MYDEBUG) MESSAGE("Perform - aDataSet2412.size() = "<first; - const TRecord& aRec = anIter->second; + const TRecord& aRec = *anIter; if(IsBeam(aRec.fe_descriptor_id)) { switch ( aRec.node_labels.size() ) { case 2: // edge with two nodes //MESSAGE("add edge " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1]); anElement = myMesh->AddEdgeWithID(aRec.node_labels[0], aRec.node_labels[1], - aLabel); + aRec.label); break; case 3: // quadratic edge (with 3 nodes) - //MESSAGE("add edge " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2]); + //MESSAGE("add edge " << aRec.label << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2]); anElement = myMesh->AddEdgeWithID(aRec.node_labels[0], aRec.node_labels[2], aRec.node_labels[1], - aLabel); + aRec.label); } } else if(IsFace(aRec.fe_descriptor_id)) { - //MESSAGE("add face " << aLabel); + //MESSAGE("add face " << aRec.label); switch(aRec.fe_descriptor_id){ case 41: // Plane Stress Linear Triangle case 51: // Plane Strain Linear Triangle @@ -108,7 +196,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() anElement = myMesh->AddFaceWithID(aRec.node_labels[0], aRec.node_labels[1], aRec.node_labels[2], - aLabel); + aRec.label); break; case 42: // Plane Stress Parabolic Triangle @@ -117,14 +205,14 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() case 72: // Membrane Parabolic Triangle case 82: // Axisymetric Solid Parabolic Triangle case 92: // Thin Shell Parabolic Triangle - //MESSAGE("add face " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2] << " " << aRec.node_labels[3] << " " << aRec.node_labels[4] << " " << aRec.node_labels[5]); + //MESSAGE("add face " << aRec.label << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2] << " " << aRec.node_labels[3] << " " << aRec.node_labels[4] << " " << aRec.node_labels[5]); anElement = myMesh->AddFaceWithID(aRec.node_labels[0], aRec.node_labels[2], aRec.node_labels[4], aRec.node_labels[1], aRec.node_labels[3], aRec.node_labels[5], - aLabel); + aRec.label); break; case 44: // Plane Stress Linear Quadrilateral @@ -137,7 +225,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[1], aRec.node_labels[2], aRec.node_labels[3], - aLabel); + aRec.label); break; case 45: // Plane Stress Parabolic Quadrilateral @@ -154,12 +242,12 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[3], aRec.node_labels[5], aRec.node_labels[7], - aLabel); + aRec.label); break; } } else if(IsVolume(aRec.fe_descriptor_id)){ - //MESSAGE("add volume " << aLabel); + //MESSAGE("add volume " << aRec.label); switch(aRec.fe_descriptor_id){ case 111: // Solid Linear Tetrahedron - TET4 @@ -167,7 +255,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[2], aRec.node_labels[1], aRec.node_labels[3], - aLabel); + aRec.label); break; case 118: // Solid Quadratic Tetrahedron - TET10 @@ -184,7 +272,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[6], aRec.node_labels[8], aRec.node_labels[7], - aLabel); + aRec.label); break; case 112: // Solid Linear Prism - PRISM6 @@ -194,7 +282,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[3], aRec.node_labels[5], aRec.node_labels[4], - aLabel); + aRec.label); break; case 113: // Solid Quadratic Prism - PRISM15 @@ -217,7 +305,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[6], aRec.node_labels[8], aRec.node_labels[7], - aLabel); + aRec.label); break; case 115: // Solid Linear Brick - HEX8 @@ -229,7 +317,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[7], aRec.node_labels[6], aRec.node_labels[5], - aLabel); + aRec.label); break; case 116: // Solid Quadratic Brick - HEX20 @@ -257,7 +345,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[11], aRec.node_labels[10], aRec.node_labels[9], - aLabel); + aRec.label); break; case 114: // pyramid of 13 nodes (quadratic) - PIRA13 @@ -275,18 +363,17 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[10], aRec.node_labels[9], aRec.node_labels[12], - aLabel); + aRec.label); break; } } if(!anElement) - MESSAGE("DriverUNV_R_SMDS_Mesh::Perform - can not add element with ID = "< @@ -64,6 +66,10 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() Status aResult = DRS_OK; std::ofstream out_stream(myFile.c_str()); try{ + + UNV164::Write( out_stream ); // unit system + UNV2420::Write( out_stream, myMeshName ); // Coordinate system + { using namespace UNV2411; TDataSet aDataSet2411; @@ -71,14 +77,15 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() //----------------------------------- MESSAGE("Perform - myMesh->NbNodes() = "<NbNodes()); SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); - for(; aNodesIter->more();){ + TRecord aRec; + while ( aNodesIter->more() ) + { const SMDS_MeshNode* aNode = aNodesIter->next(); - TRecord aRec; + aRec.label = aNode->GetID(); aRec.coord[0] = aNode->X(); aRec.coord[1] = aNode->Y(); aRec.coord[2] = aNode->Z(); - const TNodeLab& aLabel = aNode->GetID(); - aDataSet2411.insert(TDataSet::value_type(aLabel,aRec)); + aDataSet2411.push_back( aRec ); } MESSAGE("Perform - aDataSet2411.size() = "<NbEdges() = "<NbEdges()); if(myMesh->NbEdges()){ SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator(); - for(; anIter->more();){ + while( anIter->more() ) + { const SMDS_MeshEdge* anElem = anIter->next(); - TElementLab aLabel = anElem->GetID(); int aNbNodes = anElem->NbNodes(); TRecord aRec; + aRec.label = anElem->GetID(); aRec.node_labels.reserve(aNbNodes); SMDS_ElemIteratorPtr aNodesIter; aNodesIter = anElem->nodesIteratorToUNV(); @@ -105,24 +113,27 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() } else { aRec.fe_descriptor_id = 11; } - for(; aNodesIter->more();){ + while( aNodesIter->more()) + { const SMDS_MeshElement* aNode = aNodesIter->next(); aRec.node_labels.push_back(aNode->GetID()); } - aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); + aDataSet2412.push_back(aRec); } MESSAGE("Perform - aDataSet2412.size() = "<NbFaces() = "<NbFaces()); - if(myMesh->NbFaces()){ + if ( myMesh->NbFaces() ) + { SMDS_FaceIteratorPtr anIter = myMesh->facesIterator(); - for(; anIter->more();){ + while ( anIter->more()) + { const SMDS_MeshFace* anElem = anIter->next(); if ( anElem->IsPoly() ) continue; - TElementLab aLabel = anElem->GetID(); int aNbNodes = anElem->NbNodes(); TRecord aRec; + aRec.label = anElem->GetID(); aRec.node_labels.reserve(aNbNodes); SMDS_ElemIteratorPtr aNodesIter; aNodesIter = anElem->nodesIteratorToUNV(); @@ -150,18 +161,18 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() default: continue; } - aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); + aDataSet2412.push_back(aRec); } MESSAGE("Perform - aDataSet2412.size() = "<NbVolumes() = "<NbVolumes()); - if(myMesh->NbVolumes()){ + if ( myMesh->NbVolumes() ) + { SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator(); - for(; anIter->more();){ + while ( anIter->more()) + { const SMDS_MeshVolume* anElem = anIter->next(); - TElementLab aLabel = anElem->GetID(); - int aNbNodes = anElem->NbNodes(); //MESSAGE("aNbNodes="<0){ TRecord aRec; + aRec.label = anElem->GetID(); aRec.fe_descriptor_id = anId; aRec.node_labels.reserve(aNbNodes); - for(; aNodesIter->more() && aRec.node_labels.size() < aNbNodes; ) { + while ( aNodesIter->more() && aRec.node_labels.size() < aNbNodes ) + { const SMDS_MeshElement* aNode = aNodesIter->next(); aRec.node_labels.push_back(aNode->GetID()); } - aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); + aDataSet2412.push_back(aRec); } } MESSAGE("Perform - aDataSet2412.size() = "<> aLabel ; - if(aLabel == -1){ + while ( !in_stream.eof() ) + { + TRecord aRec; + in_stream >> aRec.label ; + if ( aRec.label == -1 ) { // end of dataset is reached break; } - TRecord aRec; in_stream>>aRec.exp_coord_sys_num; in_stream>>aRec.disp_coord_sys_num; in_stream>>aRec.color; @@ -77,7 +77,7 @@ void UNV2411::Read(std::ifstream& in_stream, TDataSet& theDataSet) aRec.coord[d] = D_to_e(num_buf); } - theDataSet.insert(TDataSet::value_type(aLabel,aRec)); + theDataSet.push_back(aRec); } } @@ -94,12 +94,12 @@ void UNV2411::Write(std::ofstream& out_stream, const TDataSet& theDataSet) out_stream<<" "<<_label_dataset<<"\n"; TDataSet::const_iterator anIter = theDataSet.begin(); - for(; anIter != theDataSet.end(); anIter++){ - const TNodeLab& aLabel = anIter->first; - const TRecord& aRec = anIter->second; + for(; anIter != theDataSet.end(); anIter++) + { + const TRecord& aRec = *anIter; char buf[78]; sprintf(buf, "%10d%10d%10d%10d\n", - aLabel, + aRec.label, aRec.exp_coord_sys_num, aRec.disp_coord_sys_num, aRec.color); diff --git a/src/DriverUNV/UNV2411_Structure.hxx b/src/DriverUNV/UNV2411_Structure.hxx index a35b393dd..5e84c47f3 100644 --- a/src/DriverUNV/UNV2411_Structure.hxx +++ b/src/DriverUNV/UNV2411_Structure.hxx @@ -25,21 +25,23 @@ #include "SMESH_DriverUNV.hxx" -#include +#include #include namespace UNV2411{ + typedef int TNodeLab; // type of node label + struct MESHDRIVERUNV_EXPORT TRecord{ TRecord(); + TNodeLab label; int exp_coord_sys_num; // export coordinate system number int disp_coord_sys_num; // displacement coordinate system number int color; // color double coord[3]; // node coordinates in the part coordinate system }; - typedef int TNodeLab; // type of node label - typedef std::map TDataSet; + typedef std::vector TDataSet; MESHDRIVERUNV_EXPORT void Read(std::ifstream& in_stream, TDataSet& theDataSet); diff --git a/src/DriverUNV/UNV2412_Structure.cxx b/src/DriverUNV/UNV2412_Structure.cxx index 9b01e1d3d..dac26a93b 100644 --- a/src/DriverUNV/UNV2412_Structure.cxx +++ b/src/DriverUNV/UNV2412_Structure.cxx @@ -183,12 +183,14 @@ using namespace UNV2412; static string _label_dataset = "2412"; UNV2412::TRecord::TRecord(): + label(-1), + fe_descriptor_id(-1), phys_prop_tab_num(2), mat_prop_tab_num(1), color(7), beam_orientation(0), - beam_fore_end(0), - beam_aft_end(0) + beam_fore_end(1), // default values + beam_aft_end(1) // default values {} void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet) @@ -203,16 +205,15 @@ void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet) if(!beginning_of_dataset(in_stream,_label_dataset)) EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!"); - TElementLab aLabel; - for(; !in_stream.eof();){ - in_stream >> aLabel ; - if(aLabel == -1){ + TRecord aRec; + while( !in_stream.eof()) + { + in_stream >> aRec.label ; + if (aRec.label == -1) // end of dataset is reached break; - } int n_nodes; - TRecord aRec; in_stream>>aRec.fe_descriptor_id; in_stream>>aRec.phys_prop_tab_num; in_stream>>aRec.mat_prop_tab_num; @@ -226,12 +227,11 @@ void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet) } aRec.node_labels.resize(n_nodes); - for(int j=0; j < n_nodes; j++){ + for(int j=0; j < n_nodes; j++) // read node labels in_stream>>aRec.node_labels[j]; - } - theDataSet.insert(TDataSet::value_type(aLabel,aRec)); + theDataSet.push_back(aRec); } } @@ -249,17 +249,18 @@ void UNV2412::Write(std::ofstream& out_stream, const TDataSet& theDataSet) out_stream<<" "<<_label_dataset<<"\n"; TDataSet::const_iterator anIter = theDataSet.begin(); - for(; anIter != theDataSet.end(); anIter++){ - const TElementLab& aLabel = anIter->first; - const TRecord& aRec = anIter->second; - out_stream< #include -#include - +#include namespace UNV2412{ typedef std::vector TNodeLabels; // Nodal connectivities + typedef int TElementLab; // type of element label - struct MESHDRIVERUNV_EXPORT TRecord{ + struct MESHDRIVERUNV_EXPORT TRecord + { TRecord(); + TElementLab label; int fe_descriptor_id; // FE descriptor id int phys_prop_tab_num; // physical property table number int mat_prop_tab_num; // material property table number @@ -49,8 +50,7 @@ namespace UNV2412{ int beam_aft_end; // beam aft-end cross section number }; - typedef int TElementLab; // type of element label - typedef std::map TDataSet; + typedef std::vector TDataSet; MESHDRIVERUNV_EXPORT void Read(std::ifstream& in_stream, TDataSet& theDataSet);