From 3c43aa25b8b8da4ffe10ebd25a573a641e25d146 Mon Sep 17 00:00:00 2001 From: QuimMoya Date: Fri, 12 Jul 2024 12:39:50 +0200 Subject: [PATCH] Support for relNests in alignment issue #878 --- src/cpp/geometry/IfcGeometryLoader.cpp | 63 ++++++++++++++++++++++++-- src/cpp/geometry/IfcGeometryLoader.h | 5 +- src/cpp/web-ifc-test.cpp | 4 +- 3 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/cpp/geometry/IfcGeometryLoader.cpp b/src/cpp/geometry/IfcGeometryLoader.cpp index ec77f6f13..c51a102d6 100644 --- a/src/cpp/geometry/IfcGeometryLoader.cpp +++ b/src/cpp/geometry/IfcGeometryLoader.cpp @@ -14,7 +14,7 @@ namespace webifc::geometry { IfcGeometryLoader::IfcGeometryLoader(const webifc::parsing::IfcLoader &loader, const webifc::schema::IfcSchemaManager &schemaManager, uint16_t circleSegments) - : _loader(loader), _schemaManager(schemaManager), _relVoidRel(PopulateRelVoidsRelMap()), _relVoids(PopulateRelVoidsMap()), _relAggregates(PopulateRelAggregatesMap()), + : _loader(loader), _schemaManager(schemaManager), _relVoidRel(PopulateRelVoidsRelMap()), _relVoids(PopulateRelVoidsMap()), _relAggregates(PopulateRelAggregatesMap()), _relNests(PopulateRelNestsMap()), _relElementAggregates(PopulateRelElementAggregatesMap()), _styledItems(PopulateStyledItemMap()), _relMaterials(PopulateRelMaterialsMap()), _materialDefinitions(PopulateMaterialDefinitionsMap()), _circleSegments(circleSegments) { ReadLinearScalingFactor(); @@ -328,6 +328,16 @@ namespace webifc::geometry } } + auto &relNestsVector = GetRelNests(); + if (relNestsVector.count(expressID) == 1) + { + auto &relNest = relNestsVector.at(expressID); + for (auto expressID : relNest) + { + alignment = GetAlignment(expressID, alignment, transform * transform_t, expressID); + } + } + break; } case schema::IFCALIGNMENTHORIZONTAL: @@ -365,6 +375,25 @@ namespace webifc::geometry } } + auto &relNestVector = GetRelNests(); + if (relNestVector.count(expressID) == 1) + { + auto &relNest = relNestVector.at(expressID); + for (auto expressID : relNest) + { + alignment.Horizontal.curves.push_back(GetAlignmentCurve(expressID, sourceExpressID)); + } + + for (size_t i = 0; i < alignment.Horizontal.curves.size(); i++) + { + for (size_t j = 0; j < alignment.Horizontal.curves[i].points.size(); j++) + { + alignment.Horizontal.curves[i].points[j] = + glm::dvec4(alignment.Horizontal.curves[i].points[j].x, alignment.Horizontal.curves[i].points[j].y, 0, 1) * transform * transform_t; + } + } + } + break; } case schema::IFCALIGNMENTVERTICAL: @@ -3287,11 +3316,11 @@ IfcProfile IfcGeometryLoader::GetProfile(uint32_t expressID) const std::unordered_map> IfcGeometryLoader::PopulateRelAggregatesMap() { std::unordered_map> resultVector; - auto relVoids = _loader.GetExpressIDsWithType(schema::IFCRELAGGREGATES); + auto relAggregates = _loader.GetExpressIDsWithType(schema::IFCRELAGGREGATES); - for (uint32_t relVoidID : relVoids) + for (uint32_t relAggregateID : relAggregates) { - _loader.MoveToArgumentOffset(relVoidID, 4); + _loader.MoveToArgumentOffset(relAggregateID, 4); uint32_t relatingBuildingElement = _loader.GetRefArgument(); auto aggregates = _loader.GetSetArgument(); @@ -3305,6 +3334,27 @@ IfcProfile IfcGeometryLoader::GetProfile(uint32_t expressID) const return resultVector; } + std::unordered_map> IfcGeometryLoader::PopulateRelNestsMap() + { + std::unordered_map> resultVector; + auto relNests = _loader.GetExpressIDsWithType(schema::IFCRELNESTS); + + for (uint32_t relNestID : relNests) + { + _loader.MoveToArgumentOffset(relNestID, 4); + + uint32_t relatingBuildingElement = _loader.GetRefArgument(); + auto nests = _loader.GetSetArgument(); + + for (auto &nest : nests) + { + uint32_t nestID = _loader.GetRefArgument(nest); + resultVector[relatingBuildingElement].push_back(nestID); + } + } + return resultVector; + } + std::unordered_map> IfcGeometryLoader::PopulateRelElementAggregatesMap() { std::unordered_map> resultVector; @@ -3567,6 +3617,11 @@ IfcProfile IfcGeometryLoader::GetProfile(uint32_t expressID) const return _relAggregates; } + const std::unordered_map> &IfcGeometryLoader::GetRelNests() const + { + return _relNests; + } + const std::unordered_map> &IfcGeometryLoader::GetRelElementAggregates() const { return _relElementAggregates; diff --git a/src/cpp/geometry/IfcGeometryLoader.h b/src/cpp/geometry/IfcGeometryLoader.h index a8d6b7e0a..2d317687f 100644 --- a/src/cpp/geometry/IfcGeometryLoader.h +++ b/src/cpp/geometry/IfcGeometryLoader.h @@ -50,6 +50,7 @@ namespace webifc::geometry bool GetColor(const uint32_t expressID, const glm::dvec4 &outputColor) const; const std::unordered_map> &GetRelVoids() const; const std::unordered_map> &GetRelVoidRels() const; + const std::unordered_map> &GetRelNests() const; const std::unordered_map> &GetRelAggregates() const; const std::unordered_map> &GetRelElementAggregates() const; const std::unordered_map>> &GetStyledItems() const; @@ -69,7 +70,8 @@ namespace webifc::geometry const webifc::parsing::IfcLoader &_loader; const webifc::schema::IfcSchemaManager &_schemaManager; const std::unordered_map> _relVoidRel; - const std::unordered_map> _relVoids; + const std::unordered_map> _relVoids; + const std::unordered_map> _relNests; const std::unordered_map> _relAggregates; const std::unordered_map> _relElementAggregates; const std::unordered_map>> _styledItems; @@ -85,6 +87,7 @@ namespace webifc::geometry mutable std::vector LocalcurvesIndices; std::unordered_map> PopulateRelVoidsMap(); std::unordered_map> PopulateRelVoidsRelMap(); + std::unordered_map> PopulateRelNestsMap(); std::unordered_map> PopulateRelAggregatesMap(); std::unordered_map> PopulateRelElementAggregatesMap(); std::unordered_map>> PopulateStyledItemMap(); diff --git a/src/cpp/web-ifc-test.cpp b/src/cpp/web-ifc-test.cpp index 765247d60..434daba96 100644 --- a/src/cpp/web-ifc-test.cpp +++ b/src/cpp/web-ifc-test.cpp @@ -284,7 +284,7 @@ int main() // return 0; - std::string content = ReadFile("C:/Users/qmoya/Desktop/Element3D 1.ifc"); + std::string content = ReadFile("C:/Users/qmoya/Desktop/File2.ifc"); struct LoaderSettings { @@ -326,7 +326,7 @@ int main() SpecificLoadTest(loader, geometryLoader, 17); // auto meshes = LoadAllTest(loader, geometryLoader, 5557); - // auto alignments = GetAlignments(loader, geometryLoader); + auto alignments = GetAlignments(loader, geometryLoader); time = ms() - start;