star-cad

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

commit 9ec0072f8b09d1512b4769d5d2c886b7d8c56bcf
parent 04d4f68ac87fccb2f8819e581a0dadd646760755
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Thu, 25 Aug 2022 16:00:42 +0200

Remove the scad_device type from user space: there is a single implicit device

Add a few API calls as initialize, finalize and clear

Diffstat:
Msrc/scad.c | 66++++++++++++++++++++++++++++++++++++++++++++----------------------
Msrc/scad.h | 92+++++++++++++++++++++++++++++++++----------------------------------------------
Msrc/scad_device.c | 148++++++++++++++++++++++++++++++++++++++-----------------------------------------
Msrc/scad_device.h | 11+++++++++++
Msrc/scad_geometry.c | 255+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Msrc/scad_geometry.h | 3---
Msrc/test1.c | 24++++++++++++------------
7 files changed, 320 insertions(+), 279 deletions(-)

diff --git a/src/scad.c b/src/scad.c @@ -182,21 +182,39 @@ write_stl * Exported functions *****************************************************************************/ res_T -scad_device_synchronize - (struct scad_device* device) +scad_synchronize + (void) { + res_T res = RES_OK; int ierr; + + ERR(check_device()); + gmshModelOccSynchronize(&ierr); - device->need_synchro = 0; - return gmsh_err_to_res_T(ierr); + get_device()->need_synchro = 0; + ERR(gmsh_err_to_res_T(ierr)); + +exit: + return res; +error: + goto exit; } res_T scad_run_ui(void) { + res_T res = RES_OK; int ierr; + + ERR(check_device()); + gmshFltkRun(&ierr); - return gmsh_err_to_res_T(ierr); + ERR(gmsh_err_to_res_T(ierr)); + +exit: + return res; +error: + goto exit; } res_T @@ -229,15 +247,17 @@ scad_stl_export goto error; } - if(geometry->device->need_synchro) { - ERR(scad_device_synchronize(geometry->device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz = geometry->gmsh_dimTags_n; data = geometry->gmsh_dimTags; ASSERT(sz > 0 && sz % 2 == 0); - str_init(geometry->device->allocator, &filename); + str_init(get_device()->allocator, &filename); str_initialized = 1; if(prefix) { ERR(str_set(&filename, prefix)); @@ -254,7 +274,7 @@ scad_stl_export size_t dimTags_n; size_t tcount; - ERR(scad_device_synchronize(geometry->device)); + ERR(scad_synchronize()); gmshModelOccGetEntities(&dimTags, &dimTags_n, 3, &ierr); ERR(gmsh_err_to_res_T(ierr)); if(dimTags_n > 100000) { @@ -277,13 +297,13 @@ scad_stl_export #endif } /* WARNING : an export may be prohibited without a prior conformal mesh*/ - if (!geometry->device->is_meshed) { - ERR(scad_device_synchronize(geometry->device)); + if (get_device()->is_meshed) { + ERR(scad_synchronize()); gmshModelMeshGenerate(2, &ierr); ERR(gmsh_err_to_res_T(ierr)); - geometry->device->is_meshed = 1; + get_device()->is_meshed = 1; } - ERR(scad_device_synchronize(geometry->device)); + ERR(scad_synchronize()); gmshModelGetBoundary(data, sz, &tagout, &tagoutn, 1, 0, 0, &ierr); ERR(gmsh_err_to_res_T(ierr)); @@ -389,16 +409,18 @@ scad_stl_export_split goto error; } - if(geometry->device->need_synchro) { - ERR(scad_device_synchronize(geometry->device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz = geometry->gmsh_dimTags_n; data = geometry->gmsh_dimTags; ASSERT(sz % 2 == 0); - str_init(geometry->device->allocator, &filename_root); - str_init(geometry->device->allocator, &filename); + str_init(get_device()->allocator, &filename_root); + str_init(get_device()->allocator, &filename); str_initialized = 1; if(prefix) { ERR(str_set(&filename_root, prefix)); @@ -464,14 +486,16 @@ error: res_T scad_conformal_mesh - (struct scad_device* device) + (void) { int* dimTags = NULL; size_t dimTags_n; int ierr = 0; res_T res = RES_OK; - device->need_synchro = 1; + ERR(check_device()); + + get_device()->need_synchro = 1; gmshModelOccSynchronize(&ierr); ERR(gmsh_err_to_res_T(ierr)); gmshModelOccGetEntities(&dimTags, &dimTags_n, 3, &ierr); @@ -487,7 +511,7 @@ scad_conformal_mesh ERR(gmsh_err_to_res_T(ierr)); gmshModelMeshGenerate(2, &ierr); ERR(gmsh_err_to_res_T(ierr)); - device->is_meshed = 1; + get_device()->is_meshed = 1; exit: if(dimTags) free(dimTags); @@ -495,5 +519,3 @@ exit: error: goto exit; } - - diff --git a/src/scad.h b/src/scad.h @@ -41,11 +41,10 @@ struct mem_allocator; struct logger; /* Forward declaration of scad opaque data types */ -struct scad_device; /* Entry point of the library */ struct scad_geometry; /* Wrapping of dimTags gmsh description */ -/* A type to specify options for devices */ -struct scad_device_param { +/* A type to specify options for star-cad */ +struct scad_options { struct { double StlOneSolidPerSurface; double MeshSizeFromPoints; @@ -55,49 +54,48 @@ struct scad_device_param { } Mesh; }; -#define SCAD_INIT_DEFAULT__ \ +#define SCAD_DEFAULT_OPTIONS__ \ { { 2, 0, 1, 36, 0 } } -static const struct scad_device_param SCAD_INIT_DEFAULT = SCAD_INIT_DEFAULT__; +static const struct scad_options SCAD_DEFAULT_OPTIONS = SCAD_DEFAULT_OPTIONS__; BEGIN_DECLS /******************************************************************************* - * Device API - A device is the entry point of the scad library. - * Applications use a scad_device to create others scad resources. + * Init and Finalize calls. + * All other API calls must be enclosed between Init and Finalize. ******************************************************************************/ SCAD_API res_T -scad_device_create +scad_initialize (struct logger* logger, /* May be NULL <=> use default logger */ struct mem_allocator* allocator, /* May be NULL <=> use default allocator */ - const int verbose, /* Define the level of verbosity */ - struct scad_device** dev); + const int verbose); /* Define the level of verbosity */ -res_T -scad_device_set_params - (struct scad_device* device, - const struct scad_device_param* params); - -/* Explicitly synchronize current state with regard to recent geometry changes. - * Most synchronize calls should be automatically triggered when needed. */ SCAD_API res_T -scad_device_synchronize - (struct scad_device* device); +scad_finalize + (void); -SCAD_API res_T -scad_device_ref_get - (struct scad_device* dev); +res_T +scad_set_options + (const struct scad_options* options); /* May be NULL: set default */ +/* Explicitly synchronize the current state with regard to recent geometry changes. + * Most synchronize calls should be automatically triggered when needed. + * TODO: remove when no more needed! */ SCAD_API res_T -scad_device_ref_put - (struct scad_device* dev); +scad_synchronize + (void); /******************************************************************************* * Geometry API - A geometry is a primitive, a group of primitives, or the * result of an operation on geometries. - * If provided, names must be unique by device. + * If provided, names must be unique. ******************************************************************************/ +SCAD_API res_T +scad_scene_clear + (void); + /* `size' is the number of primitives of the geometry `geom' */ SCAD_API res_T scad_geometry_get_size @@ -108,8 +106,7 @@ scad_geometry_get_size * `dxdy' the extents along the x-, y-axes. */ SCAD_API res_T scad_add_rectangle - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ const double xyz[3], const double dxdy[2], struct scad_geometry** rectangle); /* Can be NULL: no handler returned. */ @@ -118,8 +115,7 @@ scad_add_rectangle * `radius'. */ SCAD_API res_T scad_add_disk - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ const double xyz[3], const double radius, struct scad_geometry** disk); /* Can be NULL: no handler returned. */ @@ -128,8 +124,7 @@ scad_add_disk * the list of points of coordinates x, y.*/ SCAD_API res_T scad_add_polygon - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ const double* x, const double* y, const double z, @@ -140,8 +135,7 @@ scad_add_polygon * `dxdydz' the extents along the x-, y- and z-axes. */ SCAD_API res_T scad_add_box - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ const double xyz[3], const double dxdydz[3], struct scad_geometry** box); /* Can be NULL: no handler returned. */ @@ -151,8 +145,7 @@ scad_add_box * `angle' argument defines the angular opening (from 0 to 2*Pi). */ SCAD_API res_T scad_add_cylinder - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ const double xyz[3], const double axis[3], const double rad, @@ -162,8 +155,7 @@ scad_add_cylinder /* Add a sphere of center `xyz' and radius `rad' to the scene. */ SCAD_API res_T scad_add_sphere - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ const double xyz[3], const double rad, struct scad_geometry** sphere); /* Can be NULL: no handler returned. */ @@ -173,8 +165,7 @@ scad_add_sphere * dim. */ SCAD_API res_T scad_create_group - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ const int dim, struct scad_geometry** geometries, const size_t count, @@ -182,14 +173,13 @@ scad_create_group SCAD_API res_T scad_conformal_mesh - (struct scad_device* device); + (void); /* Compute the boolean union (the fusion) of the geometries `geom1' and `geom2'. * Remove geom1 and geom2 from scene if `remove' is set. */ SCAD_API res_T scad_fuse_geometries - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ struct scad_geometry* geom1, struct scad_geometry* geom2, struct scad_geometry** out_geometry, @@ -199,8 +189,7 @@ scad_fuse_geometries * Remove geom1 and geom2 from scene if `remove' is set. */ SCAD_API res_T scad_cut_geometries - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ struct scad_geometry* geom1, struct scad_geometry* geom2, struct scad_geometry** out_geometry, @@ -211,8 +200,7 @@ scad_cut_geometries * Remove geom1 and geom2 from scene if `remove' is set. */ SCAD_API res_T scad_intersect_geometries - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ struct scad_geometry* geom1, struct scad_geometry* geom2, struct scad_geometry** out_geometry, @@ -222,8 +210,7 @@ scad_intersect_geometries * Remove geom1 and geom2 from scene if `remove' is set. */ SCAD_API res_T scad_geometries_common_boundaries - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ struct scad_geometry* geom1, struct scad_geometry* geom2, struct scad_geometry** out_geometry, @@ -237,8 +224,7 @@ scad_geometries_common_boundaries * Remove geom1 and geom2 from scene if `remove' is set. */ SCAD_API res_T scad_geometries_fragment - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ struct scad_geometry* geom1, struct scad_geometry* geom2, struct scad_geometry** out_geometry, @@ -247,8 +233,7 @@ scad_geometries_fragment /* Get the boundary of the geometry `geom'. */ SCAD_API res_T scad_geometry_boundary - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ struct scad_geometry* geom, struct scad_geometry** out); @@ -287,8 +272,7 @@ scad_geometry_extrude * `out_geometry' handler. */ SCAD_API res_T scad_step_import - (struct scad_device* device, - const char* filename, /* name of step file */ + (const char* filename, /* name of step file */ const char* name, /* Can be NULL */ struct scad_geometry*** out_geometry, size_t* out_geometry_n); diff --git a/src/scad_device.c b/src/scad_device.c @@ -24,20 +24,16 @@ #include <gmshc.h> -/* Count of devices */ -static size_t device_count = 0; - /******************************************************************************* * Local functions ******************************************************************************/ static void -device_release(ref_T* ref) +device_release(struct scad_device* dev) { - struct scad_device* dev; struct htable_names_iterator it, end; - int ierr = 0; - ASSERT(ref); - dev = CONTAINER_OF(ref, struct scad_device, ref); + + ASSERT(dev); + htable_names_begin(&dev->geometry_names, &it); htable_names_end(&dev->geometry_names, &end); while(!htable_names_iterator_eq(&it, &end)) { @@ -47,10 +43,6 @@ device_release(ref_T* ref) } htable_names_release(&dev->geometry_names); MEM_RM(dev->allocator, dev); - if(--device_count == 0) { - gmshFinalize(&ierr); - ASSERT(!ierr); - } } void @@ -76,97 +68,115 @@ log_warning(struct scad_device* dev, const char* msg, ...) } /******************************************************************************* + * The unique device in scad-cad + ******************************************************************************/ +static struct scad_device* g_device = NULL; + +/******************************************************************************* * Exported scad_device functions ******************************************************************************/ res_T -scad_device_create +check_device + (void) +{ + return g_device ? RES_OK : RES_BAD_ARG; +} + +struct scad_device* +get_device + (void) +{ + return g_device; +} + +res_T +scad_initialize (struct logger* logger, struct mem_allocator* mem_allocator, - const int verbose, - struct scad_device** out_dev) + const int verbose) { - struct scad_device* dev = NULL; struct mem_allocator* allocator; - /* Current gmsh implementation doesn't allow multiple devices - * Doesn't even define the device concept */ - int ierr = 0; res_T res = RES_OK; + int ierr; - if(!out_dev) { + if(g_device != NULL) { + log_error(g_device, "scad-star is already initialized.\n"); res = RES_BAD_ARG; goto error; } - - if(device_count != 0) { - if(verbose && logger) { - res = logger_print(logger, LOG_ERROR, - "scad_device_create can only be called once in a process lifetime."); - ASSERT(res == RES_OK); - } - res = RES_BAD_OP; - goto error; - } - if(device_count == 0) { - gmshInitialize(0, NULL, 1, 0, &ierr); - ERR(gmsh_err_to_res_T(ierr)); - } + gmshInitialize(0, NULL, 1, 0, &ierr); + ERR(gmsh_err_to_res_T(ierr)); allocator = mem_allocator ? mem_allocator : &mem_default_allocator; - dev = (struct scad_device*)MEM_CALLOC(allocator, 1, sizeof(struct scad_device)); - if(!dev) { + g_device + = (struct scad_device*)MEM_CALLOC(allocator, 1, sizeof(struct scad_device)); + if(!g_device) { res = RES_MEM_ERR; goto error; } - dev->logger = logger ? logger : LOGGER_DEFAULT; - dev->allocator = allocator; - htable_names_init(allocator, &dev->geometry_names); - dev->verbose = verbose; - ref_init(&dev->ref); - device_count++; + g_device->logger = logger ? logger : LOGGER_DEFAULT; + g_device->allocator = allocator; + htable_names_init(allocator, &g_device->geometry_names); + g_device->verbose = verbose; /* Init to default */ - scad_device_set_params(dev, NULL); + scad_set_options(NULL); exit: - if(out_dev) *out_dev = dev; return res; error: - if(dev) { - SCAD(device_ref_put(dev)); - dev = NULL; + if(g_device) { + device_release(g_device); + g_device = NULL; } goto exit; } res_T -scad_device_set_params - (struct scad_device* device, - const struct scad_device_param* params) +scad_finalize + (void) { res_T res = RES_OK; - const struct scad_device_param* actual_params - = params ? params : &SCAD_INIT_DEFAULT; + int ierr; + + ERR(check_device()); + + device_release(g_device); + g_device = NULL; + gmshFinalize(&ierr); + ERR(gmsh_err_to_res_T(ierr)); + +exit: + return res; +error: + goto exit; +} + +res_T +scad_set_options + (const struct scad_options* options) +{ + res_T res = RES_OK; + const struct scad_options* actual_options + = options ? options : &SCAD_DEFAULT_OPTIONS; int ierr = 0; - if(!device) { - res= RES_BAD_ARG; - goto error; - } + ERR(check_device()); gmshOptionSetNumber("Mesh.StlOneSolidPerSurface", - actual_params->Mesh.StlOneSolidPerSurface, &ierr); + actual_options->Mesh.StlOneSolidPerSurface, &ierr); ERR(gmsh_err_to_res_T(ierr)); gmshOptionSetNumber("Mesh.MeshSizeFromPoints", - actual_params->Mesh.MeshSizeFromPoints, &ierr); + actual_options->Mesh.MeshSizeFromPoints, &ierr); ERR(gmsh_err_to_res_T(ierr)); gmshOptionSetNumber("Mesh.MeshSizeFromCurvature", - actual_params->Mesh.MeshSizeFromCurvature, &ierr); + actual_options->Mesh.MeshSizeFromCurvature, &ierr); ERR(gmsh_err_to_res_T(ierr)); gmshOptionSetNumber("Mesh.MinimumElementsPerTwoPi", - actual_params->Mesh.MinimumElementsPerTwoPi, &ierr); + actual_options->Mesh.MinimumElementsPerTwoPi, &ierr); ERR(gmsh_err_to_res_T(ierr)); gmshOptionSetNumber("Mesh.MeshSizeExtendFromBoundary", - actual_params->Mesh.MeshSizeExtendFromBoundary, &ierr); + actual_options->Mesh.MeshSizeExtendFromBoundary, &ierr); ERR(gmsh_err_to_res_T(ierr)); exit: @@ -176,19 +186,3 @@ error: FUNC_NAME, res_to_cstr(res)); goto exit; } - -res_T -scad_device_ref_get(struct scad_device* dev) -{ - if(!dev) return RES_BAD_ARG; - ref_get(&dev->ref); - return RES_OK; -} - -res_T -scad_device_ref_put(struct scad_device* dev) -{ - if(!dev) return RES_BAD_ARG; - ref_put(&dev->ref, device_release); - return RES_OK; -} diff --git a/src/scad_device.h b/src/scad_device.h @@ -102,4 +102,15 @@ log_msg } } +/******************************************************************************* + * Exported scad_device functions + ******************************************************************************/ +LOCAL_SYM res_T +check_device + (void); + +LOCAL_SYM struct scad_device* +get_device + (void); + #endif diff --git a/src/scad_geometry.c b/src/scad_geometry.c @@ -31,20 +31,20 @@ ******************************************************************************/ static res_T scad_geometry_create - (struct scad_device* device, - const char* name, + (const char* name, struct scad_geometry** out_geometry) { res_T res = RES_OK; struct scad_geometry* geom = NULL; - ASSERT(device && out_geometry); + ASSERT(out_geometry); + if (name) { struct str str_name; - str_init(device->allocator, &str_name); + str_init(get_device()->allocator, &str_name); ERR(str_set(&str_name, name)); - if(name && htable_names_find(&device->geometry_names, &str_name)) { + if(name && htable_names_find(&get_device()->geometry_names, &str_name)) { /* if defined, names must be unique */ res = RES_BAD_ARG; goto error; @@ -52,23 +52,22 @@ scad_geometry_create str_release(&str_name); } - geom = (struct scad_geometry*)MEM_CALLOC(device->allocator, 1, + geom = (struct scad_geometry*)MEM_CALLOC(get_device()->allocator, 1, sizeof(*geom)); if(!geom) { res = RES_MEM_ERR; goto error; } - str_init(device->allocator, &geom->name); - geom->device = device; - device->need_synchro = 1; + str_init(get_device()->allocator, &geom->name); + get_device()->need_synchro = 1; if(name) { struct str str_name; - str_init(device->allocator, &str_name); + str_init(get_device()->allocator, &str_name); ERR(str_set(&str_name, name)); ERR(str_copy(&geom->name, &str_name)); - ERR(htable_names_set(&device->geometry_names, &str_name, &geom)); + ERR(htable_names_set(&get_device()->geometry_names, &str_name, &geom)); str_release(&str_name); } @@ -83,7 +82,6 @@ error: goto end; } - static void remove_dimTags (struct scad_geometry* geom) @@ -107,8 +105,10 @@ scad_geometry_release int ierr; res_T res = RES_OK; ASSERT(geom); - allocator = geom->device->allocator; - geom->device->need_synchro = 1; + + ERR(check_device()); + allocator = get_device()->allocator; + get_device()->need_synchro = 1; sz = geom->gmsh_dimTags_n; data = geom->gmsh_dimTags; @@ -142,6 +142,26 @@ error: /****************************************************************************** * Exported functions *****************************************************************************/ +res_T +scad_scene_clear + (void) +{ + res_T res = RES_OK; + int ierr; + + ERR(check_device()); + + /* FIXME: not sure remove is needed. */ + gmshModelRemove(&ierr); + ERR(gmsh_err_to_res_T(ierr)); + gmshClear(&ierr); + ERR(gmsh_err_to_res_T(ierr)); + +end: + return res; +error: + goto end; +} res_T scad_geometry_get_size @@ -152,6 +172,8 @@ scad_geometry_get_size if (!geom) goto error; + ERR(check_device()); + *size = geom->gmsh_dimTags_n / 2; exit: @@ -164,8 +186,7 @@ error: res_T scad_add_rectangle - (struct scad_device* device, - const char* name, + (const char* name, const double xyz[3], const double dxdy[2], struct scad_geometry** out_geometry) @@ -174,15 +195,17 @@ scad_add_rectangle struct scad_geometry* geom = NULL; res_T res = RES_OK; - if(!device || !xyz || !dxdy) { + if(!xyz || !dxdy) { res = RES_BAD_ARG; goto error; } + ERR(check_device()); + gmsh_ID = gmshModelOccAddRectangle(SPLIT3(xyz), SPLIT2(dxdy), -1, 0, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = 2; geom->gmsh_dimTags = malloc(geom->gmsh_dimTags_n * sizeof(int)); if(! geom->gmsh_dimTags_n) { @@ -205,8 +228,7 @@ error: res_T scad_add_disk - (struct scad_device* device, - const char* name, + (const char* name, const double xyz[3], const double radius, struct scad_geometry** out_geometry) @@ -215,15 +237,17 @@ scad_add_disk struct scad_geometry* geom = NULL; res_T res = RES_OK; - if(!device || !xyz || radius <= 0) { + if(!xyz || radius <= 0) { res = RES_BAD_ARG; goto error; } + ERR(check_device()); + gmsh_ID = gmshModelOccAddDisk(SPLIT3(xyz), radius, radius, -1, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = 2; geom->gmsh_dimTags = malloc(geom->gmsh_dimTags_n * sizeof(int)); if(! geom->gmsh_dimTags_n) { @@ -246,8 +270,7 @@ error: res_T scad_add_polygon - (struct scad_device* device, - const char* name, + (const char* name, const double* x, const double* y, const double z, @@ -262,11 +285,13 @@ scad_add_polygon int loop; res_T res = RES_OK; - if(!device || !x || !y || count < 3) { + if(!x || !y || count < 3) { res = RES_BAD_ARG; goto error; } + ERR(check_device()); + points = malloc(count * sizeof(int)); for (i=0; i<count; ++i) { points[i] = gmshModelOccAddPoint(x[i], y[i], z, -1, -1, &ierr); @@ -288,7 +313,7 @@ scad_add_polygon gmsh_ID = gmshModelOccAddPlaneSurface(&loop, 1, -1, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = 2; geom->gmsh_dimTags = malloc(geom->gmsh_dimTags_n * sizeof(int)); if(! geom->gmsh_dimTags_n) { @@ -310,10 +335,10 @@ error: } goto exit; } + res_T scad_add_box - (struct scad_device* device, - const char* name, + (const char* name, const double xyz[3], const double dxdydz[3], struct scad_geometry** out_geometry) @@ -322,15 +347,17 @@ scad_add_box struct scad_geometry* geom = NULL; res_T res = RES_OK; - if(!device || !xyz || !dxdydz) { + if(!xyz || !dxdydz) { res = RES_BAD_ARG; goto error; } + ERR(check_device()); + gmsh_ID = gmshModelOccAddBox(SPLIT3(xyz), SPLIT3(dxdydz), -1, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = 2; geom->gmsh_dimTags = malloc(geom->gmsh_dimTags_n * sizeof(int)); if(! geom->gmsh_dimTags_n) { @@ -353,8 +380,7 @@ error: res_T scad_add_cylinder - (struct scad_device* device, - const char* name, + (const char* name, const double xyz[3], const double axis[3], const double rad, @@ -365,16 +391,18 @@ scad_add_cylinder struct scad_geometry* geom = NULL; res_T res = RES_OK; - if(!device || !xyz || !axis || rad <= 0 || angle < 0 || angle > 2*PI) { + if(!xyz || !axis || rad <= 0 || angle < 0 || angle > 2*PI) { res = RES_BAD_ARG; goto error; } + ERR(check_device()); + gmsh_ID = gmshModelOccAddCylinder(SPLIT3(xyz), SPLIT3(axis), rad, -1, angle, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = 2; geom->gmsh_dimTags = malloc(geom->gmsh_dimTags_n * sizeof(int)); if(! geom->gmsh_dimTags_n) { @@ -397,8 +425,7 @@ error: int scad_add_sphere - (struct scad_device* device, - const char* name, + (const char* name, const double xyz[3], const double rad, struct scad_geometry** out_geometry) @@ -407,15 +434,17 @@ scad_add_sphere struct scad_geometry* geom = NULL; res_T res = RES_OK; - if(!device || !xyz || rad <= 0) { + if(!xyz || rad <= 0) { res = RES_BAD_ARG; goto error; } + ERR(check_device()); + gmsh_ID = gmshModelOccAddSphere(SPLIT3(xyz), rad, -1, -PI/2, PI/2, 2*PI, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = 2; geom->gmsh_dimTags = malloc(geom->gmsh_dimTags_n * sizeof(int)); if(! geom->gmsh_dimTags_n) { @@ -438,8 +467,7 @@ error: res_T scad_create_group - (struct scad_device* device, - const char* name, + (const char* name, const int dim, struct scad_geometry** geometries, const size_t count, @@ -451,13 +479,15 @@ scad_create_group int* ids = NULL; res_T res = RES_OK; - if(!device || !geometries || (count == 0) || !out_geometry) { + if(!geometries || (count == 0) || !out_geometry) { res = RES_BAD_ARG; goto error; } - if(device->need_synchro) { - ERR(scad_device_synchronize(device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz = 0; @@ -481,7 +511,7 @@ scad_create_group ASSERT(gid > 0); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->is_group = gid; geom->group_dim = dim; geom->gmsh_dimTags_n = 2 * sz; @@ -513,8 +543,7 @@ error: res_T scad_fuse_geometries - (struct scad_device* device, - const char* name, + (const char* name, struct scad_geometry* geom1, struct scad_geometry* geom2, struct scad_geometry** out_geometry, @@ -530,15 +559,15 @@ scad_fuse_geometries struct scad_geometry* geom = NULL; res_T res = RES_OK; - if(!device || !geom1 || !geom2 || !out_geometry - || geom1->device != device || geom2->device != device) - { + if(!geom1 || !geom2 || !out_geometry) { res = RES_BAD_ARG; goto error; } - if(device->need_synchro) { - ERR(scad_device_synchronize(device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz1 = geom1->gmsh_dimTags_n; @@ -549,7 +578,7 @@ scad_fuse_geometries &mapnn, -1, remove, remove, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = tagoutn; geom->gmsh_dimTags = tagout; if(remove) { /* FIXME: not sure of this! */ @@ -572,8 +601,7 @@ error: res_T scad_cut_geometries - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ struct scad_geometry* geom1, struct scad_geometry* geom2, struct scad_geometry** out_geometry, @@ -589,15 +617,15 @@ scad_cut_geometries struct scad_geometry* geom = NULL; res_T res = RES_OK; - if(!device || !geom1 || !geom2 || !out_geometry - || geom1->device != device || geom2->device != device) - { + if(!geom1 || !geom2 || !out_geometry) { res = RES_BAD_ARG; goto error; } - if(device->need_synchro) { - ERR(scad_device_synchronize(device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz1 = geom1->gmsh_dimTags_n; @@ -608,7 +636,7 @@ scad_cut_geometries &mapnn, -1, remove, remove, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = tagoutn; geom->gmsh_dimTags = tagout; if(remove) { /* FIXME: not sure of this! */ @@ -631,8 +659,7 @@ error: res_T scad_intersect_geometries - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ struct scad_geometry* geom1, struct scad_geometry* geom2, struct scad_geometry** out_geometry, @@ -648,15 +675,15 @@ scad_intersect_geometries struct scad_geometry* geom = NULL; res_T res = RES_OK; - if(!device || !geom1 || !geom2 || !out_geometry - || geom1->device != device || geom2->device != device) - { + if(!geom1 || !geom2 || !out_geometry) { res = RES_BAD_ARG; goto error; } - if(device->need_synchro) { - ERR(scad_device_synchronize(device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz1 = geom1->gmsh_dimTags_n; @@ -667,7 +694,7 @@ scad_intersect_geometries &mapnn, -1, remove, remove, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = tagoutn; geom->gmsh_dimTags = tagout; if(remove) { /* FIXME: not sure of this! */ @@ -690,8 +717,7 @@ error: res_T scad_geometries_common_boundaries - (struct scad_device* device, - const char* name, /* Can be NULL */ + (const char* name, /* Can be NULL */ struct scad_geometry* geom1, struct scad_geometry* geom2, struct scad_geometry** out_geometry, @@ -710,15 +736,15 @@ scad_geometries_common_boundaries struct scad_geometry* geom = NULL; res_T res = RES_OK; - if(!device || !geom1 || !geom2 || !out_geometry - || geom1->device != device || geom2->device != device) - { + if(!geom1 || !geom2 || !out_geometry) { res = RES_BAD_ARG; goto error; } - if(device->need_synchro) { - ERR(scad_device_synchronize(device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz1 = geom1->gmsh_dimTags_n; @@ -733,7 +759,7 @@ scad_geometries_common_boundaries &mapn, &mapnn, -1, 0/*no delete*/, 0/*no delete*/, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = tagoutn; geom->gmsh_dimTags = tagout; if(remove) { /* FIXME: not sure of this! */ @@ -773,14 +799,16 @@ scad_geometry_rotate goto error; } - if(geom->device->need_synchro) { - ERR(scad_device_synchronize(geom->device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz = geom->gmsh_dimTags_n; data = geom->gmsh_dimTags; gmshModelOccRotate(data, sz, SPLIT3(pt), SPLIT3(axis), angle, &ierr); - geom->device->need_synchro = 1; + get_device()->need_synchro = 1; ERR(gmsh_err_to_res_T(ierr)); exit: @@ -811,18 +839,20 @@ scad_geometry_extrude goto error; } - if(geom->device->need_synchro) { - ERR(scad_device_synchronize(geom->device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz = geom->gmsh_dimTags_n; data = geom->gmsh_dimTags; gmshModelOccExtrude(data, sz, SPLIT3(dxdydz), &tagout, &tagoutn, NULL, 0, NULL, 0, 0 , &ierr); - geom->device->need_synchro = 1; + get_device()->need_synchro = 1; ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(geom->device, name, &extrude_geom)); + ERR(scad_geometry_create(name, &extrude_geom)); /* keep only 3D entities */ /* TODO : NOT SURE OF THE CONCEPT */ for (i=0; i<tagoutn/2; ++i) { @@ -869,17 +899,19 @@ scad_geometry_copy goto error; } - if(geom->device->need_synchro) { - ERR(scad_device_synchronize(geom->device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz1 = geom->gmsh_dimTags_n; data1 = geom->gmsh_dimTags; gmshModelOccCopy(data1, sz1, &data2, &sz2, &ierr); - geom->device->need_synchro = 1; + get_device()->need_synchro = 1; ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(geom->device, name, copy)); + ERR(scad_geometry_create(name, copy)); (*copy)->gmsh_dimTags_n = sz2; (*copy)->gmsh_dimTags = data2; @@ -904,14 +936,16 @@ scad_geometry_translate goto error; } - if(geom->device->need_synchro) { - ERR(scad_device_synchronize(geom->device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz = geom->gmsh_dimTags_n; data = geom->gmsh_dimTags; gmshModelOccTranslate(data, sz, SPLIT3(dxdydz), &ierr); - geom->device->need_synchro = 1; + get_device()->need_synchro = 1; ERR(gmsh_err_to_res_T(ierr)); exit: @@ -922,8 +956,7 @@ error: res_T scad_geometries_fragment - (struct scad_device* device, - const char* name, + (const char* name, struct scad_geometry* geom1, struct scad_geometry* geom2, struct scad_geometry** out_geometry, @@ -939,15 +972,15 @@ scad_geometries_fragment struct scad_geometry* geom = NULL; res_T res = RES_OK; - if(!device || !geom1 || !geom2 || !out_geometry - || geom1->device != device || geom2->device != device) - { + if(!geom1 || !geom2 || !out_geometry) { res = RES_BAD_ARG; goto error; } - if(device->need_synchro) { - ERR(scad_device_synchronize(device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz1 = geom1->gmsh_dimTags_n; @@ -958,7 +991,7 @@ scad_geometries_fragment &mapnn, -1, remove, remove, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = tagoutn; geom->gmsh_dimTags = tagout; if(remove) { /* FIXME: not sure of this! */ @@ -977,8 +1010,7 @@ error: res_T scad_geometry_boundary - (struct scad_device* device, - const char* name, + (const char* name, struct scad_geometry* geom, struct scad_geometry** out_geometry) { @@ -988,13 +1020,13 @@ scad_geometry_boundary int ierr = 0; res_T res = RES_OK; - if(!device || !geom || !out_geometry || geom->device != device) { + if(!geom || !out_geometry) { res = RES_BAD_ARG; goto error; } - if(device->need_synchro) { - ERR(scad_device_synchronize(device)); + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } sz = geom->gmsh_dimTags_n; @@ -1002,7 +1034,7 @@ scad_geometry_boundary gmshModelGetBoundary(data, sz, &tagout, &tagoutn, 1, 0, 0, &ierr); ERR(gmsh_err_to_res_T(ierr)); - ERR(scad_geometry_create(device, name, &geom)); + ERR(scad_geometry_create(name, &geom)); geom->gmsh_dimTags_n = tagoutn; geom->gmsh_dimTags = tagout; @@ -1015,8 +1047,7 @@ error: res_T scad_step_import - (struct scad_device* device, - const char* filename, + (const char* filename, const char* name, struct scad_geometry*** out_geometry, size_t* out_geometry_n) @@ -1026,13 +1057,15 @@ scad_step_import size_t tagoutn, i; res_T res = RES_OK; - if(!device || !filename) { + if(!filename) { res = RES_BAD_ARG; goto error; } - if(device->need_synchro) { - ERR(scad_device_synchronize(device)); + ERR(check_device()); + + if(get_device()->need_synchro) { + ERR(scad_synchronize()); } gmshModelOccImportShapes(filename, @@ -1047,11 +1080,11 @@ scad_step_import for (i=0; i<tagoutn/2; ++i) { struct str strname; - str_init(device->allocator, &strname); + str_init(get_device()->allocator, &strname); ERR(str_set(&strname, name)); ERR(str_append_printf(&strname,"_%lu", (unsigned long)i)); - ERR(scad_geometry_create(device, str_cget(&strname), &(*out_geometry)[i])); + ERR(scad_geometry_create(str_cget(&strname), &(*out_geometry)[i])); (*out_geometry)[i]->gmsh_dimTags_n = 2; (*out_geometry)[i]->gmsh_dimTags = malloc(2 * sizeof(int)); (*out_geometry)[i]->gmsh_dimTags[0] = tagout[2*i]; diff --git a/src/scad_geometry.h b/src/scad_geometry.h @@ -21,12 +21,9 @@ #include <rsys/rsys.h> #include <rsys/str.h> -struct scad_device; - struct scad_geometry { int* gmsh_dimTags; size_t gmsh_dimTags_n; - struct scad_device* device; struct str name; int is_group, group_dim; }; diff --git a/src/test1.c b/src/test1.c @@ -51,39 +51,39 @@ main(int argc, char* argv[]) struct scad_geometry* f2 = NULL; struct scad_geometry* sphere = NULL; struct scad_geometry* geoms[2]; - struct scad_device* device = NULL; struct mem_allocator allocator; (void)argc; (void)argv; OK(mem_init_proxy_allocator(&allocator, &mem_default_allocator)); - OK(scad_device_create(NULL, &allocator, 1, &device)); - OK(scad_add_cylinder(device, "c1", p1, d1, 2, PI, &geom1)); - OK(scad_add_box(device, "b1", p2, d2, &geom2)); + OK(scad_initialize(NULL, &allocator, 1)); + + OK(scad_add_cylinder("c1", p1, d1, 2, PI, &geom1)); + OK(scad_add_box("b1", p2, d2, &geom2)); OK(scad_stl_export(geom1, NULL, 1)); OK(scad_stl_export(geom2, NULL, 1)); geoms[0] = geom1; geoms[1] = geom2; - OK(scad_create_group(device, "g1", 3, geoms, 2, &group1)); + OK(scad_create_group("g1", 3, geoms, 2, &group1)); OK(scad_stl_export(group1, NULL, 1)); - OK(scad_conformal_mesh(device)); + OK(scad_conformal_mesh()); OK(scad_stl_export_split(group1, "conformal", 1)); - OK(scad_add_cylinder(device, "cyl", p1, d1, 1, 2*PI, &cyl)); + OK(scad_add_cylinder("cyl", p1, d1, 1, 2*PI, &cyl)); OK(scad_stl_export(cyl, NULL, 1)); - OK(scad_fuse_geometries(device, "fused1", geom1, cyl, &f1, 0)); + OK(scad_fuse_geometries("fused1", geom1, cyl, &f1, 0)); OK(scad_stl_export(f1, NULL, 1)); - OK(scad_add_sphere(device, "s1", p1, 1, &sphere)); - OK(scad_fuse_geometries(device, "fused2", group1, sphere, &f2, 0)); + OK(scad_add_sphere("s1", p1, 1, &sphere)); + OK(scad_fuse_geometries("fused2", group1, sphere, &f2, 0)); OK(scad_stl_export(f2, NULL, 0)); -exit: - if(device) SCAD(device_ref_put(device)); + OK(scad_finalize()); +exit: check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHK(mem_allocated_size() == 0);