mirror of
git://projects.qi-hardware.com/cae-tools.git
synced 2024-12-22 23:51:08 +02:00
slicer/: new option -z to add intermediate layers
This commit is contained in:
parent
9fc0962edc
commit
b2d6ef5f3c
@ -152,6 +152,63 @@ void slice(struct v f[3])
|
||||
}
|
||||
|
||||
|
||||
/* ----- Insert intermediate layers ---------------------------------------- */
|
||||
|
||||
|
||||
struct ctx {
|
||||
float z_step;
|
||||
bool first;
|
||||
float z0; /* only defined if !first */
|
||||
bool more; /* returned due to having made changes */
|
||||
};
|
||||
|
||||
|
||||
static gboolean check_z(gpointer key, gpointer value, gpointer data)
|
||||
{
|
||||
const struct z *z = value;
|
||||
struct ctx *ctx = data;
|
||||
float d;
|
||||
int n, i;
|
||||
|
||||
if (!z->present)
|
||||
return 0;
|
||||
|
||||
if (ctx->first) {
|
||||
ctx->first = 0;
|
||||
ctx->z0 = z->z;
|
||||
return 0;
|
||||
}
|
||||
|
||||
d = z->z - ctx->z0;
|
||||
if (d <= ctx->z_step) {
|
||||
ctx->z0 = z->z;
|
||||
return 0;
|
||||
}
|
||||
|
||||
n = (d / ctx->z_step) + 1;
|
||||
for (i = 1; i < n; i++)
|
||||
mark_z(ctx->z0 + d / n * i);
|
||||
|
||||
ctx->more = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void slice_intermediate(float z_step)
|
||||
{
|
||||
struct ctx ctx = {
|
||||
.z_step = z_step,
|
||||
};
|
||||
|
||||
do {
|
||||
ctx.first = 1;
|
||||
ctx.more = 0;
|
||||
g_tree_foreach(tree, check_z, &ctx);
|
||||
}
|
||||
while (ctx.more);
|
||||
}
|
||||
|
||||
|
||||
/* ----- Dumping ----------------------------------------------------------- */
|
||||
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
|
||||
void slice(struct v f[3]);
|
||||
void slice_intermediate(float z_step);
|
||||
void slice_dump(float box);
|
||||
void slice_init(void);
|
||||
|
||||
|
@ -21,7 +21,13 @@
|
||||
|
||||
static void usage(const char *name)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [-b distance] [file.stl]\n", name);
|
||||
fprintf(stderr,
|
||||
"usage: %s [-b distance] [-z distance] [file.stl]\n"
|
||||
" -b distance draw a box at the specified distance around the object\n"
|
||||
" (default: do not draw a box)\n"
|
||||
" -z distance duplicate layers if distance to next lower is larger than\n"
|
||||
" specified (default: do not insert intermediate layers\n"
|
||||
, name);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@ -29,17 +35,23 @@ static void usage(const char *name)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
float box = 0;
|
||||
float z_step = 0;
|
||||
int c;
|
||||
|
||||
slice_init();
|
||||
|
||||
while ((c = getopt(argc, argv, "b:")) != EOF)
|
||||
while ((c = getopt(argc, argv, "b:z:")) != EOF)
|
||||
switch (c) {
|
||||
case 'b':
|
||||
box = atof(optarg);
|
||||
if (!box)
|
||||
usage(*argv);
|
||||
break;
|
||||
case 'z':
|
||||
z_step = atof(optarg);
|
||||
if (!z_step)
|
||||
usage(*argv);
|
||||
break;
|
||||
default:
|
||||
usage(*argv);
|
||||
}
|
||||
@ -55,6 +67,8 @@ int main(int argc, char **argv)
|
||||
usage(*argv);
|
||||
}
|
||||
|
||||
if (z_step)
|
||||
slice_intermediate(z_step);
|
||||
slice_dump(box);
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user