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..53129d0c6 --- /dev/null +++ b/src/openstudio_lib/HotWaterEquipmentInspectorView.cpp @@ -0,0 +1,220 @@ +/*********************************************************************************************************************** +* 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); + + 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); +} + +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/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/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(); 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 000000000..4d5ceb594 Binary files /dev/null and b/src/openstudio_lib/images/mini_icons/hotwater_equipment.png differ 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 000000000..947373105 Binary files /dev/null and b/src/openstudio_lib/images/mini_icons/hotwater_equipment@2x.png differ 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 000000000..0087dcbfd Binary files /dev/null and b/src/openstudio_lib/images/mini_icons/hotwater_equipment_definition.png differ diff --git a/src/openstudio_lib/images/mini_icons/hotwater_equipment_definition@2x.png b/src/openstudio_lib/images/mini_icons/hotwater_equipment_definition@2x.png new file mode 100644 index 000000000..e6bc2a6f5 Binary files /dev/null and b/src/openstudio_lib/images/mini_icons/hotwater_equipment_definition@2x.png differ diff --git a/src/openstudio_lib/openstudio.qrc b/src/openstudio_lib/openstudio.qrc index b5e52e5cf..c254c7fb1 100644 --- a/src/openstudio_lib/openstudio.qrc +++ b/src/openstudio_lib/openstudio.qrc @@ -826,6 +826,10 @@ images/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);