0021198: EDF 1548 GEOM: Writing of coordinates system into exported UNV files

Read/write CS and units. Use vector instead of map as TDataSet
This commit is contained in:
eap 2012-01-23 08:02:02 +00:00
parent 83219fd4b2
commit 5b637a30b4
6 changed files with 187 additions and 84 deletions

View File

@ -26,9 +26,11 @@
#include "utilities.h" #include "utilities.h"
#include "UNV164_Structure.hxx"
#include "UNV2411_Structure.hxx" #include "UNV2411_Structure.hxx"
#include "UNV2412_Structure.hxx" #include "UNV2412_Structure.hxx"
#include "UNV2417_Structure.hxx" #include "UNV2417_Structure.hxx"
#include "UNV2420_Structure.hxx"
#include "UNV_Utilities.hxx" #include "UNV_Utilities.hxx"
#include <Basics_Utils.hxx> #include <Basics_Utils.hxx>
@ -42,6 +44,52 @@ static int MYDEBUG = 1;
static int MYDEBUG = 0; static int MYDEBUG = 0;
#endif #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() DriverUNV_R_SMDS_Mesh::~DriverUNV_R_SMDS_Mesh()
{ {
@ -55,49 +103,89 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
Kernel_Utils::Localizer loc; Kernel_Utils::Localizer loc;
Status aResult = DRS_OK; Status aResult = DRS_OK;
std::ifstream in_stream(myFile.c_str()); 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; using namespace UNV2411;
TDataSet aDataSet2411; TDataSet aDataSet2411;
UNV2411::Read(in_stream,aDataSet2411); UNV2411::Read(in_stream,aDataSet2411);
if(MYDEBUG) MESSAGE("Perform - aDataSet2411.size() = "<<aDataSet2411.size()); if(MYDEBUG) MESSAGE("Perform - aDataSet2411.size() = "<<aDataSet2411.size());
// Move nodes in a global CS
if ( !aCoordSysDataSet.empty() )
{
UNV2420::TDataSet::const_iterator csIter = aCoordSysDataSet.begin();
for ( ; csIter != aCoordSysDataSet.end(); ++csIter )
{
// find any node in this CS
TDataSet::const_iterator nodeIter = aDataSet2411.begin();
for (; nodeIter != aDataSet2411.end(); nodeIter++)
if ( nodeIter->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(); TDataSet::const_iterator anIter = aDataSet2411.begin();
for(; anIter != aDataSet2411.end(); anIter++){ for(; anIter != aDataSet2411.end(); anIter++)
const TNodeLab& aLabel = anIter->first; {
const TRecord& aRec = anIter->second; const TRecord& aRec = *anIter;
//MESSAGE("AddNodeWithID " << aLabel << " " << aRec.coord[0] << " " << aRec.coord[1] << " " << aRec.coord[2]); myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aRec.label);
myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aLabel);
} }
} }
{ {
using namespace UNV2412; using namespace UNV2412;
in_stream.seekg(0);
TDataSet aDataSet2412; TDataSet aDataSet2412;
UNV2412::Read(in_stream,aDataSet2412); UNV2412::Read(in_stream,aDataSet2412);
TDataSet::const_iterator anIter = aDataSet2412.begin(); TDataSet::const_iterator anIter = aDataSet2412.begin();
if(MYDEBUG) MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size()); if(MYDEBUG) MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
for(; anIter != aDataSet2412.end(); anIter++){ for(; anIter != aDataSet2412.end(); anIter++)
{
SMDS_MeshElement* anElement = NULL; SMDS_MeshElement* anElement = NULL;
const TElementLab& aLabel = anIter->first; const TRecord& aRec = *anIter;
const TRecord& aRec = anIter->second;
if(IsBeam(aRec.fe_descriptor_id)) { if(IsBeam(aRec.fe_descriptor_id)) {
switch ( aRec.node_labels.size() ) { switch ( aRec.node_labels.size() ) {
case 2: // edge with two nodes case 2: // edge with two nodes
//MESSAGE("add edge " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1]); //MESSAGE("add edge " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1]);
anElement = myMesh->AddEdgeWithID(aRec.node_labels[0], anElement = myMesh->AddEdgeWithID(aRec.node_labels[0],
aRec.node_labels[1], aRec.node_labels[1],
aLabel); aRec.label);
break; break;
case 3: // quadratic edge (with 3 nodes) 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], anElement = myMesh->AddEdgeWithID(aRec.node_labels[0],
aRec.node_labels[2], aRec.node_labels[2],
aRec.node_labels[1], aRec.node_labels[1],
aLabel); aRec.label);
} }
} }
else if(IsFace(aRec.fe_descriptor_id)) { else if(IsFace(aRec.fe_descriptor_id)) {
//MESSAGE("add face " << aLabel); //MESSAGE("add face " << aRec.label);
switch(aRec.fe_descriptor_id){ switch(aRec.fe_descriptor_id){
case 41: // Plane Stress Linear Triangle case 41: // Plane Stress Linear Triangle
case 51: // Plane Strain 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], anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
aRec.node_labels[1], aRec.node_labels[1],
aRec.node_labels[2], aRec.node_labels[2],
aLabel); aRec.label);
break; break;
case 42: // Plane Stress Parabolic Triangle case 42: // Plane Stress Parabolic Triangle
@ -117,14 +205,14 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
case 72: // Membrane Parabolic Triangle case 72: // Membrane Parabolic Triangle
case 82: // Axisymetric Solid Parabolic Triangle case 82: // Axisymetric Solid Parabolic Triangle
case 92: // Thin Shell 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], anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
aRec.node_labels[2], aRec.node_labels[2],
aRec.node_labels[4], aRec.node_labels[4],
aRec.node_labels[1], aRec.node_labels[1],
aRec.node_labels[3], aRec.node_labels[3],
aRec.node_labels[5], aRec.node_labels[5],
aLabel); aRec.label);
break; break;
case 44: // Plane Stress Linear Quadrilateral 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[1],
aRec.node_labels[2], aRec.node_labels[2],
aRec.node_labels[3], aRec.node_labels[3],
aLabel); aRec.label);
break; break;
case 45: // Plane Stress Parabolic Quadrilateral 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[3],
aRec.node_labels[5], aRec.node_labels[5],
aRec.node_labels[7], aRec.node_labels[7],
aLabel); aRec.label);
break; break;
} }
} }
else if(IsVolume(aRec.fe_descriptor_id)){ else if(IsVolume(aRec.fe_descriptor_id)){
//MESSAGE("add volume " << aLabel); //MESSAGE("add volume " << aRec.label);
switch(aRec.fe_descriptor_id){ switch(aRec.fe_descriptor_id){
case 111: // Solid Linear Tetrahedron - TET4 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[2],
aRec.node_labels[1], aRec.node_labels[1],
aRec.node_labels[3], aRec.node_labels[3],
aLabel); aRec.label);
break; break;
case 118: // Solid Quadratic Tetrahedron - TET10 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[6],
aRec.node_labels[8], aRec.node_labels[8],
aRec.node_labels[7], aRec.node_labels[7],
aLabel); aRec.label);
break; break;
case 112: // Solid Linear Prism - PRISM6 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[3],
aRec.node_labels[5], aRec.node_labels[5],
aRec.node_labels[4], aRec.node_labels[4],
aLabel); aRec.label);
break; break;
case 113: // Solid Quadratic Prism - PRISM15 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[6],
aRec.node_labels[8], aRec.node_labels[8],
aRec.node_labels[7], aRec.node_labels[7],
aLabel); aRec.label);
break; break;
case 115: // Solid Linear Brick - HEX8 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[7],
aRec.node_labels[6], aRec.node_labels[6],
aRec.node_labels[5], aRec.node_labels[5],
aLabel); aRec.label);
break; break;
case 116: // Solid Quadratic Brick - HEX20 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[11],
aRec.node_labels[10], aRec.node_labels[10],
aRec.node_labels[9], aRec.node_labels[9],
aLabel); aRec.label);
break; break;
case 114: // pyramid of 13 nodes (quadratic) - PIRA13 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[10],
aRec.node_labels[9], aRec.node_labels[9],
aRec.node_labels[12], aRec.node_labels[12],
aLabel); aRec.label);
break; break;
} }
} }
if(!anElement) if(!anElement)
MESSAGE("DriverUNV_R_SMDS_Mesh::Perform - can not add element with ID = "<<aLabel<<" and type = "<<aRec.fe_descriptor_id); MESSAGE("DriverUNV_R_SMDS_Mesh::Perform - can not add element with ID = "<<aRec.label<<" and type = "<<aRec.fe_descriptor_id);
} }
} }
{ {
using namespace UNV2417; using namespace UNV2417;
in_stream.seekg(0);
TDataSet aDataSet2417; TDataSet aDataSet2417;
UNV2417::Read(in_stream,aDataSet2417); UNV2417::Read(in_stream,aDataSet2417);
if(MYDEBUG) MESSAGE("Perform - aDataSet2417.size() = "<<aDataSet2417.size()); if(MYDEBUG) MESSAGE("Perform - aDataSet2417.size() = "<<aDataSet2417.size());

View File

@ -32,9 +32,11 @@
#include "utilities.h" #include "utilities.h"
#include "UNV164_Structure.hxx"
#include "UNV2411_Structure.hxx" #include "UNV2411_Structure.hxx"
#include "UNV2412_Structure.hxx" #include "UNV2412_Structure.hxx"
#include "UNV2417_Structure.hxx" #include "UNV2417_Structure.hxx"
#include "UNV2420_Structure.hxx"
#include "UNV_Utilities.hxx" #include "UNV_Utilities.hxx"
#include <Basics_Utils.hxx> #include <Basics_Utils.hxx>
@ -64,6 +66,10 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
Status aResult = DRS_OK; Status aResult = DRS_OK;
std::ofstream out_stream(myFile.c_str()); std::ofstream out_stream(myFile.c_str());
try{ try{
UNV164::Write( out_stream ); // unit system
UNV2420::Write( out_stream, myMeshName ); // Coordinate system
{ {
using namespace UNV2411; using namespace UNV2411;
TDataSet aDataSet2411; TDataSet aDataSet2411;
@ -71,14 +77,15 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
//----------------------------------- //-----------------------------------
MESSAGE("Perform - myMesh->NbNodes() = "<<myMesh->NbNodes()); MESSAGE("Perform - myMesh->NbNodes() = "<<myMesh->NbNodes());
SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator();
for(; aNodesIter->more();){
const SMDS_MeshNode* aNode = aNodesIter->next();
TRecord aRec; TRecord aRec;
while ( aNodesIter->more() )
{
const SMDS_MeshNode* aNode = aNodesIter->next();
aRec.label = aNode->GetID();
aRec.coord[0] = aNode->X(); aRec.coord[0] = aNode->X();
aRec.coord[1] = aNode->Y(); aRec.coord[1] = aNode->Y();
aRec.coord[2] = aNode->Z(); aRec.coord[2] = aNode->Z();
const TNodeLab& aLabel = aNode->GetID(); aDataSet2411.push_back( aRec );
aDataSet2411.insert(TDataSet::value_type(aLabel,aRec));
} }
MESSAGE("Perform - aDataSet2411.size() = "<<aDataSet2411.size()); MESSAGE("Perform - aDataSet2411.size() = "<<aDataSet2411.size());
UNV2411::Write(out_stream,aDataSet2411); UNV2411::Write(out_stream,aDataSet2411);
@ -92,11 +99,12 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
MESSAGE("Perform - myMesh->NbEdges() = "<<myMesh->NbEdges()); MESSAGE("Perform - myMesh->NbEdges() = "<<myMesh->NbEdges());
if(myMesh->NbEdges()){ if(myMesh->NbEdges()){
SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator(); SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator();
for(; anIter->more();){ while( anIter->more() )
{
const SMDS_MeshEdge* anElem = anIter->next(); const SMDS_MeshEdge* anElem = anIter->next();
TElementLab aLabel = anElem->GetID();
int aNbNodes = anElem->NbNodes(); int aNbNodes = anElem->NbNodes();
TRecord aRec; TRecord aRec;
aRec.label = anElem->GetID();
aRec.node_labels.reserve(aNbNodes); aRec.node_labels.reserve(aNbNodes);
SMDS_ElemIteratorPtr aNodesIter; SMDS_ElemIteratorPtr aNodesIter;
aNodesIter = anElem->nodesIteratorToUNV(); aNodesIter = anElem->nodesIteratorToUNV();
@ -105,24 +113,27 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
} else { } else {
aRec.fe_descriptor_id = 11; aRec.fe_descriptor_id = 11;
} }
for(; aNodesIter->more();){ while( aNodesIter->more())
{
const SMDS_MeshElement* aNode = aNodesIter->next(); const SMDS_MeshElement* aNode = aNodesIter->next();
aRec.node_labels.push_back(aNode->GetID()); aRec.node_labels.push_back(aNode->GetID());
} }
aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); aDataSet2412.push_back(aRec);
} }
MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size()); MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
} }
MESSAGE("Perform - myMesh->NbFaces() = "<<myMesh->NbFaces()); MESSAGE("Perform - myMesh->NbFaces() = "<<myMesh->NbFaces());
if(myMesh->NbFaces()){ if ( myMesh->NbFaces() )
{
SMDS_FaceIteratorPtr anIter = myMesh->facesIterator(); SMDS_FaceIteratorPtr anIter = myMesh->facesIterator();
for(; anIter->more();){ while ( anIter->more())
{
const SMDS_MeshFace* anElem = anIter->next(); const SMDS_MeshFace* anElem = anIter->next();
if ( anElem->IsPoly() ) continue; if ( anElem->IsPoly() ) continue;
TElementLab aLabel = anElem->GetID();
int aNbNodes = anElem->NbNodes(); int aNbNodes = anElem->NbNodes();
TRecord aRec; TRecord aRec;
aRec.label = anElem->GetID();
aRec.node_labels.reserve(aNbNodes); aRec.node_labels.reserve(aNbNodes);
SMDS_ElemIteratorPtr aNodesIter; SMDS_ElemIteratorPtr aNodesIter;
aNodesIter = anElem->nodesIteratorToUNV(); aNodesIter = anElem->nodesIteratorToUNV();
@ -150,18 +161,18 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
default: default:
continue; continue;
} }
aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); aDataSet2412.push_back(aRec);
} }
MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size()); MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
} }
MESSAGE("Perform - myMesh->NbVolumes() = "<<myMesh->NbVolumes()); MESSAGE("Perform - myMesh->NbVolumes() = "<<myMesh->NbVolumes());
if(myMesh->NbVolumes()){ if ( myMesh->NbVolumes() )
{
SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator(); SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator();
for(; anIter->more();){ while ( anIter->more())
{
const SMDS_MeshVolume* anElem = anIter->next(); const SMDS_MeshVolume* anElem = anIter->next();
TElementLab aLabel = anElem->GetID();
int aNbNodes = anElem->NbNodes(); int aNbNodes = anElem->NbNodes();
//MESSAGE("aNbNodes="<<aNbNodes); //MESSAGE("aNbNodes="<<aNbNodes);
SMDS_ElemIteratorPtr aNodesIter; SMDS_ElemIteratorPtr aNodesIter;
@ -214,13 +225,15 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
} }
if(anId>0){ if(anId>0){
TRecord aRec; TRecord aRec;
aRec.label = anElem->GetID();
aRec.fe_descriptor_id = anId; aRec.fe_descriptor_id = anId;
aRec.node_labels.reserve(aNbNodes); 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(); const SMDS_MeshElement* aNode = aNodesIter->next();
aRec.node_labels.push_back(aNode->GetID()); aRec.node_labels.push_back(aNode->GetID());
} }
aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); aDataSet2412.push_back(aRec);
} }
} }
MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size()); MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());

View File

@ -33,8 +33,8 @@ using namespace UNV2411;
static string _label_dataset = "2411"; static string _label_dataset = "2411";
UNV2411::TRecord::TRecord(): UNV2411::TRecord::TRecord():
exp_coord_sys_num(0), exp_coord_sys_num(1),
disp_coord_sys_num(0), disp_coord_sys_num(1),
color(11)//(0) - 0019936: EDF 794 SMESH : Export UNV : Node color and group id color(11)//(0) - 0019936: EDF 794 SMESH : Export UNV : Node color and group id
{} {}
@ -54,16 +54,16 @@ void UNV2411::Read(std::ifstream& in_stream, TDataSet& theDataSet)
* always 3 coordinates in the UNV file, no matter * always 3 coordinates in the UNV file, no matter
* which dimensionality libMesh is in * which dimensionality libMesh is in
*/ */
TNodeLab aLabel;
std::string num_buf; std::string num_buf;
for(; !in_stream.eof();){ while ( !in_stream.eof() )
in_stream >> aLabel ; {
if(aLabel == -1){ TRecord aRec;
in_stream >> aRec.label ;
if ( aRec.label == -1 ) {
// end of dataset is reached // end of dataset is reached
break; break;
} }
TRecord aRec;
in_stream>>aRec.exp_coord_sys_num; in_stream>>aRec.exp_coord_sys_num;
in_stream>>aRec.disp_coord_sys_num; in_stream>>aRec.disp_coord_sys_num;
in_stream>>aRec.color; 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); 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"; out_stream<<" "<<_label_dataset<<"\n";
TDataSet::const_iterator anIter = theDataSet.begin(); TDataSet::const_iterator anIter = theDataSet.begin();
for(; anIter != theDataSet.end(); anIter++){ for(; anIter != theDataSet.end(); anIter++)
const TNodeLab& aLabel = anIter->first; {
const TRecord& aRec = anIter->second; const TRecord& aRec = *anIter;
char buf[78]; char buf[78];
sprintf(buf, "%10d%10d%10d%10d\n", sprintf(buf, "%10d%10d%10d%10d\n",
aLabel, aRec.label,
aRec.exp_coord_sys_num, aRec.exp_coord_sys_num,
aRec.disp_coord_sys_num, aRec.disp_coord_sys_num,
aRec.color); aRec.color);

View File

@ -25,21 +25,23 @@
#include "SMESH_DriverUNV.hxx" #include "SMESH_DriverUNV.hxx"
#include <map> #include <vector>
#include <fstream> #include <fstream>
namespace UNV2411{ namespace UNV2411{
typedef int TNodeLab; // type of node label
struct MESHDRIVERUNV_EXPORT TRecord{ struct MESHDRIVERUNV_EXPORT TRecord{
TRecord(); TRecord();
TNodeLab label;
int exp_coord_sys_num; // export coordinate system number int exp_coord_sys_num; // export coordinate system number
int disp_coord_sys_num; // displacement coordinate system number int disp_coord_sys_num; // displacement coordinate system number
int color; // color int color; // color
double coord[3]; // node coordinates in the part coordinate system double coord[3]; // node coordinates in the part coordinate system
}; };
typedef int TNodeLab; // type of node label typedef std::vector<TRecord> TDataSet;
typedef std::map<TNodeLab,TRecord> TDataSet;
MESHDRIVERUNV_EXPORT void MESHDRIVERUNV_EXPORT void
Read(std::ifstream& in_stream, TDataSet& theDataSet); Read(std::ifstream& in_stream, TDataSet& theDataSet);

View File

@ -183,12 +183,14 @@ using namespace UNV2412;
static string _label_dataset = "2412"; static string _label_dataset = "2412";
UNV2412::TRecord::TRecord(): UNV2412::TRecord::TRecord():
label(-1),
fe_descriptor_id(-1),
phys_prop_tab_num(2), phys_prop_tab_num(2),
mat_prop_tab_num(1), mat_prop_tab_num(1),
color(7), color(7),
beam_orientation(0), beam_orientation(0),
beam_fore_end(0), beam_fore_end(1), // default values
beam_aft_end(0) beam_aft_end(1) // default values
{} {}
void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet) 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)) if(!beginning_of_dataset(in_stream,_label_dataset))
EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!"); EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!");
TElementLab aLabel; TRecord aRec;
for(; !in_stream.eof();){ while( !in_stream.eof())
in_stream >> aLabel ; {
if(aLabel == -1){ in_stream >> aRec.label ;
if (aRec.label == -1)
// end of dataset is reached // end of dataset is reached
break; break;
}
int n_nodes; int n_nodes;
TRecord aRec;
in_stream>>aRec.fe_descriptor_id; in_stream>>aRec.fe_descriptor_id;
in_stream>>aRec.phys_prop_tab_num; in_stream>>aRec.phys_prop_tab_num;
in_stream>>aRec.mat_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); 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 // read node labels
in_stream>>aRec.node_labels[j]; 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"; out_stream<<" "<<_label_dataset<<"\n";
TDataSet::const_iterator anIter = theDataSet.begin(); TDataSet::const_iterator anIter = theDataSet.begin();
for(; anIter != theDataSet.end(); anIter++){ for(; anIter != theDataSet.end(); anIter++)
const TElementLab& aLabel = anIter->first; {
const TRecord& aRec = anIter->second; const TRecord& aRec = *anIter;
out_stream<<std::setw(10)<<aLabel; /* element ID */ out_stream<<std::setw(10)<<aRec.label; /* element ID */
out_stream<<std::setw(10)<<aRec.fe_descriptor_id; /* type of element */ out_stream<<std::setw(10)<<aRec.fe_descriptor_id; /* type of element */
out_stream<<std::setw(10)<<aRec.phys_prop_tab_num; out_stream<<std::setw(10)<<aRec.phys_prop_tab_num;
out_stream<<std::setw(10)<<aRec.mat_prop_tab_num; out_stream<<std::setw(10)<<aRec.mat_prop_tab_num;
out_stream<<std::setw(10)<<aRec.color; out_stream<<std::setw(10)<<aRec.color;
out_stream<<std::setw(10)<<aRec.node_labels.size()<<std::endl; /* No. of nodes per element */ out_stream<<std::setw(10)<<aRec.node_labels.size()<<std::endl; /* No. of nodes per element */
if(IsBeam(aRec.fe_descriptor_id)){ if(IsBeam(aRec.fe_descriptor_id))
{
out_stream<<std::setw(10)<<aRec.beam_orientation; out_stream<<std::setw(10)<<aRec.beam_orientation;
out_stream<<std::setw(10)<<aRec.beam_fore_end; out_stream<<std::setw(10)<<aRec.beam_fore_end;
out_stream<<std::setw(10)<<aRec.beam_aft_end<<std::endl; out_stream<<std::setw(10)<<aRec.beam_aft_end<<std::endl;

View File

@ -25,18 +25,19 @@
#include "SMESH_DriverUNV.hxx" #include "SMESH_DriverUNV.hxx"
#include <map>
#include <vector> #include <vector>
#include <fstream> #include <fstream>
namespace UNV2412{ namespace UNV2412{
typedef std::vector<int> TNodeLabels; // Nodal connectivities typedef std::vector<int> TNodeLabels; // Nodal connectivities
typedef int TElementLab; // type of element label
struct MESHDRIVERUNV_EXPORT TRecord{ struct MESHDRIVERUNV_EXPORT TRecord
{
TRecord(); TRecord();
TElementLab label;
int fe_descriptor_id; // FE descriptor id int fe_descriptor_id; // FE descriptor id
int phys_prop_tab_num; // physical property table number int phys_prop_tab_num; // physical property table number
int mat_prop_tab_num; // material 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 int beam_aft_end; // beam aft-end cross section number
}; };
typedef int TElementLab; // type of element label typedef std::vector<TRecord> TDataSet;
typedef std::map<TElementLab,TRecord> TDataSet;
MESHDRIVERUNV_EXPORT void MESHDRIVERUNV_EXPORT void
Read(std::ifstream& in_stream, TDataSet& theDataSet); Read(std::ifstream& in_stream, TDataSet& theDataSet);