| 491 | } |
| 492 | |
| 493 | IfcAlignment IfcGeometryLoader::GetAlignment(uint32_t expressID, IfcAlignment alignment, glm::dmat4 transform, uint32_t sourceExpressID) const |
| 494 | { |
| 495 | spdlog::debug("[GetAlignment({})]", expressID); |
| 496 | auto lineType = _loader.GetLineType(expressID); |
| 497 | |
| 498 | // TODO: Add support for IFCREFERENT |
| 499 | |
| 500 | switch (lineType) |
| 501 | { |
| 502 | case schema::IFCALIGNMENT: |
| 503 | { |
| 504 | _loader.MoveToArgumentOffset(expressID, 5); |
| 505 | uint32_t localPlacement = 0; |
| 506 | if (_loader.GetTokenType() == parsing::IfcTokenType::REF) |
| 507 | { |
| 508 | _loader.StepBack(); |
| 509 | localPlacement = _loader.GetRefArgument(); |
| 510 | } |
| 511 | |
| 512 | glm::dmat4 transform_t = glm::dmat4(1); |
| 513 | if (localPlacement != 0 && _loader.IsValidExpressID(localPlacement)) |
| 514 | { |
| 515 | transform_t = GetLocalPlacement(localPlacement); |
| 516 | alignment.PlacementExpressId = localPlacement; |
| 517 | } |
| 518 | |
| 519 | if (_cache.GetRelAggregates().count(expressID) == 1) |
| 520 | { |
| 521 | auto &relAgg = _cache.GetRelAggregates().at(expressID); |
| 522 | for (auto expressID : relAgg) |
| 523 | { |
| 524 | alignment = GetAlignment(expressID, alignment, transform * transform_t, expressID); |
| 525 | } |
| 526 | } |
| 527 | |
| 528 | if (_cache.GetRelNests().count(expressID) == 1) |
| 529 | { |
| 530 | auto &relNest = _cache.GetRelNests().at(expressID); |
| 531 | for (auto expressID : relNest) |
| 532 | { |
| 533 | alignment = GetAlignment(expressID, alignment, transform * transform_t, expressID); |
| 534 | } |
| 535 | } |
| 536 | |
| 537 | break; |
| 538 | } |
| 539 | case schema::IFCALIGNMENTHORIZONTAL: |
| 540 | { |
| 541 | _loader.MoveToArgumentOffset(expressID, 5); |
| 542 | uint32_t localPlacement = 0; |
| 543 | if (_loader.GetTokenType() == parsing::IfcTokenType::REF) |
| 544 | { |
| 545 | _loader.StepBack(); |
| 546 | localPlacement = _loader.GetRefArgument(); |
| 547 | } |
| 548 | |
| 549 | glm::dmat4 transform_t = glm::dmat4(1); |
| 550 | if (localPlacement != 0 && _loader.IsValidExpressID(localPlacement)) |