star-cad

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

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:
Msrc/scad.h | 8++++++++
Msrc/scad_geometry.c | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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 */