commit fb5760b01c8aea2677cb88c8671676b5b6acf125
parent d35bfdb13382a9941588a931e59348b2649fb869
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date: Tue, 4 Oct 2022 11:34:08 +0200
Add fragment function
Diffstat:
2 files changed, 76 insertions(+), 0 deletions(-)
diff --git a/src/scad.h b/src/scad.h
@@ -253,6 +253,16 @@ scad_geometries_partition_one
const int allow_overlapping,
struct scad_geometry** out_geometry);
+SCAD_API res_T
+scad_fragment_geometries
+ (const char* name, /* Can be NULL */
+ struct scad_geometry** geometries,
+ const size_t geometries_count,
+ struct scad_geometry** tools,
+ const size_t tools_count,
+ struct scad_geometry** out_geometry);
+
+
/* Get the boundary of the geometry `geom'. */
SCAD_API res_T
scad_geometry_boundary
diff --git a/src/scad_geometry.c b/src/scad_geometry.c
@@ -1205,6 +1205,71 @@ scad_geometries_partition
SIZE_MAX, tools, tools_count, allow_overlapping, out_geometry);
}
+res_T
+scad_fragment_geometries
+ (const char* name,
+ struct scad_geometry** geometries,
+ const size_t geometries_count,
+ struct scad_geometry** tools,
+ const size_t tools_count,
+ struct scad_geometry** out_geometry)
+{
+ int* tagout = NULL;
+ int** map = NULL;
+ size_t* mapn = NULL;
+ size_t tagoutn, mapnn, sz1, sz2;
+ int* data1 = NULL;
+ int* data2 = NULL;
+ int ierr = 0;
+ struct scad_geometry* geom = NULL;
+ res_T res = RES_OK;
+
+ if(!geometries || !tools || !out_geometry) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ ERR(check_device(FUNC_NAME));
+ if(get_device()->need_synchro) {
+ ERR(scad_synchronize());
+ }
+
+ ERR(gather_tags(geometries, geometries_count, SIZE_MAX, &data1, &sz1));
+ ERR(gather_tags(tools, tools_count, SIZE_MAX, &data2, &sz2));
+
+ /* We don't remove gmsh objects here; they are only removed when their tags are
+ * no longuer used by any star-cad geometry */
+ gmshModelOccFragment(data1, sz1, data2, sz2, &tagout, &tagoutn, &map, &mapn,
+ &mapnn, -1, 0, 0, &ierr);
+ ERR(gmsh_err_to_res_T(ierr));
+
+ ERR(scad_geometry_create(name, &geom));
+ geom->gmsh_dimTags_n = tagoutn;
+ geom->gmsh_dimTags = tagout;
+ tagout = NULL; /* Prevent possible double free */
+
+ ERR(device_register_tags(geom));
+
+exit:
+ if(out_geometry) *out_geometry = geom;
+ if(data1) free(data1);
+ if(data2) free(data2);
+ if(mapn) free(mapn);
+ if(map) free(map);
+ return res;
+error:
+ if(geom) {
+ CHK(RES_OK == geometry_release(geom));
+ geom = NULL;
+ }
+ if(tagout) {
+ gmshModelOccRemove(tagout, tagoutn, 1, &ierr);
+ free(tagout);
+ }
+ goto exit;
+}
+
+
res_T
scad_geometry_boundary
@@ -1328,3 +1393,4 @@ error:
}
goto exit;
}
+