commit e310174983e35c99f0d39d94b1123e091255c7bb
parent 850dbd9ec9290f7a7cc6607c7e7311dbe9cc8d69
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date: Tue, 20 Sep 2022 17:42:25 +0200
Add function to explode geometry in list of components
Diffstat:
2 files changed, 81 insertions(+), 0 deletions(-)
diff --git a/src/scad.h b/src/scad.h
@@ -297,6 +297,14 @@ scad_geometry_extrude
const double dxdydz[3],
struct scad_geometry** out_geometry);
+/* Return a list of geometries which form the geometry geom */
+SCAD_API res_T
+scad_geometry_explode
+ (const struct scad_geometry* geom,
+ const char* prefix_name, /* Can be NULL */
+ struct scad_geometry*** out_geometry,
+ size_t* out_geometry_n);
+
/* Import a step model (`filename'). The imported geometries are recorded in
* `out_geometry' handler. */
SCAD_API res_T
diff --git a/src/scad_geometry.c b/src/scad_geometry.c
@@ -996,6 +996,79 @@ error:
}
res_T
+scad_geometry_explode
+ (const struct scad_geometry* geom,
+ const char* prefix_name, /* Can be NULL */
+ struct scad_geometry*** out_geometry,
+ size_t* out_geometry_n)
+{
+ res_T res = RES_OK;
+ int* data = NULL;
+ size_t i, sz = 0;
+ struct scad_geometry** geom_array = NULL;
+ struct str name;
+ int name_initialized = 0;
+
+ ERR(check_device(FUNC_NAME));
+ if(get_device()->need_synchro) {
+ ERR(scad_synchronize());
+ }
+
+ if(!geom || !out_geometry || !out_geometry_n) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ data = geom->gmsh_dimTags;
+ sz = geom->gmsh_dimTags_n;
+
+ ASSERT(sz % 2 == 0);
+ geom_array = malloc(sz/2 * sizeof(*geom_array));
+ if(!geom_array) {
+ res = RES_MEM_ERR;
+ goto error;
+ }
+
+ if (prefix_name) {
+ str_init(get_device()->allocator, &name);
+ name_initialized = 1;
+ }
+ for (i=0; i<sz/2; ++i) {
+ if (prefix_name) {
+ ERR(str_set(&name, prefix_name));
+ ERR(str_append_printf(&name,"_%lu", (unsigned long)i));
+ ERR(scad_geometry_create(str_cget(&name), geom_array+i));
+ } else {
+ ERR(scad_geometry_create(NULL, geom_array+i));
+ }
+ geom_array[i]->gmsh_dimTags_n = 2;
+ geom_array[i]->gmsh_dimTags = malloc(geom_array[i]->gmsh_dimTags_n *
+ sizeof(*geom_array[i]->gmsh_dimTags));
+ if(!geom_array[i]->gmsh_dimTags) {
+ res = RES_MEM_ERR;
+ goto error;
+ }
+ geom_array[i]->gmsh_dimTags[0] = data[2*i];
+ geom_array[i]->gmsh_dimTags[1] = data[2*i+1];
+
+ ERR(device_register_tags(geom_array[i]));
+ }
+
+exit:
+ if(out_geometry_n) *out_geometry_n = sz/2 ;
+ if(out_geometry) *out_geometry = geom_array;
+ if(name_initialized) str_release(&name);
+ return res;
+error:
+ if(geom_array) {
+ free(geom_array);
+ geom_array = NULL;
+ }
+ goto exit;
+}
+
+
+res_T
scad_geometry_copy
(const struct scad_geometry* geom,
const char* name, /* Can be NULL */