star-cad

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

commit 11f03a751b240b37bd6a5a57afe237a92473a536
parent 1e85435e83dee649f120b865b4f43d4c66c8cab4
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed,  3 Sep 2025 16:03:37 +0200

Fix clear mesh API call

Needed to clear the mesh down to dim 0 (points) so that the next mesh
operation could propagate any modified mesh-size settings correctly.

Diffstat:
Msrc/scad_geometry.c | 25++++++++++++++++---------
Msrc/test_api.c | 49++++++++++++++++++++++++++++++++-----------------
2 files changed, 48 insertions(+), 26 deletions(-)

diff --git a/src/scad_geometry.c b/src/scad_geometry.c @@ -807,11 +807,11 @@ scad_geometries_clear_mesh const size_t geometries_count) { res_T res = RES_OK; - int ierr; - size_t sz; - int* data = NULL; + int ierr, dim; struct scad_device* dev = get_device(); struct mem_allocator* allocator = NULL; + size_t sz[4]; + int *data[4] = { NULL, NULL, NULL, NULL}; if(!geometries || geometries_count == 0) { res = RES_BAD_ARG; @@ -819,16 +819,23 @@ scad_geometries_clear_mesh } ERR(check_device(FUNC_NAME)); - allocator = dev->allocator; - ERR(gather_tags(geometries, geometries_count, &data, &sz)); - gmshModelMeshClear(data, sz, &ierr); - ERR(gmsh_err_to_res_T(ierr)); - dev->need_synchro = 1; + ERR(gather_tags_recursive(geometries, geometries_count, 0, data, sz)); + ERR(sync_device()); + for(dim = 3; dim >= 0; dim--) { + /* Cannot clear the mesh of lower dim entities if linked to higher dim + * entities with uncleared mesh: start from the higher dim down to 0 */ + gmshModelMeshClear(data[dim], sz[dim], &ierr); + ERR(gmsh_err_to_res_T(ierr)); + } exit: - if(allocator) MEM_RM(allocator, data); + if(allocator) { + for(dim = 3; dim >= 0; dim--) { + MEM_RM(allocator, data[dim]); + } + } return res; error: goto exit; diff --git a/src/test_api.c b/src/test_api.c @@ -47,7 +47,6 @@ get_position ASSERT(pos && coord); pos[0] = coord[2*ivert]; pos[1] = coord[1+2*ivert]; - } int @@ -62,7 +61,7 @@ main(int argc, char* argv[]) const double d1[3] = {1, 1, 1}; const double d2[3] = {1, 1, 0}; const double s[3] = {1, 1, 1}; - double coord[] = {0, 1.6, 0.5, 0.9, 0.8, 0.6}; + double coord[] = {0, 1.6, 0.5, 0.9, 0.8, 0.6}; struct scad_geometry* geom1 = NULL; struct scad_geometry* geom2 = NULL; struct scad_geometry* geom = NULL; @@ -73,6 +72,7 @@ main(int argc, char* argv[]) struct mem_allocator allocator; struct darray_double trg; struct scad_options options = SCAD_DEFAULT_OPTIONS; + struct scad_options opt = SCAD_DEFAULT_OPTIONS; const char *name, *name2; double m, tmp[3], tmp2[3]; double affine[16] = { 1, 0, 0, 0.25, 0, 1, 0, 0.25, 0, 0, 1, 0.8, 0, 0, 0, 1 }; @@ -84,6 +84,10 @@ main(int argc, char* argv[]) OK(mem_init_proxy_allocator(&allocator, &mem_default_allocator)); + options.Misc.DebugEmptyContext = 1; + options.Mesh.MeshSizeExtendFromBoundary = 0; + options.Mesh.MeshSizeFromPoints = 0; + /* cannot call any API function before a successful call to scad_initialize */ geom1 = geom2 = geom = (struct scad_geometry*)1; /* To allow tests go past arg!=NULL */ @@ -231,7 +235,7 @@ main(int argc, char* argv[]) CHK(c == 0); BAD(scad_get_options(NULL)); - OK(scad_get_options(&options)); + OK(scad_get_options(&opt)); OK(scad_scene_count(&c)); CHK(c == 0); @@ -370,9 +374,6 @@ main(int argc, char* argv[]) OK(scad_add_sphere(p1, 1, &geom)); OK(scad_geometry_ref_put(geom)); - - - OK(scad_scene_count(&c)); CHK(c == 0); @@ -1411,12 +1412,32 @@ main(int argc, char* argv[]) OK(scad_scene_count(&c)); CHK(c == 0); - OK(scad_add_sphere(p1, 0.1, &geom1)); + options.Mesh.MeshSizeFromPoints = 1; + options.Mesh.MeshSizeExtendFromBoundary = 1; + OK(scad_set_options(&options)); + + OK(scad_add_box(p1, d1, &geom)); + OK(scad_scene_mesh()); + darray_double_init(&allocator, &trg); + OK(scad_stl_get_data(geom, &trg)); + c = darray_double_size_get(&trg); + darray_double_clear(&trg); BAD(scad_geometries_clear_mesh(NULL, 0)); BAD(scad_geometries_clear_mesh(NULL, 1)); - BAD(scad_geometries_clear_mesh(&geom1, 0)); - OK(scad_geometries_clear_mesh(&geom1, 1)); - OK(scad_geometry_ref_put(geom1)); + BAD(scad_geometries_clear_mesh(&geom, 0)); + OK(scad_geometries_clear_mesh(&geom, 1)); + OK(scad_stl_get_data(geom, &trg)); + CHK(0 == darray_double_size_get(&trg)); + OK(scad_geometries_set_mesh_size_modifier(&geom, 1, SCAD_SIZE_FACTOR, 0.5)); + OK(scad_scene_mesh()); + OK(scad_stl_get_data(geom, &trg)); + CHK(c < darray_double_size_get(&trg)); + darray_double_release(&trg); + OK(scad_geometry_ref_put(geom)); + + options.Mesh.MeshSizeFromPoints = 0; + options.Mesh.MeshSizeExtendFromBoundary = 0; + OK(scad_set_options(&options)); OK(scad_scene_count(&c)); CHK(c == 0); @@ -1512,9 +1533,6 @@ main(int argc, char* argv[]) OK(scad_add_box(p1, d1, &geom)); darray_double_init(&allocator, &trg); - options.Mesh.MeshSizeExtendFromBoundary = 0; - options.Mesh.MeshSizeFromPoints = 0; - OK(scad_set_options(&options)); OK(scad_geometries_set_mesh_algorithm(&geom, 1, SCAD_INITIAL_MESH_ONLY)); OK(scad_scene_mesh()); BAD(scad_stl_get_data(NULL, NULL)); @@ -1532,9 +1550,6 @@ main(int argc, char* argv[]) OK(scad_add_box(p4, d1, &geoms[1])); OK(scad_geometries_collect(geoms, 2, &geom)); darray_double_init(&allocator, &trg); - options.Mesh.MeshSizeExtendFromBoundary = 0; - options.Mesh.MeshSizeFromPoints = 0; - OK(scad_set_options(&options)); OK(scad_geometries_set_mesh_algorithm(geoms, 2, SCAD_INITIAL_MESH_ONLY)); OK(scad_scene_mesh()); BAD(scad_stl_get_data_partial(NULL, NULL, 0, NULL)); @@ -1559,12 +1574,12 @@ main(int argc, char* argv[]) OK(scad_add_box(p1, d1, &geom)); darray_double_init(&allocator, &trg); OK(scad_stl_get_data(geom, &trg)); + CHK(0 == darray_double_size_get(&trg)); /* No call to mesh */ BAD(scad_stl_data_write(NULL, NULL, 9, 0)); BAD(scad_stl_data_write(NULL, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); BAD(scad_stl_data_write(&trg, NULL, 9, 0)); BAD(scad_stl_data_write(&trg, NULL, SCAD_KEEP_NORMALS_UNCHANGED, 0)); OK(scad_stl_data_write(&trg, "/tmp/test"LINE_STRING, SCAD_FORCE_NORMALS_OUTWARD, 1)); - CHK(0 == darray_double_size_get(&trg)); OK(scad_geometry_ref_put(geom)); OK(scad_scene_count(&c));