// // Created by Charles Du on 1/15/22. // #include #include #include #include #include "material_interface.h" #include "implicit_functions.h" using namespace simplicial_arrangement; int main(int argc, const char* argv[]) { struct { std::string config_file; bool timing_only = false; bool robust_test = false; } args; CLI::App app{"Material Interface Command Line"}; app.add_option("config_file", args.config_file, "Configuration file")->required(); app.add_flag("-T,--timing-only", args.timing_only, "Record timing without saving results"); app.add_flag("-R,--robust-test",args.robust_test, "Perform robustness test"); CLI11_PARSE(app, argc, argv); // parse configure file Config config = parse_config_file(args.config_file); if (config.use_lookup) { // load lookup table std::cout << "load table ..." << std::endl; bool loaded = load_lookup_table(simplicial_arrangement::MATERIAL_INTERFACE); if (loaded) { std::cout << "loading finished." << std::endl; } else { std::cout << "loading failed." << std::endl; return -1; } } else { disable_lookup_table(); config.use_secondary_lookup = false; } // load tet mesh std::vector> pts; std::vector> tets; if (config.tet_mesh_file != "") { std::cout << "load mesh file " << config.tet_mesh_file << std::endl; load_tet_mesh(config.tet_mesh_file, pts, tets); } else { std::cout << "generating mesh with resolution " << config.tet_mesh_resolution << std::endl; generate_tet_mesh(config.tet_mesh_resolution, config.tet_mesh_bbox_min, config.tet_mesh_bbox_max, pts, tets); } // load implicit functions and compute function values at vertices Eigen::Matrix funcVals; if (load_functions(config.func_file, pts, funcVals)) { std::cout << "function loading finished." << std::endl; } else { std::cout << "function loading failed." << std::endl; return -2; } // compute implicit arrangement std::vector> MI_pts; std::vector MI_faces; std::vector> patches; std::vector> patch_function_label; std::vector MI_edges; std::vector> chains; std::vector> non_manifold_edges_of_vert; std::vector> shells; std::vector> material_cells; std::vector cell_function_label; // record timings std::vector timing_labels; std::vector timings; // record stats std::vector stats_labels; std::vector stats; if (!material_interface( args.robust_test, config.use_lookup, config.use_secondary_lookup, config.use_topo_ray_shooting, // pts, tets, funcVals, // MI_pts,MI_faces,patches, patch_function_label, MI_edges,chains, non_manifold_edges_of_vert, shells,material_cells,cell_function_label, timing_labels,timings, stats_labels,stats)) { return -1; } if (args.robust_test) return 0; // test: export MI_mesh, patches, chains if (!args.timing_only && material_cells.size() > 0) { save_result_MI(config.output_dir + "/mesh.json", MI_pts, MI_faces, patches, patch_function_label, MI_edges, chains, non_manifold_edges_of_vert, shells, material_cells, cell_function_label); // if (material_cells.front().front() != Mesh_None){ save_result_msh(config.output_dir + "/mesh", MI_pts, MI_faces, patches, MI_edges, chains, non_manifold_edges_of_vert, shells, material_cells); } } // save timing records save_timings(config.output_dir + "/timings.json", timing_labels, timings); // save statistics save_statistics(config.output_dir + "/stats.json", stats_labels, stats); return 0; }