commit 30be2c8b93081874b588f2ab10cbe9befa54a8a9
parent c5616fca8c2d661d9a9a89f1e26b0bb435b0fe0d
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date: Thu, 3 Nov 2022 19:42:15 +0100
Begin boundary building and export of model1
Diffstat:
2 files changed, 88 insertions(+), 17 deletions(-)
diff --git a/src/cg_building_model1.c b/src/cg_building_model1.c
@@ -624,7 +624,7 @@ build_habitable
const struct scpr_polygon* pg,
const double height,
const struct data_model1* data,
- const struct scad_geometry* floor,
+ struct scad_geometry* floor,
struct scad_geometry** cavity)
{
res_T res = RES_OK;
@@ -738,6 +738,75 @@ exit:
error:
goto exit;
}
+
+static res_T
+build_boundary
+ (const char* prefix,
+ struct data_cad_model1* data_cad,
+ struct scad_geometry*** boundary)
+{
+ res_T res = RES_OK;
+ struct scad_geometry** list = NULL;
+ struct scad_geometry* geom1 = NULL;
+ struct scad_geometry* geom2 = NULL;
+ struct scad_geometry* bound = NULL;
+ char* boundaryname = NULL;
+ struct str name;
+ int is_init = 0;
+
+ if (!prefix || !data_cad || !boundary) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ str_init(NULL, &name);
+ is_init = 1;
+
+ sa_push(list, data_cad->wall);
+ sa_push(list, data_cad->roof);
+ sa_push(list, data_cad->floor);
+ sa_push(list, data_cad->habitable_cavity);
+ if (data_cad->intermediate_floor) sa_push(list, data_cad->intermediate_floor);
+ if (data_cad->external_insulation) sa_push(list, data_cad->external_insulation);
+ if (data_cad->internal_insulation) sa_push(list, data_cad->internal_insulation);
+ if (data_cad->roof_insulation) sa_push(list, data_cad->roof_insulation);
+ if (data_cad->floor_insulation) sa_push(list, data_cad->floor_insulation);
+ if (data_cad->attic_cavity) sa_push(list, data_cad->attic_cavity);
+ if (data_cad->crawlspace_cavity) sa_push(list, data_cad->crawlspace_cavity);
+
+ ERR(scad_geometry_boundary(NULL, list, sa_size(list), &geom1));
+
+ ERR(scad_geometry_boundary(NULL, &data_cad->external_insulation, 1, &geom2));
+ ERR(str_set(&name, prefix));
+ ERR(str_append(&name, "_boundary_ext_insulation"));
+ boundaryname = str_get(&name);
+ ERR(scad_intersect_geometries(boundaryname, &geom1, 1, &geom2, 1, &bound));
+ sa_push(*boundary, bound);
+
+ ERR(scad_geometry_boundary(NULL, &data_cad->wall, 1, &geom2));
+ ERR(str_set(&name, prefix));
+ ERR(str_append(&name, "_boundary_wall"));
+ boundaryname = str_get(&name);
+ ERR(scad_intersect_geometries(boundaryname, &geom1, 1, &geom2, 1, &bound));
+ sa_push(*boundary, bound);
+
+ ERR(scad_geometry_boundary(NULL, &data_cad->roof, 1, &geom2));
+ ERR(str_set(&name, prefix));
+ ERR(str_append(&name, "_boundary_roof"));
+ boundaryname = str_get(&name);
+ ERR(scad_intersect_geometries(boundaryname, &geom1, 1, &geom2, 1, &bound));
+ sa_push(*boundary, bound);
+
+exit:
+ if (is_init) str_release(&name);
+ if (list) sa_release(list);
+ scad_geometry_delete(geom1);
+ scad_geometry_delete(geom2);
+ return res;
+error:
+ goto exit;
+}
+
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
@@ -818,21 +887,21 @@ build_cad_model1(struct building* building)
ERR(build_roof(str_cget(&prefix), pg, height, data, &data_cad->roof));
-
- if (data->inter_floor_n > 0) {
- ERR(build_inter_floor(
- str_cget(&prefix), pg, height, data, &data_cad->intermediate_floor));
- } else {
- data_cad->intermediate_floor = NULL;
- }
-
/* build optionnal elements :
+ - intermediate floor
- external insulation
- internal insulation
- roof insulation
- floor insulation
*/
+ if (data->inter_floor_n > 0) {
+ ERR(build_inter_floor(
+ str_cget(&prefix), pg, height, data, &data_cad->intermediate_floor));
+ } else {
+ data_cad->intermediate_floor = NULL;
+ }
+
if (data->ext_insulation > 0) {
ERR(build_ext_insulation(
str_cget(&prefix), pg, height, data, &data_cad->external_insulation));
@@ -886,13 +955,10 @@ build_cad_model1(struct building* building)
data_cad->crawlspace_cavity = NULL;
}
-
ERR(scad_scene_partition());
- /*scad_synchronize();*/
- /*scad_run_ui();*/
-
-
+ /* build boundaries */
+ ERR(build_boundary(str_cget(&prefix), data_cad, &data_cad->boundary));
exit:
if (is_init) str_release(&prefix);
@@ -929,7 +995,7 @@ export_stl_model1
{
res_T res = RES_OK;
struct data_cad_model1* data_cad = (struct data_cad_model1 *)building->data_cad;
- /*size_t i;*/
+ size_t i = 0;
/* floor export */
ERR(scad_stl_export(data_cad->floor, NULL, binary));
@@ -978,6 +1044,11 @@ export_stl_model1
ERR(scad_stl_export(data_cad->crawlspace_cavity, NULL, binary));
}
+ /* boundary export*/
+ for (i=0; i<sa_size(data_cad->boundary); ++i) {
+ ERR(scad_stl_export(data_cad->boundary[i], NULL, binary));
+ }
+
exit:
return res;
error:
@@ -989,7 +1060,6 @@ release_model1
(struct building* building)
{
res_T res = RES_OK;
-
struct data_model1* data = (struct data_model1 *)building->data;
struct data_cad_model1* data_cad = (struct data_cad_model1 *)building->data_cad;
@@ -997,6 +1067,7 @@ release_model1
str_release(building->data_name);
+ if (data_cad->boundary) sa_release(data_cad->boundary);
if (data_cad->connection) free(data_cad->connection);
if (data) free(data);
if (data_cad) free(data_cad);
diff --git a/src/cg_building_model1.h b/src/cg_building_model1.h
@@ -57,7 +57,7 @@ struct data_cad_model1 {
struct scad_geometry* floor_insulation;
struct scad_geometry* roof_insulation;
struct scad_geometry* ground;
- struct scad_geometry* boundary;
+ struct scad_geometry** boundary;
struct scad_geometry** connection;
size_t n_connection;
};