From 8dd4ad8f53365400f069931fe6dbbe710b36d906 Mon Sep 17 00:00:00 2001 From: Chris Mackey Date: Mon, 15 May 2023 15:24:34 -0400 Subject: [PATCH] fix(result): Add missing OrderedDict dependency for Mac --- .../icon/HB End Use Intensity.png | Bin 1292 -> 1292 bytes .../json/HB_End_Use_Intensity.json | 4 ++-- .../src/HB End Use Intensity.py | 3 ++- .../user_objects/HB End Use Intensity.ghuser | Bin 5761 -> 5804 bytes 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/honeybee_grasshopper_energy/icon/HB End Use Intensity.png b/honeybee_grasshopper_energy/icon/HB End Use Intensity.png index 76bfa485e21461e49c6b53eadc177d229562c79f..d8bf4d4ca13e603de8959bd2a46197aaf693bae4 100644 GIT binary patch delta 22 ecmeC->fxH;!OeG=fr0NZ3O9!?9 delta 22 dcmeC->fxH;!7ba)z#!Ys*#Gon>c-%mEC5et2jl<% diff --git a/honeybee_grasshopper_energy/json/HB_End_Use_Intensity.json b/honeybee_grasshopper_energy/json/HB_End_Use_Intensity.json index 4b945fa3..f780b3f4 100644 --- a/honeybee_grasshopper_energy/json/HB_End_Use_Intensity.json +++ b/honeybee_grasshopper_energy/json/HB_End_Use_Intensity.json @@ -1,5 +1,5 @@ { - "version": "1.6.0", + "version": "1.6.1", "nickname": "EUI", "outputs": [ [ @@ -50,7 +50,7 @@ } ], "subcategory": "6 :: Result", - "code": "\nimport os\nimport subprocess\nimport json\n\ntry:\n from ladybug.datatype.area import Area\n from ladybug.datatype.energyintensity import EnergyIntensity\n from ladybug.datatype.energy import Energy\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug:\\n\\t{}'.format(e))\n\ntry:\n from honeybee.config import folders\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.result.eui import eui_from_sql\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\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\n# Use the SQLiteResult class to parse the result files directly on Windows.\ndef get_results_windows(sql_files):\n results = eui_from_sql(sql_files)\n return results['eui'], results['total_floor_area'], results['end_uses']\n\n\n# The SQLite3 module doesn't work in IronPython on Mac, so we must make a call\n# to the Honeybee CLI (which runs on CPython) to get the results.\ndef get_results_mac(sql_files):\n cmds = [folders.python_exe_path, '-m', 'honeybee_energy', 'result',\n 'energy-use-intensity']\n cmds.extend(sql_files)\n process = subprocess.Popen(cmds, stdout=subprocess.PIPE)\n stdout = process.communicate()\n results = json.loads(stdout[0], object_pairs_hook=OrderedDict)\n return results['eui'], results['total_floor_area'], results['end_uses']\n\n\nif all_required_inputs(ghenv.Component):\n # ensure that _sql is a list rather than a single string\n if isinstance(_sql, basestring):\n _sql = [_sql]\n\n # get the results\n get_results = get_results_windows if os.name == 'nt' else get_results_mac\n eui, gross_floor, end_use_pairs = get_results(_sql)\n\n # create separate lists for end use values and labels\n eui_end_use = end_use_pairs.values()\n end_uses = [use.replace('_', ' ').title() for use in end_use_pairs.keys()]\n\n # convert data to IP if requested\n if ip_:\n eui_typ, a_typ, e_typ = EnergyIntensity(), Area(), Energy()\n eui = round(eui_typ.to_ip([eui], 'kWh/m2')[0][0], 3)\n gross_floor = round(a_typ.to_ip([gross_floor], 'm2')[0][0], 3)\n eui_end_use = [round(eui_typ.to_ip([val], 'kWh/m2')[0][0], 3)\n for val in eui_end_use]\n", + "code": "\nimport os\nimport subprocess\nimport json\n\ntry:\n from ladybug.datatype.area import Area\n from ladybug.datatype.energyintensity import EnergyIntensity\n from ladybug.datatype.energy import Energy\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug:\\n\\t{}'.format(e))\n\ntry:\n from honeybee.config import folders\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry:\n from honeybee_energy.result.eui import eui_from_sql\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\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\n# Use the SQLiteResult class to parse the result files directly on Windows.\ndef get_results_windows(sql_files):\n results = eui_from_sql(sql_files)\n return results['eui'], results['total_floor_area'], results['end_uses']\n\n\n# The SQLite3 module doesn't work in IronPython on Mac, so we must make a call\n# to the Honeybee CLI (which runs on CPython) to get the results.\ndef get_results_mac(sql_files):\n from collections import OrderedDict\n cmds = [folders.python_exe_path, '-m', 'honeybee_energy', 'result',\n 'energy-use-intensity']\n cmds.extend(sql_files)\n process = subprocess.Popen(cmds, stdout=subprocess.PIPE)\n stdout = process.communicate()\n results = json.loads(stdout[0], object_pairs_hook=OrderedDict)\n return results['eui'], results['total_floor_area'], results['end_uses']\n\n\nif all_required_inputs(ghenv.Component):\n # ensure that _sql is a list rather than a single string\n if isinstance(_sql, basestring):\n _sql = [_sql]\n\n # get the results\n get_results = get_results_windows if os.name == 'nt' else get_results_mac\n eui, gross_floor, end_use_pairs = get_results(_sql)\n\n # create separate lists for end use values and labels\n eui_end_use = end_use_pairs.values()\n end_uses = [use.replace('_', ' ').title() for use in end_use_pairs.keys()]\n\n # convert data to IP if requested\n if ip_:\n eui_typ, a_typ, e_typ = EnergyIntensity(), Area(), Energy()\n eui = round(eui_typ.to_ip([eui], 'kWh/m2')[0][0], 3)\n gross_floor = round(a_typ.to_ip([gross_floor], 'm2')[0][0], 3)\n eui_end_use = [round(eui_typ.to_ip([val], 'kWh/m2')[0][0], 3)\n for val in eui_end_use]\n", "category": "HB-Energy", "name": "HB End Use Intensity", "description": "Get information about end use intensity from an EnergyPlus SQL file.\n-" diff --git a/honeybee_grasshopper_energy/src/HB End Use Intensity.py b/honeybee_grasshopper_energy/src/HB End Use Intensity.py index 4c4dd781..857af297 100644 --- a/honeybee_grasshopper_energy/src/HB End Use Intensity.py +++ b/honeybee_grasshopper_energy/src/HB End Use Intensity.py @@ -38,7 +38,7 @@ ghenv.Component.Name = 'HB End Use Intensity' ghenv.Component.NickName = 'EUI' -ghenv.Component.Message = '1.6.0' +ghenv.Component.Message = '1.6.1' ghenv.Component.Category = 'HB-Energy' ghenv.Component.SubCategory = '6 :: Result' ghenv.Component.AdditionalHelpFromDocStrings = '1' @@ -79,6 +79,7 @@ def get_results_windows(sql_files): # The SQLite3 module doesn't work in IronPython on Mac, so we must make a call # to the Honeybee CLI (which runs on CPython) to get the results. def get_results_mac(sql_files): + from collections import OrderedDict cmds = [folders.python_exe_path, '-m', 'honeybee_energy', 'result', 'energy-use-intensity'] cmds.extend(sql_files) diff --git a/honeybee_grasshopper_energy/user_objects/HB End Use Intensity.ghuser b/honeybee_grasshopper_energy/user_objects/HB End Use Intensity.ghuser index 62f1198edecebb2e73e60e86805b2b60d37aac27..a827cbfb206f20b8808b7330ace40b24950f7cdd 100644 GIT binary patch literal 5804 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 literal 5761 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