From 3bb31731627ef365c13617d80ac1e5ed86f91c44 Mon Sep 17 00:00:00 2001 From: Ski90Moo Date: Mon, 12 Oct 2026 10:30:26 -0700 Subject: [PATCH 1/3] Add Plant Loop Heat Pumps library category with new types and icons Rename the "Heat Pumps" Library/My Model category to "Plant Loop Heat Pumps" and list the plant heat pump types the app was missing: HeatPump:PlantLoop:EIR Heating/Cooling, HeatPump:AirToWater:FuelFired Heating/Cooling, and HeatPump:AirToWater (wrapper plus its Heating and Cooling operation modes in My Model). Dropping a HeatPump:AirToWater wrapper on a plant loop asks whether to place its heating or cooling mode (preselected from the loop's sizing type) and places that mode, since the wrapper itself cannot go on a node. Placement logic lives in utilities/HeatPumpAirToWaterPlacement with unit tests. Add default instances of the new types to hvac_library.osm (EIR air source, fuel-fired, and an air-to-water wrapper with one speed per mode); verified to forward translate cleanly. Add icons for the new types and redraw the water-to-water icons so heating and cooling differ. The air-to-water wrapper and its modes share one icon. Icon tests check distinctness and no Catchall fallback. Translations: new strings hand-inserted into all .ts files. Note: the SVG sources for the new icons are held outside the repo for now, pending a decision on whether they should be published. Co-Authored-By: Claude Opus 5.5 --- .../Resources/default/hvac_library.osm | 508 ++++++++++++++++++ src/openstudio_lib/HVACSystemsController.cpp | 52 +- .../MainRightColumnController.cpp | 20 +- .../images/heatpump_airtowater.png | Bin 0 -> 3656 bytes .../images/heatpump_airtowater@2x.png | Bin 0 -> 7942 bytes .../heatpump_airtowater_fuelfired_cooling.png | Bin 0 -> 4296 bytes ...atpump_airtowater_fuelfired_cooling@2x.png | Bin 0 -> 9506 bytes .../heatpump_airtowater_fuelfired_heating.png | Bin 0 -> 4189 bytes ...atpump_airtowater_fuelfired_heating@2x.png | Bin 0 -> 9144 bytes .../images/heatpump_plantloop_eir_cooling.png | Bin 0 -> 3697 bytes .../heatpump_plantloop_eir_cooling@2x.png | Bin 0 -> 7606 bytes .../images/heatpump_plantloop_eir_heating.png | Bin 0 -> 3607 bytes .../heatpump_plantloop_eir_heating@2x.png | Bin 0 -> 7081 bytes ...tpump_watertowater_equationfit_cooling.png | Bin 4097 -> 3811 bytes ...mp_watertowater_equationfit_cooling@2x.png | Bin 15210 -> 8152 bytes ...tpump_watertowater_equationfit_heating.png | Bin 4097 -> 3659 bytes ...mp_watertowater_equationfit_heating@2x.png | Bin 15210 -> 7213 bytes .../images/mini_icons/heatpump_airtowater.png | Bin 0 -> 759 bytes .../mini_icons/heatpump_airtowater@2x.png | Bin 0 -> 1428 bytes .../heatpump_airtowater_fuelfired_cooling.png | Bin 0 -> 854 bytes ...atpump_airtowater_fuelfired_cooling@2x.png | Bin 0 -> 1661 bytes .../heatpump_airtowater_fuelfired_heating.png | Bin 0 -> 848 bytes ...atpump_airtowater_fuelfired_heating@2x.png | Bin 0 -> 1658 bytes .../heatpump_plantloop_eir_cooling.png | Bin 0 -> 704 bytes .../heatpump_plantloop_eir_cooling@2x.png | Bin 0 -> 1380 bytes .../heatpump_plantloop_eir_heating.png | Bin 0 -> 702 bytes .../heatpump_plantloop_eir_heating@2x.png | Bin 0 -> 1385 bytes ...tpump_watertowater_equationfit_cooling.png | Bin 819 -> 891 bytes ...mp_watertowater_equationfit_cooling@2x.png | Bin 3148 -> 1673 bytes ...tpump_watertowater_equationfit_heating.png | Bin 819 -> 888 bytes ...mp_watertowater_equationfit_heating@2x.png | Bin 3148 -> 1675 bytes src/openstudio_lib/openstudio.qrc | 20 + src/openstudio_lib/test/IconLibrary_GTest.cpp | 49 ++ src/shared_gui_components/IconLibrary.cpp | 27 + src/utilities/CMakeLists.txt | 3 + src/utilities/HeatPumpAirToWaterPlacement.cpp | 62 +++ src/utilities/HeatPumpAirToWaterPlacement.hpp | 39 ++ .../HeatPumpAirToWaterPlacement_GTest.cpp | 131 +++++ translations/OpenStudioApp_ar.ts | 76 ++- translations/OpenStudioApp_ca.ts | 76 ++- translations/OpenStudioApp_de.ts | 76 ++- translations/OpenStudioApp_el.ts | 76 ++- translations/OpenStudioApp_es.ts | 76 ++- translations/OpenStudioApp_fa.ts | 76 ++- translations/OpenStudioApp_fr.ts | 76 ++- translations/OpenStudioApp_he.ts | 76 ++- translations/OpenStudioApp_hi.ts | 76 ++- translations/OpenStudioApp_id.ts | 76 ++- translations/OpenStudioApp_it.ts | 76 ++- translations/OpenStudioApp_ja.ts | 76 ++- translations/OpenStudioApp_ko.ts | 76 ++- translations/OpenStudioApp_pl.ts | 76 ++- translations/OpenStudioApp_pt.ts | 76 ++- translations/OpenStudioApp_tr.ts | 76 ++- translations/OpenStudioApp_vi.ts | 76 ++- translations/OpenStudioApp_zh_CN.ts | 76 ++- 56 files changed, 2202 insertions(+), 77 deletions(-) create mode 100644 src/openstudio_lib/images/heatpump_airtowater.png create mode 100644 src/openstudio_lib/images/heatpump_airtowater@2x.png create mode 100644 src/openstudio_lib/images/heatpump_airtowater_fuelfired_cooling.png create mode 100644 src/openstudio_lib/images/heatpump_airtowater_fuelfired_cooling@2x.png create mode 100644 src/openstudio_lib/images/heatpump_airtowater_fuelfired_heating.png create mode 100644 src/openstudio_lib/images/heatpump_airtowater_fuelfired_heating@2x.png create mode 100644 src/openstudio_lib/images/heatpump_plantloop_eir_cooling.png create mode 100644 src/openstudio_lib/images/heatpump_plantloop_eir_cooling@2x.png create mode 100644 src/openstudio_lib/images/heatpump_plantloop_eir_heating.png create mode 100644 src/openstudio_lib/images/heatpump_plantloop_eir_heating@2x.png create mode 100644 src/openstudio_lib/images/mini_icons/heatpump_airtowater.png create mode 100644 src/openstudio_lib/images/mini_icons/heatpump_airtowater@2x.png create mode 100644 src/openstudio_lib/images/mini_icons/heatpump_airtowater_fuelfired_cooling.png create mode 100644 src/openstudio_lib/images/mini_icons/heatpump_airtowater_fuelfired_cooling@2x.png create mode 100644 src/openstudio_lib/images/mini_icons/heatpump_airtowater_fuelfired_heating.png create mode 100644 src/openstudio_lib/images/mini_icons/heatpump_airtowater_fuelfired_heating@2x.png create mode 100644 src/openstudio_lib/images/mini_icons/heatpump_plantloop_eir_cooling.png create mode 100644 src/openstudio_lib/images/mini_icons/heatpump_plantloop_eir_cooling@2x.png create mode 100644 src/openstudio_lib/images/mini_icons/heatpump_plantloop_eir_heating.png create mode 100644 src/openstudio_lib/images/mini_icons/heatpump_plantloop_eir_heating@2x.png create mode 100644 src/utilities/HeatPumpAirToWaterPlacement.cpp create mode 100644 src/utilities/HeatPumpAirToWaterPlacement.hpp create mode 100644 src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp diff --git a/src/openstudio_app/Resources/default/hvac_library.osm b/src/openstudio_app/Resources/default/hvac_library.osm index c928b4305..7480a5f75 100644 --- a/src/openstudio_app/Resources/default/hvac_library.osm +++ b/src/openstudio_app/Resources/default/hvac_library.osm @@ -14277,3 +14277,511 @@ OS:EvaporativeCooler:Direct:ResearchSpecial, 24, !- Evaporative Operation Maximum Limit Wetbulb Temperature 28; !- Evaporative Operation Maximum Limit Drybulb Temperature + +! Plant Loop Heat Pumps + +OS:Curve:Biquadratic, + {880a8b14-5973-4220-9065-e36b00b2f3ae}, !- Handle + Curve Biquadratic 1, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 5, !- Minimum Value of x + 10, !- Maximum Value of x + 24, !- Minimum Value of y + 35, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature; !- Input Unit Type for Y + +OS:Curve:Biquadratic, + {5343bf17-0e7c-43ab-8fee-3cf0d932718f}, !- Handle + Curve Biquadratic 2, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 5, !- Minimum Value of x + 10, !- Maximum Value of x + 24, !- Minimum Value of y + 35, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature; !- Input Unit Type for Y + +OS:Curve:Biquadratic, + {73bde3ba-8475-4566-a91f-11deaf1a99c5}, !- Handle + Curve Biquadratic 3, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 5, !- Minimum Value of x + 10, !- Maximum Value of x + 24, !- Minimum Value of y + 35, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature; !- Input Unit Type for Y + +OS:Curve:Biquadratic, + {85e04dd3-87e0-41fc-bb91-32241c07b021}, !- Handle + Curve Biquadratic 4, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 5, !- Minimum Value of x + 10, !- Maximum Value of x + 24, !- Minimum Value of y + 35, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature; !- Input Unit Type for Y + +OS:Curve:Biquadratic, + {94746cf2-0f89-460e-acdb-62cdd5be0485}, !- Handle + GAHP Cooling CapFT, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 5, !- Minimum Value of x + 10, !- Maximum Value of x + 24, !- Minimum Value of y + 35, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature; !- Input Unit Type for Y + +OS:Curve:Biquadratic, + {31dc954c-f9d4-4d55-8212-90f9bb756657}, !- Handle + GAHP Cooling EIRFT, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 5, !- Minimum Value of x + 10, !- Maximum Value of x + 24, !- Minimum Value of y + 35, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature; !- Input Unit Type for Y + +OS:Curve:Biquadratic, + {a7deeea1-ea5b-4639-b4b2-f4dedfb52f96}, !- Handle + GAHP Heating CapFT, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 5, !- Minimum Value of x + 10, !- Maximum Value of x + 24, !- Minimum Value of y + 35, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature; !- Input Unit Type for Y + +OS:Curve:Biquadratic, + {569c9254-00cc-41e4-90cf-03016efadea6}, !- Handle + GAHP Heating EIRFT, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 5, !- Minimum Value of x + 10, !- Maximum Value of x + 24, !- Minimum Value of y + 35, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature; !- Input Unit Type for Y + +OS:Curve:Biquadratic, + {fcd1f27c-8baf-46d0-9fd6-047b8e41d830}, !- Handle + Heat Pump Air To Water Cooling Speed Data 1 CapCurveFuncTempHT, !- Name + 0.885, !- Coefficient1 Constant + -0.0004, !- Coefficient2 x + 0.00019, !- Coefficient3 x**2 + 0.0202, !- Coefficient4 y + -0.0096, !- Coefficient5 y**2 + 0.00058, !- Coefficient6 x*y + 30, !- Minimum Value of x + 50, !- Maximum Value of x + -7, !- Minimum Value of y + 20, !- Maximum Value of y + 0.5, !- Minimum Curve Output + 1.3, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +OS:Curve:Biquadratic, + {b375bf3b-bed2-4ff8-8fa6-39d157f4b1f9}, !- Handle + Heat Pump Air To Water Cooling Speed Data 1 EIRCurveFuncTempHT, !- Name + 1.055, !- Coefficient1 Constant + 0.00035, !- Coefficient2 x + -0.00027, !- Coefficient3 x**2 + -0.0108, !- Coefficient4 y + 0.0145, !- Coefficient5 y**2 + -0.00023, !- Coefficient6 x*y + 30, !- Minimum Value of x + 50, !- Maximum Value of x + -7, !- Minimum Value of y + 20, !- Maximum Value of y + 0.7, !- Minimum Curve Output + 1.5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +OS:Curve:Biquadratic, + {0028ca86-0930-4c3c-9108-0467338ddf58}, !- Handle + Heat Pump Air To Water Heating Speed Data 1 CapCurveFuncTempHT, !- Name + 0.885, !- Coefficient1 Constant + -0.0004, !- Coefficient2 x + 0.00019, !- Coefficient3 x**2 + 0.0202, !- Coefficient4 y + -0.0096, !- Coefficient5 y**2 + 0.00058, !- Coefficient6 x*y + 30, !- Minimum Value of x + 50, !- Maximum Value of x + -7, !- Minimum Value of y + 20, !- Maximum Value of y + 0.5, !- Minimum Curve Output + 1.3, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +OS:Curve:Biquadratic, + {8c9b0b98-da37-4476-b128-4bfa75494611}, !- Handle + Heat Pump Air To Water Heating Speed Data 1 EIRCurveFuncTempHT, !- Name + 1.055, !- Coefficient1 Constant + 0.00035, !- Coefficient2 x + -0.00027, !- Coefficient3 x**2 + -0.0108, !- Coefficient4 y + 0.0145, !- Coefficient5 y**2 + -0.00023, !- Coefficient6 x*y + 30, !- Minimum Value of x + 50, !- Maximum Value of x + -7, !- Minimum Value of y + 20, !- Maximum Value of y + 0.7, !- Minimum Curve Output + 1.5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +OS:Curve:Quadratic, + {be1baee3-04c0-45ab-ad78-b3a8bb2f87c7}, !- Handle + Curve Quadratic 1, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1; !- Maximum Value of x + +OS:Curve:Quadratic, + {82cb1e3f-c8d1-430b-aebb-8ca634023613}, !- Handle + Curve Quadratic 2, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1; !- Maximum Value of x + +OS:Curve:Quadratic, + {16e619d8-bb8d-4dd1-b22a-10cc385ef65d}, !- Handle + GAHP Cooling EIRFPLR, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1; !- Maximum Value of x + +OS:Curve:Quadratic, + {4a82afc1-3c05-43ee-8f69-82979aea2179}, !- Handle + GAHP Heating EIRFPLR, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1; !- Maximum Value of x + +OS:Curve:Quadratic, + {0b0b0ac0-fd06-4d0c-8941-ea98ad33d603}, !- Handle + Heat Pump Air To Water Cooling Speed Data 1 EIRCurveFuncPLR, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1, !- Maximum Value of x + 0, !- Minimum Curve Output + 1, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +OS:Curve:Quadratic, + {adf2b990-0133-427b-92da-07bdd56c554d}, !- Handle + Heat Pump Air To Water Heating Speed Data 1 EIRCurveFuncPLR, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1, !- Maximum Value of x + 0, !- Minimum Curve Output + 1, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +OS:HeatPump:AirToWater, + {30ff5edf-c4aa-4533-ae70-212841cfedbf}, !- Handle + Heat Pump Air To Water, !- Name + Load, !- Operating Mode Control Method + SingleMode, !- Operating Mode Control Option for Multiple Unit + , !- Operating Mode Control Schedule Name + 0, !- Minimum Part Load Ratio + , !- Air Inlet Node Name + , !- Air Outlet Node Name + 10, !- Maximum Outdoor Dry Bulb Temperature For Defrost Operation + None, !- Heat Pump Defrost Control + 0.058333, !- Heat Pump Defrost Time Period Fraction + 0, !- Resistive Defrost Heater Capacity {W} + , !- Defrost Energy Input Ratio Function of Temperature Curve Name + 1, !- Heat Pump Multiplier + VariableSpeed, !- Control Type + 0, !- Crankcase Heater Capacity {W} + , !- Crankcase Heater Capacity Function of Temperature Curve Name + 10, !- Maximum Ambient Temperature for Crankcase Heater Operation {C} + {56fbfe34-cdb8-4040-9334-4df02e94faa5}, !- Heating Operation Mode + {a53c2519-515f-4bca-9625-c9880b09de02}; !- Cooling Operation Mode + +OS:HeatPump:AirToWater:Cooling, + {a53c2519-515f-4bca-9625-c9880b09de02}, !- Handle + Heat Pump Air To Water Cooling Mode, !- Name + {9f54092d-a4a8-41b8-a381-c4c332ecb843}, !- Availability Schedule Name + 8, !- Rated Inlet Air Temperature {C} + autosize, !- Rated Air Flow Rate {m3/s} + 40, !- Rated Leaving Water Temperature {C} + autosize, !- Rated Water Flow Rate {m3/s} + -30, !- Minimum Outdoor Air Temperature {C} + 100, !- Maximum Outdoor Air Temperature {C} + , !- Minimum Leaving Water Temperature Curve Name + , !- Maximum Leaving Water Temperature Curve Name + 1, !- Sizing Factor + , !- Chilled Water Inlet Node Name + , !- Chilled Water Outlet Node Name + {37e318cf-acad-4ff8-b7b2-85e62c769de7}, !- Speed Data List + ; !- Booster Mode On Speed + +OS:HeatPump:AirToWater:Cooling:SpeedData, + {6debb5be-d251-4ea9-b389-bc58833750f3}, !- Handle + Heat Pump Air To Water Cooling Speed 1, !- Name + autosize, !- Rated Cooling Capacity {W} + 3, !- Rated COP for Cooling {W/W} + {fcd1f27c-8baf-46d0-9fd6-047b8e41d830}, !- Normalized Cooling Capacity Function of Temperature Curve Name + {b375bf3b-bed2-4ff8-8fa6-39d157f4b1f9}, !- Cooling Energy Input Ratio Function of Temperature Curve Name + {0b0b0ac0-fd06-4d0c-8941-ea98ad33d603}; !- Cooling Energy Input Ratio Function of PLR Curve Name + +OS:HeatPump:AirToWater:FuelFired:Cooling, + {00562e55-7fba-44e4-ac51-aca9869a3f8b}, !- Handle + Heat Pump Air To Water Fuel Fired Cooling, !- Name + , !- Water Inlet Node Name + , !- Water Outlet Node Name + , !- Air Source Node Name + , !- Companion Heating Heat Pump Name + NaturalGas, !- Fuel Type + , !- End-Use Subcategory + autosize, !- Nominal Cooling Capacity {W} + 1, !- Nominal COP {W/W} + autosize, !- Design Flow Rate {m3/s} + 7, !- Design Supply Temperature {C} + 11.1, !- Design Temperature Lift {deltaC} + 1, !- Sizing Factor + NotModulated, !- Flow Mode + DryBulb, !- Outdoor Air Temperature Curve Input Variable + EnteringEvaporator, !- Water Temperature Curve Input Variable + {94746cf2-0f89-460e-acdb-62cdd5be0485}, !- Normalized Capacity Function of Temperature Curve Name + {31dc954c-f9d4-4d55-8212-90f9bb756657}, !- Fuel Energy Input Ratio Function of Temperature Curve Name + {16e619d8-bb8d-4dd1-b22a-10cc385ef65d}, !- Fuel Energy Input Ratio Function of PLR Curve Name + 0.1, !- Minimum Part Load Ratio + 1, !- Maximum Part Load Ratio + , !- Cycling Ratio Factor Curve Name + 0, !- Nominal Auxiliary Electric Power {W} + , !- Auxiliary Electric Energy Input Ratio Function of Temperature Curve Name + , !- Auxiliary Electric Energy Input Ratio Function of PLR Curve Name + 0, !- Standby Electric Power {W} + 0.25; !- Minimum Unloading Ratio + +OS:HeatPump:AirToWater:FuelFired:Heating, + {f2da640c-a686-424f-9d19-aaeb546fe276}, !- Handle + Heat Pump Air To Water Fuel Fired Heating, !- Name + , !- Water Inlet Node Name + , !- Water Outlet Node Name + , !- Air Source Node Name + , !- Companion Cooling Heat Pump Name + NaturalGas, !- Fuel Type + , !- End-Use Subcategory + autosize, !- Nominal Heating Capacity {W} + 1, !- Nominal COP {W/W} + autosize, !- Design Flow Rate {m3/s} + 60, !- Design Supply Temperature {C} + 11.1, !- Design Temperature Lift {deltaC} + 1, !- Sizing Factor + NotModulated, !- Flow Mode + DryBulb, !- Outdoor Air Temperature Curve Input Variable + EnteringCondenser, !- Water Temperature Curve Input Variable + {a7deeea1-ea5b-4639-b4b2-f4dedfb52f96}, !- Normalized Capacity Function of Temperature Curve Name + {569c9254-00cc-41e4-90cf-03016efadea6}, !- Fuel Energy Input Ratio Function of Temperature Curve Name + {4a82afc1-3c05-43ee-8f69-82979aea2179}, !- Fuel Energy Input Ratio Function of PLR Curve Name + 0.1, !- Minimum Part Load Ratio + 1, !- Maximum Part Load Ratio + Timed, !- Defrost Control Type + 0, !- Defrost Operation Time Fraction + , !- Fuel Energy Input Ratio Defrost Adjustment Curve Name + 0, !- Resistive Defrost Heater Capacity {W} + 5, !- Maximum Outdoor Dry-bulb Temperature for Defrost Operation {C} + , !- Cycling Ratio Factor Curve Name + 0, !- Nominal Auxiliary Electric Power {W} + , !- Auxiliary Electric Energy Input Ratio Function of Temperature Curve Name + , !- Auxiliary Electric Energy Input Ratio Function of PLR Curve Name + 0, !- Standby Electric Power {W} + 0.25; !- Minimum Unloading Ratio + +OS:HeatPump:AirToWater:Heating, + {56fbfe34-cdb8-4040-9334-4df02e94faa5}, !- Handle + Heat Pump Air To Water Heating Mode, !- Name + {9f54092d-a4a8-41b8-a381-c4c332ecb843}, !- Availability Schedule Name + 8, !- Rated Inlet Air Temperature {C} + autosize, !- Rated Air Flow Rate {m3/s} + 40, !- Rated Leaving Water Temperature {C} + autosize, !- Rated Water Flow Rate {m3/s} + -30, !- Minimum Outdoor Air Temperature {C} + 100, !- Maximum Outdoor Air Temperature {C} + , !- Minimum Leaving Water Temperature Curve Name + , !- Maximum Leaving Water Temperature Curve Name + 1, !- Sizing Factor + , !- Hot Water Inlet Node Name + , !- Hot Water Outlet Node Name + {59283c92-96c5-45dd-9830-6add0ef55214}, !- Speed Data List + ; !- Booster Mode On Speed + +OS:HeatPump:AirToWater:Heating:SpeedData, + {76b455ee-ffa3-4374-a69c-34197ead1871}, !- Handle + Heat Pump Air To Water Heating Speed 1, !- Name + autosize, !- Rated Heating Capacity {W} + 3, !- Rated COP for Heating {W/W} + {0028ca86-0930-4c3c-9108-0467338ddf58}, !- Normalized Heating Capacity Function of Temperature Curve Name + {8c9b0b98-da37-4476-b128-4bfa75494611}, !- Heating Energy Input Ratio Function of Temperature Curve Name + {adf2b990-0133-427b-92da-07bdd56c554d}; !- Heating Energy Input Ratio Function of PLR Curve Name + +OS:HeatPump:PlantLoop:EIR:Cooling, + {3822078c-0bcc-41ae-818f-3928dc207545}, !- Handle + Heat Pump Plant Loop EIR Cooling - Air Source, !- Name + , !- Load Side Inlet Node Name + , !- Load Side Outlet Node Name + AirSource, !- Condenser Type + , !- Source Side Inlet Node Name + , !- Source Side Outlet Node Name + , !- Heat Recovery Inlet Node Name + , !- Heat Recovery Outlet Node Name + , !- Companion Heat Pump Name + Autosize, !- Load Side Reference Flow Rate {m3/s} + Autosize, !- Source Side Reference Flow Rate {m3/s} + Autosize, !- Heat Recovery Reference Flow Rate {m3/s} + Autosize, !- Reference Capacity {W} + 7.5, !- Reference Coefficient of Performance {W/W} + 1, !- Sizing Factor + {73bde3ba-8475-4566-a91f-11deaf1a99c5}, !- Capacity Modifier Function of Temperature Curve Name + {85e04dd3-87e0-41fc-bb91-32241c07b021}, !- Electric Input to Output Ratio Modifier Function of Temperature Curve Name + {82cb1e3f-c8d1-430b-aebb-8ca634023613}, !- Electric Input to Output Ratio Modifier Function of Part Load Ratio Curve Name + Load, !- Control Type + ConstantFlow, !- Flow Mode + 0, !- Minimum Part Load Ratio + -100, !- Minimum Source Inlet Temperature {C} + 100, !- Maximum Source Inlet Temperature {C} + , !- Minimum Supply Water Temperature Curve Name + , !- Maximum Supply Water Temperature Curve Name + 60, !- Maximum Heat Recovery Outlet Temperature {C} + , !- Heat Recovery Capacity Modifier Function of Temperature Curve Name + , !- Heat Recovery Electric Input to Output Ratio Modifier Function of Temperature Curve Name + , !- Thermosiphon Capacity Fraction Curve Name + 0; !- Thermosiphon Minimum Temperature Difference + +OS:HeatPump:PlantLoop:EIR:Heating, + {f9499d5d-e916-4f8d-8e7d-df4f42f42616}, !- Handle + Heat Pump Plant Loop EIR Heating - Air Source, !- Name + , !- Load Side Inlet Node Name + , !- Load Side Outlet Node Name + AirSource, !- Condenser Type + , !- Source Side Inlet Node Name + , !- Source Side Outlet Node Name + , !- Heat Recovery Inlet Node Name + , !- Heat Recovery Outlet Node Name + , !- Companion Heat Pump Name + Autosize, !- Load Side Reference Flow Rate {m3/s} + Autosize, !- Source Side Reference Flow Rate {m3/s} + Autosize, !- Heat Recovery Reference Flow Rate {m3/s} + Autosize, !- Reference Capacity {W} + 7.5, !- Reference Coefficient of Performance {W/W} + 1, !- Sizing Factor + {880a8b14-5973-4220-9065-e36b00b2f3ae}, !- Capacity Modifier Function of Temperature Curve Name + {5343bf17-0e7c-43ab-8fee-3cf0d932718f}, !- Electric Input to Output Ratio Modifier Function of Temperature Curve Name + {be1baee3-04c0-45ab-ad78-b3a8bb2f87c7}, !- Electric Input to Output Ratio Modifier Function of Part Load Ratio Curve Name + 1, !- Heating To Cooling Capacity Sizing Ratio + CoolingCapacity, !- Heat Pump Sizing Method + Load, !- Control Type + ConstantFlow, !- Flow Mode + 0, !- Minimum Part Load Ratio + -100, !- Minimum Source Inlet Temperature {C} + 100, !- Maximum Source Inlet Temperature {C} + , !- Minimum Supply Water Temperature Curve Name + , !- Maximum Supply Water Temperature Curve Name + , !- Dry Outdoor Correction Factor Curve Name + 10, !- Maximum Outdoor Dry Bulb Temperature For Defrost Operation + None, !- Heat Pump Defrost Control + 0.058333, !- Heat Pump Defrost Time Period Fraction + , !- Defrost Energy Input Ratio Function of Temperature Curve Name + , !- Timed Empirical Defrost Frequency Curve Name + , !- Timed Empirical Defrost Heat Load Penalty Curve Name + , !- Timed Empirical Defrost Heat Input Energy Fraction Curve Name + 4.5; !- Minimum Heat Recovery Outlet Temperature {C} + +OS:ModelObjectList, + {37e318cf-acad-4ff8-b7b2-85e62c769de7}, !- Handle + Heat Pump Air To Water Cooling 1 Speed Data List, !- Name + {6debb5be-d251-4ea9-b389-bc58833750f3}; !- Model Object 1 + +OS:ModelObjectList, + {59283c92-96c5-45dd-9830-6add0ef55214}, !- Handle + Heat Pump Air To Water Heating 1 Speed Data List, !- Name + {76b455ee-ffa3-4374-a69c-34197ead1871}; !- Model Object 1 + diff --git a/src/openstudio_lib/HVACSystemsController.cpp b/src/openstudio_lib/HVACSystemsController.cpp index 61a96d05e..510edaf9b 100644 --- a/src/openstudio_lib/HVACSystemsController.cpp +++ b/src/openstudio_lib/HVACSystemsController.cpp @@ -23,10 +23,13 @@ #include "MainRightColumnController.hpp" #include "../shared_gui_components/OSViewSwitcher.hpp" #include "../utilities/CloneFixup.hpp" +#include "../utilities/HeatPumpAirToWaterPlacement.hpp" #include #include #include +#include +#include #include #include #include @@ -131,6 +134,7 @@ #include +#include #include #include #include @@ -147,6 +151,40 @@ const QString SHW = "SHW"; const QString REFRIGERATION = "REFRIGERATION"; const QString VRF = "VRF"; +namespace { +// Asks which of a HeatPumpAirToWater's operation modes to place on `plantLoop`, preselecting the one +// suggested by the loop's sizing type. Returns none if the user cancels. +boost::optional askHeatPumpAirToWaterMode(const model::PlantLoop& plantLoop, QWidget* parent) { + QMessageBox message(parent); + message.setWindowTitle(QCoreApplication::translate("openstudio::HVACLayoutController", "Air to Water Heat Pump")); + message.setText(QCoreApplication::translate("openstudio::HVACLayoutController", + "Which operation mode of this air to water heat pump should be placed on this loop?")); + message.setInformativeText(QCoreApplication::translate( + "openstudio::HVACLayoutController", "The other mode can be placed on another plant loop later by dragging it from the My Model tab.")); + QAbstractButton* heatingButton = + message.addButton(QCoreApplication::translate("openstudio::HVACLayoutController", "Heating"), QMessageBox::AcceptRole); + QAbstractButton* coolingButton = + message.addButton(QCoreApplication::translate("openstudio::HVACLayoutController", "Cooling"), QMessageBox::AcceptRole); + message.addButton(QMessageBox::Cancel); + + const auto suggested = suggestedHeatPumpAirToWaterMode(plantLoop); + if (suggested && suggested.get() == HeatPumpAirToWaterMode::Cooling) { + message.setDefaultButton(qobject_cast(coolingButton)); + } else { + message.setDefaultButton(qobject_cast(heatingButton)); + } + + message.exec(); + if (message.clickedButton() == heatingButton) { + return HeatPumpAirToWaterMode::Heating; + } + if (message.clickedButton() == coolingButton) { + return HeatPumpAirToWaterMode::Cooling; + } + return boost::none; +} +} // namespace + HVACSystemsController::HVACSystemsController(bool isIP, const model::Model& model) : m_hvacSystemsView(new HVACSystemsView()), m_updateMutex(new QMutex()), m_model(model), m_isIP(isIP) { @@ -554,7 +592,19 @@ void HVACLayoutController::addLibraryObjectToModelNode(const OSItemId& itemId, m bool added = false; - if (boost::optional hvacComponent = object->optionalCast()) { + if (boost::optional heatPump = object->optionalCast()) { + // The wrapper can't be placed on a loop itself: one of its heating/cooling operation modes goes there instead + if (boost::optional plant = comp.plantLoop()) { + boost::optional mode = askHeatPumpAirToWaterMode(plant.get(), m_hvacSystemsController->hvacSystemsView()); + if (!mode) { + if (remove) { + object->remove(); + } + return; + } + added = addHeatPumpAirToWaterModeToLoop(heatPump.get(), mode.get(), comp); + } + } else if (boost::optional hvacComponent = object->optionalCast()) { if (boost::optional node = comp.optionalCast()) { // Note: Julien Marrec, 2018-01-04 // When you have a WaterToWaterComponent that has a tertiaryPlantLoop, you should override the addToNode method diff --git a/src/openstudio_lib/MainRightColumnController.cpp b/src/openstudio_lib/MainRightColumnController.cpp index 9c7ebc286..8b06d4557 100644 --- a/src/openstudio_lib/MainRightColumnController.cpp +++ b/src/openstudio_lib/MainRightColumnController.cpp @@ -1047,15 +1047,22 @@ void MainRightColumnController::configureForHVACSystemsSubTab(int subTabID) { myModelList->addModelObjectCategoryPlaceholder(tr("Zone HVAC")); // Central components and coils - myModelList->addModelObjectType(IddObjectType::OS_HeatPump_WaterToWater_EquationFit_Heating, tr("Heat Pump - Water to Water - Heating")); - myModelList->addModelObjectType(IddObjectType::OS_HeatPump_WaterToWater_EquationFit_Cooling, tr("Heat Pump - Water to Water - Cooling")); myModelList->addModelObjectType(IddObjectType::OS_HeatExchanger_FluidToFluid, tr("Heat Exchanger Fluid To Fluid")); myModelList->addModelObjectCategoryPlaceholder(tr("Heat Exchangers")); myModelList->addModelObjectType(IddObjectType::OS_Coil_Heating_Water, tr("Coil Heating Water")); myModelList->addModelObjectType(IddObjectType::OS_Coil_Cooling_Water, tr("Coil Cooling Water")); myModelList->addModelObjectCategoryPlaceholder(tr("Coils")); + myModelList->addModelObjectType(IddObjectType::OS_HeatPump_WaterToWater_EquationFit_Heating, tr("Heat Pump - Water to Water - Heating")); + myModelList->addModelObjectType(IddObjectType::OS_HeatPump_WaterToWater_EquationFit_Cooling, tr("Heat Pump - Water to Water - Cooling")); + myModelList->addModelObjectType(IddObjectType::OS_HeatPump_PlantLoop_EIR_Heating, tr("Heat Pump - Plant Loop EIR - Heating")); + myModelList->addModelObjectType(IddObjectType::OS_HeatPump_PlantLoop_EIR_Cooling, tr("Heat Pump - Plant Loop EIR - Cooling")); + myModelList->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_FuelFired_Heating, tr("Heat Pump - Air to Water Fuel Fired - Heating")); + myModelList->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_FuelFired_Cooling, tr("Heat Pump - Air to Water Fuel Fired - Cooling")); + myModelList->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater, tr("Heat Pump - Air to Water")); + myModelList->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_Heating, tr("Heat Pump - Air to Water - Heating Mode")); + myModelList->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_Cooling, tr("Heat Pump - Air to Water - Cooling Mode")); myModelList->addModelObjectType(IddObjectType::OS_CentralHeatPumpSystem, tr("Central Heat Pump System")); - myModelList->addModelObjectCategoryPlaceholder(tr("Heat Pumps")); + myModelList->addModelObjectCategoryPlaceholder(tr("Plant Loop Heat Pumps")); myModelList->addModelObjectType(IddObjectType::OS_Chiller_Electric_EIR, tr("Chiller - Electric EIR")); myModelList->addModelObjectType(IddObjectType::OS_Chiller_Absorption, tr("Chiller - Absorption")); myModelList->addModelObjectType(IddObjectType::OS_Chiller_Absorption_Indirect, tr("Chiller - Indirect Absorption")); @@ -1169,7 +1176,12 @@ void MainRightColumnController::configureForHVACSystemsSubTab(int subTabID) { libraryWidget->addModelObjectCategoryPlaceholder(tr("Humidifiers")); libraryWidget->addModelObjectType(IddObjectType::OS_HeatPump_WaterToWater_EquationFit_Heating, tr("Heat Pump - Water to Water - Heating")); libraryWidget->addModelObjectType(IddObjectType::OS_HeatPump_WaterToWater_EquationFit_Cooling, tr("Heat Pump - Water to Water - Cooling")); - libraryWidget->addModelObjectCategoryPlaceholder(tr("Heat Pumps")); + libraryWidget->addModelObjectType(IddObjectType::OS_HeatPump_PlantLoop_EIR_Heating, tr("Heat Pump - Plant Loop EIR - Heating")); + libraryWidget->addModelObjectType(IddObjectType::OS_HeatPump_PlantLoop_EIR_Cooling, tr("Heat Pump - Plant Loop EIR - Cooling")); + libraryWidget->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_FuelFired_Heating, tr("Heat Pump - Air to Water Fuel Fired - Heating")); + libraryWidget->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_FuelFired_Cooling, tr("Heat Pump - Air to Water Fuel Fired - Cooling")); + libraryWidget->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater, tr("Heat Pump - Air to Water")); + libraryWidget->addModelObjectCategoryPlaceholder(tr("Plant Loop Heat Pumps")); libraryWidget->addModelObjectType(IddObjectType::OS_HeatExchanger_FluidToFluid, tr("Heat Exchanger Fluid To Fluid")); libraryWidget->addModelObjectType(IddObjectType::OS_HeatExchanger_AirToAir_SensibleAndLatent, tr("Heat Exchanger Air To Air Sensible and Latent")); libraryWidget->addModelObjectCategoryPlaceholder(tr("Heat Exchangers")); diff --git a/src/openstudio_lib/images/heatpump_airtowater.png b/src/openstudio_lib/images/heatpump_airtowater.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d4897f71c7379fc859782ed00b6151140bc02c GIT binary patch literal 3656 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%0D%qKMyBdUQ~X-R3pE^b@ZxSi&C9gqEqxaVrNZ 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 literal 0 HcmV?d00001 diff --git a/src/openstudio_lib/images/heatpump_plantloop_eir_heating.png b/src/openstudio_lib/images/heatpump_plantloop_eir_heating.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2679898bdcebd81cefe982a1f26c71d8d0a8f7 GIT binary patch literal 3607 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 dNkl~W literal 0 HcmV?d00001 diff --git a/src/openstudio_lib/images/heatpump_plantloop_eir_heating@2x.png b/src/openstudio_lib/images/heatpump_plantloop_eir_heating@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0d6cd95ad14fa2d303203e810dad69a7d0d711 GIT binary patch literal 7081 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 MP}NnbReBxvU$q?rTL1t6 literal 0 HcmV?d00001 diff --git a/src/openstudio_lib/images/heatpump_watertowater_equationfit_cooling.png b/src/openstudio_lib/images/heatpump_watertowater_equationfit_cooling.png index 0502048974733ce1d08862419ba2dfc82357b5c0..d1885e9ff489c875c355206231c444dfd4701d1b 100644 GIT binary patch literal 3811 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 literal 15210 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 OzEG4^lc|>a6#PF`;OIyI diff --git a/src/openstudio_lib/images/heatpump_watertowater_equationfit_heating.png b/src/openstudio_lib/images/heatpump_watertowater_equationfit_heating.png index 0502048974733ce1d08862419ba2dfc82357b5c0..26920a9914170aa5ec0fcbb7959cae76c38e05d2 100644 GIT binary patch literal 3659 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 OzEG4^lc|>a6#PF`;OIyI diff --git a/src/openstudio_lib/images/mini_icons/heatpump_airtowater.png b/src/openstudio_lib/images/mini_icons/heatpump_airtowater.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb24a07f1ff818a2197fe26183216b26fd33d4e GIT binary patch literal 759 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 literal 0 HcmV?d00001 diff --git a/src/openstudio_lib/images/mini_icons/heatpump_airtowater_fuelfired_cooling@2x.png b/src/openstudio_lib/images/mini_icons/heatpump_airtowater_fuelfired_cooling@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..da0c702e3aabf217fe5abd3de9e0934a58bc813a GIT binary patch literal 1661 zcmV-@27>vCP)?!g2 zd?(28m*qaQ*(~bydJfY_WP>;`Fc6+o6vfk8t@f>h2M>-Y?~5>M=gysFWau@zEH@gB z*s^5{s;a7<+{|%I(X`6Fy}jt@=)mysFzd4NJilBCf>#1)Zf-tBtiG|a5j%G5Kv7YV zayUZybjiiV#aOdu4IB;!tX69tg_EVLtLy6t04U~PC&V9_OeSpGwhd~U3FDPyu~^X4 z(*vi|S+i=@s{YHDFSGo3QiaI)cNyQjc{4N`O<0NCW?H7uK}$=E-2aYjw?=`ORU46c zfIUF2N{gT0x(-)A`7mugN?uV>A)8wr0idm|t$;jWpm^gLQg$;V<-@Y9=F!Hjzy1K@ zG9LE7F2MiDmGtwm#;FRSu&|ItOYz>ldvn780)c=|5-4=kN@RD&nk3qI|EYE?eL)Ay zhHMO;J(=|L@x~d5kj+_P05Zw(mX4c;F8qY@Y7sfPJQl6UhVA@U7`uII%ECyU+!MAE z=_cO5nG-NodLjA(^fnUk{3adxkAFO6iLIu%0A$38$`AkT1Kc*`m1qfo0D(Z{{$0&R>erHgjWVE0HA)s!pi0cR5 zOG$r19#F?xJY{Oxaq}weojhc$7&e~efl}7e*72EoDzhgJC9Pj6$Mrxg_f00d@BEFz zV(Ryh>=8NkA`GHgt%z3L1I-a(}lCjh;=%IUd zJ@~SvLD?%xAlP_il^;Vto=$0=gaD+{e6-!o;x&@70vV}Y{2aJ!1NcR?k}P;-&j`pf zh_GKem(n~>1wg>(MV4U>v?6)H%Z%lqt69O6L1V~=retBrGom!Er!5OlsJtWgsRfW~ z_;6Ys+zuDKj|6F@wPj{-S#wAsq?T3J7|MYso`5ip@kh?2=bJQ%87Z?qQLfJ~gl8-u zt+2+pAZ$Eqe3=P+sX3Gj!7viW=~~05G+$f*sTj}5P+1f5fB;QyKICsz0eJ6fc3| zjhnWlSLXhbzh^1!HzLtfMRr1d9Nh1ALtkxO5E37*AuxO1rw{y|&B>Wdyf z{5^vh_XO}?P6dpcUQKDfgsPDG=49lByY|6V-GJWqj-V&#mcT<79LLUJ%;v;Rt`wCA z4yCMLO%uM2N_9Q-g)CJ*zjZ&X#}DI=PrpIYxCa4xPq+*P2rO+tW$QkwKKhjBnG}E$ zL^|B`#x6K&>oD4N5m`$tD6-Tdn|Qi<6ZXJV@cfmlkyqaw@y#<`y>S6Vi@i+bF#*Uo z*&mDe{Vp@PoWo535fy;VDdLN65t&3w3ON*IPwbDH17c>`E>SSFC-%qvDv@av z^G!_O8QmcsbJsW1B)^fFjf~uGw}){Fz|o^eT{JjIhX-P&f?&qexfwg)VAli8X4bC^ zp)1t52M-<~6G^I$cDpQIkuQ`<+)k~fySp3B>o($p)yOES$Q5z%mp`Rz0&__2k9f81 z-o5)vVz1TI)UX3TWD<3Dc1kCfM4z{}w{MsGBg!bne;b|9Y@oxmc{ZC34Gj%oM@}*zyE#Zc&vl&W3=yhMeZvtEe#+1O&76ZqRPiJw774^J?K_aCj4qZ zv3`x_zbPd1tHEreS^u}n{{R30|NpjV*hl~X00v1!K~w_(emE{UL->i!00000NkvXX Hu0mjfvBWH~ literal 0 HcmV?d00001 diff --git a/src/openstudio_lib/images/mini_icons/heatpump_airtowater_fuelfired_heating.png b/src/openstudio_lib/images/mini_icons/heatpump_airtowater_fuelfired_heating.png new file mode 100644 index 0000000000000000000000000000000000000000..b49d3f54be14b4e0498870eab24af8c7bff37e41 GIT binary patch literal 848 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 literal 0 HcmV?d00001 diff --git a/src/openstudio_lib/images/mini_icons/heatpump_plantloop_eir_heating.png b/src/openstudio_lib/images/mini_icons/heatpump_plantloop_eir_heating.png new file mode 100644 index 0000000000000000000000000000000000000000..00c792877d98ed0d12eea02515071ab88b09909c GIT binary patch literal 702 zcmV;v0zv(WP)*=O&)-g~XR4hJ%%QYoF)YBhrjIGxU6E|*(N z_cZJyolZZn*=(na#o}l-o7q4GOeWKXUavpv_xt&Bx%@#?kjZ4CE|=?7JRY|MgF)ap z4mO(&Xf&E@&CBHyTCEl|8jV4x(>bYBDjzviV7J=~u~^I!3Wca8tJMnBK&#b4I2=a) zo73quPqv!2M5**BBL^K+ubF_ zw-qqr;cy7`dL2j}?^uFD$i-3j(Fi4vNgY8X5&=>RyB^>jAVINMgl@MBgTX+Isli|X zkH-VmYL%`_r4o=lr#vj?X0sW*Ua!cb7$OF@+YL%!jHuA>_bZ-Dg)1tMXMuFhn5D-2 ziJs9adVt?jCbniwETyla-|;|R2U4MIEe(Ux`9Ie|GMN;O*%xA($~|ECTcz$@$#8iA z+{^Moo(bXUvt0#iVFtQyU*Hhf%!S_yu+5P!hT{et2;}((qtSRtif=-LmCxtj9^bw5 z=;+fsI0Vj)2%4y5v!OUMLjaZz*8FHrMO*cu)a{!!eQnw)_GB0RR7L k8UeBZ000I_L_t&o067WyMs87An*aa+07*qoM6N<$g6Bd*Q2+n{ literal 0 HcmV?d00001 diff --git a/src/openstudio_lib/images/mini_icons/heatpump_plantloop_eir_heating@2x.png b/src/openstudio_lib/images/mini_icons/heatpump_plantloop_eir_heating@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3dac1bb1fed6774f339ef4445264dc34e39cae9f GIT binary patch literal 1385 zcmV-v1(y1WP)>cK7WMin=x2Q|GID>eRV)ubCnoW{PlF z^cp%lJ7013(qu9{H_WQ6wj_ffSO6&3YdB@v|(sIIR5g|iQ0>&40>_zsbqTp|-X*(jpwnt0*Zcp~b~TIy*Znt*os4 zcY1mn>*JjlV&%U?-q_ekX0zEPM5b_;*>tF(p+VMvA@#N>jGr+HCqDs`yh+-mQS#i} zT&eE+@M;Gl41FnP^0g8`ZKl4`n-hAxcR}0im?s-rhtPfxElAXi;F( z(F&1|Q*V$^w}Zr6onu9r6nL^hqvhJg?Y0v;oq_r3P?xpvNT0{WMne(E930T($JJAcCGU2x_GR76=qKa ziG5?%?oIvpL7<OFfQFK#PbaQeFw%g#oGZY;zv*OzZ| z-PIm$$be8D1n|rM6>>pfaB$GZjT`)m=QJt_D32F@yoU1iI&?<8x(~eOWWte#5di{+ zhljHGT3)DYpr2F2{QNwl74u8-Sr+$oWK0y0Q zZP)wI{T)YsAIrLoj11RtV5k6RqFIl>^W=W!^+UG`Bm8Q>w*H34|Hl!?uLhBZi2qyV re*gdg|Nl7|f}sEa00v1!K~w_(0ICP&{j4+S00000NkvXXu0mjf)>)Z# literal 0 HcmV?d00001 diff --git a/src/openstudio_lib/images/mini_icons/heatpump_watertowater_equationfit_cooling.png b/src/openstudio_lib/images/mini_icons/heatpump_watertowater_equationfit_cooling.png index 2623969dffa44b59e197e1706f146cbe34e80351..07de9520946a5cc742138bebc282f733a9d3a12f 100644 GIT binary patch delta 869 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 delta 797 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 iPx47V$tU^$EdKz$g>1G;MWuWI0000images/heatpump_watertowater_equationfit_cooling@2x.png images/heatpump_watertowater_equationfit_heating.png images/heatpump_watertowater_equationfit_heating@2x.png + images/heatpump_plantloop_eir_heating.png + images/heatpump_plantloop_eir_heating@2x.png + images/heatpump_plantloop_eir_cooling.png + images/heatpump_plantloop_eir_cooling@2x.png + images/heatpump_airtowater_fuelfired_heating.png + images/heatpump_airtowater_fuelfired_heating@2x.png + images/heatpump_airtowater_fuelfired_cooling.png + images/heatpump_airtowater_fuelfired_cooling@2x.png + images/heatpump_airtowater.png + images/heatpump_airtowater@2x.png library/OpenStudioPolicy.xml @@ -1141,6 +1151,16 @@ images/mini_icons/heatpump_watertowater_equationfit_cooling@2x.png images/mini_icons/heatpump_watertowater_equationfit_heating.png images/mini_icons/heatpump_watertowater_equationfit_heating@2x.png + images/mini_icons/heatpump_plantloop_eir_heating.png + images/mini_icons/heatpump_plantloop_eir_heating@2x.png + images/mini_icons/heatpump_plantloop_eir_cooling.png + images/mini_icons/heatpump_plantloop_eir_cooling@2x.png + images/mini_icons/heatpump_airtowater_fuelfired_heating.png + images/mini_icons/heatpump_airtowater_fuelfired_heating@2x.png + images/mini_icons/heatpump_airtowater_fuelfired_cooling.png + images/mini_icons/heatpump_airtowater_fuelfired_cooling@2x.png + images/mini_icons/heatpump_airtowater.png + images/mini_icons/heatpump_airtowater@2x.png library/tid_api.xml library/embeddable_geometry_editor.html diff --git a/src/openstudio_lib/test/IconLibrary_GTest.cpp b/src/openstudio_lib/test/IconLibrary_GTest.cpp index 46f46f3cb..ad65304f4 100644 --- a/src/openstudio_lib/test/IconLibrary_GTest.cpp +++ b/src/openstudio_lib/test/IconLibrary_GTest.cpp @@ -213,3 +213,52 @@ TEST_F(OpenStudioLibFixture, IconLibrary_MiniIcon) { EXPECT_TRUE(pixmap) << "Could not find mini-icon for IddObjectType = '" << iddObjectType.valueName() << "'"; } } + +TEST_F(OpenStudioLibFixture, IconLibrary_PlantLoopHeatPumps) { + // findIcon/findMiniIcon fall back to the Catchall "missing icon" rather than returning null, so + // check the plant loop heat pump types are actually mapped and their images load + const std::vector iddObjectTypes{ + IddObjectType::OS_HeatPump_PlantLoop_EIR_Heating, + IddObjectType::OS_HeatPump_PlantLoop_EIR_Cooling, + IddObjectType::OS_HeatPump_AirToWater_FuelFired_Heating, + IddObjectType::OS_HeatPump_AirToWater_FuelFired_Cooling, + IddObjectType::OS_HeatPump_AirToWater, + IddObjectType::OS_HeatPump_AirToWater_Heating, + IddObjectType::OS_HeatPump_AirToWater_Cooling, + }; + const QPixmap* missingIcon = IconLibrary::Instance().findIcon(IddObjectType(IddObjectType::Catchall).value()); + const QPixmap* missingMiniIcon = IconLibrary::Instance().findMiniIcon(IddObjectType(IddObjectType::Catchall).value()); + + for (const IddObjectType& iddObjectType : iddObjectTypes) { + const QPixmap* icon = IconLibrary::Instance().findIcon(iddObjectType.value()); + EXPECT_NE(missingIcon, icon) << "No icon mapped for IddObjectType = '" << iddObjectType.valueName() << "'"; + EXPECT_FALSE(icon->isNull()) << "Icon failed to load for IddObjectType = '" << iddObjectType.valueName() << "'"; + + const QPixmap* miniIcon = IconLibrary::Instance().findMiniIcon(iddObjectType.value()); + EXPECT_NE(missingMiniIcon, miniIcon) << "No mini-icon mapped for IddObjectType = '" << iddObjectType.valueName() << "'"; + EXPECT_FALSE(miniIcon->isNull()) << "Mini-icon failed to load for IddObjectType = '" << iddObjectType.valueName() << "'"; + } +} + +TEST_F(OpenStudioLibFixture, IconLibrary_PlantLoopHeatPumpsDistinct) { + auto icon = [](IddObjectType t) { return IconLibrary::Instance().findIcon(t.value())->toImage(); }; + auto miniIcon = [](IddObjectType t) { return IconLibrary::Instance().findMiniIcon(t.value())->toImage(); }; + + // HeatPumpAirToWater and its operation modes are one physical unit, so they share one icon + for (const IddObjectType& mode : + {IddObjectType(IddObjectType::OS_HeatPump_AirToWater_Heating), IddObjectType(IddObjectType::OS_HeatPump_AirToWater_Cooling)}) { + EXPECT_EQ(icon(IddObjectType::OS_HeatPump_AirToWater), icon(mode)) << mode.valueName(); + EXPECT_EQ(miniIcon(IddObjectType::OS_HeatPump_AirToWater), miniIcon(mode)) << mode.valueName(); + } + + // Each heating / cooling pair must be told apart + const std::vector> pairs{ + {IddObjectType::OS_HeatPump_WaterToWater_EquationFit_Heating, IddObjectType::OS_HeatPump_WaterToWater_EquationFit_Cooling}, + {IddObjectType::OS_HeatPump_PlantLoop_EIR_Heating, IddObjectType::OS_HeatPump_PlantLoop_EIR_Cooling}, + {IddObjectType::OS_HeatPump_AirToWater_FuelFired_Heating, IddObjectType::OS_HeatPump_AirToWater_FuelFired_Cooling}, + }; + for (const auto& [heating, cooling] : pairs) { + EXPECT_NE(icon(heating), icon(cooling)) << heating.valueName(); + EXPECT_NE(miniIcon(heating), miniIcon(cooling)) << heating.valueName(); + } +} diff --git a/src/shared_gui_components/IconLibrary.cpp b/src/shared_gui_components/IconLibrary.cpp index 59664f894..9cc26a086 100644 --- a/src/shared_gui_components/IconLibrary.cpp +++ b/src/shared_gui_components/IconLibrary.cpp @@ -170,6 +170,19 @@ IconLibrary::IconLibrary() { new QPixmap(":/images/heatpump_watertowater_equationfit_cooling.png"); m_icons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_WaterToWater_EquationFit_Heating).value()] = new QPixmap(":/images/heatpump_watertowater_equationfit_heating.png"); + m_icons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_PlantLoop_EIR_Cooling).value()] = + new QPixmap(":/images/heatpump_plantloop_eir_cooling.png"); + m_icons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_PlantLoop_EIR_Heating).value()] = + new QPixmap(":/images/heatpump_plantloop_eir_heating.png"); + m_icons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_AirToWater_FuelFired_Cooling).value()] = + new QPixmap(":/images/heatpump_airtowater_fuelfired_cooling.png"); + m_icons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_AirToWater_FuelFired_Heating).value()] = + new QPixmap(":/images/heatpump_airtowater_fuelfired_heating.png"); + m_icons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_AirToWater).value()] = new QPixmap(":/images/heatpump_airtowater.png"); + m_icons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_AirToWater_Cooling).value()] = + new QPixmap(":/images/heatpump_airtowater.png"); + m_icons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_AirToWater_Heating).value()] = + new QPixmap(":/images/heatpump_airtowater.png"); m_icons[openstudio::IddObjectType(openstudio::IddObjectType::OS_Humidifier_Steam_Electric).value()] = new QPixmap(":/images/electric_humidifier.png"); m_icons[openstudio::IddObjectType(openstudio::IddObjectType::OS_Humidifier_Steam_Gas).value()] = new QPixmap(":/images/gas_humidifier.png"); @@ -624,6 +637,20 @@ IconLibrary::IconLibrary() { new QPixmap(":/images/mini_icons/heatpump_watertowater_equationfit_cooling.png"); m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_WaterToWater_EquationFit_Heating).value()] = new QPixmap(":/images/mini_icons/heatpump_watertowater_equationfit_heating.png"); + m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_PlantLoop_EIR_Cooling).value()] = + new QPixmap(":/images/mini_icons/heatpump_plantloop_eir_cooling.png"); + m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_PlantLoop_EIR_Heating).value()] = + new QPixmap(":/images/mini_icons/heatpump_plantloop_eir_heating.png"); + m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_AirToWater_FuelFired_Cooling).value()] = + new QPixmap(":/images/mini_icons/heatpump_airtowater_fuelfired_cooling.png"); + m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_AirToWater_FuelFired_Heating).value()] = + new QPixmap(":/images/mini_icons/heatpump_airtowater_fuelfired_heating.png"); + m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_AirToWater).value()] = + new QPixmap(":/images/mini_icons/heatpump_airtowater.png"); + m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_AirToWater_Cooling).value()] = + new QPixmap(":/images/mini_icons/heatpump_airtowater.png"); + m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_HeatPump_AirToWater_Heating).value()] = + new QPixmap(":/images/mini_icons/heatpump_airtowater.png"); m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_LoadProfile_Plant).value()] = new QPixmap(":/images/mini_icons/mini_plant_profile.png"); m_miniIcons[openstudio::IddObjectType(openstudio::IddObjectType::OS_Pipe_Adiabatic).value()] = new QPixmap(":/images/mini_icons/pipe.png"); diff --git a/src/utilities/CMakeLists.txt b/src/utilities/CMakeLists.txt index d0b45c13f..dbd68afb8 100644 --- a/src/utilities/CMakeLists.txt +++ b/src/utilities/CMakeLists.txt @@ -12,6 +12,8 @@ set(${target_name}_src RemoteBCLNLR.cpp CloneFixup.hpp CloneFixup.cpp + HeatPumpAirToWaterPlacement.hpp + HeatPumpAirToWaterPlacement.cpp ) # set up groups of source files for Visual Studio @@ -20,6 +22,7 @@ source_group(${target_name} FILES ${target_name}_src) set(${target_name}_test_src test/OpenStudioApplicationPathHelpers_GTest.cpp test/CloneFixup_GTest.cpp + test/HeatPumpAirToWaterPlacement_GTest.cpp ) set(${target_name}_depends diff --git a/src/utilities/HeatPumpAirToWaterPlacement.cpp b/src/utilities/HeatPumpAirToWaterPlacement.cpp new file mode 100644 index 000000000..5a227cc13 --- /dev/null +++ b/src/utilities/HeatPumpAirToWaterPlacement.cpp @@ -0,0 +1,62 @@ +/*********************************************************************************************************************** +* OpenStudio(R), Copyright (c) OpenStudio Coalition and other contributors. +* See also https://openstudiocoalition.org/about/software_license/ +***********************************************************************************************************************/ + +#include "HeatPumpAirToWaterPlacement.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace openstudio { + +boost::optional suggestedHeatPumpAirToWaterMode(const model::PlantLoop& plantLoop) { + const std::string loopType = plantLoop.sizingPlant().loopType(); + if (istringEqual(loopType, "Heating")) { + return HeatPumpAirToWaterMode::Heating; + } + if (istringEqual(loopType, "Cooling")) { + return HeatPumpAirToWaterMode::Cooling; + } + return boost::none; +} + +bool addHeatPumpAirToWaterModeToLoop(const model::HeatPumpAirToWater& heatPump, HeatPumpAirToWaterMode mode, const model::HVACComponent& target) { + boost::optional modeComponent; + if (mode == HeatPumpAirToWaterMode::Heating) { + if (auto heating = heatPump.heatingOperationMode()) { + modeComponent = heating.get(); + } + } else if (auto cooling = heatPump.coolingOperationMode()) { + modeComponent = cooling.get(); + } + if (!modeComponent) { + return false; + } + + if (auto node = target.optionalCast()) { + return modeComponent->addToNode(node.get()); + } + + if (auto splitter = target.optionalCast()) { + if (auto plant = splitter->plantLoop()) { + if (plant->supplyComponent(splitter->handle())) { + return plant->addSupplyBranchForComponent(modeComponent.get()); + } + } + } + + return false; +} + +} // namespace openstudio diff --git a/src/utilities/HeatPumpAirToWaterPlacement.hpp b/src/utilities/HeatPumpAirToWaterPlacement.hpp new file mode 100644 index 000000000..85609d873 --- /dev/null +++ b/src/utilities/HeatPumpAirToWaterPlacement.hpp @@ -0,0 +1,39 @@ +/*********************************************************************************************************************** +* OpenStudio(R), Copyright (c) OpenStudio Coalition and other contributors. +* See also https://openstudiocoalition.org/about/software_license/ +***********************************************************************************************************************/ + +#ifndef OSAPP_UTILITIES_HEATPUMPAIRTOWATERPLACEMENT_HPP +#define OSAPP_UTILITIES_HEATPUMPAIRTOWATERPLACEMENT_HPP + +#include +#include +#include + +#include + +namespace openstudio { + +/// HeatPumpAirToWater is a wrapper that cannot itself be placed on a loop (its addToNode() always +/// returns false): its heating and cooling operation modes are the StraightComponents that sit on +/// the hot water and chilled water loops, and the wrapper is only forward translated through them. +/// Dropping a wrapper onto a loop therefore means placing one of its modes there instead. +enum class HeatPumpAirToWaterMode +{ + Heating, + Cooling +}; + +/// The mode suggested by the loop's Sizing:Plant loop type ("Heating" or "Cooling"), or none for +/// any other loop type. Only a suggestion: a new PlantLoop defaults to "Heating" until its sizing +/// is edited, so an untouched chilled water loop also reports "Heating". +boost::optional suggestedHeatPumpAirToWaterMode(const model::PlantLoop& plantLoop); + +/// Places the wrapper's `mode` operation mode on `target`, which is either a plant loop supply-side +/// Node or a plant loop supply-side Splitter (adding a new supply branch). Returns false, leaving the +/// model unchanged, if the wrapper has no such mode or the mode cannot be added at `target`. +bool addHeatPumpAirToWaterModeToLoop(const model::HeatPumpAirToWater& heatPump, HeatPumpAirToWaterMode mode, const model::HVACComponent& target); + +} // namespace openstudio + +#endif // OSAPP_UTILITIES_HEATPUMPAIRTOWATERPLACEMENT_HPP diff --git a/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp b/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp new file mode 100644 index 000000000..a0d5d1676 --- /dev/null +++ b/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp @@ -0,0 +1,131 @@ +/*********************************************************************************************************************** +* OpenStudio(R), Copyright (c) OpenStudio Coalition and other contributors. +* See also https://openstudiocoalition.org/about/software_license/ +***********************************************************************************************************************/ + +#include + +#include "../HeatPumpAirToWaterPlacement.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace openstudio; +using namespace openstudio::model; + +namespace { +HeatPumpAirToWater makeHeatPumpWithBothModes(const Model& model) { + HeatPumpAirToWater heatPump(model); + HeatPumpAirToWaterHeating heating(model); + HeatPumpAirToWaterCooling cooling(model); + EXPECT_TRUE(heatPump.setHeatingOperationMode(heating)); + EXPECT_TRUE(heatPump.setCoolingOperationMode(cooling)); + return heatPump; +} +} // namespace + +TEST(HeatPumpAirToWaterPlacement, SuggestedModeFollowsSizingPlantLoopType) { + Model model; + PlantLoop plantLoop(model); + + // A new PlantLoop's Sizing:Plant defaults to "Heating" + auto suggested = suggestedHeatPumpAirToWaterMode(plantLoop); + ASSERT_TRUE(suggested); + EXPECT_EQ(HeatPumpAirToWaterMode::Heating, suggested.get()); + + ASSERT_TRUE(plantLoop.sizingPlant().setLoopType("Cooling")); + suggested = suggestedHeatPumpAirToWaterMode(plantLoop); + ASSERT_TRUE(suggested); + EXPECT_EQ(HeatPumpAirToWaterMode::Cooling, suggested.get()); + + ASSERT_TRUE(plantLoop.sizingPlant().setLoopType("Condenser")); + EXPECT_FALSE(suggestedHeatPumpAirToWaterMode(plantLoop)); +} + +TEST(HeatPumpAirToWaterPlacement, PlacesBothModesOfOneWrapperOnSeparateLoops) { + Model model; + PlantLoop hotWaterLoop(model); + PlantLoop chilledWaterLoop(model); + ASSERT_TRUE(chilledWaterLoop.sizingPlant().setLoopType("Cooling")); + + // Mirrors a library drop: the library wrapper is cloned, which clones both of its modes + HeatPumpAirToWater libraryHeatPump = makeHeatPumpWithBothModes(model); + auto heatPump = libraryHeatPump.clone(model).cast(); + ASSERT_TRUE(heatPump.heatingOperationMode()); + ASSERT_TRUE(heatPump.coolingOperationMode()); + EXPECT_NE(libraryHeatPump.heatingOperationMode()->handle(), heatPump.heatingOperationMode()->handle()); + + Node hotWaterNode = hotWaterLoop.supplyOutletNode(); + EXPECT_TRUE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Heating, hotWaterNode)); + ASSERT_TRUE(heatPump.heatingLoop()); + EXPECT_EQ(hotWaterLoop.handle(), heatPump.heatingLoop()->handle()); + EXPECT_FALSE(heatPump.coolingLoop()); + + Splitter chilledWaterSplitter = chilledWaterLoop.supplySplitter(); + EXPECT_TRUE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Cooling, chilledWaterSplitter)); + ASSERT_TRUE(heatPump.coolingLoop()); + EXPECT_EQ(chilledWaterLoop.handle(), heatPump.coolingLoop()->handle()); + + // Both modes still belong to the same wrapper + EXPECT_EQ(heatPump.handle(), heatPump.heatingOperationMode()->heatPumpAirToWater()->handle()); + EXPECT_EQ(heatPump.handle(), heatPump.coolingOperationMode()->heatPumpAirToWater()->handle()); + + // The library wrapper's own modes were not placed + EXPECT_FALSE(libraryHeatPump.heatingLoop()); + EXPECT_FALSE(libraryHeatPump.coolingLoop()); +} + +TEST(HeatPumpAirToWaterPlacement, MissingModeIsRejected) { + Model model; + PlantLoop plantLoop(model); + HeatPumpAirToWater heatPump(model); + HeatPumpAirToWaterHeating heating(model); + ASSERT_TRUE(heatPump.setHeatingOperationMode(heating)); + + Node node = plantLoop.supplyOutletNode(); + const auto supplyComponentCount = plantLoop.supplyComponents().size(); + EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Cooling, node)); + EXPECT_EQ(supplyComponentCount, plantLoop.supplyComponents().size()); + EXPECT_FALSE(heatPump.coolingLoop()); +} + +TEST(HeatPumpAirToWaterPlacement, DemandSideIsRejected) { + Model model; + PlantLoop plantLoop(model); + HeatPumpAirToWater heatPump = makeHeatPumpWithBothModes(model); + + Node demandNode = plantLoop.demandInletNode(); + EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Heating, demandNode)); + + Splitter demandSplitter = plantLoop.demandSplitter(); + EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Heating, demandSplitter)); + + EXPECT_FALSE(heatPump.heatingLoop()); +} + +TEST(HeatPumpAirToWaterPlacement, NonNodeNonSplitterTargetIsRejected) { + Model model; + PlantLoop plantLoop(model); + BoilerHotWater boiler(model); + Node node = plantLoop.supplyOutletNode(); + ASSERT_TRUE(boiler.addToNode(node)); + HeatPumpAirToWater heatPump = makeHeatPumpWithBothModes(model); + + EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Heating, boiler)); + EXPECT_FALSE(heatPump.heatingLoop()); +} diff --git a/translations/OpenStudioApp_ar.ts b/translations/OpenStudioApp_ar.ts index 264da2100..8923e166e 100644 --- a/translations/OpenStudioApp_ar.ts +++ b/translations/OpenStudioApp_ar.ts @@ -23336,6 +23336,34 @@ Story لا شيء + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + مضخة حرارية هواء إلى ماء + + + + Which operation mode of this air to water heat pump should be placed on this loop? + أي وضع تشغيل لهذه المضخة الحرارية هواء إلى ماء يجب وضعه على هذه الدائرة؟ + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + يمكن وضع الوضع الآخر على دائرة محطة أخرى لاحقًا بسحبه من علامة التبويب نموذجي. + + + + Heating + التدفئة + + + + Cooling + تبريد + + openstudio::HVACPlantLoopControlsView @@ -25271,10 +25299,10 @@ If you would like to see the OpenStudioApplication translated in your language o ملفات التبريد والتدفئة - - - Heat Pumps - مضخات الحرارة + + + Plant Loop Heat Pumps + مضخات حرارية لدوائر المحطة @@ -25575,6 +25603,46 @@ If you would like to see the OpenStudioApplication translated in your language o Heat Pump - Water to Water - Cooling مضخة حرارية - ماء إلى ماء - تبريد + + + + Heat Pump - Plant Loop EIR - Heating + مضخة حرارية - دائرة المحطة EIR - تدفئة + + + + + Heat Pump - Plant Loop EIR - Cooling + مضخة حرارية - دائرة المحطة EIR - تبريد + + + + + Heat Pump - Air to Water Fuel Fired - Heating + مضخة حرارية - هواء إلى ماء تعمل بالوقود - تدفئة + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + مضخة حرارية - هواء إلى ماء تعمل بالوقود - تبريد + + + + + Heat Pump - Air to Water + مضخة حرارية - هواء إلى ماء + + + + Heat Pump - Air to Water - Heating Mode + مضخة حرارية - هواء إلى ماء - وضع التدفئة + + + + Heat Pump - Air to Water - Cooling Mode + مضخة حرارية - هواء إلى ماء - وضع التبريد + diff --git a/translations/OpenStudioApp_ca.ts b/translations/OpenStudioApp_ca.ts index f661de56d..53124a444 100644 --- a/translations/OpenStudioApp_ca.ts +++ b/translations/OpenStudioApp_ca.ts @@ -23368,6 +23368,34 @@ Planta Cap + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Bomba de Calor Aire a Aigua + + + + Which operation mode of this air to water heat pump should be placed on this loop? + Quin mode de funcionament d'aquesta bomba de calor aire a aigua s'ha de col·locar en aquest circuit? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + L'altre mode es pot col·locar més tard en un altre circuit de planta arrossegant-lo des de la pestanya El Meu Model. + + + + Heating + Calefacció + + + + Cooling + Refrigeració + + openstudio::HVACPlantLoopControlsView @@ -25343,10 +25371,10 @@ Si voleu que OpeStudioApplication estigui a la vostra llengua, esperem la vostra Serpentins - - - Heat Pumps - Bombes de Calor + + + Plant Loop Heat Pumps + Bombes de Calor de Circuit de Planta @@ -25647,6 +25675,46 @@ Si voleu que OpeStudioApplication estigui a la vostra llengua, esperem la vostra Heat Pump - Water to Water - Cooling Bomba de calor - Aigua a Aigua - Refrigeració + + + + Heat Pump - Plant Loop EIR - Heating + Bomba de Calor - Circuit de Planta EIR - Calefacció + + + + + Heat Pump - Plant Loop EIR - Cooling + Bomba de Calor - Circuit de Planta EIR - Refrigeració + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Bomba de Calor - Aire a Aigua de Combustible - Calefacció + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Bomba de Calor - Aire a Aigua de Combustible - Refrigeració + + + + + Heat Pump - Air to Water + Bomba de Calor - Aire a Aigua + + + + Heat Pump - Air to Water - Heating Mode + Bomba de Calor - Aire a Aigua - Mode Calefacció + + + + Heat Pump - Air to Water - Cooling Mode + Bomba de Calor - Aire a Aigua - Mode Refrigeració + diff --git a/translations/OpenStudioApp_de.ts b/translations/OpenStudioApp_de.ts index 988f47116..bae665156 100644 --- a/translations/OpenStudioApp_de.ts +++ b/translations/OpenStudioApp_de.ts @@ -23332,6 +23332,34 @@ Story Keine + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Luft-Wasser-Wärmepumpe + + + + Which operation mode of this air to water heat pump should be placed on this loop? + Welche Betriebsart dieser Luft-Wasser-Wärmepumpe soll in diesen Kreis eingefügt werden? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + Die andere Betriebsart kann später in einen anderen Anlagenkreis eingefügt werden, indem Sie sie aus dem Reiter Mein Modell ziehen. + + + + Heating + Heizung + + + + Cooling + Kühlung + + openstudio::HVACPlantLoopControlsView @@ -25263,10 +25291,10 @@ Wenn Sie möchten, dass die OpenStudio-Applikation in die Sprache Ihrer Wahl üb Wärmepumpen - - - Heat Pumps - Wärmepumpen + + + Plant Loop Heat Pumps + Wärmepumpen für Anlagenkreise @@ -25567,6 +25595,46 @@ Wenn Sie möchten, dass die OpenStudio-Applikation in die Sprache Ihrer Wahl üb Heat Pump - Water to Water - Cooling Wärmepumpe - Wasser zu Wasser - Kühlung + + + + Heat Pump - Plant Loop EIR - Heating + Wärmepumpe - Anlagenkreis EIR - Heizung + + + + + Heat Pump - Plant Loop EIR - Cooling + Wärmepumpe - Anlagenkreis EIR - Kühlung + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Wärmepumpe - Luft-Wasser brennstoffbetrieben - Heizung + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Wärmepumpe - Luft-Wasser brennstoffbetrieben - Kühlung + + + + + Heat Pump - Air to Water + Wärmepumpe - Luft-Wasser + + + + Heat Pump - Air to Water - Heating Mode + Wärmepumpe - Luft-Wasser - Heizbetrieb + + + + Heat Pump - Air to Water - Cooling Mode + Wärmepumpe - Luft-Wasser - Kühlbetrieb + diff --git a/translations/OpenStudioApp_el.ts b/translations/OpenStudioApp_el.ts index 4318595ce..74af5921d 100644 --- a/translations/OpenStudioApp_el.ts +++ b/translations/OpenStudioApp_el.ts @@ -23307,6 +23307,34 @@ Story Κανένα + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Αντλία Θερμότητας Αέρα-Νερού + + + + Which operation mode of this air to water heat pump should be placed on this loop? + Ποια λειτουργία αυτής της αντλίας θερμότητας αέρα-νερού να τοποθετηθεί σε αυτό το κύκλωμα; + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + Η άλλη λειτουργία μπορεί να τοποθετηθεί αργότερα σε άλλο κύκλωμα εγκατάστασης σύροντάς την από την καρτέλα Το Μοντέλό μου. + + + + Heating + Θέρμανση + + + + Cooling + Ψύξη + + openstudio::HVACPlantLoopControlsView @@ -25238,10 +25266,10 @@ If you would like to see the OpenStudioApplication translated in your language o Στοιχεία Ανταλλαγής Θερμότητας - - - Heat Pumps - Αντλίες Θερμότητας + + + Plant Loop Heat Pumps + Αντλίες Θερμότητας Κυκλώματος Εγκατάστασης @@ -25542,6 +25570,46 @@ If you would like to see the OpenStudioApplication translated in your language o Heat Pump - Water to Water - Cooling Αντλία Θερμότητας - Νερό σε Νερό - Ψύξη + + + + Heat Pump - Plant Loop EIR - Heating + Αντλία Θερμότητας - Κύκλωμα Εγκατάστασης EIR - Θέρμανση + + + + + Heat Pump - Plant Loop EIR - Cooling + Αντλία Θερμότητας - Κύκλωμα Εγκατάστασης EIR - Ψύξη + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Αντλία Θερμότητας - Αέρα-Νερού με Καύσιμο - Θέρμανση + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Αντλία Θερμότητας - Αέρα-Νερού με Καύσιμο - Ψύξη + + + + + Heat Pump - Air to Water + Αντλία Θερμότητας - Αέρα-Νερού + + + + Heat Pump - Air to Water - Heating Mode + Αντλία Θερμότητας - Αέρα-Νερού - Λειτουργία Θέρμανσης + + + + Heat Pump - Air to Water - Cooling Mode + Αντλία Θερμότητας - Αέρα-Νερού - Λειτουργία Ψύξης + diff --git a/translations/OpenStudioApp_es.ts b/translations/OpenStudioApp_es.ts index 76a679f47..11fe4d3bc 100644 --- a/translations/OpenStudioApp_es.ts +++ b/translations/OpenStudioApp_es.ts @@ -23325,6 +23325,34 @@ Story Ninguno + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Bomba de Calor Aire a Agua + + + + Which operation mode of this air to water heat pump should be placed on this loop? + ¿Qué modo de operación de esta bomba de calor aire a agua debe colocarse en este circuito? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + El otro modo puede colocarse más tarde en otro circuito de planta arrastrándolo desde la pestaña Mi Modelo. + + + + Heating + Calefacción + + + + Cooling + Refrigeración + + openstudio::HVACPlantLoopControlsView @@ -25256,10 +25284,10 @@ Si le gustaría ver la AplicaciónOpenStudio traducido a algun otro lenguaje, le Serpentines - - - Heat Pumps - Bombas de Calor + + + Plant Loop Heat Pumps + Bombas de Calor de Circuito de Planta @@ -25560,6 +25588,46 @@ Si le gustaría ver la AplicaciónOpenStudio traducido a algun otro lenguaje, le Heat Pump - Water to Water - Cooling Bomba de Calor - Agua a Agua - Enfriamiento + + + + Heat Pump - Plant Loop EIR - Heating + Bomba de Calor - Circuito de Planta EIR - Calefacción + + + + + Heat Pump - Plant Loop EIR - Cooling + Bomba de Calor - Circuito de Planta EIR - Enfriamiento + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Bomba de Calor - Aire a Agua a Combustible - Calefacción + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Bomba de Calor - Aire a Agua a Combustible - Enfriamiento + + + + + Heat Pump - Air to Water + Bomba de Calor - Aire a Agua + + + + Heat Pump - Air to Water - Heating Mode + Bomba de Calor - Aire a Agua - Modo Calefacción + + + + Heat Pump - Air to Water - Cooling Mode + Bomba de Calor - Aire a Agua - Modo Refrigeración + diff --git a/translations/OpenStudioApp_fa.ts b/translations/OpenStudioApp_fa.ts index acb7bffdf..bf033d3ae 100644 --- a/translations/OpenStudioApp_fa.ts +++ b/translations/OpenStudioApp_fa.ts @@ -23298,6 +23298,34 @@ Story هیچ‌کدام + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + پمپ حرارتی هوا به آب + + + + Which operation mode of this air to water heat pump should be placed on this loop? + کدام حالت کاری این پمپ حرارتی هوا به آب باید روی این حلقه قرار گیرد؟ + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + حالت دیگر را می‌توان بعداً با کشیدن آن از زبانه مدل من روی حلقه تاسیسات دیگری قرار داد. + + + + Heating + گرمایش + + + + Cooling + سرمایش + + openstudio::HVACPlantLoopControlsView @@ -25229,10 +25257,10 @@ If you would like to see the OpenStudioApplication translated in your language o سیم‌پیچ‌ها - - - Heat Pumps - پمپ‌های حرارتی + + + Plant Loop Heat Pumps + پمپ‌های حرارتی حلقه تاسیسات @@ -25533,6 +25561,46 @@ If you would like to see the OpenStudioApplication translated in your language o Heat Pump - Water to Water - Cooling پمپ حرارتی - آب به آب - خنک‌کننده + + + + Heat Pump - Plant Loop EIR - Heating + پمپ حرارتی - حلقه تاسیسات EIR - گرمایش + + + + + Heat Pump - Plant Loop EIR - Cooling + پمپ حرارتی - حلقه تاسیسات EIR - سرمایش + + + + + Heat Pump - Air to Water Fuel Fired - Heating + پمپ حرارتی - هوا به آب سوختی - گرمایش + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + پمپ حرارتی - هوا به آب سوختی - سرمایش + + + + + Heat Pump - Air to Water + پمپ حرارتی - هوا به آب + + + + Heat Pump - Air to Water - Heating Mode + پمپ حرارتی - هوا به آب - حالت گرمایش + + + + Heat Pump - Air to Water - Cooling Mode + پمپ حرارتی - هوا به آب - حالت سرمایش + diff --git a/translations/OpenStudioApp_fr.ts b/translations/OpenStudioApp_fr.ts index d02b61543..f655c11ec 100644 --- a/translations/OpenStudioApp_fr.ts +++ b/translations/OpenStudioApp_fr.ts @@ -23313,6 +23313,34 @@ Story Aucun + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Pompe à chaleur air-eau + + + + Which operation mode of this air to water heat pump should be placed on this loop? + Quel mode de fonctionnement de cette pompe à chaleur air-eau faut-il placer sur cette boucle ? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + L'autre mode peut être placé plus tard sur une autre boucle de production en le faisant glisser depuis l'onglet Mon modèle. + + + + Heating + Chauffage + + + + Cooling + Refroidissement + + openstudio::HVACPlantLoopControlsView @@ -25248,10 +25276,10 @@ Si vous voulez voir l'Application OpenStudio traduite dans la langue de vot Échangeurs thermiques - - - Heat Pumps - Pompes à chaleur + + + Plant Loop Heat Pumps + Pompes à chaleur de boucle de production @@ -25552,6 +25580,46 @@ Si vous voulez voir l'Application OpenStudio traduite dans la langue de vot Heat Pump - Water to Water - Cooling Pompe à chaleur - Eau vers eau - Refroidissement + + + + Heat Pump - Plant Loop EIR - Heating + Pompe à chaleur - Boucle de production EIR - Chauffage + + + + + Heat Pump - Plant Loop EIR - Cooling + Pompe à chaleur - Boucle de production EIR - Refroidissement + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Pompe à chaleur - Air vers eau à combustible - Chauffage + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Pompe à chaleur - Air vers eau à combustible - Refroidissement + + + + + Heat Pump - Air to Water + Pompe à chaleur - Air vers eau + + + + Heat Pump - Air to Water - Heating Mode + Pompe à chaleur - Air vers eau - Mode chauffage + + + + Heat Pump - Air to Water - Cooling Mode + Pompe à chaleur - Air vers eau - Mode refroidissement + diff --git a/translations/OpenStudioApp_he.ts b/translations/OpenStudioApp_he.ts index 43b751856..59e480b6d 100644 --- a/translations/OpenStudioApp_he.ts +++ b/translations/OpenStudioApp_he.ts @@ -23421,6 +23421,34 @@ Story ללא + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + משאבת חום אוויר למים + + + + Which operation mode of this air to water heat pump should be placed on this loop? + איזה מצב הפעלה של משאבת חום אוויר למים זו יש למקם בלולאה זו? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + ניתן למקם את המצב השני מאוחר יותר בלולאת מתקן אחרת על ידי גרירתו מהלשונית המודל שלי. + + + + Heating + חימום + + + + Cooling + קירור + + openstudio::HVACPlantLoopControlsView @@ -25352,10 +25380,10 @@ If you would like to see the OpenStudioApplication translated in your language o סלילים - - - Heat Pumps - משאבות חום + + + Plant Loop Heat Pumps + משאבות חום ללולאת מתקן @@ -25658,6 +25686,46 @@ If you would like to see the OpenStudioApplication translated in your language o Heat Pump - Water to Water - Cooling משאבת חום - מים לממים - קירור + + + + Heat Pump - Plant Loop EIR - Heating + משאבת חום - לולאת מתקן EIR - חימום + + + + + Heat Pump - Plant Loop EIR - Cooling + משאבת חום - לולאת מתקן EIR - קירור + + + + + Heat Pump - Air to Water Fuel Fired - Heating + משאבת חום - אוויר למים מונעת דלק - חימום + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + משאבת חום - אוויר למים מונעת דלק - קירור + + + + + Heat Pump - Air to Water + משאבת חום - אוויר למים + + + + Heat Pump - Air to Water - Heating Mode + משאבת חום - אוויר למים - מצב חימום + + + + Heat Pump - Air to Water - Cooling Mode + משאבת חום - אוויר למים - מצב קירור + diff --git a/translations/OpenStudioApp_hi.ts b/translations/OpenStudioApp_hi.ts index 3ecbcb8a1..657eeb6b7 100644 --- a/translations/OpenStudioApp_hi.ts +++ b/translations/OpenStudioApp_hi.ts @@ -23755,6 +23755,34 @@ Story कोई नहीं + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + वायु से जल हीट पंप + + + + Which operation mode of this air to water heat pump should be placed on this loop? + इस वायु से जल हीट पंप का कौन सा संचालन मोड इस लूप पर रखा जाना चाहिए? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + दूसरा मोड बाद में मेरा मॉडल टैब से खींचकर किसी अन्य प्लांट लूप पर रखा जा सकता है। + + + + Heating + हीटिंग + + + + Cooling + शीतलन + + openstudio::HVACPlantLoopControlsView @@ -25712,10 +25740,10 @@ or more descriptively: कॉइल्स - - - Heat Pumps - ताप पंप + + + Plant Loop Heat Pumps + प्लांट लूप हीट पंप @@ -26028,6 +26056,46 @@ However, if a more concise label is preferred for UI display: Heat Pump - Water to Water - Cooling हीट पंप - जल से जल - शीतलन + + + + Heat Pump - Plant Loop EIR - Heating + हीट पंप - प्लांट लूप EIR - हीटिंग + + + + + Heat Pump - Plant Loop EIR - Cooling + हीट पंप - प्लांट लूप EIR - शीतलन + + + + + Heat Pump - Air to Water Fuel Fired - Heating + हीट पंप - वायु से जल ईंधन चालित - हीटिंग + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + हीट पंप - वायु से जल ईंधन चालित - शीतलन + + + + + Heat Pump - Air to Water + हीट पंप - वायु से जल + + + + Heat Pump - Air to Water - Heating Mode + हीट पंप - वायु से जल - हीटिंग मोड + + + + Heat Pump - Air to Water - Cooling Mode + हीट पंप - वायु से जल - शीतलन मोड + diff --git a/translations/OpenStudioApp_id.ts b/translations/OpenStudioApp_id.ts index f4ccc10dd..de4d90d07 100644 --- a/translations/OpenStudioApp_id.ts +++ b/translations/OpenStudioApp_id.ts @@ -23352,6 +23352,34 @@ Story Tidak ada + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Pompa Panas Udara ke Air + + + + Which operation mode of this air to water heat pump should be placed on this loop? + Mode operasi mana dari pompa panas udara ke air ini yang harus ditempatkan pada sirkuit ini? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + Mode lainnya dapat ditempatkan nanti pada sirkuit plant lain dengan menyeretnya dari tab Model Saya. + + + + Heating + Pemanasan + + + + Cooling + Pendinginan + + openstudio::HVACPlantLoopControlsView @@ -25285,10 +25313,10 @@ Jika Anda ingin melihat OpenStudio Application diterjemahkan ke bahasa pilihan A Kumparan - - - Heat Pumps - Pompa Panas + + + Plant Loop Heat Pumps + Pompa Panas Sirkuit Plant @@ -25589,6 +25617,46 @@ Jika Anda ingin melihat OpenStudio Application diterjemahkan ke bahasa pilihan A Heat Pump - Water to Water - Cooling Pompa Panas - Air ke Air - Pendinginan + + + + Heat Pump - Plant Loop EIR - Heating + Pompa Panas - Sirkuit Plant EIR - Pemanasan + + + + + Heat Pump - Plant Loop EIR - Cooling + Pompa Panas - Sirkuit Plant EIR - Pendinginan + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Pompa Panas - Udara ke Air Berbahan Bakar - Pemanasan + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Pompa Panas - Udara ke Air Berbahan Bakar - Pendinginan + + + + + Heat Pump - Air to Water + Pompa Panas - Udara ke Air + + + + Heat Pump - Air to Water - Heating Mode + Pompa Panas - Udara ke Air - Mode Pemanasan + + + + Heat Pump - Air to Water - Cooling Mode + Pompa Panas - Udara ke Air - Mode Pendinginan + diff --git a/translations/OpenStudioApp_it.ts b/translations/OpenStudioApp_it.ts index 67f13e956..2a5daf57c 100644 --- a/translations/OpenStudioApp_it.ts +++ b/translations/OpenStudioApp_it.ts @@ -23304,6 +23304,34 @@ Story Nessuno + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Pompa di Calore Aria-Acqua + + + + Which operation mode of this air to water heat pump should be placed on this loop? + Quale modalità di funzionamento di questa pompa di calore aria-acqua deve essere inserita in questo circuito? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + L'altra modalità può essere inserita in seguito in un altro circuito idronico trascinandola dalla scheda Il mio modello. + + + + Heating + Riscaldamento + + + + Cooling + Raffreddamento + + openstudio::HVACPlantLoopControlsView @@ -25235,10 +25263,10 @@ Se vuoi vedere OpenStudioApplication tradotto nel tuo linguaggio preferito, appr Serpentini - - - Heat Pumps - Pompe di Calore + + + Plant Loop Heat Pumps + Pompe di Calore per Circuito Idronico @@ -25539,6 +25567,46 @@ Se vuoi vedere OpenStudioApplication tradotto nel tuo linguaggio preferito, appr Heat Pump - Water to Water - Cooling Pompa di Calore - Acqua-Acqua - Raffreddamento + + + + Heat Pump - Plant Loop EIR - Heating + Pompa di Calore - Circuito Idronico EIR - Riscaldamento + + + + + Heat Pump - Plant Loop EIR - Cooling + Pompa di Calore - Circuito Idronico EIR - Raffreddamento + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Pompa di Calore - Aria-Acqua a Combustibile - Riscaldamento + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Pompa di Calore - Aria-Acqua a Combustibile - Raffreddamento + + + + + Heat Pump - Air to Water + Pompa di Calore - Aria-Acqua + + + + Heat Pump - Air to Water - Heating Mode + Pompa di Calore - Aria-Acqua - Modalità Riscaldamento + + + + Heat Pump - Air to Water - Cooling Mode + Pompa di Calore - Aria-Acqua - Modalità Raffreddamento + diff --git a/translations/OpenStudioApp_ja.ts b/translations/OpenStudioApp_ja.ts index 3156c4ef3..54df2b175 100644 --- a/translations/OpenStudioApp_ja.ts +++ b/translations/OpenStudioApp_ja.ts @@ -23302,6 +23302,34 @@ Story なし + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + 空気対水ヒートポンプ + + + + Which operation mode of this air to water heat pump should be placed on this loop? + この空気対水ヒートポンプのどの運転モードをこのループに配置しますか? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + もう一方のモードは、後で「マイモデル」タブからドラッグして別のプラントループに配置できます。 + + + + Heating + 暖房 + + + + Cooling + 冷房 + + openstudio::HVACPlantLoopControlsView @@ -25247,10 +25275,10 @@ OpenStudio の日本語ローカライゼーションでは **無熱量材料** コイル - - - Heat Pumps - ヒートポンプ + + + Plant Loop Heat Pumps + プラントループ ヒートポンプ @@ -25551,6 +25579,46 @@ OpenStudio の日本語ローカライゼーションでは **無熱量材料** Heat Pump - Water to Water - Cooling ヒートポンプ - 水熱交換 - 冷房 + + + + Heat Pump - Plant Loop EIR - Heating + ヒートポンプ - プラントループ EIR - 暖房 + + + + + Heat Pump - Plant Loop EIR - Cooling + ヒートポンプ - プラントループ EIR - 冷房 + + + + + Heat Pump - Air to Water Fuel Fired - Heating + ヒートポンプ - 空気対水 燃料焚き - 暖房 + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + ヒートポンプ - 空気対水 燃料焚き - 冷房 + + + + + Heat Pump - Air to Water + ヒートポンプ - 空気対水 + + + + Heat Pump - Air to Water - Heating Mode + ヒートポンプ - 空気対水 - 暖房モード + + + + Heat Pump - Air to Water - Cooling Mode + ヒートポンプ - 空気対水 - 冷房モード + diff --git a/translations/OpenStudioApp_ko.ts b/translations/OpenStudioApp_ko.ts index 1d2b1ba90..033c8a03d 100644 --- a/translations/OpenStudioApp_ko.ts +++ b/translations/OpenStudioApp_ko.ts @@ -23407,6 +23407,34 @@ Story를 여기에 놓기 없음 + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + 공기-물 히트펌프 + + + + Which operation mode of this air to water heat pump should be placed on this loop? + 이 공기-물 히트펌프의 어떤 운전 모드를 이 루프에 배치하시겠습니까? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + 다른 모드는 나중에 내 모델 탭에서 끌어서 다른 플랜트 루프에 배치할 수 있습니다. + + + + Heating + 난방 + + + + Cooling + 냉방 + + openstudio::HVACPlantLoopControlsView @@ -25344,10 +25372,10 @@ OpenStudio Application이 선택하신 언어로 번역되기를 원하신다면 코일 - - - Heat Pumps - 히트펌프 + + + Plant Loop Heat Pumps + 플랜트 루프 히트펌프 @@ -25648,6 +25676,46 @@ OpenStudio Application이 선택하신 언어로 번역되기를 원하신다면 Heat Pump - Water to Water - Cooling 히트펌프 - 물-물 - 냉각 + + + + Heat Pump - Plant Loop EIR - Heating + 히트펌프 - 플랜트 루프 EIR - 난방 + + + + + Heat Pump - Plant Loop EIR - Cooling + 히트펌프 - 플랜트 루프 EIR - 냉방 + + + + + Heat Pump - Air to Water Fuel Fired - Heating + 히트펌프 - 공기-물 연료 연소식 - 난방 + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + 히트펌프 - 공기-물 연료 연소식 - 냉방 + + + + + Heat Pump - Air to Water + 히트펌프 - 공기-물 + + + + Heat Pump - Air to Water - Heating Mode + 히트펌프 - 공기-물 - 난방 모드 + + + + Heat Pump - Air to Water - Cooling Mode + 히트펌프 - 공기-물 - 냉방 모드 + diff --git a/translations/OpenStudioApp_pl.ts b/translations/OpenStudioApp_pl.ts index 6e0a79cdc..a0a5cc764 100644 --- a/translations/OpenStudioApp_pl.ts +++ b/translations/OpenStudioApp_pl.ts @@ -23328,6 +23328,34 @@ Kondygnację Brak + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Pompa ciepła powietrze-woda + + + + Which operation mode of this air to water heat pump should be placed on this loop? + Który tryb pracy tej pompy ciepła powietrze-woda umieścić w tym obiegu? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + Drugi tryb można później umieścić w innym obiegu wodnym, przeciągając go z karty Mój Model. + + + + Heating + Ogrzewanie + + + + Cooling + Chłodzenie + + openstudio::HVACPlantLoopControlsView @@ -25259,10 +25287,10 @@ Jeśli chcesz zobaczyć aplikację OpenStudio przetłumaczoną na wybrany przez Wymienniki ciepła - - - Heat Pumps - Pompy ciepła + + + Plant Loop Heat Pumps + Pompy ciepła obiegu wodnego @@ -25563,6 +25591,46 @@ Jeśli chcesz zobaczyć aplikację OpenStudio przetłumaczoną na wybrany przez Heat Pump - Water to Water - Cooling Pompa ciepła – Woda do Wody – Chłodzenie + + + + Heat Pump - Plant Loop EIR - Heating + Pompa ciepła - Obieg wodny EIR - Ogrzewanie + + + + + Heat Pump - Plant Loop EIR - Cooling + Pompa ciepła - Obieg wodny EIR - Chłodzenie + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Pompa ciepła - Powietrze-Woda zasilana paliwem - Ogrzewanie + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Pompa ciepła - Powietrze-Woda zasilana paliwem - Chłodzenie + + + + + Heat Pump - Air to Water + Pompa ciepła - Powietrze-Woda + + + + Heat Pump - Air to Water - Heating Mode + Pompa ciepła - Powietrze-Woda - Tryb ogrzewania + + + + Heat Pump - Air to Water - Cooling Mode + Pompa ciepła - Powietrze-Woda - Tryb chłodzenia + diff --git a/translations/OpenStudioApp_pt.ts b/translations/OpenStudioApp_pt.ts index 8cb8dba5c..dd9e62ad1 100644 --- a/translations/OpenStudioApp_pt.ts +++ b/translations/OpenStudioApp_pt.ts @@ -23325,6 +23325,34 @@ História Nenhum + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Bomba de Calor Ar para Água + + + + Which operation mode of this air to water heat pump should be placed on this loop? + Qual modo de operação desta bomba de calor ar para água deve ser colocado neste circuito? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + O outro modo pode ser colocado depois em outro circuito hidráulico arrastando-o da aba Meu Modelo. + + + + Heating + Aquecimento + + + + Cooling + Resfriamento + + openstudio::HVACPlantLoopControlsView @@ -25258,10 +25286,10 @@ Se gostaria de ver o OpenStudio Application traduzido para o seu idioma preferid Serpentinas - - - Heat Pumps - Bombas de Calor + + + Plant Loop Heat Pumps + Bombas de Calor de Circuito Hidráulico @@ -25562,6 +25590,46 @@ Se gostaria de ver o OpenStudio Application traduzido para o seu idioma preferid Heat Pump - Water to Water - Cooling Bomba de Calor - Água para Água - Refrigeração + + + + Heat Pump - Plant Loop EIR - Heating + Bomba de Calor - Circuito Hidráulico EIR - Aquecimento + + + + + Heat Pump - Plant Loop EIR - Cooling + Bomba de Calor - Circuito Hidráulico EIR - Refrigeração + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Bomba de Calor - Ar para Água a Combustível - Aquecimento + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Bomba de Calor - Ar para Água a Combustível - Refrigeração + + + + + Heat Pump - Air to Water + Bomba de Calor - Ar para Água + + + + Heat Pump - Air to Water - Heating Mode + Bomba de Calor - Ar para Água - Modo Aquecimento + + + + Heat Pump - Air to Water - Cooling Mode + Bomba de Calor - Ar para Água - Modo Resfriamento + diff --git a/translations/OpenStudioApp_tr.ts b/translations/OpenStudioApp_tr.ts index 58c2743ec..4963e5981 100644 --- a/translations/OpenStudioApp_tr.ts +++ b/translations/OpenStudioApp_tr.ts @@ -23354,6 +23354,34 @@ Bırak Hiçbiri + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Havadan Suya Isı Pompası + + + + Which operation mode of this air to water heat pump should be placed on this loop? + Bu havadan suya ısı pompasının hangi çalışma modu bu devreye yerleştirilsin? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + Diğer mod daha sonra Benim Modelim sekmesinden sürüklenerek başka bir tesisat devresine yerleştirilebilir. + + + + Heating + Isıtma + + + + Cooling + Soğutma + + openstudio::HVACPlantLoopControlsView @@ -25287,10 +25315,10 @@ OpenStudio Application'ın seçtiğiniz dilinize çevrilmiş halini görmek iste Bobinler - - - Heat Pumps - Isı Pompaları + + + Plant Loop Heat Pumps + Tesisat Devresi Isı Pompaları @@ -25591,6 +25619,46 @@ OpenStudio Application'ın seçtiğiniz dilinize çevrilmiş halini görmek iste Heat Pump - Water to Water - Cooling Isı Pompası - Su'dan Su'ya - Soğutma + + + + Heat Pump - Plant Loop EIR - Heating + Isı Pompası - Tesisat Devresi EIR - Isıtma + + + + + Heat Pump - Plant Loop EIR - Cooling + Isı Pompası - Tesisat Devresi EIR - Soğutma + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Isı Pompası - Havadan Suya Yakıtlı - Isıtma + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Isı Pompası - Havadan Suya Yakıtlı - Soğutma + + + + + Heat Pump - Air to Water + Isı Pompası - Havadan Suya + + + + Heat Pump - Air to Water - Heating Mode + Isı Pompası - Havadan Suya - Isıtma Modu + + + + Heat Pump - Air to Water - Cooling Mode + Isı Pompası - Havadan Suya - Soğutma Modu + diff --git a/translations/OpenStudioApp_vi.ts b/translations/OpenStudioApp_vi.ts index 59858cfde..fff06b769 100644 --- a/translations/OpenStudioApp_vi.ts +++ b/translations/OpenStudioApp_vi.ts @@ -23372,6 +23372,34 @@ Story Không có + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + Bơm Nhiệt Không Khí sang Nước + + + + Which operation mode of this air to water heat pump should be placed on this loop? + Chế độ vận hành nào của bơm nhiệt không khí sang nước này nên được đặt trên vòng này? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + Chế độ còn lại có thể được đặt sau trên một vòng nước trung tâm khác bằng cách kéo nó từ thẻ Mô hình của tôi. + + + + Heating + Sưởi Ấm + + + + Cooling + Làm Lạnh + + openstudio::HVACPlantLoopControlsView @@ -25303,10 +25331,10 @@ Nếu bạn muốn thấy OpenStudioApplication được dịch sang ngôn ngữ Các cuộn dây - - - Heat Pumps - Máy Bơm Nhiệt + + + Plant Loop Heat Pumps + Bơm Nhiệt Vòng Nước Trung Tâm @@ -25607,6 +25635,46 @@ Nếu bạn muốn thấy OpenStudioApplication được dịch sang ngôn ngữ Heat Pump - Water to Water - Cooling Bơm Nhiệt - Nước sang Nước - Làm lạnh + + + + Heat Pump - Plant Loop EIR - Heating + Bơm Nhiệt - Vòng Nước Trung Tâm EIR - Sưởi Ấm + + + + + Heat Pump - Plant Loop EIR - Cooling + Bơm Nhiệt - Vòng Nước Trung Tâm EIR - Làm Lạnh + + + + + Heat Pump - Air to Water Fuel Fired - Heating + Bơm Nhiệt - Không Khí sang Nước Dùng Nhiên Liệu - Sưởi Ấm + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + Bơm Nhiệt - Không Khí sang Nước Dùng Nhiên Liệu - Làm Lạnh + + + + + Heat Pump - Air to Water + Bơm Nhiệt - Không Khí sang Nước + + + + Heat Pump - Air to Water - Heating Mode + Bơm Nhiệt - Không Khí sang Nước - Chế Độ Sưởi + + + + Heat Pump - Air to Water - Cooling Mode + Bơm Nhiệt - Không Khí sang Nước - Chế Độ Làm Lạnh + diff --git a/translations/OpenStudioApp_zh_CN.ts b/translations/OpenStudioApp_zh_CN.ts index d852e3c0e..6611ce4c3 100644 --- a/translations/OpenStudioApp_zh_CN.ts +++ b/translations/OpenStudioApp_zh_CN.ts @@ -23354,6 +23354,34 @@ Story 无 + + openstudio::HVACLayoutController + + + Air to Water Heat Pump + 空气对水热泵 + + + + Which operation mode of this air to water heat pump should be placed on this loop? + 应将此空气对水热泵的哪种运行模式放置在此环路上? + + + + The other mode can be placed on another plant loop later by dragging it from the My Model tab. + 另一种模式可稍后从“我的模型”选项卡拖动到另一个水系统环路上。 + + + + Heating + 供热 + + + + Cooling + 供冷 + + openstudio::HVACPlantLoopControlsView @@ -25285,10 +25313,10 @@ If you would like to see the OpenStudioApplication translated in your language o 换热器 - - - Heat Pumps - 热泵 + + + Plant Loop Heat Pumps + 水系统环路热泵 @@ -25589,6 +25617,46 @@ If you would like to see the OpenStudioApplication translated in your language o Heat Pump - Water to Water - Cooling 热泵 - 水对水 - 冷却 + + + + Heat Pump - Plant Loop EIR - Heating + 热泵 - 水系统环路 EIR - 供热 + + + + + Heat Pump - Plant Loop EIR - Cooling + 热泵 - 水系统环路 EIR - 供冷 + + + + + Heat Pump - Air to Water Fuel Fired - Heating + 热泵 - 空气对水 燃料驱动 - 供热 + + + + + Heat Pump - Air to Water Fuel Fired - Cooling + 热泵 - 空气对水 燃料驱动 - 供冷 + + + + + Heat Pump - Air to Water + 热泵 - 空气对水 + + + + Heat Pump - Air to Water - Heating Mode + 热泵 - 空气对水 - 供热模式 + + + + Heat Pump - Air to Water - Cooling Mode + 热泵 - 空气对水 - 供冷模式 + From aab52b145c138efbceb26a6e0a77b31521e6ead4 Mon Sep 17 00:00:00 2001 From: Ski90Moo Date: Mon, 12 Oct 2026 12:36:03 -0700 Subject: [PATCH 2/3] Edit and delete HeatPump:AirToWater as one unit My Model now lists only the HeatPump:AirToWater wrapper, not its heating and cooling operation modes. Selecting a mode on a loop opens an Edit tab that shows the owning HeatPump:AirToWater first, then the selected mode with its speed data, on one scrolling page (new HeatPumpAirToWaterModeInspectorView). A mode owned by a wrapper is not removable on its own in the SDK, so the loop diagram showed no delete button for it. It now gets one: clicking it takes the mode off that loop, and when neither mode is left on a loop the wrapper is removed along with both modes, their speed data, curves and lists, since the GUI has no other way to delete it. Translations: drop the two mode strings that are no longer listed. Co-Authored-By: Claude Opus 5.5 --- src/openstudio_lib/GridItem.cpp | 4 +- src/openstudio_lib/HVACSystemsController.cpp | 4 + src/openstudio_lib/InspectorView.cpp | 82 +++++++++++++++++++ src/openstudio_lib/InspectorView.hpp | 19 +++++ .../MainRightColumnController.cpp | 2 - src/utilities/HeatPumpAirToWaterPlacement.cpp | 36 ++++++++ src/utilities/HeatPumpAirToWaterPlacement.hpp | 10 +++ .../HeatPumpAirToWaterPlacement_GTest.cpp | 82 +++++++++++++++++++ translations/OpenStudioApp_ar.ts | 10 --- translations/OpenStudioApp_ca.ts | 10 --- translations/OpenStudioApp_de.ts | 10 --- translations/OpenStudioApp_el.ts | 10 --- translations/OpenStudioApp_es.ts | 10 --- translations/OpenStudioApp_fa.ts | 10 --- translations/OpenStudioApp_fr.ts | 10 --- translations/OpenStudioApp_he.ts | 10 --- translations/OpenStudioApp_hi.ts | 10 --- translations/OpenStudioApp_id.ts | 10 --- translations/OpenStudioApp_it.ts | 10 --- translations/OpenStudioApp_ja.ts | 10 --- translations/OpenStudioApp_ko.ts | 10 --- translations/OpenStudioApp_pl.ts | 10 --- translations/OpenStudioApp_pt.ts | 10 --- translations/OpenStudioApp_tr.ts | 10 --- translations/OpenStudioApp_vi.ts | 10 --- translations/OpenStudioApp_zh_CN.ts | 10 --- 26 files changed, 236 insertions(+), 183 deletions(-) diff --git a/src/openstudio_lib/GridItem.cpp b/src/openstudio_lib/GridItem.cpp index 49bb8a74d..a41842818 100644 --- a/src/openstudio_lib/GridItem.cpp +++ b/src/openstudio_lib/GridItem.cpp @@ -96,6 +96,7 @@ #include #include "../openstudio_qt_utils/Utilities.hpp" +#include "../utilities/HeatPumpAirToWaterPlacement.hpp" #include @@ -241,7 +242,8 @@ void ModelObjectGraphicsItem::setModelObject(model::OptionalModelObject modelObj if (auto comp_ = m_modelObject->optionalCast()) { setAcceptDrops(true); - setDeletable(comp_->isRemovable()); + // A HeatPumpAirToWater operation mode isn't removable by itself, but can be taken off its loop + setDeletable(comp_->isRemovable() || heatPumpAirToWaterForMode(comp_.get())); if (isNotSplitterMixerNodesPred(comp_.get())) { setDraggable(true); } diff --git a/src/openstudio_lib/HVACSystemsController.cpp b/src/openstudio_lib/HVACSystemsController.cpp index 510edaf9b..076634e8f 100644 --- a/src/openstudio_lib/HVACSystemsController.cpp +++ b/src/openstudio_lib/HVACSystemsController.cpp @@ -684,6 +684,10 @@ void HVACLayoutController::removeModelObject(model::ModelObject& modelObject) { boost::optional loop = m_hvacSystemsController->currentLoop(); + if (removeHeatPumpAirToWaterModeFromLoop(modelObject)) { + return; + } + if (loop) { if (boost::optional comp = modelObject.optionalCast()) { boost::optional plant = comp->plantLoop(); diff --git a/src/openstudio_lib/InspectorView.cpp b/src/openstudio_lib/InspectorView.cpp index e3d2e954f..581332995 100644 --- a/src/openstudio_lib/InspectorView.cpp +++ b/src/openstudio_lib/InspectorView.cpp @@ -16,6 +16,7 @@ #include "OSDocument.hpp" #include "ZoneChooserView.hpp" #include "EMSInspectorView.hpp" +#include "../utilities/HeatPumpAirToWaterPlacement.hpp" #include #include @@ -129,6 +130,7 @@ #include #include #include +#include #include #include #include @@ -593,6 +595,18 @@ void InspectorView::layoutModelObject(openstudio::model::OptionalModelObject& mo connect(static_cast(m_currentView), &ZoneHVACPackagedTerminalHeatPumpInspectorView::removeFromLoopClicked, this, &InspectorView::removeFromLoopClicked); + } else if (heatPumpAirToWaterForMode(modelObject.get())) { + if (m_currentView) { + delete m_currentView; + } + + m_currentView = new HeatPumpAirToWaterModeInspectorView(); + connect(this, &InspectorView::toggleUnitsClicked, m_currentView, &BaseInspectorView::toggleUnitsClicked); + connect(this, &InspectorView::toggleDisplayAdditionalPropsClicked, m_currentView, &BaseInspectorView::toggleDisplayAdditionalPropsClicked); + + m_currentView->layoutModelObject(modelObject.get(), readOnly, displayIP, displayAdditionalProps); + + m_vLayout->addWidget(m_currentView); } else if (boost::optional component = modelObject->optionalCast()) { @@ -908,6 +922,74 @@ void GenericInspectorView::layoutModelObject(model::ModelObject& modelObject, bo m_emsSensorView->layoutModelObject(modelObject); } +namespace { + +// An InspectorGadget without its own scroll area, so several can be stacked in one scrolling page +class StackedInspectorGadget : public InspectorGadget +{ + public: + StackedInspectorGadget(openstudio::WorkspaceObject& workspaceObj, bool locked) + : InspectorGadget(workspaceObj, 0, nullptr, false, true, true, locked) {} +}; + +} // namespace + +HeatPumpAirToWaterModeInspectorView::HeatPumpAirToWaterModeInspectorView(QWidget* parent) : BaseInspectorView(parent) { + auto* scrollArea = new QScrollArea(); + scrollArea->setWidgetResizable(true); + scrollArea->setFrameStyle(QFrame::NoFrame); + + auto* gadgetsWidget = new QWidget(); + m_gadgetsLayout = new QVBoxLayout(gadgetsWidget); + m_gadgetsLayout->setSpacing(0); + m_gadgetsLayout->setContentsMargins(0, 0, 0, 0); + m_gadgetsLayout->addStretch(); + scrollArea->setWidget(gadgetsWidget); + + m_libraryTabWidget->addTab(scrollArea, ":/images/properties_icon_on.png", ":/images/properties_icon_off.png"); + + m_emsActuatorView = new EMSInspectorView(nullptr, EMSInspectorView::Type::ACTUATOR); + m_libraryTabWidget->addTab(m_emsActuatorView, ":/images/controller_icon_on.png", ":/images/controller_icon_off.png"); + + m_emsSensorView = new EMSInspectorView(nullptr, EMSInspectorView::Type::SENSOR); + m_libraryTabWidget->addTab(m_emsSensorView, ":/images/controller_icon_on.png", ":/images/controller_icon_off.png"); +} + +void HeatPumpAirToWaterModeInspectorView::layoutModelObject(model::ModelObject& modelObject, bool readOnly, bool displayIP, + bool displayAdditionalProps) { + const bool force = true; + const bool recursive = true; + int insertIndex = 0; + + auto addGadget = [&](model::ModelObject object, bool hideChildren) { + auto* gadget = new StackedInspectorGadget(object, readOnly); + // The gadget lays the object out in IP without additional properties when constructed; each change below rebuilds it + if (!displayIP) { + gadget->setUnitSystem(InspectorGadget::SI); + } + if (displayAdditionalProps) { + gadget->setDisplayAdditionalProps(true); + } + if (hideChildren) { + gadget->layoutModelObj(object, force, recursive, readOnly, hideChildren); + } + connect(this, &HeatPumpAirToWaterModeInspectorView::toggleUnitsClicked, gadget, &InspectorGadget::toggleUnitsClicked); + connect(this, &HeatPumpAirToWaterModeInspectorView::toggleDisplayAdditionalPropsClicked, gadget, + &InspectorGadget::toggleDisplayAdditionalPropsClicked); + connect(gadget, &InspectorGadget::workspaceObjectRemoved, this, &BaseInspectorView::workspaceObjectRemoved); + m_gadgetsLayout->insertWidget(insertIndex++, gadget); + }; + + // The wrapper's own children are both operation modes, so hide them and show only the selected mode + if (boost::optional heatPump = heatPumpAirToWaterForMode(modelObject)) { + addGadget(heatPump.get(), true); + } + addGadget(modelObject, false); + + m_emsActuatorView->layoutModelObject(modelObject); + m_emsSensorView->layoutModelObject(modelObject); +} + NewPlenumDialog::NewPlenumDialog(QWidget* parent) : QDialog(parent) { auto* mainVLayout = new QVBoxLayout(); mainVLayout->setAlignment(Qt::AlignTop); diff --git a/src/openstudio_lib/InspectorView.hpp b/src/openstudio_lib/InspectorView.hpp index b5ddca2a9..77ce8c1fb 100644 --- a/src/openstudio_lib/InspectorView.hpp +++ b/src/openstudio_lib/InspectorView.hpp @@ -806,6 +806,25 @@ class ScheduleRulesetInspectorView : public BaseInspectorView virtual void layoutModelObject(model::ModelObject& modelObject, bool readOnly, bool displayIP, bool displayAdditionalProps = false) override; }; +// For a HeatPumpAirToWater heating or cooling operation mode: shows the owning HeatPumpAirToWater first, +// then the selected mode, since the two are edited as one piece of equipment +class HeatPumpAirToWaterModeInspectorView : public BaseInspectorView +{ + Q_OBJECT; + + public: + explicit HeatPumpAirToWaterModeInspectorView(QWidget* parent = nullptr); + + virtual ~HeatPumpAirToWaterModeInspectorView() {} + + void layoutModelObject(model::ModelObject& modelObject, bool readOnly, bool displayIP, bool displayAdditionalProps = false) override; + + private: + QVBoxLayout* m_gadgetsLayout; + EMSInspectorView* m_emsActuatorView; + EMSInspectorView* m_emsSensorView; +}; + } // namespace openstudio #endif // OPENSTUDIO_INSPECTORVIEW_HPP diff --git a/src/openstudio_lib/MainRightColumnController.cpp b/src/openstudio_lib/MainRightColumnController.cpp index 8b06d4557..2c71a8d83 100644 --- a/src/openstudio_lib/MainRightColumnController.cpp +++ b/src/openstudio_lib/MainRightColumnController.cpp @@ -1059,8 +1059,6 @@ void MainRightColumnController::configureForHVACSystemsSubTab(int subTabID) { myModelList->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_FuelFired_Heating, tr("Heat Pump - Air to Water Fuel Fired - Heating")); myModelList->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_FuelFired_Cooling, tr("Heat Pump - Air to Water Fuel Fired - Cooling")); myModelList->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater, tr("Heat Pump - Air to Water")); - myModelList->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_Heating, tr("Heat Pump - Air to Water - Heating Mode")); - myModelList->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_Cooling, tr("Heat Pump - Air to Water - Cooling Mode")); myModelList->addModelObjectType(IddObjectType::OS_CentralHeatPumpSystem, tr("Central Heat Pump System")); myModelList->addModelObjectCategoryPlaceholder(tr("Plant Loop Heat Pumps")); myModelList->addModelObjectType(IddObjectType::OS_Chiller_Electric_EIR, tr("Chiller - Electric EIR")); diff --git a/src/utilities/HeatPumpAirToWaterPlacement.cpp b/src/utilities/HeatPumpAirToWaterPlacement.cpp index 5a227cc13..1d8855f60 100644 --- a/src/utilities/HeatPumpAirToWaterPlacement.cpp +++ b/src/utilities/HeatPumpAirToWaterPlacement.cpp @@ -14,7 +14,9 @@ #include #include #include +#include #include +#include #include @@ -59,4 +61,38 @@ bool addHeatPumpAirToWaterModeToLoop(const model::HeatPumpAirToWater& heatPump, return false; } +boost::optional heatPumpAirToWaterForMode(const model::ModelObject& modelObject) { + if (auto heating = modelObject.optionalCast()) { + return heating->heatPumpAirToWater(); + } + if (auto cooling = modelObject.optionalCast()) { + return cooling->heatPumpAirToWater(); + } + return boost::none; +} + +bool removeHeatPumpAirToWaterModeFromLoop(const model::ModelObject& modelObject) { + boost::optional heatPump = heatPumpAirToWaterForMode(modelObject); + if (!heatPump) { + return false; + } + auto mode = modelObject.cast(); + if (mode.loop()) { + mode.removeFromLoop(); + } + + bool otherModeOnLoop = false; + if (modelObject.optionalCast()) { + if (auto cooling = heatPump->coolingOperationMode()) { + otherModeOnLoop = cooling->loop().has_value(); + } + } else if (auto heating = heatPump->heatingOperationMode()) { + otherModeOnLoop = heating->loop().has_value(); + } + if (!otherModeOnLoop) { + heatPump->remove(); + } + return true; +} + } // namespace openstudio diff --git a/src/utilities/HeatPumpAirToWaterPlacement.hpp b/src/utilities/HeatPumpAirToWaterPlacement.hpp index 85609d873..196f37fd1 100644 --- a/src/utilities/HeatPumpAirToWaterPlacement.hpp +++ b/src/utilities/HeatPumpAirToWaterPlacement.hpp @@ -34,6 +34,16 @@ boost::optional suggestedHeatPumpAirToWaterMode(const mo /// model unchanged, if the wrapper has no such mode or the mode cannot be added at `target`. bool addHeatPumpAirToWaterModeToLoop(const model::HeatPumpAirToWater& heatPump, HeatPumpAirToWaterMode mode, const model::HVACComponent& target); +/// If `modelObject` is a HeatPumpAirToWater heating or cooling operation mode that belongs to a wrapper, +/// returns that wrapper; otherwise none. +boost::optional heatPumpAirToWaterForMode(const model::ModelObject& modelObject); + +/// A mode owned by a wrapper can't be removed on its own (isRemovable() is false), so deleting it from a loop +/// disconnects it instead, leaving the wrapper and its other mode intact. Once neither mode is on a loop, the +/// wrapper is removed together with both modes and their speed data, since the GUI has no other way to delete it. +/// Returns true if `modelObject` is such a mode; false for anything else, which should be removed as usual. +bool removeHeatPumpAirToWaterModeFromLoop(const model::ModelObject& modelObject); + } // namespace openstudio #endif // OSAPP_UTILITIES_HEATPUMPAIRTOWATERPLACEMENT_HPP diff --git a/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp b/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp index a0d5d1676..def3395c8 100644 --- a/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp +++ b/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include #include @@ -129,3 +131,83 @@ TEST(HeatPumpAirToWaterPlacement, NonNodeNonSplitterTargetIsRejected) { EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Heating, boiler)); EXPECT_FALSE(heatPump.heatingLoop()); } + +TEST(HeatPumpAirToWaterPlacement, ModeFindsItsWrapper) { + Model model; + HeatPumpAirToWater heatPump = makeHeatPumpWithBothModes(model); + + auto heatingWrapper = heatPumpAirToWaterForMode(heatPump.heatingOperationMode().get()); + ASSERT_TRUE(heatingWrapper); + EXPECT_EQ(heatPump.handle(), heatingWrapper->handle()); + + auto coolingWrapper = heatPumpAirToWaterForMode(heatPump.coolingOperationMode().get()); + ASSERT_TRUE(coolingWrapper); + EXPECT_EQ(heatPump.handle(), coolingWrapper->handle()); + + // The wrapper itself, an orphaned mode, and unrelated objects have no wrapper + EXPECT_FALSE(heatPumpAirToWaterForMode(heatPump)); + HeatPumpAirToWaterHeating orphan(model); + EXPECT_FALSE(heatPumpAirToWaterForMode(orphan)); + BoilerHotWater boiler(model); + EXPECT_FALSE(heatPumpAirToWaterForMode(boiler)); +} + +TEST(HeatPumpAirToWaterPlacement, RemovingFirstModeDisconnectsItFromItsLoopOnly) { + Model model; + PlantLoop hotWaterLoop(model); + PlantLoop chilledWaterLoop(model); + HeatPumpAirToWater heatPump = makeHeatPumpWithBothModes(model); + HeatPumpAirToWaterHeating heating = heatPump.heatingOperationMode().get(); + HeatPumpAirToWaterCooling cooling = heatPump.coolingOperationMode().get(); + ASSERT_TRUE(hotWaterLoop.addSupplyBranchForComponent(heating)); + ASSERT_TRUE(chilledWaterLoop.addSupplyBranchForComponent(cooling)); + + EXPECT_TRUE(removeHeatPumpAirToWaterModeFromLoop(heating)); + EXPECT_FALSE(heating.plantLoop()); + EXPECT_TRUE(cooling.plantLoop()); + // The mode stays in the model, still attached to its wrapper + ASSERT_TRUE(heatPump.heatingOperationMode()); + EXPECT_EQ(heating.handle(), heatPump.heatingOperationMode()->handle()); + + // Anything else is left for the normal removal + BoilerHotWater boiler(model); + EXPECT_FALSE(removeHeatPumpAirToWaterModeFromLoop(boiler)); + EXPECT_FALSE(removeHeatPumpAirToWaterModeFromLoop(heatPump)); + EXPECT_FALSE(boiler.handle().isNull()); + EXPECT_FALSE(heatPump.handle().isNull()); +} + +TEST(HeatPumpAirToWaterPlacement, RemovingLastModeOnALoopRemovesTheWholeUnit) { + Model model; + PlantLoop hotWaterLoop(model); + PlantLoop chilledWaterLoop(model); + HeatPumpAirToWater heatPump = makeHeatPumpWithBothModes(model); + HeatPumpAirToWaterHeating heating = heatPump.heatingOperationMode().get(); + HeatPumpAirToWaterCooling cooling = heatPump.coolingOperationMode().get(); + ASSERT_TRUE(heating.addSpeed(HeatPumpAirToWaterHeatingSpeedData(model))); + ASSERT_TRUE(hotWaterLoop.addSupplyBranchForComponent(heating)); + ASSERT_TRUE(chilledWaterLoop.addSupplyBranchForComponent(cooling)); + + EXPECT_TRUE(removeHeatPumpAirToWaterModeFromLoop(cooling)); + EXPECT_FALSE(heatPump.handle().isNull()); + EXPECT_TRUE(removeHeatPumpAirToWaterModeFromLoop(heating)); + + EXPECT_TRUE(heatPump.handle().isNull()); + EXPECT_TRUE(heating.handle().isNull()); + EXPECT_TRUE(cooling.handle().isNull()); + EXPECT_TRUE(model.getConcreteModelObjects().empty()); + EXPECT_FALSE(hotWaterLoop.handle().isNull()); + EXPECT_FALSE(chilledWaterLoop.handle().isNull()); +} + +TEST(HeatPumpAirToWaterPlacement, RemovingOnlyPlacedModeRemovesTheWholeUnit) { + Model model; + PlantLoop hotWaterLoop(model); + HeatPumpAirToWater heatPump = makeHeatPumpWithBothModes(model); + HeatPumpAirToWaterHeating heating = heatPump.heatingOperationMode().get(); + ASSERT_TRUE(hotWaterLoop.addSupplyBranchForComponent(heating)); + + EXPECT_TRUE(removeHeatPumpAirToWaterModeFromLoop(heating)); + EXPECT_TRUE(heatPump.handle().isNull()); + EXPECT_TRUE(model.getConcreteModelObjects().empty()); +} diff --git a/translations/OpenStudioApp_ar.ts b/translations/OpenStudioApp_ar.ts index 8923e166e..19d5cbddc 100644 --- a/translations/OpenStudioApp_ar.ts +++ b/translations/OpenStudioApp_ar.ts @@ -25633,16 +25633,6 @@ If you would like to see the OpenStudioApplication translated in your language o Heat Pump - Air to Water مضخة حرارية - هواء إلى ماء - - - Heat Pump - Air to Water - Heating Mode - مضخة حرارية - هواء إلى ماء - وضع التدفئة - - - - Heat Pump - Air to Water - Cooling Mode - مضخة حرارية - هواء إلى ماء - وضع التبريد - diff --git a/translations/OpenStudioApp_ca.ts b/translations/OpenStudioApp_ca.ts index 53124a444..ec64b0767 100644 --- a/translations/OpenStudioApp_ca.ts +++ b/translations/OpenStudioApp_ca.ts @@ -25705,16 +25705,6 @@ Si voleu que OpeStudioApplication estigui a la vostra llengua, esperem la vostra Heat Pump - Air to Water Bomba de Calor - Aire a Aigua - - - Heat Pump - Air to Water - Heating Mode - Bomba de Calor - Aire a Aigua - Mode Calefacció - - - - Heat Pump - Air to Water - Cooling Mode - Bomba de Calor - Aire a Aigua - Mode Refrigeració - diff --git a/translations/OpenStudioApp_de.ts b/translations/OpenStudioApp_de.ts index bae665156..d8d87d04a 100644 --- a/translations/OpenStudioApp_de.ts +++ b/translations/OpenStudioApp_de.ts @@ -25625,16 +25625,6 @@ Wenn Sie möchten, dass die OpenStudio-Applikation in die Sprache Ihrer Wahl üb Heat Pump - Air to Water Wärmepumpe - Luft-Wasser - - - Heat Pump - Air to Water - Heating Mode - Wärmepumpe - Luft-Wasser - Heizbetrieb - - - - Heat Pump - Air to Water - Cooling Mode - Wärmepumpe - Luft-Wasser - Kühlbetrieb - diff --git a/translations/OpenStudioApp_el.ts b/translations/OpenStudioApp_el.ts index 74af5921d..308f745d0 100644 --- a/translations/OpenStudioApp_el.ts +++ b/translations/OpenStudioApp_el.ts @@ -25600,16 +25600,6 @@ If you would like to see the OpenStudioApplication translated in your language o Heat Pump - Air to Water Αντλία Θερμότητας - Αέρα-Νερού - - - Heat Pump - Air to Water - Heating Mode - Αντλία Θερμότητας - Αέρα-Νερού - Λειτουργία Θέρμανσης - - - - Heat Pump - Air to Water - Cooling Mode - Αντλία Θερμότητας - Αέρα-Νερού - Λειτουργία Ψύξης - diff --git a/translations/OpenStudioApp_es.ts b/translations/OpenStudioApp_es.ts index 11fe4d3bc..cf7b36115 100644 --- a/translations/OpenStudioApp_es.ts +++ b/translations/OpenStudioApp_es.ts @@ -25618,16 +25618,6 @@ Si le gustaría ver la AplicaciónOpenStudio traducido a algun otro lenguaje, le Heat Pump - Air to Water Bomba de Calor - Aire a Agua - - - Heat Pump - Air to Water - Heating Mode - Bomba de Calor - Aire a Agua - Modo Calefacción - - - - Heat Pump - Air to Water - Cooling Mode - Bomba de Calor - Aire a Agua - Modo Refrigeración - diff --git a/translations/OpenStudioApp_fa.ts b/translations/OpenStudioApp_fa.ts index bf033d3ae..27c9b711b 100644 --- a/translations/OpenStudioApp_fa.ts +++ b/translations/OpenStudioApp_fa.ts @@ -25591,16 +25591,6 @@ If you would like to see the OpenStudioApplication translated in your language o Heat Pump - Air to Water پمپ حرارتی - هوا به آب - - - Heat Pump - Air to Water - Heating Mode - پمپ حرارتی - هوا به آب - حالت گرمایش - - - - Heat Pump - Air to Water - Cooling Mode - پمپ حرارتی - هوا به آب - حالت سرمایش - diff --git a/translations/OpenStudioApp_fr.ts b/translations/OpenStudioApp_fr.ts index f655c11ec..fcf1e27a9 100644 --- a/translations/OpenStudioApp_fr.ts +++ b/translations/OpenStudioApp_fr.ts @@ -25610,16 +25610,6 @@ Si vous voulez voir l'Application OpenStudio traduite dans la langue de vot Heat Pump - Air to Water Pompe à chaleur - Air vers eau - - - Heat Pump - Air to Water - Heating Mode - Pompe à chaleur - Air vers eau - Mode chauffage - - - - Heat Pump - Air to Water - Cooling Mode - Pompe à chaleur - Air vers eau - Mode refroidissement - diff --git a/translations/OpenStudioApp_he.ts b/translations/OpenStudioApp_he.ts index 59e480b6d..d85d2342e 100644 --- a/translations/OpenStudioApp_he.ts +++ b/translations/OpenStudioApp_he.ts @@ -25716,16 +25716,6 @@ If you would like to see the OpenStudioApplication translated in your language o Heat Pump - Air to Water משאבת חום - אוויר למים - - - Heat Pump - Air to Water - Heating Mode - משאבת חום - אוויר למים - מצב חימום - - - - Heat Pump - Air to Water - Cooling Mode - משאבת חום - אוויר למים - מצב קירור - diff --git a/translations/OpenStudioApp_hi.ts b/translations/OpenStudioApp_hi.ts index 657eeb6b7..50ee98c58 100644 --- a/translations/OpenStudioApp_hi.ts +++ b/translations/OpenStudioApp_hi.ts @@ -26086,16 +26086,6 @@ However, if a more concise label is preferred for UI display: Heat Pump - Air to Water हीट पंप - वायु से जल - - - Heat Pump - Air to Water - Heating Mode - हीट पंप - वायु से जल - हीटिंग मोड - - - - Heat Pump - Air to Water - Cooling Mode - हीट पंप - वायु से जल - शीतलन मोड - diff --git a/translations/OpenStudioApp_id.ts b/translations/OpenStudioApp_id.ts index de4d90d07..de796ef16 100644 --- a/translations/OpenStudioApp_id.ts +++ b/translations/OpenStudioApp_id.ts @@ -25647,16 +25647,6 @@ Jika Anda ingin melihat OpenStudio Application diterjemahkan ke bahasa pilihan A Heat Pump - Air to Water Pompa Panas - Udara ke Air - - - Heat Pump - Air to Water - Heating Mode - Pompa Panas - Udara ke Air - Mode Pemanasan - - - - Heat Pump - Air to Water - Cooling Mode - Pompa Panas - Udara ke Air - Mode Pendinginan - diff --git a/translations/OpenStudioApp_it.ts b/translations/OpenStudioApp_it.ts index 2a5daf57c..d5464a2b4 100644 --- a/translations/OpenStudioApp_it.ts +++ b/translations/OpenStudioApp_it.ts @@ -25597,16 +25597,6 @@ Se vuoi vedere OpenStudioApplication tradotto nel tuo linguaggio preferito, appr Heat Pump - Air to Water Pompa di Calore - Aria-Acqua - - - Heat Pump - Air to Water - Heating Mode - Pompa di Calore - Aria-Acqua - Modalità Riscaldamento - - - - Heat Pump - Air to Water - Cooling Mode - Pompa di Calore - Aria-Acqua - Modalità Raffreddamento - diff --git a/translations/OpenStudioApp_ja.ts b/translations/OpenStudioApp_ja.ts index 54df2b175..7444e029d 100644 --- a/translations/OpenStudioApp_ja.ts +++ b/translations/OpenStudioApp_ja.ts @@ -25609,16 +25609,6 @@ OpenStudio の日本語ローカライゼーションでは **無熱量材料** Heat Pump - Air to Water ヒートポンプ - 空気対水 - - - Heat Pump - Air to Water - Heating Mode - ヒートポンプ - 空気対水 - 暖房モード - - - - Heat Pump - Air to Water - Cooling Mode - ヒートポンプ - 空気対水 - 冷房モード - diff --git a/translations/OpenStudioApp_ko.ts b/translations/OpenStudioApp_ko.ts index 033c8a03d..c806b1adf 100644 --- a/translations/OpenStudioApp_ko.ts +++ b/translations/OpenStudioApp_ko.ts @@ -25706,16 +25706,6 @@ OpenStudio Application이 선택하신 언어로 번역되기를 원하신다면 Heat Pump - Air to Water 히트펌프 - 공기-물 - - - Heat Pump - Air to Water - Heating Mode - 히트펌프 - 공기-물 - 난방 모드 - - - - Heat Pump - Air to Water - Cooling Mode - 히트펌프 - 공기-물 - 냉방 모드 - diff --git a/translations/OpenStudioApp_pl.ts b/translations/OpenStudioApp_pl.ts index a0a5cc764..11321ce0a 100644 --- a/translations/OpenStudioApp_pl.ts +++ b/translations/OpenStudioApp_pl.ts @@ -25621,16 +25621,6 @@ Jeśli chcesz zobaczyć aplikację OpenStudio przetłumaczoną na wybrany przez Heat Pump - Air to Water Pompa ciepła - Powietrze-Woda - - - Heat Pump - Air to Water - Heating Mode - Pompa ciepła - Powietrze-Woda - Tryb ogrzewania - - - - Heat Pump - Air to Water - Cooling Mode - Pompa ciepła - Powietrze-Woda - Tryb chłodzenia - diff --git a/translations/OpenStudioApp_pt.ts b/translations/OpenStudioApp_pt.ts index dd9e62ad1..00c240db5 100644 --- a/translations/OpenStudioApp_pt.ts +++ b/translations/OpenStudioApp_pt.ts @@ -25620,16 +25620,6 @@ Se gostaria de ver o OpenStudio Application traduzido para o seu idioma preferid Heat Pump - Air to Water Bomba de Calor - Ar para Água - - - Heat Pump - Air to Water - Heating Mode - Bomba de Calor - Ar para Água - Modo Aquecimento - - - - Heat Pump - Air to Water - Cooling Mode - Bomba de Calor - Ar para Água - Modo Resfriamento - diff --git a/translations/OpenStudioApp_tr.ts b/translations/OpenStudioApp_tr.ts index 4963e5981..177b2f7e2 100644 --- a/translations/OpenStudioApp_tr.ts +++ b/translations/OpenStudioApp_tr.ts @@ -25649,16 +25649,6 @@ OpenStudio Application'ın seçtiğiniz dilinize çevrilmiş halini görmek iste Heat Pump - Air to Water Isı Pompası - Havadan Suya - - - Heat Pump - Air to Water - Heating Mode - Isı Pompası - Havadan Suya - Isıtma Modu - - - - Heat Pump - Air to Water - Cooling Mode - Isı Pompası - Havadan Suya - Soğutma Modu - diff --git a/translations/OpenStudioApp_vi.ts b/translations/OpenStudioApp_vi.ts index fff06b769..0f3b12318 100644 --- a/translations/OpenStudioApp_vi.ts +++ b/translations/OpenStudioApp_vi.ts @@ -25665,16 +25665,6 @@ Nếu bạn muốn thấy OpenStudioApplication được dịch sang ngôn ngữ Heat Pump - Air to Water Bơm Nhiệt - Không Khí sang Nước - - - Heat Pump - Air to Water - Heating Mode - Bơm Nhiệt - Không Khí sang Nước - Chế Độ Sưởi - - - - Heat Pump - Air to Water - Cooling Mode - Bơm Nhiệt - Không Khí sang Nước - Chế Độ Làm Lạnh - diff --git a/translations/OpenStudioApp_zh_CN.ts b/translations/OpenStudioApp_zh_CN.ts index 6611ce4c3..96c2c04b2 100644 --- a/translations/OpenStudioApp_zh_CN.ts +++ b/translations/OpenStudioApp_zh_CN.ts @@ -25647,16 +25647,6 @@ If you would like to see the OpenStudioApplication translated in your language o Heat Pump - Air to Water 热泵 - 空气对水 - - - Heat Pump - Air to Water - Heating Mode - 热泵 - 空气对水 - 供热模式 - - - - Heat Pump - Air to Water - Cooling Mode - 热泵 - 空气对水 - 供冷模式 - From db185d06e98b618cc8155aff06b97618c11b549c Mon Sep 17 00:00:00 2001 From: Ski90Moo Date: Tue, 27 Oct 2026 13:36:42 -0700 Subject: [PATCH 3/3] Address review: grouping, IddObjectType lookup, inspector, curves, icons - Move Central Heat Pump System into the Plant Loop Heat Pumps library category and drop the separate category (and its translations) - Replace HeatPumpAirToWaterMode with HeatPumpAirToWaterType { Wrapper, Heating, Cooling } and look it up by IddObjectType, so non air-to-water objects skip the wrapper lookup - Inspector for an air-to-water mode shows the wrapper, the selected mode, then the other mode - Library HeatPump:AirToWater uses the speed 1 heating and cooling curves from EnergyPlus PlantLoopHeatPump_EIR_AirSource_and_AWHP.idf and the EnergyPlus cooling rating defaults (30 C air, 8 C water); the SDK defaults gave the cooling mode heating values (NatLabRockies/OpenStudio#5675) - Library air-source HeatPump:PlantLoop:EIR units use the capacity and EIR curves from PlantLoopHeatPump_EIR_AirSource_Hospital_wSixPipeHeatRecovery.idf instead of flat curves - Add f(x) to the water-to-water equation fit icons - Add the SVG sources for the Plant Loop Heat Pump icons Co-Authored-By: Claude Opus 5.5 --- .../Resources/default/hvac_library.osm | 164 +++++++++--------- src/openstudio_lib/HVACSystemsController.cpp | 10 +- src/openstudio_lib/InspectorView.cpp | 21 ++- src/openstudio_lib/InspectorView.hpp | 2 +- .../MainRightColumnController.cpp | 3 +- ...tpump_watertowater_equationfit_cooling.png | Bin 3811 -> 4395 bytes ...mp_watertowater_equationfit_cooling@2x.png | Bin 8152 -> 9608 bytes ...tpump_watertowater_equationfit_heating.png | Bin 3659 -> 4209 bytes ...mp_watertowater_equationfit_heating@2x.png | Bin 7213 -> 8692 bytes ...tpump_watertowater_equationfit_cooling.png | Bin 891 -> 1033 bytes ...mp_watertowater_equationfit_cooling@2x.png | Bin 1673 -> 2004 bytes ...tpump_watertowater_equationfit_heating.png | Bin 888 -> 1017 bytes ...mp_watertowater_equationfit_heating@2x.png | Bin 1675 -> 1999 bytes src/openstudio_lib/images/svg/README.md | 23 +++ src/openstudio_lib/images/svg/export.html | 2 + .../images/svg/heatpump_airtowater.svg | 28 +++ .../heatpump_airtowater_fuelfired_cooling.svg | 24 +++ ...pump_airtowater_fuelfired_cooling_mini.svg | 10 ++ .../heatpump_airtowater_fuelfired_heating.svg | 15 ++ ...pump_airtowater_fuelfired_heating_mini.svg | 10 ++ .../images/svg/heatpump_airtowater_mini.svg | 15 ++ .../svg/heatpump_plantloop_eir_cooling.svg | 23 +++ .../heatpump_plantloop_eir_cooling_mini.svg | 12 ++ .../svg/heatpump_plantloop_eir_heating.svg | 14 ++ .../heatpump_plantloop_eir_heating_mini.svg | 12 ++ ...tpump_watertowater_equationfit_cooling.svg | 19 ++ ..._watertowater_equationfit_cooling_mini.svg | 9 + ...tpump_watertowater_equationfit_heating.svg | 10 ++ ..._watertowater_equationfit_heating_mini.svg | 9 + src/utilities/HeatPumpAirToWaterPlacement.cpp | 49 ++++-- src/utilities/HeatPumpAirToWaterPlacement.hpp | 24 ++- .../HeatPumpAirToWaterPlacement_GTest.cpp | 41 ++++- translations/OpenStudioApp_ar.ts | 5 - translations/OpenStudioApp_ca.ts | 5 - translations/OpenStudioApp_de.ts | 5 - translations/OpenStudioApp_el.ts | 5 - translations/OpenStudioApp_es.ts | 5 - translations/OpenStudioApp_fa.ts | 5 - translations/OpenStudioApp_fr.ts | 5 - translations/OpenStudioApp_he.ts | 5 - translations/OpenStudioApp_hi.ts | 5 - translations/OpenStudioApp_id.ts | 5 - translations/OpenStudioApp_it.ts | 5 - translations/OpenStudioApp_ja.ts | 5 - translations/OpenStudioApp_ko.ts | 5 - translations/OpenStudioApp_pl.ts | 5 - translations/OpenStudioApp_pt.ts | 5 - translations/OpenStudioApp_tr.ts | 5 - translations/OpenStudioApp_vi.ts | 5 - translations/OpenStudioApp_zh_CN.ts | 5 - 50 files changed, 424 insertions(+), 215 deletions(-) create mode 100644 src/openstudio_lib/images/svg/README.md create mode 100644 src/openstudio_lib/images/svg/export.html create mode 100644 src/openstudio_lib/images/svg/heatpump_airtowater.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_cooling.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_cooling_mini.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_heating.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_heating_mini.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_airtowater_mini.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_plantloop_eir_cooling.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_plantloop_eir_cooling_mini.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_plantloop_eir_heating.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_plantloop_eir_heating_mini.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_cooling.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_cooling_mini.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_heating.svg create mode 100644 src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_heating_mini.svg diff --git a/src/openstudio_app/Resources/default/hvac_library.osm b/src/openstudio_app/Resources/default/hvac_library.osm index 7480a5f75..e4e09c195 100644 --- a/src/openstudio_app/Resources/default/hvac_library.osm +++ b/src/openstudio_app/Resources/default/hvac_library.osm @@ -14282,73 +14282,73 @@ OS:EvaporativeCooler:Direct:ResearchSpecial, OS:Curve:Biquadratic, {880a8b14-5973-4220-9065-e36b00b2f3ae}, !- Handle - Curve Biquadratic 1, !- Name - 1, !- Coefficient1 Constant - 0, !- Coefficient2 x - 0, !- Coefficient3 x**2 - 0, !- Coefficient4 y - 0, !- Coefficient5 y**2 - 0, !- Coefficient6 x*y - 5, !- Minimum Value of x - 10, !- Maximum Value of x - 24, !- Minimum Value of y - 35, !- Maximum Value of y + Heat Pump Plant Loop EIR Heating - Air Source HeatCapCurveFuncTemp, !- Name + 0.794900878202383, !- Coefficient1 Constant + 0.00388524034840032, !- Coefficient2 x + -5.75169230965453e-05, !- Coefficient3 x**2 + 0.0278109488428528, !- Coefficient4 y + 0.000318168, !- Coefficient5 y**2 + -0.000130572089253355, !- Coefficient6 x*y + 15, !- Minimum Value of x + 70, !- Maximum Value of x + -17, !- Minimum Value of y + 37.22, !- Maximum Value of y , !- Minimum Curve Output - , !- Maximum Curve Output + 1.55, !- Maximum Curve Output Temperature, !- Input Unit Type for X Temperature; !- Input Unit Type for Y OS:Curve:Biquadratic, {5343bf17-0e7c-43ab-8fee-3cf0d932718f}, !- Handle - Curve Biquadratic 2, !- Name - 1, !- Coefficient1 Constant - 0, !- Coefficient2 x - 0, !- Coefficient3 x**2 - 0, !- Coefficient4 y - 0, !- Coefficient5 y**2 - 0, !- Coefficient6 x*y - 5, !- Minimum Value of x - 10, !- Maximum Value of x - 24, !- Minimum Value of y - 35, !- Maximum Value of y - , !- Minimum Curve Output - , !- Maximum Curve Output + Heat Pump Plant Loop EIR Heating - Air Source HeatEIRCurveFuncTemp, !- Name + 0.530730392560108, !- Coefficient1 Constant + 0.00655164780603528, !- Coefficient2 x + 0.000263599226028026, !- Coefficient3 x**2 + -0.03620668194737, !- Coefficient4 y + 0.00126617163409192, !- Coefficient5 y**2 + -0.000791224057761721, !- Coefficient6 x*y + 15, !- Minimum Value of x + 70, !- Maximum Value of x + -17, !- Minimum Value of y + 37.22, !- Maximum Value of y + 0.4, !- Minimum Curve Output + 1.48, !- Maximum Curve Output Temperature, !- Input Unit Type for X Temperature; !- Input Unit Type for Y OS:Curve:Biquadratic, {73bde3ba-8475-4566-a91f-11deaf1a99c5}, !- Handle - Curve Biquadratic 3, !- Name - 1, !- Coefficient1 Constant - 0, !- Coefficient2 x - 0, !- Coefficient3 x**2 - 0, !- Coefficient4 y - 0, !- Coefficient5 y**2 - 0, !- Coefficient6 x*y - 5, !- Minimum Value of x - 10, !- Maximum Value of x - 24, !- Minimum Value of y - 35, !- Maximum Value of y + Heat Pump Plant Loop EIR Cooling - Air Source CoolCapCurveFuncTemp, !- Name + 1.06722728893252, !- Coefficient1 Constant + 0.0460678063570057, !- Coefficient2 x + 0.00034604993757372, !- Coefficient3 x**2 + -0.0069704934525177, !- Coefficient4 y + -2.88618548923695e-05, !- Coefficient5 y**2 + -0.000475762640861958, !- Coefficient6 x*y + 2, !- Minimum Value of x + 20, !- Maximum Value of x + 4.2, !- Minimum Value of y + 37, !- Maximum Value of y , !- Minimum Curve Output - , !- Maximum Curve Output + 1.55, !- Maximum Curve Output Temperature, !- Input Unit Type for X Temperature; !- Input Unit Type for Y OS:Curve:Biquadratic, {85e04dd3-87e0-41fc-bb91-32241c07b021}, !- Handle - Curve Biquadratic 4, !- Name - 1, !- Coefficient1 Constant - 0, !- Coefficient2 x - 0, !- Coefficient3 x**2 - 0, !- Coefficient4 y - 0, !- Coefficient5 y**2 - 0, !- Coefficient6 x*y - 5, !- Minimum Value of x - 10, !- Maximum Value of x - 24, !- Minimum Value of y - 35, !- Maximum Value of y - , !- Minimum Curve Output - , !- Maximum Curve Output + Heat Pump Plant Loop EIR Cooling - Air Source CoolEIRCurveFuncTemp, !- Name + 0.440305821838175, !- Coefficient1 Constant + -0.0241323110030793, !- Coefficient2 x + 0.000537914626055751, !- Coefficient3 x**2 + 0.0118716162533228, !- Coefficient4 y + 0.000305785618883187, !- Coefficient5 y**2 + -0.000617329632749052, !- Coefficient6 x*y + 2, !- Minimum Value of x + 20, !- Maximum Value of x + 4.2, !- Minimum Value of y + 37, !- Maximum Value of y + 0.4, !- Minimum Curve Output + 1.48, !- Maximum Curve Output Temperature, !- Input Unit Type for X Temperature; !- Input Unit Type for Y @@ -14426,18 +14426,18 @@ OS:Curve:Biquadratic, OS:Curve:Biquadratic, {fcd1f27c-8baf-46d0-9fd6-047b8e41d830}, !- Handle - Heat Pump Air To Water Cooling Speed Data 1 CapCurveFuncTempHT, !- Name - 0.885, !- Coefficient1 Constant - -0.0004, !- Coefficient2 x - 0.00019, !- Coefficient3 x**2 - 0.0202, !- Coefficient4 y - -0.0096, !- Coefficient5 y**2 - 0.00058, !- Coefficient6 x*y - 30, !- Minimum Value of x - 50, !- Maximum Value of x - -7, !- Minimum Value of y - 20, !- Maximum Value of y - 0.5, !- Minimum Curve Output + Heat Pump Air To Water Cooling Speed Data 1 CapCurveFuncTempCL, !- Name + 0.9, !- Coefficient1 Constant + -0.00038, !- Coefficient2 x + -0.00042, !- Coefficient3 x**2 + -0.0102, !- Coefficient4 y + 0.0225, !- Coefficient5 y**2 + -0.00021, !- Coefficient6 x*y + 5, !- Minimum Value of x + 15, !- Maximum Value of x + 15, !- Minimum Value of y + 45, !- Maximum Value of y + 0.7, !- Minimum Curve Output 1.3, !- Maximum Curve Output Temperature, !- Input Unit Type for X Temperature, !- Input Unit Type for Y @@ -14445,19 +14445,19 @@ OS:Curve:Biquadratic, OS:Curve:Biquadratic, {b375bf3b-bed2-4ff8-8fa6-39d157f4b1f9}, !- Handle - Heat Pump Air To Water Cooling Speed Data 1 EIRCurveFuncTempHT, !- Name - 1.055, !- Coefficient1 Constant - 0.00035, !- Coefficient2 x - -0.00027, !- Coefficient3 x**2 - -0.0108, !- Coefficient4 y - 0.0145, !- Coefficient5 y**2 - -0.00023, !- Coefficient6 x*y - 30, !- Minimum Value of x - 50, !- Maximum Value of x - -7, !- Minimum Value of y - 20, !- Maximum Value of y + Heat Pump Air To Water Cooling Speed Data 1 EIRCurveFuncTempCL, !- Name + 0.98, !- Coefficient1 Constant + 0.00021, !- Coefficient2 x + 0.00019, !- Coefficient3 x**2 + 0.0068, !- Coefficient4 y + -0.0085, !- Coefficient5 y**2 + 0.000158, !- Coefficient6 x*y + 5, !- Minimum Value of x + 15, !- Maximum Value of x + 15, !- Minimum Value of y + 45, !- Maximum Value of y 0.7, !- Minimum Curve Output - 1.5, !- Maximum Curve Output + 1.3, !- Maximum Curve Output Temperature, !- Input Unit Type for X Temperature, !- Input Unit Type for Y Dimensionless; !- Output Unit Type @@ -14465,12 +14465,12 @@ OS:Curve:Biquadratic, OS:Curve:Biquadratic, {0028ca86-0930-4c3c-9108-0467338ddf58}, !- Handle Heat Pump Air To Water Heating Speed Data 1 CapCurveFuncTempHT, !- Name - 0.885, !- Coefficient1 Constant - -0.0004, !- Coefficient2 x - 0.00019, !- Coefficient3 x**2 - 0.0202, !- Coefficient4 y - -0.0096, !- Coefficient5 y**2 - 0.00058, !- Coefficient6 x*y + 0.899, !- Coefficient1 Constant + -0.00045, !- Coefficient2 x + 0.00021, !- Coefficient3 x**2 + 0.0185, !- Coefficient4 y + -0.0108, !- Coefficient5 y**2 + 0.000617, !- Coefficient6 x*y 30, !- Minimum Value of x 50, !- Maximum Value of x -7, !- Minimum Value of y @@ -14588,9 +14588,9 @@ OS:HeatPump:AirToWater:Cooling, {a53c2519-515f-4bca-9625-c9880b09de02}, !- Handle Heat Pump Air To Water Cooling Mode, !- Name {9f54092d-a4a8-41b8-a381-c4c332ecb843}, !- Availability Schedule Name - 8, !- Rated Inlet Air Temperature {C} + 30, !- Rated Inlet Air Temperature {C} autosize, !- Rated Air Flow Rate {m3/s} - 40, !- Rated Leaving Water Temperature {C} + 8, !- Rated Leaving Water Temperature {C} autosize, !- Rated Water Flow Rate {m3/s} -30, !- Minimum Outdoor Air Temperature {C} 100, !- Maximum Outdoor Air Temperature {C} diff --git a/src/openstudio_lib/HVACSystemsController.cpp b/src/openstudio_lib/HVACSystemsController.cpp index 076634e8f..c0038c7aa 100644 --- a/src/openstudio_lib/HVACSystemsController.cpp +++ b/src/openstudio_lib/HVACSystemsController.cpp @@ -154,7 +154,7 @@ const QString VRF = "VRF"; namespace { // Asks which of a HeatPumpAirToWater's operation modes to place on `plantLoop`, preselecting the one // suggested by the loop's sizing type. Returns none if the user cancels. -boost::optional askHeatPumpAirToWaterMode(const model::PlantLoop& plantLoop, QWidget* parent) { +boost::optional askHeatPumpAirToWaterMode(const model::PlantLoop& plantLoop, QWidget* parent) { QMessageBox message(parent); message.setWindowTitle(QCoreApplication::translate("openstudio::HVACLayoutController", "Air to Water Heat Pump")); message.setText(QCoreApplication::translate("openstudio::HVACLayoutController", @@ -168,7 +168,7 @@ boost::optional askHeatPumpAirToWaterMode(const model::P message.addButton(QMessageBox::Cancel); const auto suggested = suggestedHeatPumpAirToWaterMode(plantLoop); - if (suggested && suggested.get() == HeatPumpAirToWaterMode::Cooling) { + if (suggested && suggested.get() == HeatPumpAirToWaterType::Cooling) { message.setDefaultButton(qobject_cast(coolingButton)); } else { message.setDefaultButton(qobject_cast(heatingButton)); @@ -176,10 +176,10 @@ boost::optional askHeatPumpAirToWaterMode(const model::P message.exec(); if (message.clickedButton() == heatingButton) { - return HeatPumpAirToWaterMode::Heating; + return HeatPumpAirToWaterType::Heating; } if (message.clickedButton() == coolingButton) { - return HeatPumpAirToWaterMode::Cooling; + return HeatPumpAirToWaterType::Cooling; } return boost::none; } @@ -595,7 +595,7 @@ void HVACLayoutController::addLibraryObjectToModelNode(const OSItemId& itemId, m if (boost::optional heatPump = object->optionalCast()) { // The wrapper can't be placed on a loop itself: one of its heating/cooling operation modes goes there instead if (boost::optional plant = comp.plantLoop()) { - boost::optional mode = askHeatPumpAirToWaterMode(plant.get(), m_hvacSystemsController->hvacSystemsView()); + boost::optional mode = askHeatPumpAirToWaterMode(plant.get(), m_hvacSystemsController->hvacSystemsView()); if (!mode) { if (remove) { object->remove(); diff --git a/src/openstudio_lib/InspectorView.cpp b/src/openstudio_lib/InspectorView.cpp index 581332995..6c0cdb500 100644 --- a/src/openstudio_lib/InspectorView.cpp +++ b/src/openstudio_lib/InspectorView.cpp @@ -76,6 +76,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -980,11 +984,24 @@ void HeatPumpAirToWaterModeInspectorView::layoutModelObject(model::ModelObject& m_gadgetsLayout->insertWidget(insertIndex++, gadget); }; - // The wrapper's own children are both operation modes, so hide them and show only the selected mode - if (boost::optional heatPump = heatPumpAirToWaterForMode(modelObject)) { + // The wrapper's own children are both operation modes, so hide them there and show the selected mode right + // under the wrapper, followed by the other mode + boost::optional heatPump = heatPumpAirToWaterForMode(modelObject); + if (heatPump) { addGadget(heatPump.get(), true); } addGadget(modelObject, false); + if (heatPump) { + boost::optional otherMode; + if (heatPumpAirToWaterType(modelObject) == HeatPumpAirToWaterType::Heating) { + otherMode = heatPump->coolingOperationMode(); + } else { + otherMode = heatPump->heatingOperationMode(); + } + if (otherMode) { + addGadget(otherMode.get(), false); + } + } m_emsActuatorView->layoutModelObject(modelObject); m_emsSensorView->layoutModelObject(modelObject); diff --git a/src/openstudio_lib/InspectorView.hpp b/src/openstudio_lib/InspectorView.hpp index 77ce8c1fb..04257ec3d 100644 --- a/src/openstudio_lib/InspectorView.hpp +++ b/src/openstudio_lib/InspectorView.hpp @@ -807,7 +807,7 @@ class ScheduleRulesetInspectorView : public BaseInspectorView }; // For a HeatPumpAirToWater heating or cooling operation mode: shows the owning HeatPumpAirToWater first, -// then the selected mode, since the two are edited as one piece of equipment +// then the selected mode, then the other mode, since all three are edited as one piece of equipment class HeatPumpAirToWaterModeInspectorView : public BaseInspectorView { Q_OBJECT; diff --git a/src/openstudio_lib/MainRightColumnController.cpp b/src/openstudio_lib/MainRightColumnController.cpp index 2c71a8d83..ab3492332 100644 --- a/src/openstudio_lib/MainRightColumnController.cpp +++ b/src/openstudio_lib/MainRightColumnController.cpp @@ -1179,6 +1179,7 @@ void MainRightColumnController::configureForHVACSystemsSubTab(int subTabID) { libraryWidget->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_FuelFired_Heating, tr("Heat Pump - Air to Water Fuel Fired - Heating")); libraryWidget->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater_FuelFired_Cooling, tr("Heat Pump - Air to Water Fuel Fired - Cooling")); libraryWidget->addModelObjectType(IddObjectType::OS_HeatPump_AirToWater, tr("Heat Pump - Air to Water")); + libraryWidget->addModelObjectType(IddObjectType::OS_CentralHeatPumpSystem, tr("Central Heat Pump System")); libraryWidget->addModelObjectCategoryPlaceholder(tr("Plant Loop Heat Pumps")); libraryWidget->addModelObjectType(IddObjectType::OS_HeatExchanger_FluidToFluid, tr("Heat Exchanger Fluid To Fluid")); libraryWidget->addModelObjectType(IddObjectType::OS_HeatExchanger_AirToAir_SensibleAndLatent, tr("Heat Exchanger Air To Air Sensible and Latent")); @@ -1220,8 +1221,6 @@ void MainRightColumnController::configureForHVACSystemsSubTab(int subTabID) { libraryWidget->addModelObjectType(IddObjectType::OS_CoolingTower_SingleSpeed, tr("Cooling Tower Single Speed")); libraryWidget->addModelObjectType(IddObjectType::OS_CoolingTower_VariableSpeed, tr("Cooling Tower Variable Speed")); libraryWidget->addModelObjectCategoryPlaceholder(tr("Cooling Towers")); - libraryWidget->addModelObjectType(IddObjectType::OS_CentralHeatPumpSystem, tr("Central Heat Pump System")); - libraryWidget->addModelObjectCategoryPlaceholder(tr("Central Heat Pump Systems")); libraryWidget->addModelObjectType(IddObjectType::OS_Chiller_Electric_EIR, tr("Chiller - Electric EIR")); libraryWidget->addModelObjectType(IddObjectType::OS_Chiller_Absorption_Indirect, tr("Chiller - Indirect Absorption")); libraryWidget->addModelObjectType(IddObjectType::OS_Chiller_Absorption, tr("Chiller - Absorption")); diff --git a/src/openstudio_lib/images/heatpump_watertowater_equationfit_cooling.png b/src/openstudio_lib/images/heatpump_watertowater_equationfit_cooling.png index d1885e9ff489c875c355206231c444dfd4701d1b..7ee07bcb4b9925c1a43b5c430689a3f461fa9a38 100644 GIT binary patch literal 4395 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 Bf?5Co literal 8152 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 diff --git a/src/openstudio_lib/images/heatpump_watertowater_equationfit_heating.png b/src/openstudio_lib/images/heatpump_watertowater_equationfit_heating.png index 26920a9914170aa5ec0fcbb7959cae76c38e05d2..1dd3b7dc03c27d500ad05becb720ce4e49555f41 100644 GIT binary patch literal 4209 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 Hu0mjf>Oe3j literal 3659 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 VD>J}3R`f3zs)||)b#m5W{{s*k^yB~l literal 7213 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 diff --git a/src/openstudio_lib/images/mini_icons/heatpump_watertowater_equationfit_cooling@2x.png b/src/openstudio_lib/images/mini_icons/heatpump_watertowater_equationfit_cooling@2x.png index 3f14e02848b3b5ff5c00e53b8a3b6210897b86fe..955e1f7ae9192b487ef25cf480f65dca9b3af5fe 100644 GIT binary patch delta 1991 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 diff --git a/src/openstudio_lib/images/mini_icons/heatpump_watertowater_equationfit_heating@2x.png b/src/openstudio_lib/images/mini_icons/heatpump_watertowater_equationfit_heating@2x.png index 4f68910c36b768620d430e6ae0f9df4771774cfb..50fbd11d449e810cbc9b7236a84dd9098a4e078b 100644 GIT binary patch delta 1986 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.svg` | `images/.png` (100 px) and `images/@2x.png` (200 px) | +| `_mini.svg` | `images/mini_icons/.png` (24 px) and `images/mini_icons/@2x.png` (48 px) | + +The air-to-water wrapper and its heating and cooling modes share `heatpump_airtowater`. + +## Exporting + +`export.html` draws one SVG at a given size on a transparent page. Screenshot it with headless Chrome, once per size: + +```sh +chrome --headless=new --hide-scrollbars --allow-file-access-from-files --default-background-color=00000000 \ + --window-size=200,200 --screenshot=heatpump_airtowater@2x.png \ + "file:////export.html?f=heatpump_airtowater.svg&s=200" +``` + +The f(x) labels on the water-to-water (equation fit) icons use the system's Georgia font. diff --git a/src/openstudio_lib/images/svg/export.html b/src/openstudio_lib/images/svg/export.html new file mode 100644 index 000000000..6e3bffea1 --- /dev/null +++ b/src/openstudio_lib/images/svg/export.html @@ -0,0 +1,2 @@ + + diff --git a/src/openstudio_lib/images/svg/heatpump_airtowater.svg b/src/openstudio_lib/images/svg/heatpump_airtowater.svg new file mode 100644 index 000000000..7059500f1 --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_airtowater.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_cooling.svg b/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_cooling.svg new file mode 100644 index 000000000..c839a6b0c --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_cooling.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_cooling_mini.svg b/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_cooling_mini.svg new file mode 100644 index 000000000..94e8c3714 --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_cooling_mini.svg @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_heating.svg b/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_heating.svg new file mode 100644 index 000000000..e2194355e --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_heating.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_heating_mini.svg b/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_heating_mini.svg new file mode 100644 index 000000000..0fa7b901d --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_airtowater_fuelfired_heating_mini.svg @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_airtowater_mini.svg b/src/openstudio_lib/images/svg/heatpump_airtowater_mini.svg new file mode 100644 index 000000000..7901d5f01 --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_airtowater_mini.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_plantloop_eir_cooling.svg b/src/openstudio_lib/images/svg/heatpump_plantloop_eir_cooling.svg new file mode 100644 index 000000000..513dee723 --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_plantloop_eir_cooling.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_plantloop_eir_cooling_mini.svg b/src/openstudio_lib/images/svg/heatpump_plantloop_eir_cooling_mini.svg new file mode 100644 index 000000000..692c86813 --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_plantloop_eir_cooling_mini.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_plantloop_eir_heating.svg b/src/openstudio_lib/images/svg/heatpump_plantloop_eir_heating.svg new file mode 100644 index 000000000..242d2b31e --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_plantloop_eir_heating.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_plantloop_eir_heating_mini.svg b/src/openstudio_lib/images/svg/heatpump_plantloop_eir_heating_mini.svg new file mode 100644 index 000000000..c56057f2f --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_plantloop_eir_heating_mini.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_cooling.svg b/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_cooling.svg new file mode 100644 index 000000000..c7d660bea --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_cooling.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + f(x) \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_cooling_mini.svg b/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_cooling_mini.svg new file mode 100644 index 000000000..b8e8cf8d3 --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_cooling_mini.svg @@ -0,0 +1,9 @@ + + + + + + + + + f(x) \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_heating.svg b/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_heating.svg new file mode 100644 index 000000000..27210f3b6 --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_heating.svg @@ -0,0 +1,10 @@ + + + + + + + + + + f(x) \ No newline at end of file diff --git a/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_heating_mini.svg b/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_heating_mini.svg new file mode 100644 index 000000000..dbd63ae75 --- /dev/null +++ b/src/openstudio_lib/images/svg/heatpump_watertowater_equationfit_heating_mini.svg @@ -0,0 +1,9 @@ + + + + + + + + + f(x) \ No newline at end of file diff --git a/src/utilities/HeatPumpAirToWaterPlacement.cpp b/src/utilities/HeatPumpAirToWaterPlacement.cpp index 1d8855f60..0ed0f7337 100644 --- a/src/utilities/HeatPumpAirToWaterPlacement.cpp +++ b/src/utilities/HeatPumpAirToWaterPlacement.cpp @@ -19,28 +19,44 @@ #include #include +#include namespace openstudio { -boost::optional suggestedHeatPumpAirToWaterMode(const model::PlantLoop& plantLoop) { +boost::optional heatPumpAirToWaterType(const model::ModelObject& modelObject) { + switch (modelObject.iddObjectType().value()) { + case IddObjectType::OS_HeatPump_AirToWater: + return HeatPumpAirToWaterType::Wrapper; + case IddObjectType::OS_HeatPump_AirToWater_Heating: + return HeatPumpAirToWaterType::Heating; + case IddObjectType::OS_HeatPump_AirToWater_Cooling: + return HeatPumpAirToWaterType::Cooling; + default: + return boost::none; + } +} + +boost::optional suggestedHeatPumpAirToWaterMode(const model::PlantLoop& plantLoop) { const std::string loopType = plantLoop.sizingPlant().loopType(); if (istringEqual(loopType, "Heating")) { - return HeatPumpAirToWaterMode::Heating; + return HeatPumpAirToWaterType::Heating; } if (istringEqual(loopType, "Cooling")) { - return HeatPumpAirToWaterMode::Cooling; + return HeatPumpAirToWaterType::Cooling; } return boost::none; } -bool addHeatPumpAirToWaterModeToLoop(const model::HeatPumpAirToWater& heatPump, HeatPumpAirToWaterMode mode, const model::HVACComponent& target) { +bool addHeatPumpAirToWaterModeToLoop(const model::HeatPumpAirToWater& heatPump, HeatPumpAirToWaterType mode, const model::HVACComponent& target) { boost::optional modeComponent; - if (mode == HeatPumpAirToWaterMode::Heating) { + if (mode == HeatPumpAirToWaterType::Heating) { if (auto heating = heatPump.heatingOperationMode()) { modeComponent = heating.get(); } - } else if (auto cooling = heatPump.coolingOperationMode()) { - modeComponent = cooling.get(); + } else if (mode == HeatPumpAirToWaterType::Cooling) { + if (auto cooling = heatPump.coolingOperationMode()) { + modeComponent = cooling.get(); + } } if (!modeComponent) { return false; @@ -62,11 +78,12 @@ bool addHeatPumpAirToWaterModeToLoop(const model::HeatPumpAirToWater& heatPump, } boost::optional heatPumpAirToWaterForMode(const model::ModelObject& modelObject) { - if (auto heating = modelObject.optionalCast()) { - return heating->heatPumpAirToWater(); + const boost::optional type = heatPumpAirToWaterType(modelObject); + if (type == HeatPumpAirToWaterType::Heating) { + return modelObject.cast().heatPumpAirToWater(); } - if (auto cooling = modelObject.optionalCast()) { - return cooling->heatPumpAirToWater(); + if (type == HeatPumpAirToWaterType::Cooling) { + return modelObject.cast().heatPumpAirToWater(); } return boost::none; } @@ -81,15 +98,15 @@ bool removeHeatPumpAirToWaterModeFromLoop(const model::ModelObject& modelObject) mode.removeFromLoop(); } - bool otherModeOnLoop = false; - if (modelObject.optionalCast()) { + boost::optional otherMode; + if (heatPumpAirToWaterType(modelObject) == HeatPumpAirToWaterType::Heating) { if (auto cooling = heatPump->coolingOperationMode()) { - otherModeOnLoop = cooling->loop().has_value(); + otherMode = cooling.get(); } } else if (auto heating = heatPump->heatingOperationMode()) { - otherModeOnLoop = heating->loop().has_value(); + otherMode = heating.get(); } - if (!otherModeOnLoop) { + if (!otherMode || !otherMode->loop()) { heatPump->remove(); } return true; diff --git a/src/utilities/HeatPumpAirToWaterPlacement.hpp b/src/utilities/HeatPumpAirToWaterPlacement.hpp index 196f37fd1..3ca2815ce 100644 --- a/src/utilities/HeatPumpAirToWaterPlacement.hpp +++ b/src/utilities/HeatPumpAirToWaterPlacement.hpp @@ -18,21 +18,27 @@ namespace openstudio { /// returns false): its heating and cooling operation modes are the StraightComponents that sit on /// the hot water and chilled water loops, and the wrapper is only forward translated through them. /// Dropping a wrapper onto a loop therefore means placing one of its modes there instead. -enum class HeatPumpAirToWaterMode +enum class HeatPumpAirToWaterType { + Wrapper, Heating, Cooling }; -/// The mode suggested by the loop's Sizing:Plant loop type ("Heating" or "Cooling"), or none for -/// any other loop type. Only a suggestion: a new PlantLoop defaults to "Heating" until its sizing -/// is edited, so an untouched chilled water loop also reports "Heating". -boost::optional suggestedHeatPumpAirToWaterMode(const model::PlantLoop& plantLoop); +/// Which of the three HeatPumpAirToWater object types `modelObject` is, or none for anything else. +/// Only compares the IddObjectType, so it is cheap enough to call on every object of a loop. +boost::optional heatPumpAirToWaterType(const model::ModelObject& modelObject); -/// Places the wrapper's `mode` operation mode on `target`, which is either a plant loop supply-side -/// Node or a plant loop supply-side Splitter (adding a new supply branch). Returns false, leaving the -/// model unchanged, if the wrapper has no such mode or the mode cannot be added at `target`. -bool addHeatPumpAirToWaterModeToLoop(const model::HeatPumpAirToWater& heatPump, HeatPumpAirToWaterMode mode, const model::HVACComponent& target); +/// The mode (Heating or Cooling) suggested by the loop's Sizing:Plant loop type, or none for any other +/// loop type. Only a suggestion: a new PlantLoop defaults to "Heating" until its sizing is edited, so an +/// untouched chilled water loop also reports "Heating". +boost::optional suggestedHeatPumpAirToWaterMode(const model::PlantLoop& plantLoop); + +/// Places the wrapper's `mode` (Heating or Cooling) operation mode on `target`, which is either a plant +/// loop supply-side Node or a plant loop supply-side Splitter (adding a new supply branch). Returns false, +/// leaving the model unchanged, if `mode` is Wrapper, the wrapper has no such mode, or the mode cannot be +/// added at `target`. +bool addHeatPumpAirToWaterModeToLoop(const model::HeatPumpAirToWater& heatPump, HeatPumpAirToWaterType mode, const model::HVACComponent& target); /// If `modelObject` is a HeatPumpAirToWater heating or cooling operation mode that belongs to a wrapper, /// returns that wrapper; otherwise none. diff --git a/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp b/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp index def3395c8..79ebdb0e2 100644 --- a/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp +++ b/src/utilities/test/HeatPumpAirToWaterPlacement_GTest.cpp @@ -48,12 +48,12 @@ TEST(HeatPumpAirToWaterPlacement, SuggestedModeFollowsSizingPlantLoopType) { // A new PlantLoop's Sizing:Plant defaults to "Heating" auto suggested = suggestedHeatPumpAirToWaterMode(plantLoop); ASSERT_TRUE(suggested); - EXPECT_EQ(HeatPumpAirToWaterMode::Heating, suggested.get()); + EXPECT_EQ(HeatPumpAirToWaterType::Heating, suggested.get()); ASSERT_TRUE(plantLoop.sizingPlant().setLoopType("Cooling")); suggested = suggestedHeatPumpAirToWaterMode(plantLoop); ASSERT_TRUE(suggested); - EXPECT_EQ(HeatPumpAirToWaterMode::Cooling, suggested.get()); + EXPECT_EQ(HeatPumpAirToWaterType::Cooling, suggested.get()); ASSERT_TRUE(plantLoop.sizingPlant().setLoopType("Condenser")); EXPECT_FALSE(suggestedHeatPumpAirToWaterMode(plantLoop)); @@ -73,13 +73,13 @@ TEST(HeatPumpAirToWaterPlacement, PlacesBothModesOfOneWrapperOnSeparateLoops) { EXPECT_NE(libraryHeatPump.heatingOperationMode()->handle(), heatPump.heatingOperationMode()->handle()); Node hotWaterNode = hotWaterLoop.supplyOutletNode(); - EXPECT_TRUE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Heating, hotWaterNode)); + EXPECT_TRUE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterType::Heating, hotWaterNode)); ASSERT_TRUE(heatPump.heatingLoop()); EXPECT_EQ(hotWaterLoop.handle(), heatPump.heatingLoop()->handle()); EXPECT_FALSE(heatPump.coolingLoop()); Splitter chilledWaterSplitter = chilledWaterLoop.supplySplitter(); - EXPECT_TRUE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Cooling, chilledWaterSplitter)); + EXPECT_TRUE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterType::Cooling, chilledWaterSplitter)); ASSERT_TRUE(heatPump.coolingLoop()); EXPECT_EQ(chilledWaterLoop.handle(), heatPump.coolingLoop()->handle()); @@ -101,7 +101,7 @@ TEST(HeatPumpAirToWaterPlacement, MissingModeIsRejected) { Node node = plantLoop.supplyOutletNode(); const auto supplyComponentCount = plantLoop.supplyComponents().size(); - EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Cooling, node)); + EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterType::Cooling, node)); EXPECT_EQ(supplyComponentCount, plantLoop.supplyComponents().size()); EXPECT_FALSE(heatPump.coolingLoop()); } @@ -112,10 +112,10 @@ TEST(HeatPumpAirToWaterPlacement, DemandSideIsRejected) { HeatPumpAirToWater heatPump = makeHeatPumpWithBothModes(model); Node demandNode = plantLoop.demandInletNode(); - EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Heating, demandNode)); + EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterType::Heating, demandNode)); Splitter demandSplitter = plantLoop.demandSplitter(); - EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Heating, demandSplitter)); + EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterType::Heating, demandSplitter)); EXPECT_FALSE(heatPump.heatingLoop()); } @@ -128,7 +128,7 @@ TEST(HeatPumpAirToWaterPlacement, NonNodeNonSplitterTargetIsRejected) { ASSERT_TRUE(boiler.addToNode(node)); HeatPumpAirToWater heatPump = makeHeatPumpWithBothModes(model); - EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterMode::Heating, boiler)); + EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterType::Heating, boiler)); EXPECT_FALSE(heatPump.heatingLoop()); } @@ -211,3 +211,28 @@ TEST(HeatPumpAirToWaterPlacement, RemovingOnlyPlacedModeRemovesTheWholeUnit) { EXPECT_TRUE(heatPump.handle().isNull()); EXPECT_TRUE(model.getConcreteModelObjects().empty()); } + +TEST(HeatPumpAirToWaterPlacement, TypeIsFoundFromIddObjectType) { + Model model; + HeatPumpAirToWater heatPump = makeHeatPumpWithBothModes(model); + HeatPumpAirToWaterHeating orphan(model); + BoilerHotWater boiler(model); + + EXPECT_TRUE(heatPumpAirToWaterType(heatPump) == HeatPumpAirToWaterType::Wrapper); + EXPECT_TRUE(heatPumpAirToWaterType(heatPump.heatingOperationMode().get()) == HeatPumpAirToWaterType::Heating); + EXPECT_TRUE(heatPumpAirToWaterType(heatPump.coolingOperationMode().get()) == HeatPumpAirToWaterType::Cooling); + // The type doesn't depend on the mode belonging to a wrapper + EXPECT_TRUE(heatPumpAirToWaterType(orphan) == HeatPumpAirToWaterType::Heating); + EXPECT_FALSE(heatPumpAirToWaterType(boiler)); +} + +TEST(HeatPumpAirToWaterPlacement, WrapperIsNotAModeToPlace) { + Model model; + PlantLoop plantLoop(model); + HeatPumpAirToWater heatPump = makeHeatPumpWithBothModes(model); + + EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterType::Wrapper, plantLoop.supplyOutletNode())); + EXPECT_FALSE(addHeatPumpAirToWaterModeToLoop(heatPump, HeatPumpAirToWaterType::Wrapper, plantLoop.supplySplitter())); + EXPECT_FALSE(heatPump.heatingLoop()); + EXPECT_FALSE(heatPump.coolingLoop()); +} diff --git a/translations/OpenStudioApp_ar.ts b/translations/OpenStudioApp_ar.ts index 19d5cbddc..a9be840c9 100644 --- a/translations/OpenStudioApp_ar.ts +++ b/translations/OpenStudioApp_ar.ts @@ -25426,11 +25426,6 @@ If you would like to see the OpenStudioApplication translated in your language o Cooling Towers أبراج التبريد - - - Central Heat Pump Systems - أنظمة مضخات الحرارة المركزية - Boilers diff --git a/translations/OpenStudioApp_ca.ts b/translations/OpenStudioApp_ca.ts index ec64b0767..75c0c44de 100644 --- a/translations/OpenStudioApp_ca.ts +++ b/translations/OpenStudioApp_ca.ts @@ -25498,11 +25498,6 @@ Si voleu que OpeStudioApplication estigui a la vostra llengua, esperem la vostra Cooling Towers Torres de refrigeració - - - Central Heat Pump Systems - Sistemes de Bomba de Calor Central - Boilers diff --git a/translations/OpenStudioApp_de.ts b/translations/OpenStudioApp_de.ts index d8d87d04a..5c84e207e 100644 --- a/translations/OpenStudioApp_de.ts +++ b/translations/OpenStudioApp_de.ts @@ -25418,11 +25418,6 @@ Wenn Sie möchten, dass die OpenStudio-Applikation in die Sprache Ihrer Wahl üb Cooling Towers Rückkühlwerke - - - Central Heat Pump Systems - Zentrale Wärmepumpensysteme - Boilers diff --git a/translations/OpenStudioApp_el.ts b/translations/OpenStudioApp_el.ts index 308f745d0..72fc62d07 100644 --- a/translations/OpenStudioApp_el.ts +++ b/translations/OpenStudioApp_el.ts @@ -25393,11 +25393,6 @@ If you would like to see the OpenStudioApplication translated in your language o Cooling Towers Πύργοι Ψύξης - - - Central Heat Pump Systems - Κεντρικά Συστήματα Αντλιών Θερμότητας - Boilers diff --git a/translations/OpenStudioApp_es.ts b/translations/OpenStudioApp_es.ts index cf7b36115..fc2103fda 100644 --- a/translations/OpenStudioApp_es.ts +++ b/translations/OpenStudioApp_es.ts @@ -25411,11 +25411,6 @@ Si le gustaría ver la AplicaciónOpenStudio traducido a algun otro lenguaje, le Cooling Towers Torres de Enfriamiento - - - Central Heat Pump Systems - Sistemas de Bomba de Calor Centralizada - Boilers diff --git a/translations/OpenStudioApp_fa.ts b/translations/OpenStudioApp_fa.ts index 27c9b711b..f1f69d22b 100644 --- a/translations/OpenStudioApp_fa.ts +++ b/translations/OpenStudioApp_fa.ts @@ -25384,11 +25384,6 @@ If you would like to see the OpenStudioApplication translated in your language o Cooling Towers برج‌های خنک‌کننده - - - Central Heat Pump Systems - سیستم‌های پمپ حرارتی مرکزی - Boilers diff --git a/translations/OpenStudioApp_fr.ts b/translations/OpenStudioApp_fr.ts index fcf1e27a9..d4265684b 100644 --- a/translations/OpenStudioApp_fr.ts +++ b/translations/OpenStudioApp_fr.ts @@ -25403,11 +25403,6 @@ Si vous voulez voir l'Application OpenStudio traduite dans la langue de vot Cooling Towers Tours de refroidissement - - - Central Heat Pump Systems - Systèmes de Pompes à Chaleur Centralisées - Boilers diff --git a/translations/OpenStudioApp_he.ts b/translations/OpenStudioApp_he.ts index d85d2342e..406e99e6f 100644 --- a/translations/OpenStudioApp_he.ts +++ b/translations/OpenStudioApp_he.ts @@ -25507,11 +25507,6 @@ If you would like to see the OpenStudioApplication translated in your language o Cooling Towers מגדלי קירור - - - Central Heat Pump Systems - מערכות משאבת חום מרכזיות - Boilers diff --git a/translations/OpenStudioApp_hi.ts b/translations/OpenStudioApp_hi.ts index 50ee98c58..e96141bf3 100644 --- a/translations/OpenStudioApp_hi.ts +++ b/translations/OpenStudioApp_hi.ts @@ -25867,11 +25867,6 @@ or more descriptively: Cooling Towers शीतलन टावर - - - Central Heat Pump Systems - केंद्रीय ताप पंप प्रणालियाँ - Boilers diff --git a/translations/OpenStudioApp_id.ts b/translations/OpenStudioApp_id.ts index de796ef16..5eaa3f9cf 100644 --- a/translations/OpenStudioApp_id.ts +++ b/translations/OpenStudioApp_id.ts @@ -25440,11 +25440,6 @@ Jika Anda ingin melihat OpenStudio Application diterjemahkan ke bahasa pilihan A Cooling Towers Menara Pendingin - - - Central Heat Pump Systems - Sistem Pompa Panas Terpusat - Boilers diff --git a/translations/OpenStudioApp_it.ts b/translations/OpenStudioApp_it.ts index d5464a2b4..b161c20ad 100644 --- a/translations/OpenStudioApp_it.ts +++ b/translations/OpenStudioApp_it.ts @@ -25390,11 +25390,6 @@ Se vuoi vedere OpenStudioApplication tradotto nel tuo linguaggio preferito, appr Cooling Towers Torri di Raffreddamento - - - Central Heat Pump Systems - Sistemi di Pompe di Calore Centralizzati - Boilers diff --git a/translations/OpenStudioApp_ja.ts b/translations/OpenStudioApp_ja.ts index 7444e029d..c44c2294d 100644 --- a/translations/OpenStudioApp_ja.ts +++ b/translations/OpenStudioApp_ja.ts @@ -25402,11 +25402,6 @@ OpenStudio の日本語ローカライゼーションでは **無熱量材料** Cooling Towers 冷却塔 - - - Central Heat Pump Systems - 中央ヒートポンプシステム - Boilers diff --git a/translations/OpenStudioApp_ko.ts b/translations/OpenStudioApp_ko.ts index c806b1adf..b3a7d6820 100644 --- a/translations/OpenStudioApp_ko.ts +++ b/translations/OpenStudioApp_ko.ts @@ -25499,11 +25499,6 @@ OpenStudio Application이 선택하신 언어로 번역되기를 원하신다면 Cooling Towers 냉각탑 - - - Central Heat Pump Systems - 중앙 열펌프 시스템 - Boilers diff --git a/translations/OpenStudioApp_pl.ts b/translations/OpenStudioApp_pl.ts index 11321ce0a..e1b04c146 100644 --- a/translations/OpenStudioApp_pl.ts +++ b/translations/OpenStudioApp_pl.ts @@ -25414,11 +25414,6 @@ Jeśli chcesz zobaczyć aplikację OpenStudio przetłumaczoną na wybrany przez Cooling Towers Wieże chłodnicze - - - Central Heat Pump Systems - Centralne Systemy Pomp Ciepła - Boilers diff --git a/translations/OpenStudioApp_pt.ts b/translations/OpenStudioApp_pt.ts index 00c240db5..17e860dca 100644 --- a/translations/OpenStudioApp_pt.ts +++ b/translations/OpenStudioApp_pt.ts @@ -25413,11 +25413,6 @@ Se gostaria de ver o OpenStudio Application traduzido para o seu idioma preferid Cooling Towers Torres de Resfriamento - - - Central Heat Pump Systems - Sistemas de Bomba de Calor Central - Boilers diff --git a/translations/OpenStudioApp_tr.ts b/translations/OpenStudioApp_tr.ts index 177b2f7e2..dd27dff75 100644 --- a/translations/OpenStudioApp_tr.ts +++ b/translations/OpenStudioApp_tr.ts @@ -25442,11 +25442,6 @@ OpenStudio Application'ın seçtiğiniz dilinize çevrilmiş halini görmek iste Cooling Towers Soğutma Kuleleri - - - Central Heat Pump Systems - Merkezi Isı Pompa Sistemleri - Boilers diff --git a/translations/OpenStudioApp_vi.ts b/translations/OpenStudioApp_vi.ts index 0f3b12318..545e69647 100644 --- a/translations/OpenStudioApp_vi.ts +++ b/translations/OpenStudioApp_vi.ts @@ -25458,11 +25458,6 @@ Nếu bạn muốn thấy OpenStudioApplication được dịch sang ngôn ngữ Cooling Towers Tháp làm mát - - - Central Heat Pump Systems - Hệ Thống Bơm Nhiệt Trung Tâm - Boilers diff --git a/translations/OpenStudioApp_zh_CN.ts b/translations/OpenStudioApp_zh_CN.ts index 96c2c04b2..23811f402 100644 --- a/translations/OpenStudioApp_zh_CN.ts +++ b/translations/OpenStudioApp_zh_CN.ts @@ -25440,11 +25440,6 @@ If you would like to see the OpenStudioApplication translated in your language o Cooling Towers 冷却塔 - - - Central Heat Pump Systems - 中央热泵系统 - Boilers