commit c816b128dc62d65551118f843bc039094b516014
parent b04dc14a022b9d2761cfe72d4cc816cefe0a0312
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Fri, 23 Sep 2022 12:10:45 +0200
Merge branch 'develop' of gitlab.com:meso-star/star-cad into develop
Diffstat:
3 files changed, 118 insertions(+), 0 deletions(-)
diff --git a/src/scad.c b/src/scad.c
@@ -519,3 +519,36 @@ exit:
error:
goto exit;
}
+
+res_T
+scad_scene_partition
+ (void)
+{
+ int* dimTags = NULL;
+ size_t dimTags_n;
+ int ierr = 0;
+ res_T res = RES_OK;
+
+ ERR(check_device(FUNC_NAME));
+ if(get_device()->need_synchro) {
+ ERR(scad_synchronize());
+ }
+
+ gmshModelOccGetEntities(&dimTags, &dimTags_n, 3, &ierr);
+ ERR(gmsh_err_to_res_T(ierr));
+ if(dimTags_n > 2) {
+ /* Remove all duplicate entities in the OpenCASCADE CAD representation
+ * (different entities at the same geometrical location) after intersecting
+ * (using boolean fragments) all highest dimensional entities. */
+ gmshModelOccRemoveAllDuplicates(&ierr);
+ ERR(gmsh_err_to_res_T(ierr));
+ }
+ gmshModelOccSynchronize(&ierr);
+ ERR(gmsh_err_to_res_T(ierr));
+
+exit:
+ if(dimTags) free(dimTags);
+ return res;
+error:
+ goto exit;
+}
diff --git a/src/scad.h b/src/scad.h
@@ -297,6 +297,14 @@ scad_geometry_extrude
const double dxdydz[3],
struct scad_geometry** out_geometry);
+/* Return a list of geometries which form the geometry geom */
+SCAD_API res_T
+scad_geometry_explode
+ (const struct scad_geometry* geom,
+ const char* prefix_name, /* Can be NULL */
+ struct scad_geometry*** out_geometry,
+ size_t* out_geometry_n);
+
/* Import a step model (`filename'). The imported geometries are recorded in
* `out_geometry' handler. */
SCAD_API res_T
@@ -328,6 +336,10 @@ SCAD_API res_T /* FIXME remove this */
scad_run_ui
(void);
+SCAD_API res_T /* FIXME TEMPORARY */
+scad_scene_partition
+ (void);
+
END_DECLS
#endif /* SCAD_H */
diff --git a/src/scad_geometry.c b/src/scad_geometry.c
@@ -996,6 +996,79 @@ error:
}
res_T
+scad_geometry_explode
+ (const struct scad_geometry* geom,
+ const char* prefix_name, /* Can be NULL */
+ struct scad_geometry*** out_geometry,
+ size_t* out_geometry_n)
+{
+ res_T res = RES_OK;
+ int* data = NULL;
+ size_t i, sz = 0;
+ struct scad_geometry** geom_array = NULL;
+ struct str name;
+ int name_initialized = 0;
+
+ ERR(check_device(FUNC_NAME));
+ if(get_device()->need_synchro) {
+ ERR(scad_synchronize());
+ }
+
+ if(!geom || !out_geometry || !out_geometry_n) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ data = geom->gmsh_dimTags;
+ sz = geom->gmsh_dimTags_n;
+
+ ASSERT(sz % 2 == 0);
+ geom_array = malloc(sz/2 * sizeof(*geom_array));
+ if(!geom_array) {
+ res = RES_MEM_ERR;
+ goto error;
+ }
+
+ if (prefix_name) {
+ str_init(get_device()->allocator, &name);
+ name_initialized = 1;
+ }
+ for (i=0; i<sz/2; ++i) {
+ if (prefix_name) {
+ ERR(str_set(&name, prefix_name));
+ ERR(str_append_printf(&name,"_%lu", (unsigned long)i));
+ ERR(scad_geometry_create(str_cget(&name), geom_array+i));
+ } else {
+ ERR(scad_geometry_create(NULL, geom_array+i));
+ }
+ geom_array[i]->gmsh_dimTags_n = 2;
+ geom_array[i]->gmsh_dimTags = malloc(geom_array[i]->gmsh_dimTags_n *
+ sizeof(*geom_array[i]->gmsh_dimTags));
+ if(!geom_array[i]->gmsh_dimTags) {
+ res = RES_MEM_ERR;
+ goto error;
+ }
+ geom_array[i]->gmsh_dimTags[0] = data[2*i];
+ geom_array[i]->gmsh_dimTags[1] = data[2*i+1];
+
+ ERR(device_register_tags(geom_array[i]));
+ }
+
+exit:
+ if(out_geometry_n) *out_geometry_n = sz/2 ;
+ if(out_geometry) *out_geometry = geom_array;
+ if(name_initialized) str_release(&name);
+ return res;
+error:
+ if(geom_array) {
+ free(geom_array);
+ geom_array = NULL;
+ }
+ goto exit;
+}
+
+
+res_T
scad_geometry_copy
(const struct scad_geometry* geom,
const char* name, /* Can be NULL */