Developed to simulate the little bit of randomness which exists when you hand-make things and place them in the real world this tool simply shakes things up a little bit. Simply this rhinoscript uses a random function to produced minor variations in Position (move), Orientation (rotation), and Dimension (scale) within a range specified by the user.
Rhino Script
Option Explicit 'Script written by <David Mans> 'Script copyrighted by <NeoArchaic Studio> 'Script version Tuesday, January 19, 2010 11:41:24 PM Call Main() Sub Main() Dim arrInputs, arrTemp, intCount, arrSorting(), arrGroups arrTemp = Rhino.GetObjects("Select Objects to Tile",, True) If isNull(arrTemp) Then Exit Sub arrGroups = SelectedGroups(arrTemp) intCount = uBound(arrGroups) ReDim arrSorting(intCount) arrInputs = Rhino.PropertyListBox(array("Rotation Min", "Rotation Max", "Move", "Scale% Min", "Scale% Max"), array(0, 360, 0, 100, 100), "Jitter") If isnull(arrinputs) Then Exit Sub Dim i, cnPt Call Rhino.EnableRedraw(False) For i = 0 To intCount Step 1 arrSorting(i) = Rhino.ObjectsByGroup(arrGroups(i)) cnPt = boundingBoxCenterPoint(arrSorting(i)) Call Rhino.ScaleObjects(arrSorting(i), cnPt, array(random(arrInputs(3) * 0.01, arrInputs(4) * 0.01), random(arrInputs(3) * 0.01, arrInputs(4) * 0.01), random(arrInputs(3) * 0.01, arrInputs(4) * 0.01)), False) Call Rhino.RotateObjects(arrSorting(i), cnPt, random(arrInputs(0), arrInputs(1)), Rhino.WorldXYPlane()(1), False) Call Rhino.RotateObjects(arrSorting(i), cnPt, random(arrInputs(0), arrInputs(1)), Rhino.WorldXYPlane()(2), False) Call Rhino.RotateObjects(arrSorting(i), cnPt, random(arrInputs(0), arrInputs(1)), Rhino.WorldXYPlane()(3), False) Call Rhino.MoveObjects(arrSorting(i), cnPt, array(cnPt(0) + random(-1 * arrInputs(2), arrInputs(2)), cnPt(1) + random(-1 * arrInputs(2), arrInputs(2)), cnPt(2) + random(-1 * arrInputs(2), arrInputs(2)))) Next Call Rhino.EnableRedraw(True) End Sub Function SelectedGroups(arrObjects) SelectedGroups = Null Dim arrGroups(), strGroup Dim i, nCount, bAppend nCount = -1 For i = 0 To UBound(arrObjects) bAppend = False strGroup = Rhino.ObjectTopGroup(arrObjects(i)) If Not IsNull(strGroup) Then If (nCount = -1) Then bAppend = True ElseIf (FindGroup(strGroup, arrGroups) = -1) Then bAppend = True End If If bAppend = True Then nCount = nCount + 1 ReDim Preserve arrGroups(nCount) arrGroups(nCount) = strGroup End If End If Next If (nCount > -1) Then SelectedGroups = arrGroups End Function Function FindGroup(strGroup, arrGroups) Dim i FindGroup = -1 For i = 0 To UBound(arrGroups) If (StrComp(strGroup, arrGroups(i), 1) = 0) Then FindGroup = i Exit Function End If Next End Function Function boundingBoxCenterPoint(arrInputs) boundingBoxCenterPoint = Null Dim b,arrPt b = Rhino.BoundingBox(arrInputs) arrPt = array(b(0)(0) + (b(1)(0) - b(0)(0)) * 0.5, b(0)(1) + (b(3)(1) - b(0)(1)) * 0.5, b(0)(2) + (b(4)(2) - b(0)(2)) * 0.5) boundingBoxCenterPoint = arrPt End Function Function random(min, max) random = Null Dim dblValue: dblValue = min + (max - min) * rnd() random = dblValue End Function