Tìm kiếm Blog này

Thứ Ba, 17 tháng 8, 2010

Weave B










Option Explicit
'Script written by <David Mans>
'Script copyrighted by <Neoarchaic Design>
'Script version Friday, September 12, 2008 6:05:11 PM

Call Main()
Sub Main()
    Dim surface, arrItems, arrValues, arrResults, rhythmA,rhythmB
    surface = Rhino.GetObject("Select Surface",8)
    If isNull(surface) Then Exit Sub
   
    arrItems = array("Warp Strands","Weft Strands","Depth","Warp Rhythm(up,down...)","Warp Rhythm(up,down...)")
    arrValues = array(10,10,1,"2,3,2","2,3,2")
    arrResults = Rhino.PropertyListBox (arrItems, arrValues ,,"Weave Settings")
   
    rhythmA = split(arrResults(3),",")
    rhythmB = split(arrResults(4),",")
   
    Call Rhino.EnableRedraw(False)
    Call reparameterize(surface)
    Call weave(surface,CDbl(arrResults(0)),CDbl(arrResults(1)),CDbl(arrResults(2)),rhythmA,rhythmB)
    Call Rhino.EnableRedraw(True)
   
   
End Sub
Function weave(surface,cols,rows,scale,rhythmA,rhythmB)
    weave = Null
   
    Dim i,j,r,s,t,u,v
    Dim uDom, vDom
    Dim pts(), ptsX(1), pt()
    ReDim pts(rows),pt(cols)
   
    uDom = Rhino.SurfaceDomain(surface,0)(1)
    vDom = Rhino.SurfaceDomain(surface,1)(1)
    For i = 0 To cols Step 1
        For j = 0 To rows Step 1
            ptsX(0) = Rhino.PointAdd(Rhino.EvaluateSurface(surface,array((uDom/cols)*i,(vDom/rows)*j)),Rhino.VectorScale(Rhino.VectorUnitize(Rhino.SurfaceNormal(surface,array((uDom/cols)*i,(vDom/rows)*j))),scale))
            ptsX(1) = Rhino.PointAdd(Rhino.EvaluateSurface(surface,array((uDom/cols)*i,(vDom/rows)*j)),Rhino.VectorScale(Rhino.VectorUnitize(Rhino.VectorReverse(Rhino.SurfaceNormal(surface,array((uDom/cols)*i,(vDom/rows)*j)))),scale))
            pts(j) = ptsX
        Next
        pt(i) = pts
    Next
   
    Dim a,b
    Dim inverse(),inv(),pointSetA(),pointSetB()
    ReDim inverse(rows),inv(cols),pointSetA(rows),pointSetB(cols)
   
    Dim arrBln(), blnSt
    ReDim arrBln(cols)
   
    u=0
    t=rhythmA(0)
    For i = 0 To cols Step 1
        If u Mod(2) Then
            v=0
        Else
            v=1
        End If
        r=rhythmB(0)
        For j = 0 To rows Step 1
            If v Mod(2) Then
                a = 0: b = 1
            Else
                a = 1: b = 0
            End If
            r=r-1
            If r = 0 Then
                r=rhythmB(s)
                v=v+1
            End If
            If s>uBound(rhythmB)Then
                v=0
            End If
           
            pointSetA(j) = pt(i)(j)(a)
            inverse(j) = b
        Next
        t=t-1
        If t = 0 Then
            t=rhythmA(u)
            u=u+1
           
        End If
        If u>uBound(rhythmA)Then
            u=0
        End If
        inv(i) = inverse
        blnSt = False
        r=0
        For j = 0 To rows Step 1
            r = r+inverse(j)
        Next
        If r = 0 Or r = rows-1 Then
        Else
            Call Rhino.addcurve(pointSetA,3)
        End If
    Next
   
    For i = 0 To rows Step 1
        r=0
        For j = 0 To cols Step 1
            r = r+inv(j)(i)
        Next
       
        For j = 0 To cols Step 1
            pointSetB(j) = pt(j)(i)(inv(j)(i))
        Next
        If r = 0 Or r = cols-1 Then
        Else
            Call Rhino.addcurve(pointSetB,3)
        End If
    Next
End Function
Function reparameterize(strCurveID)
    If Rhino.IsCurve(strCurveID) = True Then
        Call rhino.SelectObject(strCurveID)
        Call rhino.Command("reparameterize 0 1")
        Call rhino.UnselectAllObjects()
    End If
    If Rhino.IsSurface(strCurveID) = True Then
        Call rhino.SelectObject(strCurveID)
        Call rhino.Command("reparameterize 0 1 0 1")
        Call rhino.UnselectAllObjects()
    End If
End Function

Không có nhận xét nào:

Đăng nhận xét

Người theo dõi