int main(int argc, char **argv) { carve::mesh::MeshSet<3> *a, *b; a = readPLYasMesh(argv[1]); b = readPLYasMesh(argv[2]); DetailClip detail_clip_collector(a, b); carve::mesh::MeshSet<3> *c = carve::csg::CSG().compute(a, b, detail_clip_collector, NULL, carve::csg::CSG::CLASSIFY_EDGE); writePLY(std::cout, c, false); return 0; }
int main(int argc, char **argv) { options.parse(argc, argv); carve::mesh::MeshSet<3> *poly; if (options.axis == Options::ERR) { std::cerr << "need to specify a closure plane." << std::endl; exit(1); } if (options.file == "-") { poly = readPLYasMesh(std::cin); } else if (endswith(options.file, ".ply")) { poly = readPLYasMesh(options.file); } else if (endswith(options.file, ".vtk")) { poly = readVTKasMesh(options.file); } else if (endswith(options.file, ".obj")) { poly = readOBJasMesh(options.file); } if (poly == NULL) { std::cerr << "failed to load polyhedron" << std::endl; exit(1); } std::cerr << "poly aabb = " << poly->getAABB() << std::endl; if (poly->getAABB().compareAxis(carve::geom::axis_pos(options.axis, options.pos)) == 0) { std::cerr << "poly aabb intersects closure plane." << std::endl; exit(1); } for (size_t i = 0; i < poly->meshes.size(); ++i) { carve::mesh::MeshSet<3>::mesh_t *mesh = poly->meshes[i]; const size_t N = mesh->open_edges.size(); if (N == 0) continue; mesh->faces.reserve(N + 1); carve::mesh::MeshSet<3>::edge_t *start = mesh->open_edges[0]; std::vector<carve::mesh::MeshSet<3>::edge_t *> edges_to_close; edges_to_close.resize(N); carve::mesh::MeshSet<3>::edge_t *edge = start; size_t j = 0; do { edges_to_close[j++] = edge; edge = edge->perimNext(); } while (edge != start); CARVE_ASSERT(j == N); std::vector<carve::mesh::MeshSet<3>::vertex_t> projected; projected.resize(N); for (j = 0; j < N; ++j) { edge = edges_to_close[j]; projected[j].v = edge->vert->v; projected[j].v.v[options.axis] = options.pos; } for (j = 0; j < N; ++j) { edge = edges_to_close[j]; carve::mesh::MeshSet<3>::face_t *quad = new carve::mesh::MeshSet<3>::face_t(edge->v2(), edge->v1(), &projected[j], &projected[(j+1)%N]); quad->mesh = mesh; edge->rev = quad->edge; quad->edge->rev = edge; mesh->faces.push_back(quad); } for (j = 0; j < N; ++j) { carve::mesh::MeshSet<3>::edge_t *e1 = edges_to_close[j]->rev->prev; carve::mesh::MeshSet<3>::edge_t *e2 = edges_to_close[(j+1)%N]->rev->next; e1->rev = e2; e2->rev = e1; } for (j = 0; j < N; ++j) { edge = edges_to_close[j]->rev; edge->validateLoop(); } carve::mesh::MeshSet<3>::face_t *loop = carve::mesh::MeshSet<3>::face_t::closeLoop(edges_to_close[0]->rev->next->next); loop->mesh = mesh; mesh->faces.push_back(loop); poly->collectVertices(); } if (options.obj) { writeOBJ(std::cout, poly); } else if (options.vtk) { writeVTK(std::cout, poly); } else { writePLY(std::cout, poly, options.ascii); } return 0; }