star-cad

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

commit 73052ae91d67aed8e7a9681ec0f2b6798d56b1be
parent 0a5893f1ef4aee3a5c0722e1c01644df2d870753
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date:   Tue, 26 Apr 2022 15:05:47 +0200

Add disk, rectangle and polygon primitives and extrusion operation

Diffstat:
Msrc/scad.c | 167++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Msrc/scad.h | 17++++++++++++++++-
2 files changed, 182 insertions(+), 2 deletions(-)

diff --git a/src/scad.c b/src/scad.c @@ -91,6 +91,130 @@ error: goto exit; } +res_T +scad_addrectangle +(const double xyz[3], const double dxdy[2], scad_geom_T* geom) +{ + res_T res = RES_OK; + int ierr = 0; + int tag = 0; + + if(!xyz || !dxdy) { + fprintf(stderr,"Invalid data !\n"); + return RES_BAD_ARG; + } + + tag = gmshModelOccAddRectangle(xyz[0], xyz[1], xyz[2], + dxdy[0], dxdy[1], + -1, + 0, + &ierr); + + if (ierr !=0) goto error; + + if (*geom != NULL) *geom = NULL; + sa_push(*geom,2); + sa_push(*geom,tag); + +exit: + return res; +error: + res = ierr; + fprintf(stderr,"Can't create rectangle !\n"); + goto exit; +} + +res_T +scad_adddisk +(const double xyz[3], const double rad, scad_geom_T* geom) +{ + res_T res = RES_OK; + int ierr = 0; + int tag = 0; + + if(!xyz || rad < 0) { + fprintf(stderr,"Invalid data !\n"); + return RES_BAD_ARG; + } + + tag = gmshModelOccAddDisk(xyz[0], xyz[1], xyz[2], rad, rad, -1, &ierr); + + if (ierr !=0) goto error; + + if (*geom != NULL) *geom = NULL; + sa_push(*geom,2); + sa_push(*geom,tag); + +exit: + return res; +error: + res = ierr; + fprintf(stderr,"Can't create disk !\n"); + goto exit; +} + +res_T +scad_addpolygon +(const double* x, const double* y, const double z, const int n, scad_geom_T* geom) +{ + res_T res = RES_OK; + int ierr = 0; + int i; + int* points = NULL; + int* lines = NULL; + int loop; + int surf; + + if(!x || !y || n<3) { + fprintf(stderr,"Invalid data !\n"); + return RES_BAD_ARG; + } + + for (i=0; i<n; ++i){ + int tag; + tag = gmshModelOccAddPoint(x[i], y[i], z, -1, -1, &ierr); + sa_push(points, tag); + if (ierr !=0) goto error; + } + + for (i=0; i<n; ++i){ + int tag; + + if (i != (n-1)) { + tag = gmshModelOccAddLine(points[i], + points[i+1], + -1, + &ierr); + if (ierr !=0) goto error; + } else { + tag = gmshModelOccAddLine(points[i], + points[0], + -1, + &ierr); + if (ierr !=0) goto error; + } + sa_push(lines, tag); + } + + loop = gmshModelOccAddCurveLoop(lines, sa_size(lines), -1, &ierr); + if (ierr !=0) goto error; + + surf = gmshModelOccAddPlaneSurface(&loop, 1, -1, &ierr); + if (ierr !=0) goto error; + + if (*geom != NULL) *geom = NULL; + sa_push(*geom,2); + sa_push(*geom,surf); + +exit: + if (points) sa_release(points); + if (lines) sa_release(lines); + return res; +error: + res = ierr; + fprintf(stderr,"Can't create polygon !\n"); + goto exit; +} res_T scad_addbox @@ -241,6 +365,7 @@ scad_fuse if (ierr != 0 ) {fprintf(stderr,"Fuse not possible !\n"); goto error;} + if (*out) sa_release(*out); *out = NULL; for (i=0; i<(int)tagoutn; ++i){ sa_push(*out, tagout[i]); } @@ -276,7 +401,7 @@ scad_cut if (ierr != 0 ) {fprintf(stderr,"Cut not possible !\n"); goto error;} - if (*out) sa_clear(*out); + if (*out) sa_release(*out); *out = NULL; for (i=0; i<(int)tagoutn; ++i){ sa_push(*out, tagout[i]); } @@ -348,6 +473,7 @@ scad_intersect } + if (*out) sa_release(*out); *out = NULL; for (i=0; i<(int)tagoutn; ++i){ sa_push(*out, tagout[i]); } @@ -383,6 +509,7 @@ scad_fragment if (ierr != 0 ) {fprintf(stderr,"Fragment not possible !\n"); goto error;} + if (*out) sa_release(*out); *out = NULL; for (i=0; i<(int)tagoutn; ++i){ sa_push(*out, tagout[i]); } @@ -414,6 +541,7 @@ scad_boundary if (ierr != 0 ) {fprintf(stderr,"Get boundary not possible !\n"); goto error;} + if (*out) sa_release(*out); *out = NULL; for (i=0; i<(int)n; ++i){ sa_push(*out, b[i]); } @@ -483,6 +611,43 @@ error: goto exit; } +res_T +scad_extrude(const scad_geom_T geom, const double dxdydz[3], scad_geom_T* out) +{ + res_T res = RES_OK; + int ierr, i; + int* tagout; + size_t tagoutn; + + if (!geom || !dxdydz){ + fprintf(stderr,"Invalid data !\n"); + return RES_BAD_ARG; + } + + gmshModelOccExtrude(geom, sa_size(geom), + dxdydz[0], + dxdydz[1], + dxdydz[2], + &tagout, &tagoutn, + NULL, 0, + NULL, 0, + 0, + &ierr); + + if (*out) sa_release(*out); *out = NULL; + for (i=0; i<(int)tagoutn; ++i){ + sa_push(*out, tagout[i]); + } + + if (ierr != 0 ) {fprintf(stderr,"Extrusion not possible !\n"); goto error;} + +exit: + return res; +error: + res = ierr; + goto exit; +} + res_T scad_conformal_mesh(void) { diff --git a/src/scad.h b/src/scad.h @@ -55,6 +55,19 @@ res_T scad_run_ui(void); res_T +scad_addrectangle +(const double xyz[3], const double dxdy[2], scad_geom_T* geom); + +res_T +scad_adddisk +(const double xyz[3], const double rad, scad_geom_T* geom); + +res_T +scad_addpolygon +(const double* x, const double* y, const double z, const int n, scad_geom_T* geom); + + +res_T scad_addbox (const double xyz[3], const double dxdydz[3], scad_geom_T* geom); @@ -65,7 +78,6 @@ scad_addcylinder res_T scad_addsphere (const double xyz[3], const double rad, scad_geom_T* geom); - res_T scad_remove(scad_geom_T geom); @@ -102,6 +114,9 @@ res_T scad_rotate (scad_geom_T geom, const double pt[3], const double axis[3], const double angle); +res_T +scad_extrude(const scad_geom_T geom, const double dxdydz[3], scad_geom_T* out); + res_T scad_conformal_mesh(void);