Transform Each

It may be a very simple script, but it is a handy one to have around. The command is modeled after adobe illustrator’s transform each feature and follows its namesake.

Rhino Script

Option Explicit
'Script written by <David Mans>
'Script copyrighted by <Neoarchaic Design>
'Script version Thursday, April 10, 2008 11:13:06 PM

Call Main()
Sub Main()
	Dim objects
	objects = Rhino.GetObjects("Select Objects")
	If isNull(objects) Then Exit Sub
	Call Rhino.enableredraw(False)
	transformEach(objects)
	Call Rhino.enableredraw(True)
End Sub
Function transformEach(objects)
	transformEach = Null
	Dim arrItems, arrValues, arrReturns
	arrItems = array("rotate_X", "rotate_Y", "rotate_Z", "scale_X", "scale_Y", "scale_Z")
	arrValues = array(0, 0, 0, 1, 1, 1)
	arrReturns = Rhino.PropertyListBox(arrItems, arrValues,, "Transform Parameters")
	If isNull(arrReturns) Then Exit Function
	Dim i,count
	Dim bBox,tempLn,origin,world
	count = uBound(objects)
	For i = 0 To count Step 1
		'determine each objects center
		bBox = Rhino.BoundingBox(objects(i))
		tempLn = Rhino.AddLine(bBox(0), bBox(6))
		origin = Rhino.CurveMidPoint(tempLn)
		world = Rhino.WorldXYPlane()
		'if scale values have been changed scale each object according to each of the three independent world axis
		If arrReturns(3) <> 0 Or arrReturns(4) <> 0 Or arrReturns(5) <> 0  Then
			Call Rhino.ScaleObject(objects(i), origin, array(CDbl(arrReturns(3)), CDbl(arrReturns(4)), CDbl(arrReturns(5))))
		End If
		'if rotation values have been changed rotate each object about its local world based axis
		If arrReturns(0) <> 0 Then
			Call Rhino.RotateObject(objects(i), origin, CDbl(arrReturns(0)), world(1))
		End If
		If arrReturns(1) <> 0 Then
			Call Rhino.RotateObject(objects(i), origin, CDbl(arrReturns(1)), world(2))
		End If
		If arrReturns(2) <> 0 Then
			Call Rhino.RotateObject(objects(i), origin, CDbl(arrReturns(2)), world(3))
		End If
		
		Call Rhino.DeleteObject(tempLn)
	Next
End Function