From 2f69224b95c558616d8d8cd2758ee89f63ce9c7c Mon Sep 17 00:00:00 2001 From: Chris Mackey Date: Mon, 7 Oct 2024 14:21:15 -0700 Subject: [PATCH] fix(create): Don't separate mid for single-story building --- README.md | 3 ++- .../json/DF_Separate_Top_Bottom.json | 4 ++-- .../src/DF Separate Top Bottom.py | 4 ++-- .../DF Separate Top Bottom.ghuser | Bin 5557 -> 5579 bytes 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 397366c..92499b4 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ :dragon: :green_book: Dragonfly plugin for Grasshopper (aka. dragonfly[+]). This repository contains all Grasshopper components for the dragonfly plugin. -The package includes both the userobjects (`.ghuser`) and the Python source (`.py`). +The package includes both the user objects (`.ghuser`), the Python source (`.py`), +and a JSON version of the grasshopper component data. Note that this library only possesses the Grasshopper components and, in order to run the plugin, the core libraries must be installed in a way that they can be discovered by Rhino (see dependencies). diff --git a/dragonfly_grasshopper/json/DF_Separate_Top_Bottom.json b/dragonfly_grasshopper/json/DF_Separate_Top_Bottom.json index b496f6e..afbec11 100644 --- a/dragonfly_grasshopper/json/DF_Separate_Top_Bottom.json +++ b/dragonfly_grasshopper/json/DF_Separate_Top_Bottom.json @@ -1,5 +1,5 @@ { - "version": "1.8.0", + "version": "1.8.1", "nickname": "TopBottom", "outputs": [ [ @@ -36,7 +36,7 @@ } ], "subcategory": "0 :: Create", - "code": "\ntry: # import the core honeybee dependencies\n from honeybee.units import parse_distance_string\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry: # import the core dragonfly dependencies\n from dragonfly.model import Model\nexcept ImportError as e:\n raise ImportError('\\nFailed to import dragonfly:\\n\\t{}'.format(e))\n\ntry: # import the ladybug_{{cad}} dependencies\n from ladybug_{{cad}}.config import units_system, tolerance\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# tolerance for computing the pole of inaccessibility\np_tol = parse_distance_string('0.01m', units_system())\n\n\ndef split_mid_stories(building):\n \"\"\"Split the middle stories of a building to ensure matching areas.\"\"\"\n for x, story in enumerate(building.unique_stories[:-1]):\n story_above = building.unique_stories[x + 1]\n story.split_with_story_above(story_above, tolerance)\n story.set_top_exposed_by_story_above(story_above, p_tol)\n story.solve_room_2d_adjacency(tolerance, intersect=False)\n\n\nif all_required_inputs(ghenv.Component):\n # get the building objects from the input ones\n buildings = [bldg.duplicate() for bldg in _buildings]\n for bldg in buildings:\n if sep_mid_:\n if isinstance(bldg, Model):\n for b in bldg.buildings:\n b.separate_mid_floors(p_tol)\n if split_mid_:\n split_mid_stories(b)\n else:\n bldg.separate_mid_floors(p_tol)\n if split_mid_:\n split_mid_stories(bldg)\n else:\n bldg.separate_top_bottom_floors()\n", + "code": "\ntry: # import the core honeybee dependencies\n from honeybee.units import parse_distance_string\nexcept ImportError as e:\n raise ImportError('\\nFailed to import honeybee:\\n\\t{}'.format(e))\n\ntry: # import the core dragonfly dependencies\n from dragonfly.model import Model\nexcept ImportError as e:\n raise ImportError('\\nFailed to import dragonfly:\\n\\t{}'.format(e))\n\ntry: # import the ladybug_{{cad}} dependencies\n from ladybug_{{cad}}.config import units_system, tolerance\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# tolerance for computing the pole of inaccessibility\np_tol = parse_distance_string('0.01m', units_system())\n\n\ndef split_mid_stories(building):\n \"\"\"Split the middle stories of a building to ensure matching areas.\"\"\"\n for x, story in enumerate(building.unique_stories[:-1]):\n story_above = building.unique_stories[x + 1]\n story.split_with_story_above(story_above, tolerance)\n story.set_top_exposed_by_story_above(story_above, p_tol)\n story.solve_room_2d_adjacency(tolerance, intersect=False)\n\n\nif all_required_inputs(ghenv.Component):\n # get the building objects from the input ones\n buildings = [bldg.duplicate() for bldg in _buildings]\n for bldg in buildings:\n if sep_mid_ and len(bldg) != 1:\n if isinstance(bldg, Model):\n for b in bldg.buildings:\n b.separate_mid_floors(p_tol)\n if split_mid_:\n split_mid_stories(b)\n else:\n bldg.separate_mid_floors(p_tol)\n if split_mid_:\n split_mid_stories(bldg)\n else:\n bldg.separate_top_bottom_floors()\n", "category": "Dragonfly", "name": "DF Separate Top Bottom", "description": "Separate the top and bottom floors of a Building into unique Stories with a multiplier\nof 1 and automatically assign the first story Room2Ds to have a ground contact\nfloor and the top story Room2Ds to have an outdoor-exposed roof.\n_\nThis is particularly helpful when trying to account for the heat exchange of the\ntop or bottom floors with the gound or outdoors.\n_\nThe \"mid\" options can also be used to separate the middle floors and account for\nheat flow through exposed roofs of middle floors.\n-" diff --git a/dragonfly_grasshopper/src/DF Separate Top Bottom.py b/dragonfly_grasshopper/src/DF Separate Top Bottom.py index 7bbeab3..8da17e5 100644 --- a/dragonfly_grasshopper/src/DF Separate Top Bottom.py +++ b/dragonfly_grasshopper/src/DF Separate Top Bottom.py @@ -42,7 +42,7 @@ ghenv.Component.Name = 'DF Separate Top Bottom' ghenv.Component.NickName = 'TopBottom' -ghenv.Component.Message = '1.8.0' +ghenv.Component.Message = '1.8.1' ghenv.Component.Category = 'Dragonfly' ghenv.Component.SubCategory = '0 :: Create' ghenv.Component.AdditionalHelpFromDocStrings = '2' @@ -80,7 +80,7 @@ def split_mid_stories(building): # get the building objects from the input ones buildings = [bldg.duplicate() for bldg in _buildings] for bldg in buildings: - if sep_mid_: + if sep_mid_ and len(bldg) != 1: if isinstance(bldg, Model): for b in bldg.buildings: b.separate_mid_floors(p_tol) diff --git a/dragonfly_grasshopper/user_objects/DF Separate Top Bottom.ghuser b/dragonfly_grasshopper/user_objects/DF Separate Top Bottom.ghuser index 7d98c2ebf0acf0237b3184260b910dfe7c22f226..caa2b937592a44ab76ff25672d4934f95cf7868a 100644 GIT binary patch literal 5579 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

M#DgskoPl%E{^vrsilR(Ki!-NEc`kBptz^L z_KBu?k>O{Ab#b*Kqo@Fxsy<>c)_%0q1XnrZxY%4j4`^YG4+m| zk}_7KX>M70T>`zHtN~3Ap(D|o;!8?kowfyQZCN6&l2@=Izn1;BmRDJ4tY%DYzMJG? z`U1x+C&sdZ-YhbynLE`gJu*9frleBk%1GUekGI5uuOjyw#l!QY4wVo`s7gHNkNUoC z_@sGGb)X=^bOr&;>(xFll1ObZzSdtGCjh@lnkIGU#77@L9N@0*&(L4XndAiC z4|2$T;gG8S76Q6FHRbm^Ugu#FauJ_jWb>H_JU0?s(#_@^F*TApPmSGDb8I`+XQ|(W z-f$9~G73r9HXmNdE$#<6~8602SB*j1in zo-DkNACmNlSN9R(m71-a_<6iiw$2yc{-n9NiN)veB5;t_-DBEcpvY@;Vl$?E=fzE| zonl}>;oynt^%XhjV(y;^{ln3omkHICax54ziRyHP@PjATw1s`Al?TfN)UAE~- zI#oGq7mT)67zFyNd1sVMEaodq2+6rIJ!yi>%dr&b`(9i|l@|<3qr^+bTB|!KIxe=; zhyV@^Ow%V2R9ZrutBZ2Gez^zQ!P?PvMMXc8^9EZUqy?t6RSrz; zbWFOnTxeQe5wCw9mQJ87F=rULu2}0^Z{qr#8pxO<`RL)=mUMc_i*E~h)w+uZf(Ih~ z4WcLhlS>PLfl2YzEB7WT2cp2?x5a1Mk}KY71!ryV?S~RpThDtR+o=y~_f6Pg=Zkf0 z71eLY1!o-W!D`x!L>)@}4KfF3=qE*?hKI238HNZuk4>GR|PL``DZ3|9V z61^E)Wn5=*zpx8YKazYp`cD~SACWadkYGTjVFTOpm|oP#OkiT0H~814ibnfWbobCR zyCMIeuPpi24c=>Sc2&l=j%9XcGVGolLcR7k4g;I&$%Edb9F^3x`d{}Sz1U%2fb4lb@8Ty)p=EM(}rd1U5@pG?J6l4hL9xE&tAUvKf6rN7vb z_lGuns&x$hdeV`F+a9MUMgO*~S=%)3`Q6SyyPlwv5cZmF|85<3@0cFk)aa?P{(Gf6j`1W&_QKP)+Ccr} zDQ}ZZ)4K`p^Fki)3p?hiR(YqRFrkI6HgdTqd5ERCP!?}N#?fD2 zdwM4??5^Gno>v>UOs*Uz-~@gd#h#uHZf)Qyhj&k|tgeB_hCrtQ}a zuVWjVr6L>GlqI4M>*+P0Qv#BJk2h?-Kvv5*{EB!UmyG2|WVd^ce2N!vbn$KCK27!k z46S}k54D$!>=aK-;jYthfs<5R)G2%}eV+v3K4U=m7|p5PrR||NkPkds)PLY6aJ^DK z&Y&@-bMty%r zTI=JQl^STO&MW5n)r#kHV(VK3mEkA{6VC}>$`P5gK(SFtp z$qQYl*rlj{*MY~4ERo$82-IlJI%s@<`2OOKJR5~wPS(e3=NZAHN^FJJj*2Z)C%Vn% zO7diP;Jvvf(ho2hJWqlCT9(V>V^_|jN8g--#E%(+WkVRRQ$zSj@NIqx;m-j??jIVJ zu*-u{ANt}F&h5u2S$JeNyL