X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FDriverUNV%2FDriverUNV_R_SMDS_Mesh.cxx;h=f72df42cfc4b7233cece4253123d25a031e88292;hp=b9de018aa527e1924b51caa26a54fbbe7b1c8d08;hb=5482b99d07dd144fd5be299e722f39a81de3b5be;hpb=bef9beee88cac57394b8dc3bc914381c1a2fff83 diff --git a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx index b9de018aa..f72df42cf 100644 --- a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx @@ -1,153 +1,502 @@ -using namespace std; +// Copyright (C) 2007-2015 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, or (at your option) any later version. +// +// 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 +// + #include "DriverUNV_R_SMDS_Mesh.h" +#include "SMDS_Mesh.hxx" +#include "SMDS_MeshGroup.hxx" #include "utilities.h" -DriverUNV_R_SMDS_Mesh::DriverUNV_R_SMDS_Mesh() { -; -} +#include "UNV164_Structure.hxx" +#include "UNV2411_Structure.hxx" +#include "UNV2412_Structure.hxx" +#include "UNV2417_Structure.hxx" +#include "UNV2420_Structure.hxx" +#include "UNV_Utilities.hxx" -DriverUNV_R_SMDS_Mesh::~DriverUNV_R_SMDS_Mesh() { -; -} +#include -void DriverUNV_R_SMDS_Mesh::SetMesh(Handle(SMDS_Mesh)& aMesh) { - myMesh = aMesh; -} +using namespace std; -void DriverUNV_R_SMDS_Mesh::SetFile(string aFile) { - myFile = aFile; -} -void DriverUNV_R_SMDS_Mesh::SetFileId(FILE* aFileId) { - myFileId = aFileId; -} +#ifdef _DEBUG_ +static int MYDEBUG = 1; +#else +static int MYDEBUG = 0; +#endif -void DriverUNV_R_SMDS_Mesh::SetMeshId(int aMeshId) { - myMeshId = aMeshId; -} +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; -void DriverUNV_R_SMDS_Mesh::Add() { - ; + // 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 ); + } + } + } } -void DriverUNV_R_SMDS_Mesh::Read() { +DriverUNV_R_SMDS_Mesh::~DriverUNV_R_SMDS_Mesh() +{ + if (myGroup != 0) + delete myGroup; +} - int cell=0,node=0,n1,n2,n3,n4,n_nodes,nodes[6],blockId,i; - char *s1,*s2,*s3; - string str1,str2,str3; - int i1=0; - bool ok, found_block2411, found_block2412; - /**************************************************************************** - * OUVERTURE DU FICHIER EN LECTURE * - ****************************************************************************/ - char* file2Read = (char*)myFile.c_str(); - myFileId = fopen(file2Read,"r"); - if (myFileId < 0) +Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() +{ + Kernel_Utils::Localizer loc; + Status aResult = DRS_OK; + std::ifstream in_stream(myFile.c_str()); + try + { { - fprintf(stderr,">> ERREUR : ouverture du fichier %s \n",file2Read); - exit(EXIT_FAILURE); - } + // Read Units + UNV164::TRecord aUnitsRecord; + UNV164::Read( in_stream, aUnitsRecord ); - s1 = (char*) malloc(sizeof(char)*100); - s2 = (char*) malloc(sizeof(char)*100); - s3 = (char*) malloc(sizeof(char)*100); - - found_block2411 = false; - found_block2412 = false; - - do { - - while (i1==-1) { - fscanf(myFileId,"%d\n",&blockId); - switch (blockId) { - case 2411 : { - MESSAGE("BlockId "<AddNodeWithID(atof(str1.c_str()),atof(str2.c_str()),atof(str3.c_str()),node); - fscanf(myFileId,"%d",&node); - } - i1=0; - found_block2411 = true; - break; - } - case 2412 : { - MESSAGE("BlockId "<AddFaceWithID(nodes[0],nodes[1],nodes[2],cell); - } - else if (n_nodes==6) {//206 - for (i=1;i<=n_nodes;i++) - fscanf(myFileId,"%d",&nodes[i-1]); - ok = myMesh->AddFaceWithID(nodes[0],nodes[2],nodes[4],cell); - } - } - - else if ((n1==11)||(n1==21)||(n1==24)||(n1==25)) {//103 - fgets(s2,100,myFileId); - if (n_nodes==3) { - for (i=1;i<=n_nodes;i++) - fscanf(myFileId,"%d",&nodes[i-1]); - ok = myMesh->AddEdgeWithID(nodes[0],nodes[1],cell); - //MESSAGE("in 103 "<AddEdgeWithID(nodes[0],nodes[1],cell); - //MESSAGE("in 102 "<AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aRec.label); } } - - fscanf(myFileId,"%s\n",s1); - i1 = atoi(s1); + { + using namespace UNV2412; + TDataSet aDataSet2412; + UNV2412::Read(in_stream,aDataSet2412); + TDataSet::const_iterator anIter = aDataSet2412.begin(); + if(MYDEBUG) MESSAGE("Perform - aDataSet2412.size() = "<AddEdgeWithID(aRec.node_labels[0], + aRec.node_labels[1], + aRec.label); + break; + case 3: // quadratic edge (with 3 nodes) + //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], + aRec.label); + } + } + else if(IsFace(aRec.fe_descriptor_id)) { + //MESSAGE("add face " << aRec.label); + switch(aRec.fe_descriptor_id){ + case 41: // Plane Stress Linear Triangle + case 51: // Plane Strain Linear Triangle + case 61: // Plate Linear Triangle + case 74: // Membrane Linear Triangle + case 81: // Axisymetric Solid Linear Triangle + case 91: // Thin Shell Linear Triangle + anElement = myMesh->AddFaceWithID(aRec.node_labels[0], + aRec.node_labels[1], + aRec.node_labels[2], + aRec.label); + break; - } - while ((!feof(myFileId))&&((!found_block2411)||(!found_block2412))); + case 42: // Plane Stress Parabolic Triangle + case 52: // Plane Strain Parabolic Triangle + case 62: // Plate Parabolic Triangle + case 72: // Membrane Parabolic Triangle + case 82: // Axisymetric Solid Parabolic Triangle + case 92: // Thin Shell Parabolic Triangle + if ( aRec.node_labels.size() == 7 ) + 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], + aRec.node_labels[6], + aRec.label); + else + 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], + aRec.label); + break; + + case 44: // Plane Stress Linear Quadrilateral + case 54: // Plane Strain Linear Quadrilateral + case 64: // Plate Linear Quadrilateral + case 71: // Membrane Linear Quadrilateral + case 84: // Axisymetric Solid Linear Quadrilateral + case 94: // Thin Shell Linear Quadrilateral + anElement = myMesh->AddFaceWithID(aRec.node_labels[0], + aRec.node_labels[1], + aRec.node_labels[2], + aRec.node_labels[3], + aRec.label); + break; + + case 45: // Plane Stress Parabolic Quadrilateral + case 55: // Plane Strain Parabolic Quadrilateral + case 65: // Plate Parabolic Quadrilateral + case 75: // Membrane Parabolic Quadrilateral + case 85: // Axisymetric Solid Parabolic Quadrilateral + case 95: // Thin Shell Parabolic Quadrilateral + if ( aRec.node_labels.size() == 9 ) + anElement = myMesh->AddFaceWithID(aRec.node_labels[0], + aRec.node_labels[2], + aRec.node_labels[4], + aRec.node_labels[6], + aRec.node_labels[1], + aRec.node_labels[3], + aRec.node_labels[5], + aRec.node_labels[7], + aRec.node_labels[8], + aRec.label); + else + anElement = myMesh->AddFaceWithID(aRec.node_labels[0], + aRec.node_labels[2], + aRec.node_labels[4], + aRec.node_labels[6], + aRec.node_labels[1], + aRec.node_labels[3], + aRec.node_labels[5], + aRec.node_labels[7], + aRec.label); + break; + } + } + else if(IsVolume(aRec.fe_descriptor_id)){ + //MESSAGE("add volume " << aRec.label); + switch(aRec.fe_descriptor_id){ - /**************************************************************************** - * FERMETURE DU FICHIER * - ****************************************************************************/ - free(s1); - free(s2); - free(s3); - fclose(myFileId); + case 111: // Solid Linear Tetrahedron - TET4 + anElement = myMesh->AddVolumeWithID(aRec.node_labels[0], + aRec.node_labels[2], + aRec.node_labels[1], + aRec.node_labels[3], + aRec.label); + break; + case 118: // Solid Quadratic Tetrahedron - TET10 + anElement = myMesh->AddVolumeWithID(aRec.node_labels[0], + aRec.node_labels[4], + aRec.node_labels[2], + + aRec.node_labels[9], + + aRec.node_labels[5], + aRec.node_labels[3], + aRec.node_labels[1], + + aRec.node_labels[6], + aRec.node_labels[8], + aRec.node_labels[7], + aRec.label); + break; + + case 112: // Solid Linear Prism - PRISM6 + anElement = myMesh->AddVolumeWithID(aRec.node_labels[0], + aRec.node_labels[2], + aRec.node_labels[1], + aRec.node_labels[3], + aRec.node_labels[5], + aRec.node_labels[4], + aRec.label); + break; + + case 113: // Solid Quadratic Prism - PRISM15 + anElement = myMesh->AddVolumeWithID(aRec.node_labels[0], + aRec.node_labels[4], + aRec.node_labels[2], + + aRec.node_labels[9], + aRec.node_labels[13], + aRec.node_labels[11], + + aRec.node_labels[5], + aRec.node_labels[3], + aRec.node_labels[1], + + aRec.node_labels[14], + aRec.node_labels[12], + aRec.node_labels[10], + + aRec.node_labels[6], + aRec.node_labels[8], + aRec.node_labels[7], + aRec.label); + break; + + case 115: // Solid Linear Brick - HEX8 + anElement = myMesh->AddVolumeWithID(aRec.node_labels[0], + aRec.node_labels[3], + aRec.node_labels[2], + aRec.node_labels[1], + aRec.node_labels[4], + aRec.node_labels[7], + aRec.node_labels[6], + aRec.node_labels[5], + aRec.label); + break; + + case 116: // Solid Quadratic Brick - HEX20 + anElement = myMesh->AddVolumeWithID(aRec.node_labels[0], + aRec.node_labels[6], + aRec.node_labels[4], + aRec.node_labels[2], + + aRec.node_labels[12], + aRec.node_labels[18], + aRec.node_labels[16], + aRec.node_labels[14], + + aRec.node_labels[7], + aRec.node_labels[5], + aRec.node_labels[3], + aRec.node_labels[1], + + aRec.node_labels[19], + aRec.node_labels[17], + aRec.node_labels[15], + aRec.node_labels[13], + + aRec.node_labels[8], + aRec.node_labels[11], + aRec.node_labels[10], + aRec.node_labels[9], + aRec.label); + break; + + case 114: // pyramid of 13 nodes (quadratic) - PIRA13 + anElement = myMesh->AddVolumeWithID(aRec.node_labels[0], + aRec.node_labels[6], + aRec.node_labels[4], + aRec.node_labels[2], + aRec.node_labels[7], + aRec.node_labels[5], + aRec.node_labels[3], + aRec.node_labels[1], + + aRec.node_labels[8], + aRec.node_labels[11], + aRec.node_labels[10], + aRec.node_labels[9], + aRec.node_labels[12], + aRec.label); + break; + + } + } + if(!anElement) + MESSAGE("DriverUNV_R_SMDS_Mesh::Perform - can not add element with ID = "< 0) + aGrName.erase (i, 2); + myGroupNames.insert(TGroupNamesMap::value_type(aNodesGroup, aGrName)); + myGroupId.insert(TGroupIdMap::value_type(aNodesGroup, aLabel)); + + for (i = 0; i < aNodesNb; i++) { + const SMDS_MeshNode* aNode = myMesh->FindNode(aRec.NodeList[i]); + if (aNode) + aNodesGroup->Add(aNode); + } + } + if (aElementsNb > 0){ + SMDS_MeshGroup* aEdgesGroup = 0; + SMDS_MeshGroup* aFacesGroup = 0; + SMDS_MeshGroup* aVolumeGroup = 0; + bool createdGroup = false; + + for (i = 0; i < aElementsNb; i++) { + const SMDS_MeshElement* aElement = myMesh->FindElement(aRec.ElementList[i]); + if (aElement) { + switch (aElement->GetType()) { + + case SMDSAbs_Edge: + if (!aEdgesGroup) { + aEdgesGroup = (SMDS_MeshGroup*) myGroup->AddSubGroup(SMDSAbs_Edge); + if (!useSuffix && createdGroup) useSuffix = true; + std::string aEdgesGrName = (useSuffix) ? aRec.GroupName + "_Edges" : aRec.GroupName; + int i = aEdgesGrName.find( "\r" ); + if (i > 0) + aEdgesGrName.erase (i, 2); + myGroupNames.insert(TGroupNamesMap::value_type(aEdgesGroup, aEdgesGrName)); + myGroupId.insert(TGroupIdMap::value_type(aEdgesGroup, aLabel)); + createdGroup = true; + } + aEdgesGroup->Add(aElement); + break; + + case SMDSAbs_Face: + if (!aFacesGroup) { + aFacesGroup = (SMDS_MeshGroup*) myGroup->AddSubGroup(SMDSAbs_Face); + if (!useSuffix && createdGroup) useSuffix = true; + std::string aFacesGrName = (useSuffix) ? aRec.GroupName + "_Faces" : aRec.GroupName; + int i = aFacesGrName.find( "\r" ); + if (i > 0) + aFacesGrName.erase (i, 2); + myGroupNames.insert(TGroupNamesMap::value_type(aFacesGroup, aFacesGrName)); + myGroupId.insert(TGroupIdMap::value_type(aFacesGroup, aLabel)); + createdGroup = true; + } + aFacesGroup->Add(aElement); + break; + + case SMDSAbs_Volume: + if (!aVolumeGroup) { + aVolumeGroup = (SMDS_MeshGroup*) myGroup->AddSubGroup(SMDSAbs_Volume); + if (!useSuffix && createdGroup) useSuffix = true; + std::string aVolumeGrName = (useSuffix) ? aRec.GroupName + "_Volumes" : aRec.GroupName; + int i = aVolumeGrName.find( "\r" ); + if (i > 0) + aVolumeGrName.erase (i, 2); + myGroupNames.insert(TGroupNamesMap::value_type(aVolumeGroup, aVolumeGrName)); + myGroupId.insert(TGroupIdMap::value_type(aVolumeGroup, aLabel)); + createdGroup = true; + } + aVolumeGroup->Add(aElement); + break; + + default:; + } + } + } + } + } + } + } + } + catch(const std::exception& exc){ + INFOS("Follow exception was cought:\n\t"<compactMesh(); + return aResult; }