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