star-cad

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

commit d48339d151098d99249fd9499784c71a4f94c1af
parent 1980a93cb288fdb0dbcc63ad915dfb7550e8a04a
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date:   Thu, 24 Nov 2022 13:33:28 +0100

Add centerofmass function

Diffstat:
Msrc/scad.h | 6++++++
Msrc/scad_geometry.c | 51++++++++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 52 insertions(+), 5 deletions(-)

diff --git a/src/scad.h b/src/scad.h @@ -140,6 +140,12 @@ scad_geometry_get_mass (struct scad_geometry* geom, double* mass); +SCAD_API res_T +scad_geometry_get_centerofmass + (struct scad_geometry* geom, + double** center, + size_t* center_n); + /* Add a rectangle to the scene, defined by a point `xyz' and * `dxdy' the extents along the x-, y-axes. */ SCAD_API res_T diff --git a/src/scad_geometry.c b/src/scad_geometry.c @@ -384,6 +384,47 @@ error: } res_T +scad_geometry_get_centerofmass + (struct scad_geometry* geom, + double** center, + size_t* center_n) +{ + res_T res = RES_OK; + size_t i = 0; + int* data = NULL; + size_t sz = 0; + + if(!geom || !center || !center_n) goto error; + + ERR(check_device(FUNC_NAME)); + + ASSERT(geom->gmsh_dimTags_n % 2 == 0); + *center_n = geom->gmsh_dimTags_n / 2; + + *center = (double*)malloc(*center_n * 3 * sizeof(double)); + + ERR(gather_tags(&geom, 1, SIZE_MAX, &data, &sz)); + + for (i=0; i<*center_n; ++i) { + double x, y, z; + int ierr = 0; + gmshModelOccGetCenterOfMass(data[2*i], data[2*i + 1], &x, &y, &z, &ierr); + ERR(gmsh_err_to_res_T(ierr)); + (*center)[3*i] = x; + (*center)[3*i + 1] = y; + (*center)[3*i + 2] = z; + } + +exit: + free(data); + return res; +error: + res = RES_BAD_ARG; + if (*center) free(*center); + goto exit; +} + +res_T scad_add_rectangle (const char* name, const double xyz[3], @@ -1474,8 +1515,8 @@ scad_geometry_normal res_T res = RES_OK; int ierr = 0; size_t i; - int* data; - size_t sz; + int* data = NULL; + size_t sz = 0; struct scad_geometry* surface = NULL; struct scad_geometry* out = NULL; @@ -1487,7 +1528,7 @@ scad_geometry_normal ERR(check_device(FUNC_NAME)); if (geom->gmsh_dimTags[0] == 2) { - ERR(scad_geometry_copy(geom, NULL, &surface)); + surface = geom; } else if (geom->gmsh_dimTags[0] == 3) { ERR(scad_geometry_boundary(NULL, &geom, 1, &surface)); } else { @@ -1552,8 +1593,8 @@ scad_geometry_dilate { res_T res = RES_OK; int ierr = 0; - int* data; - size_t sz; + int* data = NULL; + size_t sz = 0; if(!geom || !scale|| !center) { res = RES_BAD_ARG;