diff --git a/src/Core/Mesh/CommandExportBlocksForCGNS.cpp b/src/Core/Mesh/CommandExportBlocksForCGNS.cpp index 4541d00b..db690248 100644 --- a/src/Core/Mesh/CommandExportBlocksForCGNS.cpp +++ b/src/Core/Mesh/CommandExportBlocksForCGNS.cpp @@ -7,9 +7,9 @@ namespace Mgx3D { namespace Mesh { /*----------------------------------------------------------------------------*/ CommandExportBlocksForCGNS:: - CommandExportBlocksForCGNS(Internal::Context& context, const std::string& fileName) + CommandExportBlocksForCGNS(Internal::Context& context, int dim, const std::string& fileName) : Internal::CommandInternal(context, "Export CGNS total") - , m_impl(context,fileName) + , m_impl(context,fileName, dim) { } diff --git a/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp b/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp index 4162c8da..6b6cdb2b 100644 --- a/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp +++ b/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp @@ -12,7 +12,7 @@ /*----------------------------------------------------------------------------*/ #include #include -#include +#include /*----------------------------------------------------------------------------*/ #include #include @@ -22,8 +22,8 @@ namespace Mgx3D { namespace Mesh { /*----------------------------------------------------------------------------*/ ExportBlocksCGNSImplementation:: - ExportBlocksCGNSImplementation(Internal::Context& c, const std::string& filename) - : m_context(c), m_filename(filename) + ExportBlocksCGNSImplementation(Internal::Context& c, const std::string& filename, int dim) + : m_context(c), m_filename(filename), m_dim(dim) {} /*----------------------------------------------------------------------------*/ @@ -32,15 +32,20 @@ namespace Mgx3D { /*----------------------------------------------------------------------------*/ void ExportBlocksCGNSImplementation::perform(Internal::InfoCommand* icmd) { + if (m_dim == 2) perform2D(); + else if (m_dim == 3) perform3D(); + } +/*----------------------------------------------------------------------------*/ + void ExportBlocksCGNSImplementation::perform3D() + { std::vector topo_vertices; std::vector topo_blocs; std::vector topo_faces; - std::map n2v; gmds::Mesh mesh(gmds::MeshModel(gmds::DIM3 | gmds::N | gmds::F | gmds::R | - gmds::R2N | gmds::N2R | gmds::R2F | gmds::F2R | gmds::F2N | gmds::N2F)); + gmds::R2N | gmds::N2R | gmds::R2F | gmds::F2R | gmds::F2N | gmds::N2F)); gmds::Mesh* localMesh = &m_context.getMeshManager().getMesh()->getGMDSMesh(); @@ -53,8 +58,37 @@ namespace Mgx3D { m_context.getTopoManager().getBlocks(topo_blocs); m_context.getTopoManager().getCoFaces(topo_faces); + std::map topoF_2_gmdsF; + + for (auto cf : topo_faces) { + int n0 = cf->getVertex(0)->getNode(); + int n1 = cf->getVertex(1)->getNode(); + int n2 = cf->getVertex(2)->getNode(); + int n3 = cf->getVertex(3)->getNode(); + + gmds::Face f = mesh.newQuad(n0,n1,n2,n3); + + topoF_2_gmdsF[cf->getName()] = f.id(); + } + + std::map topoB_2_gmdsB; + for(int iBlock = 0; iBlock < topo_blocs.size(); iBlock++){ + Topo::Block* block = topo_blocs[iBlock]; std::vector ids; + std::vector vertices; + vertices.resize(8); + + vertices[0] = block->getVertex(false,false,false); + vertices[1] = block->getVertex(true,false,false); + vertices[2] = block->getVertex(true,true,false); + vertices[3] = block->getVertex(false,true,false); + vertices[4] = block->getVertex(false,false,true); + vertices[5] = block->getVertex(true,false,true); + vertices[6] = block->getVertex(true,true,true); + vertices[7] = block->getVertex(false,true,true); + + ids.push_back(topo_blocs[iBlock]->getVertex(false,false,false)->getNode()); ids.push_back(topo_blocs[iBlock]->getVertex(true,false,false)->getNode()); ids.push_back(topo_blocs[iBlock]->getVertex(true,true,false)->getNode()); @@ -64,8 +98,42 @@ namespace Mgx3D { ids.push_back(topo_blocs[iBlock]->getVertex(true,true,true)->getNode()); ids.push_back(topo_blocs[iBlock]->getVertex(false,true,true)->getNode()); - mesh.newHex(ids[0],ids[1],ids[2],ids[3], - ids[4],ids[5],ids[6],ids[7]); + + gmds::Region r = mesh.newHex(ids[0],ids[1],ids[2],ids[3], + ids[4],ids[5],ids[6],ids[7]); + + if(topo_blocs[iBlock]->getNbCoFaces() != 6 ){ + throw TkUtil::Exception(TkUtil::UTF8String ("Le bloc "+topo_blocs[iBlock]->getName()+" n'est pas conforme.", TkUtil::Charset::UTF_8)); + } + + int iface0 = topoF_2_gmdsF[block->getFace(vertices[0],vertices[1],vertices[2],vertices[3])->getCoFace(0)->getName()]; + int iface1 = topoF_2_gmdsF[block->getFace(vertices[0],vertices[1],vertices[5],vertices[4])->getCoFace(0)->getName()]; + int iface2 = topoF_2_gmdsF[block->getFace(vertices[1],vertices[2],vertices[6],vertices[5])->getCoFace(0)->getName()]; + int iface3 = topoF_2_gmdsF[block->getFace(vertices[2],vertices[3],vertices[7],vertices[6])->getCoFace(0)->getName()]; + int iface4 = topoF_2_gmdsF[block->getFace(vertices[3],vertices[0],vertices[4],vertices[7])->getCoFace(0)->getName()]; + int iface5 = topoF_2_gmdsF[block->getFace(vertices[4],vertices[5],vertices[6],vertices[7])->getCoFace(0)->getName()]; + + r.add(iface0); + r.add(iface1); + r.add(iface2); + r.add(iface3); + r.add(iface4); + r.add(iface5); + + gmds::Face f0 = mesh.get(iface0); + f0.add(iBlock); + gmds::Face f1 = mesh.get(iface1); + f1.add(iBlock); + gmds::Face f2 = mesh.get(iface2); + f2.add(iBlock); + gmds::Face f3 = mesh.get(iface3); + f3.add(iBlock); + gmds::Face f4 = mesh.get(iface4); + f4.add(iBlock); + gmds::Face f5 = mesh.get(iface5); + f5.add(iBlock); + + topoB_2_gmdsB[topo_blocs[iBlock]->getName()] = iBlock; } @@ -77,6 +145,7 @@ namespace Mgx3D { gmds::Variable* internalNodes = mesh.newVariable("block"+std::to_string(iBlock)); + uint b_discrI,b_discrJ,b_discrK; topo_blocs[iBlock]->getNbMeshingEdges(b_discrI,b_discrJ,b_discrK); discrI->set(iBlock, b_discrI+1); @@ -96,10 +165,24 @@ namespace Mgx3D { * Pour se faire on ecrit juste des variables de maillages sur les noeuds en donnant le nom qui sera * utilisé dans le fichier cgns */ - gmds::Variable* farfield = mesh.newVariable("Farfield"); - gmds::Variable* paroi = mesh.newVariable("Paroi"); - gmds::Variable* out = mesh.newVariable("Sortie"); - gmds::Variable* sym = mesh.newVariable("Symetrie"); + //gmds::Variable* farfield = mesh.newVariable("Farfield"); + //gmds::Variable* paroi = mesh.newVariable("Paroi"); + //gmds::Variable* out = mesh.newVariable("Sortie"); + //gmds::Variable* sym = mesh.newVariable("Symetrie"); + + + std::vector groups2D; + getStdContext()->getGroupManager().getGroups(groups2D, Internal::SelectionManager::DIM::D2); + + std::vector groupsname; + for(auto g : groups2D){ + std::string name = g->getName(); + if(name.find("_cgns") != std::string::npos){ + groupsname.push_back(g->getName()); + std::string varName = name.substr(0, name.length()-5); + mesh.newVariable(varName); + } + } /* * Pour récupérer les variables à écrire on utilise les groupes des entités topologiques et on va mettre @@ -112,49 +195,235 @@ namespace Mgx3D { * elle appartient au groupe en question, si oui on prend tous ses noeuds et on met la variable à 1 */ for(auto f : topo_faces){ - std::vector groupsName; - f->getGroupsName(groupsName); + std::vector f_groupsName; + f->getGroupsName(f_groupsName); std::vector f_nodes = f->nodes(); - if(std::find(groupsName.begin(),groupsName.end(), "Farfield") != groupsName.end()){ + for(const auto& name : groupsname){ + if(std::find(f_groupsName.begin(),f_groupsName.end(), name) != f_groupsName.end()){ + std::string varName = name.substr(0, name.length()-5); + gmds::Variable* var = mesh.getVariable(varName); + var->set(topoF_2_gmdsF[f->getName()], 1); + } + } + /* + if(std::find(f_groupsName.begin(),f_groupsName.end(), "Farfield") != f_groupsName.end()){ for(auto n : f_nodes){ farfield->set(n, 1); } - }else if(std::find(groupsName.begin(),groupsName.end(), "Paroi") != groupsName.end()){ + }else if(std::find(f_groupsName.begin(),f_groupsName.end(), "Paroi") != f_groupsName.end()){ for(auto n : f_nodes){ paroi->set(n, 1); } - }else if(std::find(groupsName.begin(),groupsName.end(), "Sortie") != groupsName.end()){ + }else if(std::find(f_groupsName.begin(),f_groupsName.end(), "Sortie") != f_groupsName.end()){ for(auto n : f_nodes){ out->set(n, 1); } - }else if(std::find(groupsName.begin(),groupsName.end(), "Symetrie") != groupsName.end()){ + }else if(std::find(f_groupsName.begin(),f_groupsName.end(), "Symetrie") != f_groupsName.end()){ for(auto n : f_nodes){ sym->set(n, 1); } - } + }*/ } //gmds::Variable* fluide = mesh.newVariable(gmds::GMDS_NODE,"Fluide"); //Valeur par défaut - gmds::Variable* solide = mesh.newVariable("Solide"); - for(auto b : topo_blocs) { - std::vector groupsName; - b->getGroupsName(groupsName); - std::vector b_nodes = b->nodes(); - if (std::find(groupsName.begin(), groupsName.end(), "Solide") != groupsName.end()) { - for (auto n: b_nodes) { - solide->set(n, 1); + //gmds::Variable* solide = mesh.newVariable("Solide"); + + std::vector groups3D; + getStdContext()->getGroupManager().getGroups(groups3D, Internal::SelectionManager::DIM::D3); + + groupsname.clear(); + for(auto g : groups3D){ + std::string name = g->getName(); + if(name.find("_cgns") != std::string::npos){ + groupsname.push_back(g->getName()); + std::string varName = name.substr(0, name.length()-5); + mesh.newVariable(varName); + } + } + + for(int iBlock = 0; iBlock < topo_blocs.size(); iBlock++) { + std::vector b_groupsName; + topo_blocs[iBlock]->getGroupsName(b_groupsName); + for(const auto& name : groupsname) { + if (std::find(b_groupsName.begin(), b_groupsName.end(), name) != b_groupsName.end()) { + std::string varName = name.substr(0, name.length()-5); + gmds::Variable* var = mesh.getVariable(varName); + var->set(iBlock, 1); + } + } + } + + int position = m_filename.find_last_of('/'); + + m_basename = m_filename.substr(position+1, m_filename.length()-position+1); + + m_path = m_filename.substr(0, position+1); + + gmds::aero::CGNSWriterND writer(&mesh, m_dim); + writer.write("",m_basename,m_path); + } +/*----------------------------------------------------------------------------*/ + void ExportBlocksCGNSImplementation::perform2D() + { + std::vector topo_vertices; + std::vector topo_faces; + std::vector topo_edges; + + + gmds::Mesh mesh(gmds::MeshModel(gmds::DIM2 | gmds::N | gmds::E | gmds::F | + gmds::F2N | gmds::N2F | gmds::F2E | gmds::E2F | gmds::E2N | gmds::N2E)); + + gmds::Mesh* localMesh = &m_context.getMeshManager().getMesh()->getGMDSMesh(); + + + for(int iVertex = 0; iVertex < localMesh->getNbNodes(); iVertex++){ + gmds::Node n_local = localMesh->get(iVertex); + gmds::Node n = mesh.newNode(n_local.X(),n_local.Y(),n_local.Z()); + } + + m_context.getTopoManager().getCoFaces(topo_faces); + m_context.getTopoManager().getCoEdges(topo_edges); + + std::map topoE_2_gmdsE; + + for (auto ce : topo_edges) { + int n0 = ce->getVertex(0)->getNode(); + int n1 = ce->getVertex(1)->getNode(); + + gmds::Edge e = mesh.newEdge(n0,n1); + + topoE_2_gmdsE[ce->getName()] = e.id(); + } + + std::map topoF_2_gmdsF; + + for(int iFace = 0; iFace < topo_faces.size(); iFace++){ + Topo::CoFace* face = topo_faces[iFace]; + std::vector ids; + std::vector vertices; + vertices.resize(4); + + vertices[0] = face->getVertex(0); + vertices[1] = face->getVertex(1); + vertices[2] = face->getVertex(2); + vertices[3] = face->getVertex(3); + + + ids.push_back(topo_faces[iFace]->getVertex(0)->getNode()); + ids.push_back(topo_faces[iFace]->getVertex(1)->getNode()); + ids.push_back(topo_faces[iFace]->getVertex(2)->getNode()); + ids.push_back(topo_faces[iFace]->getVertex(3)->getNode()); + + + gmds::Face f = mesh.newQuad(ids[0],ids[1],ids[2],ids[3]); + + if(topo_faces[iFace]->getNbEdges()!= 4 ){ + throw TkUtil::Exception(TkUtil::UTF8String ("La face "+topo_faces[iFace]->getName()+" n'est pas conforme.", TkUtil::Charset::UTF_8)); + } + + int iedge0 = topoE_2_gmdsE[face->getEdge(vertices[0],vertices[1])->getCoEdge(0)->getName()]; + int iedge1 = topoE_2_gmdsE[face->getEdge(vertices[1],vertices[2])->getCoEdge(0)->getName()]; + int iedge2 = topoE_2_gmdsE[face->getEdge(vertices[2],vertices[3])->getCoEdge(0)->getName()]; + int iedge3 = topoE_2_gmdsE[face->getEdge(vertices[3],vertices[0])->getCoEdge(0)->getName()]; + + f.add(iedge0); + f.add(iedge1); + f.add(iedge2); + f.add(iedge3); + + gmds::Edge e0 = mesh.get(iedge0); + e0.add(iFace); + gmds::Edge e1 = mesh.get(iedge1); + e1.add(iFace); + gmds::Edge e2 = mesh.get(iedge2); + e2.add(iFace); + gmds::Edge e3 = mesh.get(iedge3); + e3.add(iFace); + + topoF_2_gmdsF[topo_faces[iFace]->getName()] = iFace; + + } + + gmds::Variable* discrI = mesh.newVariable("discrI"); + gmds::Variable* discrJ = mesh.newVariable("discrJ"); + + for(int iFace = 0; iFace < topo_faces.size(); iFace++){ + + gmds::Variable* internalNodes = mesh.newVariable("block"+std::to_string(iFace)); + + + uint b_discrI,b_discrJ; + topo_faces[iFace]->getNbMeshingEdges(b_discrJ,b_discrI); + discrI->set(iFace, b_discrI+1); + discrJ->set(iFace, b_discrJ+1); + + std::vector b_nodes = topo_faces[iFace]->nodes(); + for(int iNode = 0; iNode < b_nodes.size(); iNode++){ + //std::cout<(b_nodes[iNode])<set(b_nodes[iNode], iNode+1); + } + } + + std::vector groups1D; + getStdContext()->getGroupManager().getGroups(groups1D, Internal::SelectionManager::DIM::D1); + + std::vector groupsname; + for(auto g : groups1D){ + std::string name = g->getName(); + if(name.find("_cgns") != std::string::npos){ + groupsname.push_back(g->getName()); + std::string varName = name.substr(0, name.length()-5); + mesh.newVariable(varName); + } + } + + for(auto e : topo_edges){ + std::vector f_groupsName; + e->getGroupsName(f_groupsName); + std::vector f_nodes = e->nodes(); + for(const auto& name : groupsname){ + if(std::find(f_groupsName.begin(),f_groupsName.end(), name) != f_groupsName.end()){ + std::string varName = name.substr(0, name.length()-5); + gmds::Variable* var = mesh.getVariable(varName); + var->set(topoE_2_gmdsE[e->getName()], 1); } } } + std::vector groups2D; + getStdContext()->getGroupManager().getGroups(groups2D, Internal::SelectionManager::DIM::D2); + + groupsname.clear(); + for(auto g : groups2D){ + std::string name = g->getName(); + if(name.find("_cgns") != std::string::npos){ + groupsname.push_back(g->getName()); + std::string varName = name.substr(0, name.length()-5); + mesh.newVariable(varName); + } + } + + for(int iFace = 0; iFace < topo_faces.size(); iFace++) { + std::vector b_groupsName; + topo_faces[iFace]->getGroupsName(b_groupsName); + for(const auto& name : groupsname) { + if (std::find(b_groupsName.begin(), b_groupsName.end(), name) != b_groupsName.end()) { + std::string varName = name.substr(0, name.length()-5); + gmds::Variable* var = mesh.getVariable(varName); + var->set(iFace, 1); + } + } + } + + int position = m_filename.find_last_of('/'); m_basename = m_filename.substr(position+1, m_filename.length()-position+1); m_path = m_filename.substr(0, position+1); - gmds::aero::CGNSWriter3D writer3D(&mesh); - writer3D.write("",m_basename,m_path); + gmds::aero::CGNSWriterND writer(&mesh, m_dim); + writer.write("",m_basename,m_path); } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Mesh/MeshManager.cpp b/src/Core/Mesh/MeshManager.cpp index d0cf9008..e920ce2b 100644 --- a/src/Core/Mesh/MeshManager.cpp +++ b/src/Core/Mesh/MeshManager.cpp @@ -610,14 +610,14 @@ CommandMeshExplorer* MeshManager::endExplorer(CommandMeshExplorer* oldExplo, boo return command; } /*----------------------------------------------------------------------------*/ - Internal::M3DCommandResult* MeshManager::exportBlocksForCGNS(const std::string& n) + Internal::M3DCommandResult* MeshManager::exportBlocksForCGNS(int dim, const std::string& n) { #ifdef _DEBUG2 std::cout<<"exportBlocks"< 0 out, err = capfd.readouterr() - assert len(err) == 0 \ No newline at end of file + assert len(err) == 0 + + + +def test_export_quad_2d(capfd): + ctx = Mgx3D.getStdContext() + ctx.clearSession() # Clean the session after the previous test + + cgnsfilename = "quadOGrid.cgns" + ctx.getGeomManager().newVertex (Mgx3D.Point(0, 0, 0)) + ctx.getGeomManager().newVertex (Mgx3D.Point(1, 0, 0)) + ctx.getGeomManager().newVertex (Mgx3D.Point(1, 1, 0)) + ctx.getGeomManager().newVertex (Mgx3D.Point(0, 1, 0)) + ctx.getGeomManager().newSegment("Pt0000", "Pt0001") + ctx.getGeomManager().newSegment("Pt0001", "Pt0002") + ctx.getGeomManager().newSegment("Pt0002", "Pt0003") + ctx.getGeomManager().newSegment("Pt0003", "Pt0000") + ctx.getGeomManager ( ).newPlanarSurface (["Crb0000","Crb0001","Crb0002","Crb0003"], "") + ctx.getGeomManager().addToGroup (["Surf0000"], 2, "face_cgns") + ctx.getGeomManager().addToGroup (["Crb0002"], 1, "haut_cgns") + ctx.getGeomManager().addToGroup (["Crb0000"], 1, "bad_cgns") + ctx.getGeomManager().addToGroup (["Crb0003"], 1, "gauche_cgns") + ctx.getGeomManager().addToGroup (["Crb0001"], 1, "droite_cgns") + ctx.getTopoManager().newStructuredTopoOnGeometry ("Surf0000") + emp = Mgx3D.EdgeMeshingPropertyUniform(5) + ctx.getTopoManager().setMeshingProperty (emp, ["Ar0001","Ar0003"]) + ctx.getTopoManager ( ).splitFacesWithOgrid (["Fa0000"], ["Ar0002","Ar0003"], .1, 10) + ctx.getTopoManager ( ).setGeomAssociation (["Ar0009"], "Crb0002", True) + ctx.getTopoManager ( ).setGeomAssociation (["Ar0010"], "Crb0003", True) + ctx.getTopoManager().addToGroup (["Ar0005", "Ar0008", "Ar0007"], 1, "milieu_cgns") + ctx.getMeshManager().newAllFacesMesh() + ctx.getMeshManager().exportBlocksForCGNS(2,cgnsfilename) + + assert os.path.exists(cgnsfilename) + assert os.path.getsize(cgnsfilename) > 0 + out, err = capfd.readouterr() + assert len(err) == 0