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 d13129caf468003043cabbc6e2243984e1d72a92
parent 3b701053f640cea417fa9cff3534d5c4291dbcd1
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date:   Tue, 21 Feb 2023 16:11:29 +0100

Continue adjoining for mode_1. Seems Ok

Diffstat:
Msrc/cg_construction_mode_1.c | 109++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
1 file changed, 67 insertions(+), 42 deletions(-)

diff --git a/src/cg_construction_mode_1.c b/src/cg_construction_mode_1.c @@ -740,7 +740,8 @@ build_windows struct mem_allocator* allocator, const char* prefix, const struct dataset_cmode_1* data, - struct data_cad_cmode_1* data_cad) + struct data_cad_cmode_1* data_cad, + struct scad_geometry* adjoining_cad) { res_T res = RES_OK; size_t i = 0; @@ -752,6 +753,7 @@ build_windows struct scad_geometry** hole_list = NULL; struct darray_geometries hole_array; struct scad_geometry* geom = NULL; + struct scad_geometry* hole_adjoining_intersect = NULL; struct scad_geometry* bcavity = NULL; struct scad_geometry** list = NULL; struct scad_geometry* glass = NULL; @@ -778,6 +780,7 @@ build_windows for (i = 0; i < list_n; i++) { double center[3]; size_t center_n; + size_t count; ERR(scad_geometry_get_count(list[i], &center_n)); ASSERT(center_n == 1); @@ -800,62 +803,79 @@ build_windows dir[2] = 1.1*N[2] * (data->wall_thickness + data->internal_insulation_thickness + data->external_insulation_thickness); ERR(scad_geometry_extrude(surface, NULL, dir, &hole)); - ERR(darray_geometries_push_back(&hole_array, &hole)); - dir[0] = N[0] * 0.024; - dir[1] = N[1] * 0.024; - dir[2] = N[2] * 0.024; - ERR(scad_geometry_extrude(surface, NULL, dir, &glass)); - ERR(darray_geometries_push_back(&glass_array, &glass)); + /* check if hole intersect adjoining_cad */ + /* push only if no intersect */ + ERR(scad_intersect_geometries(NULL, &hole, 1, &adjoining_cad, 1, + &hole_adjoining_intersect)); + + ERR(scad_geometry_get_count(hole_adjoining_intersect, &count)); + + if (count == 0) { + ERR(darray_geometries_push_back(&hole_array, &hole)); + dir[0] = N[0] * 0.024; + dir[1] = N[1] * 0.024; + dir[2] = N[2] * 0.024; + ERR(scad_geometry_extrude(surface, NULL, dir, &glass)); + ERR(darray_geometries_push_back(&glass_array, &glass)); + } else { + ERR(scad_geometry_delete(hole)); + hole = NULL; + ERR(scad_geometry_delete(hole_adjoining_intersect)); + hole_adjoining_intersect = NULL; + } ERR(scad_geometry_delete(surface)); surface = NULL; } ASSERT(darray_geometries_size_get(&hole_array) == darray_geometries_size_get(&glass_array)); - hole_list = darray_geometries_data_get(&hole_array); - glass_list = darray_geometries_data_get(&glass_array); array_n = darray_geometries_size_get(&hole_array); - /* wall perforation */ - ERR(scad_cut_geometries(NULL, &data_cad->wall, 1, - hole_list, array_n, &geom)); - ERR(scad_geometry_swap_names(data_cad->wall, geom)); - ERR(scad_geometry_delete(data_cad->wall)); - data_cad->wall = geom; - geom = NULL; + if (array_n > 0) { + hole_list = darray_geometries_data_get(&hole_array); + glass_list = darray_geometries_data_get(&glass_array); - /* internal insulation perforation */ - if (data_cad->internal_insulation) { - ERR(scad_cut_geometries(NULL, &data_cad->internal_insulation, 1, + /* wall perforation */ + ERR(scad_cut_geometries(NULL, &data_cad->wall, 1, hole_list, array_n, &geom)); - ERR(scad_geometry_swap_names(data_cad->internal_insulation, geom)); - ERR(scad_geometry_delete(data_cad->internal_insulation)); - data_cad->internal_insulation = geom; + ERR(scad_geometry_swap_names(data_cad->wall, geom)); + ERR(scad_geometry_delete(data_cad->wall)); + data_cad->wall = geom; geom = NULL; - } - /* external insulation perforation */ - if (data_cad->external_insulation) { - ERR(scad_cut_geometries(NULL, &data_cad->external_insulation, 1, - hole_list, array_n, &geom)); - ERR(scad_geometry_swap_names(data_cad->external_insulation, geom)); - ERR(scad_geometry_delete(data_cad->external_insulation)); - data_cad->external_insulation = geom; - geom = NULL; - } + /* internal insulation perforation */ + if (data_cad->internal_insulation) { + ERR(scad_cut_geometries(NULL, &data_cad->internal_insulation, 1, + hole_list, array_n, &geom)); + ERR(scad_geometry_swap_names(data_cad->internal_insulation, geom)); + ERR(scad_geometry_delete(data_cad->internal_insulation)); + data_cad->internal_insulation = geom; + geom = NULL; + } - /* build glass */ - if (prefix) { - str_init(allocator, &gname); - is_init = 1; - ERR(str_set(&gname, prefix)); - ERR(str_append(&gname, "_S_glazing")); - } + /* external insulation perforation */ + if (data_cad->external_insulation) { + ERR(scad_cut_geometries(NULL, &data_cad->external_insulation, 1, + hole_list, array_n, &geom)); + ERR(scad_geometry_swap_names(data_cad->external_insulation, geom)); + ERR(scad_geometry_delete(data_cad->external_insulation)); + data_cad->external_insulation = geom; + geom = NULL; + } - ERR(scad_fuse_geometries(str_cget(&gname), glass_list, 1, - glass_list+1, array_n - 1, &data_cad->glass)); + /* build glass */ + if (prefix) { + str_init(allocator, &gname); + is_init = 1; + ERR(str_set(&gname, prefix)); + ERR(str_append(&gname, "_S_glazing")); + } + + ERR(scad_fuse_geometries(str_cget(&gname), glass_list, 1, + glass_list+1, array_n - 1, &data_cad->glass)); + } exit: glass_list = darray_geometries_data_get(&glass_array); @@ -875,6 +895,7 @@ exit: if (surface) SCAD(geometry_delete(surface)); if (geom) SCAD(geometry_delete(geom)); if (bcavity) SCAD(geometry_delete(bcavity)); + if (hole_adjoining_intersect) SCAD(geometry_delete(hole_adjoining_intersect)); MEM_RM(allocator, list); if (is_init) str_release(&gname); return res; @@ -1345,6 +1366,7 @@ build_cad_cmode_1 struct dataset_cmode_1* data = (struct dataset_cmode_1 *)building->data; struct data_cad_cmode_1* data_cad = NULL; const char* name; + struct scad_geometry* adjoining_cad = NULL; if (!building || !allocator || !cad) { res = RES_BAD_ARG; @@ -1430,9 +1452,12 @@ build_cad_cmode_1 ERR(build_crawlspace(scpr, allocator, name, pg, data, &data_cad->crawlspace_cavity)); } + /* build adjoining envelop */ + ERR(build_adjoining(building->adjoining, building->adjoining_n, &adjoining_cad)); + /* windows */ if (data->glass_ratio > 0) { - ERR(build_windows(scpr, allocator, name, data, data_cad)); + ERR(build_windows(scpr, allocator, name, data, data_cad, adjoining_cad)); } /* fake ground */