star-cad

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

commit bddeb917a5c91501552aae5d3603617ff4c62bcf
parent 693ce7f5ce4ae2d866ca48b3c8bdfa0cfc6dabba
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date:   Tue,  5 Apr 2022 12:02:32 +0200

Add scad_boundary and scad_stl_export_split

Diffstat:
Msrc/scad.c | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/scad.h | 6++++++
2 files changed, 136 insertions(+), 3 deletions(-)

diff --git a/src/scad.c b/src/scad.c @@ -1,4 +1,5 @@ #include "scad.h" +#include <rsys/str.h> res_T scad_init(void) @@ -259,6 +260,7 @@ scad_cut if (ierr != 0 ) {fprintf(stderr,"Cut not possible !\n"); goto error;} + if (*out) sa_clear(*out); for (i=0; i<(int)tagoutn; ++i){ sa_push(*out, tagout[i]); } @@ -378,6 +380,34 @@ error: goto exit; } +res_T +scad_boundary +(const scad_geom_T geom1, scad_geom_T* out) +{ + res_T res = RES_OK; + int ierr,i; + int* b; + size_t n; + + gmshModelGetBoundary(geom1, sa_size(geom1), + &b, &n, + 1, + 0, + 0, + &ierr); + + if (ierr != 0 ) {fprintf(stderr,"Get boundary not possible !\n"); goto error;} + + for (i=0; i<(int)n; ++i){ + sa_push(*out, b[i]); + } + +exit: + if (b) free(b); + return res; +error: + goto exit; +} res_T scad_translate @@ -460,16 +490,20 @@ scad_stl_export(const scad_geom_T geom, char *prefix) res_T res = RES_OK; int ierr; int i; - int* tagout; + int* tagout = NULL; int* tags = NULL; size_t tagoutn; int group, dimtag[2]; + struct str filename; + + str_init(NULL, &filename); + str_set(&filename, prefix); + str_append(&filename, ".stl"); if (geom[0] == 2) { tagoutn = sa_size(geom); for(i=0; i<(int)tagoutn/2; ++i){ sa_push(tags, geom[2*i + 1]); - } group = gmshModelAddPhysicalGroup(2, tags, tagoutn/2, @@ -503,7 +537,7 @@ scad_stl_export(const scad_geom_T geom, char *prefix) if (ierr !=0) goto error; } - gmshWrite(prefix, &ierr); + gmshWrite(str_get(&filename), &ierr); if (ierr !=0) goto error; dimtag[0]=2; @@ -512,6 +546,99 @@ scad_stl_export(const scad_geom_T geom, char *prefix) if (ierr !=0) goto error; exit: + str_release(&filename); + if (tagout) free(tagout); + if (tags) sa_release(tags); + return res; +error: + goto exit; +} + +res_T +scad_stl_export_split(const scad_geom_T geom, char *prefix) +{ + res_T res = RES_OK; + int ierr; + int i; + int* tagout = NULL; + int* tags = NULL; + size_t tagoutn; + int group, dimtag[2]; + + if (geom[0] == 2) { + tagoutn = sa_size(geom); + for(i=0; i<(int)tagoutn/2; ++i){ + struct str filename; + char num[32]; + + group = gmshModelAddPhysicalGroup(2, &geom[2*i+1], 1, + -1, + &ierr); + if (ierr !=0) goto error; + + str_init(NULL, &filename); + str_set(&filename, prefix); + str_append_char(&filename, '_'); + sprintf(num, "%d", i); + str_append(&filename, num); + str_append(&filename, ".stl"); + gmshWrite(str_get(&filename), &ierr); + if (ierr !=0) {str_release(&filename); goto error;} + + dimtag[0]=2; + dimtag[1]=group; + gmshModelRemovePhysicalGroups(dimtag, 2, &ierr); + if (ierr !=0) {str_release(&filename); goto error;} + + str_release(&filename); + } + + } else { + + for (i=0; i<(int)sa_size(geom)/2; ++i) + { + gmshModelMeshSetOutwardOrientation(geom[2*i+1], &ierr); + } + + gmshModelGetBoundary(geom, sa_size(geom), + &tagout, &tagoutn, + 1, + 0, + 0, + &ierr); + + if (ierr !=0) goto error; + + for(i=0; i<(int)tagoutn/2; ++i){ + struct str filename; + char num[32]; + + + group = gmshModelAddPhysicalGroup(2, &tagout[2*i+1], 1, + -1, + &ierr); + if (ierr !=0) goto error; + + str_init(NULL, &filename); + str_set(&filename, prefix); + str_append_char(&filename, '_'); + sprintf(num, "%d", i); + str_append(&filename, num); + str_append(&filename, ".stl"); + gmshWrite(str_get(&filename), &ierr); + if (ierr !=0) {str_release(&filename); goto error;} + + dimtag[0]=2; + dimtag[1]=group; + gmshModelRemovePhysicalGroups(dimtag, 2, &ierr); + if (ierr !=0) {str_release(&filename); goto error;} + + str_release(&filename); + } + } + + +exit: if (tagout) free(tagout); if (tags) sa_release(tags); return res; diff --git a/src/scad.h b/src/scad.h @@ -75,6 +75,10 @@ scad_fragment (const scad_geom_T geom1, const scad_geom_T geom2, scad_geom_T* out, const int remove); res_T +scad_boundary +(const scad_geom_T geom1, scad_geom_T* out); + +res_T scad_translate (scad_geom_T geom, const double dxdydz[3]); @@ -88,6 +92,8 @@ scad_conformal_mesh(void); res_T scad_stl_export(const scad_geom_T geom, char *prefix); +res_T +scad_stl_export_split(const scad_geom_T geom, char *prefix); /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/