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:
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], ¢er_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 */