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:
| M | src/scad.c | | | 167 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- |
| M | src/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);