star-cad

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

commit e01516581c09017e47c570d2202af1a36daae6fe
parent b1370883d1c7ee17419589d20de45c36e8bf3de0
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Mon,  9 Jan 2023 17:50:16 +0100

Change scad_geometry_get_centerofmass signature

Memory allocation/desalocation is now up to the caller to end a memleaks-prone situation

Diffstat:
Msrc/scad.h | 4+---
Msrc/scad_geometry.c | 37++++++++++++-------------------------
2 files changed, 13 insertions(+), 28 deletions(-)

diff --git a/src/scad.h b/src/scad.h @@ -188,8 +188,7 @@ scad_geometry_get_mass SCAD_API res_T scad_geometry_get_centerofmass (struct scad_geometry* geom, - double** center, - size_t* center_n); + double* center); /* should have room for 3*scad_geometry_get_count(geom) doubles */ /* Add a rectangle to the scene, defined by a point `xyz' and * `dxdy' the extents along the x-, y-axes. */ @@ -323,7 +322,6 @@ scad_fragment_geometries 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 @@ -460,47 +460,34 @@ error: res_T scad_geometry_get_centerofmass (struct scad_geometry* geom, - double** center, - size_t* center_n) + double* center) { res_T res = RES_OK; size_t i = 0; - int* data = NULL; - size_t sz = 0; - struct scad_device* dev = get_device(); - struct mem_allocator* allocator = NULL; - double* c = NULL; - - if(!geom || !center || !center_n) goto error; - - ERR(check_device(FUNC_NAME)); - allocator = dev->allocator; - ASSERT(geom->gmsh_dimTags_n % 2 == 0); - *center_n = geom->gmsh_dimTags_n / 2; - - c = (double*)MEM_ALLOC(allocator, *center_n * 3 * sizeof(*center)); - if(!c) { - res = RES_MEM_ERR; + if(!geom || !center) { + res = RES_BAD_ARG; goto error; } - ERR(gather_tags(&geom, 1, &data, &sz)); + ERR(check_device(FUNC_NAME)); - for(i=0; i<*center_n; ++i) { + for(i = 0; i < geom->gmsh_dimTags_n; i += 2) { + double x, y, z; int ierr = 0; - gmshModelOccGetCenterOfMass(data[2*i], data[2*i+1], c+3*i, c+3*i+1, c+3*i+2, &ierr); + int dim = geom->gmsh_dimTags[i]; + int tag = geom->gmsh_dimTags[i + 1]; + gmshModelOccGetCenterOfMass(dim, tag, &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: - *center = c; - if(allocator) MEM_RM(allocator, data); return res; error: res = RES_BAD_ARG; - if(allocator) MEM_RM(allocator, c); - c = NULL; goto exit; }