transform detailed geometry from the current system to the new system
| 2367 | |
| 2368 | // transform detailed geometry from the current system to the new system |
| 2369 | bool GeometryTranslator::convertDetailedGeometry(const CoordinateChange& detailedCoordChange) { |
| 2370 | bool result = true; |
| 2371 | |
| 2372 | Transformation buildingTransformation = this->buildingTransformation(); |
| 2373 | |
| 2374 | for (WorkspaceObject& surface : m_workspace.getObjectsByType(IddObjectType::BuildingSurface_Detailed)) { |
| 2375 | Point3dVector vertices = getVertices(BuildingSurface_DetailedFields::NumberofVertices + 1, surface); |
| 2376 | surface.setString(BuildingSurface_DetailedFields::NumberofVertices, "Autocalculate"); |
| 2377 | if (detailedCoordChange != CoordinateChange::NoChange) { |
| 2378 | OptionalWorkspaceObject zone = surface.getTarget(BuildingSurface_DetailedFields::ZoneName); |
| 2379 | if (!zone) { |
| 2380 | LOG(Error, "Could not find zone"); |
| 2381 | continue; |
| 2382 | } |
| 2383 | |
| 2384 | Transformation zoneTransformation = this->zoneTransformation(*zone); |
| 2385 | |
| 2386 | if (detailedCoordChange == CoordinateChange::AbsoluteToRelative) { |
| 2387 | vertices = zoneTransformation.inverse() * buildingTransformation.inverse() * vertices; |
| 2388 | setVertices(BuildingSurface_DetailedFields::NumberofVertices + 1, surface, vertices); |
| 2389 | } else if (detailedCoordChange == CoordinateChange::RelativeToAbsolute) { |
| 2390 | vertices = buildingTransformation * zoneTransformation * vertices; |
| 2391 | setVertices(BuildingSurface_DetailedFields::NumberofVertices + 1, surface, vertices); |
| 2392 | } |
| 2393 | } |
| 2394 | } |
| 2395 | |
| 2396 | for (WorkspaceObject& subsurface : m_workspace.getObjectsByType(IddObjectType::FenestrationSurface_Detailed)) { |
| 2397 | Point3dVector vertices = getVertices(FenestrationSurface_DetailedFields::NumberofVertices + 1, subsurface); |
| 2398 | subsurface.setString(FenestrationSurface_DetailedFields::NumberofVertices, "Autocalculate"); |
| 2399 | if (detailedCoordChange != CoordinateChange::NoChange) { |
| 2400 | OptionalWorkspaceObject surface = subsurface.getTarget(FenestrationSurface_DetailedFields::BuildingSurfaceName); |
| 2401 | if (!surface) { |
| 2402 | LOG(Error, "Could not find surface"); |
| 2403 | continue; |
| 2404 | } |
| 2405 | OptionalWorkspaceObject zone = surface->getTarget(BuildingSurface_DetailedFields::ZoneName); |
| 2406 | if (!zone) { |
| 2407 | LOG(Error, "Could not find zone"); |
| 2408 | continue; |
| 2409 | } |
| 2410 | Transformation zoneTransformation = this->zoneTransformation(*zone); |
| 2411 | if (detailedCoordChange == CoordinateChange::AbsoluteToRelative) { |
| 2412 | vertices = zoneTransformation.inverse() * buildingTransformation.inverse() * vertices; |
| 2413 | setVertices(FenestrationSurface_DetailedFields::NumberofVertices + 1, subsurface, vertices); |
| 2414 | } else if (detailedCoordChange == CoordinateChange::RelativeToAbsolute) { |
| 2415 | vertices = buildingTransformation * zoneTransformation * vertices; |
| 2416 | setVertices(FenestrationSurface_DetailedFields::NumberofVertices + 1, subsurface, vertices); |
| 2417 | } |
| 2418 | } |
| 2419 | } |
| 2420 | |
| 2421 | for (WorkspaceObject& zoneShading : m_workspace.getObjectsByType(IddObjectType::Shading_Zone_Detailed)) { |
| 2422 | Point3dVector vertices = getVertices(Shading_Zone_DetailedFields::NumberofVertices + 1, zoneShading); |
| 2423 | zoneShading.setString(Shading_Zone_DetailedFields::NumberofVertices, "Autocalculate"); |
| 2424 | if (detailedCoordChange != CoordinateChange::NoChange) { |
| 2425 | OptionalWorkspaceObject zoneSurface = zoneShading.getTarget(Shading_Zone_DetailedFields::BaseSurfaceName); |
| 2426 | if (!zoneSurface) { |
nothing calls this directly
no test coverage detected