From 91baf763a183434ca8993a6ee07455c6db9b9c4a Mon Sep 17 00:00:00 2001 From: HarutakaMatsumoto Date: Fri, 29 Oct 2021 17:05:36 +0900 Subject: [PATCH 01/10] Implemented easy nodes --- sources/src/parser/cityobjectelementparser.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/sources/src/parser/cityobjectelementparser.cpp b/sources/src/parser/cityobjectelementparser.cpp index 1296c027..c5936f03 100644 --- a/sources/src/parser/cityobjectelementparser.cpp +++ b/sources/src/parser/cityobjectelementparser.cpp @@ -306,6 +306,11 @@ namespace citygml { || node == NodeType::DEM_BreaklinesNode) { parseGeometryForLODLevel(std::stoi(m_model->getAttribute("dem:lod"))); + } else if (node == NodeType::GEN_Lod0TerrainIntersectionNode + || node == NodeType::WTR_Lod0MultiCurveNode + || node == NodeType::WTR_Lod0MultiSurfaceNode) { + + parseGeometryForLODLevel(0); } else if (node == NodeType::BLDG_Lod1MultiCurveNode || node == NodeType::BLDG_Lod1MultiSurfaceNode || node == NodeType::BLDG_Lod1SolidNode @@ -355,7 +360,10 @@ namespace citygml { || node == NodeType::WTR_Lod4SurfaceNode) { parseGeometryForLODLevel(4); - } else if (node == NodeType::GEN_Lod1GeometryNode + } else if (node == NodeType::GEN_Lod0GeometryNode) { + parseGeometryPropertyElementForLODLevel(0, attributes.getCityGMLIDAttribute()); + } + else if (node == NodeType::GEN_Lod1GeometryNode || node == NodeType::FRN_Lod1GeometryNode || node == NodeType::VEG_Lod1GeometryNode) { parseGeometryPropertyElementForLODLevel(1, attributes.getCityGMLIDAttribute()); @@ -374,6 +382,9 @@ namespace citygml { || node == NodeType::BLDG_Lod4GeometryNode || node == NodeType::VEG_Lod4GeometryNode) { parseGeometryPropertyElementForLODLevel(4, attributes.getCityGMLIDAttribute()); + } else if (node == NodeType::GEN_Lod0ImplicitRepresentationNode) { + + parseImplicitGeometryForLODLevel(0); } else if (node == NodeType::VEG_Lod1ImplicitRepresentationNode || node == NodeType::FRN_Lod1ImplicitRepresentationNode || node == NodeType::GEN_Lod1ImplicitRepresentationNode) { @@ -398,12 +409,7 @@ namespace citygml { || node == NodeType::CORE_ExternalReferenceNode || node == NodeType::GML_MultiPointNode || node == NodeType::GRP_GeometryNode - || node == NodeType::GEN_Lod0GeometryNode - || node == NodeType::GEN_Lod0ImplicitRepresentationNode - || node == NodeType::GEN_Lod0TerrainIntersectionNode || node == NodeType::TRANS_Lod0NetworkNode - || node == NodeType::WTR_Lod0MultiCurveNode - || node == NodeType::WTR_Lod0MultiSurfaceNode || node == NodeType::GML_RectifiedGridCoverageNode) { CITYGML_LOG_INFO(m_logger, "Skipping CityObject child element <" << node << "> at " << getDocumentLocation() << " (Currently not supported!)"); setParserForNextElement(new SkipElementParser(m_documentParser, m_logger, node)); From 6f0ad1df1b884182154af74383f22b65fe043763 Mon Sep 17 00:00:00 2001 From: HarutakaMatsumoto Date: Mon, 8 Nov 2021 18:54:19 +0900 Subject: [PATCH 02/10] Implemented RectifiedGridCoverage --- sources/CMakeLists.txt | 2 + sources/include/citygml/citygmlfactory.h | 2 + sources/include/citygml/cityobject.h | 1 + .../include/citygml/rectifiedgridcoverage.hpp | 55 +++++++++++ sources/src/citygml/citygmlfactory.cpp | 5 + sources/src/citygml/rectifiedgridcoverage.cpp | 96 +++++++++++++++++++ .../src/parser/cityobjectelementparser.cpp | 3 +- 7 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 sources/include/citygml/rectifiedgridcoverage.hpp create mode 100644 sources/src/citygml/rectifiedgridcoverage.cpp diff --git a/sources/CMakeLists.txt b/sources/CMakeLists.txt index eb7480a0..5deb020d 100644 --- a/sources/CMakeLists.txt +++ b/sources/CMakeLists.txt @@ -77,6 +77,7 @@ SET(SOURCES src/citygml/geometrymanager.cpp src/citygml/linestring.cpp src/citygml/address.cpp + src/citygml/rectifiedgridcoverage.cpp src/parser/nodetypes.cpp src/parser/attributes.cpp @@ -145,6 +146,7 @@ SET(PUBLIC_HEADER include/citygml/citygmlfactory.h include/citygml/linestring.h include/citygml/address.h + include/citygml/rectifiedgridcoverage.hpp ) SET(HEADERS diff --git a/sources/include/citygml/citygmlfactory.h b/sources/include/citygml/citygmlfactory.h index eb99bda3..40d37564 100644 --- a/sources/include/citygml/citygmlfactory.h +++ b/sources/include/citygml/citygmlfactory.h @@ -19,6 +19,7 @@ namespace citygml { class ImplicitGeometry; class Polygon; class LineString; + class RectifiedGridCoverage; class Appearance; class Texture; @@ -32,6 +33,7 @@ namespace citygml { public: CityGMLFactory(std::shared_ptr logger); + RectifiedGridCoverage* createRectifiedGridCoverage(std::string const& id); CityModel* createCityModel(const std::string& id); CityObject* createCityObject(const std::string& id, CityObject::CityObjectsType type); Geometry* createGeometry(const std::string& id, const CityObject::CityObjectsType& cityObjType = CityObject::CityObjectsType::COT_All, unsigned int lod = 0, std::string srsName = ""); diff --git a/sources/include/citygml/cityobject.h b/sources/include/citygml/cityobject.h index 40b388e4..bf5b6b17 100644 --- a/sources/include/citygml/cityobject.h +++ b/sources/include/citygml/cityobject.h @@ -17,6 +17,7 @@ namespace citygml { class CityGMLLogger; class AppearanceManager; class Address; + class RectifiedGridCoverage; class LIBCITYGML_EXPORT CityObject : public FeatureObject { diff --git a/sources/include/citygml/rectifiedgridcoverage.hpp b/sources/include/citygml/rectifiedgridcoverage.hpp new file mode 100644 index 00000000..85e2e09e --- /dev/null +++ b/sources/include/citygml/rectifiedgridcoverage.hpp @@ -0,0 +1,55 @@ +// +// rectifiedgridcoverage.hpp +// citygml +// +// Created by 松本青空 on 2021/10/29. +// + +#pragma once + +#include + +#include +#include + +#include +#include + +namespace citygml { + + class LIBCITYGML_EXPORT RectifiedGridCoverage : public FeatureObject + { + friend class CityGMLFactory; + + protected: + RectifiedGridCoverage(std::string const& id = "RectifiedGridCoverage"); + + class Parser : public GMLFeatureCollectionElementParser + { + public: + Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); + + // ElementParser interface + virtual std::string elementParserName() const override; + virtual bool handlesElement(const NodeType::XMLNode &node) const override; + protected: + + // CityGMLElementParser interface + virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; + virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; + virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; + virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; + + // GMLFeatureCollectionElementParser interface + virtual FeatureObject* getFeatureObject() override; + + private: + std::function m_callback; + RectifiedGridCoverage* m_model; + }; + }; + + LIBCITYGML_EXPORT std::ostream& operator<<( std::ostream& os, const RectifiedGridCoverage& o ); + +} + diff --git a/sources/src/citygml/citygmlfactory.cpp b/sources/src/citygml/citygmlfactory.cpp index 1a80e4c8..08f5f49b 100644 --- a/sources/src/citygml/citygmlfactory.cpp +++ b/sources/src/citygml/citygmlfactory.cpp @@ -15,6 +15,7 @@ #include #include #include +#include namespace citygml { @@ -26,6 +27,10 @@ namespace citygml { m_logger = logger; } + RectifiedGridCoverage* CityGMLFactory::createRectifiedGridCoverage(std::string const& id) { + return new RectifiedGridCoverage(id); + } + CityModel* CityGMLFactory::createCityModel(const std::string& id) { return new CityModel(id); diff --git a/sources/src/citygml/rectifiedgridcoverage.cpp b/sources/src/citygml/rectifiedgridcoverage.cpp new file mode 100644 index 00000000..aaaf9815 --- /dev/null +++ b/sources/src/citygml/rectifiedgridcoverage.cpp @@ -0,0 +1,96 @@ +// +// rectifiedgridcoverage.cpp +// citygml +// +// Created by 松本青空 on 2021/10/29. +// + +#include "citygml/rectifiedgridcoverage.hpp" + +#include "parser/nodetypes.h" +#include "parser/attributes.h" +#include "parser/documentlocation.h" +#include "parser/cityobjectelementparser.h" +#include "parser/appearanceelementparser.h" + +#include +#include +#include +#include + +#include + +namespace citygml { + RectifiedGridCoverage::RectifiedGridCoverage(std::string const& id) : FeatureObject(id) { + } + + RectifiedGridCoverage::Parser::Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) + : GMLFeatureCollectionElementParser(documentParser, factory, logger) + { + m_callback = callback; + m_model = nullptr; + } + + bool RectifiedGridCoverage::Parser::handlesElement(const NodeType::XMLNode& node) const + { + return node == NodeType::GML_RectifiedGridCoverageNode; + } + + std::string RectifiedGridCoverage::Parser::elementParserName() const + { + return "RectifiedGridCoverage::Parser"; + } + + bool RectifiedGridCoverage::Parser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) + { + if (node != NodeType::GML_RectifiedGridCoverageNode) { + CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::CORE_CityModelNode.name() << "> got <" << node.name() << "> at " << getDocumentLocation()); + throw std::runtime_error("Unexpected start tag found."); + } + + m_model = m_factory.createRectifiedGridCoverage(attributes.getCityGMLIDAttribute()); + return true; + } + + bool RectifiedGridCoverage::Parser::parseElementEndTag(const NodeType::XMLNode& node, const std::string&) + { + if (node != NodeType::GML_RectifiedGridCoverageNode) { + CITYGML_LOG_WARN(m_logger, "Expected end tag <" << NodeType::CORE_CityModelNode.name() << "> got <" << node.name() << "> at " << getDocumentLocation()); + } + + if (getSourceSRSOverride()) { + Envelope *envelope = new Envelope(getEnvelope().srsName()); + envelope->setLowerBound(m_model->getEnvelope().getLowerBound()); + envelope->setUpperBound(m_model->getEnvelope().getUpperBound()); + m_model->setEnvelope(envelope); + } + m_callback(m_model); + return true; + } + + + bool RectifiedGridCoverage::Parser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) + { + if (m_model == nullptr) { + throw std::runtime_error("RectifiedGridCoverage::parseChildElementStartTag called before RectifiedGridCoverage::parseElementStartTag"); + } + + return GMLObjectElementParser::parseChildElementStartTag(node, attributes); + } + + bool RectifiedGridCoverage::Parser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) + { + + if (m_model == nullptr) { + throw std::runtime_error("RectifiedGridCoverage::parseChildElementEndTag called before RectifiedGridCoverage::parseElementStartTag"); + } + + return GMLObjectElementParser::parseChildElementEndTag(node, characters); + } + + FeatureObject* RectifiedGridCoverage::Parser::getFeatureObject() + { + return m_model; + } + +} diff --git a/sources/src/parser/cityobjectelementparser.cpp b/sources/src/parser/cityobjectelementparser.cpp index c5936f03..4612ef1b 100644 --- a/sources/src/parser/cityobjectelementparser.cpp +++ b/sources/src/parser/cityobjectelementparser.cpp @@ -409,8 +409,7 @@ namespace citygml { || node == NodeType::CORE_ExternalReferenceNode || node == NodeType::GML_MultiPointNode || node == NodeType::GRP_GeometryNode - || node == NodeType::TRANS_Lod0NetworkNode - || node == NodeType::GML_RectifiedGridCoverageNode) { + || node == NodeType::TRANS_Lod0NetworkNode) { CITYGML_LOG_INFO(m_logger, "Skipping CityObject child element <" << node << "> at " << getDocumentLocation() << " (Currently not supported!)"); setParserForNextElement(new SkipElementParser(m_documentParser, m_logger, node)); return true; From 630bec1c37d1621d964c827fcc29835635f74949 Mon Sep 17 00:00:00 2001 From: HarutakaMatsumoto Date: Fri, 12 Nov 2021 14:49:15 +0900 Subject: [PATCH 03/10] Implemented RectifiedGridCoverage --- sources/include/citygml/cityobject.h | 8 +++++++- sources/include/citygml/rectifiedgridcoverage.hpp | 11 ++++++----- sources/src/citygml/cityobject.cpp | 8 ++++++++ sources/src/citygml/rectifiedgridcoverage.cpp | 2 +- sources/src/parser/cityobjectelementparser.cpp | 12 +++++++++--- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/sources/include/citygml/cityobject.h b/sources/include/citygml/cityobject.h index bf5b6b17..1f380c9f 100644 --- a/sources/include/citygml/cityobject.h +++ b/sources/include/citygml/cityobject.h @@ -6,6 +6,7 @@ #include #include #include +#include "citygml/rectifiedgridcoverage.hpp" class Tesselator; namespace citygml { @@ -17,7 +18,7 @@ namespace citygml { class CityGMLLogger; class AppearanceManager; class Address; - class RectifiedGridCoverage; +// class RectifiedGridCoverage; class LIBCITYGML_EXPORT CityObject : public FeatureObject { @@ -109,6 +110,10 @@ namespace citygml { // Access address const Address* address() const; void setAddress(std::unique_ptr
&& address); + + // Access rectifiedGridCoverage + RectifiedGridCoverage const* rectifiedGridCoverage() const; + void setRectifiedGridCoverage(RectifiedGridCoverage * rectifiedGridCoverage); void finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger); @@ -121,6 +126,7 @@ namespace citygml { std::vector > m_implicitGeometries; std::vector > m_children; std::unique_ptr
m_address; + std::unique_ptr m_rectifiedGridCoverage; }; LIBCITYGML_EXPORT std::ostream& operator<<( std::ostream& os, const CityObject& o ); diff --git a/sources/include/citygml/rectifiedgridcoverage.hpp b/sources/include/citygml/rectifiedgridcoverage.hpp index 85e2e09e..f624fb1c 100644 --- a/sources/include/citygml/rectifiedgridcoverage.hpp +++ b/sources/include/citygml/rectifiedgridcoverage.hpp @@ -20,14 +20,12 @@ namespace citygml { class LIBCITYGML_EXPORT RectifiedGridCoverage : public FeatureObject { friend class CityGMLFactory; - - protected: - RectifiedGridCoverage(std::string const& id = "RectifiedGridCoverage"); + public: class Parser : public GMLFeatureCollectionElementParser { public: - Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); + Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); // ElementParser interface virtual std::string elementParserName() const override; @@ -45,8 +43,11 @@ namespace citygml { private: std::function m_callback; - RectifiedGridCoverage* m_model; + RectifiedGridCoverage * m_model; }; + + protected: + RectifiedGridCoverage(std::string const& id = "RectifiedGridCoverage"); }; LIBCITYGML_EXPORT std::ostream& operator<<( std::ostream& os, const RectifiedGridCoverage& o ); diff --git a/sources/src/citygml/cityobject.cpp b/sources/src/citygml/cityobject.cpp index 4b050621..c9212d1c 100644 --- a/sources/src/citygml/cityobject.cpp +++ b/sources/src/citygml/cityobject.cpp @@ -98,6 +98,14 @@ namespace citygml { m_address = std::move(address); } +RectifiedGridCoverage const* CityObject::rectifiedGridCoverage() const { + return m_rectifiedGridCoverage.get(); +} + +void CityObject::setRectifiedGridCoverage(RectifiedGridCoverage * rectifiedGridCoverage) { + m_rectifiedGridCoverage = std::unique_ptr(rectifiedGridCoverage); +} + void CityObject::finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger) { for (std::unique_ptr& geom : m_geometries) { diff --git a/sources/src/citygml/rectifiedgridcoverage.cpp b/sources/src/citygml/rectifiedgridcoverage.cpp index aaaf9815..7b084ce7 100644 --- a/sources/src/citygml/rectifiedgridcoverage.cpp +++ b/sources/src/citygml/rectifiedgridcoverage.cpp @@ -24,7 +24,7 @@ namespace citygml { RectifiedGridCoverage::RectifiedGridCoverage(std::string const& id) : FeatureObject(id) { } - RectifiedGridCoverage::Parser::Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) + RectifiedGridCoverage::Parser::Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) : GMLFeatureCollectionElementParser(documentParser, factory, logger) { m_callback = callback; diff --git a/sources/src/parser/cityobjectelementparser.cpp b/sources/src/parser/cityobjectelementparser.cpp index 4612ef1b..fb77475a 100644 --- a/sources/src/parser/cityobjectelementparser.cpp +++ b/sources/src/parser/cityobjectelementparser.cpp @@ -10,6 +10,7 @@ #include "parser/delayedchoiceelementparser.h" #include "parser/linestringelementparser.h" #include "parser/addressparser.h" +#include "citygml/rectifiedgridcoverage.hpp" #include #include @@ -273,6 +274,11 @@ namespace citygml { } else if (attributesSet.count(node.typeID()) > 0 || node == NodeType::GEN_ValueNode) { return true; + } else if (node == NodeType::GML_RectifiedGridCoverageNode) { + + setParserForNextElement(new RectifiedGridCoverage::Parser(m_documentParser, m_factory, m_logger, [this](RectifiedGridCoverage * rectifiedGridCoverage) { + m_model->setRectifiedGridCoverage(rectifiedGridCoverage); + })); } else if (node == NodeType::BLDG_BoundedByNode || node == NodeType::BLDG_OuterBuildingInstallationNode || node == NodeType::BLDG_InteriorBuildingInstallationNode @@ -291,7 +297,8 @@ namespace citygml { || node == NodeType::DEM_MassPointReliefNode || node == NodeType::DEM_BreaklineReliefNode || node == NodeType::DEM_RasterReliefNode - || node == NodeType::DEM_GridNode) { + || node == NodeType::DEM_GridNode + || node == NodeType::CORE_GeneralizesToNode) { setParserForNextElement(new CityObjectElementParser(m_documentParser, m_factory, m_logger, [this](CityObject* obj) { m_model->addChildCityObject(obj); })); @@ -405,8 +412,7 @@ namespace citygml { || node == NodeType::GEN_Lod4ImplicitRepresentationNode) { parseImplicitGeometryForLODLevel(4); - } else if (node == NodeType::CORE_GeneralizesToNode - || node == NodeType::CORE_ExternalReferenceNode + } else if (node == NodeType::CORE_ExternalReferenceNode || node == NodeType::GML_MultiPointNode || node == NodeType::GRP_GeometryNode || node == NodeType::TRANS_Lod0NetworkNode) { From 4115a66b07958976769c3c4138df480977594699 Mon Sep 17 00:00:00 2001 From: HarutakaMatsumoto Date: Thu, 18 Nov 2021 17:29:40 +0900 Subject: [PATCH 04/10] Implementing ExternalReference --- sources/CMakeLists.txt | 2 + sources/include/citygml/externalreference.h | 51 +++++++++++++++++++++ sources/src/citygml/externalreference.cpp | 35 ++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 sources/include/citygml/externalreference.h create mode 100644 sources/src/citygml/externalreference.cpp diff --git a/sources/CMakeLists.txt b/sources/CMakeLists.txt index 5deb020d..c8efd707 100644 --- a/sources/CMakeLists.txt +++ b/sources/CMakeLists.txt @@ -78,6 +78,7 @@ SET(SOURCES src/citygml/linestring.cpp src/citygml/address.cpp src/citygml/rectifiedgridcoverage.cpp + src/citygml/externalreference.cpp src/parser/nodetypes.cpp src/parser/attributes.cpp @@ -147,6 +148,7 @@ SET(PUBLIC_HEADER include/citygml/linestring.h include/citygml/address.h include/citygml/rectifiedgridcoverage.hpp + include/citygml/externalreference.h ) SET(HEADERS diff --git a/sources/include/citygml/externalreference.h b/sources/include/citygml/externalreference.h new file mode 100644 index 00000000..54b3dbce --- /dev/null +++ b/sources/include/citygml/externalreference.h @@ -0,0 +1,51 @@ +// +// ExternalReference.h +// libcitygml +// +// Created by 松本青空 on 2021/11/12. +// + +#pragma once + +#include +#include +#include "parser/gmlobjectparser.h" + +namespace citygml { + union LIBCITYGML_EXPORT ExternalObjectReference { + std::string name; + std::string uri; + }; + + class LIBCITYGML_EXPORT ExternalReference: public Object { + public: + class Parser: public GMLObjectElementParser { + public: + Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); + + // ElementParser interface + virtual std::string elementParserName() const override; + virtual bool handlesElement(NodeType::XMLNode const& node) const override; + + protected: + // CityGMLElementParser interaface + virtual bool parseElementStartTag(NodeType::XMLNode const& node, Attributes & attribute) override; + virtual bool parseElementEndTag(NodeType::XMLNode const& node, std::string const& characters) override; + virtual bool parseChildElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) override; + virtual bool parseChildElementEndTag(NodeType::XMLNode const& node, std::string const& characters) override; + + // GMLObjectElementParser interface + virtual Object* getObject() override; + + private: + std::unique_ptr model; + std::function callback; + }; + + ExternalReference() = default; + ~ExternalReference() noexcept override; // Destructor + + std::string informationSystem; + ExternalObjectReference externalObject; + }; +} diff --git a/sources/src/citygml/externalreference.cpp b/sources/src/citygml/externalreference.cpp new file mode 100644 index 00000000..8145de05 --- /dev/null +++ b/sources/src/citygml/externalreference.cpp @@ -0,0 +1,35 @@ +// +// externalreference.cpp +// libcitygml +// +// Created by 松本青空 on 2021/11/15. +// + +#include "citygml/externalreference.h" +#include "citygml/citygmllogger.h" +#include "parser/documentlocation.h" +#include "parser/nodetypes.h" + +namespace citygml { +ExternalReference::Parser::Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) + : GMLObjectElementParser(documentParser, factory, logger) { + this->callback = callback; +} + +std::string ExternalReference::Parser::elementParserName() const { + return "ExternalReference::Parser"; +} + +bool ExternalReference::Parser::handlesElement(NodeType::XMLNode const& node) const { + return node.typeID() == NodeType::CORE_ExternalReferenceNode.typeID(); +} + +bool ExternalReference::Parser::parseElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) { + if (!handlesElement(node)) { + CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::CORE_ExternalReferenceNode << "> but got <" << node.name() << "> at " << getDocumentLocation()); + } + + model = new ExternalReference(); +} +} + From 37aecc3dd031f07486d97c5e0fd5848b8d6a9109 Mon Sep 17 00:00:00 2001 From: HarutakaMatsumoto Date: Fri, 19 Nov 2021 12:27:08 +0900 Subject: [PATCH 05/10] Implemented ExternalReference and subjects --- sources/include/citygml/citygmlfactory.h | 2 + sources/include/citygml/cityobject.h | 6 ++ sources/include/citygml/externalreference.h | 11 +++- sources/src/citygml/citygmlfactory.cpp | 5 ++ sources/src/citygml/cityobject.cpp | 8 +++ sources/src/citygml/externalreference.cpp | 56 ++++++++++++++++++- .../src/parser/cityobjectelementparser.cpp | 8 ++- 7 files changed, 90 insertions(+), 6 deletions(-) diff --git a/sources/include/citygml/citygmlfactory.h b/sources/include/citygml/citygmlfactory.h index 40d37564..e5bbb5e9 100644 --- a/sources/include/citygml/citygmlfactory.h +++ b/sources/include/citygml/citygmlfactory.h @@ -2,6 +2,7 @@ #include #include +#include "citygml/externalreference.h" #include @@ -40,6 +41,7 @@ namespace citygml { std::shared_ptr createPolygon(const std::string& id); std::shared_ptr createLineString(const std::string& id); + std::shared_ptr createExternalReference(const std::string& id); /** * @brief requests a polygon for a Geometry object that will be added later diff --git a/sources/include/citygml/cityobject.h b/sources/include/citygml/cityobject.h index 1f380c9f..f5aae45d 100644 --- a/sources/include/citygml/cityobject.h +++ b/sources/include/citygml/cityobject.h @@ -7,6 +7,7 @@ #include #include #include "citygml/rectifiedgridcoverage.hpp" +#include "citygml/externalreference.h" class Tesselator; namespace citygml { @@ -114,6 +115,10 @@ namespace citygml { // Access rectifiedGridCoverage RectifiedGridCoverage const* rectifiedGridCoverage() const; void setRectifiedGridCoverage(RectifiedGridCoverage * rectifiedGridCoverage); + + // Access externalReference + ExternalReference const* externalReference() const; + void setExternalReference(ExternalReference * externalReference); void finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger); @@ -127,6 +132,7 @@ namespace citygml { std::vector > m_children; std::unique_ptr
m_address; std::unique_ptr m_rectifiedGridCoverage; + std::unique_ptr m_externalReference; }; LIBCITYGML_EXPORT std::ostream& operator<<( std::ostream& os, const CityObject& o ); diff --git a/sources/include/citygml/externalreference.h b/sources/include/citygml/externalreference.h index 54b3dbce..acc22ce8 100644 --- a/sources/include/citygml/externalreference.h +++ b/sources/include/citygml/externalreference.h @@ -15,9 +15,13 @@ namespace citygml { union LIBCITYGML_EXPORT ExternalObjectReference { std::string name; std::string uri; + + ExternalObjectReference(); + ~ExternalObjectReference(); }; class LIBCITYGML_EXPORT ExternalReference: public Object { + friend class CityGMLFactory; public: class Parser: public GMLObjectElementParser { public: @@ -38,13 +42,14 @@ namespace citygml { virtual Object* getObject() override; private: - std::unique_ptr model; + std::shared_ptr model; std::function callback; }; - ExternalReference() = default; - ~ExternalReference() noexcept override; // Destructor + protected: + ExternalReference(std::string const& id); +// ~ExternalReference() noexcept override; // Destructor std::string informationSystem; ExternalObjectReference externalObject; }; diff --git a/sources/src/citygml/citygmlfactory.cpp b/sources/src/citygml/citygmlfactory.cpp index 08f5f49b..7f680723 100644 --- a/sources/src/citygml/citygmlfactory.cpp +++ b/sources/src/citygml/citygmlfactory.cpp @@ -93,7 +93,12 @@ namespace citygml { { LineString* lineString = new LineString(id); return std::shared_ptr(lineString); + } + std::shared_ptr CityGMLFactory::createExternalReference(const std::string& id) + { + ExternalReference * externalReference = new ExternalReference(id); + return std::shared_ptr(externalReference); } void CityGMLFactory::requestSharedPolygonForGeometry(Geometry* geom, const std::string& polygonId) diff --git a/sources/src/citygml/cityobject.cpp b/sources/src/citygml/cityobject.cpp index c9212d1c..2d828b00 100644 --- a/sources/src/citygml/cityobject.cpp +++ b/sources/src/citygml/cityobject.cpp @@ -106,6 +106,14 @@ void CityObject::setRectifiedGridCoverage(RectifiedGridCoverage * rectifiedGridC m_rectifiedGridCoverage = std::unique_ptr(rectifiedGridCoverage); } +ExternalReference const* CityObject::externalReference() const { + return m_externalReference.get(); +} + +void CityObject::setExternalReference(ExternalReference * externalReference) { + m_externalReference = std::unique_ptr(externalReference); +} + void CityObject::finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger) { for (std::unique_ptr& geom : m_geometries) { diff --git a/sources/src/citygml/externalreference.cpp b/sources/src/citygml/externalreference.cpp index 8145de05..29333571 100644 --- a/sources/src/citygml/externalreference.cpp +++ b/sources/src/citygml/externalreference.cpp @@ -7,10 +7,18 @@ #include "citygml/externalreference.h" #include "citygml/citygmllogger.h" +#include "citygml/citygmlfactory.h" +#include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/nodetypes.h" namespace citygml { +ExternalObjectReference::ExternalObjectReference() { +} + +ExternalObjectReference::~ExternalObjectReference() { +} + ExternalReference::Parser::Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) : GMLObjectElementParser(documentParser, factory, logger) { this->callback = callback; @@ -29,7 +37,53 @@ bool ExternalReference::Parser::parseElementStartTag(NodeType::XMLNode const& no CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::CORE_ExternalReferenceNode << "> but got <" << node.name() << "> at " << getDocumentLocation()); } - model = new ExternalReference(); + model = m_factory.createExternalReference(attributes.getCityGMLIDAttribute()); + + return true; +} + +bool ExternalReference::Parser::parseElementEndTag(NodeType::XMLNode const& node, std::string const&) { + callback(model.get()); + return true; +} + +bool ExternalReference::Parser::parseChildElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) { + if (model == nullptr) { + throw std::runtime_error("ExternalReference::Parser::parseChildElementStartTag called before ExternalReference::Parser::parseElementStartTag"); + } + + if (node == NodeType::CORE_ExternalObjectNode + || node == NodeType::CORE_InformationSystemNode + || node == NodeType::CORE_NameNode + || node == NodeType::CORE_UriNode) { + return true; + } + + return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } + +bool ExternalReference::Parser::parseChildElementEndTag(NodeType::XMLNode const& node, std::string const& characters) { + if (model == nullptr) { + throw std::runtime_error("ExternalReference::Parser::parseChildElementEndTag called before ExternalReference::Parser::parseElementStartTag"); + } + + if (node == NodeType::CORE_ExternalObjectNode) { + return true; + } else if (node == NodeType::CORE_InformationSystemNode) { + model->informationSystem = characters; + } else if (node == NodeType::CORE_NameNode) { + model->externalObject.name = characters; + } else if (node == NodeType::CORE_UriNode) { + model->externalObject.uri = characters; + } + + return GMLObjectElementParser::parseChildElementEndTag(node, characters); +} + +Object * ExternalReference::Parser::getObject() { + return model.get(); } +ExternalReference::ExternalReference(std::string const& id) : Object(id) { +} +} diff --git a/sources/src/parser/cityobjectelementparser.cpp b/sources/src/parser/cityobjectelementparser.cpp index fb77475a..f4695eb3 100644 --- a/sources/src/parser/cityobjectelementparser.cpp +++ b/sources/src/parser/cityobjectelementparser.cpp @@ -412,8 +412,12 @@ namespace citygml { || node == NodeType::GEN_Lod4ImplicitRepresentationNode) { parseImplicitGeometryForLODLevel(4); - } else if (node == NodeType::CORE_ExternalReferenceNode - || node == NodeType::GML_MultiPointNode + } else if (node == NodeType::CORE_ExternalReferenceNode){ + + setParserForNextElement(new ExternalReference::Parser(m_documentParser, m_factory, m_logger, [this](ExternalReference * externalReference){ + m_model->setExternalReference(externalReference); + })); + } else if (node == NodeType::GML_MultiPointNode || node == NodeType::GRP_GeometryNode || node == NodeType::TRANS_Lod0NetworkNode) { CITYGML_LOG_INFO(m_logger, "Skipping CityObject child element <" << node << "> at " << getDocumentLocation() << " (Currently not supported!)"); From 008ab64b82e7c3a1c72028f9ff9576448091b023 Mon Sep 17 00:00:00 2001 From: HarutakaMatsumoto Date: Tue, 18 Jan 2022 13:55:44 +0900 Subject: [PATCH 06/10] Deativate tessallation. Failed using this library externally --- sources/src/citygml/polygon.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sources/src/citygml/polygon.cpp b/sources/src/citygml/polygon.cpp index 31c36373..8217695c 100644 --- a/sources/src/citygml/polygon.cpp +++ b/sources/src/citygml/polygon.cpp @@ -243,8 +243,9 @@ namespace citygml { if (optimize) { removeDuplicateVerticesInRings(logger); } - - computeIndices(tesselator, logger); + + +// computeIndices(tesselator, logger); } From 5d7a1123e6015e0ba2d5262ca11bd6607a8bcced Mon Sep 17 00:00:00 2001 From: HarutakaMatsumoto Date: Wed, 19 Jan 2022 10:41:51 +0900 Subject: [PATCH 07/10] Can use. Validate tesselate --- sources/CMakeLists.txt | 4 + sources/include/citygml/citygml.h | 1 + sources/include/citygml/citymodel.h | 2 +- sources/include/citygml/cityobject.h | 2 +- sources/include/citygml/externalreference.h | 28 +----- sources/include/citygml/geometry.h | 2 +- sources/include/citygml/polygon.h | 2 +- .../include/citygml/rectifiedgridcoverage.hpp | 31 ------- .../include/parser/externalreferenceparser.h | 37 ++++++++ .../parser/rectifiedgridcoverageparser.h | 42 +++++++++ sources/src/citygml/citymodel.cpp | 4 +- sources/src/citygml/cityobject.cpp | 8 +- sources/src/citygml/externalreference.cpp | 70 -------------- sources/src/citygml/geometry.cpp | 6 +- sources/src/citygml/polygon.cpp | 8 +- sources/src/citygml/rectifiedgridcoverage.cpp | 83 ----------------- sources/src/parser/citygmldocumentparser.cpp | 2 +- .../src/parser/cityobjectelementparser.cpp | 7 +- .../src/parser/externalreferenceparser.cpp | 82 ++++++++++++++++ .../parser/rectifiedgridcoverageparser.cpp | 93 +++++++++++++++++++ test/citygmltest.cpp | 3 +- 21 files changed, 285 insertions(+), 232 deletions(-) create mode 100644 sources/include/parser/externalreferenceparser.h create mode 100644 sources/include/parser/rectifiedgridcoverageparser.h create mode 100644 sources/src/parser/externalreferenceparser.cpp create mode 100644 sources/src/parser/rectifiedgridcoverageparser.cpp diff --git a/sources/CMakeLists.txt b/sources/CMakeLists.txt index c8efd707..f8de959d 100644 --- a/sources/CMakeLists.txt +++ b/sources/CMakeLists.txt @@ -100,11 +100,13 @@ SET(SOURCES src/parser/citymodelelementparser.cpp src/parser/cityobjectelementparser.cpp src/parser/appearanceelementparser.cpp + src/parser/externalreferenceparser.cpp src/parser/materialelementparser.cpp src/parser/textureelementparser.cpp src/parser/georeferencedtextureelementparser.cpp src/parser/geometryelementparser.cpp src/parser/polygonelementparser.cpp + src/parser/rectifiedgridcoverageparser.cpp src/parser/linestringelementparser.cpp src/parser/linearringelementparser.cpp src/parser/implicitgeometryelementparser.cpp @@ -183,11 +185,13 @@ SET(HEADERS include/parser/citymodelelementparser.h include/parser/cityobjectelementparser.h include/parser/appearanceelementparser.h + include/parser/externalreferenceparser.h include/parser/materialelementparser.h include/parser/textureelementparser.h include/parser/georeferencedtextureelementparser.h include/parser/geometryelementparser.h include/parser/polygonelementparser.h + include/parser/rectifiedgridcoverageparser.h include/parser/linestringelementparser.h include/parser/linearringelementparser.h include/parser/implicitgeometryelementparser.h diff --git a/sources/include/citygml/citygml.h b/sources/include/citygml/citygml.h index f39e3bb1..9d3677ef 100644 --- a/sources/include/citygml/citygml.h +++ b/sources/include/citygml/citygml.h @@ -69,6 +69,7 @@ namespace citygml , minLOD( 0 ) , maxLOD( 4 ) , optimize( false ) + , tesselate( false ) , pruneEmptyObjects( false ) , destSRS( "" ) , srcSRS( "" ) diff --git a/sources/include/citygml/citymodel.h b/sources/include/citygml/citymodel.h index 4a28e35e..02752654 100644 --- a/sources/include/citygml/citymodel.h +++ b/sources/include/citygml/citymodel.h @@ -39,7 +39,7 @@ namespace citygml { const std::string& getSRSName() const; - void finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger); + void finish(Tesselator& tesselator, bool optimize, bool tesselate, std::shared_ptr logger); std::vector themes() const; void setThemes(std::vector themes); diff --git a/sources/include/citygml/cityobject.h b/sources/include/citygml/cityobject.h index f5aae45d..65e1ff1b 100644 --- a/sources/include/citygml/cityobject.h +++ b/sources/include/citygml/cityobject.h @@ -120,7 +120,7 @@ namespace citygml { ExternalReference const* externalReference() const; void setExternalReference(ExternalReference * externalReference); - void finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger); + void finish(Tesselator& tesselator, bool optimize, bool tesselate, std::shared_ptr logger); virtual ~CityObject(); diff --git a/sources/include/citygml/externalreference.h b/sources/include/citygml/externalreference.h index acc22ce8..41c9540a 100644 --- a/sources/include/citygml/externalreference.h +++ b/sources/include/citygml/externalreference.h @@ -7,9 +7,8 @@ #pragma once -#include #include -#include "parser/gmlobjectparser.h" + namespace citygml { union LIBCITYGML_EXPORT ExternalObjectReference { @@ -22,34 +21,11 @@ namespace citygml { class LIBCITYGML_EXPORT ExternalReference: public Object { friend class CityGMLFactory; - public: - class Parser: public GMLObjectElementParser { - public: - Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); - - // ElementParser interface - virtual std::string elementParserName() const override; - virtual bool handlesElement(NodeType::XMLNode const& node) const override; - - protected: - // CityGMLElementParser interaface - virtual bool parseElementStartTag(NodeType::XMLNode const& node, Attributes & attribute) override; - virtual bool parseElementEndTag(NodeType::XMLNode const& node, std::string const& characters) override; - virtual bool parseChildElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) override; - virtual bool parseChildElementEndTag(NodeType::XMLNode const& node, std::string const& characters) override; - - // GMLObjectElementParser interface - virtual Object* getObject() override; - - private: - std::shared_ptr model; - std::function callback; - }; - protected: ExternalReference(std::string const& id); // ~ExternalReference() noexcept override; // Destructor + public: std::string informationSystem; ExternalObjectReference externalObject; }; diff --git a/sources/include/citygml/geometry.h b/sources/include/citygml/geometry.h index ddc21723..523099ad 100644 --- a/sources/include/citygml/geometry.h +++ b/sources/include/citygml/geometry.h @@ -73,7 +73,7 @@ namespace citygml { * @param tesselator the tesselator to be used for tesselation * @param mergePolygons determines wether all polygons are merged into one */ - void finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger); + void finish(Tesselator& tesselator, bool optimize, bool tesselate, std::shared_ptr logger); ~Geometry(); diff --git a/sources/include/citygml/polygon.h b/sources/include/citygml/polygon.h index a0167bd7..146f3943 100644 --- a/sources/include/citygml/polygon.h +++ b/sources/include/citygml/polygon.h @@ -82,7 +82,7 @@ namespace citygml { void addRing( LinearRing* ); - void finish(Tesselator& tesselator , bool optimize, std::shared_ptr logger); + void finish(Tesselator& tesselator , bool optimize, bool tesselate, std::shared_ptr logger); std::shared_ptr exteriorRing(){ return m_exteriorRing; diff --git a/sources/include/citygml/rectifiedgridcoverage.hpp b/sources/include/citygml/rectifiedgridcoverage.hpp index f624fb1c..f7fddbe7 100644 --- a/sources/include/citygml/rectifiedgridcoverage.hpp +++ b/sources/include/citygml/rectifiedgridcoverage.hpp @@ -7,44 +7,13 @@ #pragma once -#include - -#include -#include - #include -#include namespace citygml { class LIBCITYGML_EXPORT RectifiedGridCoverage : public FeatureObject { friend class CityGMLFactory; - public: - - class Parser : public GMLFeatureCollectionElementParser - { - public: - Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); - - // ElementParser interface - virtual std::string elementParserName() const override; - virtual bool handlesElement(const NodeType::XMLNode &node) const override; - protected: - - // CityGMLElementParser interface - virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; - virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; - virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; - virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; - - // GMLFeatureCollectionElementParser interface - virtual FeatureObject* getFeatureObject() override; - - private: - std::function m_callback; - RectifiedGridCoverage * m_model; - }; protected: RectifiedGridCoverage(std::string const& id = "RectifiedGridCoverage"); diff --git a/sources/include/parser/externalreferenceparser.h b/sources/include/parser/externalreferenceparser.h new file mode 100644 index 00000000..1b7cf3dc --- /dev/null +++ b/sources/include/parser/externalreferenceparser.h @@ -0,0 +1,37 @@ +// +// externalreferenceparser.h +// libcitygml +// +// Created by 松本青空 on 2022/01/18. +// + +#pragma once + +#include "parser/gmlobjectparser.h" +#include + + +namespace citygml { + class ExternalReferenceParser: public GMLObjectElementParser { + public: + ExternalReferenceParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); + + // ElementParser interface + virtual std::string elementParserName() const override; + virtual bool handlesElement(NodeType::XMLNode const& node) const override; + + protected: + // CityGMLElementParser interaface + virtual bool parseElementStartTag(NodeType::XMLNode const& node, Attributes & attribute) override; + virtual bool parseElementEndTag(NodeType::XMLNode const& node, std::string const& characters) override; + virtual bool parseChildElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) override; + virtual bool parseChildElementEndTag(NodeType::XMLNode const& node, std::string const& characters) override; + + // GMLObjectElementParser interface + virtual Object* getObject() override; + + private: + std::shared_ptr model; + std::function callback; + }; +} diff --git a/sources/include/parser/rectifiedgridcoverageparser.h b/sources/include/parser/rectifiedgridcoverageparser.h new file mode 100644 index 00000000..057151f1 --- /dev/null +++ b/sources/include/parser/rectifiedgridcoverageparser.h @@ -0,0 +1,42 @@ +// +// rectifiedgridcoverageparser.h +// citygml +// +// Created by 松本青空 on 2022/01/18. +// + +#pragma once + +#include + +#include + + +namespace citygml { + + class RectifiedGridCoverageParser : public GMLFeatureCollectionElementParser + { + public: + RectifiedGridCoverageParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); + + // ElementParser interface + virtual std::string elementParserName() const override; + virtual bool handlesElement(const NodeType::XMLNode &node) const override; + protected: + + // CityGMLElementParser interface + virtual bool parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; + virtual bool parseElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; + virtual bool parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) override; + virtual bool parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) override; + + // GMLFeatureCollectionElementParser interface + virtual FeatureObject* getFeatureObject() override; + + private: + std::function m_callback; + RectifiedGridCoverage * m_model; + }; +} + + diff --git a/sources/src/citygml/citymodel.cpp b/sources/src/citygml/citymodel.cpp index 9f411dd1..8e861b2a 100644 --- a/sources/src/citygml/citymodel.cpp +++ b/sources/src/citygml/citymodel.cpp @@ -115,11 +115,11 @@ namespace citygml } - void CityModel::finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger) + void CityModel::finish(Tesselator& tesselator, bool optimize, bool tesselate, std::shared_ptr logger) { // Finish all cityobjcts for (auto& cityObj : m_roots) { - cityObj->finish(tesselator, optimize, logger); + cityObj->finish(tesselator, optimize, tesselate, logger); } // Build city objects map diff --git a/sources/src/citygml/cityobject.cpp b/sources/src/citygml/cityobject.cpp index 2d828b00..ffd1d8a4 100644 --- a/sources/src/citygml/cityobject.cpp +++ b/sources/src/citygml/cityobject.cpp @@ -114,20 +114,20 @@ void CityObject::setExternalReference(ExternalReference * externalReference) { m_externalReference = std::unique_ptr(externalReference); } - void CityObject::finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger) + void CityObject::finish(Tesselator& tesselator, bool optimize, bool tesselate, std::shared_ptr logger) { for (std::unique_ptr& geom : m_geometries) { - geom->finish(tesselator, optimize, logger); + geom->finish(tesselator, optimize, tesselate, logger); } for (std::unique_ptr& implictGeom : m_implicitGeometries) { for (int i = 0; i < implictGeom->getGeometriesCount(); i++) { - implictGeom->getGeometry(i).finish(tesselator, optimize, logger); + implictGeom->getGeometry(i).finish(tesselator, optimize, tesselate, logger); } } for (std::unique_ptr& child : m_children) { - child->finish(tesselator, optimize, logger); + child->finish(tesselator, optimize, tesselate, logger); } } diff --git a/sources/src/citygml/externalreference.cpp b/sources/src/citygml/externalreference.cpp index 29333571..7f6b2021 100644 --- a/sources/src/citygml/externalreference.cpp +++ b/sources/src/citygml/externalreference.cpp @@ -6,11 +6,6 @@ // #include "citygml/externalreference.h" -#include "citygml/citygmllogger.h" -#include "citygml/citygmlfactory.h" -#include "parser/attributes.h" -#include "parser/documentlocation.h" -#include "parser/nodetypes.h" namespace citygml { ExternalObjectReference::ExternalObjectReference() { @@ -19,71 +14,6 @@ ExternalObjectReference::ExternalObjectReference() { ExternalObjectReference::~ExternalObjectReference() { } -ExternalReference::Parser::Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) - : GMLObjectElementParser(documentParser, factory, logger) { - this->callback = callback; -} - -std::string ExternalReference::Parser::elementParserName() const { - return "ExternalReference::Parser"; -} - -bool ExternalReference::Parser::handlesElement(NodeType::XMLNode const& node) const { - return node.typeID() == NodeType::CORE_ExternalReferenceNode.typeID(); -} - -bool ExternalReference::Parser::parseElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) { - if (!handlesElement(node)) { - CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::CORE_ExternalReferenceNode << "> but got <" << node.name() << "> at " << getDocumentLocation()); - } - - model = m_factory.createExternalReference(attributes.getCityGMLIDAttribute()); - - return true; -} - -bool ExternalReference::Parser::parseElementEndTag(NodeType::XMLNode const& node, std::string const&) { - callback(model.get()); - return true; -} - -bool ExternalReference::Parser::parseChildElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) { - if (model == nullptr) { - throw std::runtime_error("ExternalReference::Parser::parseChildElementStartTag called before ExternalReference::Parser::parseElementStartTag"); - } - - if (node == NodeType::CORE_ExternalObjectNode - || node == NodeType::CORE_InformationSystemNode - || node == NodeType::CORE_NameNode - || node == NodeType::CORE_UriNode) { - return true; - } - - return GMLObjectElementParser::parseChildElementStartTag(node, attributes); -} - -bool ExternalReference::Parser::parseChildElementEndTag(NodeType::XMLNode const& node, std::string const& characters) { - if (model == nullptr) { - throw std::runtime_error("ExternalReference::Parser::parseChildElementEndTag called before ExternalReference::Parser::parseElementStartTag"); - } - - if (node == NodeType::CORE_ExternalObjectNode) { - return true; - } else if (node == NodeType::CORE_InformationSystemNode) { - model->informationSystem = characters; - } else if (node == NodeType::CORE_NameNode) { - model->externalObject.name = characters; - } else if (node == NodeType::CORE_UriNode) { - model->externalObject.uri = characters; - } - - return GMLObjectElementParser::parseChildElementEndTag(node, characters); -} - -Object * ExternalReference::Parser::getObject() { - return model.get(); -} - ExternalReference::ExternalReference(std::string const& id) : Object(id) { } } diff --git a/sources/src/citygml/geometry.cpp b/sources/src/citygml/geometry.cpp index 70115ee8..490b7576 100644 --- a/sources/src/citygml/geometry.cpp +++ b/sources/src/citygml/geometry.cpp @@ -137,7 +137,7 @@ namespace citygml { m_lineStrings.push_back(l); } - void Geometry::finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger) + void Geometry::finish(Tesselator& tesselator, bool optimize, bool tesselate, std::shared_ptr logger) { // only need to finish geometry once if (m_finished) { @@ -148,12 +148,12 @@ namespace citygml { for (std::shared_ptr& child : m_childGeometries) { child->addTargetDefinitionsOf(*this); - child->finish(tesselator, optimize, logger); + child->finish(tesselator, optimize, tesselate, logger); } for (std::shared_ptr& polygon : m_polygons) { polygon->addTargetDefinitionsOf(*this); - polygon->finish(tesselator, optimize, logger); + polygon->finish(tesselator, optimize, tesselate, logger); } } diff --git a/sources/src/citygml/polygon.cpp b/sources/src/citygml/polygon.cpp index 8217695c..8644d411 100644 --- a/sources/src/citygml/polygon.cpp +++ b/sources/src/citygml/polygon.cpp @@ -231,7 +231,7 @@ namespace citygml { } } - void Polygon::finish(Tesselator& tesselator, bool optimize, std::shared_ptr logger) + void Polygon::finish(Tesselator& tesselator, bool optimize, bool tesselate, std::shared_ptr logger) { if (m_finished) { // This may happen as Polygons can be shared between geometries @@ -244,9 +244,9 @@ namespace citygml { removeDuplicateVerticesInRings(logger); } - -// computeIndices(tesselator, logger); - + if (tesselate) { + computeIndices(tesselator, logger); + } } void Polygon::addRing( LinearRing* ring ) diff --git a/sources/src/citygml/rectifiedgridcoverage.cpp b/sources/src/citygml/rectifiedgridcoverage.cpp index 7b084ce7..e418a9dd 100644 --- a/sources/src/citygml/rectifiedgridcoverage.cpp +++ b/sources/src/citygml/rectifiedgridcoverage.cpp @@ -7,90 +7,7 @@ #include "citygml/rectifiedgridcoverage.hpp" -#include "parser/nodetypes.h" -#include "parser/attributes.h" -#include "parser/documentlocation.h" -#include "parser/cityobjectelementparser.h" -#include "parser/appearanceelementparser.h" - -#include -#include -#include -#include - -#include - namespace citygml { RectifiedGridCoverage::RectifiedGridCoverage(std::string const& id) : FeatureObject(id) { } - - RectifiedGridCoverage::Parser::Parser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) - : GMLFeatureCollectionElementParser(documentParser, factory, logger) - { - m_callback = callback; - m_model = nullptr; - } - - bool RectifiedGridCoverage::Parser::handlesElement(const NodeType::XMLNode& node) const - { - return node == NodeType::GML_RectifiedGridCoverageNode; - } - - std::string RectifiedGridCoverage::Parser::elementParserName() const - { - return "RectifiedGridCoverage::Parser"; - } - - bool RectifiedGridCoverage::Parser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) - { - if (node != NodeType::GML_RectifiedGridCoverageNode) { - CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::CORE_CityModelNode.name() << "> got <" << node.name() << "> at " << getDocumentLocation()); - throw std::runtime_error("Unexpected start tag found."); - } - - m_model = m_factory.createRectifiedGridCoverage(attributes.getCityGMLIDAttribute()); - return true; - } - - bool RectifiedGridCoverage::Parser::parseElementEndTag(const NodeType::XMLNode& node, const std::string&) - { - if (node != NodeType::GML_RectifiedGridCoverageNode) { - CITYGML_LOG_WARN(m_logger, "Expected end tag <" << NodeType::CORE_CityModelNode.name() << "> got <" << node.name() << "> at " << getDocumentLocation()); - } - - if (getSourceSRSOverride()) { - Envelope *envelope = new Envelope(getEnvelope().srsName()); - envelope->setLowerBound(m_model->getEnvelope().getLowerBound()); - envelope->setUpperBound(m_model->getEnvelope().getUpperBound()); - m_model->setEnvelope(envelope); - } - m_callback(m_model); - return true; - } - - - bool RectifiedGridCoverage::Parser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) - { - if (m_model == nullptr) { - throw std::runtime_error("RectifiedGridCoverage::parseChildElementStartTag called before RectifiedGridCoverage::parseElementStartTag"); - } - - return GMLObjectElementParser::parseChildElementStartTag(node, attributes); - } - - bool RectifiedGridCoverage::Parser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) - { - - if (m_model == nullptr) { - throw std::runtime_error("RectifiedGridCoverage::parseChildElementEndTag called before RectifiedGridCoverage::parseElementStartTag"); - } - - return GMLObjectElementParser::parseChildElementEndTag(node, characters); - } - - FeatureObject* RectifiedGridCoverage::Parser::getFeatureObject() - { - return m_model; - } - } diff --git a/sources/src/parser/citygmldocumentparser.cpp b/sources/src/parser/citygmldocumentparser.cpp index 9feaae94..3450f72e 100644 --- a/sources/src/parser/citygmldocumentparser.cpp +++ b/sources/src/parser/citygmldocumentparser.cpp @@ -126,7 +126,7 @@ namespace citygml { tesselator.setKeepVertices(m_parserParams.keepVertices); CITYGML_LOG_INFO(m_logger, "Start postprocessing of the citymodel."); - m_rootModel->finish(tesselator, m_parserParams.optimize, m_logger); + m_rootModel->finish(tesselator, m_parserParams.optimize, m_parserParams.tesselate, m_logger); CITYGML_LOG_INFO(m_logger, "Finished postprocessing of the citymodel."); m_rootModel->setThemes(m_factory->getAllThemes()); diff --git a/sources/src/parser/cityobjectelementparser.cpp b/sources/src/parser/cityobjectelementparser.cpp index f4695eb3..b0ad8204 100644 --- a/sources/src/parser/cityobjectelementparser.cpp +++ b/sources/src/parser/cityobjectelementparser.cpp @@ -10,7 +10,8 @@ #include "parser/delayedchoiceelementparser.h" #include "parser/linestringelementparser.h" #include "parser/addressparser.h" -#include "citygml/rectifiedgridcoverage.hpp" +#include "parser/rectifiedgridcoverageparser.h" +#include "parser/externalreferenceparser.h" #include #include @@ -276,7 +277,7 @@ namespace citygml { return true; } else if (node == NodeType::GML_RectifiedGridCoverageNode) { - setParserForNextElement(new RectifiedGridCoverage::Parser(m_documentParser, m_factory, m_logger, [this](RectifiedGridCoverage * rectifiedGridCoverage) { + setParserForNextElement(new RectifiedGridCoverageParser(m_documentParser, m_factory, m_logger, [this](RectifiedGridCoverage * rectifiedGridCoverage) { m_model->setRectifiedGridCoverage(rectifiedGridCoverage); })); } else if (node == NodeType::BLDG_BoundedByNode @@ -414,7 +415,7 @@ namespace citygml { parseImplicitGeometryForLODLevel(4); } else if (node == NodeType::CORE_ExternalReferenceNode){ - setParserForNextElement(new ExternalReference::Parser(m_documentParser, m_factory, m_logger, [this](ExternalReference * externalReference){ + setParserForNextElement(new ExternalReferenceParser(m_documentParser, m_factory, m_logger, [this](ExternalReference * externalReference){ m_model->setExternalReference(externalReference); })); } else if (node == NodeType::GML_MultiPointNode diff --git a/sources/src/parser/externalreferenceparser.cpp b/sources/src/parser/externalreferenceparser.cpp new file mode 100644 index 00000000..d0ad1f9b --- /dev/null +++ b/sources/src/parser/externalreferenceparser.cpp @@ -0,0 +1,82 @@ +// +// externalreferenceparser.cpp +// citygml +// +// Created by 松本青空 on 2022/01/18. +// + + +#include "parser/externalreferenceparser.h" +#include "citygml/citygmllogger.h" +#include "citygml/citygmlfactory.h" +#include "parser/attributes.h" +#include "parser/documentlocation.h" +#include "parser/nodetypes.h" + +namespace citygml { + +ExternalReferenceParser::ExternalReferenceParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) + : GMLObjectElementParser(documentParser, factory, logger) { + this->callback = callback; +} + +std::string ExternalReferenceParser::elementParserName() const { + return "ExternalReferenceParser"; +} + +bool ExternalReferenceParser::handlesElement(NodeType::XMLNode const& node) const { + return node.typeID() == NodeType::CORE_ExternalReferenceNode.typeID(); +} + +bool ExternalReferenceParser::parseElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) { + if (!handlesElement(node)) { + CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::CORE_ExternalReferenceNode << "> but got <" << node.name() << "> at " << getDocumentLocation()); + } + + model = m_factory.createExternalReference(attributes.getCityGMLIDAttribute()); + + return true; +} + +bool ExternalReferenceParser::parseElementEndTag(NodeType::XMLNode const& node, std::string const&) { + callback(model.get()); + return true; +} + +bool ExternalReferenceParser::parseChildElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) { + if (model == nullptr) { + throw std::runtime_error("ExternalReferenceParser::parseChildElementStartTag called before ExternalReferenceParser::parseElementStartTag"); + } + + if (node == NodeType::CORE_ExternalObjectNode + || node == NodeType::CORE_InformationSystemNode + || node == NodeType::CORE_NameNode + || node == NodeType::CORE_UriNode) { + return true; + } + + return GMLObjectElementParser::parseChildElementStartTag(node, attributes); +} + +bool ExternalReferenceParser::parseChildElementEndTag(NodeType::XMLNode const& node, std::string const& characters) { + if (model == nullptr) { + throw std::runtime_error("ExternalReferenceParser::parseChildElementEndTag called before ExternalReferenceParser::parseElementStartTag"); + } + + if (node == NodeType::CORE_ExternalObjectNode) { + return true; + } else if (node == NodeType::CORE_InformationSystemNode) { + model->informationSystem = characters; + } else if (node == NodeType::CORE_NameNode) { + model->externalObject.name = characters; + } else if (node == NodeType::CORE_UriNode) { + model->externalObject.uri = characters; + } + + return GMLObjectElementParser::parseChildElementEndTag(node, characters); +} + +Object * ExternalReferenceParser::getObject() { + return model.get(); +} +} diff --git a/sources/src/parser/rectifiedgridcoverageparser.cpp b/sources/src/parser/rectifiedgridcoverageparser.cpp new file mode 100644 index 00000000..ca1c11fa --- /dev/null +++ b/sources/src/parser/rectifiedgridcoverageparser.cpp @@ -0,0 +1,93 @@ +// +// rectifiedgridcoverageparser.cpp +// citygml +// +// Created by 松本青空 on 2022/01/18. +// + +#include "parser/rectifiedgridcoverageparser.h" + +#include "parser/nodetypes.h" +#include "parser/attributes.h" +#include "parser/documentlocation.h" +#include "parser/cityobjectelementparser.h" +#include "parser/appearanceelementparser.h" + +#include +#include +#include +#include + +#include + +namespace citygml { + RectifiedGridCoverageParser::RectifiedGridCoverageParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) + : GMLFeatureCollectionElementParser(documentParser, factory, logger) + { + m_callback = callback; + m_model = nullptr; + } + + bool RectifiedGridCoverageParser::handlesElement(const NodeType::XMLNode& node) const + { + return node == NodeType::GML_RectifiedGridCoverageNode; + } + + std::string RectifiedGridCoverageParser::elementParserName() const + { + return "RectifiedGridCoverageParser"; + } + + bool RectifiedGridCoverageParser::parseElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) + { + if (node != NodeType::GML_RectifiedGridCoverageNode) { + CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::CORE_CityModelNode.name() << "> got <" << node.name() << "> at " << getDocumentLocation()); + throw std::runtime_error("Unexpected start tag found."); + } + + m_model = m_factory.createRectifiedGridCoverage(attributes.getCityGMLIDAttribute()); + return true; + } + + bool RectifiedGridCoverageParser::parseElementEndTag(const NodeType::XMLNode& node, const std::string&) + { + if (node != NodeType::GML_RectifiedGridCoverageNode) { + CITYGML_LOG_WARN(m_logger, "Expected end tag <" << NodeType::CORE_CityModelNode.name() << "> got <" << node.name() << "> at " << getDocumentLocation()); + } + + if (getSourceSRSOverride()) { + Envelope *envelope = new Envelope(getEnvelope().srsName()); + envelope->setLowerBound(m_model->getEnvelope().getLowerBound()); + envelope->setUpperBound(m_model->getEnvelope().getUpperBound()); + m_model->setEnvelope(envelope); + } + m_callback(m_model); + return true; + } + + + bool RectifiedGridCoverageParser::parseChildElementStartTag(const NodeType::XMLNode& node, Attributes& attributes) + { + if (m_model == nullptr) { + throw std::runtime_error("RectifiedGridCoverage::parseChildElementStartTag called before RectifiedGridCoverage::parseElementStartTag"); + } + + return GMLObjectElementParser::parseChildElementStartTag(node, attributes); + } + + bool RectifiedGridCoverageParser::parseChildElementEndTag(const NodeType::XMLNode& node, const std::string& characters) + { + + if (m_model == nullptr) { + throw std::runtime_error("RectifiedGridCoverage::parseChildElementEndTag called before RectifiedGridCoverage::parseElementStartTag"); + } + + return GMLObjectElementParser::parseChildElementEndTag(node, characters); + } + + FeatureObject* RectifiedGridCoverageParser::getFeatureObject() + { + return m_model; + } + +} diff --git a/test/citygmltest.cpp b/test/citygmltest.cpp index 6e23399d..621ce9c4 100644 --- a/test/citygmltest.cpp +++ b/test/citygmltest.cpp @@ -68,7 +68,8 @@ int main( int argc, char **argv ) if ( argc - fargc < 1 ) usage(); std::cout << "Parsing CityGML file " << argv[fargc] << " using libcitygml v." << LIBCITYGML_VERSIONSTR << "..." << std::endl; - + params.optimize = false; + params.tesselate = false; time_t start; time( &start ); From 863b67a40e986047391b50033a47b1cf615c21d9 Mon Sep 17 00:00:00 2001 From: HarutakaMatsumoto Date: Thu, 3 Feb 2022 11:24:08 +0900 Subject: [PATCH 08/10] Fixed for release --- sources/include/citygml/cityobject.h | 1 - test/citygmltest.cpp | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/sources/include/citygml/cityobject.h b/sources/include/citygml/cityobject.h index 65e1ff1b..b39e2a21 100644 --- a/sources/include/citygml/cityobject.h +++ b/sources/include/citygml/cityobject.h @@ -19,7 +19,6 @@ namespace citygml { class CityGMLLogger; class AppearanceManager; class Address; -// class RectifiedGridCoverage; class LIBCITYGML_EXPORT CityObject : public FeatureObject { diff --git a/test/citygmltest.cpp b/test/citygmltest.cpp index 621ce9c4..6e23399d 100644 --- a/test/citygmltest.cpp +++ b/test/citygmltest.cpp @@ -68,8 +68,7 @@ int main( int argc, char **argv ) if ( argc - fargc < 1 ) usage(); std::cout << "Parsing CityGML file " << argv[fargc] << " using libcitygml v." << LIBCITYGML_VERSIONSTR << "..." << std::endl; - params.optimize = false; - params.tesselate = false; + time_t start; time( &start ); From b948fea5c72e707871198e2f92c36b057f9042e6 Mon Sep 17 00:00:00 2001 From: HarutakaMatsumoto Date: Mon, 7 Feb 2022 11:40:02 +0900 Subject: [PATCH 09/10] Fixed for https://github.com/jklimke/libcitygml/pull/62#pullrequestreview-871661428 --- sources/include/citygml/citygml.h | 2 +- sources/include/citygml/citygmlfactory.h | 2 +- sources/include/citygml/cityobject.h | 4 ++-- sources/src/citygml/externalreference.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sources/include/citygml/citygml.h b/sources/include/citygml/citygml.h index 9d3677ef..6e9be843 100644 --- a/sources/include/citygml/citygml.h +++ b/sources/include/citygml/citygml.h @@ -69,7 +69,7 @@ namespace citygml , minLOD( 0 ) , maxLOD( 4 ) , optimize( false ) - , tesselate( false ) + , tesselate( true ) , pruneEmptyObjects( false ) , destSRS( "" ) , srcSRS( "" ) diff --git a/sources/include/citygml/citygmlfactory.h b/sources/include/citygml/citygmlfactory.h index e5bbb5e9..1073cf71 100644 --- a/sources/include/citygml/citygmlfactory.h +++ b/sources/include/citygml/citygmlfactory.h @@ -2,7 +2,7 @@ #include #include -#include "citygml/externalreference.h" +#include #include diff --git a/sources/include/citygml/cityobject.h b/sources/include/citygml/cityobject.h index b39e2a21..6d53bbb4 100644 --- a/sources/include/citygml/cityobject.h +++ b/sources/include/citygml/cityobject.h @@ -6,8 +6,8 @@ #include #include #include -#include "citygml/rectifiedgridcoverage.hpp" -#include "citygml/externalreference.h" +#include +#include class Tesselator; namespace citygml { diff --git a/sources/src/citygml/externalreference.cpp b/sources/src/citygml/externalreference.cpp index 7f6b2021..835a11cd 100644 --- a/sources/src/citygml/externalreference.cpp +++ b/sources/src/citygml/externalreference.cpp @@ -5,7 +5,7 @@ // Created by 松本青空 on 2021/11/15. // -#include "citygml/externalreference.h" +#include namespace citygml { ExternalObjectReference::ExternalObjectReference() { From 76530f4cade9027cb78db0a39e680c1de60ea888 Mon Sep 17 00:00:00 2001 From: HarutakaMatsumoto Date: Mon, 7 Feb 2022 13:44:28 +0900 Subject: [PATCH 10/10] Aligned the format --- sources/CMakeLists.txt | 2 +- sources/include/citygml/citygmlfactory.h | 2 +- sources/include/citygml/cityobject.h | 2 +- sources/include/citygml/externalreference.h | 7 - ...idcoverage.hpp => rectifiedgridcoverage.h} | 7 - .../include/parser/externalreferenceparser.h | 7 - .../parser/rectifiedgridcoverageparser.h | 14 +- sources/src/citygml/citygmlfactory.cpp | 2 +- sources/src/citygml/cityobject.cpp | 24 ++-- sources/src/citygml/externalreference.cpp | 19 +-- sources/src/citygml/rectifiedgridcoverage.cpp | 9 +- .../src/parser/externalreferenceparser.cpp | 120 ++++++++---------- .../parser/rectifiedgridcoverageparser.cpp | 8 -- 13 files changed, 82 insertions(+), 141 deletions(-) rename sources/include/citygml/{rectifiedgridcoverage.hpp => rectifiedgridcoverage.h} (80%) diff --git a/sources/CMakeLists.txt b/sources/CMakeLists.txt index f8de959d..d653bad2 100644 --- a/sources/CMakeLists.txt +++ b/sources/CMakeLists.txt @@ -149,7 +149,7 @@ SET(PUBLIC_HEADER include/citygml/citygmlfactory.h include/citygml/linestring.h include/citygml/address.h - include/citygml/rectifiedgridcoverage.hpp + include/citygml/rectifiedgridcoverage.h include/citygml/externalreference.h ) diff --git a/sources/include/citygml/citygmlfactory.h b/sources/include/citygml/citygmlfactory.h index 1073cf71..e44d4c6b 100644 --- a/sources/include/citygml/citygmlfactory.h +++ b/sources/include/citygml/citygmlfactory.h @@ -34,10 +34,10 @@ namespace citygml { public: CityGMLFactory(std::shared_ptr logger); - RectifiedGridCoverage* createRectifiedGridCoverage(std::string const& id); CityModel* createCityModel(const std::string& id); CityObject* createCityObject(const std::string& id, CityObject::CityObjectsType type); Geometry* createGeometry(const std::string& id, const CityObject::CityObjectsType& cityObjType = CityObject::CityObjectsType::COT_All, unsigned int lod = 0, std::string srsName = ""); + RectifiedGridCoverage* createRectifiedGridCoverage(std::string const& id); std::shared_ptr createPolygon(const std::string& id); std::shared_ptr createLineString(const std::string& id); diff --git a/sources/include/citygml/cityobject.h b/sources/include/citygml/cityobject.h index 6d53bbb4..fb791e3c 100644 --- a/sources/include/citygml/cityobject.h +++ b/sources/include/citygml/cityobject.h @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include class Tesselator; diff --git a/sources/include/citygml/externalreference.h b/sources/include/citygml/externalreference.h index 41c9540a..26f5b62d 100644 --- a/sources/include/citygml/externalreference.h +++ b/sources/include/citygml/externalreference.h @@ -1,10 +1,3 @@ -// -// ExternalReference.h -// libcitygml -// -// Created by 松本青空 on 2021/11/12. -// - #pragma once #include diff --git a/sources/include/citygml/rectifiedgridcoverage.hpp b/sources/include/citygml/rectifiedgridcoverage.h similarity index 80% rename from sources/include/citygml/rectifiedgridcoverage.hpp rename to sources/include/citygml/rectifiedgridcoverage.h index f7fddbe7..de3487ac 100644 --- a/sources/include/citygml/rectifiedgridcoverage.hpp +++ b/sources/include/citygml/rectifiedgridcoverage.h @@ -1,10 +1,3 @@ -// -// rectifiedgridcoverage.hpp -// citygml -// -// Created by 松本青空 on 2021/10/29. -// - #pragma once #include diff --git a/sources/include/parser/externalreferenceparser.h b/sources/include/parser/externalreferenceparser.h index 1b7cf3dc..7936f64d 100644 --- a/sources/include/parser/externalreferenceparser.h +++ b/sources/include/parser/externalreferenceparser.h @@ -1,10 +1,3 @@ -// -// externalreferenceparser.h -// libcitygml -// -// Created by 松本青空 on 2022/01/18. -// - #pragma once #include "parser/gmlobjectparser.h" diff --git a/sources/include/parser/rectifiedgridcoverageparser.h b/sources/include/parser/rectifiedgridcoverageparser.h index 057151f1..6becf07d 100644 --- a/sources/include/parser/rectifiedgridcoverageparser.h +++ b/sources/include/parser/rectifiedgridcoverageparser.h @@ -1,21 +1,13 @@ -// -// rectifiedgridcoverageparser.h -// citygml -// -// Created by 松本青空 on 2022/01/18. -// - #pragma once -#include +#include "parser/gmlfeaturecollectionparser.h" -#include +#include namespace citygml { - class RectifiedGridCoverageParser : public GMLFeatureCollectionElementParser - { + class RectifiedGridCoverageParser : public GMLFeatureCollectionElementParser { public: RectifiedGridCoverageParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback); diff --git a/sources/src/citygml/citygmlfactory.cpp b/sources/src/citygml/citygmlfactory.cpp index 7f680723..cd88bc37 100644 --- a/sources/src/citygml/citygmlfactory.cpp +++ b/sources/src/citygml/citygmlfactory.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include namespace citygml { diff --git a/sources/src/citygml/cityobject.cpp b/sources/src/citygml/cityobject.cpp index ffd1d8a4..703baf2b 100644 --- a/sources/src/citygml/cityobject.cpp +++ b/sources/src/citygml/cityobject.cpp @@ -98,21 +98,21 @@ namespace citygml { m_address = std::move(address); } -RectifiedGridCoverage const* CityObject::rectifiedGridCoverage() const { - return m_rectifiedGridCoverage.get(); -} + RectifiedGridCoverage const* CityObject::rectifiedGridCoverage() const { + return m_rectifiedGridCoverage.get(); + } -void CityObject::setRectifiedGridCoverage(RectifiedGridCoverage * rectifiedGridCoverage) { - m_rectifiedGridCoverage = std::unique_ptr(rectifiedGridCoverage); -} + void CityObject::setRectifiedGridCoverage(RectifiedGridCoverage * rectifiedGridCoverage) { + m_rectifiedGridCoverage = std::unique_ptr(rectifiedGridCoverage); + } -ExternalReference const* CityObject::externalReference() const { - return m_externalReference.get(); -} + ExternalReference const* CityObject::externalReference() const { + return m_externalReference.get(); + } -void CityObject::setExternalReference(ExternalReference * externalReference) { - m_externalReference = std::unique_ptr(externalReference); -} + void CityObject::setExternalReference(ExternalReference * externalReference) { + m_externalReference = std::unique_ptr(externalReference); + } void CityObject::finish(Tesselator& tesselator, bool optimize, bool tesselate, std::shared_ptr logger) { diff --git a/sources/src/citygml/externalreference.cpp b/sources/src/citygml/externalreference.cpp index 835a11cd..0962f6fa 100644 --- a/sources/src/citygml/externalreference.cpp +++ b/sources/src/citygml/externalreference.cpp @@ -1,19 +1,12 @@ -// -// externalreference.cpp -// libcitygml -// -// Created by 松本青空 on 2021/11/15. -// - #include namespace citygml { -ExternalObjectReference::ExternalObjectReference() { -} + ExternalObjectReference::ExternalObjectReference() { + } -ExternalObjectReference::~ExternalObjectReference() { -} + ExternalObjectReference::~ExternalObjectReference() { + } -ExternalReference::ExternalReference(std::string const& id) : Object(id) { -} + ExternalReference::ExternalReference(std::string const& id) : Object(id) { + } } diff --git a/sources/src/citygml/rectifiedgridcoverage.cpp b/sources/src/citygml/rectifiedgridcoverage.cpp index e418a9dd..77b220ac 100644 --- a/sources/src/citygml/rectifiedgridcoverage.cpp +++ b/sources/src/citygml/rectifiedgridcoverage.cpp @@ -1,11 +1,4 @@ -// -// rectifiedgridcoverage.cpp -// citygml -// -// Created by 松本青空 on 2021/10/29. -// - -#include "citygml/rectifiedgridcoverage.hpp" +#include namespace citygml { RectifiedGridCoverage::RectifiedGridCoverage(std::string const& id) : FeatureObject(id) { diff --git a/sources/src/parser/externalreferenceparser.cpp b/sources/src/parser/externalreferenceparser.cpp index d0ad1f9b..f37eae53 100644 --- a/sources/src/parser/externalreferenceparser.cpp +++ b/sources/src/parser/externalreferenceparser.cpp @@ -1,82 +1,74 @@ -// -// externalreferenceparser.cpp -// citygml -// -// Created by 松本青空 on 2022/01/18. -// - - #include "parser/externalreferenceparser.h" -#include "citygml/citygmllogger.h" -#include "citygml/citygmlfactory.h" + #include "parser/attributes.h" #include "parser/documentlocation.h" #include "parser/nodetypes.h" +#include +#include namespace citygml { + ExternalReferenceParser::ExternalReferenceParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) + : GMLObjectElementParser(documentParser, factory, logger) { + this->callback = callback; + } -ExternalReferenceParser::ExternalReferenceParser(CityGMLDocumentParser& documentParser, CityGMLFactory& factory, std::shared_ptr logger, std::function callback) - : GMLObjectElementParser(documentParser, factory, logger) { - this->callback = callback; -} - -std::string ExternalReferenceParser::elementParserName() const { - return "ExternalReferenceParser"; -} - -bool ExternalReferenceParser::handlesElement(NodeType::XMLNode const& node) const { - return node.typeID() == NodeType::CORE_ExternalReferenceNode.typeID(); -} - -bool ExternalReferenceParser::parseElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) { - if (!handlesElement(node)) { - CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::CORE_ExternalReferenceNode << "> but got <" << node.name() << "> at " << getDocumentLocation()); + std::string ExternalReferenceParser::elementParserName() const { + return "ExternalReferenceParser"; } - - model = m_factory.createExternalReference(attributes.getCityGMLIDAttribute()); - - return true; -} -bool ExternalReferenceParser::parseElementEndTag(NodeType::XMLNode const& node, std::string const&) { - callback(model.get()); - return true; -} + bool ExternalReferenceParser::handlesElement(NodeType::XMLNode const& node) const { + return node.typeID() == NodeType::CORE_ExternalReferenceNode.typeID(); + } -bool ExternalReferenceParser::parseChildElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) { - if (model == nullptr) { - throw std::runtime_error("ExternalReferenceParser::parseChildElementStartTag called before ExternalReferenceParser::parseElementStartTag"); + bool ExternalReferenceParser::parseElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) { + if (!handlesElement(node)) { + CITYGML_LOG_ERROR(m_logger, "Expected start tag <" << NodeType::CORE_ExternalReferenceNode << "> but got <" << node.name() << "> at " << getDocumentLocation()); + } + + model = m_factory.createExternalReference(attributes.getCityGMLIDAttribute()); + + return true; } - - if (node == NodeType::CORE_ExternalObjectNode - || node == NodeType::CORE_InformationSystemNode - || node == NodeType::CORE_NameNode - || node == NodeType::CORE_UriNode) { + + bool ExternalReferenceParser::parseElementEndTag(NodeType::XMLNode const& node, std::string const&) { + callback(model.get()); return true; } - - return GMLObjectElementParser::parseChildElementStartTag(node, attributes); -} -bool ExternalReferenceParser::parseChildElementEndTag(NodeType::XMLNode const& node, std::string const& characters) { - if (model == nullptr) { - throw std::runtime_error("ExternalReferenceParser::parseChildElementEndTag called before ExternalReferenceParser::parseElementStartTag"); + bool ExternalReferenceParser::parseChildElementStartTag(NodeType::XMLNode const& node, Attributes & attributes) { + if (model == nullptr) { + throw std::runtime_error("ExternalReferenceParser::parseChildElementStartTag called before ExternalReferenceParser::parseElementStartTag"); + } + + if (node == NodeType::CORE_ExternalObjectNode + || node == NodeType::CORE_InformationSystemNode + || node == NodeType::CORE_NameNode + || node == NodeType::CORE_UriNode) { + return true; + } + + return GMLObjectElementParser::parseChildElementStartTag(node, attributes); } - - if (node == NodeType::CORE_ExternalObjectNode) { - return true; - } else if (node == NodeType::CORE_InformationSystemNode) { - model->informationSystem = characters; - } else if (node == NodeType::CORE_NameNode) { - model->externalObject.name = characters; - } else if (node == NodeType::CORE_UriNode) { - model->externalObject.uri = characters; + + bool ExternalReferenceParser::parseChildElementEndTag(NodeType::XMLNode const& node, std::string const& characters) { + if (model == nullptr) { + throw std::runtime_error("ExternalReferenceParser::parseChildElementEndTag called before ExternalReferenceParser::parseElementStartTag"); + } + + if (node == NodeType::CORE_ExternalObjectNode) { + return true; + } else if (node == NodeType::CORE_InformationSystemNode) { + model->informationSystem = characters; + } else if (node == NodeType::CORE_NameNode) { + model->externalObject.name = characters; + } else if (node == NodeType::CORE_UriNode) { + model->externalObject.uri = characters; + } + + return GMLObjectElementParser::parseChildElementEndTag(node, characters); } - - return GMLObjectElementParser::parseChildElementEndTag(node, characters); -} -Object * ExternalReferenceParser::getObject() { - return model.get(); -} + Object * ExternalReferenceParser::getObject() { + return model.get(); + } } diff --git a/sources/src/parser/rectifiedgridcoverageparser.cpp b/sources/src/parser/rectifiedgridcoverageparser.cpp index ca1c11fa..febc619d 100644 --- a/sources/src/parser/rectifiedgridcoverageparser.cpp +++ b/sources/src/parser/rectifiedgridcoverageparser.cpp @@ -1,10 +1,3 @@ -// -// rectifiedgridcoverageparser.cpp -// citygml -// -// Created by 松本青空 on 2022/01/18. -// - #include "parser/rectifiedgridcoverageparser.h" #include "parser/nodetypes.h" @@ -89,5 +82,4 @@ namespace citygml { { return m_model; } - }