Mes: agosto 2009
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.