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:
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);