diff --git a/◯ᗩIᗝI⚭◯⚪◯⚭IᗝIᗩ◯ⵙ◯ᗩIᗝI⚭◯⚪◯⚭IᗝIᗩ◯/◯✤ᴥᗩ◯ⵙ◯ᗩᴥ✤◯/◯ᗱᗴᴥᗩᗯ✤⏀Ⓞᔓᔕ◯ⵙ◯ᔓᔕⓄ⏀✤ᗯᗩᴥᗱᗴ◯/◯ᗝⵈ◯ⵙ◯ⵈᗝ◯/◯ᔓᔕⓄᴥᗱᗴᑐᑕⓄИNꖴ옷ᴥ◯⚪◯ᴥ옷ꖴИNⓄᑐᑕᗱᗴᴥⓄᔓᔕ◯ⵙ◯ᔓᔕⓄᴥᗱᗴᑐᑕⓄИNꖴ옷ᴥ◯⚪◯ᴥ옷ꖴИNⓄᑐᑕᗱᗴᴥⓄᔓᔕ◯/◯ᴥᗱᗴߦⓄ옷ᔓᔕᗩᴥᕤᕦ◯⚪◯ᕤᕦᴥᗩᔓᔕ옷Ⓞߦᗱᗴᴥ◯ⵙ◯ᴥᗱᗴߦⓄ옷ᔓᔕᗩᴥᕤᕦ◯⚪◯ᕤᕦᴥᗩᔓᔕ옷Ⓞߦᗱᗴᴥ◯/XHG.⠀⠀⠀⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᑎ⠀ⵙ⠀✤⠀ⵙ⠀ᗩ⠀ⵙ⠀ᗯ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᑎ⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀◯⠀ⵙ⠀ᗝ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ߦ⠀ⵙ⠀ᗩ⠀ⵙ⠀ᙏ⠀ⵙ⠀◯⠀ⵙ⠀ᗩ⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀ꖴ⠀ⵙ⠀✤⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀ᗩ⠀ⵙ⠀ᙁ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᙁ⠀ⵙ⠀ᗩ⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀✤⠀ⵙ⠀ꖴ⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀ᗩ⠀ⵙ⠀◯⠀ⵙ⠀ᙏ⠀ⵙ⠀ᗩ⠀ⵙ⠀ߦ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᗝ⠀ⵙ⠀◯⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀ᑎ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᗯ⠀ⵙ⠀ᗩ⠀ⵙ⠀✤⠀ⵙ⠀ᑎ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀⠀⠀⠀.GHX b/◯ᗩIᗝI⚭◯⚪◯⚭IᗝIᗩ◯ⵙ◯ᗩIᗝI⚭◯⚪◯⚭IᗝIᗩ◯/◯✤ᴥᗩ◯ⵙ◯ᗩᴥ✤◯/◯ᗱᗴᴥᗩᗯ✤⏀Ⓞᔓᔕ◯ⵙ◯ᔓᔕⓄ⏀✤ᗯᗩᴥᗱᗴ◯/◯ᗝⵈ◯ⵙ◯ⵈᗝ◯/◯ᔓᔕⓄᴥᗱᗴᑐᑕⓄИNꖴ옷ᴥ◯⚪◯ᴥ옷ꖴИNⓄᑐᑕᗱᗴᴥⓄᔓᔕ◯ⵙ◯ᔓᔕⓄᴥᗱᗴᑐᑕⓄИNꖴ옷ᴥ◯⚪◯ᴥ옷ꖴИNⓄᑐᑕᗱᗴᴥⓄᔓᔕ◯/◯ᴥᗱᗴߦⓄ옷ᔓᔕᗩᴥᕤᕦ◯⚪◯ᕤᕦᴥᗩᔓᔕ옷Ⓞߦᗱᗴᴥ◯ⵙ◯ᴥᗱᗴߦⓄ옷ᔓᔕᗩᴥᕤᕦ◯⚪◯ᕤᕦᴥᗩᔓᔕ옷Ⓞߦᗱᗴᴥ◯/XHG.⠀⠀⠀⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᑎ⠀ⵙ⠀✤⠀ⵙ⠀ᗩ⠀ⵙ⠀ᗯ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᑎ⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀◯⠀ⵙ⠀ᗝ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ߦ⠀ⵙ⠀ᗩ⠀ⵙ⠀ᙏ⠀ⵙ⠀◯⠀ⵙ⠀ᗩ⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀ꖴ⠀ⵙ⠀✤⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀ᗩ⠀ⵙ⠀ᙁ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᙁ⠀ⵙ⠀ᗩ⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀✤⠀ⵙ⠀ꖴ⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀ᗩ⠀ⵙ⠀◯⠀ⵙ⠀ᙏ⠀ⵙ⠀ᗩ⠀ⵙ⠀ߦ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᗝ⠀ⵙ⠀◯⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀ᑎ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᗯ⠀ⵙ⠀ᗩ⠀ⵙ⠀✤⠀ⵙ⠀ᑎ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀⠀⠀⠀.GHX new file mode 100644 index 00000000..39ba3b2b --- /dev/null +++ b/◯ᗩIᗝI⚭◯⚪◯⚭IᗝIᗩ◯ⵙ◯ᗩIᗝI⚭◯⚪◯⚭IᗝIᗩ◯/◯✤ᴥᗩ◯ⵙ◯ᗩᴥ✤◯/◯ᗱᗴᴥᗩᗯ✤⏀Ⓞᔓᔕ◯ⵙ◯ᔓᔕⓄ⏀✤ᗯᗩᴥᗱᗴ◯/◯ᗝⵈ◯ⵙ◯ⵈᗝ◯/◯ᔓᔕⓄᴥᗱᗴᑐᑕⓄИNꖴ옷ᴥ◯⚪◯ᴥ옷ꖴИNⓄᑐᑕᗱᗴᴥⓄᔓᔕ◯ⵙ◯ᔓᔕⓄᴥᗱᗴᑐᑕⓄИNꖴ옷ᴥ◯⚪◯ᴥ옷ꖴИNⓄᑐᑕᗱᗴᴥⓄᔓᔕ◯/◯ᴥᗱᗴߦⓄ옷ᔓᔕᗩᴥᕤᕦ◯⚪◯ᕤᕦᴥᗩᔓᔕ옷Ⓞߦᗱᗴᴥ◯ⵙ◯ᴥᗱᗴߦⓄ옷ᔓᔕᗩᴥᕤᕦ◯⚪◯ᕤᕦᴥᗩᔓᔕ옷Ⓞߦᗱᗴᴥ◯/XHG.⠀⠀⠀⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᑎ⠀ⵙ⠀✤⠀ⵙ⠀ᗩ⠀ⵙ⠀ᗯ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᑎ⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀◯⠀ⵙ⠀ᗝ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ߦ⠀ⵙ⠀ᗩ⠀ⵙ⠀ᙏ⠀ⵙ⠀◯⠀ⵙ⠀ᗩ⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀ꖴ⠀ⵙ⠀✤⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀ᗩ⠀ⵙ⠀ᙁ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᙁ⠀ⵙ⠀ᗩ⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀✤⠀ⵙ⠀ꖴ⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀ᗩ⠀ⵙ⠀◯⠀ⵙ⠀ᙏ⠀ⵙ⠀ᗩ⠀ⵙ⠀ߦ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᗝ⠀ⵙ⠀◯⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀ᑎ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᗯ⠀ⵙ⠀ᗩ⠀ⵙ⠀✤⠀ⵙ⠀ᑎ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᔓᔕ⠀ⵙ⠀⠀⠀⠀.GHX @@ -0,0 +1,29186 @@ + + + + + + + + 0 + 2 + 2 + + + + + + + 1 + 0 + 7 + + + + + + 0817f529-aa76-40a7-8cad-914d072469b8 + Shaded + 0 + + 255;240;240;240 + + + 255;207;207;207 + + + + + + 633740217794324378 + + XHG.⠀⠀⠀⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᑎ⠀ⵙ⠀✤⠀ⵙ⠀ᗩ⠀ⵙ⠀ᗯ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᑎ⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀◯⠀ⵙ⠀ᗝ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ߦ⠀ⵙ⠀ᗩ⠀ⵙ⠀ᙏ⠀ⵙ⠀◯⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᙁ⠀ⵙ⠀ߦ⠀ⵙ⠀ꖴ⠀ⵙ⠀✤⠀ⵙ⠀ᙁ⠀ⵙ⠀ᑎ⠀ⵙ⠀ᙏ⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀⠀⠀⠀◯⠀⠀⠀⠀ⵙ⠀ᙏ⠀ⵙ⠀ᑎ⠀ⵙ⠀ᙁ⠀ⵙ⠀✤⠀ⵙ⠀ꖴ⠀ⵙ⠀ߦ⠀ⵙ⠀ᙁ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀◯⠀ⵙ⠀ᙏ⠀ⵙ⠀ᗩ⠀ⵙ⠀ߦ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀ᗝ⠀ⵙ⠀◯⠀ⵙ⠀ᑐᑕ⠀ⵙ⠀ᑎ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᗯ⠀ⵙ⠀ᗩ⠀ⵙ⠀✤⠀ⵙ⠀ᑎ⠀ⵙ⠀ᴥ⠀ⵙ⠀ᗱᗴ⠀ⵙ⠀⠀⠀⠀.GHX + + + + + 0 + + + + + + -1860 + -168 + + 0.926588058 + + + + + 0 + + + + + + + 0 + + + + + 1 + + + + + Pufferfish, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null + 3.0.0.0 + Michael Pryor + 1c9de8a1-315f-4c56-af06-8f69fee80a7a + Pufferfish + 3.0.0.0 + + + + + + + 204 + + + + + cae9fe53-6d63-44ed-9d6d-13180fbf6f89 + 1c9de8a1-315f-4c56-af06-8f69fee80a7a + Curve Graph Mapper + + + + + Remap values with a custom graph using input curves. + true + b8912b0c-0928-413c-aa6f-6b67cf5449da + Curve Graph Mapper + Curve Graph Mapper + + + + + + 1817 + 765 + 148 + 224 + + + 1879 + 877 + + + + + + 1 + One or multiple graph curves to graph map values with + 85f53a08-ab61-4f56-8cd9-9bd912b0c48f + Curves + Curves + false + 3efcf628-bc42-4274-8af9-de2b19540957 + 1 + + + + + + 1819 + 767 + 48 + 27 + + + 1843 + 780.75 + + + + + + + + Rectangle which defines the boundary of the graph, graph curves should be atleast partially inside this boundary + 0e02fd24-0745-49a9-a4b7-ff422b70cb39 + Rectangle + Rectangle + false + 332dde95-ad78-4c2f-8f95-7ea47795be9c + 1 + + + + + + 1819 + 794 + 48 + 28 + + + 1843 + 808.25 + + + + + + + + 1 + Values to graph map. Values are plotted along the X Axis, intersected with the graph curves, then mapped to the Y Axis + 5b744bfb-ede6-49bc-a6ad-5f2d866d78f5 + Values + Values + false + 3540c5a6-ed00-4088-8256-5cc9330d7c01 + 1 + + + + + + 1819 + 822 + 48 + 27 + + + 1843 + 835.75 + + + + + + + + Domain of the graphs X Axis, where the values get plotted (if omitted the input value lists domain bounds is used) + a4d08eda-8166-40a1-909c-1b293412b901 + X Axis + X Axis + true + 0 + + + + + + 1819 + 849 + 48 + 28 + + + 1843 + 863.25 + + + + + + + + Domain of the graphs Y Axis, where the values get mapped to (if omitted the input value lists domain bounds is used) + a3a866cf-9956-4e93-96df-4636df2256a5 + Y Axis + Y Axis + true + 0 + + + + + + 1819 + 877 + 48 + 27 + + + 1843 + 890.75 + + + + + + + + Flip the graphs X Axis from the bottom of the graph to the top of the graph + 777825bc-72d6-45cc-8a0a-d4569b064896 + Flip + Flip + false + 0 + + + + + + 1819 + 904 + 48 + 28 + + + 1843 + 918.25 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Resize the graph by snapping it to the extents of the graph curves, in the plane of the boundary rectangle + 0493b9c9-f683-4cf7-bb36-03d04691de0a + Snap + Snap + false + 0 + + + + + + 1819 + 932 + 48 + 27 + + + 1843 + 945.75 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Size of the graph labels + b4f01449-7664-4d79-8c6b-c6d6a0dd26df + Text Size + Text Size + false + 0 + + + + + + 1819 + 959 + 48 + 28 + + + 1843 + 973.25 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.0625 + + + + + + + + + + + 1 + Resulting graph mapped values, mapped on the Y Axis + 80544141-adaf-4121-b91d-59dc485f5186 + Mapped + Mapped + false + 0 + + + + + + 1891 + 767 + 72 + 20 + + + 1927 + 777 + + + + + + + + 1 + The graph curves inside the boundary of the graph + f44cd3e2-065b-47ae-b68c-8dc7269113a6 + Graph Curves + Graph Curves + false + 0 + + + + + + 1891 + 787 + 72 + 20 + + + 1927 + 797 + + + + + + + + 1 + The points on the graph curves where the X Axis input values intersected + true + f23df977-9843-48d8-80d0-aa719b62e93b + Graph Points + Graph Points + false + 0 + + + + + + 1891 + 807 + 72 + 20 + + + 1927 + 817 + + + + + + + + 1 + The lines from the X Axis input values to the graph curves + true + 49c0f244-7639-478c-b125-f0f743ef3b08 + Value Lines + Value Lines + false + 0 + + + + + + 1891 + 827 + 72 + 20 + + + 1927 + 837 + + + + + + + + 1 + The points plotted on the X Axis which represent the input values + true + b18b2d57-121e-4f18-abf4-5a0dc8909b06 + Value Points + Value Points + false + 0 + + + + + + 1891 + 847 + 72 + 20 + + + 1927 + 857 + + + + + + + + 1 + The lines from the graph curves to the Y Axis graph mapped values + true + 63bb4bb9-da44-4f8e-8284-9321d002f230 + Mapped Lines + Mapped Lines + false + 0 + + + + + + 1891 + 867 + 72 + 20 + + + 1927 + 877 + + + + + + + + 1 + The points mapped on the Y Axis which represent the graph mapped values + true + abeb9f6f-41c5-4102-af4f-18bb0c94f8cc + Mapped Points + Mapped Points + false + 0 + + + + + + 1891 + 887 + 72 + 20 + + + 1927 + 897 + + + + + + + + The graph boundary background as a surface + 8a39292d-bf27-45fa-b641-9e61af3087fd + Boundary + Boundary + false + 0 + + + + + + 1891 + 907 + 72 + 20 + + + 1927 + 917 + + + + + + + + 1 + The graph labels as curve outlines + 94f4b70f-994c-4e81-89e0-4e8c57818b8f + Labels + Labels + false + 0 + + + + + + 1891 + 927 + 72 + 20 + + + 1927 + 937 + + + + + + + + 1 + True for input values outside of the X Axis domain bounds +False for input values inside of the X Axis domain bounds + 29d03712-a8e1-44a1-ad57-33a6bec0f5b3 + Out Of Bounds + Out Of Bounds + false + 0 + + + + + + 1891 + 947 + 72 + 20 + + + 1927 + 957 + + + + + + + + 1 + True for input values on the X Axis which intersect a graph curve +False for input values on the X Axis which do not intersect a graph curve + 2a7a89c4-4910-4ecb-bf2f-4ca1a695fbb5 + Intersected + Intersected + false + 0 + + + + + + 1891 + 967 + 72 + 20 + + + 1927 + 977 + + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;170;135;255 + + A group of Grasshopper objects + be482996-5742-45ed-b0db-b31948b25ecc + 96185633-510c-475e-aa5a-317aecb4d5ef + ffa39098-dfcf-4fa6-b738-0143f6a56fd1 + 5cbfd570-f9d7-4f47-a4ba-3d56e722bd68 + c7e8046a-32a3-45ee-ac60-9a1a5babca87 + a4ba9384-9f7e-454a-b7ca-236f9cb656f4 + 6f995574-4aef-437c-a71c-de9746adc55f + 16eda690-0fda-438a-a680-88d85b340e85 + 9b1a7f5e-3559-4c7f-8983-e110b9367ccd + aef88e8f-e33d-4b86-84a2-dcd0b335020a + e9347f50-2c3d-4ea4-afe3-39c1a9c1eecf + 33d76231-d8af-4cdc-b6ad-84d3f4128c93 + ea567651-1b39-48f0-b826-b0439763d42f + 1a2d8c95-6e59-4a15-9715-e09a63f5bdac + b5ce4f30-134d-45a4-b228-680cb7c43718 + fd356245-280d-45b3-8e53-6f6db3cac3b8 + 3da56e93-b503-4aaa-913f-b21fb00a75a9 + 17 + 0e793369-6e78-49fb-90ed-b51263f573d0 + Group + + + + + + + + + + + 079bd9bd-54a0-41d4-98af-db999015f63d + VB Script + + + + + Private Function IsSet(ByVal param As String) As Boolean ' Check if an input parameter has data + Dim i As Integer = Component.Params.IndexOfInputParam(param) + If i > -1 Then + Return Component.Params.Input.ElementAt(i).DataType > 1 ' input parameter DataType of 1 means it's not receiving input (internal or external) + Else + Msg("error", "Input parameter '" & param & "' not found") + Return False + End If + End Function + + Private Sub Msg(ByVal type As String, ByVal msg As String) ' Output an error, warning, or informational message + Select Case type + Case "error" + Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, msg) + Print("Error: " & msg) + Case "warning" + Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, msg) + Print("Warning: " & msg) + Case "info" + Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, msg) + Print(msg) + End Select + End Sub + + ' Solve for the m parameter from length and width (reference {1} equation (34), except b = width and K(k) and E(k) should be K(m) and E(m)) + Private Function SolveMFromLenWid(ByVal L As Double, ByVal w As Double) As Double + If w = 0 Then + Return Defined.M_ZERO_W ' for the boundry condition width = 0, bypass the function and return the known m value + End If + + Dim n As Integer = 1 ' Iteration counter (quit if >MAXIT) + Dim lower As Double = 0 ' m must be within this range + Dim upper As Double = 1 + Dim m As Double + Dim cwl As Double + + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + cwl = 2 * EllipticE(m) / EllipticK(m) - 1 ' calculate w/L with the test value of m + If cwl < w / L Then ' compares the calculated w/L with the actual w/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + Return m + End Function + + ' Solve for the m parameter from length and height (reference {1} equation (33), except K(k) should be K(m) and k = sqrt(m)) + ' Note that it's actually possible to find 2 valid values for m (hence 2 width values) at certain height values + Private Function SolveMFromLenHt(ByVal L As Double, ByVal h As Double) As List(Of Double) + Dim n As Integer = 1 ' Iteration counter (quit if >MAXIT) + Dim lower As Double = 0 ' m must be within this range + Dim upper As Double = 1 + Dim twoWidths As Boolean = h / L >= Defined.DOUBLE_W_HL_RATIO And h / L < Defined.MAX_HL_RATIO ' check to see if h/L is within the range where 2 solutions for the width are possible + Dim m As Double + Dim mult_m As New List(Of Double) + Dim chl As Double + + If twoWidths Then + ' find the first of two possible solutions for m with the following limits: + lower = Defined.M_DOUBLE_W ' see constants at bottom of script + upper = Defined.M_MAXHEIGHT ' see constants at bottom of script + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + chl = Math.Sqrt(m) / EllipticK(m) ' calculate h/L with the test value of m + If chl > h / L Then ' compares the calculated h/L with the actual h/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + mult_m.Add(m) + + ' then find the second of two possible solutions for m with the following limits: + lower = Defined.M_MAXHEIGHT ' see constants at bottom of script + upper = 1 + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + chl = Math.Sqrt(m) / EllipticK(m) ' calculate h/L with the test value of m + If chl < h / L Then ' compares the calculated h/L with the actual h/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + + If m <= Defined.M_MAX Then ' return this m parameter only if it falls within the maximum useful value (above which the curve breaks down) + mult_m.Add(m) + End If + + Else + ' find the one possible solution for the m parameter + upper = Defined.M_DOUBLE_W ' limit the upper end of the search to the maximum value of m for which only one solution exists + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + chl = Math.Sqrt(m) / EllipticK(m) ' calculate h/L with the test value of m + If chl > h / L Then ' compares the calculated h/L with the actual h/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + mult_m.Add(m) + End If + + Return mult_m + End Function + + ' Solve for the m parameter from width and height (derived from reference {1} equations (33) and (34) with same notes as above) + Private Function SolveMFromWidHt(ByVal w As Double, ByVal h As Double) As Double + Dim n As Integer = 1 ' Iteration counter (quit if >MAXIT) + Dim lower As Double = 0 ' m must be within this range + Dim upper As Double = 1 + Dim m As Double + Dim cwh As Double + + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + cwh = (2 * EllipticE(m) - EllipticK(m)) / Math.Sqrt(m) ' calculate w/h with the test value of m + If cwh < w / h Then ' compares the calculated w/h with the actual w/h then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + + Return m + End Function + + ' Calculate length based on height and an m parameter, derived from reference {1} equation (33), except K(k) should be K(m) and k = sqrt(m) + Private Function Cal_L(ByVal h As Double, ByVal m As Double) As Double + Return h * EllipticK(m) / Math.Sqrt(m) + End Function + + ' Calculate width based on length and an m parameter, derived from reference {1} equation (34), except b = width and K(k) and E(k) should be K(m) and E(m) + Private Function Cal_W(ByVal L As Double, ByVal m As Double) As Double + Return L * (2 * EllipticE(m) / EllipticK(m) - 1) + End Function + + ' Calculate height based on length and an m parameter, from reference {1} equation (33), except K(k) should be K(m) and k = sqrt(m) + Private Function Cal_H(ByVal L As Double, ByVal m As Double) As Double + Return L * Math.Sqrt(m) / EllipticK(m) + End Function + + ' Calculate the unique m parameter based on a start tangent angle, from reference {2}, just above equation (9a), that states k = Sin(angle / 2 + Pi / 4), + ' but as m = k^2 and due to this script's need for an angle rotated 90° versus the one in reference {1}, the following formula is the result + ' New note: verified by reference {4}, pg. 78 at the bottom + Private Function Cal_M(ByVal a As Double) As Double + Return (1 - Math.Cos(a)) / 2 ' equal to Sin^2(a/2) too + End Function + + ' Calculate start tangent angle based on an m parameter, derived from above formula + Private Function Cal_A(ByVal m As Double) As Double + Return Math.Acos(1 - 2 * m) + End Function + + ' This is the heart of this script, taking the found (or specified) length, width, and angle values along with the found m parameter to create + ' a list of points that approximate the shape or form of the elastica. It works by finding the x and y coordinates (which are reversed versus + ' the original equations (12a) and (12b) from reference {2} due to the 90° difference in orientation) based on the tangent angle along the curve. + ' See reference {2} for more details on how they derived it. Note that to simplify things, the algorithm only calculates the points for half of the + ' curve, then mirrors those points along the y-axis. + Private Function FindBendForm(ByVal L As Double, ByVal w As Double, ByVal m As Double, ByVal ang As Double, ByVal refPln As Plane) As List(Of Point3d) + L = L / 2 ' because the below algorithm is based on the formulas in reference {2} for only half of the curve + w = w / 2 ' same + + If ang = 0 Then ' if angle (and height) = 0, then simply return the start and end points of the straight line + Dim out As New List(Of Point3d) + out.Add(refPln.PointAt(w, 0, 0)) + out.Add(refPln.PointAt(-w, 0, 0)) + Return out + End If + + Dim x As Double + Dim y As Double + Dim halfCurvePts As New List(Of Point3d) + Dim fullCurvePts As New List(Of Point3d) + Dim translatedPts As New List(Of Point3d) + + ang -= Math.PI / 2 ' a hack to allow this algorithm to work, since the original curve in paper {2} was rotated 90° + Dim angB As Double = ang + (-Math.PI / 2 - ang) / Defined.CURVEDIVS ' angB is the 'lowercase theta' which should be in formula {2}(12b) as the interval + ' start [a typo...see equation(3)]. It's necessary to start angB at ang + [interval] instead of just ang due to integration failing at angB = ang + halfCurvePts.Add(New Point3d(w, 0, 0)) ' start with this known initial point, as integration will fail when angB = ang + + ' each point {x, y} is calculated from the tangent angle, angB, that occurs at each point (which is why this iterates from ~ang to -pi/2, the known end condition) + Do While Math.Round(angB, Defined.ROUNDTO) >= Math.Round(-Math.PI / 2, Defined.ROUNDTO) + y = (Math.Sqrt(2) * Math.Sqrt(Math.Sin(ang) - Math.Sin(angB)) * (w + L)) / (2 * EllipticE(m)) ' note that x and y are swapped vs. (12a) and (12b) + x = (L / (Math.Sqrt(2) * EllipticK(m))) * Simpson(angB, -Math.PI / 2, 500, ang) ' calculate the Simpson approximation of the integral (function f below) + ' over the interval angB ('lowercase theta') to -pi/2. side note: is 500 too few iterations for the Simson algorithm? + + If Math.Round(x, Defined.ROUNDTO) = 0 Then x = 0 + halfCurvePts.Add(New Point3d(x, y, 0)) + + angB += (-Math.PI / 2 - ang) / Defined.CURVEDIVS ' onto the next tangent angle + Loop + + ' After finding the x and y values for half of the curve, add the {-x, y} values for the rest of the curve + For Each point As Point3d In halfCurvePts + If Math.Round(point.X, Defined.ROUNDTO) = 0 Then + If Math.Round(point.Y, Defined.ROUNDTO) = 0 Then + fullCurvePts.Add(New Point3d(0, 0, 0)) ' special case when width = 0: when x = 0, only duplicate the point when y = 0 too + End If + Else + fullCurvePts.Add(New Point3d(-point.X, point.Y, 0)) + End If + Next + halfCurvePts.Reverse + fullCurvePts.AddRange(halfCurvePts) + + For Each p As Point3d In fullCurvePts + translatedPts.Add(refPln.PointAt(p.X, p.Y, p.Z)) ' translate the points from the reference plane to the world plane + Next + + Return translatedPts + End Function + + ' Interpolates the points from FindBendForm to create the Elastica curve. Uses start & end tangents for greater accuracy. + Private Function MakeCurve(ByVal pts As List(Of Point3d), ByVal ang As Double, ByVal refPln As Plane) As Curve + If ang <> 0 Then + Dim ts, te As New Vector3d(refPln.XAxis) + ts.Rotate(ang, refPln.ZAxis) + te.Rotate(-ang, refPln.ZAxis) + Return Curve.CreateInterpolatedCurve(pts, 3, CurveKnotStyle.Chord, ts, te) ' 3rd degree curve with 'Chord' Knot Style + Else + Return Curve.CreateInterpolatedCurve(pts, 3) ' if angle (and height) = 0, then simply interpolate the straight line (no start/end tangents) + End If + End Function + + ' Implements the Simpson approximation for an integral of function f below + Public Function Simpson(a As Double, b As Double, n As Integer, theta As Double) As Double 'n should be an even number + Dim j As Integer, s1 As Double, s2 As Double, h As Double + h = (b - a) / n + s1 = 0 + s2 = 0 + For j = 1 To n - 1 Step 2 + s1 = s1 + fn(a + j * h, theta) + Next j + For j = 2 To n - 2 Step 2 + s2 = s2 + fn(a + j * h, theta) + Next j + Simpson = h / 3 * (fn(a, theta) + 4 * s1 + 2 * s2 + fn(b, theta)) + End Function + + ' Specific calculation for the above integration + Public Function fn(x As Double, theta As Double) As Double + fn = Math.Sin(x) / (Math.Sqrt(Math.Sin(theta) - Math.Sin(x))) ' from reference {2} formula (12b) + End Function + + + ' Return the Complete Elliptic integral of the 1st kind + ' Abramowitz and Stegun p.591, formula 17.3.11 + ' Code from http://www.codeproject.com/Articles/566614/Elliptic-integrals + Public Function EllipticK(ByVal m As Double) As Double + Dim sum, term, above, below As Double + sum = 1 + term = 1 + above = 1 + below = 2 + + For i As Integer = 1 To 100 + term *= above / below + sum += Math.Pow(m, i) * Math.Pow(term, 2) + above += 2 + below += 2 + Next + sum *= 0.5 * Math.PI + Return sum + End Function + + + ' Return the Complete Elliptic integral of the 2nd kind + ' Abramowitz and Stegun p.591, formula 17.3.12 + ' Code from http://www.codeproject.com/Articles/566614/Elliptic-integrals + Public Function EllipticE(ByVal m As Double) As Double + Dim sum, term, above, below As Double + sum = 1 + term = 1 + above = 1 + below = 2 + + For i As Integer = 1 To 100 + term *= above / below + sum -= Math.Pow(m, i) * Math.Pow(term, 2) / above + above += 2 + below += 2 + Next + sum *= 0.5 * Math.PI + Return sum + End Function + + Friend Partial NotInheritable Class Defined + Private Sub New() + End Sub + + ' Note: most of these values for m and h/L ratio were found with Wolfram Alpha and either specific intercepts (x=0) or local minima/maxima. They should be constant. + Public Const M_SKETCHY As Double = 0.95 ' value of the m parameter where the curvature near the ends of the curve gets wonky + Public Const M_MAX As Double = 0.993 ' maximum useful value of the m parameter, above which this algorithm for the form of the curve breaks down + Public Const M_ZERO_W As Double = 0.826114765984970336 ' value of the m parameter when width = 0 + Public Const M_MAXHEIGHT As Double = 0.701327460663101223 ' value of the m parameter at maximum possible height of the bent rod/wire + Public Const M_DOUBLE_W As Double = 0.180254422335013983 ' minimum value of the m parameter when two width values are possible for a given height and length + Public Const DOUBLE_W_HL_RATIO As Double = 0.257342117984635757 ' value of the height/length ratio above which there are two possible width values + Public Const MAX_HL_RATIO As Double = 0.403140189705650243 ' maximum possible value of the height/length ratio + + Public Const MAXERR As Double = 0.0000000001 ' error tolerance + Public Const MAXIT As Integer = 100 ' maximum number of iterations + Public Const ROUNDTO As Integer = 10 ' number of decimal places to round off to + Public Const CURVEDIVS As Integer = 50 ' number of sample points for building the curve (or half-curve as it were) + End Class + A VB.NET scriptable component + + 98 + 86 + + true + be482996-5742-45ed-b0db-b31948b25ecc + VB Script + VB + true + 0 + ' ----------------------------------------------------------------- + ' Elastic Bending Script by Will McElwain + ' Created February 2014 + ' + ' DESCRIPTION: + ' This beast creates the so-called 'elastica curve', the shape a long, thin rod or wire makes when it is bent elastically (i.e. not permanently). In this case, force + ' is assumed to only be applied horizontally (which would be in line with the rod at rest) and both ends are assumed to be pinned or hinged meaning they are free + ' to rotate (as opposed to clamped, when the end tangent angle is fixed, usually horizontally). An interesting finding is that it doesn't matter what the material or + ' cross-sectional area is, as long as they're uniform along the entire length. Everything makes the same shape when bent as long as it doesn't cross the threshold + ' from elastic to plastic (permanent) deformation (I don't bother to find that limit here, but can be found if the yield stress for a material is known). + ' + ' Key to the formulas used in this script are elliptic integrals, specifically K(m), the complete elliptic integral of the first kind, and E(m), the complete elliptic + ' integral of the second kind. There was a lot of confusion over the 'm' and 'k' parameters for these functions, as some people use them interchangeably, but they are + ' not the same. m = k^2 (thus k = Sqrt(m)). I try to use the 'm' parameter exclusively to avoid this confusion. Note that there is a unique 'm' parameter for every + ' configuration/shape of the elastica curve. + ' + ' This script tries to find that unique 'm' parameter based on the inputs. The algorithm starts with a test version of m, evaluates an expression, say 2*E(m)/K(m)-1, + ' then compares the result to what it should be (in this case, a known width/length ratio). Iterate until the correct m is found. Once we have m, we can then calculate + ' all of the other unknowns, then find points that lie on that curve, then interpolate those points for the actual curve. You can also use Wolfram|Alpha as I did to + ' find the m parameter based on the equations in this script (example here: http://tiny.cc/t4tpbx for when say width=45.2 and length=67.1). + ' + ' Other notes: + ' * This script works with negative values for width, which will creat a self-intersecting curve (as it should). The curvature of the elastica starts to break down around + ' m=0.95 (~154°), but this script will continue to work until M_MAX, m=0.993 (~169°). If you wish to ignore self-intersecting curves, set ignoreSelfIntersecting to True + ' * When the only known values are length and height, it is actually possible for certain ratios of height to length to have two valid m values (thus 2 possible widths + ' and angles). This script will return them both. + ' * Only the first two valid parameters (of the required ones) will be used, meaning if all four are connected (length, width or a PtB, height, and angle), this script will + ' only use length and width (or a PtB). + ' * Depending on the magnitude of your inputs (say if they're really small, like if length < 10), you might have to increase the constant ROUNDTO at the bottom + ' + ' REFERENCES: + ' {1} "The elastic rod" by M.E. Pacheco Q. & E. Pina, http://www.scielo.org.mx/pdf/rmfe/v53n2/v53n2a8.pdf + ' {2} "An experiment in nonlinear beam theory" by A. Valiente, http://www.deepdyve.com/lp/doc/I3lwnxdfGz , also here: http://tiny.cc/Valiente_AEiNBT + ' {3} "Snap buckling, writhing and Loop formation In twisted rods" by V.G.A. GOSS, http://myweb.lsbu.ac.uk/~gossga/thesisFinal.pdf + ' {4} "Theory of Elastic Stability" by Stephen Timoshenko, http://www.scribd.com/doc/50402462/Timoshenko-Theory-of-Elastic-Stability (start on p. 76) + ' + ' INPUT: + ' PtA - First anchor point (required) + ' PtB - Second anchor point (optional, though 2 out of the 4--length, width, height, angle--need to be specified) + ' [note that PtB can be the same as PtA (meaning width would be zero)] + ' [also note that if a different width is additionally specified that's not equal to the distance between PtA and PtB, then the end point will not equal PtB anymore] + ' Pln - Plane of the bent rod/wire, which bends up in the +y direction. The line between PtA and PtB (if specified) must be parallel to the x-axis of this plane + ' + ' ** 2 of the following 4 need to be specified ** + ' Len - Length of the rod/wire, which needs to be > 0 + ' Wid - Width between the endpoints of the curve [note: if PtB is specified in addition, and distance between PtA and PtB <> width, the end point will be relocated + ' Ht - Height of the bent rod/wire (when negative, curve will bend downward, relative to the input plane, instead) + ' Ang - Inner departure angle or tangent angle (in radians) at the ends of the bent rod/wire. Set up so as width approaches length (thus height approaches zero), angle approaches zero + ' + ' * Following variables only needed for optional calculating of bending force, not for shape of curve. + ' E - Young's modulus (modulus of elasticity) in GPa (=N/m^2) (material-specific. for example, 7075 aluminum is roughly 71.7 GPa) + ' I - Second moment of area (or area moment of inertia) in m^4 (cross-section-specific. for example, a hollow rod + ' would have I = pi * (outer_diameter^4 - inner_diameter^4) / 32 + ' Note: E*I is also known as flexural rigidity or bending stiffness + ' + ' OUTPUT: + ' out - only for debugging messages + ' Pts - the list of points that approximate the shape of the elastica + ' Crv - the 3rd-degree curve interpolated from those points (with accurate start & end tangents) + ' L - the length of the rod/wire + ' W - the distance (width) between the endpoints of the rod/wire + ' H - the height of the bent rod/wire + ' A - the tangent angle at the (start) end of the rod/wire + ' F - the force needed to hold the rod/wire in a specific shape (based on the material properties & cross-section) **be sure your units for 'I' match your units for the + ' rest of your inputs (length, width, etc.). Also note that the critical buckling load (force) that makes the rod/wire start to bend can be found at height=0 + ' + ' THANKS TO: + ' Mårten Nettelbladt (thegeometryofbending.blogspot.com) + ' Daniel Piker (Kangaroo plugin) + ' David Rutten (Grasshopper guru) + ' Euler & Bernoulli (the O.G.'s) + ' + ' ----------------------------------------------------------------- + + Dim ignoreSelfIntersecting As Boolean = False ' set to True if you don't want to output curves where width < 0, which creates a self-intersecting curve + + Dim inCt As Integer = 0 ' count the number of required parameters that are receiving data + Dim length As Double + Dim width As System.Object = Nothing ' need to set as Nothing so we can check if it has been assigned a value later + Dim height As Double + Dim angle As Double + Dim m As Double + Dim multiple_m As New List(Of Double) + Dim AtoB As Line + Dim flip_H As Boolean = False ' if height is negative, this flag will be set + Dim flip_A As Boolean = False ' if angle is negative, this flag will be set + + If Not IsSet("Pln") Then + Msg("error", "Base plane is not set") + Return + End If + + If Not IsSet("PtA") Then + Msg("error", "Point A is not set") + Return + End If + + If Math.Round(Pln.DistanceTo(PtA), Defined.ROUNDTO) <> 0 Then + Msg("error", "Point A is not on the base plane") + Return + End If + + Dim refPlane As Plane = Pln ' create a reference plane = input plane and set the origin of it to PtA in case PtA isn't the origin already + refPlane.Origin = PtA + + If IsSet("PtB") Then + If Math.Round(Pln.DistanceTo(PtB), Defined.ROUNDTO) <> 0 Then + Msg("error", "Point B is not on the base plane") + Return + End If + + AtoB = New Line(PtA, PtB) + If AtoB.Length <> 0 And Not AtoB.Direction.IsPerpendicularTo(Pln.YAxis) Then + Msg("error", "The line between PtA and PtB is not perpendicular to the Y-axis of the specified plane") + Return + End If + + inCt += 1 + If IsSet("Wid") Then Msg("info", "Wid will override the distance between PtA and PtB. If you do not want this to happen, disconnect PtB or Wid.") + + width = PtA.DistanceTo(PtB) ' get the width (distance) between PtA and PtB + + Dim refPtB As Point3d + refPlane.RemapToPlaneSpace(PtB, refPtB) + If refPtB.X < 0 Then width = -width ' check if PtB is to the left of PtA...if so, width is negative + End If + + If IsSet("Len") Then inCt += 1 + If IsSet("Wid") Then inCt += 1 + If IsSet("Ht") Then inCt += 1 + If IsSet("Ang") Then inCt += 1 + If inCt > 2 Then Msg("info", "More parameters set than are required (out of length, width, height, angle). Only using the first two valid ones.") + + ' check for connected/specified inputs. note: only the first two that it comes across will be used + If IsSet("Len") Then ' if length is specified then... + If Len <= 0 Then + Msg("error", "Length cannot be negative or zero") + Return + End If + If IsSet("Wid") Then ' find height & angle based on length and specified width + If Wid > Len Then + Msg("error", "Width is greater than length") + Return + End If + If Wid = Len Then ' skip the solver and set the known values + height = 0 + m = 0 + angle = 0 + width = Wid + Else + m = SolveMFromLenWid(Len, Wid) + height = Cal_H(Len, m) ' L * Sqrt(m) / K(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + width = Wid + End If + + Else If width IsNot Nothing Then ' find height & angle based on length and calculated width (distance between PtA and PtB) + If width > Len Then + Msg("error", "Width is greater than length") + Return + End If + If width = Len Then ' skip the solver and set the known values + height = 0 + m = 0 + angle = 0 + Else + m = SolveMFromLenWid(Len, width) + height = Cal_H(Len, m) ' L * Sqrt(m) / K(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + + Else If IsSet("Ht") Then ' find width & angle based on length and height ** possible to return 2 results ** + If Math.Abs(Ht / Len) > Defined.MAX_HL_RATIO Then + Msg("error", "Height not possible with given length") + Return + End If + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + If Ht = 0 Then ' skip the solver and set the known values + width = Len + angle = 0 + Else + multiple_m = SolveMFromLenHt(Len, Ht) ' note that it's possible for two values of m to be found if height is close to max height + If multiple_m.Count = 1 Then ' if there's only one m value returned, calculate the width & angle here. we'll deal with multiple m values later + m = multiple_m.Item(0) + width = Cal_W(Len, m) ' L * (2 * E(m) / K(m) - 1) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + End If + height = Ht + + Else If IsSet("Ang") Then ' find width & height based on length and angle + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then ' skip the solver and set the known values + width = Len + height = 0 + Else + width = Cal_W(Len, m) ' L * (2 * E(m) / K(m) - 1) + height = Cal_H(Len, m) ' L * Sqrt(m) / K(m) + End If + angle = Ang + + Else + Msg("error", "Need to specify one more parameter in addition to length") + Return + End If + length = Len + + Else If IsSet("Wid") Then ' if width is specified then... + If IsSet("Ht") Then ' find length & angle based on specified width and height + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + If Ht = 0 Then ' skip the solver and set the known values + length = Wid + angle = 0 + Else + m = SolveMFromWidHt(Wid, Ht) + length = Cal_L(Ht, m) ' h * K(m) / Sqrt(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + height = Ht + + Else If IsSet("Ang") Then ' find length & height based on specified width and angle + If Wid = 0 Then + Msg("error", "Curve not possible with width = 0 and an angle as inputs") + Return + End If + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then ' skip the solver and set the known values + length = Wid + height = 0 + Else + length = Wid / (2 * EllipticE(m) / EllipticK(m) - 1) + If length < 0 Then + Msg("error", "Curve not possible at specified width and angle (calculated length is negative)") + Return + End If + height = Cal_H(length, m) ' L * Sqrt(m) / K(m) + End If + angle = Ang + + Else + Msg("error", "Need to specify one more parameter in addition to width (Wid)") + Return + End If + width = Wid + + Else If width IsNot Nothing Then ' if width is determined by PtA and PtB then... + If IsSet("Ht") Then ' find length & angle based on calculated width and height + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + If Ht = 0 Then ' skip the solver and set the known values + length = width + angle = 0 + Else + m = SolveMFromWidHt(width, Ht) + length = Cal_L(Ht, m) ' h * K(m) / Sqrt(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + height = Ht + + Else If IsSet("Ang") Then ' find length & height based on calculated width and angle + If width = 0 Then + Msg("error", "Curve not possible with width = 0 and an angle as inputs") + Return + End If + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then ' skip the solver and set the known values + length = width + height = 0 + Else + length = width / (2 * EllipticE(m) / EllipticK(m) - 1) + If length < 0 Then + Msg("error", "Curve not possible at specified width and angle (calculated length is negative)") + Return + End If + height = Cal_H(length, m) ' L * Sqrt(m) / K(m) + End If + angle = Ang + + Else + Msg("error", "Need to specify one more parameter in addition to PtA and PtB") + Return + End If + + Else If IsSet("Ht") Then ' if height is specified then... + If IsSet("Ang") Then ' find length & width based on height and angle + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_H = True + flip_A = True + End If + If Ht = 0 Then + Msg("error", "Height can't = 0 if only height and angle are specified") + Return + Else + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = Not flip_A + flip_H = Not flip_H + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then + Msg("error", "Angle can't = 0 if only height and angle are specified") + Return + Else + length = Cal_L(Ht, m) ' h * K(m) / Sqrt(m) + width = Cal_W(length, m) ' L * (2 * E(m) / K(m) - 1) + End If + angle = Ang + End If + height = Ht + + Else + Msg("error", "Need to specify one more parameter in addition to height") + Return + End If + + Else If IsSet("Ang") Then + Msg("error", "Need to specify one more parameter in addition to angle") + Return + Else + Msg("error", "Need to specify two of the four parameters: length, width (or PtB), height, and angle") + Return + End If + + If m > Defined.M_MAX Then + Msg("error", "Form of curve not solvable with current algorithm and given inputs") + Return + End If + + refPlane.Origin = refPlane.PointAt(width / 2, 0, 0) ' adjust the origin of the reference plane so that the curve is centered about the y-axis (start of the curve is at x = -width/2) + + If multiple_m.Count > 1 Then ' if there is more than one m value returned, calculate the width, angle, and curve for each + Dim multi_pts As New DataTree(Of Point3d) + Dim multi_crv As New List(Of Curve) + Dim tmp_pts As New List(Of Point3d) + Dim multi_W, multi_A, multi_F As New List(Of Double) + Dim j As Integer = 0 ' used for creating a new branch (GH_Path) for storing pts which is itself a list of points + + For Each m_val As Double In multiple_m + width = Cal_W(length, m_val) 'length * (2 * EllipticE(m_val) / EllipticK(m_val) - 1) + + If width < 0 And ignoreSelfIntersecting Then + Msg("warning", "One curve is self-intersecting. To enable these, set ignoreSelfIntersecting to False") + Continue For + End If + + If m_val >= Defined.M_SKETCHY Then Msg("info", "Accuracy of the curve whose width = " & Math.Round(width, 4) & " is not guaranteed") + + angle = Cal_A(m_val) 'Math.Asin(2 * m_val - 1) + refPlane.Origin = refPlane.PointAt(width / 2, 0, 0) ' adjust the origin of the reference plane so that the curve is centered about the y-axis (start of the curve is at x = -width/2) + + tmp_pts = FindBendForm(length, width, m_val, angle, refPlane) + multi_pts.AddRange(tmp_pts, New GH_Path(j)) + multi_crv.Add(MakeCurve(tmp_pts, angle, refPlane)) + + multi_W.Add(width) + If flip_A Then angle = -angle + multi_A.Add(angle) + + E = E * 10 ^ 9 ' Young's modulus input E is in GPa, so we convert to Pa here (= N/m^2) + multi_F.Add(EllipticK(m_val) ^ 2 * E * I / length ^ 2) ' from reference {4} pg. 79 + + j += 1 + refPlane.Origin = PtA ' reset the reference plane origin to PtA for the next m_val + 'Print("length=" & length & ", width=" & width & ", height=" & height & ", angle=" & angle & ", m=" & m_val & ", k=" & Math.Sqrt(m_val) & ", w/L=" & width / length & ", h/L=" & height / length & ", w/h=" & width / height) + Next + + ' assign the outputs + Pts = multi_pts + Crv = multi_crv + L = length + W = multi_W + If flip_H Then height = -height + H = height + A = multi_A + F = multi_F + + Else ' only deal with the single m value + If m >= Defined.M_SKETCHY Then Msg("info", "Accuracy of the curve at these parameters is not guaranteed") + + If width < 0 And ignoreSelfIntersecting Then + Msg("error", "Curve is self-intersecting. To enable these, set ignoreSelfIntersecting to False") + Return + End If + + Pts = FindBendForm(length, width, m, angle, refPlane) + Crv = MakeCurve(pts, angle, refPlane) + L = length + W = width + If flip_H Then height = -height + H = height + If flip_A Then angle = -angle + A = angle + + E = E * 10 ^ 9 ' Young's modulus input E is in GPa, so we convert to Pa here (= N/m^2) + F = EllipticK(m) ^ 2 * E * I / length ^ 2 ' from reference {4} pg. 79. Note: the critical buckling (that makes the rod/wire start to bend) can be found at height=0 (width=length) + + 'height = Math.Sqrt(((2 * Len / 5) ^ 2 - ((Wid - Len / 5) / 2) ^ 2) ' quick approximation discovered by Mårten of 'Geometry of Bending' fame ( http://tiny.cc/it2pbx ) + 'width = (Len +/- 2 * Math.Sqrt(4 * Len ^ 2 - 25 * Ht ^ 2)) / 5 ' derived from above + 'length = (2 * Math.Sqrt(15 * Ht ^ 2 + 4 * Wid ^ 2) - Wid) / 3 ' derived from above + + 'Print("length=" & length & ", width=" & width & ", height=" & height & ", angle=" & angle & ", m=" & m & ", k=" & Math.Sqrt(m) & ", w/L=" & width / length & ", h/L=" & height / length & ", w/h=" & width / height) + End If + + + + + + + 471 + 731 + 69 + 184 + + + 507 + 823 + + + + + + 9 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 8 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script Variable PtA + 59449ef9-05ed-4dc9-8226-c71140ebee0e + PtA + PtA + true + 0 + true + 185356cd-7c2c-43be-929c-08664fead7b6 + 1 + e1937b56-b1da-4c12-8bd8-e34ee81746ef + + + + + + 473 + 733 + 22 + 20 + + + 484 + 743 + + + + + + + + true + Script Variable PtB + dcfecc5a-a797-4dd5-8113-7ff42a34b690 + PtB + PtB + true + 0 + true + 3650af54-be61-49e3-84ef-0d855566cb94 + 1 + e1937b56-b1da-4c12-8bd8-e34ee81746ef + + + + + + 473 + 753 + 22 + 20 + + + 484 + 763 + + + + + + + + true + Script Variable Pln + e5baa4bf-8832-464d-b509-5e5a63a6c1f7 + Pln + Pln + true + 0 + true + 553f31ec-0f72-481e-ab04-97626f07c43a + 1 + 3897522d-58e9-4d60-b38c-978ddacfedd8 + + + + + + 473 + 773 + 22 + 20 + + + 484 + 783 + + + + + + + + true + Script Variable Len + 109dbfe4-0341-4971-89fa-f5d18de07927 + Len + Len + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 473 + 793 + 22 + 20 + + + 484 + 803 + + + + + + + + true + Script Variable Wid + 9f556d24-607a-43ea-9776-93ac44530b2d + Wid + Wid + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 473 + 813 + 22 + 20 + + + 484 + 823 + + + + + + + + true + Script Variable Ht + 35c2e17b-323c-4f1c-bf60-0e6dfbd26156 + Ht + Ht + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 473 + 833 + 22 + 20 + + + 484 + 843 + + + + + + + + true + Script Variable Ang + 40ffc963-a05b-46d6-8714-34be65128aff + Ang + Ang + true + 0 + true + f8e31412-714a-4cc1-bfef-678fe31bf9eb + 1 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 473 + 853 + 22 + 20 + + + 484 + 863 + + + + + + + + true + Script Variable E + d6304781-6e12-4d73-a7f3-998a65ee405e + E + E + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 473 + 873 + 22 + 20 + + + 484 + 883 + + + + + + + + true + Script Variable I + bd4895e2-5742-4cbf-83da-9c7d2e49c01e + I + I + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 473 + 893 + 22 + 20 + + + 484 + 903 + + + + + + + + 1 + Print, Reflect and Error streams + f28f837e-8c12-4625-8cb7-328675d707f4 + out + out + false + 0 + + + + + + 519 + 733 + 19 + 22 + + + 528.5 + 744.25 + + + + + + + + Output parameter Pts + e9b2febf-f54f-4469-a015-c2bac110b4a3 + Pts + Pts + false + 0 + + + + + + 519 + 755 + 19 + 23 + + + 528.5 + 766.75 + + + + + + + + Output parameter Crv + a20a05cc-1099-41a9-86c6-1cb13c534ffc + Crv + Crv + false + 0 + + + + + + 519 + 778 + 19 + 22 + + + 528.5 + 789.25 + + + + + + + + Output parameter L + df8a57f3-1455-4b39-839c-7e1a57830df8 + L + L + false + 0 + + + + + + 519 + 800 + 19 + 23 + + + 528.5 + 811.75 + + + + + + + + Output parameter W + 9e74e94e-11a8-4aef-af9f-5a0e2f8d0342 + W + W + false + 0 + + + + + + 519 + 823 + 19 + 22 + + + 528.5 + 834.25 + + + + + + + + Output parameter H + 29605ab6-b1c4-4849-a08e-b9e58a465802 + H + H + false + 0 + + + + + + 519 + 845 + 19 + 23 + + + 528.5 + 856.75 + + + + + + + + Output parameter A + 5a089a3d-8af1-40d7-8a27-35031144c0ac + A + A + false + 0 + + + + + + 519 + 868 + 19 + 22 + + + 528.5 + 879.25 + + + + + + + + Output parameter F + fa95972f-15fa-417b-9c53-e9241cdecf61 + F + F + false + 0 + + + + + + 519 + 890 + 19 + 23 + + + 528.5 + 901.75 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 96185633-510c-475e-aa5a-317aecb4d5ef + Number Slider + width + false + 0 + + + + + + 12 + 811 + 157 + 20 + + + 12.72153 + 811.7632 + + + + + + 2 + 1 + 0 + 400 + -130 + 0 + 183.21 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + ffa39098-dfcf-4fa6-b738-0143f6a56fd1 + Number Slider + length + false + 0 + + + + + + 12 + 784 + 160 + 20 + + + 12.37784 + 784.9132 + + + + + + 2 + 1 + 0 + 400 + 0 + 0 + 300 + + + + + + + + + fbac3e32-f100-4292-8692-77240a42fd1a + Point + + + + + Contains a collection of three-dimensional points + true + 5cbfd570-f9d7-4f47-a4ba-3d56e722bd68 + Point + Pt + false + e9b2febf-f54f-4469-a015-c2bac110b4a3 + 1 + + + + + + 636 + 693 + 50 + 24 + + + 661.8324 + 705.6324 + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + c7e8046a-32a3-45ee-ac60-9a1a5babca87 + Panel + + false + 0 + 588cf1ad-e6d6-4e22-ac4d-133e6dd18684 + 1 + Double click to edit panel content… + + + + + + 710 + 907 + 105 + 55 + + 0 + 0 + 0 + + 710.0481 + 907.9934 + + + + + + + 255;255;250;90 + + true + true + true + false + false + true + + + + + + + + + 0d77c51e-584f-44e8-aed2-c2ddf4803888 + Degrees + + + + + Convert an angle specified in radians to degrees + true + a4ba9384-9f7e-454a-b7ca-236f9cb656f4 + Degrees + Deg + + + + + + 613 + 919 + 49 + 28 + + + 637 + 933 + + + + + + Angle in radians + b47cb3ff-d339-4bf8-9a62-67237154401b + Radians + R + false + 5a089a3d-8af1-40d7-8a27-35031144c0ac + 1 + + + + + + 615 + 921 + 10 + 24 + + + 620 + 933 + + + + + + + + Angle in degrees + 588cf1ad-e6d6-4e22-ac4d-133e6dd18684 + Degrees + D + false + 0 + + + + + + 649 + 921 + 11 + 24 + + + 654.5 + 933 + + + + + + + + + + + + 3581f42a-9592-4549-bd6b-1c0fc39d067b + Construct Point + + + + + Construct a point from {xyz} coordinates. + true + 6f995574-4aef-437c-a71c-de9746adc55f + Construct Point + Pt + + + + + + 254 + 602 + 52 + 64 + + + 279 + 634 + + + + + + {x} coordinate + f4cc2a89-59b7-48a6-950d-0b016217ef81 + X coordinate + X + false + 827ed593-a53c-4a06-8c7f-23980c226d78 + 1 + + + + + + 256 + 604 + 11 + 20 + + + 261.5 + 614 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + {y} coordinate + b34a844c-f4f1-4eab-a69f-a8976dc71ff6 + Y coordinate + Y + false + 3da56e93-b503-4aaa-913f-b21fb00a75a9 + 1 + + + + + + 256 + 624 + 11 + 20 + + + 261.5 + 634 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.5 + + + + + + + + + + + {z} coordinate + 9017a9a4-ed96-46d9-a006-c319a210a900 + Z coordinate + Z + false + 0 + + + + + + 256 + 644 + 11 + 20 + + + 261.5 + 654 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Point coordinate + 185356cd-7c2c-43be-929c-08664fead7b6 + Point + Pt + false + 0 + + + + + + 291 + 604 + 13 + 60 + + + 297.5 + 634 + + + + + + + + + + + + 3581f42a-9592-4549-bd6b-1c0fc39d067b + Construct Point + + + + + Construct a point from {xyz} coordinates. + true + 16eda690-0fda-438a-a680-88d85b340e85 + Construct Point + Pt + + + + + + 251 + 671 + 52 + 64 + + + 276 + 703 + + + + + + {x} coordinate + a9fb135d-d3c2-45b1-b824-d7ac23be6784 + X coordinate + X + false + 3da56e93-b503-4aaa-913f-b21fb00a75a9 + 1 + + + + + + 253 + 673 + 11 + 20 + + + 258.5 + 683 + + + + + + 1 + + + + + 1 + {0} + + + + + 80 + + + + + + + + + + + {y} coordinate + 6e01b007-0569-4149-a5fd-f1473c302da8 + Y coordinate + Y + false + 3da56e93-b503-4aaa-913f-b21fb00a75a9 + 1 + + + + + + 253 + 693 + 11 + 20 + + + 258.5 + 703 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.5 + + + + + + + + + + + {z} coordinate + 22a07e7e-8413-4c51-b459-670da0de4424 + Z coordinate + Z + false + 0 + + + + + + 253 + 713 + 11 + 20 + + + 258.5 + 723 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Point coordinate + 3650af54-be61-49e3-84ef-0d855566cb94 + Point + Pt + false + 0 + + + + + + 288 + 673 + 13 + 60 + + + 294.5 + 703 + + + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + true + 9b1a7f5e-3559-4c7f-8983-e110b9367ccd + Curve + Crv + false + a20a05cc-1099-41a9-86c6-1cb13c534ffc + 1 + + + + + + 599 + 746 + 50 + 24 + + + 624.8213 + 758.1622 + + + + + + + + + + 17b7152b-d30d-4d50-b9ef-c9fe25576fc2 + XY Plane + + + + + World XY plane. + true + aef88e8f-e33d-4b86-84a2-dcd0b335020a + XY Plane + XY + + + + + + 333 + 744 + 49 + 28 + + + 358 + 758 + + + + + + Origin of plane + 083edf92-9248-4053-9066-409138e7f4b4 + Origin + O + false + 0 + + + + + + 335 + 746 + 11 + 24 + + + 340.5 + 758 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + World XY plane + 553f31ec-0f72-481e-ab04-97626f07c43a + Plane + P + false + 0 + + + + + + 370 + 746 + 10 + 24 + + + 375 + 758 + + + + + + + + + + + + a4cd2751-414d-42ec-8916-476ebf62d7fe + Radians + + + + + Convert an angle specified in degrees to radians + true + e9347f50-2c3d-4ea4-afe3-39c1a9c1eecf + Radians + Rad + + + + + + 337 + 863 + 49 + 28 + + + 362 + 877 + + + + + + Angle in degrees + e1a58c09-29d9-44d5-bbd6-b2cc83183e41 + Degrees + D + false + 8201ca98-0edb-4aa3-9ef0-1efdd7b5e887 + 1 + + + + + + 339 + 865 + 11 + 24 + + + 344.5 + 877 + + + + + + + + Angle in radians + f8e31412-714a-4cc1-bfef-678fe31bf9eb + Radians + R + false + 0 + + + + + + 374 + 865 + 10 + 24 + + + 379 + 877 + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 33d76231-d8af-4cdc-b6ad-84d3f4128c93 + Number Slider + angle ° + false + 0 + + + + + + 17 + 868 + 166 + 20 + + + 17.35091 + 868.6044 + + + + + + 2 + 1 + 0 + 180 + -180 + 0 + 68.99 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + ea567651-1b39-48f0-b826-b0439763d42f + Number Slider + height + false + 0 + + + + + + 13 + 838 + 160 + 20 + + + 13.45993 + 838.8031 + + + + + + 2 + 1 + 0 + 200 + 0 + 0 + 112.83 + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 1a2d8c95-6e59-4a15-9715-e09a63f5bdac + Panel + + false + 0 + df8a57f3-1455-4b39-839c-7e1a57830df8 + 1 + Double click to edit panel content… + + + + + + 591 + 787 + 106 + 38 + + 0 + 0 + 0 + + 591.8511 + 787.5596 + + + + + + + 255;255;250;90 + + true + true + true + false + false + true + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + b5ce4f30-134d-45a4-b228-680cb7c43718 + Panel + + false + 0 + 9e74e94e-11a8-4aef-af9f-5a0e2f8d0342 + 1 + Double click to edit panel content… + + + + + + 710 + 812 + 105 + 55 + + 0 + 0 + 0 + + 710.41 + 812.4274 + + + + + + + 255;255;250;90 + + true + true + true + false + false + true + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + fd356245-280d-45b3-8e53-6f6db3cac3b8 + Panel + + false + 0 + 29605ab6-b1c4-4849-a08e-b9e58a465802 + 1 + Double click to edit panel content… + + + + + + 590 + 847 + 108 + 38 + + 0 + 0 + 0 + + 590.7999 + 847.9436 + + + + + + + 255;255;250;90 + + true + true + true + false + false + true + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 3da56e93-b503-4aaa-913f-b21fb00a75a9 + Panel + + false + 0 + 0 + .0625 + + + + + + 70 + 664 + 50 + 20 + + 0 + 0 + 0 + + 70.01492 + 664.9438 + + + + + + + 255;255;250;90 + + true + true + true + false + false + true + + + + + + + + + a3371040-e552-4bc8-b0ff-10a840258e88 + Negative + + + + + Compute the negative of a value. + true + 4d74b572-72ca-479d-98fe-1102ff538c33 + Negative + Negative + + + + + + 88 + 586 + 88 + 28 + + + 131 + 600 + + + + + + Input value + 83b04357-23f4-4431-86c3-eecc17e0641d + Value + Value + false + 3da56e93-b503-4aaa-913f-b21fb00a75a9 + 1 + + + + + + 90 + 588 + 29 + 24 + + + 104.5 + 600 + + + + + + + + Output value + 827ed593-a53c-4a06-8c7f-23980c226d78 + Result + Result + false + 0 + + + + + + 143 + 588 + 31 + 24 + + + 158.5 + 600 + + + + + + + + + + + + a3371040-e552-4bc8-b0ff-10a840258e88 + Negative + + + + + Compute the negative of a value. + true + 8303ceac-85cb-4b06-a1bc-5a3acec9195b + Negative + Negative + + + + + + 212 + 863 + 88 + 28 + + + 255 + 877 + + + + + + Input value + aa6b2fdf-2dc8-405a-8f49-2222a4475acb + Value + Value + false + a4aa38fd-ae8b-4e84-b4c7-743f703e71af + 1 + + + + + + 214 + 865 + 29 + 24 + + + 228.5 + 877 + + + + + + + + Output value + 8201ca98-0edb-4aa3-9ef0-1efdd7b5e887 + Result + Result + false + 0 + + + + + + 267 + 865 + 31 + 24 + + + 282.5 + 877 + + + + + + + + + + + + 33bcf975-a0b2-4b54-99fd-585c893b9e88 + Digit Scroller + + + + + Numeric scroller for single numbers + 1a02ba82-40d3-4bf4-b8ac-327ab3a2fcba + Digit Scroller + Digit Scroller + false + 0 + + + + + 12 + Digit Scroller + 2 + + 69.4835261549 + + + + + + 10 + 912 + 250 + 20 + + + 10.55358 + 912.7772 + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 6e7122df-586b-40b5-8852-b4b70d28d550 + Evaluate Length + Evaluate Length + + + + + + 575 + 1038 + 132 + 64 + + + 643 + 1070 + + + + + + Curve to evaluate + 6b87fe5a-469b-4dbc-a3bf-2c3e7c67d430 + Curve + Curve + false + 9b1a7f5e-3559-4c7f-8983-e110b9367ccd + 1 + + + + + + 577 + 1040 + 54 + 20 + + + 604 + 1050 + + + + + + + + Length factor for curve evaluation + 69704dd3-5305-4347-af38-1f32c89b621d + Length + Length + false + 0 + + + + + + 577 + 1060 + 54 + 20 + + + 604 + 1070 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.5 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 183ba7d5-3e4e-4b22-b417-d60183fe5b2c + Normalized + Normalized + false + 0 + + + + + + 577 + 1080 + 54 + 20 + + + 604 + 1090 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + 433b436d-4910-46f4-9650-f296c051edf5 + Point + Point + false + 0 + + + + + + 655 + 1040 + 50 + 20 + + + 680 + 1050 + + + + + + + + Tangent vector at the specified length + c1d4dcca-7180-4b97-9f9a-80cc04b0dffc + Tangent + Tangent + false + 0 + + + + + + 655 + 1060 + 50 + 20 + + + 680 + 1070 + + + + + + + + Curve parameter at the specified length + 1eb2e7ac-e933-430a-ba50-58b395246783 + Parameter + Parameter + false + 0 + + + + + + 655 + 1080 + 50 + 20 + + + 680 + 1090 + + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + b560ef2a-9861-4ee5-8522-fc9dcc95cc02 + Panel + + false + 0 + 0 + 69.4835261591 + + + + + + 102 + 1062 + 160 + 100 + + 0 + 0 + 0 + + 102.6052 + 1062.104 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + e09bbafc-c06b-42d5-8812-f6b9bfc9a91b + Panel + + false + 0 + 0 + 69.4835261507 + + + + + + 103 + 1232 + 160 + 100 + + 0 + 0 + 0 + + 103.643 + 1232.527 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + a0d62394-a118-422d-abb3-6af115c75b25 + Addition + + + + + Mathematical addition + true + 6461cb0d-53e8-447a-9dd5-21685e9c1b56 + Addition + Addition + + + + + + 301 + 1191 + 70 + 44 + + + 326 + 1213 + + + + + + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + First item for addition + b213aa95-0ac4-408c-8671-a4bf07ba90fa + A + A + true + b560ef2a-9861-4ee5-8522-fc9dcc95cc02 + 1 + + + + + + 303 + 1193 + 11 + 20 + + + 308.5 + 1203 + + + + + + + + Second item for addition + 2ebd0ac0-5f46-479d-8998-908676aa6a2e + B + B + true + e09bbafc-c06b-42d5-8812-f6b9bfc9a91b + 1 + + + + + + 303 + 1213 + 11 + 20 + + + 308.5 + 1223 + + + + + + + + Result of addition + 9de1ab91-5e40-48a5-8f12-6972ae738da2 + Result + Result + false + 0 + + + + + + 338 + 1193 + 31 + 40 + + + 353.5 + 1213 + + + + + + + + + + + + + + 9c85271f-89fa-4e9f-9f4a-d75802120ccc + Division + + + + + Mathematical division + true + c30373d0-ec20-4280-9436-ce49038cd4c1 + Division + Division + + + + + + 387 + 1190 + 70 + 44 + + + 412 + 1212 + + + + + + Item to divide (dividend) + 071f8b44-ee60-4d29-8ec1-f1a4b1baaeef + A + A + false + 9de1ab91-5e40-48a5-8f12-6972ae738da2 + 1 + + + + + + 389 + 1192 + 11 + 20 + + + 394.5 + 1202 + + + + + + + + Item to divide with (divisor) + 08b9213e-f8ba-468b-b73a-bf236911260a + B + B + false + 0 + + + + + + 389 + 1212 + 11 + 20 + + + 394.5 + 1222 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Integer + 2 + + + + + + + + + + + The result of the Division + 6b78ac8c-391c-4cdf-97f4-a84cb8e220bd + Result + Result + false + 0 + + + + + + 424 + 1192 + 31 + 40 + + + 439.5 + 1212 + + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 8b3783ac-5ba5-402c-8407-2b780734dc78 + Panel + + false + 0 + 6b78ac8c-391c-4cdf-97f4-a84cb8e220bd + 1 + 69.4835261591 + + + + + + 545 + 1140 + 160 + 100 + + 0 + 0 + 0 + + 545.8812 + 1140.321 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + a4aa38fd-ae8b-4e84-b4c7-743f703e71af + Panel + + false + 0 + 0 + 69.483526154878695999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 + + + + + + 174 + 959 + 160 + 100 + + 0 + 0 + 0 + + 174.138 + 959.9938 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 91f6a16c-41fc-486b-9fd4-b8131503555a + Number Slider + Number Slider + false + 0 + + + + + + 177 + 824 + 198 + 20 + + + 177.7085 + 824.2753 + + + + + + 1 + 1 + 0 + 1 + 0 + 0 + 0.5 + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 4c62ad4f-8a1b-4479-a981-a013f3a20cab + Panel + + false + 0 + 0 + -.5 + + + + + + 391 + 967 + 160 + 100 + + 0 + 0 + 0 + + 391.3893 + 967.7534 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + 429cbba9-55ee-4e84-98ea-876c44db879a + Sub Curve + + + + + Construct a curve from the sub-domain of a base curve. + true + 82846ba0-d510-4850-bf68-b577e527341e + Sub Curve + Sub Curve + + + + + + 907 + 1031 + 112 + 44 + + + 975 + 1053 + + + + + + Base curve + f15d4f38-3ee0-4021-8986-aeab968e6441 + Base curve + Base curve + false + 9b1a7f5e-3559-4c7f-8983-e110b9367ccd + 1 + + + + + + 909 + 1033 + 54 + 20 + + + 936 + 1043 + + + + + + + + Sub-domain to extract + 181c412a-b343-4df1-9de8-9ba07b5fe126 + Domain + Domain + false + 196cbbe7-089b-4b6f-8268-5a1a27de1f26 + 1 + + + + + + 909 + 1053 + 54 + 20 + + + 936 + 1063 + + + + + + + + Resulting sub curve + f813c092-1a7a-4b2e-a320-c1970bc4b85c + Curve + Curve + false + 0 + + + + + + 987 + 1033 + 30 + 40 + + + 1002 + 1053 + + + + + + + + + + + + ccfd6ba8-ecb1-44df-a47e-08126a653c51 + Curve Domain + + + + + Measure and set the curve domain + true + 5a071e6c-4e12-47f8-90ba-69f5a9cd57d0 + Curve Domain + Curve Domain + + + + + + 744 + 1014 + 104 + 44 + + + 796 + 1036 + + + + + + Curve to measure/modify + 8ac53238-4505-4cfa-ab54-174725866cba + Curve + Curve + false + 9b1a7f5e-3559-4c7f-8983-e110b9367ccd + 1 + + + + + + 746 + 1016 + 38 + 20 + + + 765 + 1026 + + + + + + + + Optional domain, if omitted the curve will not be modified. + fee5c57f-8bff-4381-99f6-4deee29bb8a7 + Domain + Domain + true + 0 + + + + + + 746 + 1036 + 38 + 20 + + + 765 + 1046 + + + + + + + + Curve with new domain. + 613a055f-17a3-464e-9dfe-ded6ed940fcd + Curve + Curve + false + 0 + + + + + + 808 + 1016 + 38 + 20 + + + 827 + 1026 + + + + + + + + Domain of original curve. + 4ed9d5db-0663-44a0-ac51-ed5582a49e75 + Domain + Domain + false + 0 + + + + + + 808 + 1036 + 38 + 20 + + + 827 + 1046 + + + + + + + + + + + + 825ea536-aebb-41e9-af32-8baeb2ecb590 + Deconstruct Domain + + + + + Deconstruct a numeric domain into its component parts. + true + f1615e2f-b974-4426-bac3-98d8df45ccd0 + Deconstruct Domain + Deconstruct Domain + + + + + + 769 + 1065 + 92 + 44 + + + 821 + 1087 + + + + + + Base domain + 14d55ef3-9e4d-40ea-b49c-458b3b7a22d7 + Domain + Domain + false + 4ed9d5db-0663-44a0-ac51-ed5582a49e75 + 1 + + + + + + 771 + 1067 + 38 + 40 + + + 790 + 1087 + + + + + + + + Start of domain + 40fa7228-bb33-4bfb-8f91-5cecd1dcd263 + Start + Start + false + 0 + + + + + + 833 + 1067 + 26 + 20 + + + 846 + 1077 + + + + + + + + End of domain + ad21b06c-4790-4f87-9cc3-a3272475a156 + End + End + false + 0 + + + + + + 833 + 1087 + 26 + 20 + + + 846 + 1097 + + + + + + + + + + + + 9c85271f-89fa-4e9f-9f4a-d75802120ccc + Division + + + + + Mathematical division + true + 39fa6758-00ec-41b2-9795-bfe3189fed61 + Division + Division + + + + + + 780 + 1110 + 70 + 44 + + + 805 + 1132 + + + + + + Item to divide (dividend) + 3e34a1aa-0837-4f2a-9e32-de50ab641f56 + A + A + false + ad21b06c-4790-4f87-9cc3-a3272475a156 + 1 + + + + + + 782 + 1112 + 11 + 20 + + + 787.5 + 1122 + + + + + + + + Item to divide with (divisor) + 7093fce0-514e-4663-979b-8942facacf82 + B + B + false + 0 + + + + + + 782 + 1132 + 11 + 20 + + + 787.5 + 1142 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Integer + 2 + + + + + + + + + + + The result of the Division + 4722382e-e207-42e1-b863-c92b3e3605ea + Result + Result + false + 0 + + + + + + 817 + 1112 + 31 + 40 + + + 832.5 + 1132 + + + + + + + + + + + + d1a28e95-cf96-4936-bf34-8bf142d731bf + Construct Domain + + + + + Create a numeric domain from two numeric extremes. + true + 839ff464-1b55-46dc-93e1-5906feedcbeb + Construct Domain + Construct Domain + + + + + + 763 + 1211 + 128 + 44 + + + 839 + 1233 + + + + + + Start value of numeric domain + c70a65e1-6859-4b62-aa9b-257bafb84151 + Domain start + Domain start + false + 4722382e-e207-42e1-b863-c92b3e3605ea + 1 + + + + + + 765 + 1213 + 62 + 20 + + + 796 + 1223 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + End value of numeric domain + 3fd49f84-13be-490e-9468-6c1d5a94b633 + Domain end + Domain end + false + ad21b06c-4790-4f87-9cc3-a3272475a156 + 1 + + + + + + 765 + 1233 + 62 + 20 + + + 796 + 1243 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Numeric domain between {A} and {B} + 196cbbe7-089b-4b6f-8268-5a1a27de1f26 + Domain + Domain + false + 0 + + + + + + 851 + 1213 + 38 + 40 + + + 870 + 1233 + + + + + + + + + + + + 33bcf975-a0b2-4b54-99fd-585c893b9e88 + Digit Scroller + + + + + Numeric scroller for single numbers + af3fb1cd-4a6d-4dc8-92ce-9498185187cf + Digit Scroller + Digit Scroller + false + 0 + + + + + 12 + Digit Scroller + 3 + + 85.300000000 + + + + + + 1047 + 1265 + 250 + 20 + + + 1047.619 + 1265.329 + + + + + + + + + + 7376fe41-74ec-497e-b367-1ffe5072608b + Curvature Graph + + + + + Draws Rhino Curvature Graphs. + true + b044fc47-2218-43a9-a3b0-2df6397c7b5f + Curvature Graph + Curvature Graph + + + + + + 1370 + 1289 + 65 + 64 + + + 1421 + 1321 + + + + + + Curve for Curvature graph display + true + 46611437-aad9-4467-8439-44ec9ae87f7f + Curve + Curve + false + a4db035a-a834-48b6-a951-08f0da775207 + 1 + + + + + + 1372 + 1291 + 37 + 20 + + + 1390.5 + 1301 + + + + + + + + Sampling density of the Graph + 101641d2-b0bd-4e14-8cf1-608b5c0f42ed + Density + Density + false + 0 + + + + + + 1372 + 1311 + 37 + 20 + + + 1390.5 + 1321 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Scale of graph + 1e907d78-b6c0-4b9e-bf28-59e5523809cc + Scale + Scale + false + af3fb1cd-4a6d-4dc8-92ce-9498185187cf + 1 + + + + + + 1372 + 1331 + 37 + 20 + + + 1390.5 + 1341 + + + + + + 1 + + + + + 1 + {0} + + + + + 105 + + + + + + + + + + + + + + + fb6aba99-fead-4e42-b5d8-c6de5ff90ea6 + DotNET VB Script (LEGACY) + + + + + A VB.NET scriptable component + true + adb123dc-4c8b-4d8e-b8af-465911caa3a4 + DotNET VB Script (LEGACY) + Turtle + 0 + Dim i As Integer + Dim dir As New On3dVector(1, 0, 0) + Dim pos As New On3dVector(0, 0, 0) + Dim axis As New On3dVector(0, 0, 1) + Dim pnts As New List(Of On3dVector) + + pnts.Add(pos) + + For i = 0 To Forward.Count() - 1 + Dim P As New On3dVector + dir.Rotate(Left(i), axis) + P = dir * Forward(i) + pnts(i) + pnts.Add(P) + Next + + Points = pnts + + + + + + 968 + 62 + 100 + 44 + + + 1023 + 84 + + + + + + 1 + 1 + 2 + Script Variable Forward + Script Variable Left + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + true + true + Forward + Left + true + true + + + + + 2 + Print, Reflect and Error streams + Output parameter Points + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + true + true + Output + Points + false + false + + + + + 1 + false + Script Variable Forward + 64ea07bd-2ad8-4674-abc3-2e5035e25438 + Forward + Forward + true + 1 + true + 95ec1350-0cf8-4bd1-9939-9141bb7e8d4d + 1 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 970 + 64 + 41 + 20 + + + 990.5 + 74 + + + + + + + + 1 + false + Script Variable Left + f3a9ae4c-2ef8-4f61-a3d6-a8cc805154cb + Left + Left + true + 1 + true + ca68313c-c52c-486d-8a23-bb53133b88ba + 1 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 970 + 84 + 41 + 20 + + + 990.5 + 94 + + + + + + + + Print, Reflect and Error streams + e7376103-481d-411c-b340-9ecb0032bd5c + Output + out + false + 0 + + + + + + 1035 + 64 + 31 + 20 + + + 1050.5 + 74 + + + + + + + + Output parameter Points + 8c6309b7-19ef-4990-a24c-6a9cd29aedde + Points + Points + false + 0 + + + + + + 1035 + 84 + 31 + 20 + + + 1050.5 + 94 + + + + + + + + + + + + e64c5fb1-845c-4ab1-8911-5f338516ba67 + Series + + + + + Create a series of numbers. + true + 0cb9ecff-ea56-4e17-b511-9bbc9d37213d + Series + Series + + + + + + 459 + 114 + 49 + 64 + + + 484 + 146 + + + + + + First number in the series + cd21e6f4-b907-4df3-b15f-9636506736c4 + Start + S + false + 0 + + + + + + 461 + 116 + 11 + 20 + + + 466.5 + 126 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Step size for each successive number + ae880489-466a-4183-aac2-6507d997ab12 + Step + N + false + 60ccecac-c32b-4ec9-a67d-f06dbc11dac8 + 1 + + + + + + 461 + 136 + 11 + 20 + + + 466.5 + 146 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Number of values in the series + 9017a110-a8eb-4438-b4e8-efedbc8561e5 + Count + C + false + aea56335-eea0-4482-a38d-76fd8894a70b + 1 + + + + + + 461 + 156 + 11 + 20 + + + 466.5 + 166 + + + + + + 1 + + + + + 1 + {0} + + + + + 500 + + + + + + + + + + + 1 + Series of numbers + 0a12a540-f012-46af-a99e-d0c6ca2f91e8 + Series + S + false + 0 + + + + + + 496 + 116 + 10 + 60 + + + 501 + 146 + + + + + + + + + + + + dd8134c0-109b-4012-92be-51d843edfff7 + Duplicate Data + + + + + Duplicate data a predefined number of times. + true + 19d34331-3d5f-4e73-a579-2fb572d8dad8 + Duplicate Data + Dup + + + + + + 461 + 36 + 50 + 64 + + + 486 + 68 + + + + + + 1 + Data to duplicate + c06aba14-c342-42bc-af8a-4b9a730d9416 + Data + D + false + a6fbff5c-de44-40d1-a62d-b2666e9d8abc + 1 + + + + + + 463 + 38 + 11 + 20 + + + 468.5 + 48 + + + + + + + + Number of duplicates + 07ba82f9-7d88-459d-b360-a6a72ef0fb39 + Number + N + false + 0e94a1ab-3131-4c59-b8f2-e8748666b639 + 1 + + + + + + 463 + 58 + 11 + 20 + + + 468.5 + 68 + + + + + + 1 + + + + + 1 + {0} + + + + + 500 + + + + + + + + + + + Retain list order + 80896721-cab2-41a4-bc83-3eb99ca1de30 + Order + O + false + 0 + + + + + + 463 + 78 + 11 + 20 + + + 468.5 + 88 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + 1 + Duplicated data + 95ec1350-0cf8-4bd1-9939-9141bb7e8d4d + Data + D + false + 0 + + + + + + 498 + 38 + 11 + 60 + + + 503.5 + 68 + + + + + + + + + + + + 3e8ca6be-fda8-4aaf-b5c0-3c54c8bb7312 + Number + + + + + Contains a collection of floating point numbers + aea56335-eea0-4482-a38d-76fd8894a70b + Number + PntNum + false + 30510cbc-939e-47f4-a157-892edbb7b2ec + 1 + + + + + + 367 + 112 + 50 + 24 + + + 392.4265 + 124.2116 + + + + + + 1 + + + + + 1 + {0} + + + + + 220 + + + + + + + + + + + + + bc984576-7aa6-491f-a91d-e444c33675a7 + Graph Mapper + + + + + Represents a numeric mapping function +Sine wave distribution +Linear distribution + f19a2d4a-2dc0-407f-97c4-93275253ee87 + Graph Mapper + Graph + false + 0a12a540-f012-46af-a99e-d0c6ca2f91e8 + 1 + + + + + + 580 + 239 + 138 + 138 + + + 580.5346 + 239.6815 + + + + + + false + + + + + 0 + 1 + 0 + 1 + + + + + 1 + 0 + 71629651-0343-46d7-ac9e-d6041f9fe66b + Linear + 0 + 1 + 0 + 1 + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + a6fbff5c-de44-40d1-a62d-b2666e9d8abc + Number Slider + Forward + false + 0 + + + + + + 195 + 68 + 170 + 20 + + + 195.2472 + 68.90955 + + + + + + 4 + 1 + 0 + 1 + 0 + 0 + 1 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 3710b634-8373-477c-b89b-80ebcb3533c9 + Number Slider + Left + false + 0 + + + + + + 258 + 166 + 150 + 20 + + + 258.4472 + 166.2695 + + + + + + 4 + 1 + 0 + 1 + 0 + 0 + 0.2636 + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 5 + + 255;255;255;255 + + A group of Grasshopper objects + 82846ba0-d510-4850-bf68-b577e527341e + 5a071e6c-4e12-47f8-90ba-69f5a9cd57d0 + f1615e2f-b974-4426-bac3-98d8df45ccd0 + 39fa6758-00ec-41b2-9795-bfe3189fed61 + 839ff464-1b55-46dc-93e1-5906feedcbeb + 5 + 3492b1e6-6447-4510-957c-41f6e336b055 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 5 + + 255;255;255;255 + + A group of Grasshopper objects + 82846ba0-d510-4850-bf68-b577e527341e + 1 + 8d826a5b-40a9-4723-b454-e6ec87d5d425 + Group + + + + + + + + + + + b7798b74-037e-4f0c-8ac7-dc1043d093e0 + Rotate + + + + + Rotate an object in a plane. + true + 1b23f03a-7ba4-4196-9ab5-4214ef1ea7a0 + Rotate + Rotate + + + + + + 1100 + 1174 + 126 + 64 + + + 1162 + 1206 + + + + + + Base geometry + fb53b620-bff5-429b-9d61-5caa1a21acc4 + Geometry + Geometry + true + 9a872b68-f4ef-437a-a7cf-5f3f10a7d5cf + 1 + + + + + + 1102 + 1176 + 48 + 20 + + + 1126 + 1186 + + + + + + + + Rotation angle in radians + b869e64b-fd1c-43b0-a938-aebd32db369b + Angle + Angle + false + 0 + false + + + + + + 1102 + 1196 + 48 + 20 + + + 1126 + 1206 + + + + + + 1 + + + + + 1 + {0} + + + + + 3.1415926535897931 + + + + + + + + + + + Rotation plane + d32ea679-4549-4b70-96ef-d41ec2d137de + Plane + Plane + false + ea581112-e4ff-4ffd-ae67-550e059e2ab2 + 1 + + + + + + 1102 + 1216 + 48 + 20 + + + 1126 + 1226 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + Rotated geometry + 29181bcb-8341-492d-a2cb-44fac4bbba27 + Geometry + Geometry + false + 0 + + + + + + 1174 + 1176 + 50 + 30 + + + 1199 + 1191 + + + + + + + + Transformation data + 23d6205a-9f8e-4802-9d7f-52415665c2b9 + Transform + Transform + false + 0 + + + + + + 1174 + 1206 + 50 + 30 + + + 1199 + 1221 + + + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 623e4f22-0705-43ed-af97-41751fe9d194 + Evaluate Length + Evaluate Length + + + + + + 1095 + 1048 + 132 + 64 + + + 1163 + 1080 + + + + + + Curve to evaluate + 6b723213-f7db-4e3b-91f9-c702eb4e3537 + Curve + Curve + false + 9a872b68-f4ef-437a-a7cf-5f3f10a7d5cf + 1 + + + + + + 1097 + 1050 + 54 + 20 + + + 1124 + 1060 + + + + + + + + Length factor for curve evaluation + e6796bbc-6abe-4f97-a17a-9f9ce1205468 + Length + Length + false + 0 + + + + + + 1097 + 1070 + 54 + 20 + + + 1124 + 1080 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + b12f98e8-3e0c-40c0-8e56-79a98a6d9333 + Normalized + Normalized + false + 0 + + + + + + 1097 + 1090 + 54 + 20 + + + 1124 + 1100 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + ea581112-e4ff-4ffd-ae67-550e059e2ab2 + Point + Point + false + 0 + + + + + + 1175 + 1050 + 50 + 20 + + + 1200 + 1060 + + + + + + + + Tangent vector at the specified length + ce1bb5ba-0b4f-4438-8324-010c6a43e278 + Tangent + Tangent + false + 0 + + + + + + 1175 + 1070 + 50 + 20 + + + 1200 + 1080 + + + + + + + + Curve parameter at the specified length + 76669767-a041-41e6-a91a-8969de2f0633 + Parameter + Parameter + false + 0 + + + + + + 1175 + 1090 + 50 + 20 + + + 1200 + 1100 + + + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + f0786d40-0f2c-42a7-bb40-b23125d62ba0 + Join Curves + Join Curves + + + + + + 1115 + 943 + 106 + 44 + + + 1172 + 965 + + + + + + 1 + Curves to join + 35a8f88e-4b93-45c9-aba5-d9cb078f55b7 + Curves + Curves + false + 9a872b68-f4ef-437a-a7cf-5f3f10a7d5cf + 29181bcb-8341-492d-a2cb-44fac4bbba27 + 2 + + + + + + 1117 + 945 + 43 + 20 + + + 1138.5 + 955 + + + + + + + + Preserve direction of input curves + 15ee08ed-c988-4f87-8532-ac6fc90b32da + Preserve + Preserve + false + 0 + + + + + + 1117 + 965 + 43 + 20 + + + 1138.5 + 975 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + 3eb795c1-f2e8-4462-8d75-43548abc5c7a + Curves + Curves + false + 0 + + + + + + 1184 + 945 + 35 + 40 + + + 1201.5 + 965 + + + + + + + + + + + + d93100b6-d50b-40b2-831a-814659dc38e3 + Rectangle + + + + + Create a rectangle on a plane + true + a5f50a86-74a5-4fcf-97ff-f306376cdcdf + Rectangle + Rectangle + + + + + + 1369 + 736 + 109 + 84 + + + 1416 + 778 + + + + + + Rectangle base plane + 8e0b3992-2836-4b47-aee5-6a6275fee65e + Plane + Plane + false + 0 + + + + + + 1371 + 738 + 33 + 20 + + + 1387.5 + 748 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + Dimensions of rectangle in plane X direction. + 76658ffc-0c93-40f9-a177-12293c7c88a5 + X Size + X Size + false + 0 + + + + + + 1371 + 758 + 33 + 20 + + + 1387.5 + 768 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 1 + + + + + + + + + + + + Dimensions of rectangle in plane Y direction. + 5541eed9-d957-4424-9f0e-aa146d4f37ed + Y Size + Y Size + false + 77f0ecec-7fa3-446d-a550-22710e20ed01 + 1 + + + + + + 1371 + 778 + 33 + 20 + + + 1387.5 + 788 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 1 + + + + + + + + + + + + Rectangle corner fillet radius + 774a0b91-1b49-4a86-a1cd-42c577e605ff + Radius + Radius + false + 0 + + + + + + 1371 + 798 + 33 + 20 + + + 1387.5 + 808 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Rectangle + 0c3d97eb-e01e-4cd0-bcc9-899b5e8bd773 + Rectangle + Rectangle + false + 0 + + + + + + 1428 + 738 + 48 + 40 + + + 1452 + 758 + + + + + + + + Length of rectangle curve + 62638e03-d4b1-4c17-a012-0d9b4e4e69d9 + Length + Length + false + 0 + + + + + + 1428 + 778 + 48 + 40 + + + 1452 + 798 + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 19781188-6033-4dfc-8e18-ac8a31146184 + Number Slider + Number Slider + false + 0 + + + + + + 85 + 89 + 198 + 20 + + + 85.37762 + 89.94292 + + + + + + 0 + 1 + 0 + 1024 + 0 + 0 + 92 + + + + + + + + + fbac3e32-f100-4292-8692-77240a42fd1a + Point + + + + + Contains a collection of three-dimensional points + true + 9f928a18-1788-4d30-82d0-8902489b7cb1 + Point + Point + false + 8c6309b7-19ef-4990-a24c-6a9cd29aedde + 1 + + + + + + 1073 + 178 + 50 + 24 + + + 1098.873 + 190.2037 + + + + + + + + + + a4cd2751-414d-42ec-8916-476ebf62d7fe + Radians + + + + + Convert an angle specified in degrees to radians + true + 1a7582f2-97d6-4d9c-a343-c247a07b3113 + Radians + Radians + + + + + + 297 + 235 + 108 + 28 + + + 352 + 249 + + + + + + Angle in degrees + 3bc85718-1091-40e8-94b6-e8f2b6244c7e + Degrees + Degrees + false + 95e54ab1-d9fe-4240-9ceb-e7de21dc8681 + 1 + + + + + + 299 + 237 + 41 + 24 + + + 319.5 + 249 + + + + + + + + Angle in radians + 60ccecac-c32b-4ec9-a67d-f06dbc11dac8 + Radians + Radians + false + 0 + + + + + + 364 + 237 + 39 + 24 + + + 383.5 + 249 + + + + + + + + + + + + 2b69bf71-4e69-43aa-b7be-4f6ce7e45bef + Quick Graph + + + + + 1 + Display a set of y-values as a graph + e8d2f33c-9799-4b66-99c9-5085acf3a34b + Quick Graph + Quick Graph + false + 0 + 17b8f919-7cf9-4e9d-a977-4975ac259f79 + 1 + + + + + + 1402 + 586 + 150 + 150 + + + 1402.781 + 586.0236 + + -1 + + + + + + + + + 2b69bf71-4e69-43aa-b7be-4f6ce7e45bef + Quick Graph + + + + + 1 + Display a set of y-values as a graph + 2c09d7cc-4b45-44b3-ad5e-f8fd156703ac + Quick Graph + Quick Graph + false + 0 + 80544141-adaf-4121-b91d-59dc485f5186 + 1 + + + + + + 2194 + 365 + 150 + 150 + + + 2194.012 + 365.3451 + + -1 + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 6eddbd6b-0cfa-4602-bdcd-27e681eaa19e + Relay + + false + 80544141-adaf-4121-b91d-59dc485f5186 + 1 + + + + + + 2066 + 806 + 40 + 16 + + + 2086 + 814 + + + + + + + + + + 9d2583dd-6cf5-497c-8c40-c9a290598396 + Arc SED + + + + + Create an arc defined by start point, end point and a tangent vector. + true + b11627c8-54cf-45d2-8af9-267b86d60819 + Arc SED + Arc SED + + + + + + 956 + 837 + 105 + 64 + + + 1014 + 869 + + + + + + Start point of arc + d29119d4-5bda-4c10-8b33-20859402d506 + Start + Start + false + 0 + + + + + + 958 + 839 + 44 + 20 + + + 980 + 849 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + End point of arc + 93932dd5-914f-4060-931f-0aad23bba2a6 + End + End + false + 0 + + + + + + 958 + 859 + 44 + 20 + + + 980 + 869 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0.5 + 0.5 + 0 + + + + + + + + + + + + Direction (tangent) at start + 986d5e48-8edb-473b-a075-9dab9fd3cd1e + Direction + Direction + false + 0 + + + + + + 958 + 879 + 44 + 20 + + + 980 + 889 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0.5 + 0 + 0 + + + + + + + + + + + + Resulting arc + 6c8df061-7384-4eee-8c75-2c154bd3eed1 + Arc + Arc + false + 0 + + + + + + 1026 + 839 + 33 + 20 + + + 1042.5 + 849 + + + + + + + + Arc plane + true + 9b323c43-8432-4535-9599-eb2528f001de + Plane + Plane + false + 0 + + + + + + 1026 + 859 + 33 + 20 + + + 1042.5 + 869 + + + + + + + + Arc radius + 2e3b5ea5-ad47-47b7-986b-246147df43f2 + Radius + Radius + false + 0 + + + + + + 1026 + 879 + 33 + 20 + + + 1042.5 + 889 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 9a872b68-f4ef-437a-a7cf-5f3f10a7d5cf + Relay + + false + f813c092-1a7a-4b2e-a320-c1970bc4b85c + 1 + + + + + + 1034 + 965 + 40 + 16 + + + 1054 + 973 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + ca68313c-c52c-486d-8a23-bb53133b88ba + Relay + + false + 7b613319-bfe3-4474-aeb1-50e400eff353 + 1 + + + + + + 908 + 86 + 40 + 16 + + + 928 + 94 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 7b613319-bfe3-4474-aeb1-50e400eff353 + Relay + + false + 6eddbd6b-0cfa-4602-bdcd-27e681eaa19e + 1 + + + + + + 727 + 151 + 40 + 16 + + + 747 + 159 + + + + + + + + + + 0d77c51e-584f-44e8-aed2-c2ddf4803888 + Degrees + + + + + Convert an angle specified in radians to degrees + true + 9afed6a1-0b5d-4854-8d60-a3719e46c346 + Degrees + Degrees + + + + + + 421 + 261 + 108 + 28 + + + 474 + 275 + + + + + + Angle in radians + 2acfb98b-717d-44fd-ba8c-5a99e01c96ae + Radians + Radians + false + 0a12a540-f012-46af-a99e-d0c6ca2f91e8 + 1 + + + + + + 423 + 263 + 39 + 24 + + + 442.5 + 275 + + + + + + + + Angle in degrees + 2661efe3-a104-4708-91df-7e5f956c1a77 + Degrees + Degrees + false + 0 + + + + + + 486 + 263 + 41 + 24 + + + 506.5 + 275 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 17b8f919-7cf9-4e9d-a977-4975ac259f79 + Relay + + false + 0a12a540-f012-46af-a99e-d0c6ca2f91e8 + 1 + + + + + + 1148 + 839 + 40 + 16 + + + 1168 + 847 + + + + + + + + + + 9445ca40-cc73-4861-a455-146308676855 + Range + + + + + Create a range of numbers. + true + fdae7967-2946-4c76-8efb-2afc9fe307c9 + Range + Range + + + + + + 808 + 1344 + 98 + 44 + + + 860 + 1366 + + + + + + Domain of numeric range + 20a2f9e4-9d26-4b07-8052-4a6233543d8e + Domain + Domain + false + 0 + + + + + + 810 + 1346 + 38 + 20 + + + 829 + 1356 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 1 + + + + + + + + + + + + Number of steps + 79611de4-461c-445d-8f31-815e8b37393a + Steps + Steps + false + 98c6d8a0-685b-4bbf-a8ff-19a05dce99a8 + 1 + + + + + + 810 + 1366 + 38 + 20 + + + 829 + 1376 + + + + + + 1 + + + + + 1 + {0} + + + + + 10 + + + + + + + + + + + 1 + Range of numbers + 0cb72483-7b48-42d0-9dd7-4aa4b04c8fd0 + Range + Range + false + 0 + + + + + + 872 + 1346 + 32 + 40 + + + 888 + 1366 + + + + + + + + + + + + 9df5e896-552d-4c8c-b9ca-4fc147ffa022 + Expression + + + + + Evaluate an expression + -COS(PI*X)/2+.5 + true + 3223a2a2-929e-492a-8f8e-51c2da3006ec + true + Expression + Expression + + + + + + 908 + 1391 + 141 + 28 + + + 981 + 1405 + + + + + + 1 + ba80fd98-91a1-4958-b6a7-a94e40e52bdb + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + Expression variable + 61ac86fa-e12a-496a-afd3-cf0045689685 + true + Variable Variable x + X + true + 0cb72483-7b48-42d0-9dd7-4aa4b04c8fd0 + 1 + + + + + + 910 + 1393 + 11 + 24 + + + 915.5 + 1405 + + + + + + + + Result of expression + fbad1d61-f6a3-496d-801a-d192eccbeca0 + true + Result + + false + 0 + + + + + + 1041 + 1393 + 6 + 24 + + + 1044 + 1405 + + + + + + + + + + + + + + 3581f42a-9592-4549-bd6b-1c0fc39d067b + Construct Point + + + + + Construct a point from {xyz} coordinates. + true + ccc20433-6140-4eb9-a297-3dee2aef2333 + Construct Point + Construct Point + + + + + + 1011 + 1279 + 117 + 64 + + + 1087 + 1311 + + + + + + {x} coordinate + 82e7d129-2aec-420e-9173-13e1b59cc2c8 + X coordinate + X coordinate + false + 0cb72483-7b48-42d0-9dd7-4aa4b04c8fd0 + 1 + + + + + + 1013 + 1281 + 62 + 20 + + + 1044 + 1291 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + {y} coordinate + 037185e9-cb6a-477f-9264-a78b7cc704d2 + Y coordinate + Y coordinate + false + fbad1d61-f6a3-496d-801a-d192eccbeca0 + 1 + + + + + + 1013 + 1301 + 62 + 20 + + + 1044 + 1311 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + {z} coordinate + a8a57cbf-e1c3-44bf-9927-393f0da2b49d + Z coordinate + Z coordinate + false + 0 + + + + + + 1013 + 1321 + 62 + 20 + + + 1044 + 1331 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Point coordinate + 319a8e4a-0a9d-4c4f-b007-9dd3bffdad8b + Point + Point + false + 0 + + + + + + 1099 + 1281 + 27 + 60 + + + 1112.5 + 1311 + + + + + + + + + + + + 2b2a4145-3dff-41d4-a8de-1ea9d29eef33 + Interpolate + + + + + Create an interpolated curve through a set of points. + true + e8749b33-1bd7-41a8-a32e-f652be604699 + Interpolate + Interpolate + + + + + + 1177 + 1281 + 113 + 84 + + + 1238 + 1323 + + + + + + 1 + Interpolation points + ef7d6f52-25bf-4721-b749-b02b1f560fd2 + Vertices + Vertices + false + 319a8e4a-0a9d-4c4f-b007-9dd3bffdad8b + 1 + + + + + + 1179 + 1283 + 47 + 20 + + + 1202.5 + 1293 + + + + + + + + Curve degree + 2783af8f-6fee-4e9e-9682-191588a45244 + Degree + Degree + false + 0 + + + + + + 1179 + 1303 + 47 + 20 + + + 1202.5 + 1313 + + + + + + 1 + + + + + 1 + {0} + + + + + 3 + + + + + + + + + + + Periodic curve + 9de54a4a-1658-4c37-b0f8-0984ea863aba + Periodic + Periodic + false + 0 + + + + + + 1179 + 1323 + 47 + 20 + + + 1202.5 + 1333 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Knot spacing (0=uniform, 1=chord, 2=sqrtchord) + 6e99b88d-7932-4bec-be05-2d0756473bd4 + KnotStyle + KnotStyle + false + 0 + + + + + + 1179 + 1343 + 47 + 20 + + + 1202.5 + 1353 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Resulting nurbs curve + 229ca461-198c-4419-84c7-d2f35bdc4fcf + Curve + Curve + false + 0 + + + + + + 1250 + 1283 + 38 + 26 + + + 1269 + 1296.333 + + + + + + + + Curve length + e5717746-8298-4388-ab46-72fcc5d78e0f + Length + Length + false + 0 + + + + + + 1250 + 1309 + 38 + 27 + + + 1269 + 1323 + + + + + + + + Curve domain + 24fe4cb8-26e0-493c-8dc6-52b4e901dd5e + Domain + Domain + false + 0 + + + + + + 1250 + 1336 + 38 + 27 + + + 1269 + 1349.667 + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 98c6d8a0-685b-4bbf-a8ff-19a05dce99a8 + Number Slider + Number Slider + false + 0 + + + + + + 794 + 1446 + 198 + 20 + + + 794.8589 + 1446.434 + + + + + + 0 + 1 + 0 + 100 + 0 + 0 + 100 + + + + + + + + + 2b2a4145-3dff-41d4-a8de-1ea9d29eef33 + Interpolate + + + + + Create an interpolated curve through a set of points. + true + 9520571f-01ef-4f72-932e-7a249475dade + Interpolate + Interpolate + + + + + + 1204 + 73 + 113 + 84 + + + 1265 + 115 + + + + + + 1 + Interpolation points + 217888fe-0c52-4452-9bab-1426ab7c49e5 + Vertices + Vertices + false + 8c6309b7-19ef-4990-a24c-6a9cd29aedde + 1 + + + + + + 1206 + 75 + 47 + 20 + + + 1229.5 + 85 + + + + + + + + Curve degree + 3b917543-6fe1-47c6-bc69-2d991e5390a3 + Degree + Degree + false + 0 + + + + + + 1206 + 95 + 47 + 20 + + + 1229.5 + 105 + + + + + + 1 + + + + + 1 + {0} + + + + + 3 + + + + + + + + + + + Periodic curve + b52c74d6-38ec-44a3-862c-f5f263503985 + Periodic + Periodic + false + 0 + + + + + + 1206 + 115 + 47 + 20 + + + 1229.5 + 125 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Knot spacing (0=uniform, 1=chord, 2=sqrtchord) + de774591-6f3d-4cd3-82cb-cf0ecb9d1230 + KnotStyle + KnotStyle + false + 0 + + + + + + 1206 + 135 + 47 + 20 + + + 1229.5 + 145 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Resulting nurbs curve + 3910b2ce-825d-4581-ba63-0d4761cdc4e4 + Curve + Curve + false + 0 + + + + + + 1277 + 75 + 38 + 26 + + + 1296 + 88.33334 + + + + + + + + Curve length + ee447920-0734-47ec-9576-112b090bbd89 + Length + Length + false + 0 + + + + + + 1277 + 101 + 38 + 27 + + + 1296 + 115 + + + + + + + + Curve domain + d778f5da-fb7d-4fe4-9d08-2ac9cb4f2993 + Domain + Domain + false + 0 + + + + + + 1277 + 128 + 38 + 27 + + + 1296 + 141.6667 + + + + + + + + + + + + 33bcf975-a0b2-4b54-99fd-585c893b9e88 + Digit Scroller + + + + + Numeric scroller for single numbers + 36b3ca44-627e-48b4-82b9-b92c6729a0a2 + Digit Scroller + Digit Scroller + false + 0 + + + + + 12 + Digit Scroller + 3 + + 120.000000000 + + + + + + 2011 + 327 + 250 + 20 + + + 2011.323 + 327.6967 + + + + + + + + + + 7376fe41-74ec-497e-b367-1ffe5072608b + Curvature Graph + + + + + Draws Rhino Curvature Graphs. + f0ac3d20-d232-4529-9797-fe98cce3b115 + Curvature Graph + Curvature Graph + + + + + + 2424 + 280 + 65 + 64 + + + 2475 + 312 + + + + + + Curve for Curvature graph display + true + 37ec4b3b-e6e5-4c8f-94c4-bdedcee0f713 + Curve + Curve + false + f6b4926e-e21e-4172-8955-63568a7bca58 + 1 + + + + + + 2426 + 282 + 37 + 20 + + + 2444.5 + 292 + + + + + + + + Sampling density of the Graph + 8f9e5a1f-527e-4aee-804d-c934086261d2 + Density + Density + false + 0 + + + + + + 2426 + 302 + 37 + 20 + + + 2444.5 + 312 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Scale of graph + cbf4822a-6079-46d0-afd9-6e6b242efbd5 + Scale + Scale + false + 36b3ca44-627e-48b4-82b9-b92c6729a0a2 + 1 + + + + + + 2426 + 322 + 37 + 20 + + + 2444.5 + 332 + + + + + + 1 + + + + + 1 + {0} + + + + + 105 + + + + + + + + + + + + + + + 33bcf975-a0b2-4b54-99fd-585c893b9e88 + Digit Scroller + + + + + Numeric scroller for single numbers + 9d319f42-3b16-4111-b365-43eb0f17b2cb + Digit Scroller + Digit Scroller + false + 0 + + + + + 12 + Digit Scroller + 1 + + 0.02197265625 + + + + + + 166 + 507 + 250 + 20 + + + 166.1918 + 507.1666 + + + + + + + + + + f12daa2f-4fd5-48c1-8ac3-5dea476912ca + Mirror + + + + + Mirror an object. + true + 4c7664dd-79cf-4108-bf60-1480bb27ab37 + Mirror + Mirror + + + + + + 1604 + 1314 + 126 + 44 + + + 1666 + 1336 + + + + + + Base geometry + ba101e5c-7a96-47d7-ba45-081620a16ecc + Geometry + Geometry + true + 8223275d-d569-4e35-9a98-2c397f54615c + 1 + + + + + + 1606 + 1316 + 48 + 20 + + + 1630 + 1326 + + + + + + + + Mirror plane + 9e0ef643-8160-45db-acac-594641eb7cc7 + Plane + Plane + false + a8a2329e-f841-4f4b-8d41-b027368bf4e0 + 1 + + + + + + 1606 + 1336 + 48 + 20 + + + 1630 + 1346 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + + + + + + + + + + Mirrored geometry + 608609df-983c-4196-b298-8809024de305 + Geometry + Geometry + false + 0 + + + + + + 1678 + 1316 + 50 + 20 + + + 1703 + 1326 + + + + + + + + Transformation data + c3ddcda0-6db2-47f6-b30a-67ac7b7e0fdb + Transform + Transform + false + 0 + + + + + + 1678 + 1336 + 50 + 20 + + + 1703 + 1346 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 54a8751f-10a4-4c07-9a6c-97aba7fa52f9 + Relay + + false + 30e62d14-2c62-4f0d-aa1f-ca9d032a2be1 + 1 + + + + + + 1459 + 1376 + 40 + 16 + + + 1479 + 1384 + + + + + + + + + + fad344bc-09b1-4855-a2e6-437ef5715fe3 + YZ Plane + + + + + World YZ plane. + true + de5cfa61-2934-4ee9-965e-9cbcdb5afe74 + YZ Plane + YZ Plane + + + + + + 1450 + 1332 + 86 + 28 + + + 1494 + 1346 + + + + + + Origin of plane + 83ea6edd-ceeb-4752-b1eb-318ee183a4a9 + Origin + Origin + false + 54a8751f-10a4-4c07-9a6c-97aba7fa52f9 + 1 + + + + + + 1452 + 1334 + 30 + 24 + + + 1467 + 1346 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + World YZ plane + a8a2329e-f841-4f4b-8d41-b027368bf4e0 + Plane + Plane + false + 0 + + + + + + 1506 + 1334 + 28 + 24 + + + 1520 + 1346 + + + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 3ea3d903-f586-4647-8194-a5066d8553a6 + Evaluate Length + Evaluate Length + + + + + + 1383 + 1411 + 132 + 64 + + + 1451 + 1443 + + + + + + Curve to evaluate + 5b09a39a-9378-4a53-a9e3-2e9768415b22 + Curve + Curve + false + 3eb795c1-f2e8-4462-8d75-43548abc5c7a + 1 + + + + + + 1385 + 1413 + 54 + 20 + + + 1412 + 1423 + + + + + + + + Length factor for curve evaluation + c2fb1bf5-d4a5-4512-a474-8a2166288fe1 + Length + Length + false + 0 + + + + + + 1385 + 1433 + 54 + 20 + + + 1412 + 1443 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 3c1e4896-be34-427e-bf9b-4bb7aec11f6d + Normalized + Normalized + false + 0 + + + + + + 1385 + 1453 + 54 + 20 + + + 1412 + 1463 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + 30e62d14-2c62-4f0d-aa1f-ca9d032a2be1 + Point + Point + false + 0 + + + + + + 1463 + 1413 + 50 + 20 + + + 1488 + 1423 + + + + + + + + Tangent vector at the specified length + 4bd9ddb4-8c80-4537-a43e-29d4d8afff77 + Tangent + Tangent + false + 0 + + + + + + 1463 + 1433 + 50 + 20 + + + 1488 + 1443 + + + + + + + + Curve parameter at the specified length + a45066ba-aec1-499c-92c8-36fee03f5053 + Parameter + Parameter + false + 0 + + + + + + 1463 + 1453 + 50 + 20 + + + 1488 + 1463 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 8223275d-d569-4e35-9a98-2c397f54615c + Relay + + false + 3eb795c1-f2e8-4462-8d75-43548abc5c7a + 1 + + + + + + 1521 + 1238 + 40 + 16 + + + 1541 + 1246 + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + 57a03910-740a-4e10-b728-b7318c148ddd + Join Curves + Join Curves + + + + + + 1682 + 1227 + 106 + 44 + + + 1739 + 1249 + + + + + + 1 + Curves to join + 223d00f2-9b6c-4b05-aab9-6a1ef389c375 + Curves + Curves + false + 8223275d-d569-4e35-9a98-2c397f54615c + 608609df-983c-4196-b298-8809024de305 + 2 + + + + + + 1684 + 1229 + 43 + 20 + + + 1705.5 + 1239 + + + + + + + + Preserve direction of input curves + 6775000b-3f54-47c4-b231-57ff58fcbd42 + Preserve + Preserve + false + 0 + + + + + + 1684 + 1249 + 43 + 20 + + + 1705.5 + 1259 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + 27a8458c-44f3-4d7e-abbe-a725b3a3114e + Curves + Curves + false + 0 + + + + + + 1751 + 1229 + 35 + 40 + + + 1768.5 + 1249 + + + + + + + + + + + + b7798b74-037e-4f0c-8ac7-dc1043d093e0 + Rotate + + + + + Rotate an object in a plane. + true + a4f63ae0-7907-4030-9c61-e1efbad6d3d0 + Rotate + Rotate + + + + + + 1815 + 1320 + 126 + 64 + + + 1877 + 1352 + + + + + + Base geometry + 6fcf2f5b-3e7e-4d48-a00e-dc24f2035851 + Geometry + Geometry + true + 27a8458c-44f3-4d7e-abbe-a725b3a3114e + 1 + + + + + + 1817 + 1322 + 48 + 20 + + + 1841 + 1332 + + + + + + + + Rotation angle in radians + d1315872-3c45-4a71-907d-8085157f9c39 + Angle + Angle + false + 0 + false + + + + + + 1817 + 1342 + 48 + 20 + + + 1841 + 1352 + + + + + + 1 + + + + + 1 + {0} + + + + + 3.1415926535897931 + + + + + + + + + + + Rotation plane + 5ad65274-eb9e-4108-896e-9ef8f81cf109 + Plane + Plane + false + e65ba836-8727-4e6c-bba1-cc044b5d6f10 + 1 + + + + + + 1817 + 1362 + 48 + 20 + + + 1841 + 1372 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + Rotated geometry + a921e035-6c80-4e76-bbc4-5f033ec2fee4 + Geometry + Geometry + false + 0 + + + + + + 1889 + 1322 + 50 + 30 + + + 1914 + 1337 + + + + + + + + Transformation data + 437701f5-445e-40bb-a2e7-fc03290ba412 + Transform + Transform + false + 0 + + + + + + 1889 + 1352 + 50 + 30 + + + 1914 + 1367 + + + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + cd9e5a3f-a487-4b5a-8167-5ddc906483af + Evaluate Length + Evaluate Length + + + + + + 1814 + 1255 + 132 + 64 + + + 1882 + 1287 + + + + + + Curve to evaluate + 393c1250-41b1-4cd1-83ff-aefb006c0121 + Curve + Curve + false + 27a8458c-44f3-4d7e-abbe-a725b3a3114e + 1 + + + + + + 1816 + 1257 + 54 + 20 + + + 1843 + 1267 + + + + + + + + Length factor for curve evaluation + e2ccb088-e147-4ecc-9ce7-2df4a44720aa + Length + Length + false + 0 + + + + + + 1816 + 1277 + 54 + 20 + + + 1843 + 1287 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 0fd8daaf-8d9e-4be9-9c6f-9c7563d2fd35 + Normalized + Normalized + false + 0 + + + + + + 1816 + 1297 + 54 + 20 + + + 1843 + 1307 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + e65ba836-8727-4e6c-bba1-cc044b5d6f10 + Point + Point + false + 0 + + + + + + 1894 + 1257 + 50 + 20 + + + 1919 + 1267 + + + + + + + + Tangent vector at the specified length + b315d7d5-4233-466a-9a01-55bd815acb69 + Tangent + Tangent + false + 0 + + + + + + 1894 + 1277 + 50 + 20 + + + 1919 + 1287 + + + + + + + + Curve parameter at the specified length + f4f08a0e-0096-4b57-976b-4dc020bbcb87 + Parameter + Parameter + false + 0 + + + + + + 1894 + 1297 + 50 + 20 + + + 1919 + 1307 + + + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + d3e2c804-c42b-4a01-a8f1-f8263a859c2d + Join Curves + Join Curves + + + + + + 2041 + 1252 + 106 + 44 + + + 2098 + 1274 + + + + + + 1 + Curves to join + 42f91a4e-0e7e-4170-88de-a1b7db1adcb1 + Curves + Curves + false + a921e035-6c80-4e76-bbc4-5f033ec2fee4 + 27a8458c-44f3-4d7e-abbe-a725b3a3114e + 2 + + + + + + 2043 + 1254 + 43 + 20 + + + 2064.5 + 1264 + + + + + + + + Preserve direction of input curves + 8abae89e-bd89-4daf-98cf-8544d127db72 + Preserve + Preserve + false + 0 + + + + + + 2043 + 1274 + 43 + 20 + + + 2064.5 + 1284 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + af2c7be7-889b-4714-94e6-a45e621955b9 + Curves + Curves + false + 0 + + + + + + 2110 + 1254 + 35 + 40 + + + 2127.5 + 1274 + + + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + e94bbc2e-02c4-4591-b0ef-963c6b1d47a7 + Evaluate Length + Evaluate Length + + + + + + 1972 + 1414 + 132 + 64 + + + 2040 + 1446 + + + + + + Curve to evaluate + c09723ab-4605-48f3-98f8-abfb349d1ee0 + Curve + Curve + false + af2c7be7-889b-4714-94e6-a45e621955b9 + 1 + + + + + + 1974 + 1416 + 54 + 20 + + + 2001 + 1426 + + + + + + + + Length factor for curve evaluation + e7e5f835-9ae1-49b7-b6d2-95769d9ce529 + Length + Length + false + 0 + + + + + + 1974 + 1436 + 54 + 20 + + + 2001 + 1446 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 790c95f1-d6fd-43d2-bf82-a78a51a4b19a + Normalized + Normalized + false + 0 + + + + + + 1974 + 1456 + 54 + 20 + + + 2001 + 1466 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + f013e5d9-e877-4748-844b-c6f9e5326801 + Point + Point + false + 0 + + + + + + 2052 + 1416 + 50 + 20 + + + 2077 + 1426 + + + + + + + + Tangent vector at the specified length + 50dbf9ad-9e38-447c-8825-60e10a1f189e + Tangent + Tangent + false + 0 + + + + + + 2052 + 1436 + 50 + 20 + + + 2077 + 1446 + + + + + + + + Curve parameter at the specified length + 29b09be3-8897-4dcb-874a-7fc1b80ee146 + Parameter + Parameter + false + 0 + + + + + + 2052 + 1456 + 50 + 20 + + + 2077 + 1466 + + + + + + + + + + + + f12daa2f-4fd5-48c1-8ac3-5dea476912ca + Mirror + + + + + Mirror an object. + true + a5ca4fbb-4ef7-4126-856e-c523b6a394bc + Mirror + Mirror + + + + + + 2279 + 1311 + 126 + 44 + + + 2341 + 1333 + + + + + + Base geometry + c067ab93-9d13-47cd-abd9-549d7de55b3f + Geometry + Geometry + true + af2c7be7-889b-4714-94e6-a45e621955b9 + 1 + + + + + + 2281 + 1313 + 48 + 20 + + + 2305 + 1323 + + + + + + + + Mirror plane + 76432d46-7289-4e22-870a-f83b080f6c2e + Plane + Plane + false + 06097883-f6e3-4579-853a-27abc769cdb2 + 1 + + + + + + 2281 + 1333 + 48 + 20 + + + 2305 + 1343 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + + + + + + + + + + Mirrored geometry + 117a9813-3afb-4dff-9f1e-31cda3b10532 + Geometry + Geometry + false + 0 + + + + + + 2353 + 1313 + 50 + 20 + + + 2378 + 1323 + + + + + + + + Transformation data + c15a0242-1056-4f0c-827f-2337662756c0 + Transform + Transform + false + 0 + + + + + + 2353 + 1333 + 50 + 20 + + + 2378 + 1343 + + + + + + + + + + + + fad344bc-09b1-4855-a2e6-437ef5715fe3 + YZ Plane + + + + + World YZ plane. + true + 888d2e72-6ebc-4640-8e2f-c9818b8f9161 + YZ Plane + YZ Plane + + + + + + 2177 + 1363 + 86 + 28 + + + 2221 + 1377 + + + + + + Origin of plane + 8acf04aa-d500-4f01-b2c8-f80a8e1cf29c + Origin + Origin + false + f013e5d9-e877-4748-844b-c6f9e5326801 + 1 + + + + + + 2179 + 1365 + 30 + 24 + + + 2194 + 1377 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + World YZ plane + 06097883-f6e3-4579-853a-27abc769cdb2 + Plane + Plane + false + 0 + + + + + + 2233 + 1365 + 28 + 24 + + + 2247 + 1377 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 9251c404-9e4f-4f27-a59c-404afc7dac70 + Relay + - + false + 827ed593-a53c-4a06-8c7f-23980c226d78 + 1 + + + + + + 932 + 652 + 40 + 16 + + + 952 + 660 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 6cd55ebe-f40c-4106-8cb3-cd54a6e9b376 + Relay + + false + 3da56e93-b503-4aaa-913f-b21fb00a75a9 + 1 + + + + + + 878 + 773 + 40 + 16 + + + 898 + 781 + + + + + + + + + + d1a28e95-cf96-4936-bf34-8bf142d731bf + Construct Domain + + + + + Create a numeric domain from two numeric extremes. + true + 4ddd2a07-322f-4795-a172-3b99993aa595 + Construct Domain + Construct Domain + + + + + + 1089 + 702 + 128 + 44 + + + 1165 + 724 + + + + + + Start value of numeric domain + 7c9f75dd-f162-441e-a2c6-464b69dda4e8 + Domain start + Domain start + false + 0 + + + + + + 1091 + 704 + 62 + 20 + + + 1122 + 714 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + End value of numeric domain + 4f619c7b-f5b1-46f9-8502-45b329b63d7b + Domain end + Domain end + false + 0 + + + + + + 1091 + 724 + 62 + 20 + + + 1122 + 734 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Numeric domain between {A} and {B} + 2e6ab3d8-3571-4002-bbfd-b1c139ddd81b + Domain + Domain + false + 0 + + + + + + 1177 + 704 + 38 + 40 + + + 1196 + 724 + + + + + + + + + + + + d1a28e95-cf96-4936-bf34-8bf142d731bf + Construct Domain + + + + + Create a numeric domain from two numeric extremes. + true + dc5ebd3a-4367-4d34-82c1-34da869b75d6 + Construct Domain + Construct Domain + + + + + + 1095 + 779 + 128 + 44 + + + 1171 + 801 + + + + + + Start value of numeric domain + 3a84a281-5b6f-4f72-9fda-494b6ee7988c + Domain start + Domain start + false + d4a33504-c20c-4eca-9a33-0f0b8663558e + 1 + + + + + + 1097 + 781 + 62 + 20 + + + 1128 + 791 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + End value of numeric domain + bb855e32-85cc-41c6-82ab-128ac13e4cc3 + Domain end + Domain end + false + 3f465dc2-8c6e-4d81-a437-46c362b1654d + 1 + + + + + + 1097 + 801 + 62 + 20 + + + 1128 + 811 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Numeric domain between {A} and {B} + 77f0ecec-7fa3-446d-a550-22710e20ed01 + Domain + Domain + false + 0 + + + + + + 1183 + 781 + 38 + 40 + + + 1202 + 801 + + + + + + + + + + + + ce46b74e-00c9-43c4-805a-193b69ea4a11 + Multiplication + + + + + Mathematical multiplication + true + f7161f8c-7ea3-4eb0-8cf5-e03f44271ea2 + Multiplication + Multiplication + + + + + + 947 + 694 + 70 + 44 + + + 972 + 716 + + + + + + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + First item for multiplication + 01cf03e8-5ff4-4fa9-802a-f18bfd0713e8 + A + A + true + 9251c404-9e4f-4f27-a59c-404afc7dac70 + 1 + + + + + + 949 + 696 + 11 + 20 + + + 954.5 + 706 + + + + + + + + Second item for multiplication + 333109a6-af4a-414f-9502-6624d49c125a + B + B + true + 1e93766d-5fbd-4ea8-b21a-84b4233dbcd0 + 1 + + + + + + 949 + 716 + 11 + 20 + + + 954.5 + 726 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Number + 2 + + + + + + + + + + + Result of multiplication + d4a33504-c20c-4eca-9a33-0f0b8663558e + Result + Result + false + 0 + + + + + + 984 + 696 + 31 + 40 + + + 999.5 + 716 + + + + + + + + + + + + + + ce46b74e-00c9-43c4-805a-193b69ea4a11 + Multiplication + + + + + Mathematical multiplication + true + 32ac75d1-06c3-4d1f-84dd-af9441ace308 + Multiplication + Multiplication + + + + + + 970 + 769 + 70 + 44 + + + 995 + 791 + + + + + + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + First item for multiplication + ee26c72f-7560-49f3-b521-778e0d1ec329 + A + A + true + 6cd55ebe-f40c-4106-8cb3-cd54a6e9b376 + 1 + + + + + + 972 + 771 + 11 + 20 + + + 977.5 + 781 + + + + + + + + Second item for multiplication + c270798f-a465-4dcf-bb14-e027051d4846 + B + B + true + 97c2f0bc-79e5-4949-afcc-2234c87c7f9a + 1 + + + + + + 972 + 791 + 11 + 20 + + + 977.5 + 801 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Integer + 2 + + + + + + + + + + + Result of multiplication + 3f465dc2-8c6e-4d81-a437-46c362b1654d + Result + Result + false + 0 + + + + + + 1007 + 771 + 31 + 40 + + + 1022.5 + 791 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 97c2f0bc-79e5-4949-afcc-2234c87c7f9a + Number Slider + Number Slider + false + 0 + + + + + + 705 + 731 + 198 + 20 + + + 705.4757 + 731.9849 + + + + + + 0 + 1 + 0 + 256 + 0 + 0 + 2 + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 4530d729-33e9-4496-a160-30e40cd38469 + Panel + Panel + false + 0 + 17b8f919-7cf9-4e9d-a977-4975ac259f79 + 1 + Double click to edit panel content… + + + + + + 1087 + 536 + 160 + 100 + + 0 + 0 + 0 + + 1087.559 + 536.23 + + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + 3e3d229d-1f64-445a-b137-750064653cc2 + Join Curves + Join Curves + + + + + + 1295 + 1143 + 106 + 44 + + + 1352 + 1165 + + + + + + 1 + Curves to join + 19e0b6c0-eedd-400e-a0a4-6ba87f2b030d + Curves + Curves + false + af2c7be7-889b-4714-94e6-a45e621955b9 + 117a9813-3afb-4dff-9f1e-31cda3b10532 + 2 + + + + + + 1297 + 1145 + 43 + 20 + + + 1318.5 + 1155 + + + + + + + + Preserve direction of input curves + ab163eaa-6931-44b6-a041-24560850d172 + Preserve + Preserve + false + 0 + + + + + + 1297 + 1165 + 43 + 20 + + + 1318.5 + 1175 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + a4db035a-a834-48b6-a951-08f0da775207 + Curves + Curves + false + 0 + + + + + + 1364 + 1145 + 35 + 40 + + + 1381.5 + 1165 + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 1e93766d-5fbd-4ea8-b21a-84b4233dbcd0 + Number Slider + Number Slider + false + 0 + + + + + + 702 + 699 + 198 + 20 + + + 702.5972 + 699.9152 + + + + + + 0 + 1 + 0 + 256 + 0 + 0 + 2 + + + + + + + + + 2fcc2743-8339-4cdf-a046-a1f17439191d + Remap Numbers + + + + + Remap numbers into a new numeric domain + true + e5f087fc-39ec-47fc-b736-f0b479cadb58 + Remap Numbers + Remap Numbers + + + + + + 1333 + 848 + 103 + 64 + + + 1382 + 880 + + + + + + Value to remap + f1f0bd0d-1666-4896-9030-749d448121ff + Value + Value + false + 17b8f919-7cf9-4e9d-a977-4975ac259f79 + 1 + + + + + + 1335 + 850 + 35 + 20 + + + 1352.5 + 860 + + + + + + + + Source domain + d5599cf9-0a99-42bf-a2ad-d55b57a7ba90 + Source + Source + false + 0a1a85d4-b6a4-4792-b637-010b92a8e34e + 1 + + + + + + 1335 + 870 + 35 + 20 + + + 1352.5 + 880 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 1 + + + + + + + + + + + + Target domain + df85e593-31a2-406f-a5d8-601eff1d1928 + Target + Target + false + 57009759-103d-4310-9871-260e6031175d + 1 + + + + + + 1335 + 890 + 35 + 20 + + + 1352.5 + 900 + + + + + + 1 + + + + + 1 + {0} + + + + + + -0.125 + 0.125 + + + + + + + + + + + + Remapped number + 1cc0dda1-74ca-4602-8b4b-73916761ecda + Mapped + Mapped + false + 0 + + + + + + 1394 + 850 + 40 + 30 + + + 1414 + 865 + + + + + + + + Remapped and clipped number + 1772a741-19ca-4c78-be80-9050696a77f5 + Clipped + Clipped + false + 0 + + + + + + 1394 + 880 + 40 + 30 + + + 1414 + 895 + + + + + + + + + + + + f44b92b0-3b5b-493a-86f4-fd7408c3daf3 + Bounds + + + + + Create a numeric domain which encompasses a list of numbers. + true + d54416a5-0296-4193-a9bc-920885868eff + Bounds + Bounds + + + + + + 1135 + 872 + 110 + 28 + + + 1193 + 886 + + + + + + 1 + Numbers to include in Bounds + 47275834-a719-4b7b-9518-a202c3d1ec71 + Numbers + Numbers + false + 17b8f919-7cf9-4e9d-a977-4975ac259f79 + 1 + + + + + + 1137 + 874 + 44 + 24 + + + 1159 + 886 + + + + + + + + Numeric Domain between the lowest and highest numbers in {N} + 0a1a85d4-b6a4-4792-b637-010b92a8e34e + Domain + Domain + false + 0 + + + + + + 1205 + 874 + 38 + 24 + + + 1224 + 886 + + + + + + + + + + + + 825ea536-aebb-41e9-af32-8baeb2ecb590 + Deconstruct Domain + + + + + Deconstruct a numeric domain into its component parts. + true + 7a173028-66d6-4096-bb7d-0d6dffbc72e5 + Deconstruct Domain + Deconstruct Domain + + + + + + 1249 + 914 + 92 + 44 + + + 1301 + 936 + + + + + + Base domain + f4c6ee4b-64cc-4147-944c-37cdb8c0fae0 + Domain + Domain + false + 0a1a85d4-b6a4-4792-b637-010b92a8e34e + 1 + + + + + + 1251 + 916 + 38 + 40 + + + 1270 + 936 + + + + + + + + Start of domain + e659963d-3369-4bfe-8042-98b4d774b39a + Start + Start + false + 0 + + + + + + 1313 + 916 + 26 + 20 + + + 1326 + 926 + + + + + + + + End of domain + d07ff3ad-3088-4bfd-a2b9-b0288b3b2d00 + End + End + false + 0 + + + + + + 1313 + 936 + 26 + 20 + + + 1326 + 946 + + + + + + + + + + + + d1a28e95-cf96-4936-bf34-8bf142d731bf + Construct Domain + + + + + Create a numeric domain from two numeric extremes. + true + 0bbaee54-4ac0-4701-98cd-5d4830124e0f + Construct Domain + Construct Domain + + + + + + 1360 + 978 + 128 + 44 + + + 1436 + 1000 + + + + + + Start value of numeric domain + 7b77b955-d618-49d8-9945-692378e6a951 + Domain start + Domain start + false + 55ecab52-3e82-4133-9387-f10eee9138a3 + 1 + + + + + + 1362 + 980 + 62 + 20 + + + 1393 + 990 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + End value of numeric domain + 3f99bfe1-037a-421b-8923-06e97aadb1c6 + Domain end + Domain end + false + 5c019ffe-18bb-4230-805b-b001e32f2032 + 1 + + + + + + 1362 + 1000 + 62 + 20 + + + 1393 + 1010 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Numeric domain between {A} and {B} + 57009759-103d-4310-9871-260e6031175d + Domain + Domain + false + 0 + + + + + + 1448 + 980 + 38 + 40 + + + 1467 + 1000 + + + + + + + + + + + + a3371040-e552-4bc8-b0ff-10a840258e88 + Negative + + + + + Compute the negative of a value. + true + 6403ee20-4b1f-4e93-ae14-016db73e7e65 + Negative + Negative + + + + + + 1263 + 995 + 88 + 28 + + + 1306 + 1009 + + + + + + Input value + 4e54c9db-afcf-4865-ba16-df040ab25b46 + Value + Value + false + 5c019ffe-18bb-4230-805b-b001e32f2032 + 1 + + + + + + 1265 + 997 + 29 + 24 + + + 1279.5 + 1009 + + + + + + + + Output value + 55ecab52-3e82-4133-9387-f10eee9138a3 + Result + Result + false + 0 + + + + + + 1318 + 997 + 31 + 24 + + + 1333.5 + 1009 + + + + + + + + + + + + 9c85271f-89fa-4e9f-9f4a-d75802120ccc + Division + + + + + Mathematical division + true + 601ec625-4080-4a00-b9ff-b1365ab9bf1e + Division + Division + + + + + + 1217 + 1002 + 70 + 44 + + + 1242 + 1024 + + + + + + Item to divide (dividend) + 6aac3a1e-532b-410a-aa2a-609615228be9 + A + A + false + d07ff3ad-3088-4bfd-a2b9-b0288b3b2d00 + 1 + + + + + + 1219 + 1004 + 11 + 20 + + + 1224.5 + 1014 + + + + + + + + Item to divide with (divisor) + ea7cd678-af99-449d-98f2-aa52d095784c + B + B + false + 0 + + + + + + 1219 + 1024 + 11 + 20 + + + 1224.5 + 1034 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Integer + 2 + + + + + + + + + + + The result of the Division + 5c019ffe-18bb-4230-805b-b001e32f2032 + Result + Result + false + 0 + + + + + + 1254 + 1004 + 31 + 40 + + + 1269.5 + 1024 + + + + + + + + + + + + 33bcf975-a0b2-4b54-99fd-585c893b9e88 + Digit Scroller + + + + + Numeric scroller for single numbers + 630931cb-4306-4152-885a-368a745f72a2 + Digit Scroller + Digit Scroller + false + 0 + + + + + 12 + Digit Scroller + 11 + + 9.0 + + + + + + -75 + 186 + 250 + 20 + + + -74.80819 + 186.532 + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 04e635c7-893f-4a17-b68d-073394ad75d4 + Evaluate Length + Evaluate Length + + + + + + 1344 + 37 + 132 + 64 + + + 1412 + 69 + + + + + + Curve to evaluate + 49732acd-b5a2-4c18-8b2c-4ac5d6a42f0a + Curve + Curve + false + 3910b2ce-825d-4581-ba63-0d4761cdc4e4 + 1 + + + + + + 1346 + 39 + 54 + 20 + + + 1373 + 49 + + + + + + + + Length factor for curve evaluation + 44ed20d2-bed7-4174-b019-8b950c7a60ca + Length + Length + false + 0 + + + + + + 1346 + 59 + 54 + 20 + + + 1373 + 69 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.75 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 666836d5-90e9-45dc-888c-cd7fda5d1741 + Normalized + Normalized + false + 0 + + + + + + 1346 + 79 + 54 + 20 + + + 1373 + 89 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + fd7d459a-61ec-4c29-bce8-89f5389ae2ef + Point + Point + false + 0 + + + + + + 1424 + 39 + 50 + 20 + + + 1449 + 49 + + + + + + + + Tangent vector at the specified length + cb88cd15-164e-4c99-b984-886295fad576 + Tangent + Tangent + false + 0 + + + + + + 1424 + 59 + 50 + 20 + + + 1449 + 69 + + + + + + + + Curve parameter at the specified length + 3f14ac00-2735-4b30-b58f-f6009f2d3725 + Parameter + Parameter + false + 0 + + + + + + 1424 + 79 + 50 + 20 + + + 1449 + 89 + + + + + + + + + + + + b464fccb-50e7-41bd-9789-8438db9bea9f + Angle + + + + + Compute the angle between two vectors. + true + 548ba4e7-1094-4f18-8d2c-ed9350d74134 + Angle + Angle + + + + + + 1523 + 26 + 103 + 64 + + + 1581 + 58 + + + + + + First vector + cde0c54d-257c-47dd-a75c-93831604dfeb + Vector A + Vector A + false + 0 + + + + + + 1525 + 28 + 44 + 20 + + + 1547 + 38 + + + + + + 1 + + + + + 1 + {0} + + + + + + 30.0625 + 0 + 0 + + + + + + + + + + + + Second vector + 7fd43add-9420-4d8d-a6d1-2e01130d43ea + Vector B + Vector B + false + cb88cd15-164e-4c99-b984-886295fad576 + 1 + + + + + + 1525 + 48 + 44 + 20 + + + 1547 + 58 + + + + + + + + Optional plane for 2D angle + caf6d80b-4d54-4c6b-946f-f161314d6b79 + Plane + Plane + true + 0 + + + + + + 1525 + 68 + 44 + 20 + + + 1547 + 78 + + + + + + + + Angle (in radians) between vectors + c4db3d67-5cd2-4e5c-971b-abc7d2047fb7 + Angle + Angle + false + 0 + + + + + + 1593 + 28 + 31 + 30 + + + 1608.5 + 43 + + + + + + + + Reflex angle (in radians) between vectors + 5b49b5c0-0dd6-46aa-b4d5-3d37d0bebde9 + Reflex + Reflex + false + 0 + + + + + + 1593 + 58 + 31 + 30 + + + 1608.5 + 73 + + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 29793b43-3c78-40d1-82d3-36ef567d8578 + Panel + Panel + false + 0 + 41244f95-85c4-47bf-9fed-b1232d1657c8 + 1 + Double click to edit panel content… + + + + + + 138 + -56 + 160 + 100 + + 0 + 0 + 0 + + + + + + 255;255;255;255 + + true + true + true + false + false + true + + + + + + + + + 0d77c51e-584f-44e8-aed2-c2ddf4803888 + Degrees + + + + + Convert an angle specified in radians to degrees + true + e0f162c2-c67f-4cbf-b177-9615c93a8543 + Degrees + Degrees + + + + + + 1673 + 71 + 108 + 28 + + + 1726 + 85 + + + + + + Angle in radians + 31a31548-a7e3-4ab0-bf66-93c1acb557a6 + Radians + Radians + false + c4db3d67-5cd2-4e5c-971b-abc7d2047fb7 + 1 + + + + + + 1675 + 73 + 39 + 24 + + + 1694.5 + 85 + + + + + + + + Angle in degrees + 95fb2e68-16eb-412a-96d3-aa5cad0a1ade + Degrees + Degrees + false + 0 + + + + + + 1738 + 73 + 41 + 24 + + + 1758.5 + 85 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 41244f95-85c4-47bf-9fed-b1232d1657c8 + Relay + + false + 95fb2e68-16eb-412a-96d3-aa5cad0a1ade + 1 + + + + + + 2019 + 14 + 40 + 16 + + + 2039 + 22 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 3efcf628-bc42-4274-8af9-de2b19540957 + Relay + + false + a4db035a-a834-48b6-a951-08f0da775207 + 1 + + + + + + 1617 + 974 + 40 + 16 + + + 1637 + 982 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 332dde95-ad78-4c2f-8f95-7ea47795be9c + Relay + + false + 0c3d97eb-e01e-4cd0-bcc9-899b5e8bd773 + 1 + + + + + + 1507 + 781 + 40 + 16 + + + 1527 + 789 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 3540c5a6-ed00-4088-8256-5cc9330d7c01 + Relay + + false + 1cc0dda1-74ca-4602-8b4b-73916761ecda + 1 + + + + + + 1470 + 851 + 40 + 16 + + + 1490 + 859 + + + + + + + + + + d1a28e95-cf96-4936-bf34-8bf142d731bf + Construct Domain + + + + + Create a numeric domain from two numeric extremes. + true + 2bce439f-ae63-4755-8a11-f68a91e530d2 + Construct Domain + Construct Domain + + + + + + 1271 + 1047 + 128 + 44 + + + 1347 + 1069 + + + + + + Start value of numeric domain + 25efca59-d3bb-4917-b0ba-84391e993cb0 + Domain start + Domain start + false + e659963d-3369-4bfe-8042-98b4d774b39a + 1 + + + + + + 1273 + 1049 + 62 + 20 + + + 1304 + 1059 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + End value of numeric domain + e570691e-e484-47c1-a052-c9b7145cb788 + Domain end + Domain end + false + 5c019ffe-18bb-4230-805b-b001e32f2032 + 1 + + + + + + 1273 + 1069 + 62 + 20 + + + 1304 + 1079 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Numeric domain between {A} and {B} + ae23b4da-3771-4312-9a4d-a3be2fa6330a + Domain + Domain + false + 0 + + + + + + 1359 + 1049 + 38 + 40 + + + 1378 + 1069 + + + + + + + + + + + + 9c007a04-d0d9-48e4-9da3-9ba142bc4d46 + Subtraction + + + + + Mathematical subtraction + true + 678b40b3-501b-4110-ac8c-a0f22e64efa2 + Subtraction + Subtraction + + + + + + 198 + 120 + 70 + 44 + + + 223 + 142 + + + + + + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + First operand for subtraction + c72eac78-6276-4d76-9119-f95db5b67e4d + A + A + true + 30510cbc-939e-47f4-a157-892edbb7b2ec + 1 + + + + + + 200 + 122 + 11 + 20 + + + 205.5 + 132 + + + + + + + + Second operand for subtraction + 14c0eb18-b3cb-4f98-aa58-d1dbf04f3fa6 + B + B + true + 0 + + + + + + 200 + 142 + 11 + 20 + + + 205.5 + 152 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Integer + 1 + + + + + + + + + + + Result of subtraction + 0e94a1ab-3131-4c59-b8f2-e8748666b639 + Result + Result + false + 0 + + + + + + 235 + 122 + 31 + 40 + + + 250.5 + 142 + + + + + + + + + + + + + + 33bcf975-a0b2-4b54-99fd-585c893b9e88 + Digit Scroller + + + + + Numeric scroller for single numbers + 96b27b16-bb55-4b29-9114-d293f15cbbbe + Digit Scroller + Digit Scroller + false + 0 + + + + + 12 + Digit Scroller + 11 + + 512.0 + + + + + + -81 + 252 + 250 + 20 + + + -80.80819 + 252.532 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 30510cbc-939e-47f4-a157-892edbb7b2ec + Relay + + false + 2265bbff-c475-4520-9fbf-9b5deac52a81 + 1 + + + + + + 217 + 196 + 40 + 16 + + + 237 + 204 + + + + + + + + + + a0d62394-a118-422d-abb3-6af115c75b25 + Addition + + + + + Mathematical addition + true + 88ceaea4-997e-4385-a209-d26a25e6cad7 + Addition + Addition + + + + + + 196 + 265 + 70 + 44 + + + 221 + 287 + + + + + + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + First item for addition + 7eecbe49-527d-4e4a-b96e-0fb2ecc52c92 + A + A + true + 96b27b16-bb55-4b29-9114-d293f15cbbbe + 1 + + + + + + 198 + 267 + 11 + 20 + + + 203.5 + 277 + + + + + + + + Second item for addition + cd98cff3-4ef8-4f8b-9fab-0ac59bec7927 + B + B + true + 0 + + + + + + 198 + 287 + 11 + 20 + + + 203.5 + 297 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Integer + 1 + + + + + + + + + + + Result of addition + 2265bbff-c475-4520-9fbf-9b5deac52a81 + Result + Result + false + 0 + + + + + + 233 + 267 + 31 + 40 + + + 248.5 + 287 + + + + + + + + + + + + + + 797d922f-3a1d-46fe-9155-358b009b5997 + One Over X + + + + + Compute one over x. + true + 716a01a9-92c7-4e1a-b870-d137b96a88f1 + One Over X + One Over X + + + + + + 16 + 495 + 88 + 28 + + + 59 + 509 + + + + + + Input value + f5b98d25-7f9b-4ade-bafc-8533008e312d + Value + Value + false + 96b27b16-bb55-4b29-9114-d293f15cbbbe + 1 + + + + + + 18 + 497 + 29 + 24 + + + 32.5 + 509 + + + + + + + + Output value + 9abd597a-a15f-4099-b74a-28d83b683784 + Result + Result + false + 0 + + + + + + 71 + 497 + 31 + 24 + + + 86.5 + 509 + + + + + + + + + + + + 9c85271f-89fa-4e9f-9f4a-d75802120ccc + Division + + + + + Mathematical division + true + 11c3d988-287e-42f8-ab4f-8a985f570719 + Division + Division + + + + + + 155 + 536 + 70 + 44 + + + 180 + 558 + + + + + + Item to divide (dividend) + b5f1c9c2-6040-4c0f-87d6-badcd27e5f81 + A + A + false + 9abd597a-a15f-4099-b74a-28d83b683784 + 1 + + + + + + 157 + 538 + 11 + 20 + + + 162.5 + 548 + + + + + + + + Item to divide with (divisor) + 8942af83-4043-4c79-b9bc-32498bb5cc19 + B + B + false + 0 + + + + + + 157 + 558 + 11 + 20 + + + 162.5 + 568 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Integer + 4 + + + + + + + + + + + The result of the Division + 96d11fc8-f4ab-41f0-a789-1a983f81b85b + Result + Result + false + 0 + + + + + + 192 + 538 + 31 + 40 + + + 207.5 + 558 + + + + + + + + + + + + 9c85271f-89fa-4e9f-9f4a-d75802120ccc + Division + + + + + Mathematical division + true + ed6492eb-acc2-4a60-bc00-eda6a9990969 + Division + Division + + + + + + 27 + 536 + 70 + 44 + + + 52 + 558 + + + + + + Item to divide (dividend) + cc13665f-4d33-4ee9-aa36-6d7531e8ca14 + A + A + false + 0 + + + + + + 29 + 538 + 11 + 20 + + + 34.5 + 548 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Number + 22.5 + + + + + + + + + + + Item to divide with (divisor) + b1021a89-0e55-4303-acac-8dd976f652d3 + B + B + false + 96b27b16-bb55-4b29-9114-d293f15cbbbe + 1 + + + + + + 29 + 558 + 11 + 20 + + + 34.5 + 568 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Integer + 64 + + + + + + + + + + + The result of the Division + e9b21352-6201-4ce0-8627-b334312d19ac + Result + Result + false + 0 + + + + + + 64 + 538 + 31 + 40 + + + 79.5 + 558 + + + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + 95e54ab1-d9fe-4240-9ceb-e7de21dc8681 + Panel + + false + 0 + 0 + 360/256/4/4/4/4 + + + + + + 312 + 542 + 169 + 27 + + 0 + 0 + 0 + + 312.0504 + 542.0521 + + + + + + + 255;255;250;90 + + true + true + true + false + false + true + + + + + + + + + 2162e72e-72fc-4bf8-9459-d4d82fa8aa14 + Divide Curve + + + + + Divide a curve into equal length segments + true + 98cf7c44-7caf-4bc2-9983-255f53356402 + Divide Curve + Divide Curve + + + + + + 1451 + 1140 + 113 + 64 + + + 1495 + 1172 + + + + + + Curve to divide + fd8612eb-d457-440b-8f4e-311c04abaaa5 + Curve + Curve + false + a4db035a-a834-48b6-a951-08f0da775207 + 1 + + + + + + 1453 + 1142 + 30 + 20 + + + 1468 + 1152 + + + + + + + + Number of segments + 3a023116-8a4c-4151-b517-0c5ca51ad239 + Count + Count + false + 0 + + + + + + 1453 + 1162 + 30 + 20 + + + 1468 + 1172 + + + + + + 1 + + + + + 1 + {0} + + + + + 16 + + + + + + + + + + + Split segments at kinks + aaa9c033-0aa7-4e1c-ab07-0c251f0f7e53 + Kinks + Kinks + false + 0 + + + + + + 1453 + 1182 + 30 + 20 + + + 1468 + 1192 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Division points + 60286ff9-4bdd-49d5-9a09-78b8ed865edd + Points + Points + false + 0 + + + + + + 1507 + 1142 + 55 + 20 + + + 1534.5 + 1152 + + + + + + + + 1 + Tangent vectors at division points + 8382f3f4-d743-4a2c-94e1-f1a01a8c11db + Tangents + Tangents + false + 0 + + + + + + 1507 + 1162 + 55 + 20 + + + 1534.5 + 1172 + + + + + + + + 1 + Parameter values at division points + 6919b5e5-8ccd-4451-a52c-aef7f1c08629 + Parameters + Parameters + false + 0 + + + + + + 1507 + 1182 + 55 + 20 + + + 1534.5 + 1192 + + + + + + + + + + + + 71b5b089-500a-4ea6-81c5-2f960441a0e8 + PolyLine + + + + + Create a polyline connecting a number of points. + true + 0d6c5562-1514-4a06-8d1d-ef13dc497cfc + PolyLine + PolyLine + + + + + + 1583 + 1140 + 106 + 44 + + + 1637 + 1162 + + + + + + 1 + Polyline vertex points + 6d443295-1228-442f-8b28-121c91f2d172 + Vertices + Vertices + false + 60286ff9-4bdd-49d5-9a09-78b8ed865edd + 1 + + + + + + 1585 + 1142 + 40 + 20 + + + 1605 + 1152 + + + + + + + + Close polyline + cf23932a-887d-4765-b887-3f226ce76ece + Closed + Closed + false + 0 + + + + + + 1585 + 1162 + 40 + 20 + + + 1605 + 1172 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Resulting polyline + 379a3424-e130-4321-8792-bddd2920cd65 + Polyline + Polyline + false + 0 + + + + + + 1649 + 1142 + 38 + 40 + + + 1668 + 1162 + + + + + + + + + + + + cae9fe53-6d63-44ed-9d6d-13180fbf6f89 + 1c9de8a1-315f-4c56-af06-8f69fee80a7a + Curve Graph Mapper + + + + + Remap values with a custom graph using input curves. + true + 19dee33a-96f3-4395-b4cc-340b05bbaae3 + Curve Graph Mapper + Curve Graph Mapper + + + + + + 1814 + 1027 + 148 + 224 + + + 1876 + 1139 + + + + + + 1 + One or multiple graph curves to graph map values with + e5b32d81-2d78-4e62-9766-c08226ec6195 + Curves + Curves + false + 379a3424-e130-4321-8792-bddd2920cd65 + 1 + + + + + + 1816 + 1029 + 48 + 27 + + + 1840 + 1042.75 + + + + + + + + Rectangle which defines the boundary of the graph, graph curves should be atleast partially inside this boundary + 715e5d41-041e-42c4-b0bf-cf14e2d1a01b + Rectangle + Rectangle + false + 332dde95-ad78-4c2f-8f95-7ea47795be9c + 1 + + + + + + 1816 + 1056 + 48 + 28 + + + 1840 + 1070.25 + + + + + + + + 1 + Values to graph map. Values are plotted along the X Axis, intersected with the graph curves, then mapped to the Y Axis + ee9c92a7-74d0-4a26-8674-07b012424d24 + Values + Values + false + 3540c5a6-ed00-4088-8256-5cc9330d7c01 + 1 + + + + + + 1816 + 1084 + 48 + 27 + + + 1840 + 1097.75 + + + + + + + + Domain of the graphs X Axis, where the values get plotted (if omitted the input value lists domain bounds is used) + e6b0c8aa-099c-4454-ab37-178f9e3d0b9a + X Axis + X Axis + true + 0 + + + + + + 1816 + 1111 + 48 + 28 + + + 1840 + 1125.25 + + + + + + + + Domain of the graphs Y Axis, where the values get mapped to (if omitted the input value lists domain bounds is used) + 8e912506-4bde-4f49-b662-c55f1bdddb22 + Y Axis + Y Axis + true + 0 + + + + + + 1816 + 1139 + 48 + 27 + + + 1840 + 1152.75 + + + + + + + + Flip the graphs X Axis from the bottom of the graph to the top of the graph + 44397376-90b1-4a96-b63f-b5fe6a694f76 + Flip + Flip + false + 0 + + + + + + 1816 + 1166 + 48 + 28 + + + 1840 + 1180.25 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Resize the graph by snapping it to the extents of the graph curves, in the plane of the boundary rectangle + 3fdd56ab-a1ae-4d62-bf89-e76d45e50fc5 + Snap + Snap + false + 0 + + + + + + 1816 + 1194 + 48 + 27 + + + 1840 + 1207.75 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Size of the graph labels + 65d6365a-ea25-4b47-ace8-092dab096b0f + Text Size + Text Size + false + 0 + + + + + + 1816 + 1221 + 48 + 28 + + + 1840 + 1235.25 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.0625 + + + + + + + + + + + 1 + Resulting graph mapped values, mapped on the Y Axis + e1059b3d-dbbd-4de7-9d6a-bd28ca6f88a7 + Mapped + Mapped + false + 0 + + + + + + 1888 + 1029 + 72 + 20 + + + 1924 + 1039 + + + + + + + + 1 + The graph curves inside the boundary of the graph + 15b1822a-f87b-4609-bab1-a22facf27926 + Graph Curves + Graph Curves + false + 0 + + + + + + 1888 + 1049 + 72 + 20 + + + 1924 + 1059 + + + + + + + + 1 + The points on the graph curves where the X Axis input values intersected + true + 71ddae23-0978-4dc1-bf5b-659ae35ed51d + Graph Points + Graph Points + false + 0 + + + + + + 1888 + 1069 + 72 + 20 + + + 1924 + 1079 + + + + + + + + 1 + The lines from the X Axis input values to the graph curves + true + bd5a1acd-f7b1-43d7-a991-25b78b36bae8 + Value Lines + Value Lines + false + 0 + + + + + + 1888 + 1089 + 72 + 20 + + + 1924 + 1099 + + + + + + + + 1 + The points plotted on the X Axis which represent the input values + true + d0951905-6710-4463-8a50-821b59535093 + Value Points + Value Points + false + 0 + + + + + + 1888 + 1109 + 72 + 20 + + + 1924 + 1119 + + + + + + + + 1 + The lines from the graph curves to the Y Axis graph mapped values + true + 262f3790-ce8e-41b5-9b6e-a3b083021b20 + Mapped Lines + Mapped Lines + false + 0 + + + + + + 1888 + 1129 + 72 + 20 + + + 1924 + 1139 + + + + + + + + 1 + The points mapped on the Y Axis which represent the graph mapped values + true + 855e6d4b-38f7-48b5-9c30-06ae558eb45e + Mapped Points + Mapped Points + false + 0 + + + + + + 1888 + 1149 + 72 + 20 + + + 1924 + 1159 + + + + + + + + The graph boundary background as a surface + 0bd875b3-ae76-486d-855a-fadb44606f68 + Boundary + Boundary + false + 0 + + + + + + 1888 + 1169 + 72 + 20 + + + 1924 + 1179 + + + + + + + + 1 + The graph labels as curve outlines + 14550080-0419-4e9f-a4cb-4e6e0762909d + Labels + Labels + false + 0 + + + + + + 1888 + 1189 + 72 + 20 + + + 1924 + 1199 + + + + + + + + 1 + True for input values outside of the X Axis domain bounds +False for input values inside of the X Axis domain bounds + 861d3523-67af-4e9b-9ac5-e785109b0d68 + Out Of Bounds + Out Of Bounds + false + 0 + + + + + + 1888 + 1209 + 72 + 20 + + + 1924 + 1219 + + + + + + + + 1 + True for input values on the X Axis which intersect a graph curve +False for input values on the X Axis which do not intersect a graph curve + 2652c610-ffe6-496b-8bc0-4d24210d8f99 + Intersected + Intersected + false + 0 + + + + + + 1888 + 1229 + 72 + 20 + + + 1924 + 1239 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 13e397fd-afb5-45c3-b3dc-d7322eb9e745 + Relay + + false + e1059b3d-dbbd-4de7-9d6a-bd28ca6f88a7 + 1 + + + + + + 2024 + 1067 + 40 + 16 + + + 2044 + 1075 + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 0eec3f9a-1b4d-44c9-895a-1c960ed166b1 + Evaluate Length + Evaluate Length + + + + + + 1371 + 134 + 132 + 64 + + + 1439 + 166 + + + + + + Curve to evaluate + c371efec-bf41-452d-8d89-50a61ce228d7 + Curve + Curve + false + 3910b2ce-825d-4581-ba63-0d4761cdc4e4 + 1 + + + + + + 1373 + 136 + 54 + 20 + + + 1400 + 146 + + + + + + + + Length factor for curve evaluation + 4ca11071-91a4-46fc-b1d2-3968f409fa55 + Length + Length + false + 0 + + + + + + 1373 + 156 + 54 + 20 + + + 1400 + 166 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.25 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 37195dab-735c-4cbb-9c39-51624dda2b22 + Normalized + Normalized + false + 0 + + + + + + 1373 + 176 + 54 + 20 + + + 1400 + 186 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + 4645f2f4-218e-4807-a3fb-955086a9e962 + Point + Point + false + 0 + + + + + + 1451 + 136 + 50 + 20 + + + 1476 + 146 + + + + + + + + Tangent vector at the specified length + 2e9b7528-a9e9-4f70-b414-078c9e047841 + Tangent + Tangent + false + 0 + + + + + + 1451 + 156 + 50 + 20 + + + 1476 + 166 + + + + + + + + Curve parameter at the specified length + 78a5033d-7a52-4041-b19c-0629b3916502 + Parameter + Parameter + false + 0 + + + + + + 1451 + 176 + 50 + 20 + + + 1476 + 186 + + + + + + + + + + + + 079bd9bd-54a0-41d4-98af-db999015f63d + VB Script + + + + + Private Function IsSet(ByVal param As String) As Boolean ' Check if an input parameter has data + Dim i As Integer = Component.Params.IndexOfInputParam(param) + If i > -1 Then + Return Component.Params.Input.ElementAt(i).DataType > 1 ' input parameter DataType of 1 means it's not receiving input (internal or external) + Else + Msg("error", "Input parameter '" & param & "' not found") + Return False + End If + End Function + + Private Sub Msg(ByVal type As String, ByVal msg As String) ' Output an error, warning, or informational message + Select Case type + Case "error" + Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, msg) + Print("Error: " & msg) + Case "warning" + Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, msg) + Print("Warning: " & msg) + Case "info" + Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, msg) + Print(msg) + End Select + End Sub + + ' Solve for the m parameter from length and width (reference {1} equation (34), except b = width and K(k) and E(k) should be K(m) and E(m)) + Private Function SolveMFromLenWid(ByVal L As Double, ByVal w As Double) As Double + If w = 0 Then + Return Defined.M_ZERO_W ' for the boundry condition width = 0, bypass the function and return the known m value + End If + + Dim n As Integer = 1 ' Iteration counter (quit if >MAXIT) + Dim lower As Double = 0 ' m must be within this range + Dim upper As Double = 1 + Dim m As Double + Dim cwl As Double + + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + cwl = 2 * EllipticE(m) / EllipticK(m) - 1 ' calculate w/L with the test value of m + If cwl < w / L Then ' compares the calculated w/L with the actual w/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + Return m + End Function + + ' Solve for the m parameter from length and height (reference {1} equation (33), except K(k) should be K(m) and k = sqrt(m)) + ' Note that it's actually possible to find 2 valid values for m (hence 2 width values) at certain height values + Private Function SolveMFromLenHt(ByVal L As Double, ByVal h As Double) As List(Of Double) + Dim n As Integer = 1 ' Iteration counter (quit if >MAXIT) + Dim lower As Double = 0 ' m must be within this range + Dim upper As Double = 1 + Dim twoWidths As Boolean = h / L >= Defined.DOUBLE_W_HL_RATIO And h / L < Defined.MAX_HL_RATIO ' check to see if h/L is within the range where 2 solutions for the width are possible + Dim m As Double + Dim mult_m As New List(Of Double) + Dim chl As Double + + If twoWidths Then + ' find the first of two possible solutions for m with the following limits: + lower = Defined.M_DOUBLE_W ' see constants at bottom of script + upper = Defined.M_MAXHEIGHT ' see constants at bottom of script + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + chl = Math.Sqrt(m) / EllipticK(m) ' calculate h/L with the test value of m + If chl > h / L Then ' compares the calculated h/L with the actual h/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + mult_m.Add(m) + + ' then find the second of two possible solutions for m with the following limits: + lower = Defined.M_MAXHEIGHT ' see constants at bottom of script + upper = 1 + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + chl = Math.Sqrt(m) / EllipticK(m) ' calculate h/L with the test value of m + If chl < h / L Then ' compares the calculated h/L with the actual h/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + + If m <= Defined.M_MAX Then ' return this m parameter only if it falls within the maximum useful value (above which the curve breaks down) + mult_m.Add(m) + End If + + Else + ' find the one possible solution for the m parameter + upper = Defined.M_DOUBLE_W ' limit the upper end of the search to the maximum value of m for which only one solution exists + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + chl = Math.Sqrt(m) / EllipticK(m) ' calculate h/L with the test value of m + If chl > h / L Then ' compares the calculated h/L with the actual h/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + mult_m.Add(m) + End If + + Return mult_m + End Function + + ' Solve for the m parameter from width and height (derived from reference {1} equations (33) and (34) with same notes as above) + Private Function SolveMFromWidHt(ByVal w As Double, ByVal h As Double) As Double + Dim n As Integer = 1 ' Iteration counter (quit if >MAXIT) + Dim lower As Double = 0 ' m must be within this range + Dim upper As Double = 1 + Dim m As Double + Dim cwh As Double + + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + cwh = (2 * EllipticE(m) - EllipticK(m)) / Math.Sqrt(m) ' calculate w/h with the test value of m + If cwh < w / h Then ' compares the calculated w/h with the actual w/h then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + + Return m + End Function + + ' Calculate length based on height and an m parameter, derived from reference {1} equation (33), except K(k) should be K(m) and k = sqrt(m) + Private Function Cal_L(ByVal h As Double, ByVal m As Double) As Double + Return h * EllipticK(m) / Math.Sqrt(m) + End Function + + ' Calculate width based on length and an m parameter, derived from reference {1} equation (34), except b = width and K(k) and E(k) should be K(m) and E(m) + Private Function Cal_W(ByVal L As Double, ByVal m As Double) As Double + Return L * (2 * EllipticE(m) / EllipticK(m) - 1) + End Function + + ' Calculate height based on length and an m parameter, from reference {1} equation (33), except K(k) should be K(m) and k = sqrt(m) + Private Function Cal_H(ByVal L As Double, ByVal m As Double) As Double + Return L * Math.Sqrt(m) / EllipticK(m) + End Function + + ' Calculate the unique m parameter based on a start tangent angle, from reference {2}, just above equation (9a), that states k = Sin(angle / 2 + Pi / 4), + ' but as m = k^2 and due to this script's need for an angle rotated 90° versus the one in reference {1}, the following formula is the result + ' New note: verified by reference {4}, pg. 78 at the bottom + Private Function Cal_M(ByVal a As Double) As Double + Return (1 - Math.Cos(a)) / 2 ' equal to Sin^2(a/2) too + End Function + + ' Calculate start tangent angle based on an m parameter, derived from above formula + Private Function Cal_A(ByVal m As Double) As Double + Return Math.Acos(1 - 2 * m) + End Function + + ' This is the heart of this script, taking the found (or specified) length, width, and angle values along with the found m parameter to create + ' a list of points that approximate the shape or form of the elastica. It works by finding the x and y coordinates (which are reversed versus + ' the original equations (12a) and (12b) from reference {2} due to the 90° difference in orientation) based on the tangent angle along the curve. + ' See reference {2} for more details on how they derived it. Note that to simplify things, the algorithm only calculates the points for half of the + ' curve, then mirrors those points along the y-axis. + Private Function FindBendForm(ByVal L As Double, ByVal w As Double, ByVal m As Double, ByVal ang As Double, ByVal refPln As Plane) As List(Of Point3d) + L = L / 2 ' because the below algorithm is based on the formulas in reference {2} for only half of the curve + w = w / 2 ' same + + If ang = 0 Then ' if angle (and height) = 0, then simply return the start and end points of the straight line + Dim out As New List(Of Point3d) + out.Add(refPln.PointAt(w, 0, 0)) + out.Add(refPln.PointAt(-w, 0, 0)) + Return out + End If + + Dim x As Double + Dim y As Double + Dim halfCurvePts As New List(Of Point3d) + Dim fullCurvePts As New List(Of Point3d) + Dim translatedPts As New List(Of Point3d) + + ang -= Math.PI / 2 ' a hack to allow this algorithm to work, since the original curve in paper {2} was rotated 90° + Dim angB As Double = ang + (-Math.PI / 2 - ang) / Defined.CURVEDIVS ' angB is the 'lowercase theta' which should be in formula {2}(12b) as the interval + ' start [a typo...see equation(3)]. It's necessary to start angB at ang + [interval] instead of just ang due to integration failing at angB = ang + halfCurvePts.Add(New Point3d(w, 0, 0)) ' start with this known initial point, as integration will fail when angB = ang + + ' each point {x, y} is calculated from the tangent angle, angB, that occurs at each point (which is why this iterates from ~ang to -pi/2, the known end condition) + Do While Math.Round(angB, Defined.ROUNDTO) >= Math.Round(-Math.PI / 2, Defined.ROUNDTO) + y = (Math.Sqrt(2) * Math.Sqrt(Math.Sin(ang) - Math.Sin(angB)) * (w + L)) / (2 * EllipticE(m)) ' note that x and y are swapped vs. (12a) and (12b) + x = (L / (Math.Sqrt(2) * EllipticK(m))) * Simpson(angB, -Math.PI / 2, 500, ang) ' calculate the Simpson approximation of the integral (function f below) + ' over the interval angB ('lowercase theta') to -pi/2. side note: is 500 too few iterations for the Simson algorithm? + + If Math.Round(x, Defined.ROUNDTO) = 0 Then x = 0 + halfCurvePts.Add(New Point3d(x, y, 0)) + + angB += (-Math.PI / 2 - ang) / Defined.CURVEDIVS ' onto the next tangent angle + Loop + + ' After finding the x and y values for half of the curve, add the {-x, y} values for the rest of the curve + For Each point As Point3d In halfCurvePts + If Math.Round(point.X, Defined.ROUNDTO) = 0 Then + If Math.Round(point.Y, Defined.ROUNDTO) = 0 Then + fullCurvePts.Add(New Point3d(0, 0, 0)) ' special case when width = 0: when x = 0, only duplicate the point when y = 0 too + End If + Else + fullCurvePts.Add(New Point3d(-point.X, point.Y, 0)) + End If + Next + halfCurvePts.Reverse + fullCurvePts.AddRange(halfCurvePts) + + For Each p As Point3d In fullCurvePts + translatedPts.Add(refPln.PointAt(p.X, p.Y, p.Z)) ' translate the points from the reference plane to the world plane + Next + + Return translatedPts + End Function + + ' Interpolates the points from FindBendForm to create the Elastica curve. Uses start & end tangents for greater accuracy. + Private Function MakeCurve(ByVal pts As List(Of Point3d), ByVal ang As Double, ByVal refPln As Plane) As Curve + If ang <> 0 Then + Dim ts, te As New Vector3d(refPln.XAxis) + ts.Rotate(ang, refPln.ZAxis) + te.Rotate(-ang, refPln.ZAxis) + Return Curve.CreateInterpolatedCurve(pts, 3, CurveKnotStyle.Chord, ts, te) ' 3rd degree curve with 'Chord' Knot Style + Else + Return Curve.CreateInterpolatedCurve(pts, 3) ' if angle (and height) = 0, then simply interpolate the straight line (no start/end tangents) + End If + End Function + + ' Implements the Simpson approximation for an integral of function f below + Public Function Simpson(a As Double, b As Double, n As Integer, theta As Double) As Double 'n should be an even number + Dim j As Integer, s1 As Double, s2 As Double, h As Double + h = (b - a) / n + s1 = 0 + s2 = 0 + For j = 1 To n - 1 Step 2 + s1 = s1 + fn(a + j * h, theta) + Next j + For j = 2 To n - 2 Step 2 + s2 = s2 + fn(a + j * h, theta) + Next j + Simpson = h / 3 * (fn(a, theta) + 4 * s1 + 2 * s2 + fn(b, theta)) + End Function + + ' Specific calculation for the above integration + Public Function fn(x As Double, theta As Double) As Double + fn = Math.Sin(x) / (Math.Sqrt(Math.Sin(theta) - Math.Sin(x))) ' from reference {2} formula (12b) + End Function + + + ' Return the Complete Elliptic integral of the 1st kind + ' Abramowitz and Stegun p.591, formula 17.3.11 + ' Code from http://www.codeproject.com/Articles/566614/Elliptic-integrals + Public Function EllipticK(ByVal m As Double) As Double + Dim sum, term, above, below As Double + sum = 1 + term = 1 + above = 1 + below = 2 + + For i As Integer = 1 To 100 + term *= above / below + sum += Math.Pow(m, i) * Math.Pow(term, 2) + above += 2 + below += 2 + Next + sum *= 0.5 * Math.PI + Return sum + End Function + + + ' Return the Complete Elliptic integral of the 2nd kind + ' Abramowitz and Stegun p.591, formula 17.3.12 + ' Code from http://www.codeproject.com/Articles/566614/Elliptic-integrals + Public Function EllipticE(ByVal m As Double) As Double + Dim sum, term, above, below As Double + sum = 1 + term = 1 + above = 1 + below = 2 + + For i As Integer = 1 To 100 + term *= above / below + sum -= Math.Pow(m, i) * Math.Pow(term, 2) / above + above += 2 + below += 2 + Next + sum *= 0.5 * Math.PI + Return sum + End Function + + Friend Partial NotInheritable Class Defined + Private Sub New() + End Sub + + ' Note: most of these values for m and h/L ratio were found with Wolfram Alpha and either specific intercepts (x=0) or local minima/maxima. They should be constant. + Public Const M_SKETCHY As Double = 0.95 ' value of the m parameter where the curvature near the ends of the curve gets wonky + Public Const M_MAX As Double = 0.993 ' maximum useful value of the m parameter, above which this algorithm for the form of the curve breaks down + Public Const M_ZERO_W As Double = 0.826114765984970336 ' value of the m parameter when width = 0 + Public Const M_MAXHEIGHT As Double = 0.701327460663101223 ' value of the m parameter at maximum possible height of the bent rod/wire + Public Const M_DOUBLE_W As Double = 0.180254422335013983 ' minimum value of the m parameter when two width values are possible for a given height and length + Public Const DOUBLE_W_HL_RATIO As Double = 0.257342117984635757 ' value of the height/length ratio above which there are two possible width values + Public Const MAX_HL_RATIO As Double = 0.403140189705650243 ' maximum possible value of the height/length ratio + + Public Const MAXERR As Double = 0.0000000001 ' error tolerance + Public Const MAXIT As Integer = 100 ' maximum number of iterations + Public Const ROUNDTO As Integer = 10 ' number of decimal places to round off to + Public Const CURVEDIVS As Integer = 50 ' number of sample points for building the curve (or half-curve as it were) + End Class + true + A VB.NET scriptable component + + 98 + 86 + + true + 26fe933d-1698-4d29-8acd-71f478537911 + VB Script + VB + true + 0 + ' ----------------------------------------------------------------- + ' Elastic Bending Script by Will McElwain + ' Created February 2014 + ' + ' DESCRIPTION: + ' This beast creates the so-called 'elastica curve', the shape a long, thin rod or wire makes when it is bent elastically (i.e. not permanently). In this case, force + ' is assumed to only be applied horizontally (which would be in line with the rod at rest) and both ends are assumed to be pinned or hinged meaning they are free + ' to rotate (as opposed to clamped, when the end tangent angle is fixed, usually horizontally). An interesting finding is that it doesn't matter what the material or + ' cross-sectional area is, as long as they're uniform along the entire length. Everything makes the same shape when bent as long as it doesn't cross the threshold + ' from elastic to plastic (permanent) deformation (I don't bother to find that limit here, but can be found if the yield stress for a material is known). + ' + ' Key to the formulas used in this script are elliptic integrals, specifically K(m), the complete elliptic integral of the first kind, and E(m), the complete elliptic + ' integral of the second kind. There was a lot of confusion over the 'm' and 'k' parameters for these functions, as some people use them interchangeably, but they are + ' not the same. m = k^2 (thus k = Sqrt(m)). I try to use the 'm' parameter exclusively to avoid this confusion. Note that there is a unique 'm' parameter for every + ' configuration/shape of the elastica curve. + ' + ' This script tries to find that unique 'm' parameter based on the inputs. The algorithm starts with a test version of m, evaluates an expression, say 2*E(m)/K(m)-1, + ' then compares the result to what it should be (in this case, a known width/length ratio). Iterate until the correct m is found. Once we have m, we can then calculate + ' all of the other unknowns, then find points that lie on that curve, then interpolate those points for the actual curve. You can also use Wolfram|Alpha as I did to + ' find the m parameter based on the equations in this script (example here: http://tiny.cc/t4tpbx for when say width=45.2 and length=67.1). + ' + ' Other notes: + ' * This script works with negative values for width, which will creat a self-intersecting curve (as it should). The curvature of the elastica starts to break down around + ' m=0.95 (~154°), but this script will continue to work until M_MAX, m=0.993 (~169°). If you wish to ignore self-intersecting curves, set ignoreSelfIntersecting to True + ' * When the only known values are length and height, it is actually possible for certain ratios of height to length to have two valid m values (thus 2 possible widths + ' and angles). This script will return them both. + ' * Only the first two valid parameters (of the required ones) will be used, meaning if all four are connected (length, width or a PtB, height, and angle), this script will + ' only use length and width (or a PtB). + ' * Depending on the magnitude of your inputs (say if they're really small, like if length < 10), you might have to increase the constant ROUNDTO at the bottom + ' + ' REFERENCES: + ' {1} "The elastic rod" by M.E. Pacheco Q. & E. Pina, http://www.scielo.org.mx/pdf/rmfe/v53n2/v53n2a8.pdf + ' {2} "An experiment in nonlinear beam theory" by A. Valiente, http://www.deepdyve.com/lp/doc/I3lwnxdfGz , also here: http://tiny.cc/Valiente_AEiNBT + ' {3} "Snap buckling, writhing and Loop formation In twisted rods" by V.G.A. GOSS, http://myweb.lsbu.ac.uk/~gossga/thesisFinal.pdf + ' {4} "Theory of Elastic Stability" by Stephen Timoshenko, http://www.scribd.com/doc/50402462/Timoshenko-Theory-of-Elastic-Stability (start on p. 76) + ' + ' INPUT: + ' PtA - First anchor point (required) + ' PtB - Second anchor point (optional, though 2 out of the 4--length, width, height, angle--need to be specified) + ' [note that PtB can be the same as PtA (meaning width would be zero)] + ' [also note that if a different width is additionally specified that's not equal to the distance between PtA and PtB, then the end point will not equal PtB anymore] + ' Pln - Plane of the bent rod/wire, which bends up in the +y direction. The line between PtA and PtB (if specified) must be parallel to the x-axis of this plane + ' + ' ** 2 of the following 4 need to be specified ** + ' Len - Length of the rod/wire, which needs to be > 0 + ' Wid - Width between the endpoints of the curve [note: if PtB is specified in addition, and distance between PtA and PtB <> width, the end point will be relocated + ' Ht - Height of the bent rod/wire (when negative, curve will bend downward, relative to the input plane, instead) + ' Ang - Inner departure angle or tangent angle (in radians) at the ends of the bent rod/wire. Set up so as width approaches length (thus height approaches zero), angle approaches zero + ' + ' * Following variables only needed for optional calculating of bending force, not for shape of curve. + ' E - Young's modulus (modulus of elasticity) in GPa (=N/m^2) (material-specific. for example, 7075 aluminum is roughly 71.7 GPa) + ' I - Second moment of area (or area moment of inertia) in m^4 (cross-section-specific. for example, a hollow rod + ' would have I = pi * (outer_diameter^4 - inner_diameter^4) / 32 + ' Note: E*I is also known as flexural rigidity or bending stiffness + ' + ' OUTPUT: + ' out - only for debugging messages + ' Pts - the list of points that approximate the shape of the elastica + ' Crv - the 3rd-degree curve interpolated from those points (with accurate start & end tangents) + ' L - the length of the rod/wire + ' W - the distance (width) between the endpoints of the rod/wire + ' H - the height of the bent rod/wire + ' A - the tangent angle at the (start) end of the rod/wire + ' F - the force needed to hold the rod/wire in a specific shape (based on the material properties & cross-section) **be sure your units for 'I' match your units for the + ' rest of your inputs (length, width, etc.). Also note that the critical buckling load (force) that makes the rod/wire start to bend can be found at height=0 + ' + ' THANKS TO: + ' Mårten Nettelbladt (thegeometryofbending.blogspot.com) + ' Daniel Piker (Kangaroo plugin) + ' David Rutten (Grasshopper guru) + ' Euler & Bernoulli (the O.G.'s) + ' + ' ----------------------------------------------------------------- + + Dim ignoreSelfIntersecting As Boolean = False ' set to True if you don't want to output curves where width < 0, which creates a self-intersecting curve + + Dim inCt As Integer = 0 ' count the number of required parameters that are receiving data + Dim length As Double + Dim width As System.Object = Nothing ' need to set as Nothing so we can check if it has been assigned a value later + Dim height As Double + Dim angle As Double + Dim m As Double + Dim multiple_m As New List(Of Double) + Dim AtoB As Line + Dim flip_H As Boolean = False ' if height is negative, this flag will be set + Dim flip_A As Boolean = False ' if angle is negative, this flag will be set + + If Not IsSet("Pln") Then + Msg("error", "Base plane is not set") + Return + End If + + If Not IsSet("PtA") Then + Msg("error", "Point A is not set") + Return + End If + + If Math.Round(Pln.DistanceTo(PtA), Defined.ROUNDTO) <> 0 Then + Msg("error", "Point A is not on the base plane") + Return + End If + + Dim refPlane As Plane = Pln ' create a reference plane = input plane and set the origin of it to PtA in case PtA isn't the origin already + refPlane.Origin = PtA + + If IsSet("PtB") Then + If Math.Round(Pln.DistanceTo(PtB), Defined.ROUNDTO) <> 0 Then + Msg("error", "Point B is not on the base plane") + Return + End If + + AtoB = New Line(PtA, PtB) + If AtoB.Length <> 0 And Not AtoB.Direction.IsPerpendicularTo(Pln.YAxis) Then + Msg("error", "The line between PtA and PtB is not perpendicular to the Y-axis of the specified plane") + Return + End If + + inCt += 1 + If IsSet("Wid") Then Msg("info", "Wid will override the distance between PtA and PtB. If you do not want this to happen, disconnect PtB or Wid.") + + width = PtA.DistanceTo(PtB) ' get the width (distance) between PtA and PtB + + Dim refPtB As Point3d + refPlane.RemapToPlaneSpace(PtB, refPtB) + If refPtB.X < 0 Then width = -width ' check if PtB is to the left of PtA...if so, width is negative + End If + + If IsSet("Len") Then inCt += 1 + If IsSet("Wid") Then inCt += 1 + If IsSet("Ht") Then inCt += 1 + If IsSet("Ang") Then inCt += 1 + If inCt > 2 Then Msg("info", "More parameters set than are required (out of length, width, height, angle). Only using the first two valid ones.") + + ' check for connected/specified inputs. note: only the first two that it comes across will be used + If IsSet("Len") Then ' if length is specified then... + If Len <= 0 Then + Msg("error", "Length cannot be negative or zero") + Return + End If + If IsSet("Wid") Then ' find height & angle based on length and specified width + If Wid > Len Then + Msg("error", "Width is greater than length") + Return + End If + If Wid = Len Then ' skip the solver and set the known values + height = 0 + m = 0 + angle = 0 + width = Wid + Else + m = SolveMFromLenWid(Len, Wid) + height = Cal_H(Len, m) ' L * Sqrt(m) / K(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + width = Wid + End If + + Else If width IsNot Nothing Then ' find height & angle based on length and calculated width (distance between PtA and PtB) + If width > Len Then + Msg("error", "Width is greater than length") + Return + End If + If width = Len Then ' skip the solver and set the known values + height = 0 + m = 0 + angle = 0 + Else + m = SolveMFromLenWid(Len, width) + height = Cal_H(Len, m) ' L * Sqrt(m) / K(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + + Else If IsSet("Ht") Then ' find width & angle based on length and height ** possible to return 2 results ** + If Math.Abs(Ht / Len) > Defined.MAX_HL_RATIO Then + Msg("error", "Height not possible with given length") + Return + End If + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + If Ht = 0 Then ' skip the solver and set the known values + width = Len + angle = 0 + Else + multiple_m = SolveMFromLenHt(Len, Ht) ' note that it's possible for two values of m to be found if height is close to max height + If multiple_m.Count = 1 Then ' if there's only one m value returned, calculate the width & angle here. we'll deal with multiple m values later + m = multiple_m.Item(0) + width = Cal_W(Len, m) ' L * (2 * E(m) / K(m) - 1) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + End If + height = Ht + + Else If IsSet("Ang") Then ' find width & height based on length and angle + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then ' skip the solver and set the known values + width = Len + height = 0 + Else + width = Cal_W(Len, m) ' L * (2 * E(m) / K(m) - 1) + height = Cal_H(Len, m) ' L * Sqrt(m) / K(m) + End If + angle = Ang + + Else + Msg("error", "Need to specify one more parameter in addition to length") + Return + End If + length = Len + + Else If IsSet("Wid") Then ' if width is specified then... + If IsSet("Ht") Then ' find length & angle based on specified width and height + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + If Ht = 0 Then ' skip the solver and set the known values + length = Wid + angle = 0 + Else + m = SolveMFromWidHt(Wid, Ht) + length = Cal_L(Ht, m) ' h * K(m) / Sqrt(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + height = Ht + + Else If IsSet("Ang") Then ' find length & height based on specified width and angle + If Wid = 0 Then + Msg("error", "Curve not possible with width = 0 and an angle as inputs") + Return + End If + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then ' skip the solver and set the known values + length = Wid + height = 0 + Else + length = Wid / (2 * EllipticE(m) / EllipticK(m) - 1) + If length < 0 Then + Msg("error", "Curve not possible at specified width and angle (calculated length is negative)") + Return + End If + height = Cal_H(length, m) ' L * Sqrt(m) / K(m) + End If + angle = Ang + + Else + Msg("error", "Need to specify one more parameter in addition to width (Wid)") + Return + End If + width = Wid + + Else If width IsNot Nothing Then ' if width is determined by PtA and PtB then... + If IsSet("Ht") Then ' find length & angle based on calculated width and height + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + If Ht = 0 Then ' skip the solver and set the known values + length = width + angle = 0 + Else + m = SolveMFromWidHt(width, Ht) + length = Cal_L(Ht, m) ' h * K(m) / Sqrt(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + height = Ht + + Else If IsSet("Ang") Then ' find length & height based on calculated width and angle + If width = 0 Then + Msg("error", "Curve not possible with width = 0 and an angle as inputs") + Return + End If + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then ' skip the solver and set the known values + length = width + height = 0 + Else + length = width / (2 * EllipticE(m) / EllipticK(m) - 1) + If length < 0 Then + Msg("error", "Curve not possible at specified width and angle (calculated length is negative)") + Return + End If + height = Cal_H(length, m) ' L * Sqrt(m) / K(m) + End If + angle = Ang + + Else + Msg("error", "Need to specify one more parameter in addition to PtA and PtB") + Return + End If + + Else If IsSet("Ht") Then ' if height is specified then... + If IsSet("Ang") Then ' find length & width based on height and angle + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_H = True + flip_A = True + End If + If Ht = 0 Then + Msg("error", "Height can't = 0 if only height and angle are specified") + Return + Else + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = Not flip_A + flip_H = Not flip_H + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then + Msg("error", "Angle can't = 0 if only height and angle are specified") + Return + Else + length = Cal_L(Ht, m) ' h * K(m) / Sqrt(m) + width = Cal_W(length, m) ' L * (2 * E(m) / K(m) - 1) + End If + angle = Ang + End If + height = Ht + + Else + Msg("error", "Need to specify one more parameter in addition to height") + Return + End If + + Else If IsSet("Ang") Then + Msg("error", "Need to specify one more parameter in addition to angle") + Return + Else + Msg("error", "Need to specify two of the four parameters: length, width (or PtB), height, and angle") + Return + End If + + If m > Defined.M_MAX Then + Msg("error", "Form of curve not solvable with current algorithm and given inputs") + Return + End If + + refPlane.Origin = refPlane.PointAt(width / 2, 0, 0) ' adjust the origin of the reference plane so that the curve is centered about the y-axis (start of the curve is at x = -width/2) + + If multiple_m.Count > 1 Then ' if there is more than one m value returned, calculate the width, angle, and curve for each + Dim multi_pts As New DataTree(Of Point3d) + Dim multi_crv As New List(Of Curve) + Dim tmp_pts As New List(Of Point3d) + Dim multi_W, multi_A, multi_F As New List(Of Double) + Dim j As Integer = 0 ' used for creating a new branch (GH_Path) for storing pts which is itself a list of points + + For Each m_val As Double In multiple_m + width = Cal_W(length, m_val) 'length * (2 * EllipticE(m_val) / EllipticK(m_val) - 1) + + If width < 0 And ignoreSelfIntersecting Then + Msg("warning", "One curve is self-intersecting. To enable these, set ignoreSelfIntersecting to False") + Continue For + End If + + If m_val >= Defined.M_SKETCHY Then Msg("info", "Accuracy of the curve whose width = " & Math.Round(width, 4) & " is not guaranteed") + + angle = Cal_A(m_val) 'Math.Asin(2 * m_val - 1) + refPlane.Origin = refPlane.PointAt(width / 2, 0, 0) ' adjust the origin of the reference plane so that the curve is centered about the y-axis (start of the curve is at x = -width/2) + + tmp_pts = FindBendForm(length, width, m_val, angle, refPlane) + multi_pts.AddRange(tmp_pts, New GH_Path(j)) + multi_crv.Add(MakeCurve(tmp_pts, angle, refPlane)) + + multi_W.Add(width) + If flip_A Then angle = -angle + multi_A.Add(angle) + + E = E * 10 ^ 9 ' Young's modulus input E is in GPa, so we convert to Pa here (= N/m^2) + multi_F.Add(EllipticK(m_val) ^ 2 * E * I / length ^ 2) ' from reference {4} pg. 79 + + j += 1 + refPlane.Origin = PtA ' reset the reference plane origin to PtA for the next m_val + 'Print("length=" & length & ", width=" & width & ", height=" & height & ", angle=" & angle & ", m=" & m_val & ", k=" & Math.Sqrt(m_val) & ", w/L=" & width / length & ", h/L=" & height / length & ", w/h=" & width / height) + Next + + ' assign the outputs + Pts = multi_pts + Crv = multi_crv + L = length + W = multi_W + If flip_H Then height = -height + H = height + A = multi_A + F = multi_F + + Else ' only deal with the single m value + If m >= Defined.M_SKETCHY Then Msg("info", "Accuracy of the curve at these parameters is not guaranteed") + + If width < 0 And ignoreSelfIntersecting Then + Msg("error", "Curve is self-intersecting. To enable these, set ignoreSelfIntersecting to False") + Return + End If + + Pts = FindBendForm(length, width, m, angle, refPlane) + Crv = MakeCurve(pts, angle, refPlane) + L = length + W = width + If flip_H Then height = -height + H = height + If flip_A Then angle = -angle + A = angle + + E = E * 10 ^ 9 ' Young's modulus input E is in GPa, so we convert to Pa here (= N/m^2) + F = EllipticK(m) ^ 2 * E * I / length ^ 2 ' from reference {4} pg. 79. Note: the critical buckling (that makes the rod/wire start to bend) can be found at height=0 (width=length) + + 'height = Math.Sqrt(((2 * Len / 5) ^ 2 - ((Wid - Len / 5) / 2) ^ 2) ' quick approximation discovered by Mårten of 'Geometry of Bending' fame ( http://tiny.cc/it2pbx ) + 'width = (Len +/- 2 * Math.Sqrt(4 * Len ^ 2 - 25 * Ht ^ 2)) / 5 ' derived from above + 'length = (2 * Math.Sqrt(15 * Ht ^ 2 + 4 * Wid ^ 2) - Wid) / 3 ' derived from above + + 'Print("length=" & length & ", width=" & width & ", height=" & height & ", angle=" & angle & ", m=" & m & ", k=" & Math.Sqrt(m) & ", w/L=" & width / length & ", h/L=" & height / length & ", w/h=" & width / height) + End If + + Imports System.IO +Imports System.Linq +Imports System.Data +Imports System.Drawing +Imports System.Reflection +Imports System.Windows.Forms +Imports System.Xml +Imports System.Xml.Linq +Imports Microsoft.VisualBasic +Imports System.Runtime.InteropServices + +Imports Rhino.DocObjects +Imports Rhino.Collections +Imports GH_IO +Imports GH_IO.Serialization + + + + + + 1273 + 273 + 69 + 184 + + + 1309 + 365 + + + + + + 9 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 8 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script Variable PtA + 379a664a-9630-476f-8c20-256ddf3e943d + PtA + PtA + true + 0 + true + 5de5b792-8962-4638-be4a-86c646282e68 + 1 + e1937b56-b1da-4c12-8bd8-e34ee81746ef + + + + + + 1275 + 275 + 22 + 20 + + + 1286 + 285 + + + + + + + + true + Script Variable PtB + b01c7d92-c595-4d7a-99a3-957cf497c826 + PtB + PtB + true + 0 + true + 16fb0b71-416e-432e-a77f-b9e8590e307f + 1 + e1937b56-b1da-4c12-8bd8-e34ee81746ef + + + + + + 1275 + 295 + 22 + 20 + + + 1286 + 305 + + + + + + + + true + Script Variable Pln + 2e167bf2-eb59-4ca7-9464-7bde7df029f3 + Pln + Pln + true + 0 + true + 3d941ab3-84a6-460a-ac4c-e5c4efca8e47 + 1 + 3897522d-58e9-4d60-b38c-978ddacfedd8 + + + + + + 1275 + 315 + 22 + 20 + + + 1286 + 325 + + + + + + + + true + Script Variable Len + 61596bb3-a4f5-40b6-92e6-92d9ae8bc194 + Len + Len + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 1275 + 335 + 22 + 20 + + + 1286 + 345 + + + + + + + + true + Script Variable Wid + d1851653-5fa8-44b5-a695-13eabdf10a15 + Wid + Wid + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 1275 + 355 + 22 + 20 + + + 1286 + 365 + + + + + + + + true + Script Variable Ht + 64fd744a-673e-41f1-988e-91bebdb8a308 + Ht + Ht + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 1275 + 375 + 22 + 20 + + + 1286 + 385 + + + + + + + + true + Script Variable Ang + 8dfb957f-e4c5-4592-9f98-049164a4e9a7 + Ang + Ang + true + 0 + true + 3d353983-c48d-4967-baae-8b74c2abee7e + 1 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 1275 + 395 + 22 + 20 + + + 1286 + 405 + + + + + + + + true + Script Variable E + f831c67e-99d4-413a-8d4a-c8cde2dd88f6 + E + E + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 1275 + 415 + 22 + 20 + + + 1286 + 425 + + + + + + + + true + Script Variable I + b198e951-41a9-4c89-a1c4-5edcc7b4b0de + I + I + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 1275 + 435 + 22 + 20 + + + 1286 + 445 + + + + + + + + 1 + Print, Reflect and Error streams + d7c128dd-a6ec-4944-8ea9-c4460afa58f8 + out + out + false + 0 + + + + + + 1321 + 275 + 19 + 22 + + + 1330.5 + 286.25 + + + + + + + + Output parameter Pts + b23dc398-765b-468f-907e-9b7e6781486a + Pts + Pts + false + 0 + + + + + + 1321 + 297 + 19 + 23 + + + 1330.5 + 308.75 + + + + + + + + Output parameter Crv + 7ef4522e-b915-4f20-98c0-46077f0157f6 + Crv + Crv + false + 0 + + + + + + 1321 + 320 + 19 + 22 + + + 1330.5 + 331.25 + + + + + + + + Output parameter L + 7090fadb-2ca9-4c0c-be28-893ad204d749 + L + L + false + 0 + + + + + + 1321 + 342 + 19 + 23 + + + 1330.5 + 353.75 + + + + + + + + Output parameter W + 5b43b5d2-f91d-4aff-ae44-e894e1bb5cd2 + W + W + false + 0 + + + + + + 1321 + 365 + 19 + 22 + + + 1330.5 + 376.25 + + + + + + + + Output parameter H + e490d0a3-dbd6-438f-924f-befb23b428f3 + H + H + false + 0 + + + + + + 1321 + 387 + 19 + 23 + + + 1330.5 + 398.75 + + + + + + + + Output parameter A + 1d23bbf4-3a2b-4814-839c-52ef5c2fafa3 + A + A + false + 0 + + + + + + 1321 + 410 + 19 + 22 + + + 1330.5 + 421.25 + + + + + + + + Output parameter F + e06badbd-c5a8-40aa-920f-caf043a47c5a + F + F + false + 0 + + + + + + 1321 + 432 + 19 + 23 + + + 1330.5 + 443.75 + + + + + + + + + + + + + + 17b7152b-d30d-4d50-b9ef-c9fe25576fc2 + XY Plane + + + + + World XY plane. + true + 8a3dca1a-0507-466f-99a7-b036ba423ccc + XY Plane + XY + + + + + + 1184 + 363 + 49 + 28 + + + 1209 + 377 + + + + + + Origin of plane + 3fa3af50-5459-4ea8-b4a5-fd9587ebbb82 + Origin + O + false + 0 + + + + + + 1186 + 365 + 11 + 24 + + + 1191.5 + 377 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + World XY plane + 3d941ab3-84a6-460a-ac4c-e5c4efca8e47 + Plane + P + false + 0 + + + + + + 1221 + 365 + 10 + 24 + + + 1226 + 377 + + + + + + + + + + + + 9abae6b7-fa1d-448c-9209-4a8155345841 + Deconstruct + + + + + Deconstruct a point into its component parts. + true + ee3a95a3-a762-4ed2-8187-9839f68150b8 + Deconstruct + Deconstruct + + + + + + 975 + 281 + 120 + 64 + + + 1016 + 313 + + + + + + Input point + 4c3fad4c-7689-41c9-adce-9bb8b7987dad + Point + Point + false + 4645f2f4-218e-4807-a3fb-955086a9e962 + 1 + + + + + + 977 + 283 + 27 + 60 + + + 990.5 + 313 + + + + + + + + Point {x} component + 0e5c88e5-c9b5-4ca4-8171-2b24be76b2d7 + X component + X component + false + 0 + + + + + + 1028 + 283 + 65 + 20 + + + 1060.5 + 293 + + + + + + + + Point {y} component + 798aeadd-978c-45e4-8c94-72f0051b4754 + Y component + Y component + false + 0 + + + + + + 1028 + 303 + 65 + 20 + + + 1060.5 + 313 + + + + + + + + Point {z} component + 8f6e69d6-5406-463b-b91e-97143bc992ad + Z component + Z component + false + 0 + + + + + + 1028 + 323 + 65 + 20 + + + 1060.5 + 333 + + + + + + + + + + + + 3581f42a-9592-4549-bd6b-1c0fc39d067b + Construct Point + + + + + Construct a point from {xyz} coordinates. + true + a7788758-befc-49c7-99aa-854487086770 + Construct Point + Construct Point + + + + + + 1109 + 389 + 117 + 64 + + + 1185 + 421 + + + + + + {x} coordinate + d513bf44-ae47-4ec2-9ed7-845b21353729 + X coordinate + X coordinate + false + 0 + + + + + + 1111 + 391 + 62 + 20 + + + 1142 + 401 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + {y} coordinate + a0ce9b42-1eca-49d0-b9a3-83cec0e1edca + Y coordinate + Y coordinate + false + 798aeadd-978c-45e4-8c94-72f0051b4754 + 1 + + + + + + 1111 + 411 + 62 + 20 + + + 1142 + 421 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + {z} coordinate + 11d47961-0dd1-42e7-b0cb-7ea241126426 + Z coordinate + Z coordinate + false + 8f6e69d6-5406-463b-b91e-97143bc992ad + 1 + + + + + + 1111 + 431 + 62 + 20 + + + 1142 + 441 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Point coordinate + 5de5b792-8962-4638-be4a-86c646282e68 + Point + Point + false + 0 + + + + + + 1197 + 391 + 27 + 60 + + + 1210.5 + 421 + + + + + + + + + + + + 3581f42a-9592-4549-bd6b-1c0fc39d067b + Construct Point + + + + + Construct a point from {xyz} coordinates. + true + 172c0aa2-9bcc-4796-a6b5-a28528c2d9cb + Construct Point + Construct Point + + + + + + 1126 + 298 + 117 + 64 + + + 1202 + 330 + + + + + + {x} coordinate + 2705197f-8db2-404a-95a3-fb9517b9bcea + X coordinate + X coordinate + false + 2fcdaa53-203a-4fe5-861d-d5a592274133 + 1 + + + + + + 1128 + 300 + 62 + 20 + + + 1159 + 310 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + {y} coordinate + 59785051-089e-4aaf-a937-f2b3b3ad32eb + Y coordinate + Y coordinate + false + 798aeadd-978c-45e4-8c94-72f0051b4754 + 1 + + + + + + 1128 + 320 + 62 + 20 + + + 1159 + 330 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + {z} coordinate + ae605f9e-59df-4be9-b687-af5f1bab4bcc + Z coordinate + Z coordinate + false + 8f6e69d6-5406-463b-b91e-97143bc992ad + 1 + + + + + + 1128 + 340 + 62 + 20 + + + 1159 + 350 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Point coordinate + 16fb0b71-416e-432e-a77f-b9e8590e307f + Point + Point + false + 0 + + + + + + 1214 + 300 + 27 + 60 + + + 1227.5 + 330 + + + + + + + + + + + + ce46b74e-00c9-43c4-805a-193b69ea4a11 + Multiplication + + + + + Mathematical multiplication + true + dd24aaf1-38d4-4d9e-b55a-b0d22176a7e6 + Multiplication + Multiplication + + + + + + 995 + 418 + 70 + 44 + + + 1020 + 440 + + + + + + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + First item for multiplication + 1d01b093-ae53-40ac-a04e-d84419c40fed + A + A + true + afc911a9-b572-4d05-b576-201cb0b133cb + 1 + + + + + + 997 + 420 + 11 + 20 + + + 1002.5 + 430 + + + + + + + + Second item for multiplication + 1528904c-20de-4ba2-a5be-f3e26b788389 + B + B + true + 0 + + + + + + 997 + 440 + 11 + 20 + + + 1002.5 + 450 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Number + 1.4142135623730951 + + + + + + + + + + + Result of multiplication + 2fcdaa53-203a-4fe5-861d-d5a592274133 + Result + Result + false + 0 + + + + + + 1032 + 420 + 31 + 40 + + + 1047.5 + 440 + + + + + + + + + + + + + + e9eb1dcf-92f6-4d4d-84ae-96222d60f56b + Move + + + + + Translate (move) an object along a vector. + true + dad503e9-2aa5-4d17-b40c-8cadfc34cb66 + Move + Move + + + + + + 1372 + 319 + 126 + 44 + + + 1434 + 341 + + + + + + Base geometry + d8f7c11f-4936-462b-bc6f-c5580367d5d5 + Geometry + Geometry + true + 7ef4522e-b915-4f20-98c0-46077f0157f6 + 1 + + + + + + 1374 + 321 + 48 + 20 + + + 1398 + 331 + + + + + + + + Translation vector + 8cf6bbcd-2483-40dc-8378-b776decfda45 + Motion + Motion + false + 4afaa80c-c707-4e66-9a7a-919bf318c524 + 1 + + + + + + 1374 + 341 + 48 + 20 + + + 1398 + 351 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 10 + + + + + + + + + + + + Translated geometry + ef023e0a-b0bf-4784-a7db-fcd46bf5ae51 + Geometry + Geometry + false + 0 + + + + + + 1446 + 321 + 50 + 20 + + + 1471 + 331 + + + + + + + + Transformation data + ddf92800-9656-4a85-bc8c-c30ac86f6b5a + Transform + Transform + false + 0 + + + + + + 1446 + 341 + 50 + 20 + + + 1471 + 351 + + + + + + + + + + + + 56b92eab-d121-43f7-94d3-6cd8f0ddead8 + Vector XYZ + + + + + Create a vector from {xyz} components. + true + 3240bff2-3352-49bf-b549-18862f2d5145 + Vector XYZ + Vector XYZ + + + + + + 1381 + 457 + 127 + 64 + + + 1460 + 489 + + + + + + Vector {x} component + a8ee4b63-dcd4-4cee-b987-99b040df54b1 + X component + X component + false + 0 + + + + + + 1383 + 459 + 65 + 20 + + + 1415.5 + 469 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector {y} component + 70c85474-9c16-4604-a77b-6e9cd4677b38 + Y component + Y component + false + 734e1fd9-346e-41f5-9eed-fe2757a0d729 + 1 + + + + + + 1383 + 479 + 65 + 20 + + + 1415.5 + 489 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector {z} component + 33bb6ff2-95f0-44dd-bf3f-a21ee656c2d1 + Z component + Z component + false + 0 + + + + + + 1383 + 499 + 65 + 20 + + + 1415.5 + 509 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector construct + 4afaa80c-c707-4e66-9a7a-919bf318c524 + Vector + Vector + false + 0 + + + + + + 1472 + 459 + 34 + 30 + + + 1489 + 474 + + + + + + + + Vector length + 91177497-889b-4a3f-9bb3-9b85a12212fc + Length + Length + false + 0 + + + + + + 1472 + 489 + 34 + 30 + + + 1489 + 504 + + + + + + + + + + + + a3371040-e552-4bc8-b0ff-10a840258e88 + Negative + + + + + Compute the negative of a value. + true + 06b1da93-07f0-4365-86d0-473544cba624 + Negative + Negative + + + + + + 1269 + 482 + 88 + 28 + + + 1312 + 496 + + + + + + Input value + 2465e63a-da05-49b8-bd94-f842c265c6c4 + Value + Value + false + 798aeadd-978c-45e4-8c94-72f0051b4754 + 1 + + + + + + 1271 + 484 + 29 + 24 + + + 1285.5 + 496 + + + + + + + + Output value + 734e1fd9-346e-41f5-9eed-fe2757a0d729 + Result + Result + false + 0 + + + + + + 1324 + 484 + 31 + 24 + + + 1339.5 + 496 + + + + + + + + + + + + a4cd2751-414d-42ec-8916-476ebf62d7fe + Radians + + + + + Convert an angle specified in degrees to radians + true + e4147dfe-ec4d-4264-82fc-cb45905f5587 + Radians + Radians + + + + + + 1082 + 489 + 108 + 28 + + + 1137 + 503 + + + + + + Angle in degrees + a2b4ecd1-cde8-449f-bf45-730f4a7b3846 + Degrees + Degrees + false + 0 + + + + + + 1084 + 491 + 41 + 24 + + + 1104.5 + 503 + + + + + + 1 + + + + + 1 + {0} + + + + + -45 + + + + + + + + + + + Angle in radians + 3d353983-c48d-4967-baae-8b74c2abee7e + Radians + Radians + false + 0 + + + + + + 1149 + 491 + 39 + 24 + + + 1168.5 + 503 + + + + + + + + + + + + b7798b74-037e-4f0c-8ac7-dc1043d093e0 + Rotate + + + + + Rotate an object in a plane. + true + b61aa121-0767-4ebd-b8fd-53718081faa8 + Rotate + Rotate + + + + + + 1525 + 314 + 126 + 64 + + + 1587 + 346 + + + + + + Base geometry + 8237ba14-0829-45d8-9502-46c5a4d4c1bc + Geometry + Geometry + true + ef023e0a-b0bf-4784-a7db-fcd46bf5ae51 + 1 + + + + + + 1527 + 316 + 48 + 20 + + + 1551 + 326 + + + + + + + + Rotation angle in radians + fc95ddb1-f33b-4c0b-8ae8-ac612ce7de42 + Angle + Angle + false + 0 + false + + + + + + 1527 + 336 + 48 + 20 + + + 1551 + 346 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.78539816339744828 + + + + + + + + + + + Rotation plane + 00ce870c-2207-4dca-8ea1-8876c9e153e8 + Plane + Plane + false + 0 + + + + + + 1527 + 356 + 48 + 20 + + + 1551 + 366 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + Rotated geometry + a2b626bf-b4aa-4acb-92af-37de03d77db9 + Geometry + Geometry + false + 0 + + + + + + 1599 + 316 + 50 + 30 + + + 1624 + 331 + + + + + + + + Transformation data + d1dab41c-61ac-4dff-80c2-c8433c4def13 + Transform + Transform + false + 0 + + + + + + 1599 + 346 + 50 + 30 + + + 1624 + 361 + + + + + + + + + + + + f12daa2f-4fd5-48c1-8ac3-5dea476912ca + Mirror + + + + + Mirror an object. + true + e894278d-82bd-40c5-a275-a61555953fb6 + Mirror + Mirror + + + + + + 1675 + 319 + 126 + 44 + + + 1737 + 341 + + + + + + Base geometry + 79d5488f-43eb-4f73-b0c5-7d48c286d4bf + Geometry + Geometry + true + a2b626bf-b4aa-4acb-92af-37de03d77db9 + 1 + + + + + + 1677 + 321 + 48 + 20 + + + 1701 + 331 + + + + + + + + Mirror plane + c8809857-080f-4c66-b21e-169a65473fc0 + Plane + Plane + false + 0 + + + + + + 1677 + 341 + 48 + 20 + + + 1701 + 351 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + + + + + + + + + + Mirrored geometry + 8819056c-162d-40f9-a9d9-ee6a27452e63 + Geometry + Geometry + false + 0 + + + + + + 1749 + 321 + 50 + 20 + + + 1774 + 331 + + + + + + + + Transformation data + 1379e426-0cee-4599-843b-b79de4f9d8aa + Transform + Transform + false + 0 + + + + + + 1749 + 341 + 50 + 20 + + + 1774 + 351 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 9128e5ae-cbd8-4175-b785-5c24bc75bdc8 + Relay + + false + 3910b2ce-825d-4581-ba63-0d4761cdc4e4 + 1 + + + + + + 1927 + 152 + 40 + 16 + + + 1947 + 160 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + daeee5b5-7139-45f8-823e-7a3077f6f1d2 + Relay + + false + d97ee3a1-106d-4979-9f94-3443ed748b4a + 1 + + + + + + 1940 + 240 + 40 + 16 + + + 1960 + 248 + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 158ea5f7-2e21-4ab7-9cd9-399feeab65b7 + Evaluate Length + Evaluate Length + + + + + + 1546 + 397 + 132 + 64 + + + 1614 + 429 + + + + + + Curve to evaluate + 5510b295-8fb3-45e0-99f2-ad71b5afd133 + Curve + Curve + false + 8819056c-162d-40f9-a9d9-ee6a27452e63 + 1 + + + + + + 1548 + 399 + 54 + 20 + + + 1575 + 409 + + + + + + + + Length factor for curve evaluation + ee69b266-5919-4c2c-96a6-4108d679ece5 + Length + Length + false + 0 + + + + + + 1548 + 419 + 54 + 20 + + + 1575 + 429 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 62c84e02-571d-4091-b864-b4934e4c6f5c + Normalized + Normalized + false + 0 + + + + + + 1548 + 439 + 54 + 20 + + + 1575 + 449 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + 57e93cb5-fbd5-4f9a-a850-9e7cd3753ad4 + Point + Point + false + 0 + + + + + + 1626 + 399 + 50 + 20 + + + 1651 + 409 + + + + + + + + Tangent vector at the specified length + 81eaaf50-2869-443b-8154-69d92a7b1237 + Tangent + Tangent + false + 0 + + + + + + 1626 + 419 + 50 + 20 + + + 1651 + 429 + + + + + + + + Curve parameter at the specified length + 20f5892b-fd5d-4b37-8f37-7f3be7c0a043 + Parameter + Parameter + false + 0 + + + + + + 1626 + 439 + 50 + 20 + + + 1651 + 449 + + + + + + + + + + + + b7798b74-037e-4f0c-8ac7-dc1043d093e0 + Rotate + + + + + Rotate an object in a plane. + true + 31c0ff4b-b459-4cda-8b90-eb863d9e1447 + Rotate + Rotate + + + + + + 1565 + 473 + 126 + 64 + + + 1627 + 505 + + + + + + Base geometry + cb888253-f048-4ef3-b393-57feaeabce39 + Geometry + Geometry + true + 8819056c-162d-40f9-a9d9-ee6a27452e63 + 1 + + + + + + 1567 + 475 + 48 + 20 + + + 1591 + 485 + + + + + + + + Rotation angle in radians + d317aa18-3196-400a-b512-24833ecc67f1 + Angle + Angle + false + 0 + false + + + + + + 1567 + 495 + 48 + 20 + + + 1591 + 505 + + + + + + 1 + + + + + 1 + {0} + + + + + 3.1415926535897931 + + + + + + + + + + + Rotation plane + c182743a-ac43-4714-b4dd-3f9561deacb1 + Plane + Plane + false + 57e93cb5-fbd5-4f9a-a850-9e7cd3753ad4 + 1 + + + + + + 1567 + 515 + 48 + 20 + + + 1591 + 525 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + Rotated geometry + f34a5f32-1279-45da-9153-aac6da750806 + Geometry + Geometry + false + 0 + + + + + + 1639 + 475 + 50 + 30 + + + 1664 + 490 + + + + + + + + Transformation data + 4104fd19-0c1d-4a67-8dfa-8713f85f6182 + Transform + Transform + false + 0 + + + + + + 1639 + 505 + 50 + 30 + + + 1664 + 520 + + + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + 91273030-6075-498c-bb33-a0dbf126ec1e + Join Curves + Join Curves + + + + + + 1723 + 391 + 106 + 44 + + + 1780 + 413 + + + + + + 1 + Curves to join + 94f8852e-e7b4-451d-bda6-eecd47d979f8 + Curves + Curves + false + 8819056c-162d-40f9-a9d9-ee6a27452e63 + f34a5f32-1279-45da-9153-aac6da750806 + 2 + + + + + + 1725 + 393 + 43 + 20 + + + 1746.5 + 403 + + + + + + + + Preserve direction of input curves + c71abe07-5940-4e75-9bc4-d1ab3aef8997 + Preserve + Preserve + false + 0 + + + + + + 1725 + 413 + 43 + 20 + + + 1746.5 + 423 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + ad1f6230-8167-472c-a692-ac116140f066 + Curves + Curves + false + 0 + + + + + + 1792 + 393 + 35 + 40 + + + 1809.5 + 413 + + + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 3d2c8c61-81b0-47b5-b5eb-1fa939cd67b2 + Evaluate Length + Evaluate Length + + + + + + 1722 + 461 + 132 + 64 + + + 1790 + 493 + + + + + + Curve to evaluate + 08d2309b-46be-4e35-a9b7-48eec1741a93 + Curve + Curve + false + ad1f6230-8167-472c-a692-ac116140f066 + 1 + + + + + + 1724 + 463 + 54 + 20 + + + 1751 + 473 + + + + + + + + Length factor for curve evaluation + 976c092b-6ba8-421d-a6f5-52451ce4eb54 + Length + Length + false + 0 + + + + + + 1724 + 483 + 54 + 20 + + + 1751 + 493 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 0ea0bd86-f332-4543-82b8-ab984c994ca7 + Normalized + Normalized + false + 0 + + + + + + 1724 + 503 + 54 + 20 + + + 1751 + 513 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + d3acfa6c-57e2-407a-812b-6a146194b90d + Point + Point + false + 0 + + + + + + 1802 + 463 + 50 + 20 + + + 1827 + 473 + + + + + + + + Tangent vector at the specified length + 40cebb1e-ba2f-4321-8c6e-f1430224e12a + Tangent + Tangent + false + 0 + + + + + + 1802 + 483 + 50 + 20 + + + 1827 + 493 + + + + + + + + Curve parameter at the specified length + 7c16449c-a1e0-4044-97d0-c309b0e42b3c + Parameter + Parameter + false + 0 + + + + + + 1802 + 503 + 50 + 20 + + + 1827 + 513 + + + + + + + + + + + + f12daa2f-4fd5-48c1-8ac3-5dea476912ca + Mirror + + + + + Mirror an object. + true + 5620f828-861f-4d94-a918-8b4846cb2e1b + Mirror + Mirror + + + + + + 1874 + 329 + 126 + 44 + + + 1936 + 351 + + + + + + Base geometry + 284974e7-46b5-4abc-9698-4aa4aa31683c + Geometry + Geometry + true + ad1f6230-8167-472c-a692-ac116140f066 + 1 + + + + + + 1876 + 331 + 48 + 20 + + + 1900 + 341 + + + + + + + + Mirror plane + 32269fb1-5495-43f7-a189-c53f033c8858 + Plane + Plane + false + aef258f0-7010-4305-9231-ed26f7a5ca4e + 1 + + + + + + 1876 + 351 + 48 + 20 + + + 1900 + 361 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + + + + + + + + + + Mirrored geometry + 0c23697a-8b9a-48d6-861a-4f0e163b3067 + Geometry + Geometry + false + 0 + + + + + + 1948 + 331 + 50 + 20 + + + 1973 + 341 + + + + + + + + Transformation data + 31e189fd-7833-4faf-82f0-aaf16828de2c + Transform + Transform + false + 0 + + + + + + 1948 + 351 + 50 + 20 + + + 1973 + 361 + + + + + + + + + + + + fad344bc-09b1-4855-a2e6-437ef5715fe3 + YZ Plane + + + + + World YZ plane. + true + dad07a8f-5ec9-4e43-b497-4bdcaea09b3f + YZ Plane + YZ Plane + + + + + + 1753 + 547 + 86 + 28 + + + 1797 + 561 + + + + + + Origin of plane + 7cc92c1f-1e23-4e0c-8752-01c5ebc671d9 + Origin + Origin + false + d3acfa6c-57e2-407a-812b-6a146194b90d + 1 + + + + + + 1755 + 549 + 30 + 24 + + + 1770 + 561 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + World YZ plane + aef258f0-7010-4305-9231-ed26f7a5ca4e + Plane + Plane + false + 0 + + + + + + 1809 + 549 + 28 + 24 + + + 1823 + 561 + + + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + 8549ba81-3ed7-45f2-994f-cf12b6947545 + Join Curves + Join Curves + + + + + + 1854 + 268 + 106 + 44 + + + 1911 + 290 + + + + + + 1 + Curves to join + ce7aa9ac-8c4b-4465-8cc1-c61cdacc76c8 + Curves + Curves + false + ad1f6230-8167-472c-a692-ac116140f066 + 0c23697a-8b9a-48d6-861a-4f0e163b3067 + 2 + + + + + + 1856 + 270 + 43 + 20 + + + 1877.5 + 280 + + + + + + + + Preserve direction of input curves + fe16bd92-a738-4610-bc2a-963fa62f06d8 + Preserve + Preserve + false + 0 + + + + + + 1856 + 290 + 43 + 20 + + + 1877.5 + 300 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + d97ee3a1-106d-4979-9f94-3443ed748b4a + Curves + Curves + false + 0 + + + + + + 1923 + 270 + 35 + 40 + + + 1940.5 + 290 + + + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + true + df0418dd-a55b-486c-ae4e-503d8eecb9d9 + Curve + Curve + false + daeee5b5-7139-45f8-823e-7a3077f6f1d2 + 1 + + + + + + 2017 + 270 + 50 + 24 + + + 2042.867 + 282.2641 + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + true + cbf9f624-2889-4204-a15c-684de1a8f909 + Curve + Curve + false + 9128e5ae-cbd8-4175-b785-5c24bc75bdc8 + 1 + + + + + + 1994 + 122 + 50 + 24 + + + 2019.229 + 134.756 + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + fbe5705e-f40b-400f-be34-a6f8a3d5193e + Join Curves + Join Curves + + + + + + 1874 + 288 + 106 + 44 + + + 1931 + 310 + + + + + + 1 + Curves to join + b67f8f04-7e14-4168-9c72-1ca42132f794 + Curves + Curves + false + ad1f6230-8167-472c-a692-ac116140f066 + 0c23697a-8b9a-48d6-861a-4f0e163b3067 + 2 + + + + + + 1876 + 290 + 43 + 20 + + + 1897.5 + 300 + + + + + + + + Preserve direction of input curves + 31393064-763a-4251-b762-395582f202e6 + Preserve + Preserve + false + 0 + + + + + + 1876 + 310 + 43 + 20 + + + 1897.5 + 320 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + b24c2f48-f2f9-4706-81a1-be033f700737 + Curves + Curves + false + 0 + + + + + + 1943 + 290 + 35 + 40 + + + 1960.5 + 310 + + + + + + + + + + + + 2b69bf71-4e69-43aa-b7be-4f6ce7e45bef + Quick Graph + + + + + 1 + Display a set of y-values as a graph + bc5e130c-54f1-4c04-81bb-4d92302ecb8d + Quick Graph + Quick Graph + false + 0 + e1059b3d-dbbd-4de7-9d6a-bd28ca6f88a7 + 1 + + + + + + 2032 + 365 + 150 + 150 + + + 2032.449 + 365.2196 + + -1 + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + true + c9c2f2b5-da7f-4019-92fd-92c4735b71d5 + Curve + Curve + false + a4db035a-a834-48b6-a951-08f0da775207 + 1 + + + + + + 2249 + 581 + 50 + 24 + + + 2274.459 + 593.863 + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + true + 9be7f0ca-0536-4ac3-9443-57702e190b2a + Curve + Curve + false + 379a3424-e130-4321-8792-bddd2920cd65 + 1 + + + + + + 2216 + 657 + 50 + 24 + + + 2241.101 + 669.9352 + + + + + + + + + + f12daa2f-4fd5-48c1-8ac3-5dea476912ca + Mirror + + + + + Mirror an object. + true + 7d01e58d-8a54-4ae4-a9b6-7ab06f1e2d1c + Mirror + Mirror + + + + + + 2293 + 650 + 126 + 44 + + + 2355 + 672 + + + + + + Base geometry + 17d1d407-3a21-4b09-a617-d9801ef30b7f + Geometry + Geometry + true + 9be7f0ca-0536-4ac3-9443-57702e190b2a + 1 + + + + + + 2295 + 652 + 48 + 20 + + + 2319 + 662 + + + + + + + + Mirror plane + d3cdf2a5-d9da-4b8c-83c5-5a98280a79a9 + Plane + Plane + false + 0 + + + + + + 2295 + 672 + 48 + 20 + + + 2319 + 682 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + + + + + + + + + + Mirrored geometry + 2cb202b3-0c04-4689-b060-c0262920972e + Geometry + Geometry + false + 0 + + + + + + 2367 + 652 + 50 + 20 + + + 2392 + 662 + + + + + + + + Transformation data + c86e32d1-3919-465c-b583-3e1b693a9d4d + Transform + Transform + false + 0 + + + + + + 2367 + 672 + 50 + 20 + + + 2392 + 682 + + + + + + + + + + + + 4d2a06bd-4b0f-4c65-9ee0-4220e4c01703 + Scale + + + + + Scale an object uniformly in all directions. + true + 94fb524e-94b2-4634-8c18-46c169e9b368 + Scale + Scale + + + + + + 2550 + 632 + 126 + 64 + + + 2612 + 664 + + + + + + Base geometry + ac4ed61e-526e-44fc-b2a9-5b20284488d9 + Geometry + Geometry + true + 809779a6-b26b-4d70-bfcd-b7a899aeb48f + 1 + + + + + + 2552 + 634 + 48 + 20 + + + 2576 + 644 + + + + + + + + Center of scaling + 05743bfe-326e-47f8-9002-e6c022240175 + Center + Center + false + 0 + + + + + + 2552 + 654 + 48 + 20 + + + 2576 + 664 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + Scaling factor + 3307b6e3-1c83-4f43-8544-66c303d485aa + Factor + Factor + false + 4e8a50ea-22b0-4939-80dc-45b497a32eab + 1 + + + + + + 2552 + 674 + 48 + 20 + + + 2576 + 684 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.5 + + + + + + + + + + + Scaled geometry + c9dcbe00-45c0-4fe7-a486-d2ce9715f868 + Geometry + Geometry + false + 0 + + + + + + 2624 + 634 + 50 + 30 + + + 2649 + 649 + + + + + + + + Transformation data + 91f714e7-2082-4acb-b073-055162c4f4da + Transform + Transform + false + 0 + + + + + + 2624 + 664 + 50 + 30 + + + 2649 + 679 + + + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + 007c0597-08be-4501-a9ff-305dd497d52d + Join Curves + Join Curves + + + + + + 2421 + 539 + 106 + 44 + + + 2478 + 561 + + + + + + 1 + Curves to join + efb808e7-362e-4e2e-a590-aab781acc664 + Curves + Curves + false + c9c2f2b5-da7f-4019-92fd-92c4735b71d5 + 2cb202b3-0c04-4689-b060-c0262920972e + 2690fc68-80e3-45ed-ba28-a73d0acf282d + 3 + + + + + + 2423 + 541 + 43 + 20 + + + 2444.5 + 551 + + + + + + + + Preserve direction of input curves + b149447e-b95c-4926-9ed4-6c054a4ad5c6 + Preserve + Preserve + false + 0 + + + + + + 2423 + 561 + 43 + 20 + + + 2444.5 + 571 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + 809779a6-b26b-4d70-bfcd-b7a899aeb48f + Curves + Curves + false + 0 + + + + + + 2490 + 541 + 35 + 40 + + + 2507.5 + 561 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + afc911a9-b572-4d05-b576-201cb0b133cb + Relay + + false + 0e5c88e5-c9b5-4ca4-8171-2b24be76b2d7 + 1 + + + + + + 954 + 378 + 40 + 16 + + + 974 + 386 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 925090fd-6bda-42c5-a188-e3df2f2b78d6 + Relay + + false + 0e5c88e5-c9b5-4ca4-8171-2b24be76b2d7 + 1 + + + + + + 2333 + 757 + 40 + 16 + + + 2353 + 765 + + + + + + + + + + ce46b74e-00c9-43c4-805a-193b69ea4a11 + Multiplication + + + + + Mathematical multiplication + true + 19b0ef7f-1603-43f5-9ee4-ca186263610d + Multiplication + Multiplication + + + + + + 2410 + 744 + 70 + 44 + + + 2435 + 766 + + + + + + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + First item for multiplication + cdfdf008-c520-4081-9620-890a26d2b1bc + A + A + true + 925090fd-6bda-42c5-a188-e3df2f2b78d6 + 1 + + + + + + 2412 + 746 + 11 + 20 + + + 2417.5 + 756 + + + + + + + + Second item for multiplication + bb6a3815-9e09-4b1e-aaa5-5ab6d89792e9 + B + B + true + 0 + + + + + + 2412 + 766 + 11 + 20 + + + 2417.5 + 776 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Integer + 4 + + + + + + + + + + + Result of multiplication + 4e8a50ea-22b0-4939-80dc-45b497a32eab + Result + Result + false + 0 + + + + + + 2447 + 746 + 31 + 40 + + + 2462.5 + 766 + + + + + + + + + + + + + + e9eb1dcf-92f6-4d4d-84ae-96222d60f56b + Move + + + + + Translate (move) an object along a vector. + true + d499b50a-c53c-49f9-9d01-5b56e75a4bbd + Move + Move + + + + + + 2728 + 687 + 126 + 44 + + + 2790 + 709 + + + + + + Base geometry + 64d21ff8-2044-4e3b-8908-4ef94124d62c + Geometry + Geometry + true + c9dcbe00-45c0-4fe7-a486-d2ce9715f868 + 1 + + + + + + 2730 + 689 + 48 + 20 + + + 2754 + 699 + + + + + + + + Translation vector + c90ac9c9-3874-4614-bf46-11fc8130f210 + Motion + Motion + false + e9836bbc-725d-43e4-995c-88750a096ed8 + 1 + + + + + + 2730 + 709 + 48 + 20 + + + 2754 + 719 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 10 + + + + + + + + + + + + Translated geometry + 56d0947c-ad68-4cfb-86d1-8fcf7a48e4ce + Geometry + Geometry + false + 0 + + + + + + 2802 + 689 + 50 + 20 + + + 2827 + 699 + + + + + + + + Transformation data + 649b5a1e-6cd1-4543-b0c1-4ec600d272e4 + Transform + Transform + false + 0 + + + + + + 2802 + 709 + 50 + 20 + + + 2827 + 719 + + + + + + + + + + + + 56b92eab-d121-43f7-94d3-6cd8f0ddead8 + Vector XYZ + + + + + Create a vector from {xyz} components. + true + 62796c89-f427-4b0f-8aba-bb5ef7101ed1 + Vector XYZ + Vector XYZ + + + + + + 2534 + 764 + 127 + 64 + + + 2613 + 796 + + + + + + Vector {x} component + c20181ab-31a4-4123-9605-9add7bc12152 + X component + X component + false + 0 + + + + + + 2536 + 766 + 65 + 20 + + + 2568.5 + 776 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector {y} component + b9ad5853-4918-4dbf-a9ff-34cc13797115 + Y component + Y component + false + 8b4140c8-1224-4101-94a9-fae63182a9ae + 1 + + + + + + 2536 + 786 + 65 + 20 + + + 2568.5 + 796 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector {z} component + 7d1408d5-06d8-44cd-987e-88bb20447a66 + Z component + Z component + false + 0 + + + + + + 2536 + 806 + 65 + 20 + + + 2568.5 + 816 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector construct + e9836bbc-725d-43e4-995c-88750a096ed8 + Vector + Vector + false + 0 + + + + + + 2625 + 766 + 34 + 30 + + + 2642 + 781 + + + + + + + + Vector length + 47530c73-29b3-4ac8-95d8-980308a8d808 + Length + Length + false + 0 + + + + + + 2625 + 796 + 34 + 30 + + + 2642 + 811 + + + + + + + + + + + + a3371040-e552-4bc8-b0ff-10a840258e88 + Negative + + + + + Compute the negative of a value. + true + 7729c066-169e-4154-a09e-6bf484a1ec9a + Negative + Negative + + + + + + 2414 + 830 + 88 + 28 + + + 2457 + 844 + + + + + + Input value + 1dafb6fb-718b-4fc9-b7ba-a90b5652fbb7 + Value + Value + false + 798aeadd-978c-45e4-8c94-72f0051b4754 + 1 + + + + + + 2416 + 832 + 29 + 24 + + + 2430.5 + 844 + + + + + + + + Output value + 689d1d65-22a2-4661-96a9-fd62a95298a3 + Result + Result + false + 0 + + + + + + 2469 + 832 + 31 + 24 + + + 2484.5 + 844 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + d2805e3d-0af8-46a9-9b8d-435dcee01b14 + Relay + + false + 56d0947c-ad68-4cfb-86d1-8fcf7a48e4ce + 1 + + + + + + 2620 + 480 + 40 + 16 + + + 2640 + 488 + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + f6fb8d8c-5ae8-445b-9af0-a6460ebc9cf5 + Curve + Curve + false + d2805e3d-0af8-46a9-9b8d-435dcee01b14 + 1 + + + + + + 2708 + 450 + 50 + 24 + + + 2733.128 + 462.3543 + + + + + + + + + + 3cadddef-1e2b-4c09-9390-0e8f78f7609f + Merge + + + + + Merge a bunch of data streams + fdce27e9-9fb5-40a4-8982-966ac16712e5 + Merge + Merge + + + + + + 2204 + 206 + 75 + 84 + + + 2234 + 248 + + + + + + 4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 2 + Data stream 1 + 45e1e0f3-e8d8-4a54-afbd-010a9bae52dd + false + Data 1 + D1 + true + cbf9f624-2889-4204-a15c-684de1a8f909 + 1 + + + + + + 2206 + 208 + 16 + 20 + + + 2214 + 218 + + + + + + + + 2 + Data stream 2 + 9d7f5dc9-4b6c-44ac-8475-32d4b894ea03 + false + Data 2 + D2 + true + df0418dd-a55b-486c-ae4e-503d8eecb9d9 + 1 + + + + + + 2206 + 228 + 16 + 20 + + + 2214 + 238 + + + + + + + + 2 + Data stream 3 + 1c052ee6-bb60-402d-b5c1-cd322713adce + false + Data 3 + D3 + true + 1c315543-a675-4e2e-bf6c-0699d34576cd + 1 + + + + + + 2206 + 248 + 16 + 20 + + + 2214 + 258 + + + + + + + + 2 + Data stream 4 + 57c9f55e-f939-4b7d-9b49-b754231ff8ab + false + Data 4 + D4 + true + 0 + + + + + + 2206 + 268 + 16 + 20 + + + 2214 + 278 + + + + + + + + 2 + Result of merge + f6b4926e-e21e-4172-8955-63568a7bca58 + Result + Result + false + 0 + + + + + + 2246 + 208 + 31 + 80 + + + 2261.5 + 248 + + + + + + + + + + + + + + 7376fe41-74ec-497e-b367-1ffe5072608b + Curvature Graph + + + + + Draws Rhino Curvature Graphs. + 1a228e5c-f086-4ddc-a8fb-57d064579fa4 + Curvature Graph + Curvature Graph + + + + + + 2766 + 280 + 65 + 64 + + + 2817 + 312 + + + + + + Curve for Curvature graph display + true + 49509b30-1b7a-4cc4-aa52-1fee8f857b9b + Curve + Curve + false + f6fb8d8c-5ae8-445b-9af0-a6460ebc9cf5 + 1 + + + + + + 2768 + 282 + 37 + 20 + + + 2786.5 + 292 + + + + + + + + Sampling density of the Graph + 96f0b975-d527-4bda-b77d-d0c1fa5546cd + Density + Density + false + 0 + + + + + + 2768 + 302 + 37 + 20 + + + 2786.5 + 312 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + Scale of graph + 956cbc42-1bb9-42ef-914c-7c1628d6ba77 + Scale + Scale + false + bb18bf88-1def-4c7b-bd6d-58ed6f898c06 + 1 + + + + + + 2768 + 322 + 37 + 20 + + + 2786.5 + 332 + + + + + + 1 + + + + + 1 + {0} + + + + + 105 + + + + + + + + + + + + + + + ce46b74e-00c9-43c4-805a-193b69ea4a11 + Multiplication + + + + + Mathematical multiplication + true + de04c0f2-702f-4a22-ae2a-1d79429531be + Multiplication + Multiplication + + + + + + 2455 + 881 + 70 + 44 + + + 2480 + 903 + + + + + + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + First item for multiplication + 66c1bee3-0c45-48e1-8042-f8fbe1b5f81c + A + A + true + 689d1d65-22a2-4661-96a9-fd62a95298a3 + 1 + + + + + + 2457 + 883 + 11 + 20 + + + 2462.5 + 893 + + + + + + + + Second item for multiplication + b7468600-8a20-4edd-92fd-7dc28cfa8cd8 + B + B + true + 0 + + + + + + 2457 + 903 + 11 + 20 + + + 2462.5 + 913 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Number + 1.25 + + + + + + + + + + + Result of multiplication + 8b4140c8-1224-4101-94a9-fae63182a9ae + Result + Result + false + 0 + + + + + + 2492 + 883 + 31 + 40 + + + 2507.5 + 903 + + + + + + + + + + + + + + 33bcf975-a0b2-4b54-99fd-585c893b9e88 + Digit Scroller + + + + + Numeric scroller for single numbers + bb18bf88-1def-4c7b-bd6d-58ed6f898c06 + Digit Scroller + Digit Scroller + false + 0 + + + + + 12 + Digit Scroller + 3 + + 112.000000000 + + + + + + 2493 + 382 + 250 + 20 + + + 2493.76 + 382.3707 + + + + + + + + + + 079bd9bd-54a0-41d4-98af-db999015f63d + VB Script + + + + + Private Function IsSet(ByVal param As String) As Boolean ' Check if an input parameter has data + Dim i As Integer = Component.Params.IndexOfInputParam(param) + If i > -1 Then + Return Component.Params.Input.ElementAt(i).DataType > 1 ' input parameter DataType of 1 means it's not receiving input (internal or external) + Else + Msg("error", "Input parameter '" & param & "' not found") + Return False + End If + End Function + + Private Sub Msg(ByVal type As String, ByVal msg As String) ' Output an error, warning, or informational message + Select Case type + Case "error" + Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, msg) + Print("Error: " & msg) + Case "warning" + Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, msg) + Print("Warning: " & msg) + Case "info" + Component.AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, msg) + Print(msg) + End Select + End Sub + + ' Solve for the m parameter from length and width (reference {1} equation (34), except b = width and K(k) and E(k) should be K(m) and E(m)) + Private Function SolveMFromLenWid(ByVal L As Double, ByVal w As Double) As Double + If w = 0 Then + Return Defined.M_ZERO_W ' for the boundry condition width = 0, bypass the function and return the known m value + End If + + Dim n As Integer = 1 ' Iteration counter (quit if >MAXIT) + Dim lower As Double = 0 ' m must be within this range + Dim upper As Double = 1 + Dim m As Double + Dim cwl As Double + + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + cwl = 2 * EllipticE(m) / EllipticK(m) - 1 ' calculate w/L with the test value of m + If cwl < w / L Then ' compares the calculated w/L with the actual w/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + Return m + End Function + + ' Solve for the m parameter from length and height (reference {1} equation (33), except K(k) should be K(m) and k = sqrt(m)) + ' Note that it's actually possible to find 2 valid values for m (hence 2 width values) at certain height values + Private Function SolveMFromLenHt(ByVal L As Double, ByVal h As Double) As List(Of Double) + Dim n As Integer = 1 ' Iteration counter (quit if >MAXIT) + Dim lower As Double = 0 ' m must be within this range + Dim upper As Double = 1 + Dim twoWidths As Boolean = h / L >= Defined.DOUBLE_W_HL_RATIO And h / L < Defined.MAX_HL_RATIO ' check to see if h/L is within the range where 2 solutions for the width are possible + Dim m As Double + Dim mult_m As New List(Of Double) + Dim chl As Double + + If twoWidths Then + ' find the first of two possible solutions for m with the following limits: + lower = Defined.M_DOUBLE_W ' see constants at bottom of script + upper = Defined.M_MAXHEIGHT ' see constants at bottom of script + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + chl = Math.Sqrt(m) / EllipticK(m) ' calculate h/L with the test value of m + If chl > h / L Then ' compares the calculated h/L with the actual h/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + mult_m.Add(m) + + ' then find the second of two possible solutions for m with the following limits: + lower = Defined.M_MAXHEIGHT ' see constants at bottom of script + upper = 1 + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + chl = Math.Sqrt(m) / EllipticK(m) ' calculate h/L with the test value of m + If chl < h / L Then ' compares the calculated h/L with the actual h/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + + If m <= Defined.M_MAX Then ' return this m parameter only if it falls within the maximum useful value (above which the curve breaks down) + mult_m.Add(m) + End If + + Else + ' find the one possible solution for the m parameter + upper = Defined.M_DOUBLE_W ' limit the upper end of the search to the maximum value of m for which only one solution exists + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + chl = Math.Sqrt(m) / EllipticK(m) ' calculate h/L with the test value of m + If chl > h / L Then ' compares the calculated h/L with the actual h/L then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + mult_m.Add(m) + End If + + Return mult_m + End Function + + ' Solve for the m parameter from width and height (derived from reference {1} equations (33) and (34) with same notes as above) + Private Function SolveMFromWidHt(ByVal w As Double, ByVal h As Double) As Double + Dim n As Integer = 1 ' Iteration counter (quit if >MAXIT) + Dim lower As Double = 0 ' m must be within this range + Dim upper As Double = 1 + Dim m As Double + Dim cwh As Double + + Do While (upper - lower) > Defined.MAXERR AndAlso (n) < Defined.MAXIT ' Repeat until range narrow enough or MAXIT + m = (upper + lower) / 2 + cwh = (2 * EllipticE(m) - EllipticK(m)) / Math.Sqrt(m) ' calculate w/h with the test value of m + If cwh < w / h Then ' compares the calculated w/h with the actual w/h then narrows the range of possible m + upper = m + Else + lower = m + End If + n += 1 + Loop + + Return m + End Function + + ' Calculate length based on height and an m parameter, derived from reference {1} equation (33), except K(k) should be K(m) and k = sqrt(m) + Private Function Cal_L(ByVal h As Double, ByVal m As Double) As Double + Return h * EllipticK(m) / Math.Sqrt(m) + End Function + + ' Calculate width based on length and an m parameter, derived from reference {1} equation (34), except b = width and K(k) and E(k) should be K(m) and E(m) + Private Function Cal_W(ByVal L As Double, ByVal m As Double) As Double + Return L * (2 * EllipticE(m) / EllipticK(m) - 1) + End Function + + ' Calculate height based on length and an m parameter, from reference {1} equation (33), except K(k) should be K(m) and k = sqrt(m) + Private Function Cal_H(ByVal L As Double, ByVal m As Double) As Double + Return L * Math.Sqrt(m) / EllipticK(m) + End Function + + ' Calculate the unique m parameter based on a start tangent angle, from reference {2}, just above equation (9a), that states k = Sin(angle / 2 + Pi / 4), + ' but as m = k^2 and due to this script's need for an angle rotated 90° versus the one in reference {1}, the following formula is the result + ' New note: verified by reference {4}, pg. 78 at the bottom + Private Function Cal_M(ByVal a As Double) As Double + Return (1 - Math.Cos(a)) / 2 ' equal to Sin^2(a/2) too + End Function + + ' Calculate start tangent angle based on an m parameter, derived from above formula + Private Function Cal_A(ByVal m As Double) As Double + Return Math.Acos(1 - 2 * m) + End Function + + ' This is the heart of this script, taking the found (or specified) length, width, and angle values along with the found m parameter to create + ' a list of points that approximate the shape or form of the elastica. It works by finding the x and y coordinates (which are reversed versus + ' the original equations (12a) and (12b) from reference {2} due to the 90° difference in orientation) based on the tangent angle along the curve. + ' See reference {2} for more details on how they derived it. Note that to simplify things, the algorithm only calculates the points for half of the + ' curve, then mirrors those points along the y-axis. + Private Function FindBendForm(ByVal L As Double, ByVal w As Double, ByVal m As Double, ByVal ang As Double, ByVal refPln As Plane) As List(Of Point3d) + L = L / 2 ' because the below algorithm is based on the formulas in reference {2} for only half of the curve + w = w / 2 ' same + + If ang = 0 Then ' if angle (and height) = 0, then simply return the start and end points of the straight line + Dim out As New List(Of Point3d) + out.Add(refPln.PointAt(w, 0, 0)) + out.Add(refPln.PointAt(-w, 0, 0)) + Return out + End If + + Dim x As Double + Dim y As Double + Dim halfCurvePts As New List(Of Point3d) + Dim fullCurvePts As New List(Of Point3d) + Dim translatedPts As New List(Of Point3d) + + ang -= Math.PI / 2 ' a hack to allow this algorithm to work, since the original curve in paper {2} was rotated 90° + Dim angB As Double = ang + (-Math.PI / 2 - ang) / Defined.CURVEDIVS ' angB is the 'lowercase theta' which should be in formula {2}(12b) as the interval + ' start [a typo...see equation(3)]. It's necessary to start angB at ang + [interval] instead of just ang due to integration failing at angB = ang + halfCurvePts.Add(New Point3d(w, 0, 0)) ' start with this known initial point, as integration will fail when angB = ang + + ' each point {x, y} is calculated from the tangent angle, angB, that occurs at each point (which is why this iterates from ~ang to -pi/2, the known end condition) + Do While Math.Round(angB, Defined.ROUNDTO) >= Math.Round(-Math.PI / 2, Defined.ROUNDTO) + y = (Math.Sqrt(2) * Math.Sqrt(Math.Sin(ang) - Math.Sin(angB)) * (w + L)) / (2 * EllipticE(m)) ' note that x and y are swapped vs. (12a) and (12b) + x = (L / (Math.Sqrt(2) * EllipticK(m))) * Simpson(angB, -Math.PI / 2, 500, ang) ' calculate the Simpson approximation of the integral (function f below) + ' over the interval angB ('lowercase theta') to -pi/2. side note: is 500 too few iterations for the Simson algorithm? + + If Math.Round(x, Defined.ROUNDTO) = 0 Then x = 0 + halfCurvePts.Add(New Point3d(x, y, 0)) + + angB += (-Math.PI / 2 - ang) / Defined.CURVEDIVS ' onto the next tangent angle + Loop + + ' After finding the x and y values for half of the curve, add the {-x, y} values for the rest of the curve + For Each point As Point3d In halfCurvePts + If Math.Round(point.X, Defined.ROUNDTO) = 0 Then + If Math.Round(point.Y, Defined.ROUNDTO) = 0 Then + fullCurvePts.Add(New Point3d(0, 0, 0)) ' special case when width = 0: when x = 0, only duplicate the point when y = 0 too + End If + Else + fullCurvePts.Add(New Point3d(-point.X, point.Y, 0)) + End If + Next + halfCurvePts.Reverse + fullCurvePts.AddRange(halfCurvePts) + + For Each p As Point3d In fullCurvePts + translatedPts.Add(refPln.PointAt(p.X, p.Y, p.Z)) ' translate the points from the reference plane to the world plane + Next + + Return translatedPts + End Function + + ' Interpolates the points from FindBendForm to create the Elastica curve. Uses start & end tangents for greater accuracy. + Private Function MakeCurve(ByVal pts As List(Of Point3d), ByVal ang As Double, ByVal refPln As Plane) As Curve + If ang <> 0 Then + Dim ts, te As New Vector3d(refPln.XAxis) + ts.Rotate(ang, refPln.ZAxis) + te.Rotate(-ang, refPln.ZAxis) + Return Curve.CreateInterpolatedCurve(pts, 3, CurveKnotStyle.Chord, ts, te) ' 3rd degree curve with 'Chord' Knot Style + Else + Return Curve.CreateInterpolatedCurve(pts, 3) ' if angle (and height) = 0, then simply interpolate the straight line (no start/end tangents) + End If + End Function + + ' Implements the Simpson approximation for an integral of function f below + Public Function Simpson(a As Double, b As Double, n As Integer, theta As Double) As Double 'n should be an even number + Dim j As Integer, s1 As Double, s2 As Double, h As Double + h = (b - a) / n + s1 = 0 + s2 = 0 + For j = 1 To n - 1 Step 2 + s1 = s1 + fn(a + j * h, theta) + Next j + For j = 2 To n - 2 Step 2 + s2 = s2 + fn(a + j * h, theta) + Next j + Simpson = h / 3 * (fn(a, theta) + 4 * s1 + 2 * s2 + fn(b, theta)) + End Function + + ' Specific calculation for the above integration + Public Function fn(x As Double, theta As Double) As Double + fn = Math.Sin(x) / (Math.Sqrt(Math.Sin(theta) - Math.Sin(x))) ' from reference {2} formula (12b) + End Function + + + ' Return the Complete Elliptic integral of the 1st kind + ' Abramowitz and Stegun p.591, formula 17.3.11 + ' Code from http://www.codeproject.com/Articles/566614/Elliptic-integrals + Public Function EllipticK(ByVal m As Double) As Double + Dim sum, term, above, below As Double + sum = 1 + term = 1 + above = 1 + below = 2 + + For i As Integer = 1 To 100 + term *= above / below + sum += Math.Pow(m, i) * Math.Pow(term, 2) + above += 2 + below += 2 + Next + sum *= 0.5 * Math.PI + Return sum + End Function + + + ' Return the Complete Elliptic integral of the 2nd kind + ' Abramowitz and Stegun p.591, formula 17.3.12 + ' Code from http://www.codeproject.com/Articles/566614/Elliptic-integrals + Public Function EllipticE(ByVal m As Double) As Double + Dim sum, term, above, below As Double + sum = 1 + term = 1 + above = 1 + below = 2 + + For i As Integer = 1 To 100 + term *= above / below + sum -= Math.Pow(m, i) * Math.Pow(term, 2) / above + above += 2 + below += 2 + Next + sum *= 0.5 * Math.PI + Return sum + End Function + + Friend Partial NotInheritable Class Defined + Private Sub New() + End Sub + + ' Note: most of these values for m and h/L ratio were found with Wolfram Alpha and either specific intercepts (x=0) or local minima/maxima. They should be constant. + Public Const M_SKETCHY As Double = 0.95 ' value of the m parameter where the curvature near the ends of the curve gets wonky + Public Const M_MAX As Double = 0.993 ' maximum useful value of the m parameter, above which this algorithm for the form of the curve breaks down + Public Const M_ZERO_W As Double = 0.826114765984970336 ' value of the m parameter when width = 0 + Public Const M_MAXHEIGHT As Double = 0.701327460663101223 ' value of the m parameter at maximum possible height of the bent rod/wire + Public Const M_DOUBLE_W As Double = 0.180254422335013983 ' minimum value of the m parameter when two width values are possible for a given height and length + Public Const DOUBLE_W_HL_RATIO As Double = 0.257342117984635757 ' value of the height/length ratio above which there are two possible width values + Public Const MAX_HL_RATIO As Double = 0.403140189705650243 ' maximum possible value of the height/length ratio + + Public Const MAXERR As Double = 0.0000000001 ' error tolerance + Public Const MAXIT As Integer = 100 ' maximum number of iterations + Public Const ROUNDTO As Integer = 10 ' number of decimal places to round off to + Public Const CURVEDIVS As Integer = 50 ' number of sample points for building the curve (or half-curve as it were) + End Class + A VB.NET scriptable component + + 98 + 86 + + true + b1551a80-522e-48bd-909f-f47901a99aa7 + VB Script + VB + true + 0 + ' ----------------------------------------------------------------- + ' Elastic Bending Script by Will McElwain + ' Created February 2014 + ' + ' DESCRIPTION: + ' This beast creates the so-called 'elastica curve', the shape a long, thin rod or wire makes when it is bent elastically (i.e. not permanently). In this case, force + ' is assumed to only be applied horizontally (which would be in line with the rod at rest) and both ends are assumed to be pinned or hinged meaning they are free + ' to rotate (as opposed to clamped, when the end tangent angle is fixed, usually horizontally). An interesting finding is that it doesn't matter what the material or + ' cross-sectional area is, as long as they're uniform along the entire length. Everything makes the same shape when bent as long as it doesn't cross the threshold + ' from elastic to plastic (permanent) deformation (I don't bother to find that limit here, but can be found if the yield stress for a material is known). + ' + ' Key to the formulas used in this script are elliptic integrals, specifically K(m), the complete elliptic integral of the first kind, and E(m), the complete elliptic + ' integral of the second kind. There was a lot of confusion over the 'm' and 'k' parameters for these functions, as some people use them interchangeably, but they are + ' not the same. m = k^2 (thus k = Sqrt(m)). I try to use the 'm' parameter exclusively to avoid this confusion. Note that there is a unique 'm' parameter for every + ' configuration/shape of the elastica curve. + ' + ' This script tries to find that unique 'm' parameter based on the inputs. The algorithm starts with a test version of m, evaluates an expression, say 2*E(m)/K(m)-1, + ' then compares the result to what it should be (in this case, a known width/length ratio). Iterate until the correct m is found. Once we have m, we can then calculate + ' all of the other unknowns, then find points that lie on that curve, then interpolate those points for the actual curve. You can also use Wolfram|Alpha as I did to + ' find the m parameter based on the equations in this script (example here: http://tiny.cc/t4tpbx for when say width=45.2 and length=67.1). + ' + ' Other notes: + ' * This script works with negative values for width, which will creat a self-intersecting curve (as it should). The curvature of the elastica starts to break down around + ' m=0.95 (~154°), but this script will continue to work until M_MAX, m=0.993 (~169°). If you wish to ignore self-intersecting curves, set ignoreSelfIntersecting to True + ' * When the only known values are length and height, it is actually possible for certain ratios of height to length to have two valid m values (thus 2 possible widths + ' and angles). This script will return them both. + ' * Only the first two valid parameters (of the required ones) will be used, meaning if all four are connected (length, width or a PtB, height, and angle), this script will + ' only use length and width (or a PtB). + ' * Depending on the magnitude of your inputs (say if they're really small, like if length < 10), you might have to increase the constant ROUNDTO at the bottom + ' + ' REFERENCES: + ' {1} "The elastic rod" by M.E. Pacheco Q. & E. Pina, http://www.scielo.org.mx/pdf/rmfe/v53n2/v53n2a8.pdf + ' {2} "An experiment in nonlinear beam theory" by A. Valiente, http://www.deepdyve.com/lp/doc/I3lwnxdfGz , also here: http://tiny.cc/Valiente_AEiNBT + ' {3} "Snap buckling, writhing and Loop formation In twisted rods" by V.G.A. GOSS, http://myweb.lsbu.ac.uk/~gossga/thesisFinal.pdf + ' {4} "Theory of Elastic Stability" by Stephen Timoshenko, http://www.scribd.com/doc/50402462/Timoshenko-Theory-of-Elastic-Stability (start on p. 76) + ' + ' INPUT: + ' PtA - First anchor point (required) + ' PtB - Second anchor point (optional, though 2 out of the 4--length, width, height, angle--need to be specified) + ' [note that PtB can be the same as PtA (meaning width would be zero)] + ' [also note that if a different width is additionally specified that's not equal to the distance between PtA and PtB, then the end point will not equal PtB anymore] + ' Pln - Plane of the bent rod/wire, which bends up in the +y direction. The line between PtA and PtB (if specified) must be parallel to the x-axis of this plane + ' + ' ** 2 of the following 4 need to be specified ** + ' Len - Length of the rod/wire, which needs to be > 0 + ' Wid - Width between the endpoints of the curve [note: if PtB is specified in addition, and distance between PtA and PtB <> width, the end point will be relocated + ' Ht - Height of the bent rod/wire (when negative, curve will bend downward, relative to the input plane, instead) + ' Ang - Inner departure angle or tangent angle (in radians) at the ends of the bent rod/wire. Set up so as width approaches length (thus height approaches zero), angle approaches zero + ' + ' * Following variables only needed for optional calculating of bending force, not for shape of curve. + ' E - Young's modulus (modulus of elasticity) in GPa (=N/m^2) (material-specific. for example, 7075 aluminum is roughly 71.7 GPa) + ' I - Second moment of area (or area moment of inertia) in m^4 (cross-section-specific. for example, a hollow rod + ' would have I = pi * (outer_diameter^4 - inner_diameter^4) / 32 + ' Note: E*I is also known as flexural rigidity or bending stiffness + ' + ' OUTPUT: + ' out - only for debugging messages + ' Pts - the list of points that approximate the shape of the elastica + ' Crv - the 3rd-degree curve interpolated from those points (with accurate start & end tangents) + ' L - the length of the rod/wire + ' W - the distance (width) between the endpoints of the rod/wire + ' H - the height of the bent rod/wire + ' A - the tangent angle at the (start) end of the rod/wire + ' F - the force needed to hold the rod/wire in a specific shape (based on the material properties & cross-section) **be sure your units for 'I' match your units for the + ' rest of your inputs (length, width, etc.). Also note that the critical buckling load (force) that makes the rod/wire start to bend can be found at height=0 + ' + ' THANKS TO: + ' Mårten Nettelbladt (thegeometryofbending.blogspot.com) + ' Daniel Piker (Kangaroo plugin) + ' David Rutten (Grasshopper guru) + ' Euler & Bernoulli (the O.G.'s) + ' + ' ----------------------------------------------------------------- + + Dim ignoreSelfIntersecting As Boolean = False ' set to True if you don't want to output curves where width < 0, which creates a self-intersecting curve + + Dim inCt As Integer = 0 ' count the number of required parameters that are receiving data + Dim length As Double + Dim width As System.Object = Nothing ' need to set as Nothing so we can check if it has been assigned a value later + Dim height As Double + Dim angle As Double + Dim m As Double + Dim multiple_m As New List(Of Double) + Dim AtoB As Line + Dim flip_H As Boolean = False ' if height is negative, this flag will be set + Dim flip_A As Boolean = False ' if angle is negative, this flag will be set + + If Not IsSet("Pln") Then + Msg("error", "Base plane is not set") + Return + End If + + If Not IsSet("PtA") Then + Msg("error", "Point A is not set") + Return + End If + + If Math.Round(Pln.DistanceTo(PtA), Defined.ROUNDTO) <> 0 Then + Msg("error", "Point A is not on the base plane") + Return + End If + + Dim refPlane As Plane = Pln ' create a reference plane = input plane and set the origin of it to PtA in case PtA isn't the origin already + refPlane.Origin = PtA + + If IsSet("PtB") Then + If Math.Round(Pln.DistanceTo(PtB), Defined.ROUNDTO) <> 0 Then + Msg("error", "Point B is not on the base plane") + Return + End If + + AtoB = New Line(PtA, PtB) + If AtoB.Length <> 0 And Not AtoB.Direction.IsPerpendicularTo(Pln.YAxis) Then + Msg("error", "The line between PtA and PtB is not perpendicular to the Y-axis of the specified plane") + Return + End If + + inCt += 1 + If IsSet("Wid") Then Msg("info", "Wid will override the distance between PtA and PtB. If you do not want this to happen, disconnect PtB or Wid.") + + width = PtA.DistanceTo(PtB) ' get the width (distance) between PtA and PtB + + Dim refPtB As Point3d + refPlane.RemapToPlaneSpace(PtB, refPtB) + If refPtB.X < 0 Then width = -width ' check if PtB is to the left of PtA...if so, width is negative + End If + + If IsSet("Len") Then inCt += 1 + If IsSet("Wid") Then inCt += 1 + If IsSet("Ht") Then inCt += 1 + If IsSet("Ang") Then inCt += 1 + If inCt > 2 Then Msg("info", "More parameters set than are required (out of length, width, height, angle). Only using the first two valid ones.") + + ' check for connected/specified inputs. note: only the first two that it comes across will be used + If IsSet("Len") Then ' if length is specified then... + If Len <= 0 Then + Msg("error", "Length cannot be negative or zero") + Return + End If + If IsSet("Wid") Then ' find height & angle based on length and specified width + If Wid > Len Then + Msg("error", "Width is greater than length") + Return + End If + If Wid = Len Then ' skip the solver and set the known values + height = 0 + m = 0 + angle = 0 + width = Wid + Else + m = SolveMFromLenWid(Len, Wid) + height = Cal_H(Len, m) ' L * Sqrt(m) / K(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + width = Wid + End If + + Else If width IsNot Nothing Then ' find height & angle based on length and calculated width (distance between PtA and PtB) + If width > Len Then + Msg("error", "Width is greater than length") + Return + End If + If width = Len Then ' skip the solver and set the known values + height = 0 + m = 0 + angle = 0 + Else + m = SolveMFromLenWid(Len, width) + height = Cal_H(Len, m) ' L * Sqrt(m) / K(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + + Else If IsSet("Ht") Then ' find width & angle based on length and height ** possible to return 2 results ** + If Math.Abs(Ht / Len) > Defined.MAX_HL_RATIO Then + Msg("error", "Height not possible with given length") + Return + End If + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + If Ht = 0 Then ' skip the solver and set the known values + width = Len + angle = 0 + Else + multiple_m = SolveMFromLenHt(Len, Ht) ' note that it's possible for two values of m to be found if height is close to max height + If multiple_m.Count = 1 Then ' if there's only one m value returned, calculate the width & angle here. we'll deal with multiple m values later + m = multiple_m.Item(0) + width = Cal_W(Len, m) ' L * (2 * E(m) / K(m) - 1) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + End If + height = Ht + + Else If IsSet("Ang") Then ' find width & height based on length and angle + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then ' skip the solver and set the known values + width = Len + height = 0 + Else + width = Cal_W(Len, m) ' L * (2 * E(m) / K(m) - 1) + height = Cal_H(Len, m) ' L * Sqrt(m) / K(m) + End If + angle = Ang + + Else + Msg("error", "Need to specify one more parameter in addition to length") + Return + End If + length = Len + + Else If IsSet("Wid") Then ' if width is specified then... + If IsSet("Ht") Then ' find length & angle based on specified width and height + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + If Ht = 0 Then ' skip the solver and set the known values + length = Wid + angle = 0 + Else + m = SolveMFromWidHt(Wid, Ht) + length = Cal_L(Ht, m) ' h * K(m) / Sqrt(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + height = Ht + + Else If IsSet("Ang") Then ' find length & height based on specified width and angle + If Wid = 0 Then + Msg("error", "Curve not possible with width = 0 and an angle as inputs") + Return + End If + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then ' skip the solver and set the known values + length = Wid + height = 0 + Else + length = Wid / (2 * EllipticE(m) / EllipticK(m) - 1) + If length < 0 Then + Msg("error", "Curve not possible at specified width and angle (calculated length is negative)") + Return + End If + height = Cal_H(length, m) ' L * Sqrt(m) / K(m) + End If + angle = Ang + + Else + Msg("error", "Need to specify one more parameter in addition to width (Wid)") + Return + End If + width = Wid + + Else If width IsNot Nothing Then ' if width is determined by PtA and PtB then... + If IsSet("Ht") Then ' find length & angle based on calculated width and height + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + If Ht = 0 Then ' skip the solver and set the known values + length = width + angle = 0 + Else + m = SolveMFromWidHt(width, Ht) + length = Cal_L(Ht, m) ' h * K(m) / Sqrt(m) + angle = Cal_A(m) ' Acos(1 - 2 * m) + End If + height = Ht + + Else If IsSet("Ang") Then ' find length & height based on calculated width and angle + If width = 0 Then + Msg("error", "Curve not possible with width = 0 and an angle as inputs") + Return + End If + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = True + flip_H = True + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then ' skip the solver and set the known values + length = width + height = 0 + Else + length = width / (2 * EllipticE(m) / EllipticK(m) - 1) + If length < 0 Then + Msg("error", "Curve not possible at specified width and angle (calculated length is negative)") + Return + End If + height = Cal_H(length, m) ' L * Sqrt(m) / K(m) + End If + angle = Ang + + Else + Msg("error", "Need to specify one more parameter in addition to PtA and PtB") + Return + End If + + Else If IsSet("Ht") Then ' if height is specified then... + If IsSet("Ang") Then ' find length & width based on height and angle + If Ht < 0 Then + Ht = -Ht ' if height is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_H = True + flip_A = True + End If + If Ht = 0 Then + Msg("error", "Height can't = 0 if only height and angle are specified") + Return + Else + If Ang < 0 Then + Ang = -Ang ' if angle is negative, set it to positive (for the calculations) but flip the reference plane about its x-axis + refPlane.Transform(Transform.Mirror(New Plane(refPlane.Origin, refPlane.XAxis, refPlane.ZAxis))) + flip_A = Not flip_A + flip_H = Not flip_H + End If + m = Cal_M(Ang) ' (1 - Cos(a)) / 2 + If Ang = 0 Then + Msg("error", "Angle can't = 0 if only height and angle are specified") + Return + Else + length = Cal_L(Ht, m) ' h * K(m) / Sqrt(m) + width = Cal_W(length, m) ' L * (2 * E(m) / K(m) - 1) + End If + angle = Ang + End If + height = Ht + + Else + Msg("error", "Need to specify one more parameter in addition to height") + Return + End If + + Else If IsSet("Ang") Then + Msg("error", "Need to specify one more parameter in addition to angle") + Return + Else + Msg("error", "Need to specify two of the four parameters: length, width (or PtB), height, and angle") + Return + End If + + If m > Defined.M_MAX Then + Msg("error", "Form of curve not solvable with current algorithm and given inputs") + Return + End If + + refPlane.Origin = refPlane.PointAt(width / 2, 0, 0) ' adjust the origin of the reference plane so that the curve is centered about the y-axis (start of the curve is at x = -width/2) + + If multiple_m.Count > 1 Then ' if there is more than one m value returned, calculate the width, angle, and curve for each + Dim multi_pts As New DataTree(Of Point3d) + Dim multi_crv As New List(Of Curve) + Dim tmp_pts As New List(Of Point3d) + Dim multi_W, multi_A, multi_F As New List(Of Double) + Dim j As Integer = 0 ' used for creating a new branch (GH_Path) for storing pts which is itself a list of points + + For Each m_val As Double In multiple_m + width = Cal_W(length, m_val) 'length * (2 * EllipticE(m_val) / EllipticK(m_val) - 1) + + If width < 0 And ignoreSelfIntersecting Then + Msg("warning", "One curve is self-intersecting. To enable these, set ignoreSelfIntersecting to False") + Continue For + End If + + If m_val >= Defined.M_SKETCHY Then Msg("info", "Accuracy of the curve whose width = " & Math.Round(width, 4) & " is not guaranteed") + + angle = Cal_A(m_val) 'Math.Asin(2 * m_val - 1) + refPlane.Origin = refPlane.PointAt(width / 2, 0, 0) ' adjust the origin of the reference plane so that the curve is centered about the y-axis (start of the curve is at x = -width/2) + + tmp_pts = FindBendForm(length, width, m_val, angle, refPlane) + multi_pts.AddRange(tmp_pts, New GH_Path(j)) + multi_crv.Add(MakeCurve(tmp_pts, angle, refPlane)) + + multi_W.Add(width) + If flip_A Then angle = -angle + multi_A.Add(angle) + + E = E * 10 ^ 9 ' Young's modulus input E is in GPa, so we convert to Pa here (= N/m^2) + multi_F.Add(EllipticK(m_val) ^ 2 * E * I / length ^ 2) ' from reference {4} pg. 79 + + j += 1 + refPlane.Origin = PtA ' reset the reference plane origin to PtA for the next m_val + 'Print("length=" & length & ", width=" & width & ", height=" & height & ", angle=" & angle & ", m=" & m_val & ", k=" & Math.Sqrt(m_val) & ", w/L=" & width / length & ", h/L=" & height / length & ", w/h=" & width / height) + Next + + ' assign the outputs + Pts = multi_pts + Crv = multi_crv + L = length + W = multi_W + If flip_H Then height = -height + H = height + A = multi_A + F = multi_F + + Else ' only deal with the single m value + If m >= Defined.M_SKETCHY Then Msg("info", "Accuracy of the curve at these parameters is not guaranteed") + + If width < 0 And ignoreSelfIntersecting Then + Msg("error", "Curve is self-intersecting. To enable these, set ignoreSelfIntersecting to False") + Return + End If + + Pts = FindBendForm(length, width, m, angle, refPlane) + Crv = MakeCurve(pts, angle, refPlane) + L = length + W = width + If flip_H Then height = -height + H = height + If flip_A Then angle = -angle + A = angle + + E = E * 10 ^ 9 ' Young's modulus input E is in GPa, so we convert to Pa here (= N/m^2) + F = EllipticK(m) ^ 2 * E * I / length ^ 2 ' from reference {4} pg. 79. Note: the critical buckling (that makes the rod/wire start to bend) can be found at height=0 (width=length) + + 'height = Math.Sqrt(((2 * Len / 5) ^ 2 - ((Wid - Len / 5) / 2) ^ 2) ' quick approximation discovered by Mårten of 'Geometry of Bending' fame ( http://tiny.cc/it2pbx ) + 'width = (Len +/- 2 * Math.Sqrt(4 * Len ^ 2 - 25 * Ht ^ 2)) / 5 ' derived from above + 'length = (2 * Math.Sqrt(15 * Ht ^ 2 + 4 * Wid ^ 2) - Wid) / 3 ' derived from above + + 'Print("length=" & length & ", width=" & width & ", height=" & height & ", angle=" & angle & ", m=" & m & ", k=" & Math.Sqrt(m) & ", w/L=" & width / length & ", h/L=" & height / length & ", w/h=" & width / height) + End If + + + + + + + 384 + 1568 + 69 + 184 + + + 420 + 1660 + + + + + + 9 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 8 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script Variable PtA + 2657fe56-ecae-410b-aa7d-d0815171db0a + PtA + PtA + true + 0 + true + 0 + e1937b56-b1da-4c12-8bd8-e34ee81746ef + + + + + + 386 + 1570 + 22 + 20 + + + 397 + 1580 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + Grasshopper.Kernel.Types.GH_Point + + + + + + + + + + + true + Script Variable PtB + ef4da902-5cc6-4ea5-81ed-b1b1cca57a12 + PtB + PtB + true + 0 + true + 96e6e7f5-7a75-4c54-916e-18b10a7340f2 + 1 + e1937b56-b1da-4c12-8bd8-e34ee81746ef + + + + + + 386 + 1590 + 22 + 20 + + + 397 + 1600 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0.0625 + 0.0625 + 0 + + Grasshopper.Kernel.Types.GH_Point + + + + + + + + + + + true + Script Variable Pln + 25a1946a-7351-4d93-9c7d-3fa4ac19078c + Pln + Pln + true + 0 + true + 0 + 3897522d-58e9-4d60-b38c-978ddacfedd8 + + + + + + 386 + 1610 + 22 + 20 + + + 397 + 1620 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Plane + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + true + Script Variable Len + bbe98993-e009-4e52-8774-f139cc9ad344 + Len + Len + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 386 + 1630 + 22 + 20 + + + 397 + 1640 + + + + + + + + true + Script Variable Wid + 318f6c25-142a-4cef-8d1b-56b349a56ae9 + Wid + Wid + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 386 + 1650 + 22 + 20 + + + 397 + 1660 + + + + + + + + true + Script Variable Ht + f065abd9-8c03-4b9a-ac26-8c0e09668b17 + Ht + Ht + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 386 + 1670 + 22 + 20 + + + 397 + 1680 + + + + + + + + true + Script Variable Ang + 5d5e434e-9221-484f-93a2-bdc1e197c273 + Ang + Ang + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 386 + 1690 + 22 + 20 + + + 397 + 1700 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Number + -0.78539816339744828 + + + + + + + + + + + true + Script Variable E + 36d9b8b0-7c38-498f-8a97-0403b70adef6 + E + E + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 386 + 1710 + 22 + 20 + + + 397 + 1720 + + + + + + + + true + Script Variable I + a6b52055-8ebf-49f0-a429-b8b8185391ac + I + I + true + 0 + true + 0 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 386 + 1730 + 22 + 20 + + + 397 + 1740 + + + + + + + + 1 + Print, Reflect and Error streams + 562038bb-d4ef-4dda-8f24-19118cb2a92c + out + out + false + 0 + + + + + + 432 + 1570 + 19 + 22 + + + 441.5 + 1581.25 + + + + + + + + Output parameter Pts + f2abc1ef-f616-42de-9c3e-2fc55c013c47 + Pts + Pts + false + 0 + + + + + + 432 + 1592 + 19 + 23 + + + 441.5 + 1603.75 + + + + + + + + Output parameter Crv + d956c518-8143-4003-b468-0922d9b5d819 + Crv + Crv + false + 0 + + + + + + 432 + 1615 + 19 + 22 + + + 441.5 + 1626.25 + + + + + + + + Output parameter L + 5f1ba0d6-87b3-4d7a-b620-493c780b9781 + L + L + false + 0 + + + + + + 432 + 1637 + 19 + 23 + + + 441.5 + 1648.75 + + + + + + + + Output parameter W + a3aba44a-4ad7-4dc6-a6dd-95eb9c56bf10 + W + W + false + 0 + + + + + + 432 + 1660 + 19 + 22 + + + 441.5 + 1671.25 + + + + + + + + Output parameter H + fcbbe834-84c4-4680-ae56-76b50b45b590 + H + H + false + 0 + + + + + + 432 + 1682 + 19 + 23 + + + 441.5 + 1693.75 + + + + + + + + Output parameter A + 383ff64c-4b9f-4bdd-a03a-aabb8673ab4e + A + A + false + 0 + + + + + + 432 + 1705 + 19 + 22 + + + 441.5 + 1716.25 + + + + + + + + Output parameter F + 30690ce7-61b8-414e-9f41-260072b75cd7 + F + F + false + 0 + + + + + + 432 + 1727 + 19 + 23 + + + 441.5 + 1738.75 + + + + + + + + + + + + + + 3581f42a-9592-4549-bd6b-1c0fc39d067b + Construct Point + + + + + Construct a point from {xyz} coordinates. + true + d4601b93-4450-4b6e-862a-bf2609a4735e + Construct Point + Pt + + + + + + 292 + 1580 + 52 + 64 + + + 317 + 1612 + + + + + + {x} coordinate + 8c217294-5520-4b18-bff5-1088b16dcbd8 + X coordinate + X + false + 284c1cc9-3635-4b27-8730-cabd5b035623 + 1 + + + + + + 294 + 1582 + 11 + 20 + + + 299.5 + 1592 + + + + + + 1 + + + + + 1 + {0} + + + + + -0.0625 + + + + + + + + + + + {y} coordinate + 680a29ab-0a44-4ec5-bbe2-6f7bd03f85af + Y coordinate + Y + false + 0 + + + + + + 294 + 1602 + 11 + 20 + + + 299.5 + 1612 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + {z} coordinate + 770e91e4-6a46-49bb-b353-8041b845ba5c + Z coordinate + Z + false + 0 + + + + + + 294 + 1622 + 11 + 20 + + + 299.5 + 1632 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Point coordinate + 96e6e7f5-7a75-4c54-916e-18b10a7340f2 + Point + Pt + false + 0 + + + + + + 329 + 1582 + 13 + 60 + + + 335.5 + 1612 + + + + + + + + + + + + ce46b74e-00c9-43c4-805a-193b69ea4a11 + Multiplication + + + + + Mathematical multiplication + true + 6c0bcf58-fe20-41f9-aeb5-ec035bad475c + Multiplication + Multiplication + + + + + + 192 + 1571 + 70 + 44 + + + 217 + 1593 + + + + + + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + First item for multiplication + a13d9bf8-6a4e-4bd6-9e37-5a941a62f027 + A + A + true + 3da56e93-b503-4aaa-913f-b21fb00a75a9 + 1 + + + + + + 194 + 1573 + 11 + 20 + + + 199.5 + 1583 + + + + + + + + Second item for multiplication + 108d8193-48f3-4738-80b0-adcd33e96b39 + B + B + true + 0 + + + + + + 194 + 1593 + 11 + 20 + + + 199.5 + 1603 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Number + 1.4142135623730951 + + + + + + + + + + + Result of multiplication + 284c1cc9-3635-4b27-8730-cabd5b035623 + Result + Result + false + 0 + + + + + + 229 + 1573 + 31 + 40 + + + 244.5 + 1593 + + + + + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + true + a19f272a-e1fd-44df-ae7c-8aa5f34795ff + Curve + Curve + false + d956c518-8143-4003-b468-0922d9b5d819 + 1 + + + + + + 490 + 1614 + 50 + 24 + + + 515.5077 + 1626.262 + + + + + + + + + + b7798b74-037e-4f0c-8ac7-dc1043d093e0 + Rotate + + + + + Rotate an object in a plane. + true + 37565348-5591-43d8-b0b4-7c4d6a5d3272 + Rotate + Rotate + + + + + + 561 + 1609 + 126 + 64 + + + 623 + 1641 + + + + + + Base geometry + 259efa71-e7ec-440a-b208-e84cfb9f4ea3 + Geometry + Geometry + true + a19f272a-e1fd-44df-ae7c-8aa5f34795ff + 1 + + + + + + 563 + 1611 + 48 + 20 + + + 587 + 1621 + + + + + + + + Rotation angle in radians + d4487b82-f667-4419-8094-99afe2efbde1 + Angle + Angle + false + 0 + false + + + + + + 563 + 1631 + 48 + 20 + + + 587 + 1641 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.78539816339744828 + + + + + + + + + + + Rotation plane + e598a938-d369-4e45-a0b1-1a8adedbff76 + Plane + Plane + false + 0 + + + + + + 563 + 1651 + 48 + 20 + + + 587 + 1661 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + Rotated geometry + b70405fe-a731-405a-91c4-82f1f5c6a102 + Geometry + Geometry + false + 0 + + + + + + 635 + 1611 + 50 + 30 + + + 660 + 1626 + + + + + + + + Transformation data + 1b130843-22d6-4d58-92b1-c74715beb4b6 + Transform + Transform + false + 0 + + + + + + 635 + 1641 + 50 + 30 + + + 660 + 1656 + + + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 72bb9a2e-d60d-4c72-a5f4-5fce99d4fe50 + Evaluate Length + Evaluate Length + + + + + + 548 + 1701 + 132 + 64 + + + 616 + 1733 + + + + + + Curve to evaluate + 1418df23-8a93-4340-9f30-b08147ea0364 + Curve + Curve + false + b70405fe-a731-405a-91c4-82f1f5c6a102 + 1 + + + + + + 550 + 1703 + 54 + 20 + + + 577 + 1713 + + + + + + + + Length factor for curve evaluation + 6bfe7688-10dc-468b-ad61-d2b018b47a13 + Length + Length + false + 0 + + + + + + 550 + 1723 + 54 + 20 + + + 577 + 1733 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 18440d2d-fe72-4dbc-9004-3116d6794b37 + Normalized + Normalized + false + 0 + + + + + + 550 + 1743 + 54 + 20 + + + 577 + 1753 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + 05d4d0bf-2b53-45a4-ad4f-b5c43cc8c6a2 + Point + Point + false + 0 + + + + + + 628 + 1703 + 50 + 20 + + + 653 + 1713 + + + + + + + + Tangent vector at the specified length + d3070cd7-941c-44f0-9ce6-61badd20a46c + Tangent + Tangent + false + 0 + + + + + + 628 + 1723 + 50 + 20 + + + 653 + 1733 + + + + + + + + Curve parameter at the specified length + f5413efc-3b2e-4407-93d2-35720cd637f1 + Parameter + Parameter + false + 0 + + + + + + 628 + 1743 + 50 + 20 + + + 653 + 1753 + + + + + + + + + + + + b7798b74-037e-4f0c-8ac7-dc1043d093e0 + Rotate + + + + + Rotate an object in a plane. + true + 9adf2dba-5752-42e7-87e3-7871cd7470f3 + Rotate + Rotate + + + + + + 560 + 1778 + 126 + 64 + + + 622 + 1810 + + + + + + Base geometry + 6725f6c6-0b9d-49d3-8348-51e56dbb75dd + Geometry + Geometry + true + b70405fe-a731-405a-91c4-82f1f5c6a102 + 1 + + + + + + 562 + 1780 + 48 + 20 + + + 586 + 1790 + + + + + + + + Rotation angle in radians + 3d98a8db-0a5a-42da-9bda-670dff10b82a + Angle + Angle + false + 0 + false + + + + + + 562 + 1800 + 48 + 20 + + + 586 + 1810 + + + + + + 1 + + + + + 1 + {0} + + + + + 3.1415926535897931 + + + + + + + + + + + Rotation plane + 9be2bae3-ab72-42e3-a7b1-cf9c1265c35b + Plane + Plane + false + 05d4d0bf-2b53-45a4-ad4f-b5c43cc8c6a2 + 1 + + + + + + 562 + 1820 + 48 + 20 + + + 586 + 1830 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + Rotated geometry + 98aef519-9b49-4a89-b2a3-b806fa206e19 + Geometry + Geometry + false + 0 + + + + + + 634 + 1780 + 50 + 30 + + + 659 + 1795 + + + + + + + + Transformation data + 7499b0d3-1824-4208-a5c8-13bc1e8101d6 + Transform + Transform + false + 0 + + + + + + 634 + 1810 + 50 + 30 + + + 659 + 1825 + + + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 7c7852a9-4249-47e5-9031-e2ef29f4fd3b + Evaluate Length + Evaluate Length + + + + + + 550 + 1860 + 132 + 64 + + + 618 + 1892 + + + + + + Curve to evaluate + a5fbf7c4-460f-43ee-857b-f36ef883c6cc + Curve + Curve + false + 98aef519-9b49-4a89-b2a3-b806fa206e19 + 1 + + + + + + 552 + 1862 + 54 + 20 + + + 579 + 1872 + + + + + + + + Length factor for curve evaluation + 7c42813a-76b8-4438-a17e-063612817650 + Length + Length + false + 0 + + + + + + 552 + 1882 + 54 + 20 + + + 579 + 1892 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + b9fe3425-bdb4-41a6-9ecb-13ee3a231d72 + Normalized + Normalized + false + 0 + + + + + + 552 + 1902 + 54 + 20 + + + 579 + 1912 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + 52f025f7-8b51-47c5-8bf1-9caa31e9ca1f + Point + Point + false + 0 + + + + + + 630 + 1862 + 50 + 20 + + + 655 + 1872 + + + + + + + + Tangent vector at the specified length + 32390238-8395-452b-aeda-d19d39ee6226 + Tangent + Tangent + false + 0 + + + + + + 630 + 1882 + 50 + 20 + + + 655 + 1892 + + + + + + + + Curve parameter at the specified length + 3f11ce29-ffbe-49c8-b111-c2c71140c932 + Parameter + Parameter + false + 0 + + + + + + 630 + 1902 + 50 + 20 + + + 655 + 1912 + + + + + + + + + + + + f12daa2f-4fd5-48c1-8ac3-5dea476912ca + Mirror + + + + + Mirror an object. + true + 0eb85a42-2c70-44b8-9e00-5aba582dde85 + Mirror + Mirror + + + + + + 744 + 1777 + 126 + 44 + + + 806 + 1799 + + + + + + Base geometry + 69c72ba0-8b4c-4b38-8e6e-5cf06f33db82 + Geometry + Geometry + true + 30220ef9-bb40-4cba-ac3f-1600a89d47dc + 1 + + + + + + 746 + 1779 + 48 + 20 + + + 770 + 1789 + + + + + + + + Mirror plane + 210842dd-fdfe-40bf-871b-cdaea375371b + Plane + Plane + false + 17bf68cb-da62-49f6-bf6c-38b55fe70dff + 1 + + + + + + 746 + 1799 + 48 + 20 + + + 770 + 1809 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + + + + + + + + + + Mirrored geometry + e24f69ea-53e4-4879-b764-4df48610d16e + Geometry + Geometry + false + 0 + + + + + + 818 + 1779 + 50 + 20 + + + 843 + 1789 + + + + + + + + Transformation data + 65deb174-4ccd-45ba-8617-7cf0a9be87f2 + Transform + Transform + false + 0 + + + + + + 818 + 1799 + 50 + 20 + + + 843 + 1809 + + + + + + + + + + + + fad344bc-09b1-4855-a2e6-437ef5715fe3 + YZ Plane + + + + + World YZ plane. + true + 5cc342e9-7dc6-471d-bf07-6b9be8fa3cb8 + YZ Plane + YZ Plane + + + + + + 715 + 1858 + 86 + 28 + + + 759 + 1872 + + + + + + Origin of plane + e546afd3-de01-4729-a756-f417f4d66715 + Origin + Origin + false + 52f025f7-8b51-47c5-8bf1-9caa31e9ca1f + 1 + + + + + + 717 + 1860 + 30 + 24 + + + 732 + 1872 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + World YZ plane + 17bf68cb-da62-49f6-bf6c-38b55fe70dff + Plane + Plane + false + 0 + + + + + + 771 + 1860 + 28 + 24 + + + 785 + 1872 + + + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + f85ed1ff-db4b-44e5-af3c-ac525dbc121c + Join Curves + Join Curves + + + + + + 768 + 1719 + 106 + 44 + + + 825 + 1741 + + + + + + 1 + Curves to join + 7c24a930-35a2-4288-a5c2-6e9239d79329 + Curves + Curves + false + b70405fe-a731-405a-91c4-82f1f5c6a102 + 98aef519-9b49-4a89-b2a3-b806fa206e19 + 2 + + + + + + 770 + 1721 + 43 + 20 + + + 791.5 + 1731 + + + + + + + + Preserve direction of input curves + a129b4c0-59f2-4cf2-9552-5218e46fbe5b + Preserve + Preserve + false + 0 + + + + + + 770 + 1741 + 43 + 20 + + + 791.5 + 1751 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + 30220ef9-bb40-4cba-ac3f-1600a89d47dc + Curves + Curves + false + 0 + + + + + + 837 + 1721 + 35 + 40 + + + 854.5 + 1741 + + + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + 0d6c8645-0575-436c-a18d-fa91c129b309 + Join Curves + Join Curves + + + + + + 902 + 1723 + 106 + 44 + + + 959 + 1745 + + + + + + 1 + Curves to join + 8e6b7a90-ac98-4d09-937b-9d2e177dce42 + Curves + Curves + false + 30220ef9-bb40-4cba-ac3f-1600a89d47dc + e24f69ea-53e4-4879-b764-4df48610d16e + 2 + + + + + + 904 + 1725 + 43 + 20 + + + 925.5 + 1735 + + + + + + + + Preserve direction of input curves + 430532e6-9b1f-408c-8063-b76b1a787d20 + Preserve + Preserve + false + 0 + + + + + + 904 + 1745 + 43 + 20 + + + 925.5 + 1755 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + 33d0f02d-c918-4cea-ae8e-2ad6ad5d1a82 + Curves + Curves + false + 0 + + + + + + 971 + 1725 + 35 + 40 + + + 988.5 + 1745 + + + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 7967ace9-058d-48fa-8e01-396bbe9ba969 + Evaluate Length + Evaluate Length + + + + + + 877 + 1875 + 132 + 64 + + + 945 + 1907 + + + + + + Curve to evaluate + 092e6ac9-2339-445d-80b7-391f2bdf20d8 + Curve + Curve + false + 33d0f02d-c918-4cea-ae8e-2ad6ad5d1a82 + 1 + + + + + + 879 + 1877 + 54 + 20 + + + 906 + 1887 + + + + + + + + Length factor for curve evaluation + 2bdcdcff-9fc0-4b57-a354-a5352682cc5a + Length + Length + false + 0 + + + + + + 879 + 1897 + 54 + 20 + + + 906 + 1907 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + f10a8673-0505-42f4-b3ca-56624dc57284 + Normalized + Normalized + false + 0 + + + + + + 879 + 1917 + 54 + 20 + + + 906 + 1927 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + 1fcebe2c-ce7a-4b50-9499-435ea7a966f4 + Point + Point + false + 0 + + + + + + 957 + 1877 + 50 + 20 + + + 982 + 1887 + + + + + + + + Tangent vector at the specified length + 2c7b3cbf-0c12-4405-91b7-e365c658f50c + Tangent + Tangent + false + 0 + + + + + + 957 + 1897 + 50 + 20 + + + 982 + 1907 + + + + + + + + Curve parameter at the specified length + 2d33f33e-6467-4c51-b790-11c51e6d526c + Parameter + Parameter + false + 0 + + + + + + 957 + 1917 + 50 + 20 + + + 982 + 1927 + + + + + + + + + + + + b7798b74-037e-4f0c-8ac7-dc1043d093e0 + Rotate + + + + + Rotate an object in a plane. + true + 03f06df8-436b-47d9-83ff-80eedbfab6d5 + Rotate + Rotate + + + + + + 887 + 1794 + 126 + 64 + + + 949 + 1826 + + + + + + Base geometry + 762b903e-0b5d-42ab-8cbb-bec1cc7001f1 + Geometry + Geometry + true + 33d0f02d-c918-4cea-ae8e-2ad6ad5d1a82 + 1 + + + + + + 889 + 1796 + 48 + 20 + + + 913 + 1806 + + + + + + + + Rotation angle in radians + 5da141fd-f50f-49ac-b1f4-e7cf0ef48884 + Angle + Angle + false + 0 + false + + + + + + 889 + 1816 + 48 + 20 + + + 913 + 1826 + + + + + + 1 + + + + + 1 + {0} + + + + + 3.1415926535897931 + + + + + + + + + + + Rotation plane + e878b21d-2ddd-4b1d-82e0-c63a3c11abbf + Plane + Plane + false + 1fcebe2c-ce7a-4b50-9499-435ea7a966f4 + 1 + + + + + + 889 + 1836 + 48 + 20 + + + 913 + 1846 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + + + + Rotated geometry + cb5e832c-db39-4a89-81e5-0d68a77a32c5 + Geometry + Geometry + false + 0 + + + + + + 961 + 1796 + 50 + 30 + + + 986 + 1811 + + + + + + + + Transformation data + b0798e16-d60a-4935-a904-db0a4f498080 + Transform + Transform + false + 0 + + + + + + 961 + 1826 + 50 + 30 + + + 986 + 1841 + + + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + 5f8035b4-950d-4f8c-8c6c-02a7eb12a4d9 + Join Curves + Join Curves + + + + + + 1050 + 1716 + 106 + 44 + + + 1107 + 1738 + + + + + + 1 + Curves to join + 264b7cf1-87ec-411f-8f1e-f682b4e450a9 + Curves + Curves + false + 33d0f02d-c918-4cea-ae8e-2ad6ad5d1a82 + cb5e832c-db39-4a89-81e5-0d68a77a32c5 + 2 + + + + + + 1052 + 1718 + 43 + 20 + + + 1073.5 + 1728 + + + + + + + + Preserve direction of input curves + efda4bb5-9478-41e2-88b2-52024ebb0a81 + Preserve + Preserve + false + 0 + + + + + + 1052 + 1738 + 43 + 20 + + + 1073.5 + 1748 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + 6a4e1df2-35b0-40d8-b9e5-d84972b9f3d5 + Curves + Curves + false + 0 + + + + + + 1119 + 1718 + 35 + 40 + + + 1136.5 + 1738 + + + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + 2aef12dd-0bad-4fd2-b757-593417c6c2de + Evaluate Length + Evaluate Length + + + + + + 1039 + 1784 + 132 + 64 + + + 1107 + 1816 + + + + + + Curve to evaluate + da5c4498-30ff-4374-a5ad-5547644420a5 + Curve + Curve + false + 6a4e1df2-35b0-40d8-b9e5-d84972b9f3d5 + 1 + + + + + + 1041 + 1786 + 54 + 20 + + + 1068 + 1796 + + + + + + + + Length factor for curve evaluation + f3ecb642-6bcb-43bf-9794-4d9e549a7e56 + Length + Length + false + 0 + + + + + + 1041 + 1806 + 54 + 20 + + + 1068 + 1816 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 09d5895a-4b92-4909-a097-06fab632261d + Normalized + Normalized + false + 0 + + + + + + 1041 + 1826 + 54 + 20 + + + 1068 + 1836 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + 36832804-60c7-430e-b5bd-47dbdea47f0f + Point + Point + false + 0 + + + + + + 1119 + 1786 + 50 + 20 + + + 1144 + 1796 + + + + + + + + Tangent vector at the specified length + af8d2f93-da07-48bf-b6f7-a8db45db017e + Tangent + Tangent + false + 0 + + + + + + 1119 + 1806 + 50 + 20 + + + 1144 + 1816 + + + + + + + + Curve parameter at the specified length + 267fd9f7-80ca-463b-816e-5f71d5e5caad + Parameter + Parameter + false + 0 + + + + + + 1119 + 1826 + 50 + 20 + + + 1144 + 1836 + + + + + + + + + + + + f12daa2f-4fd5-48c1-8ac3-5dea476912ca + Mirror + + + + + Mirror an object. + true + 08f036d3-8f87-4cbb-a203-67a5a3ff6b4e + Mirror + Mirror + + + + + + 1048 + 1868 + 126 + 44 + + + 1110 + 1890 + + + + + + Base geometry + 2303a03f-1da9-419d-b38b-05bdd04786fa + Geometry + Geometry + true + 6a4e1df2-35b0-40d8-b9e5-d84972b9f3d5 + 1 + + + + + + 1050 + 1870 + 48 + 20 + + + 1074 + 1880 + + + + + + + + Mirror plane + 88630c96-da83-4922-b310-a02a28f694fc + Plane + Plane + false + d78c4aa2-4094-4f95-ade4-3b9c254fcaa4 + 1 + + + + + + 1050 + 1890 + 48 + 20 + + + 1074 + 1900 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + + + + + + + + + + Mirrored geometry + 937b5876-9cac-4d48-bffc-fce17e6e4ff8 + Geometry + Geometry + false + 0 + + + + + + 1122 + 1870 + 50 + 20 + + + 1147 + 1880 + + + + + + + + Transformation data + bc36d610-bb23-4b96-9a32-a1264d3d64ea + Transform + Transform + false + 0 + + + + + + 1122 + 1890 + 50 + 20 + + + 1147 + 1900 + + + + + + + + + + + + fad344bc-09b1-4855-a2e6-437ef5715fe3 + YZ Plane + + + + + World YZ plane. + true + ab07ed93-ce99-4922-bb37-cd9ff41738ae + YZ Plane + YZ Plane + + + + + + 1076 + 1930 + 86 + 28 + + + 1120 + 1944 + + + + + + Origin of plane + 96d5c33e-0598-4694-acdd-28288abbeb4a + Origin + Origin + false + 36832804-60c7-430e-b5bd-47dbdea47f0f + 1 + + + + + + 1078 + 1932 + 30 + 24 + + + 1093 + 1944 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + World YZ plane + d78c4aa2-4094-4f95-ade4-3b9c254fcaa4 + Plane + Plane + false + 0 + + + + + + 1132 + 1932 + 28 + 24 + + + 1146 + 1944 + + + + + + + + + + + + 8073a420-6bec-49e3-9b18-367f6fd76ac3 + Join Curves + + + + + Join as many curves as possible + true + 3e8760c9-0187-407f-89bf-d454f8933d8b + Join Curves + Join Curves + + + + + + 1239 + 1726 + 106 + 44 + + + 1296 + 1748 + + + + + + 1 + Curves to join + 12062507-2fa9-4376-a91a-ac58bab67fff + Curves + Curves + false + 6a4e1df2-35b0-40d8-b9e5-d84972b9f3d5 + 937b5876-9cac-4d48-bffc-fce17e6e4ff8 + 2 + + + + + + 1241 + 1728 + 43 + 20 + + + 1262.5 + 1738 + + + + + + + + Preserve direction of input curves + 937c266e-69e5-4213-b761-903b918c57ac + Preserve + Preserve + false + 0 + + + + + + 1241 + 1748 + 43 + 20 + + + 1262.5 + 1758 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Joined curves and individual curves that could not be joined. + 74fee499-31ac-4fd7-8d88-534b634cdc5e + Curves + Curves + false + 0 + + + + + + 1308 + 1728 + 35 + 40 + + + 1325.5 + 1748 + + + + + + + + + + + + cae9fe53-6d63-44ed-9d6d-13180fbf6f89 + 1c9de8a1-315f-4c56-af06-8f69fee80a7a + Curve Graph Mapper + + + + + Remap values with a custom graph using input curves. + true + f59ee16b-43ad-4c37-89b3-b47cb98709b7 + Curve Graph Mapper + Curve Graph Mapper + + + + + + 1829 + 1693 + 148 + 224 + + + 1891 + 1805 + + + + + + 1 + One or multiple graph curves to graph map values with + ae3612a4-4d92-4d09-b584-827006c2de11 + Curves + Curves + false + 8e03a14f-eb65-4608-906c-918b0d1923ff + 1 + + + + + + 1831 + 1695 + 48 + 27 + + + 1855 + 1708.75 + + + + + + + + Rectangle which defines the boundary of the graph, graph curves should be atleast partially inside this boundary + 67b21d23-7fd3-4ba9-a7fb-e378039978d6 + Rectangle + Rectangle + false + 332dde95-ad78-4c2f-8f95-7ea47795be9c + 1 + + + + + + 1831 + 1722 + 48 + 28 + + + 1855 + 1736.25 + + + + + + + + 1 + Values to graph map. Values are plotted along the X Axis, intersected with the graph curves, then mapped to the Y Axis + 249e75c2-f6ac-4990-8c56-f25daf2e7a54 + Values + Values + false + 3540c5a6-ed00-4088-8256-5cc9330d7c01 + 1 + + + + + + 1831 + 1750 + 48 + 27 + + + 1855 + 1763.75 + + + + + + + + Domain of the graphs X Axis, where the values get plotted (if omitted the input value lists domain bounds is used) + a2fb0cfb-ef0c-4796-bc33-0a7e1e127c61 + X Axis + X Axis + true + 0 + + + + + + 1831 + 1777 + 48 + 28 + + + 1855 + 1791.25 + + + + + + + + Domain of the graphs Y Axis, where the values get mapped to (if omitted the input value lists domain bounds is used) + b97d978a-ea56-46ad-98f4-65db6bc3e49a + Y Axis + Y Axis + true + 0 + + + + + + 1831 + 1805 + 48 + 27 + + + 1855 + 1818.75 + + + + + + + + Flip the graphs X Axis from the bottom of the graph to the top of the graph + aa6d554b-ddda-4a22-b958-9db708daecc6 + Flip + Flip + false + 0 + + + + + + 1831 + 1832 + 48 + 28 + + + 1855 + 1846.25 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Resize the graph by snapping it to the extents of the graph curves, in the plane of the boundary rectangle + d70d6bc4-0b2f-4177-8f08-493bee472250 + Snap + Snap + false + 0 + + + + + + 1831 + 1860 + 48 + 27 + + + 1855 + 1873.75 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Size of the graph labels + b9efbc3b-9acf-4b34-b879-a210afc26a69 + Text Size + Text Size + false + 0 + + + + + + 1831 + 1887 + 48 + 28 + + + 1855 + 1901.25 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.0625 + + + + + + + + + + + 1 + Resulting graph mapped values, mapped on the Y Axis + 71bc6904-175f-469f-b566-4dbe32d835bb + Mapped + Mapped + false + 0 + + + + + + 1903 + 1695 + 72 + 20 + + + 1939 + 1705 + + + + + + + + 1 + The graph curves inside the boundary of the graph + a19be86e-3fe3-4691-8fd2-6cb3e162fb6a + Graph Curves + Graph Curves + false + 0 + + + + + + 1903 + 1715 + 72 + 20 + + + 1939 + 1725 + + + + + + + + 1 + The points on the graph curves where the X Axis input values intersected + true + 642a1ea5-ea0c-4d1e-b21d-55bfa91afc3e + Graph Points + Graph Points + false + 0 + + + + + + 1903 + 1735 + 72 + 20 + + + 1939 + 1745 + + + + + + + + 1 + The lines from the X Axis input values to the graph curves + true + c2cc14a6-bdbc-42c4-80ac-f04fc25244d7 + Value Lines + Value Lines + false + 0 + + + + + + 1903 + 1755 + 72 + 20 + + + 1939 + 1765 + + + + + + + + 1 + The points plotted on the X Axis which represent the input values + true + 6d4906b1-c07e-43fa-bab1-8b6651d8cf70 + Value Points + Value Points + false + 0 + + + + + + 1903 + 1775 + 72 + 20 + + + 1939 + 1785 + + + + + + + + 1 + The lines from the graph curves to the Y Axis graph mapped values + true + f2e9fd13-480a-409c-9224-37b31d1b5e8a + Mapped Lines + Mapped Lines + false + 0 + + + + + + 1903 + 1795 + 72 + 20 + + + 1939 + 1805 + + + + + + + + 1 + The points mapped on the Y Axis which represent the graph mapped values + true + d90ada3e-b283-496e-80c6-7e33e9e834dd + Mapped Points + Mapped Points + false + 0 + + + + + + 1903 + 1815 + 72 + 20 + + + 1939 + 1825 + + + + + + + + The graph boundary background as a surface + c77ce4ed-f82a-485e-861b-56e4af6cd670 + Boundary + Boundary + false + 0 + + + + + + 1903 + 1835 + 72 + 20 + + + 1939 + 1845 + + + + + + + + 1 + The graph labels as curve outlines + 1304912b-9e82-4215-9b9b-472899f3a3e0 + Labels + Labels + false + 0 + + + + + + 1903 + 1855 + 72 + 20 + + + 1939 + 1865 + + + + + + + + 1 + True for input values outside of the X Axis domain bounds +False for input values inside of the X Axis domain bounds + 0d520714-1f87-47f8-8e49-acc1bb50d032 + Out Of Bounds + Out Of Bounds + false + 0 + + + + + + 1903 + 1875 + 72 + 20 + + + 1939 + 1885 + + + + + + + + 1 + True for input values on the X Axis which intersect a graph curve +False for input values on the X Axis which do not intersect a graph curve + dc75d0fb-7ad1-4ff6-be3f-405bd74925af + Intersected + Intersected + false + 0 + + + + + + 1903 + 1895 + 72 + 20 + + + 1939 + 1905 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + fba4a0b5-d761-41e8-98e6-857040e4a72f + Relay + + false + 71bc6904-175f-469f-b566-4dbe32d835bb + 1 + + + + + + 2013 + 1734 + 40 + 16 + + + 2033 + 1742 + + + + + + + + + + fb6aba99-fead-4e42-b5d8-c6de5ff90ea6 + DotNET VB Script (LEGACY) + + + + + A VB.NET scriptable component + true + 04f46bd6-5820-4e23-9fee-ec36f36a7db0 + DotNET VB Script (LEGACY) + Turtle + 0 + Dim i As Integer + Dim dir As New On3dVector(1, 0, 0) + Dim pos As New On3dVector(0, 0, 0) + Dim axis As New On3dVector(0, 0, 1) + Dim pnts As New List(Of On3dVector) + + pnts.Add(pos) + + For i = 0 To Forward.Count() - 1 + Dim P As New On3dVector + dir.Rotate(Left(i), axis) + P = dir * Forward(i) + pnts(i) + pnts.Add(P) + Next + + Points = pnts + + + + + + 1020 + -255 + 100 + 44 + + + 1075 + -233 + + + + + + 1 + 1 + 2 + Script Variable Forward + Script Variable Left + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + true + true + Forward + Left + true + true + + + + + 2 + Print, Reflect and Error streams + Output parameter Points + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + true + true + Output + Points + false + false + + + + + 1 + false + Script Variable Forward + b9abac3d-84f3-4379-9571-795d737e787f + Forward + Forward + true + 1 + true + 95ec1350-0cf8-4bd1-9939-9141bb7e8d4d + 1 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 1022 + -253 + 41 + 20 + + + 1042.5 + -243 + + + + + + + + 1 + false + Script Variable Left + 98523591-64d9-4d0d-a564-60db2b1e8141 + Left + Left + true + 1 + true + 8cdcaada-fc0f-4e1c-b945-c54515a10ec8 + 1 + 8e991e99-5fb8-41e1-928d-1bba8fb9f7d7 + + + + + + 1022 + -233 + 41 + 20 + + + 1042.5 + -223 + + + + + + + + Print, Reflect and Error streams + 188742fd-d016-4251-a6dc-6efaa5ec6c59 + Output + out + false + 0 + + + + + + 1087 + -253 + 31 + 20 + + + 1102.5 + -243 + + + + + + + + Output parameter Points + 680426bb-44d6-4f74-84ea-a30424576deb + Points + Points + false + 0 + + + + + + 1087 + -233 + 31 + 20 + + + 1102.5 + -223 + + + + + + + + + + + + fbac3e32-f100-4292-8692-77240a42fd1a + Point + + + + + Contains a collection of three-dimensional points + true + 5c482871-7ff7-4118-b23e-94ef7f946ae1 + Point + Point + false + 680426bb-44d6-4f74-84ea-a30424576deb + 1 + + + + + + 1126 + -138 + 50 + 24 + + + 1151.687 + -126.2506 + + + + + + + + + + 2b2a4145-3dff-41d4-a8de-1ea9d29eef33 + Interpolate + + + + + Create an interpolated curve through a set of points. + true + 121b5465-f85c-478a-b735-9582ea845c5c + Interpolate + Interpolate + + + + + + 1198 + -264 + 113 + 84 + + + 1259 + -222 + + + + + + 1 + Interpolation points + c6b2e27d-97b5-44cd-9de5-b75b7e8abb26 + Vertices + Vertices + false + 680426bb-44d6-4f74-84ea-a30424576deb + 1 + + + + + + 1200 + -262 + 47 + 20 + + + 1223.5 + -252 + + + + + + + + Curve degree + 0df378ae-f53a-4733-bad7-21aa3e61b2be + Degree + Degree + false + 0 + + + + + + 1200 + -242 + 47 + 20 + + + 1223.5 + -232 + + + + + + 1 + + + + + 1 + {0} + + + + + 3 + + + + + + + + + + + Periodic curve + d251596e-3b9b-4ed0-b4a3-bcebf2ce6ee0 + Periodic + Periodic + false + 0 + + + + + + 1200 + -222 + 47 + 20 + + + 1223.5 + -212 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + Knot spacing (0=uniform, 1=chord, 2=sqrtchord) + 26eaf4b5-55ed-4edc-a365-9970c1e3aa28 + KnotStyle + KnotStyle + false + 0 + + + + + + 1200 + -202 + 47 + 20 + + + 1223.5 + -192 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Resulting nurbs curve + d226da90-0265-4fbe-a4f0-5b199a80033c + Curve + Curve + false + 0 + + + + + + 1271 + -262 + 38 + 26 + + + 1290 + -248.6667 + + + + + + + + Curve length + 371505c7-3a2a-4440-aa3b-d62a0fc8d786 + Length + Length + false + 0 + + + + + + 1271 + -236 + 38 + 27 + + + 1290 + -222 + + + + + + + + Curve domain + abfd30af-d005-4221-b835-a2c9c01655ef + Domain + Domain + false + 0 + + + + + + 1271 + -209 + 38 + 27 + + + 1290 + -195.3333 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 8cdcaada-fc0f-4e1c-b945-c54515a10ec8 + Relay + + false + fba4a0b5-d761-41e8-98e6-857040e4a72f + 1 + + + + + + 926 + -162 + 40 + 16 + + + 946 + -154 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + f3423c70-2b05-418e-ae35-dc0185716a28 + Relay + + false + 1079207c-c500-47d1-8f4a-d01b58dbaef6 + 1 + + + + + + 1818 + -210 + 40 + 16 + + + 1838 + -202 + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + true + 1c315543-a675-4e2e-bf6c-0699d34576cd + Curve + Curve + false + f3423c70-2b05-418e-ae35-dc0185716a28 + 1 + + + + + + 1974 + -182 + 50 + 24 + + + 1999.795 + -170.9949 + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + a66f475b-e0e2-49b0-8dfb-e80e2169bb7f + Evaluate Length + Evaluate Length + + + + + + 1397 + -114 + 132 + 64 + + + 1465 + -82 + + + + + + Curve to evaluate + bb37b8df-92d0-42f0-b738-97d78f16e156 + Curve + Curve + false + 3910b2ce-825d-4581-ba63-0d4761cdc4e4 + 1 + + + + + + 1399 + -112 + 54 + 20 + + + 1426 + -102 + + + + + + + + Length factor for curve evaluation + 6e80d472-fac2-4187-8281-60c0e364a768 + Length + Length + false + 0 + + + + + + 1399 + -92 + 54 + 20 + + + 1426 + -82 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + c446b02e-7b0e-4d23-8f02-df32e0f43f41 + Normalized + Normalized + false + 0 + + + + + + 1399 + -72 + 54 + 20 + + + 1426 + -62 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + 1578a0e1-8a38-496d-b60a-c23f1a475084 + Point + Point + false + 0 + + + + + + 1477 + -112 + 50 + 20 + + + 1502 + -102 + + + + + + + + Tangent vector at the specified length + dab4bf04-7e37-41b8-9cba-f99d414e99fb + Tangent + Tangent + false + 0 + + + + + + 1477 + -92 + 50 + 20 + + + 1502 + -82 + + + + + + + + Curve parameter at the specified length + 489c1968-382a-40eb-9a6b-ea22dfee0882 + Parameter + Parameter + false + 0 + + + + + + 1477 + -72 + 50 + 20 + + + 1502 + -62 + + + + + + + + + + + + 9abae6b7-fa1d-448c-9209-4a8155345841 + Deconstruct + + + + + Deconstruct a point into its component parts. + true + 1dbcd44b-9bbb-4655-8876-3648a699fa31 + Deconstruct + Deconstruct + + + + + + 1553 + -94 + 120 + 64 + + + 1594 + -62 + + + + + + Input point + a8801748-6a68-47fe-a0ba-d6c1883f559e + Point + Point + false + 1578a0e1-8a38-496d-b60a-c23f1a475084 + 1 + + + + + + 1555 + -92 + 27 + 60 + + + 1568.5 + -62 + + + + + + + + Point {x} component + 89dce222-a000-4356-b64c-c9d83cf76ba3 + X component + X component + false + 0 + + + + + + 1606 + -92 + 65 + 20 + + + 1638.5 + -82 + + + + + + + + Point {y} component + df435129-f632-41d3-87f6-6ae7ae0971ac + Y component + Y component + false + 0 + + + + + + 1606 + -72 + 65 + 20 + + + 1638.5 + -62 + + + + + + + + Point {z} component + 1c4e507e-f239-4786-9994-f54b197d62ab + Z component + Z component + false + 0 + + + + + + 1606 + -52 + 65 + 20 + + + 1638.5 + -42 + + + + + + + + + + + + 56b92eab-d121-43f7-94d3-6cd8f0ddead8 + Vector XYZ + + + + + Create a vector from {xyz} components. + true + e739b100-829b-4164-987b-c8d3d18692ba + Vector XYZ + Vector XYZ + + + + + + 1692 + -87 + 127 + 64 + + + 1771 + -55 + + + + + + Vector {x} component + 38551287-4ac2-4820-83e6-ca880161804a + X component + X component + false + 89dce222-a000-4356-b64c-c9d83cf76ba3 + 1 + + + + + + 1694 + -85 + 65 + 20 + + + 1726.5 + -75 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector {y} component + 06c3dee2-5cb8-49c9-8b35-e88c0a7d3b28 + Y component + Y component + false + 0 + + + + + + 1694 + -65 + 65 + 20 + + + 1726.5 + -55 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector {z} component + 7d865c89-91a2-461c-a09a-d71707ad27bb + Z component + Z component + false + 0 + + + + + + 1694 + -45 + 65 + 20 + + + 1726.5 + -35 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector construct + 66487a28-7cef-45bb-8348-cf3098878562 + Vector + Vector + false + 0 + + + + + + 1783 + -85 + 34 + 30 + + + 1800 + -70 + + + + + + + + Vector length + 9b4f2434-0a76-4765-b7fd-87684717c27a + Length + Length + false + 0 + + + + + + 1783 + -55 + 34 + 30 + + + 1800 + -40 + + + + + + + + + + + + e9eb1dcf-92f6-4d4d-84ae-96222d60f56b + Move + + + + + Translate (move) an object along a vector. + true + 8cef3aa1-7554-4876-99b9-b6d74e40e6d1 + Move + Move + + + + + + 1614 + -193 + 126 + 44 + + + 1676 + -171 + + + + + + Base geometry + 3242288f-3099-4f7d-8df0-a0c7e225393a + Geometry + Geometry + true + d226da90-0265-4fbe-a4f0-5b199a80033c + 1 + + + + + + 1616 + -191 + 48 + 20 + + + 1640 + -181 + + + + + + + + Translation vector + a41ec363-f4ef-4127-96ac-b0c276de30e2 + Motion + Motion + false + 66487a28-7cef-45bb-8348-cf3098878562 + 1 + + + + + + 1616 + -171 + 48 + 20 + + + 1640 + -161 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 10 + + + + + + + + + + + + Translated geometry + 1079207c-c500-47d1-8f4a-d01b58dbaef6 + Geometry + Geometry + false + 0 + + + + + + 1688 + -191 + 50 + 20 + + + 1713 + -181 + + + + + + + + Transformation data + c95cc97a-25a2-43b1-8593-46e184b0a79d + Transform + Transform + false + 0 + + + + + + 1688 + -171 + 50 + 20 + + + 1713 + -161 + + + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + edcd7d3d-fd27-48be-8d4f-709654e17fe5 + Relay + + false + 74fee499-31ac-4fd7-8d88-534b634cdc5e + 1 + + + + + + 1539 + 1654 + 40 + 16 + + + 1559 + 1662 + + + + + + + + + + 6b021f56-b194-4210-b9a1-6cef3b7d0848 + Evaluate Length + + + + + Evaluate a curve at a certain factor along its length. Length factors can be supplied both in curve units and normalized units. Change the [N] parameter to toggle between the two modes. + true + e19d3738-99bd-4bcb-947c-0920388de262 + Evaluate Length + Evaluate Length + + + + + + 2102 + 1825 + 132 + 64 + + + 2170 + 1857 + + + + + + Curve to evaluate + f6884525-1cf6-4b8f-b230-b10b6f5f48fa + Curve + Curve + false + a4db035a-a834-48b6-a951-08f0da775207 + 1 + + + + + + 2104 + 1827 + 54 + 20 + + + 2131 + 1837 + + + + + + + + Length factor for curve evaluation + 2962c737-2d04-4217-84d5-3de1371cac33 + Length + Length + false + 0 + + + + + + 2104 + 1847 + 54 + 20 + + + 2131 + 1857 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + If True, the Length factor is normalized (0.0 ~ 1.0) + 1503caad-f703-4dfa-8bac-bd18d5b91495 + Normalized + Normalized + false + 0 + + + + + + 2104 + 1867 + 54 + 20 + + + 2131 + 1877 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Point at the specified length + a73884d2-c0eb-4817-89db-47f5f7987257 + Point + Point + false + 0 + + + + + + 2182 + 1827 + 50 + 20 + + + 2207 + 1837 + + + + + + + + Tangent vector at the specified length + 9583a04f-de23-4125-87f1-3be9c4d285c5 + Tangent + Tangent + false + 0 + + + + + + 2182 + 1847 + 50 + 20 + + + 2207 + 1857 + + + + + + + + Curve parameter at the specified length + 47a6c421-3857-49ee-b595-9d906e010653 + Parameter + Parameter + false + 0 + + + + + + 2182 + 1867 + 50 + 20 + + + 2207 + 1877 + + + + + + + + + + + + 9abae6b7-fa1d-448c-9209-4a8155345841 + Deconstruct + + + + + Deconstruct a point into its component parts. + true + f079ab90-1a27-49ac-a297-a36c22d38c8a + Deconstruct + Deconstruct + + + + + + 2280 + 1827 + 120 + 64 + + + 2321 + 1859 + + + + + + Input point + f40746ca-4677-4eb5-b17f-18cd2492ce5d + Point + Point + false + a73884d2-c0eb-4817-89db-47f5f7987257 + 1 + + + + + + 2282 + 1829 + 27 + 60 + + + 2295.5 + 1859 + + + + + + + + Point {x} component + 54294e75-31f0-4519-96c7-67914c56f51a + X component + X component + false + 0 + + + + + + 2333 + 1829 + 65 + 20 + + + 2365.5 + 1839 + + + + + + + + Point {y} component + dba9a3a6-c2ec-413c-bb9c-b47fc3f6cb1a + Y component + Y component + false + 0 + + + + + + 2333 + 1849 + 65 + 20 + + + 2365.5 + 1859 + + + + + + + + Point {z} component + 1f9de893-ec37-416d-838b-8ae4e69fa9ee + Z component + Z component + false + 0 + + + + + + 2333 + 1869 + 65 + 20 + + + 2365.5 + 1879 + + + + + + + + + + + + 56b92eab-d121-43f7-94d3-6cd8f0ddead8 + Vector XYZ + + + + + Create a vector from {xyz} components. + true + 37e04157-9996-437d-b7ae-9bba4482d65d + Vector XYZ + Vector XYZ + + + + + + 2447 + 1827 + 127 + 64 + + + 2526 + 1859 + + + + + + Vector {x} component + f01dfad2-f90c-4db0-b3c4-8152090d0e21 + X component + X component + false + 54294e75-31f0-4519-96c7-67914c56f51a + 1 + + + + + + 2449 + 1829 + 65 + 20 + + + 2481.5 + 1839 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector {y} component + d7e31f5b-481c-41cb-92b4-f77070a4dec2 + Y component + Y component + false + 0 + + + + + + 2449 + 1849 + 65 + 20 + + + 2481.5 + 1859 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector {z} component + 761c62aa-9f75-4f1b-92e2-780a812979c3 + Z component + Z component + false + 0 + + + + + + 2449 + 1869 + 65 + 20 + + + 2481.5 + 1879 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Vector construct + 98261cb3-7be1-4611-8b0e-c2014b70e2e2 + Vector + Vector + false + 0 + + + + + + 2538 + 1829 + 34 + 30 + + + 2555 + 1844 + + + + + + + + Vector length + cbdf42e3-e56c-44da-95cc-4c05243fc13e + Length + Length + false + 0 + + + + + + 2538 + 1859 + 34 + 30 + + + 2555 + 1874 + + + + + + + + + + + + e9eb1dcf-92f6-4d4d-84ae-96222d60f56b + Move + + + + + Translate (move) an object along a vector. + true + 3e5fdf21-8234-4ea8-bed1-b5fc9fc39731 + Move + Move + + + + + + 2559 + 1752 + 126 + 44 + + + 2621 + 1774 + + + + + + Base geometry + e94146d8-4946-40aa-9fbf-c2e7747953d2 + Geometry + Geometry + true + edcd7d3d-fd27-48be-8d4f-709654e17fe5 + 1 + + + + + + 2561 + 1754 + 48 + 20 + + + 2585 + 1764 + + + + + + + + Translation vector + f4dc9c01-d9fc-46fc-87fe-b035a2ee7632 + Motion + Motion + false + 98261cb3-7be1-4611-8b0e-c2014b70e2e2 + 1 + + + + + + 2561 + 1774 + 48 + 20 + + + 2585 + 1784 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 10 + + + + + + + + + + + + Translated geometry + 864dfd4b-0ca3-4c95-866b-54a326e689ff + Geometry + Geometry + false + 0 + + + + + + 2633 + 1754 + 50 + 20 + + + 2658 + 1764 + + + + + + + + Transformation data + fd3b0384-9e97-4c55-981c-11adf855dd38 + Transform + Transform + false + 0 + + + + + + 2633 + 1774 + 50 + 20 + + + 2658 + 1784 + + + + + + + + + + + + d5967b9f-e8ee-436b-a8ad-29fdcecf32d5 + Curve + + + + + Contains a collection of generic curves + true + 2690fc68-80e3-45ed-ba28-a73d0acf282d + Curve + Curve + false + 864dfd4b-0ca3-4c95-866b-54a326e689ff + 1 + + + + + + 2369 + 712 + 50 + 24 + + + 2394.259 + 724.0868 + + + + + + + + + + b6236720-8d88-4289-93c3-ac4c99f9b97b + Relay + + + + + 2 + A wire relay object + 8e03a14f-eb65-4608-906c-918b0d1923ff + Relay + + false + 74fee499-31ac-4fd7-8d88-534b634cdc5e + 1 + + + + + + 1543 + 1785 + 40 + 16 + + + 1563 + 1793 + + + + + + + + + + 2b69bf71-4e69-43aa-b7be-4f6ce7e45bef + Quick Graph + + + + + 1 + Display a set of y-values as a graph + 5132cd81-5c64-42b0-8064-da142e41889e + Quick Graph + Quick Graph + false + 0 + fba4a0b5-d761-41e8-98e6-857040e4a72f + 1 + + + + + + 2359 + 365 + 150 + 150 + + + 2359.421 + 365.632 + + -1 + + + + + + + + + + + + + + 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 + + + + + \ No newline at end of file