From 827c596c0989046df22369042c0c7cca6af6ce47 Mon Sep 17 00:00:00 2001 From: Chris Mackey Date: Thu, 15 Jun 2023 12:53:15 -0400 Subject: [PATCH] fix(hvac): Improve message when Ironbug exe access is denied --- .../icon/HB Detailed HVAC.png | Bin 1059 -> 1065 bytes .../json/HB_Detailed_HVAC.json | 4 ++-- .../src/HB Detailed HVAC.py | 9 +++++++-- .../user_objects/HB Detailed HVAC.ghuser | Bin 5092 -> 5174 bytes 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/honeybee_grasshopper_energy/icon/HB Detailed HVAC.png b/honeybee_grasshopper_energy/icon/HB Detailed HVAC.png index e9009fadafe511448d9b2779af23ce9b78cebd53..44ff8539e058bc0bff9f62138a2bf02494ae319b 100644 GIT binary patch delta 993 zcmV<710MXN2&o8=R)4-pL_t(YOU+YVXjDfOz9mXqYA}26UAKFGX70?rvk4MyX`~hr zT8xxJpGq6>p;Ua)BG#W|ck{C`u~ym&McOx$wv5DrZl^8HPt3I>5n45h!`xA zq}k1nN@8r1>6ytSDAL9(KJ50=HDC*Hck7rWh zL%;HHGkot|f;AtsHyh5(!3^Gz`I>BbsP6P| z!6te#{gEg%8-GApw58$fsJ_4BWtEmFIq?0uP#`p=r z6O4Dq2x$)xIq4&Ee66Of5;yLFnN*!9l0tdg-^o!azvIUEsKxFKAw~sHDMgHsl#g*A z^Sq5f$pVVd7V449p65N|BXk@LTLdrKWhA?=%XjkbA8-rPp9)^fS$-QwWqcM)Mr?XS zk_sUHl7HvAZE7h|W|bKp!dHBcd=a>0fVy6-N@+%QN2OVRcGhg{;qdyeN-}Tx)f|`c z+b-ji4jTrOEiwV1uDh9H{FPct#G+9XM0)~^Utkz-^RRag=*K{m8MWC9M%|hDKS*@7 z&sPBQ4m~E?G!1RKWwEKd5%#=>&?ab6)_2hmMStG0g&Dv+_QUD(2;q-0AuR~w?*w0b zuxF!L|I)SCd;T07tMNW_Zu+?nn`8K@!#453V0E;Fl#;3uANBs(wx({=9Z2gQI zJAXgp1Q#Zv!Ii%qHZbJS*Hrqyv0$>$t|5!w_YQ7F=$gD0v`@I~PjQe*n4Oqm&Z67Z zmZh+8?$-Ki76IvD<9K+aCWy`~YiFhZXWg?38xb1gyt*U6m zr5gqvTCTPi25ACq5WN;rhz~~AKc&)-24l8=c-m#zn-*&uj6@znT+{vmMJd;Xr!|Wo P00000NkvXXu0mjf9i#Fq delta 987 zcmV<110?*Z2%`v)R)4rjL_t(YOU+YnXq8nMe`QKV4tL-8z25fzIp;m+eb3#9W#L3a zgu+P#eTo|RK@`7Oh?#Ep&$c@^Q>lcI`sP*<5rZ&T612#B=jJWjYSS{rFCq;iwzYem zTVu}Q-RU`JXG4veyZE6W93IZ^InVPu=Xsu^{jZ=WGW*QKKYw@V@!oe7_3)s_GO6(4 z3q0Hk>*%lCNOXU$T*bpV_`_qu>ajDaaLWKU8?xLy)Gw_ND_&$z+bScT`7~7jZIxc1 z-Y=7<&T}K4o-<3Ds`Q3)qeYA8 ziS&CS&}@RlqJJz+-`~&=biJV55@iR!eoAjFQpAX5-VV18LP@$sa$!F*;%95LH@Y5C zMo;nH@tw(Mi-;&zPjqk<FUn;kv)AQ6dFvOL!t{rN*K(HM!BHhIfXJ9lk4aJi zl0WacZhwc`N>o~v20{3$?~za76+_hZlFFqSbzLU%{juN# zmwzU#;OZTR4UIVTW##^FEQldGUnRDnx!HJc(gVTA3#V2hxJdUxa!c>-r1rhO2WXVL$VSm&1vs|k!8FT4|VTV?! zg%!z%BkLYl?uUbM+dp#KWj&J?>llti9w51<{S602*S9LpVnzS}002ov JPDHLkV1mV@_>TYp diff --git a/honeybee_grasshopper_energy/json/HB_Detailed_HVAC.json b/honeybee_grasshopper_energy/json/HB_Detailed_HVAC.json index 448077c3..ffb79019 100644 --- a/honeybee_grasshopper_energy/json/HB_Detailed_HVAC.json +++ b/honeybee_grasshopper_energy/json/HB_Detailed_HVAC.json @@ -1,5 +1,5 @@ { - "version": "1.6.0", + "version": "1.6.1", "nickname": "DetailedHVAC", "outputs": [ [ @@ -43,7 +43,7 @@ } ], "subcategory": "4 :: HVAC", - "code": "\nimport json\n\ntry: # import the honeybee extension\n from honeybee.typing import clean_and_id_ep_string, clean_ep_string\n from honeybee.model import Model\n from honeybee.room import Room\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry: # import the honeybee-energy extension\n from honeybee_energy.config import folders\n from honeybee_energy.hvac.detailed import DetailedHVAC\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, give_warning\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\nif folders.ironbug_exe is None:\n msg = 'An installation of Ironbug that is compatible with this component\\n' \\\n 'was not found on this machine. This component will not be usable.'\n print(msg)\n give_warning(ghenv.Component, msg)\nelif folders.ironbug_version is not None:\n if folders.ironbug_version < (1, 5, 3):\n msg = 'Ironbug version \"{}\" is not compatible with this component.\\n' \\\n 'This component will not be usable.'.format(\n '.'.join([str(i) for i in folders.ironbug_version]))\n print(msg)\n give_warning(ghenv.Component, msg)\n\n\nif all_required_inputs(ghenv.Component):\n # extract any rooms from input Models and duplicate the rooms\n rooms, hb_objs = [], []\n for hb_obj in _hb_objs:\n if isinstance(hb_obj, Model):\n new_obj = hb_obj.duplicate()\n hb_objs.append(new_obj)\n rooms.extend(new_obj.rooms)\n elif isinstance(hb_obj, Room):\n new_obj = hb_obj.duplicate()\n hb_objs.append(new_obj)\n rooms.append(new_obj)\n else:\n raise ValueError(\n 'Expected Honeybee Room or Model. Got {}.'.format(type(hb_obj)))\n\n # create the HVAC\n name = clean_and_id_ep_string('Detailed HVAC') if _name_ is None else \\\n clean_ep_string(_name_)\n specification = json.loads(_hvac_system.ToJson())\n hvac = DetailedHVAC(name, specification)\n if _name_ is not None:\n hvac.display_name = _name_\n\n # apply the HVAC system to the rooms\n hvac_rooms = set(hvac.thermal_zones)\n hvac_count, rel_rooms = 0, []\n for room in rooms:\n if room.identifier in hvac_rooms:\n room.properties.energy.hvac = hvac\n rel_rooms.append(room.identifier)\n hvac_count += 1\n\n # give a warning if no rooms were assigned the HVAC or if there are missing rooms\n if hvac_count == 0:\n msg = 'None of the connected Rooms are referenced under the Ironbug HVAC system.\\n' \\\n 'Make sure that the system has been set up with the correct Rooms.'\n print(msg)\n give_warning(ghenv.Component, msg)\n if len(rel_rooms) != len(hvac_rooms):\n missing_rooms = []\n found_rooms = set(rel_rooms)\n for rm_id in hvac_rooms:\n if rm_id not in found_rooms:\n missing_rooms.append(rm_id)\n msg = 'The Ironbug HVAC system contains the following rooms that are not ' \\\n 'in the connected _hb_objs.\\n{}'.format('\\n'.join(missing_rooms))\n print(msg)\n give_warning(ghenv.Component, msg)\n", + "code": "\nimport json\n\ntry: # import the honeybee extension\n from honeybee.typing import clean_and_id_ep_string, clean_ep_string\n from honeybee.model import Model\n from honeybee.room import Room\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry: # import the honeybee-energy extension\n from honeybee_energy.config import folders\n from honeybee_energy.hvac.detailed import DetailedHVAC\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, give_warning\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\nif folders.ironbug_exe is None:\n msg = 'An installation of Ironbug that is compatible with this component\\n' \\\n 'was not found on this machine. This component will not be usable.'\n print(msg)\n give_warning(ghenv.Component, msg)\nelif folders.ironbug_version is not None:\n if folders.ironbug_version < (1, 9, 1):\n msg = 'Ironbug version \"{}\" is not compatible with this component.\\n' \\\n 'This component will not be usable.'.format(\n '.'.join([str(i) for i in folders.ironbug_version]))\n print(msg)\n give_warning(ghenv.Component, msg)\nelse:\n msg = 'An installation of Ironbug was found at: {}\\nbut it is not ' \\\n 'accessible. Contact your adminstrator.'.format(folders.ironbug_exe)\n print(msg)\n give_warning(ghenv.Component, msg)\n\n\nif all_required_inputs(ghenv.Component):\n # extract any rooms from input Models and duplicate the rooms\n rooms, hb_objs = [], []\n for hb_obj in _hb_objs:\n if isinstance(hb_obj, Model):\n new_obj = hb_obj.duplicate()\n hb_objs.append(new_obj)\n rooms.extend(new_obj.rooms)\n elif isinstance(hb_obj, Room):\n new_obj = hb_obj.duplicate()\n hb_objs.append(new_obj)\n rooms.append(new_obj)\n else:\n raise ValueError(\n 'Expected Honeybee Room or Model. Got {}.'.format(type(hb_obj)))\n\n # create the HVAC\n name = clean_and_id_ep_string('Detailed HVAC') if _name_ is None else \\\n clean_ep_string(_name_)\n specification = json.loads(_hvac_system.ToJson())\n hvac = DetailedHVAC(name, specification)\n if _name_ is not None:\n hvac.display_name = _name_\n\n # apply the HVAC system to the rooms\n hvac_rooms = set(hvac.thermal_zones)\n hvac_count, rel_rooms = 0, []\n for room in rooms:\n if room.identifier in hvac_rooms:\n room.properties.energy.hvac = hvac\n rel_rooms.append(room.identifier)\n hvac_count += 1\n\n # give a warning if no rooms were assigned the HVAC or if there are missing rooms\n if hvac_count == 0:\n msg = 'None of the connected Rooms are referenced under the Ironbug HVAC system.\\n' \\\n 'Make sure that the system has been set up with the correct Rooms.'\n print(msg)\n give_warning(ghenv.Component, msg)\n if len(rel_rooms) != len(hvac_rooms):\n missing_rooms = []\n found_rooms = set(rel_rooms)\n for rm_id in hvac_rooms:\n if rm_id not in found_rooms:\n missing_rooms.append(rm_id)\n msg = 'The Ironbug HVAC system contains the following rooms that are not ' \\\n 'in the connected _hb_objs.\\n{}'.format('\\n'.join(missing_rooms))\n print(msg)\n give_warning(ghenv.Component, msg)\n", "category": "HB-Energy", "name": "HB Detailed HVAC", "description": "Apply a detailed Ironbug HVAC to Honeybee Rooms or a Honeybee Model.\n-" diff --git a/honeybee_grasshopper_energy/src/HB Detailed HVAC.py b/honeybee_grasshopper_energy/src/HB Detailed HVAC.py index 639b02bb..51193f60 100644 --- a/honeybee_grasshopper_energy/src/HB Detailed HVAC.py +++ b/honeybee_grasshopper_energy/src/HB Detailed HVAC.py @@ -28,7 +28,7 @@ ghenv.Component.Name = "HB Detailed HVAC" ghenv.Component.NickName = 'DetailedHVAC' -ghenv.Component.Message = '1.6.0' +ghenv.Component.Message = '1.6.1' ghenv.Component.Category = 'HB-Energy' ghenv.Component.SubCategory = '4 :: HVAC' ghenv.Component.AdditionalHelpFromDocStrings = '0' @@ -59,12 +59,17 @@ print(msg) give_warning(ghenv.Component, msg) elif folders.ironbug_version is not None: - if folders.ironbug_version < (1, 5, 3): + if folders.ironbug_version < (1, 9, 1): msg = 'Ironbug version "{}" is not compatible with this component.\n' \ 'This component will not be usable.'.format( '.'.join([str(i) for i in folders.ironbug_version])) print(msg) give_warning(ghenv.Component, msg) +else: + msg = 'An installation of Ironbug was found at: {}\nbut it is not ' \ + 'accessible. Contact your adminstrator.'.format(folders.ironbug_exe) + print(msg) + give_warning(ghenv.Component, msg) if all_required_inputs(ghenv.Component): diff --git a/honeybee_grasshopper_energy/user_objects/HB Detailed HVAC.ghuser b/honeybee_grasshopper_energy/user_objects/HB Detailed HVAC.ghuser index a6b87a6d3333c211208ab0f56093a6b0d8bfdae7..1836c4453b80b911d1aa495c088b8edec0c6d252 100644 GIT binary patch literal 5174 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 literal 5092 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