From 01b2380f10a78c0da7c377f104913096b4e74a60 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 27 Feb 2025 16:06:58 +0100 Subject: [PATCH 1/3] #792 - Add a Loads view for HotWaterEquipmentDefinition --- src/openstudio_lib/CMakeLists.txt | 3 + .../HotWaterEquipmentInspectorView.cpp | 212 ++++++++++++++++++ .../HotWaterEquipmentInspectorView.hpp | 68 ++++++ src/openstudio_lib/LoadsController.cpp | 5 + src/openstudio_lib/LoadsView.cpp | 15 ++ src/openstudio_lib/LoadsView.hpp | 2 + 6 files changed, 305 insertions(+) create mode 100644 src/openstudio_lib/HotWaterEquipmentInspectorView.cpp create mode 100644 src/openstudio_lib/HotWaterEquipmentInspectorView.hpp diff --git a/src/openstudio_lib/CMakeLists.txt b/src/openstudio_lib/CMakeLists.txt index ba4447e1c..e86ce3f40 100644 --- a/src/openstudio_lib/CMakeLists.txt +++ b/src/openstudio_lib/CMakeLists.txt @@ -93,6 +93,8 @@ set(${target_name}_SRC GridViewSubTab.hpp HorizontalTabWidget.cpp HorizontalTabWidget.hpp + HotWaterEquipmentInspectorView.cpp + HotWaterEquipmentInspectorView.hpp HVACSystemsController.cpp HVACSystemsController.hpp HVACSystemsTabController.cpp @@ -540,6 +542,7 @@ set(${target_name}_moc GridScene.hpp GridViewSubTab.hpp HorizontalTabWidget.hpp + HotWaterEquipmentInspectorView.hpp HVACSystemsController.hpp HVACSystemsTabController.hpp HVACSystemsTabView.hpp diff --git a/src/openstudio_lib/HotWaterEquipmentInspectorView.cpp b/src/openstudio_lib/HotWaterEquipmentInspectorView.cpp new file mode 100644 index 000000000..6af5baa89 --- /dev/null +++ b/src/openstudio_lib/HotWaterEquipmentInspectorView.cpp @@ -0,0 +1,212 @@ +/*********************************************************************************************************************** +* OpenStudio(R), Copyright (c) OpenStudio Coalition and other contributors. +* See also https://openstudiocoalition.org/about/software_license/ +***********************************************************************************************************************/ + +#include "HotWaterEquipmentInspectorView.hpp" +#include "../shared_gui_components/OSLineEdit.hpp" +#include "../shared_gui_components/OSQuantityEdit.hpp" +#include "OSDropZone.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace openstudio { + +HotWaterEquipmentDefinitionInspectorView::HotWaterEquipmentDefinitionInspectorView(bool isIP, const openstudio::model::Model& model, QWidget* parent) + : ModelObjectInspectorView(model, true, parent), m_nameEdit(new OSLineEdit2()), m_isIP(isIP) { + + auto* visibleWidget = new QWidget(); + this->stackedWidget()->addWidget(visibleWidget); + + auto* mainGridLayout = new QGridLayout(); + mainGridLayout->setContentsMargins(7, 7, 7, 7); + mainGridLayout->setSpacing(14); + visibleWidget->setLayout(mainGridLayout); + + // Name + + auto* label = new QLabel("Name: "); + label->setObjectName("H2"); + mainGridLayout->addWidget(label, 0, 0); + + mainGridLayout->addWidget(m_nameEdit, 1, 0, 1, 3); + + // Design Level + + label = new QLabel("Design Level: "); + label->setObjectName("H2"); + mainGridLayout->addWidget(label, 2, 0); + + m_designLevelEdit = new OSQuantityEdit2("W", "W", "W", m_isIP); + connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_designLevelEdit, &OSQuantityEdit2::onUnitSystemChange); + mainGridLayout->addWidget(m_designLevelEdit, 3, 0); + + // Watts Per Space Floor Area + + label = new QLabel("Watts Per Space Floor Area: "); + label->setObjectName("H2"); + mainGridLayout->addWidget(label, 2, 1); + + m_wattsPerSpaceFloorAreaEdit = new OSQuantityEdit2("W/m^2", "W/m^2", "W/ft^2", m_isIP); + connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_wattsPerSpaceFloorAreaEdit, &OSQuantityEdit2::onUnitSystemChange); + mainGridLayout->addWidget(m_wattsPerSpaceFloorAreaEdit, 3, 1); + + // Watts Per Person + + label = new QLabel("Watts Per Person: "); + label->setObjectName("H2"); + mainGridLayout->addWidget(label, 2, 2); + + m_wattsPerPersonEdit = new OSQuantityEdit2("W/person", "W/person", "W/person", m_isIP); + connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_wattsPerPersonEdit, &OSQuantityEdit2::onUnitSystemChange); + mainGridLayout->addWidget(m_wattsPerPersonEdit, 3, 2); + + // Fraction Latent + + label = new QLabel("Fraction Latent: "); + label->setObjectName("H2"); + mainGridLayout->addWidget(label, 4, 0); + + m_fractionLatentEdit = new OSQuantityEdit2("", "", "", m_isIP); + connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_fractionLatentEdit, &OSQuantityEdit2::onUnitSystemChange); + mainGridLayout->addWidget(m_fractionLatentEdit, 5, 0); + + // Fraction Radiant + + label = new QLabel("Fraction Radiant: "); + label->setObjectName("H2"); + mainGridLayout->addWidget(label, 4, 1); + + m_fractionRadiantEdit = new OSQuantityEdit2("", "", "", m_isIP); + connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_fractionRadiantEdit, &OSQuantityEdit2::onUnitSystemChange); + mainGridLayout->addWidget(m_fractionRadiantEdit, 5, 1); + + // Fraction Lost + + label = new QLabel("Fraction Lost: "); + label->setObjectName("H2"); + mainGridLayout->addWidget(label, 6, 0); + + m_fractionLostEdit = new OSQuantityEdit2("", "", "", m_isIP); + connect(this, &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked, m_fractionLostEdit, &OSQuantityEdit2::onUnitSystemChange); + mainGridLayout->addWidget(m_fractionLostEdit, 7, 0); + + // Stretch + + mainGridLayout->setRowStretch(8, 100); + + mainGridLayout->setColumnStretch(3, 100); +} + +void HotWaterEquipmentDefinitionInspectorView::onClearSelection() { + ModelObjectInspectorView::onClearSelection(); // call parent implementation + detach(); +} + +void HotWaterEquipmentDefinitionInspectorView::onSelectModelObject(const openstudio::model::ModelObject& modelObject) { + detach(); + auto hotwaterEquipmentDefinition = modelObject.cast(); + attach(hotwaterEquipmentDefinition); + refresh(); +} + +void HotWaterEquipmentDefinitionInspectorView::onUpdate() { + refresh(); +} + +void HotWaterEquipmentDefinitionInspectorView::attach(const openstudio::model::HotWaterEquipmentDefinition& hotwaterEquipmentDefinition) { + m_hotwaterEquipmentDefinition = hotwaterEquipmentDefinition; + + // m_nameEdit->bind(hotwaterEquipmentDefinition,"name"); + m_nameEdit->bind(*m_hotwaterEquipmentDefinition, + OptionalStringGetter(std::bind(&model::HotWaterEquipmentDefinition::name, m_hotwaterEquipmentDefinition.get_ptr(), true)), + boost::optional( + std::bind(&model::HotWaterEquipmentDefinition::setName, m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1))); + + // m_designLevelEdit->bind(hotwaterEquipmentDefinition,"designLevel",m_isIP); + m_designLevelEdit->bind(m_isIP, *m_hotwaterEquipmentDefinition, + OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::designLevel, m_hotwaterEquipmentDefinition.get_ptr())), + boost::optional(std::bind( + static_cast(&model::HotWaterEquipmentDefinition::setDesignLevel), + m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1))); + + // m_wattsPerSpaceFloorAreaEdit->bind(hotwaterEquipmentDefinition,"wattsperSpaceFloorArea",m_isIP); + m_wattsPerSpaceFloorAreaEdit->bind( + m_isIP, *m_hotwaterEquipmentDefinition, + OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::wattsperSpaceFloorArea, m_hotwaterEquipmentDefinition.get_ptr())), + boost::optional( + std::bind(static_cast(&model::HotWaterEquipmentDefinition::setWattsperSpaceFloorArea), + m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1))); + + // m_wattsPerPersonEdit->bind(hotwaterEquipmentDefinition,"wattsperPerson",m_isIP); + m_wattsPerPersonEdit->bind( + m_isIP, *m_hotwaterEquipmentDefinition, + OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::wattsperPerson, m_hotwaterEquipmentDefinition.get_ptr())), + boost::optional( + std::bind(static_cast(&model::HotWaterEquipmentDefinition::setWattsperPerson), + m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1))); + + // m_fractionLatentEdit->bind(hotwaterEquipmentDefinition,"fractionLatent",m_isIP); + m_fractionLatentEdit->bind( + m_isIP, *m_hotwaterEquipmentDefinition, + OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::fractionLatent, m_hotwaterEquipmentDefinition.get_ptr())), + boost::optional( + std::bind(static_cast(&model::HotWaterEquipmentDefinition::setFractionLatent), + m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1)), + boost::optional(std::bind(&model::HotWaterEquipmentDefinition::resetFractionLatent, m_hotwaterEquipmentDefinition.get_ptr())), + boost::none, boost::none, + boost::optional(std::bind(&model::HotWaterEquipmentDefinition::isFractionLatentDefaulted, m_hotwaterEquipmentDefinition.get_ptr()))); + + // m_fractionRadiantEdit->bind(hotwaterEquipmentDefinition,"fractionRadiant",m_isIP); + m_fractionRadiantEdit->bind( + m_isIP, *m_hotwaterEquipmentDefinition, + OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::fractionRadiant, m_hotwaterEquipmentDefinition.get_ptr())), + boost::optional( + std::bind(static_cast(&model::HotWaterEquipmentDefinition::setFractionRadiant), + m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1)), + boost::optional(std::bind(&model::HotWaterEquipmentDefinition::resetFractionRadiant, m_hotwaterEquipmentDefinition.get_ptr())), + boost::none, boost::none, + boost::optional(std::bind(&model::HotWaterEquipmentDefinition::isFractionRadiantDefaulted, m_hotwaterEquipmentDefinition.get_ptr()))); + + // m_fractionLostEdit->bind(hotwaterEquipmentDefinition,"fractionLost",m_isIP); + m_fractionLostEdit->bind( + m_isIP, *m_hotwaterEquipmentDefinition, + OptionalDoubleGetter(std::bind(&model::HotWaterEquipmentDefinition::fractionLost, m_hotwaterEquipmentDefinition.get_ptr())), + boost::optional( + std::bind(static_cast(&model::HotWaterEquipmentDefinition::setFractionLost), + m_hotwaterEquipmentDefinition.get_ptr(), std::placeholders::_1)), + boost::optional(std::bind(&model::HotWaterEquipmentDefinition::resetFractionLost, m_hotwaterEquipmentDefinition.get_ptr())), + boost::none, boost::none, + boost::optional(std::bind(&model::HotWaterEquipmentDefinition::isFractionLostDefaulted, m_hotwaterEquipmentDefinition.get_ptr()))); + + this->stackedWidget()->setCurrentIndex(1); +} + +void HotWaterEquipmentDefinitionInspectorView::detach() { + this->stackedWidget()->setCurrentIndex(0); + + m_nameEdit->unbind(); + m_designLevelEdit->unbind(); + m_wattsPerSpaceFloorAreaEdit->unbind(); + m_wattsPerPersonEdit->unbind(); + m_fractionLatentEdit->unbind(); + m_fractionRadiantEdit->unbind(); + m_fractionLostEdit->unbind(); + + m_hotwaterEquipmentDefinition = boost::none; +} + +void HotWaterEquipmentDefinitionInspectorView::refresh() {} + +void HotWaterEquipmentDefinitionInspectorView::toggleUnits(bool displayIP) { + m_isIP = displayIP; +} + +} // namespace openstudio diff --git a/src/openstudio_lib/HotWaterEquipmentInspectorView.hpp b/src/openstudio_lib/HotWaterEquipmentInspectorView.hpp new file mode 100644 index 000000000..e0ec4f55b --- /dev/null +++ b/src/openstudio_lib/HotWaterEquipmentInspectorView.hpp @@ -0,0 +1,68 @@ +/*********************************************************************************************************************** +* OpenStudio(R), Copyright (c) OpenStudio Coalition and other contributors. +* See also https://openstudiocoalition.org/about/software_license/ +***********************************************************************************************************************/ + +#ifndef OPENSTUDIO_HOTWATEREQUIPMENTINSPECTORVIEW_HPP +#define OPENSTUDIO_HOTWATEREQUIPMENTINSPECTORVIEW_HPP + +#include "ModelObjectInspectorView.hpp" +#include + +namespace openstudio { + +class OSLineEdit2; + +class OSQuantityEdit2; + +class OSDropZone; + +class HotWaterEquipmentDefinitionInspectorView : public ModelObjectInspectorView +{ + Q_OBJECT + + public: + HotWaterEquipmentDefinitionInspectorView(bool isIP, const openstudio::model::Model& model, QWidget* parent = nullptr); + + virtual ~HotWaterEquipmentDefinitionInspectorView() = default; + + protected: + virtual void onClearSelection() override; + + virtual void onSelectModelObject(const openstudio::model::ModelObject& modelObject) override; + + virtual void onUpdate() override; + + private: + void attach(const openstudio::model::HotWaterEquipmentDefinition& hotwaterEquipmentDefinition); + + void detach(); + + void refresh(); + + OSLineEdit2* m_nameEdit; + + OSQuantityEdit2* m_designLevelEdit; + + OSQuantityEdit2* m_wattsPerSpaceFloorAreaEdit; + + OSQuantityEdit2* m_wattsPerPersonEdit; + + OSQuantityEdit2* m_fractionLatentEdit; + + OSQuantityEdit2* m_fractionRadiantEdit; + + OSQuantityEdit2* m_fractionLostEdit; + + bool m_isIP; + + boost::optional m_hotwaterEquipmentDefinition; + + public slots: + + void toggleUnits(bool displayIP) override; +}; + +} // namespace openstudio + +#endif // OPENSTUDIO_HOTWATEREQUIPMENTINSPECTORVIEW_HPP diff --git a/src/openstudio_lib/LoadsController.cpp b/src/openstudio_lib/LoadsController.cpp index f7de3a7d2..e81f952c8 100644 --- a/src/openstudio_lib/LoadsController.cpp +++ b/src/openstudio_lib/LoadsController.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include @@ -73,6 +75,9 @@ void LoadsController::onAddObject(const openstudio::IddObjectType& iddObjectType case IddObjectType::OS_WaterUse_Equipment_Definition: openstudio::model::WaterUseEquipmentDefinition(this->model()); break; + case IddObjectType::OS_HotWaterEquipment_Definition: + openstudio::model::HotWaterEquipmentDefinition(this->model()); + break; default: LOG_FREE(Error, "LoadsController", "Unknown IddObjectType '" << iddObjectType.valueName() << "'"); } diff --git a/src/openstudio_lib/LoadsView.cpp b/src/openstudio_lib/LoadsView.cpp index 2a35862a6..3e505a96a 100644 --- a/src/openstudio_lib/LoadsView.cpp +++ b/src/openstudio_lib/LoadsView.cpp @@ -14,6 +14,7 @@ #include "SteamEquipmentInspectorView.hpp" #include "OtherEquipmentInspectorView.hpp" #include "WaterUseEquipmentInspectorView.hpp" +#include "HotWaterEquipmentInspectorView.hpp" #include @@ -50,6 +51,7 @@ std::vector> LoadsView::modelObjectTypesAn result.push_back(std::make_pair(IddObjectType::OS_OtherEquipment_Definition, "Other Equipment Definitions")); result.push_back(std::make_pair(IddObjectType::OS_InternalMass_Definition, "Internal Mass Definitions")); result.push_back(std::make_pair(IddObjectType::OS_WaterUse_Equipment_Definition, "Water Use Equipment Definitions")); + result.push_back(std::make_pair(IddObjectType::OS_HotWaterEquipment_Definition, "Hot Water Equipment Definitions")); return result; } @@ -95,6 +97,9 @@ void LoadsInspectorView::onSelectModelObject(const openstudio::model::ModelObjec case IddObjectType::OS_WaterUse_Equipment_Definition: this->showWaterUseEquipmentDefinitionsInspector(modelObject); break; + case IddObjectType::OS_HotWaterEquipment_Definition: + this->showHotWaterEquipmentDefinitionsInspector(modelObject); + break; default: showDefaultView(); } @@ -199,6 +204,16 @@ void LoadsInspectorView::showInternalMassDefinitionsInspector(const openstudio:: this->showInspector(internalMassDefinitionInspectorView); } +void LoadsInspectorView::showHotWaterEquipmentDefinitionsInspector(const openstudio::model::ModelObject& modelObject) { + auto* hotWaterEquipmentDefinitionInspectorView = new HotWaterEquipmentDefinitionInspectorView(m_isIP, m_model); + connect(this, &LoadsInspectorView::toggleUnitsClicked, hotWaterEquipmentDefinitionInspectorView, + &HotWaterEquipmentDefinitionInspectorView::toggleUnitsClicked); + + hotWaterEquipmentDefinitionInspectorView->selectModelObject(modelObject); + + showInspector(hotWaterEquipmentDefinitionInspectorView); +} + void LoadsInspectorView::showDefaultView() { if (QWidget* widget = this->stackedWidget()->currentWidget()) { this->stackedWidget()->removeWidget(widget); diff --git a/src/openstudio_lib/LoadsView.hpp b/src/openstudio_lib/LoadsView.hpp index 4730c4e82..0fc7d1472 100644 --- a/src/openstudio_lib/LoadsView.hpp +++ b/src/openstudio_lib/LoadsView.hpp @@ -68,6 +68,8 @@ class LoadsInspectorView : public ModelObjectInspectorView void showWaterUseEquipmentDefinitionsInspector(const openstudio::model::ModelObject& modelObject); + void showHotWaterEquipmentDefinitionsInspector(const openstudio::model::ModelObject& modelObject); + void showInspector(QWidget* widget); void showDefaultView(); From 10d1dc3a4db024093e8c531b46c97cf5755aa075 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 27 Feb 2025 16:07:42 +0100 Subject: [PATCH 2/3] #792 - Add quick icons for HotWaterEquipment/HotWaterEquipmentDefiniton --- src/openstudio_lib/IconLibrary.cpp | 4 ++++ .../images/mini_icons/hotwater_equipment.png | Bin 0 -> 5433 bytes .../images/mini_icons/hotwater_equipment@2x.png | Bin 0 -> 7622 bytes .../mini_icons/hotwater_equipment_definition.png | Bin 0 -> 4908 bytes .../hotwater_equipment_definition@2x.png | Bin 0 -> 6055 bytes src/openstudio_lib/openstudio.qrc | 4 ++++ src/openstudio_lib/test/IconLibrary_GTest.cpp | 2 ++ 7 files changed, 10 insertions(+) create mode 100644 src/openstudio_lib/images/mini_icons/hotwater_equipment.png create mode 100644 src/openstudio_lib/images/mini_icons/hotwater_equipment@2x.png create mode 100644 src/openstudio_lib/images/mini_icons/hotwater_equipment_definition.png create mode 100644 src/openstudio_lib/images/mini_icons/hotwater_equipment_definition@2x.png diff --git a/src/openstudio_lib/IconLibrary.cpp b/src/openstudio_lib/IconLibrary.cpp index f4ad56cae..d1969eb21 100644 --- a/src/openstudio_lib/IconLibrary.cpp +++ b/src/openstudio_lib/IconLibrary.cpp @@ -350,6 +350,10 @@ IconLibrary::IconLibrary() { new QPixmap(":/images/mini_icons/heat_transfer_mini.png"); m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatExchanger_FluidToFluid).value()] = new QPixmap(":/images/mini_icons/fluid_hx_mini.png"); + m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HotWaterEquipment).value()] = + new QPixmap(":/images/mini_icons/hotwater_equipment.png"); + m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HotWaterEquipment_Definition).value()] = + new QPixmap(":/images/mini_icons/hotwater_equipment_definition.png"); m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_Humidifier_Steam_Electric).value()] = new QPixmap(":/images/mini_icons/mini_electric_humidifier.png"); m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_Humidifier_Steam_Gas).value()] = diff --git a/src/openstudio_lib/images/mini_icons/hotwater_equipment.png b/src/openstudio_lib/images/mini_icons/hotwater_equipment.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5ceb5945c5c4b04b4d67dbf00073bc229bbaa9 GIT binary patch literal 5433 zcmeHLc~Dd577vgrn}~=M74aHr1tiJMLN*CI0@YwdP&TVK$qhuvLJ~rV8>ool12;ro z*aQXl4FxN-f<=mmik63#f`Wpgh`6xHL*(5AM4Z=|H_p8NXC|54?>p!GzH@$OnS9yF z_Vb=%ILi=)LQV1Y@$^T&Ej1tgNhp-gLCF*mvM5&t1j+rOSU@5b^94~bAdi#40IU@7 zQ7Gk~LUz-XO2GL2fcYF97m#oDd!aw|**iyqXWmQSP1cO4$`6~EkM6nI0+%yZHni`t zKcHTauKV(JM*HjKOHJ-OXQAVEF{NpRZNpt{cBXl8>3Da=+-oIff!nWaG+2)Ap5FJK zu&vXSW2l?tx~q8K%7yo5lrT@91E2Xt%^5n1+w_Zf|K^N{@b>ncU@odVJ)vnY`O@R5 zd;7Y8y1-#zq?@cW_hnY_?Aijf42fu)z{7*>>*4V+6eNJGjeD6sm9AD*YgQCs0w*up z!QdUk{aKYvyJv5n=YDKPNDO$n*GNsavBRZqiM)Dsch!llyDpqDIkN?Lr}G#`vn%!4 zITC4zm`vN1XtI)#F@u$&RMSqaV>~gMc`)#HXjZZGKyi1?8q1r{7uJRyr6;2; z&Z7-5<^jvyXHqa1JC6kU+}+e%>C)W0q}~5|pzi!?UHdx#b+~o&>$1>=bF-!Uw?rQr zs)~00ExrPG=NSF=!1*?^A8LdoDY!IzfB_Eqs!pFy+#R1FY<*mM+HQTt6BDqPcfGJV z?L9ehgSFD-u=s}V)=RFh)J>t0bB|7SRhRzo5H&feLYYu>pZV}XePdI3c*yWDsy|%X z6ltVqgp{08fRt7cYbk>(7UCeDm;>XKLJ3lHD3p_nQUY-!VL8Bo!v!KH=2cla1`zO= zm{pD}kR|beBLqGwDZE1E7r<3Ta_Kybi?gAVl7RpSVL1dSg;63IL&?NwaT&<7W*d(I zv?}sQCMJl*20X-47$D=wI1uZl6ex%oXG6eA%HuQqJr|EbAS)&&LN1pu@c7u+SX?X# zCzgie33NIg4-)Z2A{NoW%Hl+FNQo86=4&8EF+5=zS1ORm1!57P!Gt*C7&#MzLFB+k z|AZ12YaCuA8)E_C1FwW6cmfW@3x)WJ7Bab)0s$Fw=r1i~0Z519{b89nM#_b~6tGA> zeVFhd?<}Xk0RZNWxMGTo8ex^RW;OhOrzD z38IsU6i0|h)k5*OjKyN95JJ)^5JKTFULp$D3N(Z>+}OTM3=s!@+F?gQaz0|f#4Htv zVw9f*0RkbsLJn!zBv8p9g+g;A6X+m`Kq7xqS_w;KNF{182_TL{(MmLFVIaXE#6p@n zMF6z>NGuEwDGbTQ(g3kIiiy#<1ZXVB#Vn+qc#s_Ogyb*+3KAU|Adx|&1`sHk2ZG~5 zkiY;Z=!*1* z#>a@A@c+e$lU8BEkU{K5_mJU*%tHM5FdX9y@%Qh1jpgF+JOTi|9`Z%}ex>UxU0=k& z7b$g<(EqGku0Ghd}J+Xfl^e^_Uty{$KQ z+T8kS`#y$Ypi5)W@qg`@(S@03@!&{>?oR9})7;fn`BDBTg_|D9#Q zK7sn0a7X76#k!h#A9!5^BlVuvBX(I0KVKebCdoP;9@bGLpeioQItrsGvzMUOs#K+3 z`h$zCQWiI4H!oauwgeTgTTw?9t(~e;sX%9EQD1-mzU&()kU)TnL$JSs#*4kZ4IY>@ zmv45-{hG_1eyyJ$rURT0Yx$&*0#o z#W(S5!FN0JZS@n~cT{l>#{N)Kw1E%9-#F(^&9|MkD50RBplAO4`RAHm28D%f&_h{v zZOzHC-t1tJxz|RJALJnFN^Sg*y`k%m^PY_C97WlKsN(@4X6Q$~H*em2xzV78MSkkRP*8j$#`eo7X&NQA>-Wul|cCz8a^^TrbEEWqJnx3dP zZKr31jalAM)t{oyQWM{O&IfFs``efa=3guhG~Jc~S$=CN089ckRekpvR@!pl)Hp%(X{auY|Csc<{*l$ltTC*39TiX(QCuUB9YwHEJ z?X@B+Bh<6*?vlab4|OrC#S47)wa>J&+E9G>uwFjknhyUIhRb5a++dr3cV}@c%`dfz zlk8CYQ(VvY%AD#8jTW?2*~Mu{rjkRtWu|)y}#aWR!Yv%G!yEql>FK!Ar2P1Qbw?@c3ut^`?LHy7Cn-@ z<5q(C>cU37g!pwA8h zW^%s1*YX{O0<*fF-=03@Pp*zGUul2f*086E`Ht!~zudZk63DWxhWC42k;9vaO+H0i zwqH(6O*MJ^MyX6~%SQ^Juk^bc%b+3#un?hl9zprkL;Y zGIek5Q$3P1pkNEM+aV7R4}3?@pwScQph-z2ke9d^ld|K-Cp!DyOLTpeOg^fiHCnr^Kf-TbFdHZYD#>C8sjEv04%+#wb zGDYhs%I0j_QwRqK){{f=y;Gd5>%NaKPDx4eT(#<;cVM9E{k!Nax@^*O`7Av>J*4A~ z-G33ZdbQBc&+kJ{?GtDFgS8iyg=H>tVZS{%Gb-!^Njo2E&la literal 0 HcmV?d00001 diff --git a/src/openstudio_lib/images/mini_icons/hotwater_equipment@2x.png b/src/openstudio_lib/images/mini_icons/hotwater_equipment@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..947373105c5dc8c937541e0b4286ac8aa8b41ef4 GIT binary patch literal 7622 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 axXMcyUe}$nE#v)1W@>c6ut?u6;(q|va+=`) literal 0 HcmV?d00001 diff --git a/src/openstudio_lib/images/mini_icons/hotwater_equipment_definition.png b/src/openstudio_lib/images/mini_icons/hotwater_equipment_definition.png new file mode 100644 index 0000000000000000000000000000000000000000..0087dcbfd8463506c8b3ec9373ed226d439148bd GIT binary patch literal 4908 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/mini_icons/heat_transfer_mini@2x.png images/mini_icons/hightempradiant.png images/mini_icons/hightempradiant@2x.png + images/mini_icons/hotwater_equipment.png + images/mini_icons/hotwater_equipment@2x.png + images/mini_icons/hotwater_equipment_definition.png + images/mini_icons/hotwater_equipment_definition@2x.png images/mini_icons/illuminance_map.png images/mini_icons/illuminance_map@2x.png images/mini_icons/indirectEvap.png diff --git a/src/openstudio_lib/test/IconLibrary_GTest.cpp b/src/openstudio_lib/test/IconLibrary_GTest.cpp index dc575b9d2..ada2d8f5a 100644 --- a/src/openstudio_lib/test/IconLibrary_GTest.cpp +++ b/src/openstudio_lib/test/IconLibrary_GTest.cpp @@ -146,6 +146,8 @@ TEST_F(OpenStudioLibFixture, IconLibrary_MiniIcon) { iddObjectTypes.push_back(IddObjectType::OS_Fan_VariableVolume); iddObjectTypes.push_back(IddObjectType::OS_GasEquipment); iddObjectTypes.push_back(IddObjectType::OS_GasEquipment_Definition); + iddObjectTypes.push_back(IddObjectType::OS_HotWaterEquipment); + iddObjectTypes.push_back(IddObjectType::OS_HotWaterEquipment_Definition); iddObjectTypes.push_back(IddObjectType::OS_IlluminanceMap); iddObjectTypes.push_back(IddObjectType::OS_InteriorPartitionSurfaceGroup); iddObjectTypes.push_back(IddObjectType::OS_InteriorPartitionSurfaceGroup); From b5e439b62c595157970efab15ab3496a27a0c46a Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 27 Feb 2025 16:26:51 +0100 Subject: [PATCH 3/3] Add a footnote to clarify the object. This is new, so maybe reverted... --- src/openstudio_lib/HotWaterEquipmentInspectorView.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/openstudio_lib/HotWaterEquipmentInspectorView.cpp b/src/openstudio_lib/HotWaterEquipmentInspectorView.cpp index 6af5baa89..53129d0c6 100644 --- a/src/openstudio_lib/HotWaterEquipmentInspectorView.cpp +++ b/src/openstudio_lib/HotWaterEquipmentInspectorView.cpp @@ -102,6 +102,14 @@ HotWaterEquipmentDefinitionInspectorView::HotWaterEquipmentDefinitionInspectorVi mainGridLayout->setRowStretch(8, 100); + label = + new QLabel("The object models hot water equipment in the zone which consumes district heating, such as cooking equipment or process loads. " + "All of the energy consumed by the equipment becomes a heat gain in the zone or is lost (exhausted). " + "This object consumes district heating energy directly and does not cause a load on a hot water plant loop or water heater. " + "For domestic hot water uses, such as sinks and showers, see WaterUse:Equipment."); + label->setWordWrap(true); + mainGridLayout->addWidget(label, 9, 0, 1, 4); + mainGridLayout->setColumnStretch(3, 100); }