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 f4b93bd2f8e08fdc0a27b3b988e77875fe7494e7
parent 014ef1e6f00a519da3b23b4956112205414688e8
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date:   Tue,  4 Oct 2022 15:59:13 +0200

Parsing prototype file for city implatation

Diffstat:
Msrc/cg_city.c | 111++++++++++++-------------------------------------------------------------------
Msrc/cg_parsing.c | 39++++++++++++++++++++++++++-------------
2 files changed, 42 insertions(+), 108 deletions(-)

diff --git a/src/cg_city.c b/src/cg_city.c @@ -34,8 +34,7 @@ city_init(struct logger* logger, struct city* city, struct args* args) char* line = NULL; struct building* building = NULL; struct building b; - struct data_model0 data0, data1; - /*struct ground ground;*/ + struct data_model0 data0; ERR(txtrdr_file(NULL, str_cget(&args->city_model_file), '#', &reader)); @@ -44,9 +43,20 @@ parse: while (txtrdr_get_line(reader)){ line = txtrdr_get_line(reader); ERR(strtolower(line, line)); - /*if (strcmp(line, "[building]") == 0) {*/ - /*parse_building(reader);*/ - /*goto parse;*/ + if (strcmp(line, "[building]") == 0) { + ERR(parse_building(logger, reader, &b)); + b.model = MODEL0; + b.data = malloc(sizeof(struct data_model0)); + data0.wall = 0.2; + data0.slab = 0.3; + *(struct data_model0*)(b.data) = data0; + b.build_cad = &build_cad_model0; + b.export_stl = &export_stl_model0; + b.release = &release_model0; + b.build_footprint = &build_footprint_model0; + sa_push(city->building, b); + goto parse; + } if (strcmp(line, "[ground]") == 0) { ERR(parse_ground(logger, reader, &city->ground)); goto parse; @@ -54,98 +64,8 @@ parse: ERR(txtrdr_read_line(reader)); } - b.id = 0; - b.model = MODEL0; - b.height = 3; - b.polygon_count = 1; - b.pg = malloc(b.polygon_count * sizeof(struct pg_polygon)); - ERR(pg_init(&b.pg[0], 4)); - b.pg[0].x[0] = 0; b.pg[0].y[0] = 0; - b.pg[0].x[1] = 0; b.pg[0].y[1] = 10; - b.pg[0].x[2] = 10; b.pg[0].y[2] = 10; - b.pg[0].x[3] = 10; b.pg[0].y[3] = 0; - b.data = malloc(sizeof(struct data_model0)); - data0.wall = 0.2; - data0.slab = 0.3; - *(struct data_model0*)(b.data) = data0; - b.build_cad = &build_cad_model0; - b.export_stl = &export_stl_model0; - b.release = &release_model0; - b.build_footprint = &build_footprint_model0; - - sa_push(city->building, b); - - b.id = 1; - b.model = MODEL0; - b.height = 3.5; - b.polygon_count = 1; - b.pg = malloc(b.polygon_count * sizeof(struct pg_polygon)); - ERR(pg_init(&b.pg[0], 3)); - b.pg[0].x[0] = 20; b.pg[0].y[0] = 0; - b.pg[0].x[1] = 25; b.pg[0].y[1] = 10; - b.pg[0].x[2] = 30; b.pg[0].y[2] = 1; - b.data = malloc(sizeof(struct data_model0)); - data1.wall = 0.15; - data1.slab = 0.1; - *(struct data_model0*)(b.data) = data1; - b.build_cad = &build_cad_model0; - b.export_stl = &export_stl_model0; - b.release = &release_model0; - b.build_footprint = &build_footprint_model0; - - sa_push(city->building, b); - city->n = sa_size(city->building); -#define NBUILD 2 - /*building = malloc(NBUILD * sizeof(struct building)); */ - -/* building[0].id = 0;*/ - /*building[0].model = MODEL0;*/ - /*building[0].height = 3;*/ - /*building[0].polygon_count = 1;*/ - /*building[0].pg = malloc(building[0].polygon_count * sizeof(struct pg_polygon));*/ - /*ERR(pg_init(&building[0].pg[0], 4));*/ - /*building[0].pg[0].x[0] = 0; building[0].pg[0].y[0] = 0;*/ - /*building[0].pg[0].x[1] = 0; building[0].pg[0].y[1] = 10;*/ - /*building[0].pg[0].x[2] = 10; building[0].pg[0].y[2] = 10;*/ - /*building[0].pg[0].x[3] = 10; building[0].pg[0].y[3] = 0;*/ - /*building[0].data = malloc(sizeof(struct data_model0));*/ - /*data0.wall = 0.2;*/ - /*data0.slab = 0.3;*/ - /**(struct data_model0*)(building[0].data) = data0;*/ - /*building[0].build_cad = &build_cad_model0;*/ - /*building[0].export_stl = &export_stl_model0;*/ - /*building[0].release = &release_model0;*/ - /*building[0].build_footprint = &build_footprint_model0;*/ - -/* building[1].id = 1;*/ - /*building[1].model = MODEL0;*/ - /*building[1].height = 3.5;*/ - /*building[1].polygon_count = 1;*/ - /*building[1].pg = malloc(building[1].polygon_count * sizeof(struct pg_polygon));*/ - /*ERR(pg_init(&building[1].pg[0], 3));*/ - /*building[1].pg[0].x[0] = 20; building[1].pg[0].y[0] = 0;*/ - /*building[1].pg[0].x[1] = 25; building[1].pg[0].y[1] = 10;*/ - /*building[1].pg[0].x[2] = 30; building[1].pg[0].y[2] = 1;*/ - /*building[1].data = malloc(sizeof(struct data_model0));*/ - /*data1.wall = 0.15;*/ - /*data1.slab = 0.1;*/ - /**(struct data_model0*)(building[1].data) = data1;*/ - /*building[1].build_cad = &build_cad_model0;*/ - /*building[1].export_stl = &export_stl_model0;*/ - /*building[1].release = &release_model0;*/ - /*building[1].build_footprint = &build_footprint_model0;*/ - - /*city->n = NBUILD;*/ - /*city->building = building;*/ - - /*city->ground.extent[0] = -100; */ - /*city->ground.extent[1] = 100; */ - /*city->ground.extent[2] = -100; */ - /*city->ground.extent[3] = 100; */ - /*city->ground.depth = 3; */ - exit: return res; @@ -185,6 +105,7 @@ city_cad_build(struct logger* logger, struct city* city) size_t i,n; ERR(scad_initialize(logger, NULL, 3)); + /* iterate on building */ n = city->n; for (i=0; i<n; ++i) { diff --git a/src/cg_parsing.c b/src/cg_parsing.c @@ -144,6 +144,7 @@ parse_building ERR(txtrdr_read_line(reader)); while (txtrdr_get_line(reader)){ size_t id = 0; + double height = 0; char* value = NULL; line = remove_spaces(txtrdr_get_line(reader)); @@ -153,19 +154,31 @@ parse_building building->id = id; } -/* value = malloc(( strlen(line )) * sizeof(char));*/ - /*if (sscanf(line, "extent=%s", value) == 1 ) {*/ - /*size_t sz = 0;*/ - /*if (cstr_to_list_double(value, ',', ground->extent, &sz, 4)*/ - /*!= RES_OK || sz != 4) {*/ - /*logger_print(logger, LOG_ERROR, */ - /*"[ground] extent value not valid: 4 values required.\n");*/ - /*res = RES_BAD_ARG;*/ - /*if (value) free(value);*/ - /*goto error;*/ - /*}*/ - /*}*/ - /*if (value) free(value);*/ + if (sscanf(line, "height=%lf", &height) == 1 ) { + building->height = height; + } + + value = malloc(( strlen(line )) * sizeof(char)); + if (sscanf(line, "polygon=%s", value) == 1 ) { + size_t sz = 0; + double polygon[8]; + if (cstr_to_list_double(value, ',', polygon, &sz, 8) + != RES_OK || sz != 8) { + logger_print(logger, LOG_ERROR, + "[polygon] extent value not valid: 8 values required.\n"); + res = RES_BAD_ARG; + if (value) free(value); + goto error; + } + building->polygon_count = 1; + building->pg = malloc(building->polygon_count * sizeof(struct pg_polygon)); + pg_init(&building->pg[0], 4); + building->pg[0].x[0] = polygon[0]; building->pg[0].y[0] = polygon[1]; + building->pg[0].x[1] = polygon[2]; building->pg[0].y[1] = polygon[3]; + building->pg[0].x[2] = polygon[4]; building->pg[0].y[2] = polygon[5]; + building->pg[0].x[3] = polygon[6]; building->pg[0].y[3] = polygon[7]; + } + if (value) free(value); /*if new section goto check and exit*/ if (sscanf(line, "[%[^]]", value) == 1 ) {