commit 9a5a03aed72702075a55429b61454e464f53f8eb
parent 7e62deca07d9cf5b578f3492475751d1c26431a9
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Mon, 18 Aug 2025 18:44:21 +0200
Add debug code
Due to some current gmsh bugs, some OCC tags can be created, while not
part of any star-cad geometry.
The new debug code check that OCC context is empty when star-cad context
is empty.
Diffstat:
2 files changed, 89 insertions(+), 2 deletions(-)
diff --git a/src/scad_device.c b/src/scad_device.c
@@ -130,6 +130,14 @@ device_release(struct scad_device* dev)
MEM_RM(dev->allocator, dev);
htable_geometries_release(&tmp);
+#ifndef NDEBUG
+ {
+ int ierr;
+ gmshModelOccSynchronize(&ierr);
+ return check_empty_gmsh_occ(dev);
+ }
+#endif
+
return res;
}
@@ -191,7 +199,7 @@ check_device
goto error;
}
- if(get_device()->need_synchro) {
+ if(g_device->need_synchro) {
ERR(scad_synchronize());
}
@@ -199,6 +207,12 @@ check_device
ERR(scad_run_ui());
}
+#ifndef NDEBUG
+ if(htable_geometries_size_get(&g_device->allgeom) == 0) {
+ ERR(check_empty_gmsh_occ(g_device));
+ }
+#endif
+
exit:
return res;
error:
@@ -265,7 +279,6 @@ scad_dump_geometry
(const struct scad_geometry* geom)
{
res_T res = RES_OK;
- struct scad_device* dev = get_device();
size_t i;
if(!geom) {
@@ -557,6 +570,76 @@ error:
goto exit;
}
+res_T
+check_empty_gmsh_occ(struct scad_device* dev)
+{
+ int* dimTags = NULL;
+ size_t dimTags_n, i;
+ int ierr, found, d;
+ struct str msg;
+ int msg_initialized = 0;
+ res_T res = RES_OK;
+
+ found = 0;
+ for(d = 3; d >= 0; d--) {
+ gmshFree(dimTags);
+ dimTags = NULL;
+ gmshModelGetEntities(&dimTags, &dimTags_n, d, &ierr);
+ ASSERT(dimTags_n % 2 == 0);
+ if(dimTags_n == 0)
+ continue;
+ found = 1;
+ log_error(dev,
+ "There are %ld unreferenced gmsh entities of dim %d from an empty star-cad context%c\n",
+ dimTags_n / 2, d, (d > 1 ? ':' : '.'));
+ if(d < 2) continue;
+ if(!msg_initialized) str_init(dev->allocator, &msg);
+ for(i = 0; i < dimTags_n; i += 2) {
+ const int dim = dimTags[i];
+ const int tag = dimTags[i+1];
+ ERR(str_append_printf(&msg, (i ? ", %d.%d" : "%d.%d"), dim, tag));
+ }
+ log_error(dev," tags [%s]\n", str_cget(&msg));
+ }
+ if(found) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ found = 0;
+ for(d = 3; d >= 0; d--) {
+ gmshFree(dimTags);
+ dimTags = NULL;
+ gmshModelOccGetEntities(&dimTags, &dimTags_n, d, &ierr);
+ ASSERT(dimTags_n % 2 == 0);
+ if(dimTags_n == 0)
+ continue;
+ found = 1;
+ log_error(dev,
+ "There are %ld unreferenced Open-Cascade entities of dim %d from an empty star-cad context%c\n",
+ dimTags_n / 2, d, (d > 1 ? ':' : '.'));
+ if(d < 2) continue;
+ if(!msg_initialized) str_init(dev->allocator, &msg);
+ for(i = 0; i < dimTags_n; i += 2) {
+ const int dim = dimTags[i];
+ const int tag = dimTags[i+1];
+ ERR(str_append_printf(&msg, (i ? ", %d.%d" : "%d.%d"), dim, tag));
+ }
+ log_error(dev," tags [%s]\n", str_cget(&msg));
+ }
+ if(found) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+exit:
+ gmshFree(dimTags);
+ if(msg_initialized) str_release(&msg);
+ return res;
+error:
+ goto exit;
+}
+
/*******************************************************************************
* API scad_device functions
******************************************************************************/
diff --git a/src/scad_device.h b/src/scad_device.h
@@ -234,4 +234,8 @@ device_unregister_tags
const enum log_type log_type,
struct scad_geometry* geom);
+LOCAL_SYM res_T
+check_empty_gmsh_occ
+ (struct scad_device* dev);
+
#endif