From bcec3579cd4a4fe2eec60537208374f948f129ff Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 3 Jan 2025 13:16:14 +0100 Subject: [PATCH 1/8] Bump dev version --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index a0752d8d..5c415e05 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,7 +29,7 @@ #include -std::string CITY4CFD_VERSION = "0.6.0"; +std::string CITY4CFD_VERSION = "0.6.0+dev"; void printWelcome() { auto logo{ From 2df9980c75bc71c4d1bdcc9774e3eca66f918f97 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Thu, 6 Feb 2025 17:11:57 +0100 Subject: [PATCH 2/8] Bump dev version --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index fa6f7076..15590a8d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,7 +29,7 @@ #include -std::string CITY4CFD_VERSION = "0.6.1"; +std::string CITY4CFD_VERSION = "0.6.1+dev"; void printWelcome() { auto logo{ From eb20dfc8592b133c4fef61adba44dad4378d71b9 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 25 Feb 2025 11:35:59 +0100 Subject: [PATCH 3/8] Add point cloud update to interpolation dt --- src/Map3d.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Map3d.cpp b/src/Map3d.cpp index 5af15083..a9948e99 100644 --- a/src/Map3d.cpp +++ b/src/Map3d.cpp @@ -321,6 +321,11 @@ void Map3d::set_bnd() { Boundary::set_bounds_to_terrain_pc(m_pointCloud.get_terrain(), bndPoly, pcBndPoly, startBufferPoly); + // update the terrain DT for interpolation + m_dt.clear(); + m_dt.insert(m_pointCloud.get_terrain().points().begin(), + m_pointCloud.get_terrain().points().end()); + //-- Check feature scope for surface layers now that the full domain is known for (auto& f: m_surfaceLayersPtr) { f->check_feature_scope(bndPoly); From 76db544f63d444788e7f459c2ed3fcf2f8ef617c Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 25 Feb 2025 12:13:13 +0100 Subject: [PATCH 4/8] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1dc5d41..f8ade08e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ # Changelog +## [Unreleased] +### Changed +- Improved inserting surface layer polygons when terrain pc is missing + ## [0.6.1] - 2025-02-06 ### Fixed - Docker image hotfix From 0211a3cf5789a73b1de59225d8617b89578db903 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 25 Feb 2025 15:18:28 +0100 Subject: [PATCH 5/8] Fix cityjson lod2 exception --- src/Building.cpp | 6 +++++- src/Building.h | 1 + src/ReconstructedBuilding.cpp | 39 +++++++++++++++++++++-------------- src/io.cpp | 14 +++++++------ src/io.h | 2 +- 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/Building.cpp b/src/Building.cpp index a681e025..656ea1ea 100644 --- a/src/Building.cpp +++ b/src/Building.cpp @@ -284,6 +284,10 @@ PointSet3Ptr Building::get_points() const { return m_ptsPtr; } +std::string Building::get_lod() const { + return m_reconSettings->lod; +} + void Building::get_cityjson_info(nlohmann::json& b) const { b["type"] = "Building"; // b["attributes"]; @@ -294,7 +298,7 @@ void Building::get_cityjson_info(nlohmann::json& b) const { b["attributes"]["measuredHeight"] = m_elevation - geomutils::avg(m_groundElevations[0]); } -void Building::get_cityjson_semantics(nlohmann::json& g) const { // Temp for checking CGAL mesh properties +void Building::get_cityjson_semantics(nlohmann::json& g) const { Face_property semantics; auto semanticsMap = m_mesh.property_map("f:semantics"); if (semanticsMap.has_value()) { diff --git a/src/Building.h b/src/Building.h index 6c47b84b..f33be5a3 100644 --- a/src/Building.h +++ b/src/Building.h @@ -65,6 +65,7 @@ class Building : public PolyFeature { void set_to_zero_terrain(); double sq_max_dim(); PointSet3Ptr get_points() const; + std::string get_lod() const; virtual void get_cityjson_info(nlohmann::json& b) const override; virtual void get_cityjson_semantics(nlohmann::json& g) const override; diff --git a/src/ReconstructedBuilding.cpp b/src/ReconstructedBuilding.cpp index aa50dd7a..f340c95f 100644 --- a/src/ReconstructedBuilding.cpp +++ b/src/ReconstructedBuilding.cpp @@ -338,22 +338,29 @@ void ReconstructedBuilding::get_cityjson_info(nlohmann::json& b) const { } void ReconstructedBuilding::get_cityjson_semantics(nlohmann::json& g) const { // Temp for checking CGAL mesh properties - Face_property semantics; - auto semanticsMap = m_mesh.property_map("f:semantics"); - if (semanticsMap.has_value()) { - semantics = semanticsMap.value(); - } else throw city4cfd_error("Semantic property map not found!"); - - std::unordered_map surfaceId; - surfaceId["RoofSurface"] = 0; g["semantics"]["surfaces"][0]["type"] = "RoofSurface"; - surfaceId["GroundSurface"] = 1; g["semantics"]["surfaces"][1]["type"] = "GroundSurface"; - surfaceId["WallSurface"] = 2; g["semantics"]["surfaces"][2]["type"] = "WallSurface"; - - for (auto faceIdx : m_mesh.faces()) { - auto it = surfaceId.find(semantics[faceIdx]); - if (it == surfaceId.end()) throw city4cfd_error("Could not find semantic attribute!"); - - g["semantics"]["values"][faceIdx.idx()] = it->second; + // for now handle only LoD1.2 with semantics, LoD1.3 and LoD2.2 loses information + // when making final repairs + if (m_reconSettings->lod == "1.2") { + Face_property semantics; + auto semanticsMap = m_mesh.property_map("f:semantics"); + if (semanticsMap.has_value()) { + semantics = semanticsMap.value(); + } else throw city4cfd_error("Semantic property map not found!"); + + std::unordered_map surfaceId; + surfaceId["RoofSurface"] = 0; + g["semantics"]["surfaces"][0]["type"] = "RoofSurface"; + surfaceId["GroundSurface"] = 1; + g["semantics"]["surfaces"][1]["type"] = "GroundSurface"; + surfaceId["WallSurface"] = 2; + g["semantics"]["surfaces"][2]["type"] = "WallSurface"; + + for (auto faceIdx: m_mesh.faces()) { + auto it = surfaceId.find(semantics[faceIdx]); + if (it == surfaceId.end()) throw city4cfd_error("Could not find semantic attribute!"); + + g["semantics"]["values"][faceIdx.idx()] = it->second; + } } } diff --git a/src/io.cpp b/src/io.cpp index c75025c3..e12c3298 100644 --- a/src/io.cpp +++ b/src/io.cpp @@ -399,7 +399,7 @@ void IO::output_cityjson(const OutputFeaturesPtr& allFeatures) { nlohmann::json j; j["type"] = "CityJSON"; - j["version"] = "1.0"; + j["version"] = "2.0"; j["metadata"] = {}; std::vector bbox = Boundary::get_domain_bbox(); j["metadata"]["geographicalExtent"] = Boundary::get_domain_bbox(); @@ -414,7 +414,12 @@ void IO::output_cityjson(const OutputFeaturesPtr& allFeatures) { //-- Get feature geometry nlohmann::json g; - IO::get_cityjson_geom(f->get_mesh(), g, dPts, f->get_cityjson_primitive()); + g["type"] = f->get_cityjson_primitive(); + // grab lod information for buildings + auto derivedClass = std::dynamic_pointer_cast(f); + if (derivedClass) g["lod"] = derivedClass->get_lod(); + + IO::get_cityjson_geom(f->get_mesh(), g, dPts); //-- Get feature semantics f->get_cityjson_semantics(g); @@ -483,10 +488,7 @@ void IO::get_stl_pts(Mesh& mesh, std::string& fs) { } } -void IO::get_cityjson_geom(const Mesh& mesh, nlohmann::json& g, std::unordered_map& dPts, - std::string primitive) { - g["type"] = primitive; - g["lod"] = "1.2"; //hardcoded for now +void IO::get_cityjson_geom(const Mesh& mesh, nlohmann::json& g, std::unordered_map& dPts) { g["boundaries"]; for (auto face: mesh.faces()) { if (IO::is_degen(mesh, face)) continue; diff --git a/src/io.h b/src/io.h index 8d4cccbf..42557983 100644 --- a/src/io.h +++ b/src/io.h @@ -50,7 +50,7 @@ namespace IO { void get_obj_pts(const Mesh& mesh, std::string& fs, std::string& bs, std::unordered_map& dPts); void get_stl_pts(Mesh& mesh, std::string& fs); - void get_cityjson_geom(const Mesh& mesh, nlohmann::json& g, std::unordered_map& dPts, std::string primitive); + void get_cityjson_geom(const Mesh& mesh, nlohmann::json& g, std::unordered_map& dPts); bool not_same(std::vector idxLst); bool is_degen(const Mesh& mesh, Mesh::Face_index face); From 064eb9749d3e52714fb830bfc5f887853411de71 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 25 Feb 2025 15:19:22 +0100 Subject: [PATCH 6/8] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1dc5d41..f5186a60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ # Changelog +## Unreleased +### Fixed +- Minor bugfixes + ## [0.6.1] - 2025-02-06 ### Fixed - Docker image hotfix From 791cfb59e4da471f197439c30b36e9e69d52087d Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Wed, 26 Feb 2025 08:51:47 +0100 Subject: [PATCH 7/8] Refactor --- src/Boundary.cpp | 2 -- src/Boundary.h | 2 +- src/BoundingRegion.cpp | 2 -- src/BoundingRegion.h | 4 ++-- src/Building.cpp | 2 -- src/Building.h | 2 +- src/ImportedBuilding.cpp | 2 -- src/ImportedBuilding.h | 2 +- src/Map3d.cpp | 3 --- src/Map3d.h | 4 ++-- src/PointCloud.cpp | 3 --- src/PointCloud.h | 4 ++-- src/PolyFeature.cpp | 2 -- src/PolyFeature.h | 2 +- src/ReconstructedBuilding.cpp | 2 -- src/ReconstructedBuilding.h | 2 +- src/Sides.cpp | 2 -- src/Sides.h | 2 +- src/SurfaceLayer.cpp | 2 -- src/SurfaceLayer.h | 2 +- src/Terrain.cpp | 2 -- src/Terrain.h | 2 +- src/Top.cpp | 2 -- src/Top.h | 2 +- src/TopoFeature.cpp | 2 -- src/TopoFeature.h | 2 +- 26 files changed, 16 insertions(+), 44 deletions(-) diff --git a/src/Boundary.cpp b/src/Boundary.cpp index 6c29c75f..37f0e403 100644 --- a/src/Boundary.cpp +++ b/src/Boundary.cpp @@ -37,8 +37,6 @@ Boundary::Boundary() Boundary::Boundary(const int outputLayerID) : TopoFeature(outputLayerID), m_sideOutputPts() {} -Boundary::~Boundary() = default; - //-- Static member definition std::vector Boundary::s_outerPts; double Boundary::s_outerBndHeight; diff --git a/src/Boundary.h b/src/Boundary.h index 7057e2f9..bb57a58d 100644 --- a/src/Boundary.h +++ b/src/Boundary.h @@ -34,7 +34,7 @@ class Boundary : public TopoFeature { public: Boundary(); Boundary(const int outputLayerID); - virtual ~Boundary(); + virtual ~Boundary() = default; static void set_bnd_poly(Polygon_2& bndPoly, Polygon_2& pcBndPoly, Polygon_2& startBufferPoly); static void set_bounds_to_buildings_pc(Point_set_3& pointCloud, const Polygon_2& pcBndPoly); diff --git a/src/BoundingRegion.cpp b/src/BoundingRegion.cpp index cc818bb8..4cf06fd7 100644 --- a/src/BoundingRegion.cpp +++ b/src/BoundingRegion.cpp @@ -37,11 +37,9 @@ #include #include -BoundingRegion::BoundingRegion() = default; BoundingRegion::BoundingRegion(std::shared_ptr reconRegion) : m_reconSettings(reconRegion) {} -BoundingRegion::~BoundingRegion() = default; //-- Operators to read bounded region if explicitly defined in config // called through boost:apply_visitor diff --git a/src/BoundingRegion.h b/src/BoundingRegion.h index 2b8b1281..1b4f5e4d 100644 --- a/src/BoundingRegion.h +++ b/src/BoundingRegion.h @@ -37,9 +37,9 @@ class BoundingRegion { CDT m_projCDT; std::shared_ptr m_reconSettings; - BoundingRegion(); + BoundingRegion() = default; BoundingRegion(std::shared_ptr reconRegion); - ~BoundingRegion(); + ~BoundingRegion() = default; void operator()(double radius); void operator()(Polygon_2& poly); diff --git a/src/Building.cpp b/src/Building.cpp index 656ea1ea..564c07a5 100644 --- a/src/Building.cpp +++ b/src/Building.cpp @@ -52,8 +52,6 @@ Building::Building(const Polygon_with_attr& poly) m_ptsPtr(std::make_shared()), m_hasFailed(false), m_reconSettings(nullptr) {} // 'true' here to check for polygon simplicity -Building::~Building() = default; - void Building::insert_point(const Point_3& pt) { m_ptsPtr->insert(pt); } diff --git a/src/Building.h b/src/Building.h index f33be5a3..d4de8477 100644 --- a/src/Building.h +++ b/src/Building.h @@ -37,7 +37,7 @@ class Building : public PolyFeature { Building(); Building(const nlohmann::json& poly); Building(const Polygon_with_attr& poly); - ~Building(); + virtual ~Building() = default; static void alpha_wrap_all(const BuildingsPtr& buildings, Mesh& newMesh); diff --git a/src/ImportedBuilding.cpp b/src/ImportedBuilding.cpp index 716aa17e..67391e16 100644 --- a/src/ImportedBuilding.cpp +++ b/src/ImportedBuilding.cpp @@ -267,8 +267,6 @@ ImportedBuilding::ImportedBuilding(Mesh& mesh) mesh.clear(); } -ImportedBuilding::~ImportedBuilding() = default; - /* * Calculate building elevation without reconstruction. * Defined as the highest point diff --git a/src/ImportedBuilding.h b/src/ImportedBuilding.h index 5c43c054..9d31dd3f 100644 --- a/src/ImportedBuilding.h +++ b/src/ImportedBuilding.h @@ -40,7 +40,7 @@ class ImportedBuilding : public Building { ImportedBuilding(std::unique_ptr& buildingJson, PointSet3Ptr& importedBuildingPts); ImportedBuilding(Mesh& mesh); - ~ImportedBuilding(); + ~ImportedBuilding() = default; virtual void calc_elevation() override; virtual void reconstruct() override; diff --git a/src/Map3d.cpp b/src/Map3d.cpp index a9948e99..de723792 100644 --- a/src/Map3d.cpp +++ b/src/Map3d.cpp @@ -36,9 +36,6 @@ #include "Sides.h" #include "Top.h" -Map3d::Map3d() = default; -Map3d::~Map3d() = default; - void Map3d::reconstruct() { //-- Prepare features this->set_features(); diff --git a/src/Map3d.h b/src/Map3d.h index aa9699e6..5d37270d 100644 --- a/src/Map3d.h +++ b/src/Map3d.h @@ -35,8 +35,8 @@ class Map3d { public: - Map3d(); - ~Map3d(); + Map3d() = default; + ~Map3d() = default; void reconstruct(); diff --git a/src/PointCloud.cpp b/src/PointCloud.cpp index 8e63e16c..d486ec05 100644 --- a/src/PointCloud.cpp +++ b/src/PointCloud.cpp @@ -41,9 +41,6 @@ #include #include -PointCloud::PointCloud() = default; -PointCloud::~PointCloud() = default; - void PointCloud::random_thin_pts() { if (Config::get().terrainThinning > 0 + global::smallnum) { std::cout <<"\nRandomly thinning terrain points" << std::endl; diff --git a/src/PointCloud.h b/src/PointCloud.h index db7b4920..145fd9f4 100644 --- a/src/PointCloud.h +++ b/src/PointCloud.h @@ -36,8 +36,8 @@ class PointCloud { public: - PointCloud(); - ~PointCloud(); + PointCloud() = default; + ~PointCloud() = default; void random_thin_pts(); void create_flat_terrain(const PolyFeaturesPtr& lsFeatures); diff --git a/src/PolyFeature.cpp b/src/PolyFeature.cpp index e9ebfdf5..09de2d38 100644 --- a/src/PolyFeature.cpp +++ b/src/PolyFeature.cpp @@ -122,8 +122,6 @@ PolyFeature::PolyFeature(const Polygon_with_attr& poly, const bool checkSimplici PolyFeature::PolyFeature(const Polygon_with_attr& poly, const int outputLayerID) : PolyFeature(poly, false, outputLayerID) {} -PolyFeature::~PolyFeature() = default; - int PolyFeature::s_numOfPolyFeatures = 0; void PolyFeature::calc_footprint_elevation_nni(const DT& dt) { diff --git a/src/PolyFeature.h b/src/PolyFeature.h index 15a4712a..f7c95af1 100644 --- a/src/PolyFeature.h +++ b/src/PolyFeature.h @@ -40,7 +40,7 @@ class PolyFeature : public TopoFeature { PolyFeature(const Polygon_with_attr& poly, const bool checkSimplicity = false); PolyFeature(const Polygon_with_attr& poly, const bool checkSimplicity, const int outputLayerID); PolyFeature(const Polygon_with_attr& poly, const int outputLayerID); - virtual ~PolyFeature(); + virtual ~PolyFeature() = default; void calc_footprint_elevation_nni(const DT& dt); #ifndef NDEBUG diff --git a/src/ReconstructedBuilding.cpp b/src/ReconstructedBuilding.cpp index f340c95f..927e0742 100644 --- a/src/ReconstructedBuilding.cpp +++ b/src/ReconstructedBuilding.cpp @@ -127,8 +127,6 @@ ReconstructedBuilding::ReconstructedBuilding(const std::shared_ptrget_output_layer_id(); } -ReconstructedBuilding::~ReconstructedBuilding() = default; - /* * Calculate building elevation without mesh reconstruction */ diff --git a/src/ReconstructedBuilding.h b/src/ReconstructedBuilding.h index f2751975..5598c6fb 100644 --- a/src/ReconstructedBuilding.h +++ b/src/ReconstructedBuilding.h @@ -39,7 +39,7 @@ class ReconstructedBuilding : public Building { ReconstructedBuilding(const nlohmann::json& poly); ReconstructedBuilding(const Polygon_with_attr& poly); ReconstructedBuilding(const std::shared_ptr& importedBuilding); - ~ReconstructedBuilding(); + ~ReconstructedBuilding() = default; const std::vector& get_roofer_meshes() const; diff --git a/src/Sides.cpp b/src/Sides.cpp index 23a5e7b4..03da646f 100644 --- a/src/Sides.cpp +++ b/src/Sides.cpp @@ -33,8 +33,6 @@ Sides::Sides(const int outputLayerID) : Boundary(outputLayerID) { } -Sides::~Sides() = default; - void Sides::reconstruct() { std::vector meshVertexSide; diff --git a/src/Sides.h b/src/Sides.h index 0616716c..55350b12 100644 --- a/src/Sides.h +++ b/src/Sides.h @@ -33,7 +33,7 @@ class Sides : public Boundary { public: Sides(const int outputLayerID); - ~Sides(); + ~Sides() = default; virtual void reconstruct() override; diff --git a/src/SurfaceLayer.cpp b/src/SurfaceLayer.cpp index def7c5f3..198dd92e 100644 --- a/src/SurfaceLayer.cpp +++ b/src/SurfaceLayer.cpp @@ -47,8 +47,6 @@ SurfaceLayer::SurfaceLayer(const Polygon_with_attr& poly) SurfaceLayer::SurfaceLayer(const Polygon_with_attr& poly, const int outputLayerID) : PolyFeature(poly, outputLayerID) {} -SurfaceLayer::~SurfaceLayer() = default; - void SurfaceLayer::check_feature_scope(const Polygon_2& bndPoly) { //-- Exclude all polygons that have at least one //-- vertex outside the domain diff --git a/src/SurfaceLayer.h b/src/SurfaceLayer.h index 46109ab0..7ed31856 100644 --- a/src/SurfaceLayer.h +++ b/src/SurfaceLayer.h @@ -38,7 +38,7 @@ class SurfaceLayer : public PolyFeature { SurfaceLayer(const nlohmann::json& poly, const int outputLayerID); SurfaceLayer(const Polygon_with_attr& poly); SurfaceLayer(const Polygon_with_attr& poly, const int outputLayerID); - ~SurfaceLayer(); + ~SurfaceLayer() = default; void check_feature_scope(const Polygon_2& bndPoly); diff --git a/src/Terrain.cpp b/src/Terrain.cpp index 703afd58..2bfd1faf 100644 --- a/src/Terrain.cpp +++ b/src/Terrain.cpp @@ -42,8 +42,6 @@ Terrain::Terrain(int pid) m_constrainedPolys(), m_vertexFaceMap(), m_extraConstrainedEdges(), m_searchTree() {} -Terrain::~Terrain() = default; - void Terrain::set_cdt(const Point_set_3& pointCloud) { Converter to_exact; diff --git a/src/Terrain.h b/src/Terrain.h index cfa62fef..ef68d558 100644 --- a/src/Terrain.h +++ b/src/Terrain.h @@ -37,7 +37,7 @@ class Terrain : public TopoFeature { using TopoFeature::TopoFeature; Terrain(); Terrain(int pid); - ~Terrain(); + ~Terrain() = default; void set_cdt(const Point_set_3 &pointCloud); void prep_constraints(const PolyFeaturesPtr& features, Point_set_3& pointCloud); diff --git a/src/Top.cpp b/src/Top.cpp index 57865eba..ed9800a3 100644 --- a/src/Top.cpp +++ b/src/Top.cpp @@ -32,8 +32,6 @@ Top::Top(const int outputLayerID) : Boundary(outputLayerID) {} -Top::~Top() = default; - void Top::reconstruct() { std::vector meshVertexTop; diff --git a/src/Top.h b/src/Top.h index 5b75e15b..d6e2945c 100644 --- a/src/Top.h +++ b/src/Top.h @@ -33,7 +33,7 @@ class Top : public Boundary { public: Top(const int outputLayerID); - ~Top(); + ~Top() = default; virtual void reconstruct() override; diff --git a/src/TopoFeature.cpp b/src/TopoFeature.cpp index c075d14f..69e7e383 100644 --- a/src/TopoFeature.cpp +++ b/src/TopoFeature.cpp @@ -39,8 +39,6 @@ TopoFeature::TopoFeature(int outputLayerID) if (m_outputLayerID >= s_numOfOutputLayers) s_numOfOutputLayers = m_outputLayerID + 1; } -TopoFeature::~TopoFeature() = default; - int TopoFeature::s_numOfOutputLayers = 0; void TopoFeature::add_recon_region_output_layers(const int numLayers) { diff --git a/src/TopoFeature.h b/src/TopoFeature.h index d91585e4..819a2d98 100644 --- a/src/TopoFeature.h +++ b/src/TopoFeature.h @@ -36,7 +36,7 @@ class TopoFeature { TopoFeature(); TopoFeature(std::string pid); TopoFeature(int outputLayerID); - virtual ~TopoFeature(); + virtual ~TopoFeature() = default; static void add_recon_region_output_layers(const int numLayers); static int get_num_output_layers(); From 7e51298ce7130f6b9bdbeafe553b9bdb98d8e63e Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Thu, 27 Feb 2025 12:48:18 +0100 Subject: [PATCH 8/8] Bump version --- CHANGELOG.md | 2 +- src/main.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68ff02b5..0906c201 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ # Changelog -## [Unreleased] +## [0.6.2] - 2025-02-27 ### Changed - Improved inserting surface layer polygons when terrain pc is missing ### Fixed diff --git a/src/main.cpp b/src/main.cpp index 15590a8d..65a93c2f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,7 +29,7 @@ #include -std::string CITY4CFD_VERSION = "0.6.1+dev"; +std::string CITY4CFD_VERSION = "0.6.2"; void printWelcome() { auto logo{