diff --git a/blocking/CMakeLists.txt b/blocking/CMakeLists.txt index 46e3d5973..02658fdeb 100644 --- a/blocking/CMakeLists.txt +++ b/blocking/CMakeLists.txt @@ -106,3 +106,10 @@ if(WITH_TEST) add_subdirectory(tst) endif(WITH_TEST) #============================================================================== + +#============================================================================== +# EXECUTABLES +#============================================================================== +add_executable(blocking src/blocking_exe.cpp) +target_link_libraries(blocking PRIVATE ${GMDS_LIB}) +target_compile_features(blocking PUBLIC cxx_std_14) \ No newline at end of file diff --git a/blocking/src/CurvedBlockingClassifier.cpp b/blocking/src/CurvedBlockingClassifier.cpp index 1aea0ef30..3ead0807f 100644 --- a/blocking/src/CurvedBlockingClassifier.cpp +++ b/blocking/src/CurvedBlockingClassifier.cpp @@ -188,8 +188,8 @@ CurvedBlockingClassifier::classify_edges(gmds::blocking::ClassificationErrors &A } else if ((geo_d0==0 && geo_d1==1) || (geo_d0==1 && geo_d1==0)){ //we check if the point is adjacent to the curve - auto p_id = (geo_d0geo_d1)?geo_d0:geo_d1; + auto p_id = (geo_d0geo_d1)?geo_i0:geo_i1; cad::GeomPoint* p = m_geom_model->getPoint(p_id); cad::GeomCurve* c = m_geom_model->getCurve(c_id); std::vector c_points = c->points(); diff --git a/blocking/src/blocking_exe.cpp b/blocking/src/blocking_exe.cpp new file mode 100644 index 000000000..6fa1b2cf3 --- /dev/null +++ b/blocking/src/blocking_exe.cpp @@ -0,0 +1,139 @@ +/*----------------------------------------------------------------------------*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fstream" +/*----------------------------------------------------------------------------*/ +using namespace gmds; +/*----------------------------------------------------------------------------*/ +void set_up_geom_model(gmds::cad::FACManager* AGeomModel, const std::string AFileName) +{ + gmds::Mesh vol_mesh(gmds::MeshModel(gmds::DIM3 | gmds::R | gmds::F | gmds::E | gmds::N | gmds::R2N | gmds::R2F | gmds::R2E | gmds::F2N | gmds::F2R | gmds::F2E + | gmds::E2F | gmds::E2N | gmds::N2E)); + //std::string dir(TEST_SAMPLES_DIR); + //std::string vtk_file = dir +"/"+ AFileName; + std::string vtk_file = AFileName; + gmds::IGMeshIOService ioService(&vol_mesh); + gmds::VTKReader vtkReader(&ioService); + vtkReader.setCellOptions(gmds::N | gmds::R); + vtkReader.read(vtk_file); + gmds::MeshDoctor doc(&vol_mesh); + doc.buildFacesAndR2F(); + doc.buildEdgesAndX2E(); + doc.updateUpwardConnectivity(); + AGeomModel->initFrom3DMesh(&vol_mesh); + +} + +int main(int argc, char* argv[]) +{ + std::cout << "============== CLASSIFICATION SHAPES ================" << std::endl; + + /* + * The folder with the shapes to test needs to be defined like that : + * DataFolder/ + * || + * \/ + * -folderShape1 / folderShape1.vtk (the geometry file) folderShape1_blocking.vtk (the blocking file) + * -folderShape2 / folderShape2.vtk (the geometry file) folderShape2_blocking.vtk (the blocking file) + * .... + * -folderShapeX / folderShapeX.vtk (the geometry file) folderShapeX_blocking.vtk (the blocking file) + * + * The file on entry is just a list of the folder's name: + * folderShape1 + * folderShape2 + * ... + * folderShapeX + */ + if (argc != 2) { + std::cout << "Require one paramater : \n"; + std::cout << " - [IN ] the file with the name of the folder to go, \n"; + throw gmds::GMDSException("Wrong number of parameters"); + } + auto file = std::string(argv[1]); + //We browse the file until the end + std::ifstream m_stream(file); + std::string line; + while(std::getline(m_stream,line)){ + std::cout << "============== CLASSIFICATION ================" << std::endl; + std::cout << "============== "< Start mesh reading"< +/*----------------------------------------------------------------------------*/ +#include +#include +#include +#include +#include +#include +#include +/*----------------------------------------------------------------------------*/ +/**@brief setup function that initialize a geometric model using the faceted + * representation and an input vtk file name. The vtk file must contain a + * tetrahedral mesh + * + * @param AGeomModel geometric model we initialize + * @param AFileName vtk filename + */ +void set_up_geom_model(gmds::cad::FACManager* AGeomModel, const std::string AFileName) +{ + gmds::Mesh vol_mesh(gmds::MeshModel(gmds::DIM3 | gmds::R | gmds::F | gmds::E | gmds::N | gmds::R2N | gmds::R2F | gmds::R2E | gmds::F2N | gmds::F2R | gmds::F2E + | gmds::E2F | gmds::E2N | gmds::N2E)); + std::string vtk_file = AFileName; + gmds::IGMeshIOService ioService(&vol_mesh); + gmds::VTKReader vtkReader(&ioService); + vtkReader.setCellOptions(gmds::N | gmds::R); + vtkReader.read(vtk_file); + gmds::MeshDoctor doc(&vol_mesh); + doc.buildFacesAndR2F(); + doc.buildEdgesAndX2E(); + doc.updateUpwardConnectivity(); + AGeomModel->initFrom3DMesh(&vol_mesh); + +} + + +TEST(ClassificationTestSuite, test_chord_collapse) +{ + gmds::cad::FACManager geom_model; + set_up_geom_model(&geom_model,"tet_in_box.vtk"); + gmds::blocking::CurvedBlocking bl(&geom_model, false); + + gmds::Mesh m(gmds::MeshModel(gmds::DIM3|gmds::N|gmds::R|gmds::R2N)); + + gmds::GridBuilder gb(&m,3); + gb.execute(4,1.0, 4, 1.0, 4, 1.0); + bl.init_from_mesh(m); + + + std::vector bl_faces = bl.get_all_faces(); + + ASSERT_EQ(bl.get_nb_cells<3>(),27); + + bool found_face = false; + auto face_id = -1; + gmds::math::Point seed(1.5,1.5,0.0); + for(auto i=0; i f_nodes = bl.get_nodes_of_face(bl_faces[face_id]); + bl.collapse_chord(bl_faces[face_id],f_nodes[0],f_nodes[2]); + + ASSERT_EQ(bl.get_nb_cells<3>(),24); + + gmds::Mesh m_out(gmds::MeshModel(gmds::DIM3 | gmds::N | gmds::E | gmds::F | gmds::R | gmds::E2N | gmds::F2N | gmds::R2N)); + bl.convert_to_mesh(m_out); + + gmds::IGMeshIOService ioService(&m_out); + gmds::VTKWriter writer(&ioService); + writer.setCellOptions(gmds::N | gmds::F); + writer.setDataOptions(gmds::N |gmds::F ); + writer.write("collapse.vtk"); +} \ No newline at end of file diff --git a/blocking/tst/ExecutionActionsTestSuite.h b/blocking/tst/ExecutionActionsTestSuite.h index 9c1baae4f..71cc0275f 100644 --- a/blocking/tst/ExecutionActionsTestSuite.h +++ b/blocking/tst/ExecutionActionsTestSuite.h @@ -21,7 +21,8 @@ void set_up_file(gmds::cad::FACManager* AGeomModel, const std::string AFileName) gmds::Mesh vol_mesh(gmds::MeshModel(gmds::DIM3 | gmds::R | gmds::F | gmds::E | gmds::N | gmds::R2N | gmds::R2F | gmds::R2E | gmds::F2N | gmds::F2R | gmds::F2E | gmds::E2F | gmds::E2N | gmds::N2E)); std::string dir(TEST_SAMPLES_DIR); - std::string vtk_file = dir +"/"+ AFileName; + //std::string vtk_file = dir +"/"+ AFileName; + std::string vtk_file = AFileName; gmds::IGMeshIOService ioService(&vol_mesh); gmds::VTKReader vtkReader(&ioService); vtkReader.setCellOptions(gmds::N | gmds::R); @@ -110,11 +111,11 @@ TEST(ExecutionActionsTestSuite,cube){ gmds::VTKWriter vtk_writer(&ios); vtk_writer.setCellOptions(gmds::N|gmds::R); vtk_writer.setDataOptions(gmds::N|gmds::R); - vtk_writer.write("debug_blocking.vtk"); + vtk_writer.write("cube_blocking.vtk"); gmds::VTKWriter vtk_writer_edges(&ios); vtk_writer_edges.setCellOptions(gmds::N|gmds::E); vtk_writer_edges.setDataOptions(gmds::N|gmds::E); - vtk_writer_edges.write("debug_blocking_edges.vtk"); + vtk_writer_edges.write("cube_blocking_edges.vtk"); } TEST(ExecutionActionsTestSuite,cb1){ @@ -231,11 +232,11 @@ TEST(ExecutionActionsTestSuite,cb1){ gmds::VTKWriter vtk_writer(&ios); vtk_writer.setCellOptions(gmds::N|gmds::R); vtk_writer.setDataOptions(gmds::N|gmds::R); - vtk_writer.write("debug_blocking.vtk"); + vtk_writer.write("cb1_blocking.vtk"); gmds::VTKWriter vtk_writer_edges(&ios); vtk_writer_edges.setCellOptions(gmds::N|gmds::E); vtk_writer_edges.setDataOptions(gmds::N|gmds::E); - vtk_writer_edges.write("debug_blocking_edges.vtk"); + vtk_writer_edges.write("cb1_blocking_edges.vtk"); } @@ -363,15 +364,15 @@ TEST(ExecutionActionsTestSuite,cb2){ gmds::VTKWriter vtk_writer(&ios); vtk_writer.setCellOptions(gmds::N|gmds::R); vtk_writer.setDataOptions(gmds::N|gmds::R); - vtk_writer.write("debug_blocking.vtk"); + vtk_writer.write("cb2_blocking.vtk"); gmds::VTKWriter vtk_writer_edges(&ios); vtk_writer_edges.setCellOptions(gmds::N|gmds::E); vtk_writer_edges.setDataOptions(gmds::N|gmds::E); - vtk_writer_edges.write("debug_blocking_edges.vtk"); + vtk_writer_edges.write("cb2_blocking_edges.vtk"); gmds::VTKWriter vtk_writer_faces(&ios); vtk_writer_faces.setCellOptions(gmds::N|gmds::F); vtk_writer_faces.setDataOptions(gmds::N|gmds::F); - vtk_writer_faces.write("debug_blocking_faces.vtk"); + vtk_writer_faces.write("cb2_blocking_faces.vtk"); } @@ -489,11 +490,11 @@ TEST(ExecutionActionsTestSuite,cb3){ gmds::VTKWriter vtk_writer(&ios); vtk_writer.setCellOptions(gmds::N|gmds::R); vtk_writer.setDataOptions(gmds::N|gmds::R); - vtk_writer.write("debug_blocking.vtk"); + vtk_writer.write("cb3_blocking.vtk"); gmds::VTKWriter vtk_writer_edges(&ios); vtk_writer_edges.setCellOptions(gmds::N|gmds::E); vtk_writer_edges.setDataOptions(gmds::N|gmds::E); - vtk_writer_edges.write("debug_blocking_edges.vtk"); + vtk_writer_edges.write("cb3_blocking_edges.vtk"); } @@ -618,11 +619,11 @@ TEST(ExecutionActionsTestSuite,cb4){ gmds::VTKWriter vtk_writer(&ios); vtk_writer.setCellOptions(gmds::N|gmds::R); vtk_writer.setDataOptions(gmds::N|gmds::R); - vtk_writer.write("debug_blocking.vtk"); + vtk_writer.write("cb4_blocking.vtk"); gmds::VTKWriter vtk_writer_edges(&ios); vtk_writer_edges.setCellOptions(gmds::N|gmds::E); vtk_writer_edges.setDataOptions(gmds::N|gmds::E); - vtk_writer_edges.write("debug_blocking_edges.vtk"); + vtk_writer_edges.write("cb4_blocking_edges.vtk"); } TEST(ExecutionActionsTestSuite,cb5){ @@ -690,10 +691,85 @@ TEST(ExecutionActionsTestSuite,cb5){ gmds::VTKWriter vtk_writer(&ios); vtk_writer.setCellOptions(gmds::N|gmds::R); vtk_writer.setDataOptions(gmds::N|gmds::R); - vtk_writer.write("debug_blocking.vtk"); + vtk_writer.write("cb5_blocking.vtk"); gmds::VTKWriter vtk_writer_edges(&ios); vtk_writer_edges.setCellOptions(gmds::N|gmds::E); vtk_writer_edges.setDataOptions(gmds::N|gmds::E); - vtk_writer_edges.write("debug_blocking_edges.vtk"); + vtk_writer_edges.write("cb5_blocking_edges.vtk"); } +TEST(ExecutionActionsTestSuite,B2) +{ + + + std::string line = "B11"; + std::string file_geom, file_mesh, file_out; + + //The path of the data folder + std::string path_data_folder = "/home/bourmaudp/Documents/DATA/Easy_Shapes_Class/"; + //Path of the current folder with the geometry and the blocking + std::string path_folder_shape = path_data_folder+line+"/"; + //Geometry file + file_geom = path_folder_shape+line+".vtk"; + //Blocking file + file_mesh = path_folder_shape+line+"_blocking.vtk"; + //The path to save the classification and the name of the file + file_out = path_folder_shape+line+"_blocking_class_save_TEST.vtk"; + + //================================================================== + // GEOMETRY READING + //================================================================== + gmds::cad::FACManager geom_model; + set_up_file(&geom_model, file_geom); + std::cout << "GEOM INFO : N, " << geom_model.getNbPoints() <<" , R, " << geom_model.getNbVolumes() << std::endl; + + //================================================================== + // MESH READING + //================================================================== + std::cout << "> Start mesh reading" << std::endl; + ///the used model is specified according to the class requirements. + gmds::Mesh m(gmds::MeshModel(gmds::DIM3|gmds::N|gmds::R|gmds::R2N)); + + gmds::IGMeshIOService ioService2(&m); + gmds::VTKReader vtkReader2(&ioService2); + vtkReader2.setCellOptions(gmds::N|gmds::R); + vtkReader2.read(file_mesh); + gmds::MeshDoctor doc2(&m); + doc2.updateUpwardConnectivity(); + + std::cout << "MESH Blocking INFO : N, " << m.getNbNodes() <<" ,E, "<id()<