city_generator2

Generated conformal 3D meshes representing a city
git clone git://git.meso-star.fr/city_generator2.git
Log | Files | Refs | README | LICENSE

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:
Msrc/cg_building_model1.c | 103++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
Msrc/cg_building_model1.h | 2+-
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; };