logo

MinimalPathways

"""
Script written by <Luis Quinones>
"""

import rhinoscriptsyntax as rs
import math
from System.Drawing import Color
import scriptcontext


def ColorAction(arrVerts,color,pos):

    index = rs.PointArrayClosestPoint(arrVerts,pos)

    result = color[index]
    
    colorR = rs.ColorRedValue(result)
    lum = colorR/255

    return lum

def Main():

    arrItems = [("Want to use Paint Driver ?",True),("Wanna Pull It to Something",False)]
    arrOptionsBln = rs.CheckListBox(arrItems,"CHOOSE","Attraction_Type")
    arrItems2 = [("Attraction Threshold",True),("Vector Move Scale Factor",False), ("Paint Affects Both",False)]
    arrOptionsBln2 = rs.CheckListBox(arrItems2,"CHOOSE","Paint_Influence")

    if not arrOptionsBln2:

        print "Options not array"

    if not arrOptionsBln:

        print "Options not array"

    MeshAction = arrOptionsBln[0]

    print MeshAction

    pullGeom = arrOptionsBln[1]

    print pullGeom

    AttractorThreshold = arrOptionsBln2[0]

    print AttractorThreshold[1]

    VectorTranslationScaling = arrOptionsBln2[1]

    print VectorTranslationScaling

    DoubleActionPaint = arrOptionsBln2[2]

    print DoubleActionPaint



    Gens = rs.GetInteger("Number of Generations",6,1)

    Curves = rs.GetObjects("Select Base Crvs",rs.filter.curve)

    Attract = rs.GetReal("CurvePointAttractionThreshold")

    dblRatio = rs.GetReal("Distance For Vector To Move")

    arrRebuildCount = rs.GetInteger("Curve Rebuild CP Count")

    Rebuild = rs.GetInteger("Degree To Rebuild Curves")

    strLayerNew = rs.AddLayer("NEWCURVES", Color.Red)


    if bool(pullGeom[1]) == True :

        srfArr = rs.GetObjects("Meshes to pull to",0)

        pullthreshold = rs.GetReal("Set Thresh for mesh attractor")

        snapThreshold = rs.GetReal("Set Snap Threshold")

        ratio = rs.GetReal("Ratio of Distance to move")


    if bool(MeshAction[1]) == True :

        strLayer = rs.AddLayer("ptStore", Color.White)

        strObject = rs.GetObject("ColorMesh",filter = 32,select = False)


    if bool(MeshAction[1]) == True:

        arrVerts = rs.MeshVertices(strObject)
        color = rs.MeshVertexColors(strObject)


    for i in range(Gens):
            if scriptcontext.escape_test(False):
                print "ESC pressed "
                break 
                

            rs.EnableRedraw(False)
            for j in range(len(Curves)):
                
                if scriptcontext.escape_test(False):
                                print "ESC pressed "
                                break 
                rs.RebuildCurve(Curves[j],Rebuild,arrRebuildCount)

                arrNewPos = []

                PointCount = rs.CurvePointCount(Curves[j])

                arrCrvDiv = rs.CurvePoints(Curves[j])

                if arrCrvDiv:

                    test = "0"

                else: 

                    print "Nope"

                for k in range(PointCount):
                    if scriptcontext.escape_test(False):
                        print "ESC pressed "
                        break 
                    arrCrvPts = []

                    if bool(MeshAction[1]) == True:

                        threshMult = ColorAction(arrVerts,color,arrCrvDiv[k])               

                        if threshMult < 0.2 :

                            threshMult == 0 

                    else:

                        threshMult = 1

                    if bool(VectorTranslationScaling[1]) == True:

                        #print "only will affect VECTOR"

                        dblRatio2 = dblRatio*threshMult

                        print "dblRatio2 = " + str(dblRatio2)

                        newThreshold = Attract 

                        print "Thresh = " + str(newThreshold)


                    for L in range(len(Curves)):
                        if scriptcontext.escape_test(False):
                            print "ESC pressed "
                            break 
                        if bool(AttractorThreshold[1]) == True:

                            newThreshold = Attract * threshMult

                            dblRatio2 = dblRatio

                        if bool(DoubleActionPaint[1]) == True:

                            dblRatio2 = dblRatio*threshMult

                            newThreshold = Attract * threshMult 

                            print "dblRatio2 = " + str(dblRatio2)

                            print "Thresh = " + str(newThreshold)

                        if j != L :

                            arrCrvParam = rs.CurveClosestPoint(Curves[L],arrCrvDiv[k])

                            crvPt = rs.EvaluateCurve(Curves[L],arrCrvParam)

                            arrCrvPts.append(crvPt)

                    IndClosestCrv = rs.PointArrayClosestPoint(arrCrvPts,arrCrvDiv[k])

                    #print "NextClosestIndex = ",IndClosestCrv

                    crvPt = arrCrvPts[IndClosestCrv]

                    #print crvPt

                    dist = rs.Distance(arrCrvDiv[k],crvPt)

                    if dist < newThreshold :

                        vector = rs.VectorCreate(crvPt,arrCrvDiv[k])

                        vector = rs.VectorScale(vector,dblRatio2)

                        NewPosition = rs.PointAdd(vector,arrCrvDiv[k])

                    else:

                        NewPosition = arrCrvDiv[k]

                    arrNewPos.append(NewPosition)

                newcurve = rs.AddCurve(arrNewPos,Rebuild)
                rs.EnableRedraw(True)
                rs.ObjectLayer(newcurve,strLayerNew)

                rs.DeleteObject(Curves[j])

                #rs.ObjectColor(newcurve,[j,j,j])

                Curves[j] = newcurve

    basecrvs = rs.ObjectsByLayer(strLayerNew)
    rs.EnableRedraw(True)

               

Main()          

Update
  • Share