star-cad

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

commit 3b203f05a67a11e51f02cc5cab2e904eea9afeb2
parent 4a1746fdae596a4c233a4b48cf232dd756929fba
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date:   Fri, 18 Nov 2022 10:14:55 +0100

Add `get_mass' function to compute area and volume of geometries

Diffstat:
Msrc/scad.h | 7+++++++
Msrc/scad_geometry.c | 38++++++++++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+), 0 deletions(-)

diff --git a/src/scad.h b/src/scad.h @@ -128,6 +128,13 @@ scad_geometry_get_count (const struct scad_geometry* geom, size_t* count); +/* Get the `mass' of the geometry `geom'. It means area for a 2D geometry and + * volume for a 3D geometry. */ +SCAD_API res_T +scad_geometry_get_mass + (struct scad_geometry* geom, + double* mass); + /* 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 @@ -321,6 +321,44 @@ error: goto exit; } +res_T +scad_geometry_get_mass + (struct scad_geometry* geom, + double* mass) +{ + res_T res = RES_OK; + int dim = 0; + size_t i, count = 0; + int* data = NULL; + size_t sz = 0; + + if(!geom || !mass) goto error; + + ERR(check_device(FUNC_NAME)); + + ASSERT(geom->gmsh_dimTags_n % 2 == 0); + count = geom->gmsh_dimTags_n / 2; + + ERR(gather_tags(&geom, 1, SIZE_MAX, &data, &sz)); + + dim = data[0]; + *mass = 0; + for (i=0; i<count; ++i) { + double geom_mass = 0; + int ierr = 0; + if (data[2*i] != dim) goto error; + gmshModelOccGetMass(data[2*i], data[2*i + 1], &geom_mass, &ierr); + ERR(gmsh_err_to_res_T(ierr)); + *mass += geom_mass; + } + +exit: + free(data); + return res; +error: + res = RES_BAD_ARG; + goto exit; +} res_T scad_add_rectangle