Skip to content

Commit 33cc729

Browse files
authored
Merge pull request #793 from openstudiocoalition/792-HotWaterEquipment
Fix #792 - Add support for HotWaterEquipment and HotWaterEquipmentDefinition
2 parents 4f1fd52 + 4357a24 commit 33cc729

13 files changed

+323
-0
lines changed

src/openstudio_lib/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ set(${target_name}_SRC
9393
GridViewSubTab.hpp
9494
HorizontalTabWidget.cpp
9595
HorizontalTabWidget.hpp
96+
HotWaterEquipmentInspectorView.cpp
97+
HotWaterEquipmentInspectorView.hpp
9698
HVACSystemsController.cpp
9799
HVACSystemsController.hpp
98100
HVACSystemsTabController.cpp
@@ -540,6 +542,7 @@ set(${target_name}_moc
540542
GridScene.hpp
541543
GridViewSubTab.hpp
542544
HorizontalTabWidget.hpp
545+
HotWaterEquipmentInspectorView.hpp
543546
HVACSystemsController.hpp
544547
HVACSystemsTabController.hpp
545548
HVACSystemsTabView.hpp
Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
/***********************************************************************************************************************
2+
* OpenStudio(R), Copyright (c) OpenStudio Coalition and other contributors.
3+
* See also https://openstudiocoalition.org/about/software_license/
4+
***********************************************************************************************************************/
5+
6+
#include "HotWaterEquipmentInspectorView.hpp"
7+
#include "../shared_gui_components/OSLineEdit.hpp"
8+
#include "../shared_gui_components/OSQuantityEdit.hpp"
9+
#include "OSDropZone.hpp"
10+
#include <openstudio/model/HotWaterEquipmentDefinition.hpp>
11+
#include <openstudio/model/HotWaterEquipmentDefinition_Impl.hpp>
12+
#include <openstudio/utilities/core/Assert.hpp>
13+
#include <QVBoxLayout>
14+
#include <QHBoxLayout>
15+
#include <QLabel>
16+
#include <QGridLayout>
17+
#include <QScrollArea>
18+
#include <QStackedWidget>
19+
20+
namespace openstudio {
21+
22+
HotWaterEquipmentDefinitionInspectorView::HotWaterEquipmentDefinitionInspectorView(bool isIP, const openstudio::model::Model& model, QWidget* parent)
23+
: ModelObjectInspectorView(model, true, parent), m_nameEdit(new OSLineEdit2()), m_isIP(isIP) {
24+
25+
auto* visibleWidget = new QWidget();
26+
this->stackedWidget()->addWidget(visibleWidget);
27+
28+
auto* mainGridLayout = new QGridLayout();
29+
mainGridLayout->setContentsMargins(7, 7, 7, 7);
30+
mainGridLayout->setSpacing(14);
31+
visibleWidget->setLayout(mainGridLayout);
32+
33+
// Name
34+
35+
auto* label = new QLabel("Name: ");
36+
label->setObjectName("H2");
37+
mainGridLayout->addWidget(label, 0, 0);
38+
39+
mainGridLayout->addWidget(m_nameEdit, 1, 0, 1, 3);
40+
41+
// Design Level
42+
43+
label = new QLabel("Design Level: ");
44+
label->setObjectName("H2");
45+
mainGridLayout->addWidget(label, 2, 0);
46+
47+
m_designLevelEdit = new OSQuantityEdit2("W", "W", "W", m_isIP);
48+
connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_designLevelEdit, &OSQuantityEdit2::onUnitSystemChange);
49+
mainGridLayout->addWidget(m_designLevelEdit, 3, 0);
50+
51+
// Watts Per Space Floor Area
52+
53+
label = new QLabel("Watts Per Space Floor Area: ");
54+
label->setObjectName("H2");
55+
mainGridLayout->addWidget(label, 2, 1);
56+
57+
m_wattsPerSpaceFloorAreaEdit = new OSQuantityEdit2("W/m^2", "W/m^2", "W/ft^2", m_isIP);
58+
connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_wattsPerSpaceFloorAreaEdit, &OSQuantityEdit2::onUnitSystemChange);
59+
mainGridLayout->addWidget(m_wattsPerSpaceFloorAreaEdit, 3, 1);
60+
61+
// Watts Per Person
62+
63+
label = new QLabel("Watts Per Person: ");
64+
label->setObjectName("H2");
65+
mainGridLayout->addWidget(label, 2, 2);
66+
67+
m_wattsPerPersonEdit = new OSQuantityEdit2("W/person", "W/person", "W/person", m_isIP);
68+
connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_wattsPerPersonEdit, &OSQuantityEdit2::onUnitSystemChange);
69+
mainGridLayout->addWidget(m_wattsPerPersonEdit, 3, 2);
70+
71+
// Fraction Latent
72+
73+
label = new QLabel("Fraction Latent: ");
74+
label->setObjectName("H2");
75+
mainGridLayout->addWidget(label, 4, 0);
76+
77+
m_fractionLatentEdit = new OSQuantityEdit2("", "", "", m_isIP);
78+
connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_fractionLatentEdit, &OSQuantityEdit2::onUnitSystemChange);
79+
mainGridLayout->addWidget(m_fractionLatentEdit, 5, 0);
80+
81+
// Fraction Radiant
82+
83+
label = new QLabel("Fraction Radiant: ");
84+
label->setObjectName("H2");
85+
mainGridLayout->addWidget(label, 4, 1);
86+
87+
m_fractionRadiantEdit = new OSQuantityEdit2("", "", "", m_isIP);
88+
connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_fractionRadiantEdit, &OSQuantityEdit2::onUnitSystemChange);
89+
mainGridLayout->addWidget(m_fractionRadiantEdit, 5, 1);
90+
91+
// Fraction Lost
92+
93+
label = new QLabel("Fraction Lost: ");
94+
label->setObjectName("H2");
95+
mainGridLayout->addWidget(label, 6, 0);
96+
97+
m_fractionLostEdit = new OSQuantityEdit2("", "", "", m_isIP);
98+
connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_fractionLostEdit, &OSQuantityEdit2::onUnitSystemChange);
99+
mainGridLayout->addWidget(m_fractionLostEdit, 7, 0);
100+
101+
// Stretch
102+
103+
mainGridLayout->setRowStretch(8, 100);
104+
105+
label =
106+
new QLabel("<i>The object models hot water equipment in the zone which consumes district heating, such as cooking equipment or process loads. "
107+
"All of the energy consumed by the equipment becomes a heat gain in the zone or is lost (exhausted). "
108+
"This object consumes district heating energy directly and does not cause a load on a hot water plant loop or water heater. "
109+
"For domestic hot water uses, such as sinks and showers, see WaterUse:Equipment.</i>");
110+
label->setWordWrap(true);
111+
mainGridLayout->addWidget(label, 9, 0, 1, 4);
112+
113+
mainGridLayout->setColumnStretch(3, 100);
114+
}
115+
116+
void HotWaterEquipmentDefinitionInspectorView::onClearSelection() {
117+
ModelObjectInspectorView::onClearSelection(); // call parent implementation
118+
detach();
119+
}
120+
121+
void HotWaterEquipmentDefinitionInspectorView::onSelectModelObject(const openstudio::model::ModelObject& modelObject) {
122+
detach();
123+
auto hotwaterEquipmentDefinition = modelObject.cast<model::HotWaterEquipmentDefinition>();
124+
attach(hotwaterEquipmentDefinition);
125+
refresh();
126+
}
127+
128+
void HotWaterEquipmentDefinitionInspectorView::onUpdate() {
129+
refresh();
130+
}
131+
132+
void HotWaterEquipmentDefinitionInspectorView::attach(const openstudio::model::HotWaterEquipmentDefinition& hotwaterEquipmentDefinition) {
133+
m_hotwaterEquipmentDefinition = hotwaterEquipmentDefinition;
134+
135+
// m_nameEdit->bind(hotwaterEquipmentDefinition,"name");
136+
m_nameEdit->bind(*m_hotwaterEquipmentDefinition,
137+
OptionalStringGetter(std::bind(&model::HotWaterEquipmentDefinition::name, m_hotwaterEquipmentDefinition.get_ptr(), true)),
138+
boost::optional<StringSetterOptionalStringReturn>(
139+
std::bind(&model::HotWaterEquipmentDefinition::setName, m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1)));
140+
141+
// m_designLevelEdit->bind(hotwaterEquipmentDefinition,"designLevel",m_isIP);
142+
m_designLevelEdit->bind(m_isIP, *m_hotwaterEquipmentDefinition,
143+
OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::designLevel, m_hotwaterEquipmentDefinition.get_ptr())),
144+
boost::optional<DoubleSetter>(std::bind(
145+
static_cast<bool (model::HotWaterEquipmentDefinition::*)(double)>(&model::HotWaterEquipmentDefinition::setDesignLevel),
146+
m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1)));
147+
148+
// m_wattsPerSpaceFloorAreaEdit->bind(hotwaterEquipmentDefinition,"wattsperSpaceFloorArea",m_isIP);
149+
m_wattsPerSpaceFloorAreaEdit->bind(
150+
m_isIP, *m_hotwaterEquipmentDefinition,
151+
OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::wattsperSpaceFloorArea, m_hotwaterEquipmentDefinition.get_ptr())),
152+
boost::optional<DoubleSetter>(
153+
std::bind(static_cast<bool (model::HotWaterEquipmentDefinition::*)(double)>(&model::HotWaterEquipmentDefinition::setWattsperSpaceFloorArea),
154+
m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1)));
155+
156+
// m_wattsPerPersonEdit->bind(hotwaterEquipmentDefinition,"wattsperPerson",m_isIP);
157+
m_wattsPerPersonEdit->bind(
158+
m_isIP, *m_hotwaterEquipmentDefinition,
159+
OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::wattsperPerson, m_hotwaterEquipmentDefinition.get_ptr())),
160+
boost::optional<DoubleSetter>(
161+
std::bind(static_cast<bool (model::HotWaterEquipmentDefinition::*)(double)>(&model::HotWaterEquipmentDefinition::setWattsperPerson),
162+
m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1)));
163+
164+
// m_fractionLatentEdit->bind(hotwaterEquipmentDefinition,"fractionLatent",m_isIP);
165+
m_fractionLatentEdit->bind(
166+
m_isIP, *m_hotwaterEquipmentDefinition,
167+
OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::fractionLatent, m_hotwaterEquipmentDefinition.get_ptr())),
168+
boost::optional<DoubleSetter>(
169+
std::bind(static_cast<bool (model::HotWaterEquipmentDefinition::*)(double)>(&model::HotWaterEquipmentDefinition::setFractionLatent),
170+
m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1)),
171+
boost::optional<NoFailAction>(std::bind(&model::HotWaterEquipmentDefinition::resetFractionLatent, m_hotwaterEquipmentDefinition.get_ptr())),
172+
boost::none, boost::none,
173+
boost::optional<BasicQuery>(std::bind(&model::HotWaterEquipmentDefinition::isFractionLatentDefaulted, m_hotwaterEquipmentDefinition.get_ptr())));
174+
175+
// m_fractionRadiantEdit->bind(hotwaterEquipmentDefinition,"fractionRadiant",m_isIP);
176+
m_fractionRadiantEdit->bind(
177+
m_isIP, *m_hotwaterEquipmentDefinition,
178+
OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::fractionRadiant, m_hotwaterEquipmentDefinition.get_ptr())),
179+
boost::optional<DoubleSetter>(
180+
std::bind(static_cast<bool (model::HotWaterEquipmentDefinition::*)(double)>(&model::HotWaterEquipmentDefinition::setFractionRadiant),
181+
m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1)),
182+
boost::optional<NoFailAction>(std::bind(&model::HotWaterEquipmentDefinition::resetFractionRadiant, m_hotwaterEquipmentDefinition.get_ptr())),
183+
boost::none, boost::none,
184+
boost::optional<BasicQuery>(std::bind(&model::HotWaterEquipmentDefinition::isFractionRadiantDefaulted, m_hotwaterEquipmentDefinition.get_ptr())));
185+
186+
// m_fractionLostEdit->bind(hotwaterEquipmentDefinition,"fractionLost",m_isIP);
187+
m_fractionLostEdit->bind(
188+
m_isIP, *m_hotwaterEquipmentDefinition,
189+
OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::fractionLost, m_hotwaterEquipmentDefinition.get_ptr())),
190+
boost::optional<DoubleSetter>(
191+
std::bind(static_cast<bool (model::HotWaterEquipmentDefinition::*)(double)>(&model::HotWaterEquipmentDefinition::setFractionLost),
192+
m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1)),
193+
boost::optional<NoFailAction>(std::bind(&model::HotWaterEquipmentDefinition::resetFractionLost, m_hotwaterEquipmentDefinition.get_ptr())),
194+
boost::none, boost::none,
195+
boost::optional<BasicQuery>(std::bind(&model::HotWaterEquipmentDefinition::isFractionLostDefaulted, m_hotwaterEquipmentDefinition.get_ptr())));
196+
197+
this->stackedWidget()->setCurrentIndex(1);
198+
}
199+
200+
void HotWaterEquipmentDefinitionInspectorView::detach() {
201+
this->stackedWidget()->setCurrentIndex(0);
202+
203+
m_nameEdit->unbind();
204+
m_designLevelEdit->unbind();
205+
m_wattsPerSpaceFloorAreaEdit->unbind();
206+
m_wattsPerPersonEdit->unbind();
207+
m_fractionLatentEdit->unbind();
208+
m_fractionRadiantEdit->unbind();
209+
m_fractionLostEdit->unbind();
210+
211+
m_hotwaterEquipmentDefinition = boost::none;
212+
}
213+
214+
void HotWaterEquipmentDefinitionInspectorView::refresh() {}
215+
216+
void HotWaterEquipmentDefinitionInspectorView::toggleUnits(bool displayIP) {
217+
m_isIP = displayIP;
218+
}
219+
220+
} // namespace openstudio
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/***********************************************************************************************************************
2+
* OpenStudio(R), Copyright (c) OpenStudio Coalition and other contributors.
3+
* See also https://openstudiocoalition.org/about/software_license/
4+
***********************************************************************************************************************/
5+
6+
#ifndef OPENSTUDIO_HOTWATEREQUIPMENTINSPECTORVIEW_HPP
7+
#define OPENSTUDIO_HOTWATEREQUIPMENTINSPECTORVIEW_HPP
8+
9+
#include "ModelObjectInspectorView.hpp"
10+
#include <openstudio/model/HotWaterEquipmentDefinition.hpp>
11+
12+
namespace openstudio {
13+
14+
class OSLineEdit2;
15+
16+
class OSQuantityEdit2;
17+
18+
class OSDropZone;
19+
20+
class HotWaterEquipmentDefinitionInspectorView : public ModelObjectInspectorView
21+
{
22+
Q_OBJECT
23+
24+
public:
25+
HotWaterEquipmentDefinitionInspectorView(bool isIP, const openstudio::model::Model& model, QWidget* parent = nullptr);
26+
27+
virtual ~HotWaterEquipmentDefinitionInspectorView() = default;
28+
29+
protected:
30+
virtual void onClearSelection() override;
31+
32+
virtual void onSelectModelObject(const openstudio::model::ModelObject& modelObject) override;
33+
34+
virtual void onUpdate() override;
35+
36+
private:
37+
void attach(const openstudio::model::HotWaterEquipmentDefinition& hotwaterEquipmentDefinition);
38+
39+
void detach();
40+
41+
void refresh();
42+
43+
OSLineEdit2* m_nameEdit;
44+
45+
OSQuantityEdit2* m_designLevelEdit;
46+
47+
OSQuantityEdit2* m_wattsPerSpaceFloorAreaEdit;
48+
49+
OSQuantityEdit2* m_wattsPerPersonEdit;
50+
51+
OSQuantityEdit2* m_fractionLatentEdit;
52+
53+
OSQuantityEdit2* m_fractionRadiantEdit;
54+
55+
OSQuantityEdit2* m_fractionLostEdit;
56+
57+
bool m_isIP;
58+
59+
boost::optional<model::HotWaterEquipmentDefinition> m_hotwaterEquipmentDefinition;
60+
61+
public slots:
62+
63+
void toggleUnits(bool displayIP) override;
64+
};
65+
66+
} // namespace openstudio
67+
68+
#endif // OPENSTUDIO_HOTWATEREQUIPMENTINSPECTORVIEW_HPP

src/openstudio_lib/IconLibrary.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,10 @@ IconLibrary::IconLibrary() {
350350
new QPixmap(":/images/mini_icons/heat_transfer_mini.png");
351351
m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatExchanger_FluidToFluid).value()] =
352352
new QPixmap(":/images/mini_icons/fluid_hx_mini.png");
353+
m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HotWaterEquipment).value()] =
354+
new QPixmap(":/images/mini_icons/hotwater_equipment.png");
355+
m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HotWaterEquipment_Definition).value()] =
356+
new QPixmap(":/images/mini_icons/hotwater_equipment_definition.png");
353357
m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_Humidifier_Steam_Electric).value()] =
354358
new QPixmap(":/images/mini_icons/mini_electric_humidifier.png");
355359
m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_Humidifier_Steam_Gas).value()] =

src/openstudio_lib/LoadsController.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#include <openstudio/model/WaterUseEquipmentDefinition_Impl.hpp>
2828
#include <openstudio/model/PeopleDefinition.hpp>
2929
#include <openstudio/model/PeopleDefinition_Impl.hpp>
30+
#include <openstudio/model/HotWaterEquipmentDefinition.hpp>
31+
#include <openstudio/model/HotWaterEquipmentDefinition_Impl.hpp>
3032

3133
#include <openstudio/utilities/core/Assert.hpp>
3234

@@ -73,6 +75,9 @@ void LoadsController::onAddObject(const openstudio::IddObjectType& iddObjectType
7375
case IddObjectType::OS_WaterUse_Equipment_Definition:
7476
openstudio::model::WaterUseEquipmentDefinition(this->model());
7577
break;
78+
case IddObjectType::OS_HotWaterEquipment_Definition:
79+
openstudio::model::HotWaterEquipmentDefinition(this->model());
80+
break;
7681
default:
7782
LOG_FREE(Error, "LoadsController", "Unknown IddObjectType '" << iddObjectType.valueName() << "'");
7883
}

src/openstudio_lib/LoadsView.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "SteamEquipmentInspectorView.hpp"
1515
#include "OtherEquipmentInspectorView.hpp"
1616
#include "WaterUseEquipmentInspectorView.hpp"
17+
#include "HotWaterEquipmentInspectorView.hpp"
1718

1819
#include <openstudio/model/Model_Impl.hpp>
1920

@@ -50,6 +51,7 @@ std::vector<std::pair<IddObjectType, std::string>> LoadsView::modelObjectTypesAn
5051
result.push_back(std::make_pair<IddObjectType, std::string>(IddObjectType::OS_OtherEquipment_Definition, "Other Equipment Definitions"));
5152
result.push_back(std::make_pair<IddObjectType, std::string>(IddObjectType::OS_InternalMass_Definition, "Internal Mass Definitions"));
5253
result.push_back(std::make_pair<IddObjectType, std::string>(IddObjectType::OS_WaterUse_Equipment_Definition, "Water Use Equipment Definitions"));
54+
result.push_back(std::make_pair<IddObjectType, std::string>(IddObjectType::OS_HotWaterEquipment_Definition, "Hot Water Equipment Definitions"));
5355

5456
return result;
5557
}
@@ -95,6 +97,9 @@ void LoadsInspectorView::onSelectModelObject(const openstudio::model::ModelObjec
9597
case IddObjectType::OS_WaterUse_Equipment_Definition:
9698
this->showWaterUseEquipmentDefinitionsInspector(modelObject);
9799
break;
100+
case IddObjectType::OS_HotWaterEquipment_Definition:
101+
this->showHotWaterEquipmentDefinitionsInspector(modelObject);
102+
break;
98103
default:
99104
showDefaultView();
100105
}
@@ -199,6 +204,16 @@ void LoadsInspectorView::showInternalMassDefinitionsInspector(const openstudio::
199204
this->showInspector(internalMassDefinitionInspectorView);
200205
}
201206

207+
void LoadsInspectorView::showHotWaterEquipmentDefinitionsInspector(const openstudio::model::ModelObject& modelObject) {
208+
auto* hotWaterEquipmentDefinitionInspectorView = new HotWaterEquipmentDefinitionInspectorView(m_isIP, m_model);
209+
connect(this, &LoadsInspectorView::toggleUnitsClicked, hotWaterEquipmentDefinitionInspectorView,
210+
&HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked);
211+
212+
hotWaterEquipmentDefinitionInspectorView->selectModelObject(modelObject);
213+
214+
showInspector(hotWaterEquipmentDefinitionInspectorView);
215+
}
216+
202217
void LoadsInspectorView::showDefaultView() {
203218
if (QWidget* widget = this->stackedWidget()->currentWidget()) {
204219
this->stackedWidget()->removeWidget(widget);

src/openstudio_lib/LoadsView.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ class LoadsInspectorView : public ModelObjectInspectorView
6868

6969
void showWaterUseEquipmentDefinitionsInspector(const openstudio::model::ModelObject& modelObject);
7070

71+
void showHotWaterEquipmentDefinitionsInspector(const openstudio::model::ModelObject& modelObject);
72+
7173
void showInspector(QWidget* widget);
7274

7375
void showDefaultView();
5.31 KB
Loading
7.44 KB
Loading
4.79 KB
Loading

0 commit comments

Comments
 (0)