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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