

Este script identifica una superfice cualquiera,donde imprime sobre ella una matriz de puntos con los que construye por cada 4 puntos una segunda superfice, una curva cerrada y una polilinea.
Desde el centro de la segunda Superfice se calcula una normal, que será el camino por el cual la curva cerrada sera copiada.
Luego de que la Curva se encuentre en el extremo de la "Normal" está es escalada por un factor y a continuación se realiza una superficie de transición entre la curva cerrada escalada y la polilinea.
Script:
Option Explicit
'carlos de la b. diciembre2006
Call FaceteadoSuperficie()
Sub FaceteadoSuperficie()
'declaracion de variables
Dim strSurface
Dim arrDomainU, arrDomainV
Dim arrParamU, arrParamV, arrPoint
Dim i, j
Dim secu, secv
'divisiones de superficie
secu = 16 'numero de columnas
secv = 16 'numero de puntos por columna
'declaracion de matrices
ReDim colec2d(secu,secv)
'input
strSurface = Rhino.GetObject("Seleccione superficie")
If IsNull(strSurface) Then Exit Sub
arrDomainU = Rhino.SurfaceDomain(strSurface, 0)
arrDomainV = Rhino.SurfaceDomain(strSurface, 1)
'loop
For i = 0 To secu
For j = 0 To secv
'divisiones
arrParamU = arrDomainU(0) + i * (arrDomainU(1) - arrDomainU(0)) / secu
arrParamV = arrDomainV(0) + j * (arrDomainV(1) - arrDomainV(0)) / secv
arrPoint = Rhino.EvaluateSurface(strSurface, Array(arrParamU, arrParamV))
Rhino.AddPoint arrPoint
colec2d(i,j) = arrPoint
Next
Next
'matrix
Dim esquina1
Dim esquina2
Dim esquina3
Dim esquina4
Dim Curva, QuadSurface, Edge
Dim newarrPoint, Normal, LineNormal, path
'valores de la coleccion
esquina1 = colec2d(1,1)
esquina2 = colec2d(1,2)
esquina3 = colec2d(2,2)
esquina4 = colec2d(2,1)
'loop matrix
For i = 0 To (secu - 1)
For j = 0 To (secv - 1)
esquina1 = colec2d(i,j)
esquina2 = colec2d(i + 1,j)
esquina3 = colec2d(i + 1,j + 1)
esquina4 = colec2d(i,j + 1)
'llamada de funciones
Dim quad: quad = mifuncionplacas(esquina1,esquina2,esquina3,esquina4, Curva, QuadSurface, Edge)
Dim GetNormal: GetNormal = mifuncionNormal(newarrPoint, Normal, LineNormal, path, QuadSurface)
Dim Chupon: Chupon = mifuncionVentosa(Curva, newarrPoint, path, Edge)
Dim Escondida: Escondida = mifuncionHide(strSurface, QuadSurface)
Next
Next
End Sub
'funciones
Function mifuncionplacas(esquina1, esquina2, esquina3, esquina4, Curva, QuadSurface, Edge)
QuadSurface = Rhino.AddSrfPt(Array(esquina1, esquina2, esquina3, esquina4))
Curva = Rhino.AddCurve(Array(esquina1, esquina2, esquina3, esquina4, esquina1))
Edge = Rhino.addPolyline(Array(esquina1, esquina2, esquina3, esquina4, esquina1))
End Function
Function mifuncionNormal(newarrPoint, Normal, LineNormal, path, QuadSurface)
Dim newDomainU, newDomainV
Dim newarrParameterU, newarrParameterV
newDomainU = Rhino.SurfaceDomain(QuadSurface,0)
newDomainV = Rhino.SurfaceDomain(QuadSurface,1)
newarrParameterU = (newDomainU(1) - newDomainU(0))/2
newarrParameterV = (newDomainV(1) - newDomainV(0))/2
newarrPoint = Rhino.EvaluateSurface(QuadSurface, Array(newarrParameterU, newarrParameterV))
Rhino.AddPoint newarrPoint
Normal = Rhino.SurfaceNormal(QuadSurface, Array(newarrParameterU, newarrParameterV))
LineNormal = Rhino.addLine (newarrPoint, Rhino.VectorAdd(newarrPoint, Normal))
path = Rhino.ExtendCurveLength (LineNormal, 0, 1, 18)
End Function
Function mifuncionVentosa(Curva, newarrPoint, path, Edge)
Dim arrEnd
Dim pathDomain, pathParameter
pathDomain = Rhino.CurveDomain(path)
pathParameter = pathDomain(1)
arrEnd = Rhino.EvaluateCurve(path, pathParameter)
Rhino.AddPoint arrEnd
Rhino.MoveObject Curva, newarrPoint, arrEnd
Rhino.ScaleObject Curva, arrEnd, Array(.8, .8, .8)
Rhino.AddLoftSrf Array(Curva, Edge),,,3
End Function
Function mifuncionHide(strSurface, QuadSurface)
Rhino.HideObject (strSurface)
Rhino.HideObjects Array(QuadSurface)
End Function

Superficie Reactiva 2
Publicado por Grupo de Diseño Emergente Sudamericano
2 comentarios Etiquetas: Script
Superficie Reactiva

Este script reconoce la orientacion de un recorrido dado, como podria ser el recorrido del sol:
puntoCardinal1 = Rhino.GetPoint("selecciona el primer punto cardinal")
If IsNull (puntoCardinal1) Then Exit Sub
PuntoCardinal2 = Rhino.GetPoint("selecciona el segundo punto cardinal")
If IsNull (puntoCardinal2) Then Exit Sub
luego selecciona una superfice dada y la subdivide en N*N regiones.
strSurface = Rhino.GetObject("Seleccione superficie")
If IsNull (strSurface) Then Exit Sub
arrParamU = arrDomainU(0) + i * (arrDomainU(1) - arrDomainU(0)) / secu
arrParamV = arrDomainV(0) + j * (arrDomainV(1) - arrDomainV(0)) / secv
Luego calcula el punto medio de cada region y a partir de ese punto genera la "normal" para esa region en particular.
CenterPoint = Rhino.EvaluateSurface(placa, Array(uparamplaca,vparamplaca))
Rhino.AddPoint CenterPoint
Normal = Rhino.SurfaceNormal(placa, Array(uparamplaca, vparamplaca))
LineNormal = Rhino.AddLine(CenterPoint, Rhino.VectorAdd(CenterPoint, Normal))
Cada normal es comparada con la orientacion original y devuelve un angulo.
arrAngle = Rhino.Angle2(arrLine1, arrLine2)
si el angulo de incidencia es perpendicular al plano de la region el resultado es color rojo.
If arrAngle(0) >= 90 Then
Rhino.ObjectColor placa, RGB(250,0,0)
si el angulo de incidencia esta entre los 45 y 90 grads. el color es magenta.
ElseIf arrAngle(0) > 45 And arrAngle(0) <= 89 Then
Rhino.ObjectColor placa, RGB(250,0,255)
y si el angulo está por debajo de los 45 grados, siendo la zona obscura o con sombra de la superficie el color el azul.
Else
Rhino.ObjectColor placa, RGB(0,0,255)
End If
End Function

Publicado por Grupo de Diseño Emergente Sudamericano
0 comentarios Etiquetas: Script
Funcion "N"


Este es un simple Script (rhino script) que identifica dos circulos y los divide en x puntos, donde cada punto sale una curva que intersecta un tercer punto llamado "N" ficticio en el espacio. Luego el script identifica cada curva y la transforma en una tuberia.
El punto "N" en el primer ejercicio es "N = Array((Sin(i*10)),(Cos(i*10)),(i*10))" en coordenadas x,y,Z la funcion N en este sentido es muy parecida a la ecuacion de una helice " x = cos@, y = sin@, z = tan@ ".
EN el segundo ejercicio " N = Array((Sin(i*(10*Rnd))),(Cos(i*(10*Rnd))),(i*10)) " Rnd es una funcion aleatoria.
Publicado por Grupo de Diseño Emergente Sudamericano
0 comentarios Etiquetas: Script