star-cad

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

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:
Msrc/scad_device.c | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/scad_device.h | 4++++
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