2009年4月22日星期三

UnEvenOffset + Rondom scale Copier

 

optionb

screen copy

 a副本

Rondom Copier:

Option Explicit
'Script written by <Xarch.blogspot.com>
'Script copyrighted by <insert company name>
'Script version Thursday, April 09, 2009 11:00:35 AM

Call LEAVES()
Sub LEAVES()
    Dim anglestart:anglestart=0 'prerotate degree
    Dim anglerand:anglerand=5 'random rotate degree    
    Dim scalestart:scalestart=1 'starting scale factor
    Dim scaleend:scaleend=0.4 'ending scale factor
    Dim scalerand:scalerand=0.8 'random scale factor range(0-1)
    Dim biasRetaindeletion:biasRetaindeletion=80 ' range (0-100) keep 60 out of 100, delete randomly 40, 100 mean keep all

    Dim num:num=rhino.GetInteger("howmany?",30,2)
    Dim initLv:initLv=rhino.getobject("Select the leave",,True,True)
    Dim copypt:copypt=rhino.GetPoint("the copy base point?")
    Dim pathes:pathes=rhino.GetObjects("select the pathes",4)
    Dim path,i,copytargpt,dup,dup2,rotangle,tengentvec,scalefactor,mirrorline
    rhino.EnableRedraw False
    For Each path In pathes
        For i=1 To num-1
        copytargpt=rhino.DivideCurveLength(path,(rhino.CurveLength(path)/num))(i)
            dup=rhino.CopyObject(initLv, copypt,copytargpt)
            dup2=rhino.copyObject(initLv, copypt,copytargpt)
            tengentvec=rhino.CurveTangent(path,rhino.CurveClosestPoint(path,copytargpt))       
            If tengentvec(1)>=0 Then
                rotangle=90+rhino.Angle2(array(array(0,0,0),array(1,0,0)),array(array(0,0,0),tengentvec))(0)
            Else
                rotangle=90-rhino.Angle2(array(array(0,0,0),array(1,0,0)),array(array(0,0,0),tengentvec))(0)
            End If
            rhino.RotateObject dup,copytargpt,(rotangle-anglestart+anglerand*2*(rnd-0.5))
            rhino.RotateObject dup2,copytargpt,(rotangle-anglestart+anglerand*2*(rnd-0.5))
            rhino.mirrorObject dup2,copytargpt,rhino.PointAdd(copytargpt,tengentvec)
            scalefactor=(((scaleend-scalestart)*(i-1))/num+scalestart)*((1-scalerand)*rnd+scalerand)
            rhino.ScaleObject dup,copytargpt,array(scalefactor,scalefactor,1)

            scalefactor=(((scaleend-scalestart)*(i-1))/num+scalestart)*((1-scalerand)*rnd+scalerand)
            rhino.ScaleObject dup2,copytargpt,array(scalefactor,scalefactor,1)
            If (rnd-biasRetaindeletion/100)>0 Then
                rhino.DeleteObject dup
            End If
            If (rnd-biasRetaindeletion/100)>0 Then
                rhino.DeleteObject dup2
            End If       
        Next
    Next
    rhino.EnableRedraw True
End Sub

-----------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------

UnEvenOffset:

Option Explicit
'Script written by <Xarch.blogspot.com>
'Script copyrighted by <Xarch.blogspot.com>
'Script version Monday, April 20, 2009 5:08:21 PM

Call Main()
Sub Main()
    Dim lines:lines=rhino.GetObjects("select lines to uneven-offset",4,True,True)
    Dim pt1,disstart,pt2,disend,BlnEndcap
    Dim q1:q1=rhino.Getstring("offset distance at start?","Click_on_Screen",array

("ESC_for_typein"))
    If isnull(q1) Or q1="ESC_for_typein" Then
        disstart=rhino.GetReal("offset distance at start?")
        If isnull(disstart) Then Exit Sub
    End If   
    If q1="Click_on_Screen" Then
        pt1=rhino.GetPoints(True,,"offset distance at

start?",,1,rhino.CurveStartPoint(lines(0)))
        disstart=rhino.distance(rhino.CurveStartPoint(lines(0)),pt1(0))
    End If
    Dim q2:q2=rhino.Getstring("offset distance at end?","Click_on_Screen",array

("O","ESC_for_typein"))
    If isnull(q2) Or q2="ESC_for_typein" Then
        disend=rhino.GetReal("offset distance at end?")
        If isnull(disend) Then Exit Sub
    End If
    If q2="0" Or q2="O" Then disend=0
    If q2="Click_on_Screen" Then
        pt2=rhino.GetPoints(True,,"offset distance at end?",,1,rhino.CurveendPoint

(lines(0)))
        disend=rhino.distance(rhino.CurveendPoint(lines(0)),pt2(0))
    End If
    If disend<>0 Then
        'Dim q3:q3=rhino.GetString("cap end?","yes")
        'If q3="yes" Then BlnEndcap=1
        BlnEndcap=1
    End If
    Dim line,offlines,cap
    Dim strLayer
    strLayer=Rhino.AddLayer("offsetCrvs", RGB(255, 0, 0))
    For Each line In lines
        offlines=movepts(line,disstart,disend,BlnEndcap)

    Next
End Sub

Function movepts(ByVal line,ByVal disstart,ByVal disend,ByVal BlnEndcap)
    Dim CvPts:CvPts=rhino.CurvePoints(line)
    Dim num:num=ubound(CvPts)
    Dim newCvPts1(),newCvPts2(),newCvPts3(6),distance(),closestNum(),CurvatureVec

(),moveVec1(),moveVec2()
    Dim i
    For i=0 To num
        ReDim Preserve closestNum(i)
        ReDim Preserve distance(i)
        ReDim Preserve CurvatureVec(i)
        ReDim Preserve moveVec1(i)
        ReDim Preserve moveVec2(i)
        ReDim Preserve newCvPts1(i)
        ReDim Preserve newCvPts2(i)
        closestNum(i)=rhino.CurveClosestPoint(line,CvPts(i))       
        distance(i)=(disend*(closestNum(i)-rhino.CurveDomain(line)(0)_
            )+disstart*(rhino.CurveDomain(line)(1)-closestNum(i)))/(_
            rhino.CurveDomain(line)(1)-rhino.CurveDomain(line)(0))
        CurvatureVec(i)=rhino.VectorCrossProduct( array(0,0,1),rhino.CurveCurvature

(line,closestNum(i))(1))
        moveVec1(i)=rhino.VectorScale(rhino.VectorUnitize(CurvatureVec(i)),distance

(i))
        moveVec2(i)=rhino.VectorReverse(moveVec1(i))
        'rhino.AddLine rhino.EvaluateCurve(line,closestNum(i)),rhino.PointAdd

(rhino.EvaluateCurve(line,closestNum(i)),moveVec1(i))
        newCvPts1(i)=rhino.PointAdd(CvPts(i),moveVec1(i))
        newCvPts2(i)=rhino.PointAdd(CvPts(i),moveVec2(i))
    Next
    Dim cv()
    ReDim Preserve cv(0)
    cv(0)=rhino.AddCurve(newCvPts1)   
    rhino.objectlayer cv(0),"offsetCrvs"
    ReDim Preserve cv(1)
    cv(1)=rhino.AddCurve(newCvPts2)
    rhino.objectlayer cv(1),"offsetCrvs"
    If BlnEndcap=1 Then
        Dim vecExt1,vecExt2
        vecExt1=rhino.VectorScale(rhino.VectorUnitize(rhino.curvetangent(cv

(0),rhino.CurveDomain(cv(0))(1))),disend)
        vecExt2=rhino.VectorScale(rhino.VectorUnitize(rhino.curvetangent(cv

(1),rhino.CurveDomain(cv(1))(1))),disend)
        newCvPts3(0)=rhino.CurveEndPoint(cv(0))
        newCvPts3(1)=rhino.PointAdd(newCvPts3(0),vecExt1)
        newCvPts3(2)=rhino.PointAdd(newCvPts3(1),vecExt1)
        newCvPts3(6)=rhino.CurveEndPoint(cv(1))
        newCvPts3(5)=rhino.PointAdd(newCvPts3(6),vecExt2)
        newCvPts3(4)=rhino.PointAdd(newCvPts3(5),vecExt2)
        newCvPts3(3)=rhino.pointscale (rhino.PointAdd (rhino.pointadd (newCvPts3

(4),vecExt2),rhino.pointadd (newCvPts3(2),vecExt1)),0.5)
        ReDim Preserve cv(2)
        cv(2)=rhino.AddCurve(newCvPts3)
        rhino.objectlayer cv(2),"offsetCrvs"
    End If

    movepts=cv
End Function