rework corners program to import the STL and drill holes into it

This commit is contained in:
Trammell Hudson 2015-05-03 13:59:18 -04:00
parent 59fcdf949c
commit 58de31c6cb

121
corners.c
View File

@ -1,6 +1,8 @@
/** \file /** \file
* Generate an OpenSCAD with connectors for each face. * Generate an OpenSCAD with connectors for each face.
* *
* This imports the original STL file and then slices the corners
* off from it.
* Options are inside only (with face flush on outside) * Options are inside only (with face flush on outside)
* or with a slot for the face (like a corner cap) * or with a slot for the face (like a corner cap)
*/ */
@ -9,6 +11,9 @@
#include <stdint.h> #include <stdint.h>
#include <stdarg.h> #include <stdarg.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h> #include <math.h>
#include <err.h> #include <err.h>
#include <assert.h> #include <assert.h>
@ -89,7 +94,7 @@ make_faces(
// use the transpose of the rotation matrix, // use the transpose of the rotation matrix,
// which will rotate from (x,y) to the correct // which will rotate from (x,y) to the correct
// orientation relative to this connector node. // orientation relative to this connector node.
print_multmatrix(&ref, 0); print_multmatrix(&ref, 1);
printf("{\n"); printf("{\n");
// generate the polygon plane // generate the polygon plane
@ -141,24 +146,121 @@ make_faces(
int int
main(void) main(
int argc,
char ** argv
)
{ {
stl_3d_t * const stl = stl_3d_parse(STDIN_FILENO); if (argc <= 1)
{
fprintf(stderr, "Usage: corners file.stl > file-corners.scad\n");
return -1;
}
const char * const stl_name = argv[1];
int fd = open(stl_name, O_RDONLY);
if (fd < 0)
{
perror(stl_name);
return -1;
}
stl_3d_t * const stl = stl_3d_parse(fd);
if (!stl) if (!stl)
return EXIT_FAILURE; return EXIT_FAILURE;
close(fd);
printf("module model() {\n"
"render() difference() {\n"
"import(\"%s\");\n",
stl_name
);
//printf("%%model();\n");
const double thickness = 3; const double thickness = 3;
const double inset_dist = 2; const double inset_dist = 5;
const double hole_dist = 5; const double hole_dist = 5;
const double hole_rad = 3/2; const double hole_rad = 1.25;
// for each vertex, find the coplanar triangles // for face, generate the set of coplanar points that go with it
// \todo: do coplanar bits int * const face_used
= calloc(sizeof(*face_used), stl->num_face);
const stl_vertex_t ** const vertex_list
= calloc(sizeof(*vertex_list), stl->num_vertex);
for (int i = 0 ; i < stl->num_face ; i++)
{
if (face_used[i])
continue;
const stl_face_t * const f = &stl->face[i];
const int vertex_count = stl_trace_face(
stl,
f,
vertex_list,
face_used,
0
);
refframe_t ref;
refframe_init(
&ref,
f->vertex[0]->p,
f->vertex[1]->p,
f->vertex[2]->p
);
// replace the origin with the actual origin
//ref.origin.p[0] = 0;
//ref.origin.p[1] = 0;
//ref.origin.p[2] = 0;
printf("translate([%f,%f,%f])",
f->vertex[0]->p.p[0],
f->vertex[0]->p.p[1],
f->vertex[0]->p.p[2]
);
print_multmatrix(&ref, 0);
printf("{\n");
// generate a bolt hole for each non-copolanar corner
for (int j = 0 ; j < vertex_count ; j++)
{
double x, y;
refframe_inset(
&ref,
inset_dist,
&x,
&y,
vertex_list[(j+0) % vertex_count]->p,
vertex_list[(j+1) % vertex_count]->p,
vertex_list[(j+2) % vertex_count]->p
);
printf("translate([%f,%f,0]) cylinder(r=%f, h=%f, center=true);\n",
x,
y,
hole_rad,
10.0
);
}
printf("}\n");
}
printf("}\n}\n");
printf("model();\n");
#if 0
for(int i = 0 ; i < stl->num_vertex ; i++) for(int i = 0 ; i < stl->num_vertex ; i++)
{ {
const stl_vertex_t * const v = &stl->vertex[i]; const stl_vertex_t * const v = &stl->vertex[i];
const v3_t origin = v->p; const v3_t origin = v->p;
// generate screw holes for each face connecting to this corner
printf("//translate([%f,%f,%f])\n" printf("//translate([%f,%f,%f])\n"
"module vertex_%d() {\n" "module vertex_%d() {\n"
"render() difference()\n" "render() difference()\n"
@ -192,7 +294,7 @@ main(void)
refframe_t avg; refframe_t avg;
refframe_init(&avg, avg_x, avg_y, avg_z); refframe_init(&avg, avg_x, avg_y, avg_z);
printf("translate([0,0,12]) render() intersection() {\n"); printf("translate([%d,0,12]) render() intersection() {\n", i*30);
printf("rotate([0,-90,0])"); printf("rotate([0,-90,0])");
print_multmatrix(&avg, 1); print_multmatrix(&avg, 1);
printf("vertex_%d();\n", i); printf("vertex_%d();\n", i);
@ -200,10 +302,11 @@ main(void)
printf("}\n"); printf("}\n");
break; //break;
//if (i == 0) break; // only do one right now //if (i == 0) break; // only do one right now
} }
//printf("translate([0,0,20]) sphere(r=2);\n"); //printf("translate([0,0,20]) sphere(r=2);\n");
#endif
return 0; return 0;
} }