Scale, Rotate and Translate (Move) in RhinoScript vbScript

Un ejemplillo de como rotar, trasladar y escalar objetos en rhinoceros con vbscript.
Por cierto, tambien se puede usar la función Rhino.TransformObject que usa las matrices de transformación con coordenadas homogeneas, ya escribiré algo sobre esto :).

Sub ScaleAndMove()
	Dim idBox, idBoxNew
	
	' MOVER/TRASLADAR
	idBox = DrawCube(20, 0, 0, 10)
	idBoxNew = DrawCube(20, 0, 0, 10)
	Rhino.ObjectColor idBoxNew, RGB(200, 0, 0)
	Rhino.MoveObject idBox, Array(0, 0, 0), array(0, 10, 0)
	
	'ESCALAR
	idBox = DrawCube(20, 0, 0, 10)
	Rhino.ScaleObject idBox, Array(0, 0, 0), array(0.95,0.95,0.95)
	
	' ROTAR
	idBoxNew = Rhino.RotateObject(idBox, Array(0, 0, 0), 45, array(1, 0, 0), True)
	Rhino.ObjectColor idBoxNew, RGB(200, 0, 0)
End Sub

Variant To The Power.

Ya está!, me quedo con vbVariant para implementar mis vectores, por varias razones:

– Los vectores no se pueden asignar unos a otros, me toca copiar elemento a elemento, los variant, como son variant conteniendo valores (da igual la forma) si se pueden copiar con una asignación directamente :).
– Las variant pueden cambiarse de tamaño como los vectores dinámicos, en ese momento será un vector.
– Las variant pueden contener el tipo que devuelve la función Array(lst_args) que tambien es interesante poder usarlo en cualquier momento, en ese momento sera un vector.

Afirmamos mas así que los vectores de variant y los variant que contienen vectores no son lo mismo. Sin embargo, con los variant tengo las ventajas de los dos, por ser variant puedo hacer todo lo que quiera hacer con un variant, por ser su subtipo vector dinamico puedo hacer todo lo que puedo hacer con un vector dinamico, que le den a los bytes, de momento :D.

VBScript Variant Type

Bueno, el tema es que vengo de C++ y el tipo Variant me está volviendo loco, claro si estuviera en visual basic no script le pongo tipo a todas las variables y me movería en mi salsa, pero en vbscript todas las variables son de tipo variant :). Empecemos.

Scalar Variables and Array Variables.
Las variables de tipo escalar son las variables que solo pueden contener un valor y las variables de tipo vector son las variables que pueden contener mas de un valor. Esta explicación la he sacao de la web de msdn y me ha parecido bastante interesante.

Dim radio, lado ' son variables escalares, solo podrán contener un valor
Dim sup(2) ' podrá contener 3 valores, alojados en sup(0), sup(1) y sup(2)
Dim lstObjetos() ' podrá contener los valores que yo especifique con Redim lstObjetos(tamaño)

radio = 3
sup(0) = 1
sup(1) = 2
sup(2) = "jander crander"
Redim lstObjetos(2) ' tendremos ahora posibilidad de almacenar 3 valores.

Data Types
Pues mirando los tipos de datos de las variables me encontre con que, en VBScript las variables solo pueden ser de tipo vbVariant. O sea que las variables solo pueden de tipo variante (variables variantes?? como la ensaladilla :D).
Miremos el dicccionario, una variable es algo que puede cambiar de valor y una variante es algo que puede cambiar de forma, esto ayuda algo no?. Asi que, la variables son de tipo vbVariant pero tienen subtipo, que es el tipo del valor que se le asigno, real, entero, caracter…

Mixing
Todas las variables son variant, pueden contener un valor de cualquier tipo de datos. Si ademas, declaro una variable vector, el tipo de cada elemento sera variant :).

Where is the problem then?
En la función Array(list_args), esta maravillosa función devuelve una variable variant que contiene un vector de 3 elementos que no es lo mismo que un vector de 3 variants, aunque el acceso a cada elemento en ambas variables se realiza de la misma forma.

Dim variante, estatico(2)
variante = Array(2, 2, 2)
estatico = Array(2, 2, 2) ' esto falla porque los tipos no son el mismo, aunque es toneria
' porque realmete no deja asignar un vector a otro mediante el operador asignación, hay
' copiarlos campo a campo, entonces no te das cuenta de que tipo son.

PD: si no queda claro, es porque estas cosas es mejor explicarlas en una pizarra con ejemplos, asi que
siempre podeis venir a la academia :).

Bucles 1.

Option Explicit
'Script written by 
'Script copyrighted by 
'Script version jueves, 13 de agosto de 2009 9:05:47

'Cambiar esta llamada para ir cambiando el procedimiento que ejecuta el script.
Call Main5()

Sub Main()
	Dim x
	
	x = 1
	Do While x <= 10
		Rhino.AddPoint(Array(x, 5, 0))
		x = x + 1
	Loop
	
End Sub

Sub Main2()
	Dim x, cuantosLLevo, cuantosQuiero
	
	x = 1
	cuantosQuiero = Rhino.GetInteger("Cuantos puntos dibujo?")
	cuantosLLevo = 0
	Do While cuantosLLevo < cuantosQuiero
		Rhino.AddPoint Array(x, 1, 0)
		x = x + 1
		cuantosLlevo = cuantosLLevo + 1
	Loop
End Sub


Sub Main3()
	Dim x, cuantosLLevo, cuantosQuiero
	
	x = 1
	cuantosQuiero = Rhino.GetInteger("Cuantos puntos dibujo?")
	Do While cuantosQuiero <= 0
		Rhino.Print("Disculpe. El valor debe ser positivo")
		cuantosQuiero = Rhino.GetInteger("Cuantos puntos dibujo?")
	Loop
	
	cuantosLLevo = 0
	Do While cuantosLLevo < cuantosQuiero
		Rhino.AddPoint Array(x, 1, 0)
		x = x + 1
		cuantosLlevo = cuantosLLevo + 1
	Loop
End Sub


Sub Main4()
	Dim x, cuantosLLevo, cuantosQuiero, distancia
	
	distancia = Rhino.GetInteger("Distancia entre puntos?")
	Do While distancia <= 0
		Rhino.Print("Disculpe. La distancia debe ser positiva.")
		distancia = Rhino.GetInteger("Distanca entre puntos?")
	Loop
	
	cuantosQuiero = Rhino.GetInteger("Cuantos puntos dibujo?")
	Do While cuantosQuiero <= 0
		Rhino.Print("Disculpe. El valor debe ser positivo")
		cuantosQuiero = Rhino.GetInteger("Cuantos puntos dibujo?")
	Loop
	
	cuantosLLevo = 0
	x = 1
	Do While cuantosLLevo < cuantosQuiero
		Rhino.AddPoint Array(x, 1, 0)
		x = x + distancia
		cuantosLlevo = cuantosLLevo + 1
	Loop
End Sub

Sub Main5()
	Dim x, y, d, h, numPuntos, totalPuntos

	d = Rhino.GetInteger("Distancia?")
	h = Rhino.GetInteger("Altura?")
	totalPuntos = Rhino.GetInteger("Total de puntos?")
	
	x = 1
	y = 1
	numPuntos = 0
	Do While numPuntos <= totalPuntos
		Rhino.AddPoint Array(x, y, 0)
		x = x + d
		If numPuntos Mod 2 = 0 Then
			y = 1 + h
		Else
			y = 1
		End If
		numPuntos = numPuntos + 1
	Loop
End Sub

Los procedimientos van de menos a mas complejidad. Si quereis probarlos solo
tendreis que cambiar la llamada al procedimiento.

VBScript if else

Option Explicit
'Script written by 
'Script copyrighted by 
'Script version martes, 11 de agosto de 2009 9:37:31

' Procedimiento que imprime los dos puntos introducidos por el usuario
' por orden de mas cercano al origen.
Sub Main()
	Dim punto1, punto2, d1, d2
	
	punto1 = Rhino.GetPoint("Punto 1: ")
	punto2 = Rhino.GetPoint("Punto 2: ")
	
	d1 = (punto1(0)^2 + punto1(1)^2 + punto1(2)^2)^0.5
	d2 = (punto2(0)^2 + punto2(1)^2 + punto2(2)^2)^0.5
	
	If d1 > d2 Then
		Rhino.Print punto2(0) & ", " & punto2(1) & ", " & punto2(2)
		Rhino.Print punto1(0) & ", " & punto1(1) & ", " & punto1(2)
	Else
		Rhino.Print punto1(0) & ", " & punto1(1) & ", " & punto1(2)
		Rhino.Print punto2(0) & ", " & punto2(1) & ", " & punto2(2)
	End If
End Sub

' Lo mismo con el anterior pero con las funciones de la libreria.
Sub Main2()
	Dim punto1, punto2, d1, d2, puntoOrigen
	
	punto1 = Rhino.GetPoint("Punto 1: ")
	punto2 = Rhino.GetPoint("Punto 2: ")
	puntoOrigen = Array(0, 0, 0)
	
	d1 = Rhino.Distance(puntoOrigen, punto1)
	d2 = Rhino.Distance(puntoOrigen, punto2)
	
	If d1 > d2 Then
		Rhino.Print Rhino.Pt2Str(punto2)
		Rhino.Print Rhino.Pt2Str(punto1)
	Else
		Rhino.Print Rhino.Pt2Str(punto1)
		Rhino.Print Rhino.Pt2Str(punto2)
	End If
	
End Sub

' Lo mismo que el anterior pero con 3 puntos.
' Además añade una polilinea que empezando en el origen pasa por
' los 3 puntos.

Sub Main3()
	Dim punto1, punto2, punto3, auxPunto, d1, d2, d3, auxD, po
	
	
	punto1 = Rhino.GetPoint("Punto 1: ")
	punto2 = Rhino.GetPoint("Punto 2: ")
	punto3 = Rhino.GetPoint("Punto 3: ")
	po = Array(0, 0, 0)
	
	d1 = Rhino.Distance(po, punto1)
	d2 = Rhino.Distance(po, punto2)
	d3 = Rhino.Distance(po, punto3)
	
	
	If d3 < d2 Then
		' Intercambiamos las distancias
		auxD = d3
		d3 = d2
		d2 = auxD
		' Intercambiamos los puntos correspondientes
		auxPunto = punto3
		punto3 = punto2
		punto2 = auxPunto
	End If
		
	If d2 < d1 Then
		auxD = d2
		d2 = d1
		d1 = auxD
		auxPunto = punto2
		punto2 = punto1
		punto1 = auxPunto
	End If
	
	If d3 < d2 Then
		' Intercambiamos las distancias
		auxD = d3
		d3 = d2
		d2 = auxD
		' Intercambiamos los puntos correspondientes
		auxPunto = punto3
		punto3 = punto2
		punto2 = auxPunto
	End If
	
	Rhino.Print Rhino.pt2str(punto1)
	Rhino.Print Rhino.Pt2Str(punto2)
	Rhino.print Rhino.Pt2Str(punto3)
	
	Rhino.AddLine po, punto1
	Rhino.AddLine punto1, punto2 
	Rhino.AddLine punto2, punto3
	
End Sub

Mas ejemplos de if - else. Taras siento el retraso, la próxima vez los colgaré al acabar la clase.

mcts exam 70-536

Bueno he elegido este como primer titulo Microsoft, a ver si lo consigo. Trata sobre «.NET FRAMEWORK 2.0 Application development foundation» y voy a seguir el libro oficial, que consta de nada menos que 1040 páginas aproximadamente. He empezado a leerlo y comenta que necesitas haber programado dos años en vistual studio, ya veremos si es verdad :D.