commit 58956b86b55b42de5e7e72c48beb79a4234c0b58
parent 5ac8360cb5b2f222ac5223599560dffce88a5ae0
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Fri, 13 Jan 2023 11:43:51 +0100
Improve star-cad geometries lifetime management
Diffstat:
8 files changed, 138 insertions(+), 65 deletions(-)
diff --git a/src/cg_city.c b/src/cg_city.c
@@ -160,6 +160,7 @@ city_cad_build(struct city* city)
ERR(scad_initialize(city->logger, city->allocator, city->verbosisty_level));
scad_initialized = 1;
options.Mesh.MeshSizeFromPoints = 0;
+ options.Misc.LogOpenCascadeTagsRefCounting = Scad_log_only_undeleted;
ERR(scad_set_options(&options));
/* iterate on buildings */
@@ -192,12 +193,13 @@ city_ground_build(struct city* city)
struct ground ground = GROUND_NULL__;
size_t i;
- ERR(ground_allocate(city->allocator, city->buildings_count, &ground));
+ ERR(ground_init(city->allocator, city->logger, city->buildings_count, &ground));
/* Initialize star-cad */
ERR(scad_initialize(city->logger, city->allocator, city->verbosisty_level));
scad_initialized = 1;
options.Mesh.MeshSizeFromPoints = 0;
+ options.Misc.LogOpenCascadeTagsRefCounting = Scad_log_only_undeleted;
ERR(scad_set_options(&options));
/* iterate on buildings */
@@ -214,7 +216,7 @@ city_ground_build(struct city* city)
ERR(ground_export_stl(&ground, city->binary_export));
exit:
- ground_release(city->allocator, &ground);
+ ground_clear(city->allocator, &ground);
if(scad_initialized) CHK(RES_OK == scad_finalize());
return res;
error:
diff --git a/src/cg_city_parsing.c b/src/cg_city_parsing.c
@@ -32,7 +32,7 @@
res_T
parse_city
- (const char* name,
+ (const char* filename,
struct mem_allocator* allocator,
struct logger* logger,
const struct cyaml_config* config,
@@ -42,19 +42,22 @@ parse_city
struct parsed_city *parsed = NULL;
cyaml_err_t err;
- ASSERT(allocator && logger && name && config && out_parsed);
+ ASSERT(allocator && logger && filename && config && out_parsed);
- err = cyaml_load_file(name, config, &city_schema, (void**)&parsed, NULL);
+ err = cyaml_load_file(filename, config, &city_schema, (void**)&parsed, NULL);
ERR(cyaml_err_to_res_T(err));
parsed->allocator = allocator;
parsed->logger = logger;
+ str_init(allocator, &parsed->filename);
+ ERR(str_set(&parsed->filename, filename));
exit:
*out_parsed = parsed;
return res;
error:
- logger_print(logger, LOG_ERROR, "Error parsing city map file '%s'.\n", name);
+ logger_print(logger, LOG_ERROR,
+ "Error parsing city map file '%s'.\n", filename);
release_parsed_city(config, parsed);
parsed = NULL;
goto exit;
@@ -71,6 +74,7 @@ release_parsed_city
ASSERT(config);
+ str_release(&parsed->filename);
err = cyaml_free(config, &city_schema, parsed, 1);
CHK(RES_OK == cyaml_err_to_res_T(err));
}
diff --git a/src/cg_city_parsing_schemas.h b/src/cg_city_parsing_schemas.h
@@ -22,6 +22,8 @@
#include "cg_constructive_modes_parsing_schemas.h"
+#include <rsys/str.h>
+
#include <cyaml/cyaml.h>
struct mem_allocator;
@@ -51,6 +53,7 @@ struct parsed_city {
struct logger* logger;
struct parsed_city_building* city_building_list;
struct parsed_ground ground;
+ struct str filename;
unsigned city_building_list_count;
};
diff --git a/src/cg_constructive_mode_0.c b/src/cg_constructive_mode_0.c
@@ -621,6 +621,11 @@ release_cad_cmode_0
}
if(data_cad->boundary) SCAD(geometry_delete(data_cad->boundary));
+ if(data_cad->cavity) SCAD(geometry_delete(data_cad->cavity));
+ if(data_cad->floor) SCAD(geometry_delete(data_cad->floor));
+ if(data_cad->ground_connection) SCAD(geometry_delete(data_cad->ground_connection));
+ if(data_cad->roof) SCAD(geometry_delete(data_cad->roof));
+ if(data_cad->wall) SCAD(geometry_delete(data_cad->wall));
for(i = 0; i < data_cad->n_connection; i++) {
SCAD(geometry_delete(data_cad->connection[i]));
}
diff --git a/src/cg_constructive_mode_1.c b/src/cg_constructive_mode_1.c
@@ -896,29 +896,38 @@ build_boundary
/* Ensure enough room for all geometries without error nor mem move */
ERR(darray_geometries_reserve(&array, 14));
- darray_geometries_push_back(&array, &data_cad->wall);
- darray_geometries_push_back(&array, &data_cad->roof);
- darray_geometries_push_back(&array, &data_cad->floor);
- darray_geometries_push_back(&array, &data_cad->habitable_cavity);
- darray_geometries_push_back(&array, &data_cad->fake_ground);
- if (data_cad->foundation)
- darray_geometries_push_back(&array, &data_cad->foundation);
- if (data_cad->intermediate_floor)
- darray_geometries_push_back(&array, &data_cad->intermediate_floor);
- if (data_cad->external_insulation)
- darray_geometries_push_back(&array, &data_cad->external_insulation);
- if (data_cad->internal_insulation)
- darray_geometries_push_back(&array, &data_cad->internal_insulation);
- if (data_cad->roof_insulation)
- darray_geometries_push_back(&array, &data_cad->roof_insulation);
- if (data_cad->floor_insulation)
- darray_geometries_push_back(&array, &data_cad->floor_insulation);
- if (data_cad->attic_cavity)
- darray_geometries_push_back(&array, &data_cad->attic_cavity);
- if (data_cad->crawlspace_cavity)
- darray_geometries_push_back(&array, &data_cad->crawlspace_cavity);
- if (data_cad->glass)
- darray_geometries_push_back(&array, &data_cad->glass);
+ ERR(darray_geometries_push_back(&array, &data_cad->wall));
+ ERR(darray_geometries_push_back(&array, &data_cad->roof));
+ ERR(darray_geometries_push_back(&array, &data_cad->floor));
+ ERR(darray_geometries_push_back(&array, &data_cad->habitable_cavity));
+ ERR(darray_geometries_push_back(&array, &data_cad->fake_ground));
+ if (data_cad->foundation) {
+ ERR(darray_geometries_push_back(&array, &data_cad->foundation));
+ }
+ if (data_cad->intermediate_floor) {
+ ERR(darray_geometries_push_back(&array, &data_cad->intermediate_floor));
+ }
+ if (data_cad->external_insulation) {
+ ERR(darray_geometries_push_back(&array, &data_cad->external_insulation));
+ }
+ if (data_cad->internal_insulation) {
+ ERR(darray_geometries_push_back(&array, &data_cad->internal_insulation));
+ }
+ if (data_cad->roof_insulation) {
+ ERR(darray_geometries_push_back(&array, &data_cad->roof_insulation));
+ }
+ if (data_cad->floor_insulation) {
+ ERR(darray_geometries_push_back(&array, &data_cad->floor_insulation));
+ }
+ if (data_cad->attic_cavity) {
+ ERR(darray_geometries_push_back(&array, &data_cad->attic_cavity));
+ }
+ if (data_cad->crawlspace_cavity) {
+ ERR(darray_geometries_push_back(&array, &data_cad->crawlspace_cavity));
+ }
+ if (data_cad->glass) {
+ ERR(darray_geometries_push_back(&array, &data_cad->glass));
+ }
count = darray_geometries_size_get(&array);
list = darray_geometries_data_get(&array);
@@ -931,14 +940,14 @@ build_boundary
boundaryname = str_get(&name);
ERR(scad_geometries_common_boundaries(boundaryname, list, count,
&data_cad->wall, 1, &bound));
- darray_geometries_push_back(boundary, &bound);
+ ERR(darray_geometries_push_back(boundary, &bound));
ERR(str_set(&name, prefix));
ERR(str_append(&name, "_boundary_roof"));
boundaryname = str_get(&name);
ERR(scad_geometries_common_boundaries(boundaryname, list, count,
&data_cad->roof, 1, &bound));
- darray_geometries_push_back(boundary, &bound);
+ ERR(darray_geometries_push_back(boundary, &bound));
if (data_cad->glass) {
ERR(str_set(&name, prefix));
@@ -946,7 +955,7 @@ build_boundary
boundaryname = str_get(&name);
ERR(scad_geometries_common_boundaries(boundaryname, list, count,
&data_cad->glass, 1, &bound));
- darray_geometries_push_back(boundary, &bound);
+ ERR(darray_geometries_push_back(boundary, &bound));
}
if (data_cad->external_insulation) {
@@ -955,7 +964,7 @@ build_boundary
boundaryname = str_get(&name);
ERR(scad_geometries_common_boundaries(boundaryname, list, count,
&data_cad->external_insulation, 1, &bound));
- darray_geometries_push_back(boundary, &bound);
+ ERR(darray_geometries_push_back(boundary, &bound));
}
if (data_cad->internal_insulation) {
@@ -966,7 +975,11 @@ build_boundary
ERR(scad_geometries_common_boundaries(boundaryname, list, count,
&data_cad->internal_insulation, 1, &bound));
ERR(scad_geometry_get_count(bound, &bcount));
- if (bcount>0) darray_geometries_push_back(boundary, &bound);
+ if (bcount > 0) {
+ ERR(darray_geometries_push_back(boundary, &bound));
+ } else {
+ SCAD(geometry_delete(bound));
+ }
}
exit:
@@ -999,14 +1012,14 @@ build_connection
#define CREATE_CONNECT(G1,G2,SUFFIX) ERR(str_set(&name, prefix));\
ERR(str_append(&name, SUFFIX));\
cname = str_get(&name);\
- ERR(scad_geometries_common_boundaries\
- (cname,\
- &data_cad->G1, 1,\
- &data_cad->G2, 1,\
- &connect));\
+ ERR(scad_geometries_common_boundaries(cname, &data_cad->G1, 1,\
+ &data_cad->G2, 1, &connect));\
ERR(scad_geometry_get_count(connect, &count)); \
- if (count>0) { ERR(darray_geometries_push_back(connection, &connect)); }
-
+ if (count > 0) { \
+ ERR(darray_geometries_push_back(connection, &connect)); \
+ } else { \
+ SCAD(geometry_delete(connect)); \
+ }
/* -------------------------------------------------------------------------*/
/* habitable cavity connections */
@@ -1124,11 +1137,18 @@ build_fake_ground
/* Ensure enough room for all geometries without error nor mem move */
ERR(darray_geometries_reserve(&array, 4));
- if (cad->foundation) darray_geometries_push_back(&array, &cad->foundation);
- if (cad->crawlspace_cavity) darray_geometries_push_back(&array, &cad->crawlspace_cavity);
- if (cad->floor) darray_geometries_push_back(&array, &cad->floor);
- if (cad->floor_insulation)
- darray_geometries_push_back(&array, &cad->floor_insulation);
+ if (cad->foundation) {
+ ERR(darray_geometries_push_back(&array, &cad->foundation));
+ }
+ if (cad->crawlspace_cavity) {
+ ERR(darray_geometries_push_back(&array, &cad->crawlspace_cavity));
+ }
+ if (cad->floor) {
+ ERR(darray_geometries_push_back(&array, &cad->floor));
+ }
+ if (cad->floor_insulation) {
+ ERR(darray_geometries_push_back(&array, &cad->floor_insulation));
+ }
count = darray_geometries_size_get(&array);
list = darray_geometries_data_get(&array);
@@ -1182,14 +1202,27 @@ building_ground_connection
/* Ensure enough room for all geometries without error nor mem move */
ERR(darray_geometries_reserve(&array, 6));
- if (cad->foundation) darray_geometries_push_back(&array, &cad->foundation);
- if (cad->crawlspace_cavity) darray_geometries_push_back(&array, &cad->crawlspace_cavity);
- if (cad->floor) darray_geometries_push_back(&array, &cad->floor);
- if (cad->floor_insulation)
- darray_geometries_push_back(&array, &cad->floor_insulation);
- if (cad->external_insulation)
- darray_geometries_push_back(&array, &cad->external_insulation);
- if (cad->wall) darray_geometries_push_back(&array, &cad->wall);
+ if (cad->foundation) {
+ ERR(darray_geometries_push_back(&array, &cad->foundation));
+ }
+ if (cad->crawlspace_cavity) {
+ ERR(darray_geometries_push_back(&array, &cad->crawlspace_cavity));
+ }
+ if (cad->attic_cavity) {
+ ERR(darray_geometries_push_back(&array, &cad->attic_cavity));
+ }
+ if (cad->floor) {
+ ERR(darray_geometries_push_back(&array, &cad->floor));
+ }
+ if (cad->floor_insulation) {
+ ERR(darray_geometries_push_back(&array, &cad->floor_insulation));
+ }
+ if (cad->external_insulation) {
+ ERR(darray_geometries_push_back(&array, &cad->external_insulation));
+ }
+ if (cad->wall) {
+ ERR(darray_geometries_push_back(&array, &cad->wall));
+ }
count = darray_geometries_size_get(&array);
list = darray_geometries_data_get(&array);
@@ -1534,6 +1567,21 @@ release_cad_cmode_1
goto error;
}
+ if(data_cad->attic_cavity) SCAD(geometry_delete(data_cad->attic_cavity));
+ if(data_cad->crawlspace_cavity) SCAD(geometry_delete(data_cad->crawlspace_cavity));
+ if(data_cad->external_insulation) SCAD(geometry_delete(data_cad->external_insulation));
+ if(data_cad->fake_ground) SCAD(geometry_delete(data_cad->fake_ground));
+ if(data_cad->floor) SCAD(geometry_delete(data_cad->floor));
+ if(data_cad->floor_insulation) SCAD(geometry_delete(data_cad->floor_insulation));
+ if(data_cad->foundation) SCAD(geometry_delete(data_cad->foundation));
+ if(data_cad->glass) SCAD(geometry_delete(data_cad->glass));
+ if(data_cad->ground_connection) SCAD(geometry_delete(data_cad->ground_connection));
+ if(data_cad->habitable_cavity) SCAD(geometry_delete(data_cad->habitable_cavity));
+ if(data_cad->intermediate_floor) SCAD(geometry_delete(data_cad->intermediate_floor));
+ if(data_cad->internal_insulation) SCAD(geometry_delete(data_cad->internal_insulation));
+ if(data_cad->roof) SCAD(geometry_delete(data_cad->roof));
+ if(data_cad->roof_insulation) SCAD(geometry_delete(data_cad->roof_insulation));
+ if(data_cad->wall) SCAD(geometry_delete(data_cad->wall));
for(i = 0; i < darray_geometries_size_get(&data_cad->boundary); i++) {
struct scad_geometry* b = darray_geometries_data_get(&data_cad->boundary)[i];
ERR(scad_geometry_delete(b));
diff --git a/src/cg_ground.c b/src/cg_ground.c
@@ -32,7 +32,6 @@ ground_build_cad
res_T res = RES_OK;
double origin[3];
double extent[3];
- struct scad_geometry* ground_box = NULL;
struct scad_geometry* bound = NULL;
if (!city || !ground) {
@@ -53,8 +52,8 @@ ground_build_cad
goto error;
}
- ERR(scad_add_box(NULL, origin, extent, &ground_box));
- ERR(scad_geometry_boundary(NULL, &ground_box, 1, &bound));
+ ERR(scad_add_box(NULL, origin, extent, &ground->box));
+ ERR(scad_geometry_boundary(NULL, &ground->box, 1, &bound));
ERR(scad_cut_geometries(NULL, &bound, 1,
ground->footprints, ground->footprints_count, &ground->boundary));
@@ -80,16 +79,20 @@ error:
}
res_T
-ground_allocate
+ground_init
(struct mem_allocator* allocator,
+ struct logger* logger,
const size_t count,
struct ground* ground)
{
res_T res = RES_OK;
+ (void)logger;
+ ground->box = NULL;
+ ground->boundary = NULL;
ground->footprints_count = count;
ground->footprints
- = MEM_ALLOC(allocator, ground->footprints_count * sizeof(*ground->footprints));
+ = MEM_CALLOC(allocator, ground->footprints_count, sizeof(*ground->footprints));
if(!ground->footprints) {
res = RES_MEM_ERR;
goto error;
@@ -102,10 +105,15 @@ error:
}
void
-ground_release
+ground_clear
(struct mem_allocator* allocator,
struct ground* ground)
{
+ size_t i;
+ SCAD(geometry_delete(ground->box));
SCAD(geometry_delete(ground->boundary));
+ for(i = 0; i < ground->footprints_count; i++) {
+ SCAD(geometry_delete(ground->footprints[i]));
+ }
MEM_RM(allocator, ground->footprints);
}
diff --git a/src/cg_ground.h b/src/cg_ground.h
@@ -25,15 +25,17 @@
struct city;
struct scad_geometry;
struct mem_allocator;
+struct logger;
struct ground {
/* cad representation */
+ struct scad_geometry* box;
struct scad_geometry* boundary;
struct scad_geometry** footprints; /* list of building footprint */
size_t footprints_count; /* number of footprint */
};
-#define GROUND_NULL__ {NULL, NULL, 0}
+#define GROUND_NULL__ {NULL, NULL, NULL, 0}
static const struct ground GROUND_NULL = GROUND_NULL__;
res_T
@@ -45,13 +47,14 @@ res_T
ground_export_stl(const struct ground* ground, const int binary);
res_T
-ground_allocate
+ground_init
(struct mem_allocator* allocator,
+ struct logger* logger,
const size_t count,
struct ground* ground);
void
-ground_release
+ground_clear
(struct mem_allocator* allocator,
struct ground* ground);
diff --git a/src/cg_main.c b/src/cg_main.c
@@ -109,7 +109,7 @@ int main
ERR(logger_init(&allocator, &logger));
logger_initialized = 1;
- /* Active loggin for args parsing */
+ /* Active logging for args parsing */
logger_set_stream(&logger, LOG_OUTPUT, log_prt_fn, NULL);
logger_set_stream(&logger, LOG_WARNING, log_warn_fn, NULL);
logger_set_stream(&logger, LOG_ERROR, log_err_fn, NULL);
@@ -125,7 +125,7 @@ int main
goto exit;
}
- /* Deactivate some loggin according to the -V arg */
+ /* Deactivate some logging according to the -V arg */
if(args->verbosity_level < 1)
logger_set_stream(&logger, LOG_ERROR, NULL, NULL);
if(args->verbosity_level < 2)