/** \file * Generate an OpenSCAD with connectors for each face. * */ #include #include #include #include #include #include #include #include #include "v3.h" #include "stl_3d.h" int main(void) { stl_3d_t * const stl = stl_3d_parse(STDIN_FILENO); if (!stl) return EXIT_FAILURE; const double thickness = 8; // for each vertex, find the coplanar triangles // \todo: do coplanar bits for(int i = 0 ; i < stl->num_vertex ; i++) { const stl_vertex_t * const v = &stl->vertex[i]; const v3_t origin = v->p; printf("// vertex %d\n" "translate([%f,%f,%f]) {\n" "sphere(r=20);\n", i, origin.p[0], origin.p[1], origin.p[2]); for (int j = 0 ; j < v->num_face; j++) { const stl_face_t * const f = v->face[j]; v3_t v0 = v3_sub(f->vertex[0]->p, origin); v3_t v1 = v3_sub(f->vertex[1]->p, origin); v3_t v2 = v3_sub(f->vertex[2]->p, origin); v3_t n; if (v->face_num[j] == 0) n = v3_cross(v1, v2); else if (v->face_num[j] == 1) n = v3_cross(v2, v0); else if (v->face_num[j] == 2) n = v3_cross(v0, v1); n = v3_scale(n, thickness/v3_mag(n)/2); v0 = v3_add(v0, n); v1 = v3_add(v1, n); v2 = v3_add(v2, n); v3_t v3 = v3_sub(v0, n); v3_t v4 = v3_sub(v1, n); v3_t v5 = v3_sub(v2, n); printf("polyhedron(\n" "points=[\n" "[%f,%f,%f],[%f,%f,%f],[%f,%f,%f],\n" "[%f,%f,%f],[%f,%f,%f],[%f,%f,%f],\n" "], faces = [" " [0,2,1], [3,4,5]," " [0,3,2], [2,3,5]," " [0,4,3], [0,1,4]," " [1,5,4], [1,2,5]," "]);\n", v0.p[0], v0.p[1], v0.p[2], v1.p[0], v1.p[1], v1.p[2], v2.p[0], v2.p[1], v2.p[2], v3.p[0], v3.p[1], v3.p[2], v4.p[0], v4.p[1], v4.p[2], v5.p[0], v5.p[1], v5.p[2] ); /* fprintf(stderr, "\t%d: %d:%f,%d:%f,%d:%f\n", f - stl->face, f->face[0] ? f->face[0] - stl->face : -1, f->angle[0], f->face[1] ? f->face[1] - stl->face : -1, f->angle[1], f->face[2] ? f->face[2] - stl->face : -1, f->angle[2] ); */ break; // only do one right now } printf("}\n"); break; // only do one right now } return 0; }