star-cad

Geometric operators for computer-aided design
git clone git://git.meso-star.fr/star-cad.git
Log | Files | Refs | README | LICENSE

commit 1c30b6f6da8a368de8392e517879baa87ec52b44
parent 0f0da4bebf1c223b64c2f2cc9f310009a3d7db11
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 21 Apr 2023 09:45:16 +0200

Remove the reverse arg of STL-related API calls and introduce scad_geometry_reverse

Diffstat:
Msrc/scad.c | 20+++++---------------
Msrc/scad.h | 10+++++-----
Msrc/scad_geometry.c | 23+++++++++++++++++++++++
Msrc/test_api.c | 39+++++++++++++++++++++------------------
Msrc/test_export.c | 12++++++------
Msrc/test_partition.c | 8++++----
6 files changed, 64 insertions(+), 48 deletions(-)

diff --git a/src/scad.c b/src/scad.c @@ -304,10 +304,9 @@ error: res_T scad_stl_get_data (struct scad_geometry* geometry, - const int reverse, struct darray_double* triangles) { - return scad_stl_get_data_partial(geometry, NULL, 0, reverse, triangles); + return scad_stl_get_data_partial(geometry, NULL, 0, triangles); } res_T @@ -315,7 +314,6 @@ scad_stl_get_data_partial (struct scad_geometry* geometry, struct scad_geometry** dont, const size_t dont_count, - const int reverse, struct darray_double* triangles) { size_t* nodeTags = NULL; @@ -344,12 +342,7 @@ scad_stl_get_data_partial tags_initialized = 1; /* Get 2d tags */ - if(reverse) { - gmshModelMeshReverse(geometry->gmsh_dimTags, geometry->gmsh_dimTags_n, &ierr); - ERR(get_2d_tags(geometry, &tags)); - } else { - ERR(get_2d_tags(geometry, &tags)); - } + ERR(get_2d_tags(geometry, &tags)); sz = darray_int_size_get(&tags); data = darray_int_data_get(&tags); @@ -446,7 +439,6 @@ res_T scad_stl_export (struct scad_geometry* geometry, const char* prefix, - const int reverse, const int binary) { res_T res = RES_OK; @@ -471,7 +463,7 @@ scad_stl_export ERR(str_copy(&filename, &geometry->name)); } ERR(str_append(&filename, ".stl")); - ERR(scad_stl_get_data(geometry, reverse, &trg)); + ERR(scad_stl_get_data(geometry, &trg)); ERR(scad_stl_data_write(&trg, str_cget(&filename), binary)); exit: @@ -490,7 +482,6 @@ scad_stl_export_partial struct scad_geometry** dont, const size_t dont_count, const char* prefix, - const int reverse, const int binary) { res_T res = RES_OK; @@ -519,7 +510,7 @@ scad_stl_export_partial ERR(str_copy(&filename, &geometry->name)); } ERR(str_append(&filename, ".stl")); - ERR(scad_stl_get_data_partial(geometry, dont, dont_count, reverse, &trg)); + ERR(scad_stl_get_data_partial(geometry, dont, dont_count, &trg)); ERR(scad_stl_data_write(&trg, str_cget(&filename), binary)); exit: @@ -536,7 +527,6 @@ res_T scad_stl_export_split (struct scad_geometry* geometry, const char* prefix, - const int reverse, const int binary) { size_t i; @@ -556,7 +546,7 @@ scad_stl_export_split ERR(scad_geometry_explode(geometry, prefix, &parts, &count)); ASSERT(count*2 == geometry->gmsh_dimTags_n); for(i = 0; i < count; i++) { - ERR(scad_stl_export(parts[i], NULL, reverse, binary)); + ERR(scad_stl_export(parts[i], NULL, binary)); } exit: diff --git a/src/scad.h b/src/scad.h @@ -358,6 +358,11 @@ scad_geometry_rename (struct scad_geometry* geom, const char* name); /* Can be NULL */ +/* Reverse the orientation of the geomery `geome' */ +SCAD_API res_T +scad_geometry_reverse + (struct scad_geometry* geom); + /* Translate the geometry `geom' along (`dx', `dy', `dz'). */ SCAD_API res_T scad_geometry_translate @@ -412,7 +417,6 @@ SCAD_API res_T scad_stl_export (struct scad_geometry* geom, const char* prefix, /* Can be NULL if geometry was named: use geometry name */ - const int reverse, /* set `1' to reverse mesh */ const int binary); /* File format */ /* Same as previous, but geometries that are part of `exclude' is not exported */ @@ -422,7 +426,6 @@ scad_stl_export_partial struct scad_geometry** exclude, const size_t exclude_count, const char* prefix, - const int reverse, const int binary); /* Export the geometry `geom' in as many files than its count. */ @@ -430,7 +433,6 @@ SCAD_API res_T scad_stl_export_split (struct scad_geometry* geom, const char* prefix, /* Can be NULL if geometry was named: use geometry name */ - const int reverse, /* set `1' to reverse mesh */ const int binary); /* File format */ /* Get the mesh of the geometry `geom' into a darray_double, each triangle @@ -439,7 +441,6 @@ scad_stl_export_split SCAD_API res_T scad_stl_get_data (struct scad_geometry* geom, - const int reverse, /* set `1' to reverse mesh */ struct darray_double* triangles); /* Can contain some triangles already */ /* Same as previous, but geometries that are part of `exclude' is not collected */ @@ -448,7 +449,6 @@ scad_stl_get_data_partial (struct scad_geometry* geometry, struct scad_geometry** exclude, const size_t exclude_count, - const int reverse, struct darray_double* triangles); /* Can contain some triangles already */ /* Write the mesh the same way stl_export do, using data as returned by diff --git a/src/scad_geometry.c b/src/scad_geometry.c @@ -1401,6 +1401,29 @@ error: } res_T +scad_geometry_reverse + (struct scad_geometry* geom) +{ + int ierr = 0; + res_T res = RES_OK; + + if(!geom) { + res = RES_BAD_ARG; + goto error; + } + + ERR(check_device(FUNC_NAME)); + + gmshModelMeshReverse(geom->gmsh_dimTags, geom->gmsh_dimTags_n, &ierr); + ERR(gmsh_err_to_res_T(ierr)); + +exit: + return res; +error: + goto exit; +} + +res_T scad_geometry_translate (struct scad_geometry* geom, const double dxdydz[3]) diff --git a/src/test_api.c b/src/test_api.c @@ -244,9 +244,9 @@ main(int argc, char* argv[]) MEM_RM(&allocator, geom_array); darray_double_init(&allocator, &trg); - BAD(scad_stl_get_data(NULL, 0, NULL)); - BAD(scad_stl_get_data(geom2, 0, NULL)); - OK(scad_stl_get_data(geom2, 0, &trg)); + BAD(scad_stl_get_data(NULL, NULL)); + BAD(scad_stl_get_data(geom2, NULL)); + OK(scad_stl_get_data(geom2, &trg)); BAD(scad_stl_data_write(NULL, NULL, 0)); BAD(scad_stl_data_write(&trg, NULL, 0)); BAD(scad_stl_data_write(NULL, "/tmp/test", 0)); @@ -254,21 +254,24 @@ main(int argc, char* argv[]) OK(scad_stl_data_write(&trg, "/tmp/test", 1)); darray_double_release(&trg); - BAD(scad_stl_export(NULL, NULL, 0, 0)); - BAD(scad_stl_export(geom2, NULL, 0, 0)); /* geom2 has no name */ - OK(scad_stl_export(geom2, "/tmp/test", 0, 0)); - OK(scad_stl_export(geom2, "/tmp/test", 0, 1)); - OK(scad_stl_export(geom1, NULL, 0, 0)); - OK(scad_stl_export(geom1, NULL, 0, 1)); - - BAD(scad_stl_export_split(NULL, NULL, 0, 0)); - BAD(scad_stl_export_split(geom2, NULL, 0, 0)); /* geom2 has no name */ - OK(scad_stl_export_split(geom2, "/tmp/test", 0, 0)); - BAD(scad_stl_export_split(geom2, "/tmp/test", 0, 0)); /* Produce same names */ - OK(scad_stl_export_split(geom2, "/tmp/testb", 0, 1)); - OK(scad_stl_export_split(geom1, NULL, 0, 0)); - BAD(scad_stl_export_split(geom1, NULL, 0, 1)); /* Produce same names */ - OK(scad_stl_export_split(geom1, "different_names", 0, 1)); + BAD(scad_stl_export(NULL, NULL, 0)); + BAD(scad_stl_export(geom2, NULL, 0)); /* geom2 has no name */ + OK(scad_stl_export(geom2, "/tmp/test", 0)); + OK(scad_stl_export(geom2, "/tmp/test", 1)); + OK(scad_stl_export(geom1, NULL, 0)); + OK(scad_stl_export(geom1, NULL, 1)); + + BAD(scad_stl_export_split(NULL, NULL, 0)); + BAD(scad_stl_export_split(geom2, NULL, 0)); /* geom2 has no name */ + OK(scad_stl_export_split(geom2, "/tmp/test", 0)); + BAD(scad_stl_export_split(geom2, "/tmp/test", 0)); /* Produce same names */ + OK(scad_stl_export_split(geom2, "/tmp/testb", 1)); + OK(scad_stl_export_split(geom1, NULL, 0)); + BAD(scad_stl_export_split(geom1, NULL, 1)); /* Produce same names */ + OK(scad_stl_export_split(geom1, "different_names", 1)); + + BAD(scad_geometry_reverse(NULL)); + OK(scad_geometry_reverse(geom1)); BAD(scad_geometry_get_name(NULL, &name)); BAD(scad_geometry_get_name(geom1, NULL)); diff --git a/src/test_export.c b/src/test_export.c @@ -54,14 +54,14 @@ main(int argc, char* argv[]) OK(scad_scene_mesh()); - OK(scad_stl_export(rectangle, NULL, 0, 0)); - OK(scad_stl_export(rectangle, "bin_rectangle", 0, 1)); + OK(scad_stl_export(rectangle, NULL, 0)); + OK(scad_stl_export(rectangle, "bin_rectangle", 1)); - OK(scad_stl_export(cube, NULL, 0, 0)); - OK(scad_stl_export(cube, "bin_cube", 0, 1)); + OK(scad_stl_export(cube, NULL, 0)); + OK(scad_stl_export(cube, "bin_cube", 1)); - OK(scad_stl_export(cube2, NULL, 0, 0)); - OK(scad_stl_export(cube2, "bin_cube2", 0, 1)); + OK(scad_stl_export(cube2, NULL, 0)); + OK(scad_stl_export(cube2, "bin_cube2", 1)); OK(scad_finalize()); diff --git a/src/test_partition.c b/src/test_partition.c @@ -65,14 +65,14 @@ two_geoms if(allow_overlapping) { snprintf(name, sizeof(name), "part_%g_1o", x); - OK(scad_stl_export(out_geoms[0], name, 0, 0)); + OK(scad_stl_export(out_geoms[0], name, 0)); snprintf(name, sizeof(name), "part_%g_2o", x); - OK(scad_stl_export(out_geoms[1], name, 0, 1)); + OK(scad_stl_export(out_geoms[1], name, 1)); } else { snprintf(name, sizeof(name), "part_%g_1", x); - OK(scad_stl_export(geoms[0], name, 0, 0)); + OK(scad_stl_export(geoms[0], name, 0)); snprintf(name, sizeof(name), "part_%g_2", x); - OK(scad_stl_export(geoms[1], name, 0, 1)); + OK(scad_stl_export(geoms[1], name, 1)); } end: