star-cad

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

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:
Msrc/scad.h | 10++++++++++
Msrc/scad_geometry.c | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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; } +