From 4abc12aef2e7d8658510f94e0623edfca486bafa Mon Sep 17 00:00:00 2001 From: Chris Mackey Date: Fri, 13 Oct 2023 13:36:41 -0700 Subject: [PATCH] fix(loads): Implement better checking of Room loads in Program Assigning --- .../icon/HB Apply ProgramType.png | Bin 1123 -> 1120 bytes .../json/HB_Apply_ProgramType.json | 13 +++++++--- .../src/HB Apply ProgramType.py | 24 +++++++++++++++--- .../user_objects/HB Apply ProgramType.ghuser | Bin 4426 -> 4908 bytes 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/honeybee_grasshopper_energy/icon/HB Apply ProgramType.png b/honeybee_grasshopper_energy/icon/HB Apply ProgramType.png index 94b9bedc76cb366a01f9928688aa2274833749cc..79fc06328183ac899b526b48e04f13d134198238 100644 GIT binary patch delta 1063 zcmV+?1larI2;c~iNPiB)000id0mpBsWB>pI^+`lQR7gwBm0e7mRT#%BpRT}KS_>`x zm_$Oo3c6xSqKQ|;=0I$ ziz#Hwj7Ertk3tJrL7-*)ecq3C>x4y^7ygoe-lwNe|4-j@o_}+W;QvNRL`1}OdZut6 z|2u>-ne1{?Qxoj=1(cMOARr*1g8%M`2o?&3`NZAn>1jO7*w`5Kdi{6){{F`(?

Q z@0=8gMC&;@Ibf8Pm4)*1au^H-NPnfoL#Fz`)_#lp^cTU$HU*Vj=~Q-i#`Jka8MDCLO?_>tPn z%F3{^vcmrB`%Fws;B-L&1b%)-E_Lr{l9H0H_4fAimVf_bo2Kn-YATEpS@(uUXV_LJ z#PGj;EKEndS6W)?@_0PF)y~|zZo`&Ti7ky5h)%%QK?g0I#qLDJ$H#xu)z!sYJRZ00 z1{~pXIF&JQ%cJo{$}xn>#KtY>&!exk6`xWbqtOql@uwo1 zEwCz8;YOwbT@4NRn8uH4wRkb~U_I|Ic%GyuouERVfq_Bv_xH0J8XEG(H{Z^~Z9yPz zJuPDOi$sBCnt!J%mVN#ziDJhmL#0?aq{EatmVeoZKKRq_^gY!c;@&wkmV?9LB11+i z%2?L?zLxoMMr*1#*k!U!-q(wwsHn)r`}y#b-44qOFJU8C3>QrYBZpW4r#g-+Ku^ar zDs0G~<+@6v!(TMU`+8B)j@{%veXtG=;Qhpxfs^mx?yJXfC-rr>GT(rcSp%j(gpNR3;PxHwK5z)7z$c#}{dC?G z`7lS!j;J#-GTf}oBaDvTL{Co-ACKbO@qck(auQA|u;hJ%PE?xB-;>X-H=H^y{xS6MM}OG^tXD=Xo4yU{?sZl?XP{o@2SrBQIxqHc-g@R&bB#;H^D+002ovPDHLkV1k@Z7zF?T delta 1066 zcmV+_1l9ZC2;&HlNPiuN0013_0gvVJWdHyJ_(?=TR7gwBm0e6*Wf;dR<--+NOKVF@ zp%Z}?LevbU*|;Hbm|7w`W@sZ1ujPM(?U z$Nvt2R4TpP+}sSOa{;BLr3elVuH?RZBEkd$K_TJp^z<|yW^8N>TCMgwKA(S#RDvKOc;8b8}HqQ31VPkAi{%WM^k1GBWaal9$S+@10PhGktx1n4O)){QNwY zmX-$VhOyIQ92wqT-iA~)*s`T{qYrVa_oPXs%*(Pl}o0SEVSlYdz(&)G2 zQWLn}J{D$0yjNCM=JEM_oYl_UyY9f2M2Rhx8i-HD*P#ckti|rgQc_aB>FVm@EFO>7 zaRaU>Io!$wc;)ffFQA0e8yxlJy?VPhFd>iQ4~!JEQAVy&d>21 znJbgoJbz9+b*wduO{3A!<=4{Eg8KS;R903}G3SrjY^HJR`Sa*&Ys04`kJ0D{HTY8z zPYbL{VsS&KM^|GbJ|^Qw)oQ#Daj=2&=Oq(qiB2RZC;J8l2GQT&Pc<|&+>&SBTNJjX$K>hNC9_T5?g>g zUC+c~L;ftgs#F^MMaDQ^Ke1%TZgQRh*arvje%edG$#-z~mE*XR^%^|7H{fRGfGH4t z2!Ec;S8+|PU0YB-_thUUNrNtB!k3({pXj2ZqGirAfXm(8INQ)b;|rHAqUq`tU}}oI z1-pt|2gE>!4adujKXYC?5>-=EGecb-VPs?kHk*ycon)W1+3mpXJN|v(5=ekgK10rF z!xZshj+h;Z)9G|x>hcJqqc_ph)5FE1_B=!##$|G}` kQfW6i-kXRI*CHP8Z>pDJ!Z;)TQUCw|07*qoM6N<$f``ooHUIzs diff --git a/honeybee_grasshopper_energy/json/HB_Apply_ProgramType.json b/honeybee_grasshopper_energy/json/HB_Apply_ProgramType.json index fafe5c88..f16c7ffc 100644 --- a/honeybee_grasshopper_energy/json/HB_Apply_ProgramType.json +++ b/honeybee_grasshopper_energy/json/HB_Apply_ProgramType.json @@ -1,5 +1,5 @@ { - "version": "1.6.1", + "version": "1.6.2", "nickname": "ApplyProgram", "outputs": [ [ @@ -23,13 +23,20 @@ { "access": "list", "name": "_program", - "description": "A ProgramType object to apply to the input rooms,", + "description": "A ProgramType object to apply to the input rooms. This can also be\ntext for the program of the Rooms (to be looked up in the\nProgramType library) such as that output from the \"HB List Programs\"\ncomponent.", "type": "System.Object", "default": null + }, + { + "access": "item", + "name": "overwrite_", + "description": "A Boolean to note whether any loads assigned specifically to the\nRoom, which overwrite the loads of ProgramType should be reset so\nthat they are determined by the input program. (Default: False).", + "type": "bool", + "default": null } ], "subcategory": "3 :: Loads", - "code": "\ntry:\n from honeybee.model import Model\n from honeybee.room import Room\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.lib.programtypes import program_type_by_identifier, \\\n building_program_type_by_identifier\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, longest_list\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\nif all_required_inputs(ghenv.Component):\n # duplicate the initial objects\n rooms = [obj.duplicate() for obj in _rooms]\n\n # extract any rooms from the input Models\n hb_objs = []\n for hb_obj in rooms:\n if isinstance(hb_obj, Model):\n hb_objs.extend(hb_obj.rooms)\n elif isinstance(hb_obj, Room):\n hb_objs.append(hb_obj)\n else:\n raise ValueError(\n 'Expected Honeybee Room or Model. Got {}.'.format(type(hb_obj)))\n\n # apply the program to the rooms\n for i, room in enumerate(hb_objs):\n prog = longest_list(_program, i)\n if isinstance(prog, str): # get the program object if it is a string\n try:\n prog = building_program_type_by_identifier(prog)\n except ValueError:\n prog = program_type_by_identifier(prog)\n room.properties.energy.program_type = prog", + "code": "\ntry:\n from honeybee.model import Model\n from honeybee.room import Room\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.lib.programtypes import program_type_by_identifier, \\\n building_program_type_by_identifier\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee_energy:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs, longest_list, \\\n give_warning\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\nif all_required_inputs(ghenv.Component):\n # duplicate the initial objects\n rooms = [obj.duplicate() for obj in _rooms]\n\n # extract any rooms from the input Models\n hb_objs = []\n for hb_obj in rooms:\n if isinstance(hb_obj, Model):\n hb_objs.extend(hb_obj.rooms)\n elif isinstance(hb_obj, Room):\n hb_objs.append(hb_obj)\n else:\n raise ValueError(\n 'Expected Honeybee Room or Model. Got {}.'.format(type(hb_obj)))\n\n # apply the program to the rooms\n for i, room in enumerate(hb_objs):\n prog = longest_list(_program, i)\n if isinstance(prog, str): # get the program object if it is a string\n try:\n prog = building_program_type_by_identifier(prog)\n except ValueError:\n prog = program_type_by_identifier(prog)\n room.properties.energy.program_type = prog\n if overwrite_:\n room.properties.energy.reset_loads_to_program()\n elif overwrite_ is None and room.properties.energy.has_overridden_loads:\n msg = 'Room \"{}\" has loads assigned specifically to it, which override ' \\\n 'the assigned program.\\nIf resetting all loads to be assigned by ' \\\n 'the input program is desired, then the overwrite_ option\\non this ' \\\n 'component should be set to True.'.format(room.display_name)\n print(msg)\n give_warning(ghenv.Component, msg)", "category": "HB-Energy", "name": "HB Apply ProgramType", "description": "Apply ProgramType objects to Rooms or a Model.\n-" diff --git a/honeybee_grasshopper_energy/src/HB Apply ProgramType.py b/honeybee_grasshopper_energy/src/HB Apply ProgramType.py index 4480232f..8d8570a4 100644 --- a/honeybee_grasshopper_energy/src/HB Apply ProgramType.py +++ b/honeybee_grasshopper_energy/src/HB Apply ProgramType.py @@ -15,7 +15,13 @@ _rooms: Honeybee Rooms to which the input program should be assigned. This can also be a Honeybee Model for which all Rooms will be assigned the ProgramType. - _program: A ProgramType object to apply to the input rooms, + _program: A ProgramType object to apply to the input rooms. This can also be + text for the program of the Rooms (to be looked up in the + ProgramType library) such as that output from the "HB List Programs" + component. + overwrite_: A Boolean to note whether any loads assigned specifically to the + Room, which overwrite the loads of ProgramType should be reset so + that they are determined by the input program. (Default: False). Returns: report: Reports, errors, warnings, etc. @@ -24,7 +30,7 @@ ghenv.Component.Name = "HB Apply ProgramType" ghenv.Component.NickName = 'ApplyProgram' -ghenv.Component.Message = '1.6.1' +ghenv.Component.Message = '1.6.2' ghenv.Component.Category = 'HB-Energy' ghenv.Component.SubCategory = '3 :: Loads' ghenv.Component.AdditionalHelpFromDocStrings = "1" @@ -42,7 +48,8 @@ raise ImportError('\nFailed to import honeybee_energy:\n\t{}'.format(e)) try: - from ladybug_rhino.grasshopper import all_required_inputs, longest_list + from ladybug_rhino.grasshopper import all_required_inputs, longest_list, \ + give_warning except ImportError as e: raise ImportError('\nFailed to import ladybug_rhino:\n\t{}'.format(e)) @@ -70,4 +77,13 @@ prog = building_program_type_by_identifier(prog) except ValueError: prog = program_type_by_identifier(prog) - room.properties.energy.program_type = prog \ No newline at end of file + room.properties.energy.program_type = prog + if overwrite_: + room.properties.energy.reset_loads_to_program() + elif overwrite_ is None and room.properties.energy.has_overridden_loads: + msg = 'Room "{}" has loads assigned specifically to it, which override ' \ + 'the assigned program.\nIf resetting all loads to be assigned by ' \ + 'the input program is desired, then the overwrite_ option\non this ' \ + 'component should be set to True.'.format(room.display_name) + print(msg) + give_warning(ghenv.Component, msg) \ No newline at end of file diff --git a/honeybee_grasshopper_energy/user_objects/HB Apply ProgramType.ghuser b/honeybee_grasshopper_energy/user_objects/HB Apply ProgramType.ghuser index 8ddd06bd0770626bdc84402aeace865b02459868..5f036a0904d74c6917a1da908e71804bb47f69d3 100644 GIT binary patch literal 4908 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