star-cad

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

commit c816b128dc62d65551118f843bc039094b516014
parent b04dc14a022b9d2761cfe72d4cc816cefe0a0312
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 23 Sep 2022 12:10:45 +0200

Merge branch 'develop' of gitlab.com:meso-star/star-cad into develop

Diffstat:
Msrc/scad.c | 33+++++++++++++++++++++++++++++++++
Msrc/scad.h | 12++++++++++++
Msrc/scad_geometry.c | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 118 insertions(+), 0 deletions(-)

diff --git a/src/scad.c b/src/scad.c @@ -519,3 +519,36 @@ exit: error: goto exit; } + +res_T +scad_scene_partition + (void) +{ + int* dimTags = NULL; + size_t dimTags_n; + int ierr = 0; + res_T res = RES_OK; + + ERR(check_device(FUNC_NAME)); + if(get_device()->need_synchro) { + ERR(scad_synchronize()); + } + + gmshModelOccGetEntities(&dimTags, &dimTags_n, 3, &ierr); + ERR(gmsh_err_to_res_T(ierr)); + if(dimTags_n > 2) { + /* Remove all duplicate entities in the OpenCASCADE CAD representation + * (different entities at the same geometrical location) after intersecting + * (using boolean fragments) all highest dimensional entities. */ + gmshModelOccRemoveAllDuplicates(&ierr); + ERR(gmsh_err_to_res_T(ierr)); + } + gmshModelOccSynchronize(&ierr); + ERR(gmsh_err_to_res_T(ierr)); + +exit: + if(dimTags) free(dimTags); + return res; +error: + goto exit; +} 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 @@ -328,6 +336,10 @@ SCAD_API res_T /* FIXME remove this */ scad_run_ui (void); +SCAD_API res_T /* FIXME TEMPORARY */ +scad_scene_partition + (void); + END_DECLS #endif /* SCAD_H */ 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 */