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:
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));