Tìm kiếm Blog này
Thứ Ba, 17 tháng 8, 2010
Weave A
Option Explicit
'Script written by <David Mans>
'Script copyrighted by <Neoarchaic Design>
'Script version Saturday, October 04, 2008 7:52:05 PM
Call Main()
Sub Main()
Dim surface, weave, arrItems, arrValues, arrResults
surface = Rhino.GetObject("Select Surface",8)
If isNull(surface) Then Exit Sub
Call reparameterize(surface)
arrItems = array("Warp Strands","Weft Strands","Depth")
arrValues = array(10,10,0.5)
arrResults = Rhino.PropertyListBox (arrItems, arrValues ,,"Weave Settings")
If isNull(arrResults) Then Exit Sub
Call Rhino.EnableRedraw(False)
weave = crossWeave(surface,CDbl(arrResults(0)),CDbl(arrResults(1)),CDbl(arrResults(2)))
Call Rhino.EnableRedraw(True)
End Sub
Function crossWeave(surface,cols,rows,depth)
crossWeave = Null
cols = cols*2
rows = rows*2
Dim i, j, r, s, count, uDom, vDom, origin, srfNorm,crvCount
crvCount = cols*0.5+rows*0.5-1
Dim boolVal(), blnVal(), normal(1),norm(),nrm(),crvs(),xcrvs()
ReDim boolVal(rows), blnVal(cols)
ReDim norm(rows),nrm(cols),crvs(crvCount),xcrvs(crvCount)
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
boolVal(j) = array(0,1)
origin = array(uDom/(cols)*i,vDom/(rows)*j)
srfNorm = Rhino.VectorScale(Rhino.VectorUnitize(Rhino.SurfaceNormal(surface,origin)),depth)
normal(0) = Rhino.PointAdd(Rhino.EvaluateSurface(surface,origin),srfNorm)
normal(1) = Rhino.PointAdd(Rhino.EvaluateSurface(surface,origin),Rhino.VectorReverse(srfNorm))
norm(j) = normal
Next
blnVal(i) = boolVal
nrm(i) = norm
Next
Dim ptA(),ptB(),ptC(),ptD()
If cols>rows Then
count = cols
Else
count = rows
End If
s=0
For i = 1 To count Step 1
r=0
ReDim ptA(0), ptB(0)
If i Mod(2) Then
If cols > rows Then
If i < rows Then
For j = 0 To i Step 1
ReDim Preserve ptA(r)
blnVal(j)(i-j) = flipMe(r+1)
ptA(r) = nrm(j)(i-j)(blnVal(j)(i-j)(0))
r=r+1
Next
crvs(s) = Rhino.AddInterpCurve(ptA)
r=0
For j = 0 To rows-i Step 1
ReDim Preserve ptB(r)
blnVal(cols-rows+i+j)(rows-j) = flipMe(r)
ptB(r) = nrm(cols-rows+i+j)(rows-j)(blnVal(cols-rows+i+j)(rows-j)(0))
r=r+1
Next
crvs(cols*0.5+s) = Rhino.AddInterpCurve(ptB)
s=s+1
Else
For j = 0 To rows Step 1
ReDim Preserve ptA(r)
blnVal(i-rows+j)(rows-j) = flipMe(r)
ptA(r) = nrm(i-rows+j)(rows-j)(blnVal(i-rows+j)(rows-j)(0))
r=r+1
Next
crvs(s) = Rhino.AddInterpCurve(ptA)
s=s+1
End If
ElseIf rows > cols Then
If i < cols Then
For j = 0 To i Step 1
ReDim Preserve ptA(r)
blnVal(j)(i-j) = flipMe(r)
ptA(r) = nrm(j)(i-j)(blnVal(j)(i-j)(0))
r=r+1
Next
crvs(s) = Rhino.AddInterpCurve(ptA)
r=0
For j = 0 To cols-i Step 1
ReDim Preserve ptB(r)
blnVal(i+j)(rows-j) = flipMe(r+1)
ptB(r) = nrm(i+j)(rows-j)(blnVal(i+j)(rows-j)(0))
r=r+1
Next
crvs(rows*0.5+s) = Rhino.AddInterpCurve(ptB)
s=s+1
Else
For j = 0 To cols Step 1
ReDim Preserve ptA(r)
blnVal(j)(i-j) = flipMe(r)
ptA(r) = nrm(j)(i-j)(blnVal(j)(i-j)(0))
r=r+1
Next
crvs(s) = Rhino.AddInterpCurve(ptA)
s=s+1
End If
Else
'If they are equal
For j = 0 To i Step 1
ReDim Preserve ptA(r)
blnVal(j)(i-j) = flipMe(r)
ptA(r) = nrm(j)(i-j)(blnVal(j)(i-j)(0))
r=r+1
Next
r=0
For j = 0 To cols-i Step 1
ReDim Preserve ptB(r)
blnVal(i+j)(cols-j) = flipMe(r+1)
ptB(r) = nrm(i+j)(cols-j)(blnVal(i+j)(cols-j)(0))
r=r+1
Next
crvs(s) = Rhino.AddInterpCurve(ptA)
crvs(cols*0.5+s) = Rhino.AddInterpCurve(ptB)
s=s+1
End If
End If
Next
s=0
For i = 1 To count Step 1
r=0
ReDim ptC(0), ptD(0)
If i Mod(2) Then
If cols > rows Then
If i < rows Then
For j = 0 To i Step 1
ReDim Preserve ptC(r), ptD(r)
ptC(r) = nrm(cols-i+j)(j)(blnVal(cols-i+j)(j)(1))
ptD(r) = nrm(j)(rows-i+j)(blnVal(j)(rows-i+j)(1))
r=r+1
Next
xcrvs(s) = Rhino.AddInterpCurve(ptD)
s=s+1
xcrvs(cols*0.5+rows*0.5-s) = Rhino.AddInterpCurve(ptC)
Else
r=0
For j = 0 To rows Step 1
ReDim Preserve ptC(r)
ptC(r) = nrm(i-rows+j)(j)(blnVal(i-rows+j)(j)(1))
r=r+1
Next
xcrvs(s) = Rhino.AddInterpCurve(ptC)
s=s+1
End If
ElseIf rows > cols Then
If i < cols Then
For j = 0 To i Step 1
ReDim Preserve ptC(r), ptD(r)
ptC(r) = nrm(cols-i+j)(j)(blnVal(cols-i+j)(j)(1))
ptD(r) = nrm(j)(rows-i+j)(blnVal(j)(rows-i+j)(1))
r=r+1
Next
xcrvs(s) = Rhino.AddInterpCurve(ptD)
s=s+1
xcrvs(cols*0.5+rows*0.5-s) = Rhino.AddInterpCurve(ptC)
Else
r=0
For j = 0 To cols Step 1
ReDim Preserve ptC(r)
ptC(r) = nrm(j)(i-cols+j)(blnVal(j)(i-cols+j)(1))
r=r+1
Next
s=s+1
xcrvs(rows*0.5+cols*0.5-s) = Rhino.AddInterpCurve(ptC)
End If
Else
For j = 0 To i Step 1
ReDim Preserve ptC(r),ptD(r)
ptC(r) = nrm(cols-i+j)(j)(blnVal(cols-i+j)(j)(1))
ptD(r) = nrm(j)(rows-i+j)(blnVal(j)(rows-i+j)(1))
r=r+1
Next
xcrvs(cols-1-s) = Rhino.AddInterpCurve(ptC)
xcrvs(s) = Rhino.AddInterpCurve(ptD)
s=s+1
End If
End If
Next
crossWeave = array()
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
Function flipMe(input)
flipMe = Null
Dim output(1)
If input Mod(2) Then
output(0) = 0
output(1) = 1
Else
output(0) = 1
output(1) = 0
End If
flipMe = output
End Function
Đăng ký:
Đăng Nhận xét (Atom)
Không có nhận xét nào:
Đăng nhận xét