From 816691c33e591303ad509151d72fdf8113246c7a Mon Sep 17 00:00:00 2001 From: Chris Mackey Date: Wed, 10 Jul 2024 15:49:11 -0700 Subject: [PATCH] fix(create): Add secret option to turn off all rect split in Ap by Ratio --- .../icon/HB Apertures by Ratio.png | Bin 1296 -> 1298 bytes .../json/HB_Apertures_by_Ratio.json | 8 ++--- .../src/HB Apertures by Ratio.py | 28 ++++++++++++------ .../user_objects/HB Apertures by Ratio.ghuser | Bin 6924 -> 7253 bytes 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/honeybee_grasshopper_core/icon/HB Apertures by Ratio.png b/honeybee_grasshopper_core/icon/HB Apertures by Ratio.png index 670b1db8c309a27c5886d3e485f892105b2a2deb..8540d1c8687827cf0d95f68d58729527e88a1bb5 100644 GIT binary patch delta 1228 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 0:\n face.apertures_by_ratio_rectangle(rat, hgt, sil, hor, vert, tolerance)\n else:\n rect = True if sub == 0 else False\n face.apertures_by_ratio(rat, tolerance, rect)\n\n # try to assign the operable property\n if op:\n for ap in face.apertures:\n ap.is_operable = op\n\n\nif all_required_inputs(ghenv.Component):\n # duplicate the initial objects\n hb_objs = [obj.duplicate() for obj in _hb_objs]\n \n # set defaults for any blank inputs\n conversion = conversion_to_meters()\n _subdivide_ = _subdivide_ if len(_subdivide_) != 0 else [True]\n _win_height_ = _win_height_ if len(_win_height_) != 0 else [2.0 / conversion]\n _sill_height_ = _sill_height_ if len(_sill_height_) != 0 else [0.8 / conversion]\n _horiz_separ_ = _horiz_separ_ if len(_horiz_separ_) != 0 else [3.0 / conversion]\n vert_separ_ = vert_separ_ if len(vert_separ_) != 0 else [0.0]\n operable_ = operable_ if len(operable_) != 0 else [False]\n\n # gather all of the inputs together\n all_inputs = [_subdivide_, _ratio, _win_height_, _sill_height_, _horiz_separ_,\n vert_separ_, operable_]\n\n # ensure matching list lengths across all values\n all_inputs, num_orient = check_matching_inputs(all_inputs)\n\n # get a list of angles used to categorize the faces\n angles = angles_from_num_orient(num_orient)\n\n # loop through the input objects and add apertures\n for obj in hb_objs:\n if isinstance(obj, Model):\n for room in obj.rooms:\n for face in room.faces:\n if can_host_apeture(face):\n orient_i = face_orient_index(face, angles)\n sub, rat, hgt, sil, hor, vert, op = \\\n inputs_by_index(orient_i, all_inputs)\n assign_apertures(face, sub, rat, hgt, sil, hor, vert, op)\n elif isinstance(obj, Room):\n for face in obj.faces:\n if can_host_apeture(face):\n orient_i = face_orient_index(face, angles)\n sub, rat, hgt, sil, hor, vert, op = inputs_by_index(orient_i, all_inputs)\n assign_apertures(face, sub, rat, hgt, sil, hor, vert, op)\n elif isinstance(obj, Face):\n if can_host_apeture(obj):\n orient_i = face_orient_index(obj, angles)\n sub, rat, hgt, sil, hor, vert, op = inputs_by_index(orient_i, all_inputs)\n assign_apertures(obj, sub, rat, hgt, sil, hor, vert, op)\n else:\n raise TypeError(\n 'Input _hb_objs must be a Model Room or Face. Not {}.'.format(type(obj)))", "category": "Honeybee", "name": "HB Apertures by Ratio", "description": "Add apertures to a Honeybee Face or Room given a ratio of aperture area to face area.\n_\nNote that this component will only add Apertures to Faces that are Walls and have\nan Outdoors boundary condition.\n-" diff --git a/honeybee_grasshopper_core/src/HB Apertures by Ratio.py b/honeybee_grasshopper_core/src/HB Apertures by Ratio.py index 14d50fa..60bce7a 100644 --- a/honeybee_grasshopper_core/src/HB Apertures by Ratio.py +++ b/honeybee_grasshopper_core/src/HB Apertures by Ratio.py @@ -22,13 +22,22 @@ the apertures and the area of the parent face. If an array of values are input here, different ratios will be assigned based on cardinal direction, starting with north and moving clockwise. - _subdivide_: Boolean to note whether to generate a single window in the - center of each Face (False) or to generate a series of rectangular + _subdivide_: Boolean to note whether to generate only one or two windows + for each Face (False) or to generate a series of repeating rectangular windows using the other inputs below (True). The latter is often more - realistic and is important to consider for detailed daylight and - thermal comfort simulations but the former is likely better when the - only concern is building energy use since energy use doesn't change - much while the glazing ratio remains constant. (Default: True). + realistic and distributes the windows across the parent Face + for better daylight but the former is likely more useful when + modeling building energy use since energy use doesn't change + signifcantly while the glazing ratio remains constant. (Default: True). + _ + Note that this input can also be the integer -1 to completely turn + off all spltting of the base face into underling rectangles. By + default, a False value here will result in two windows generated + for and input pentagonal gabled geometry - one rectangle and one + triangle. This is better for engines like EnergyPlus that cannot + model windows with more than 4 vertices. However, if a single + pentagonal window is desired for such a shape, setting this + input to -1 will produce such a result. _win_height_: A number for the target height of the output apertures. Note that, if the ratio is too large for the height, the ratio will take precedence and the actual aperture height will be larger @@ -64,7 +73,7 @@ ghenv.Component.Name = 'HB Apertures by Ratio' ghenv.Component.NickName = 'AperturesByRatio' -ghenv.Component.Message = '1.8.0' +ghenv.Component.Message = '1.8.1' ghenv.Component.Category = 'Honeybee' ghenv.Component.SubCategory = '0 :: Create' ghenv.Component.AdditionalHelpFromDocStrings = '4' @@ -95,10 +104,11 @@ def can_host_apeture(face): def assign_apertures(face, sub, rat, hgt, sil, hor, vert, op): """Assign apertures to a Face based on a set of inputs.""" - if sub: + if sub > 0: face.apertures_by_ratio_rectangle(rat, hgt, sil, hor, vert, tolerance) else: - face.apertures_by_ratio(rat, tolerance) + rect = True if sub == 0 else False + face.apertures_by_ratio(rat, tolerance, rect) # try to assign the operable property if op: diff --git a/honeybee_grasshopper_core/user_objects/HB Apertures by Ratio.ghuser b/honeybee_grasshopper_core/user_objects/HB Apertures by Ratio.ghuser index f39dc9054c5cc2f1aacebcf296491578dd6cab1a..867359d523706495255e159a231600fecafe060f 100644 GIT binary patch literal 7253 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 literal 6924 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 S-@!1s03SaBB%C3y>;DHYjGQb0