commit 8ade70a0d0b788ca2fe0fb73240a629039c3faf8
parent be68aa739a64662b1a21dc53a8ee16d455367d09
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date: Wed, 18 Jan 2023 11:24:35 +0100
Change strategy for boundary building of mode_0 and fix bug in cavity
Diffstat:
2 files changed, 61 insertions(+), 28 deletions(-)
diff --git a/src/cg_construction_mode_0.c b/src/cg_construction_mode_0.c
@@ -91,6 +91,28 @@ error:
}
static res_T
+build_fake_ground
+ (struct scpr_polygon* pg,
+ struct scad_geometry** fake_ground)
+{
+ res_T res = RES_OK;
+ double d[3] = {0, 0, -1};
+ struct scad_geometry* footprint = NULL;
+
+ ASSERT(pg && fake_ground);
+
+ ERR(build_floor_footprint(pg, &footprint));
+
+ ERR(scad_geometry_extrude(footprint, NULL, d, fake_ground));
+
+exit:
+ SCAD(geometry_delete(footprint));
+ return res;
+error:
+ goto exit;
+}
+
+static res_T
build_roof
(const char* prefix,
const struct building* b,
@@ -235,7 +257,7 @@ build_cavity
ERR(scpr_polygon_get_vertices_count(pg, 0, &nverts));
ERR(scad_add_polygon(NULL, get_position_pg, pg, e, nverts, &polygon));
- d[2] = height - e;
+ d[2] = height - 2*e;
ERR(scad_geometry_extrude(polygon, cavityname, d, cavity));
exit:
@@ -309,42 +331,47 @@ static res_T
build_boundary
(const char* prefix,
struct mem_allocator* allocator,
- struct data_cad_cmode_0* cad)
+ struct data_cad_cmode_0* data_cad)
{
res_T res = RES_OK;
+ size_t count = 0;
struct scad_geometry** list = NULL;
- struct scad_geometry* boundary = NULL;
- char* cname = NULL;
+ char* boundaryname = NULL;
struct str name;
int is_init = 0;
- ASSERT(allocator && cad);
+ ASSERT(allocator && prefix && data_cad);
+
+ str_init(allocator, &name);
+ is_init = 1;
- list = MEM_ALLOC(allocator, 4 * sizeof(struct scad_geometry*));
+ count = 5;
+ list = MEM_ALLOC(allocator, count * sizeof(struct scad_geometry*));
if(!list) {
res = RES_MEM_ERR;
goto error;
}
- list[0] = cad->floor;
- list[1] = cad->wall;
- list[2] = cad->roof;
- list[3] = cad->cavity;
-
- str_init(NULL, &name);
- is_init = 1;
- if (prefix) {
- ERR(str_set(&name, prefix));
- ERR(str_append(&name, "_boundary"));
- cname = str_get(&name);
- }
-
- ERR(scad_geometry_boundary(NULL, list, 4, &boundary));
-
- ERR(scad_cut_geometries(cname, &boundary, 1, &cad->ground_connection, 1,
- &cad->boundary));
-
+ list[0] = data_cad->floor;
+ list[1] = data_cad->wall;
+ list[2] = data_cad->roof;
+ list[3] = data_cad->cavity;
+ list[4] = data_cad->fake_ground;
+
+ data_cad->boundary = MEM_ALLOC(allocator, 2 * sizeof(struct scad_geometry*));
+
+ ERR(str_set(&name, prefix));
+ ERR(str_append(&name, "_boundary_wall"));
+ boundaryname = str_get(&name);
+ ERR(scad_geometries_common_boundaries(boundaryname, list, count,
+ &data_cad->wall, 1, &data_cad->boundary[0]));
+
+ 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, &data_cad->boundary[1]));
+
exit:
- if(boundary) SCAD(geometry_delete(boundary));
MEM_RM(allocator, list);
if (is_init) str_release(&name);
return res;
@@ -509,6 +536,9 @@ build_cad_cmode_0
/* build cavity */
ERR(build_cavity(name, pg_int, building, &data_cad->cavity));
+ /* build fake ground */
+ ERR(build_fake_ground(pg, &data_cad->fake_ground));
+
ERR(scad_scene_partition());
/* build ground/building connection */
@@ -593,7 +623,8 @@ export_stl_cmode_0
}
/* boundary export */
- ERR(scad_stl_export(data_cad->boundary, NULL, 0, binary));
+ ERR(scad_stl_export(data_cad->boundary[0], NULL, 0, binary));
+ ERR(scad_stl_export(data_cad->boundary[1], NULL, 0, binary));
/* footprint export */
ERR(scad_stl_export(data_cad->ground_connection, NULL, 0, binary));
@@ -620,15 +651,16 @@ release_cad_cmode_0
goto error;
}
- 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));
+ if(data_cad->fake_ground) SCAD(geometry_delete(data_cad->fake_ground));
for(i = 0; i < data_cad->n_connection; i++) {
SCAD(geometry_delete(data_cad->connection[i]));
}
+ MEM_RM(allocator, data_cad->boundary);
MEM_RM(allocator, data_cad->connection);
MEM_RM(allocator, data_cad);
diff --git a/src/cg_construction_mode_0.h b/src/cg_construction_mode_0.h
@@ -54,7 +54,8 @@ struct data_cad_cmode_0 {
struct scad_geometry* roof;
struct scad_geometry* floor;
struct scad_geometry* cavity;
- struct scad_geometry* boundary;
+ struct scad_geometry* fake_ground;
+ struct scad_geometry** boundary;
struct scad_geometry** connection;
struct scad_geometry* ground_connection;
size_t n_connection;