diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateSubSurface.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateSubSurface.cpp index e71ab93ef2d..67a32e3fcd9 100644 --- a/src/energyplus/ForwardTranslator/ForwardTranslateSubSurface.cpp +++ b/src/energyplus/ForwardTranslator/ForwardTranslateSubSurface.cpp @@ -43,8 +43,17 @@ namespace energyplus { idfObject.setString(FenestrationSurface_DetailedFields::Name, modelObject.name().get()); - openstudio::Vector3d offset(0, 0, 0); idfObject.clearExtensibleGroups(); + + openstudio::Vector3d offset(0, 0, 0); + boost::optional frameAndDivider = modelObject.windowPropertyFrameAndDivider(); + if (frameAndDivider) { + if (!frameAndDivider->isOutsideRevealDepthDefaulted()) { + offset = -frameAndDivider->outsideRevealDepth() * modelObject.outwardNormal(); + } + idfObject.setString(FenestrationSurface_DetailedFields::FrameandDividerName, frameAndDivider->name().get()); + } + for (const Point3d& point : modelObject.vertices()) { IdfExtensibleGroup group = idfObject.pushExtensibleGroup(); if (group.empty()) { @@ -53,7 +62,7 @@ namespace energyplus { return boost::none; } - Point3d newPoint = point + offset; + const Point3d newPoint = point + offset; group.setDouble(0, newPoint.x()); group.setDouble(1, newPoint.y()); @@ -137,14 +146,6 @@ namespace energyplus { idfObject.setDouble(FenestrationSurface_DetailedFields::ViewFactortoGround, *viewFactortoGround); } - boost::optional frameAndDivider = modelObject.windowPropertyFrameAndDivider(); - if (frameAndDivider) { - if (!frameAndDivider->isOutsideRevealDepthDefaulted()) { - offset = -frameAndDivider->outsideRevealDepth() * modelObject.outwardNormal(); - } - idfObject.setString(FenestrationSurface_DetailedFields::FrameandDividerName, frameAndDivider->name().get()); - } - if (!modelObject.isMultiplierDefaulted()) { idfObject.setDouble(FenestrationSurface_DetailedFields::Multiplier, modelObject.multiplier()); } diff --git a/src/energyplus/Test/WindowPropertyFrameAndDivider_GTest.cpp b/src/energyplus/Test/WindowPropertyFrameAndDivider_GTest.cpp index aec81c9ac6f..450820aa52d 100644 --- a/src/energyplus/Test/WindowPropertyFrameAndDivider_GTest.cpp +++ b/src/energyplus/Test/WindowPropertyFrameAndDivider_GTest.cpp @@ -9,6 +9,7 @@ #include "../ErrorFile.hpp" #include "../ForwardTranslator.hpp" #include "../ReverseTranslator.hpp" +#include "../GeometryTranslator.hpp" #include "../../model/Model.hpp" #include "../../model/Space.hpp" @@ -30,6 +31,8 @@ #include "../../utilities/idf/IdfFile.hpp" #include +#include +#include #include @@ -76,8 +79,9 @@ TEST_F(EnergyPlusFixture, WindowPropertyFrameAndDivider) { EXPECT_DOUBLE_EQ(-1.0, normal.y()); EXPECT_DOUBLE_EQ(0.0, normal.z()); + static constexpr double outsideRevealDepth = 1.75; WindowPropertyFrameAndDivider frameAndDivider(model); - frameAndDivider.setOutsideRevealDepth(1.0); + frameAndDivider.setOutsideRevealDepth(outsideRevealDepth); EXPECT_FALSE(subSurface2.allowWindowPropertyFrameAndDivider()); EXPECT_TRUE(subSurface2.setSubSurfaceType("GlassDoor")); @@ -86,12 +90,47 @@ TEST_F(EnergyPlusFixture, WindowPropertyFrameAndDivider) { EXPECT_TRUE(subSurface2.setWindowPropertyFrameAndDivider(frameAndDivider)); ASSERT_TRUE(subSurface2.windowPropertyFrameAndDivider()); + ForwardTranslator forwardTranslator; - OptionalWorkspace outWorkspace = forwardTranslator.translateModel(model); - ASSERT_TRUE(outWorkspace); + auto workspace = forwardTranslator.translateModel(model); + + EXPECT_EQ(2u, workspace.getObjectsByType(IddObjectType::FenestrationSurface_Detailed).size()); + ASSERT_EQ(1u, workspace.getObjectsByType(IddObjectType::WindowProperty_FrameAndDivider).size()); + + auto pointEqual = [](const Point3d& a, const Point3d& b) { + static constexpr double tol = 1.0e-6; + EXPECT_NEAR(a.x(), b.x(), tol); + EXPECT_NEAR(a.y(), b.y(), tol); + EXPECT_NEAR(a.z(), b.z(), tol); + }; + + { + auto ss_ = workspace.getObjectByTypeAndName(IddObjectType::FenestrationSurface_Detailed, subSurface1.nameString()); + ASSERT_TRUE(ss_); + EXPECT_TRUE(ss_->isEmpty(FenestrationSurface_DetailedFields::FrameandDividerName)); + auto idf_vertices = getVertices(FenestrationSurface_DetailedFields::NumberofVertices + 1, *ss_); + ASSERT_EQ(vertices.size(), idf_vertices.size()); + for (size_t i = 0; i < vertices.size(); ++i) { + pointEqual(vertices[i], idf_vertices[i]); + } + } + + { + auto ss_ = workspace.getObjectByTypeAndName(IddObjectType::FenestrationSurface_Detailed, subSurface2.nameString()); + ASSERT_TRUE(ss_); + auto frame_ = ss_->getTarget(FenestrationSurface_DetailedFields::FrameandDividerName); + ASSERT_TRUE(frame_); + + auto idf_vertices = getVertices(FenestrationSurface_DetailedFields::NumberofVertices + 1, *ss_); + ASSERT_EQ(vertices.size(), idf_vertices.size()); + for (size_t i = 0; i < vertices.size(); ++i) { + auto pt = vertices[i] + Vector3d(0.0, outsideRevealDepth, 0.0); + pointEqual(pt, idf_vertices[i]); + } + } ReverseTranslator reverseTranslator; - OptionalModel outModel = reverseTranslator.translateWorkspace(*outWorkspace); + OptionalModel outModel = reverseTranslator.translateWorkspace(workspace); ASSERT_TRUE(outModel); EXPECT_EQ(1u, outModel->getConcreteModelObjects().size()); @@ -102,7 +141,7 @@ TEST_F(EnergyPlusFixture, WindowPropertyFrameAndDivider) { vertices = testSubSurface->vertices(); ASSERT_EQ(4u, vertices.size()); EXPECT_DOUBLE_EQ(0.0, vertices[0].x()); - EXPECT_DOUBLE_EQ(0.0, vertices[0].y()); + EXPECT_DOUBLE_EQ(outsideRevealDepth, vertices[0].y()); EXPECT_DOUBLE_EQ(1.0, vertices[0].z()); testSubSurface = outModel->getConcreteModelObjectByName("No Offset");