logo

ALGO

"""Script Written By Luis Quinones
Script Copywritten by complicitMatter + computationalMatter

www.complicitmatter.com
www.computationalmatter.com
Script Version Wednesday, June 29, 2011"""
import rhinoscriptsyntax as rs
from System.Drawing import Color 

def ColorAction(centroid,eval,ave):
    index = rs.PointArrayClosestPoint(centroid,eval)
    closestTest = centroid[index]  
    result = ave[index]
    #print result
    return result
def Main():
    strLayer = rs.AddLayer("OffsetMesh",Color.White)
    strLayer2 = rs.AddLayer("BaseMesh",Color.White)    
    strLayer4 = rs.AddLayer("BaseCrvs",Color.White)
    strLayer5 = rs.AddLayer("Construction_Curves")
    strLayer6 = rs.AddLayer("Profile_Curves")    
    strip = []    
    scaleFactor = rs.RealBox("Set The Scale",4,"SCALE DOMINATION")
    scaleFactor2 = rs.RealBox("Multiplier_# for color value",1,"DONT DO IT")
    offsetFactor = rs.RealBox("OffsetValue for MeshOffset",-5,"OFFSET")    
    newMeshBase = rs.GetObject("BaseMesh_To_Offset",rs.filter.mesh)
    rs.ObjectLayer(newMeshBase,strLayer2)
    offsetMesh = rs.MeshOffset(newMeshBase,offsetFactor)
    rs.ObjectLayer(offsetMesh,strLayer)
    newCrvBase = rs.GetObjects("GetCrvs",rs.filter.curve)
    rs.ObjectLayer(newCrvBase,strLayer4)  
    strObject = rs.GetObject("Select Painted Mesh",rs.filter.mesh)
    strLayerAA = rs.AddLayer("PTSTORE")   
    arrFaces = rs.MeshFaces(strObject,True)
    color = rs.MeshVertexColors(strObject)    
    faceVerts = [0]
    centroid = []
    ave = []
    if arrFaces:        
        i = 0
        count2 = 0        
        while(i < len(arrFaces)):            
            arrFace = arrFaces[i],arrFaces[i+1],arrFaces[i+2],arrFaces[i+3]            
            if arrFace[2][0] == arrFace[3][0] and arrFace[2][1] == arrFace[3][1] and arrFace[2][2] == arrFace[3][2] :                
                arrHLS = rs.ColorRGBToHLS(color[count2]),rs.ColorRGBToHLS(color[count2+1]),rs.ColorRGBToHLS(color[count2+2]),rs.ColorRGBToHLS(color[count2+2])                
                sum = arrHLS[0][2] + arrHLS[1][2] + arrHLS[2][2] 
                ave2 = (sum/3)
                if ave2 < 0.2:
                    ave2 = 0.2
                ave.append(ave2)                
                faceVerts[0] = [0,1,2,2]               
                meshVerts = arrFace                
                mesh = rs.AddMesh(meshVerts,faceVerts)               
                if mesh :
                    centroid.append(rs.MeshAreaCentroid(mesh))
                else:
                    print "did not make mesh"                
                rs.DeleteObject(mesh)             
                count2 += 3                
            else:              
                arrHLS = rs.ColorRGBToHLS(color[count2]),rs.ColorRGBToHLS(color[count2+1]),rs.ColorRGBToHLS(color[count2+2]),rs.ColorRGBToHLS(color[count2+3])               
                sum = arrHLS[0][2] + arrHLS[1][2] + arrHLS[2][2] + arrHLS[3][2]
                ave2 = (sum/4)
                if ave2 < 0.2:
                    ave2 = 0.2
                ave.append(ave2)                
                faceVerts[0] = [0,1,2,3]
                meshVerts = arrFace
                mesh = rs.AddMesh(meshVerts,faceVerts)                
                if mesh:
                    centroid.append(rs.MeshAreaCentroid(mesh))
                else:
                    print "did not make mesh"                
                rs.DeleteObject(mesh)               
                count2 += 4
            i +=4            
    if len(centroid) != len(ave):
        print "# of aves does != # of points"   
    meshFaceVerts99 = [0]   
    for w in range(len(newCrvBase)):
        threshMult = []
        strip = []      
        strLayer3 = rs.AddLayer('MeshStrips_'+ str(w),Color.White)
        crvPTS = rs.CurvePoints(newCrvBase[w])        
        for y in range(len(crvPTS)-1):           
            dblParam = rs.CurveClosestPoint(newCrvBase[w],crvPTS[y])
            eval = rs.EvaluateCurve(newCrvBase[w],dblParam)            
            if eval:                
                arrData = rs.CurveCurvature(newCrvBase[w],dblParam)              
                if arrData:                    
                    arrTangent = arrData[1]
                    arrEnd = eval[0]+arrTangent[0],eval[1]+arrTangent[1],eval[2]+arrTangent[2]
                    newVec = rs.VectorCreate(arrEnd,eval)
                    newVec = rs.VectorUnitize(newVec)
                    rs.AddPoint(newVec)                   
                    tangLine = rs.AddLine(arrEnd,eval)
                    rs.ObjectLayer(tangLine,strLayer6)                  
                else:                                       
                    arrTangent = crvPTS[y+1][0],crvPTS[y+1][1],crvPTS[y+1][2]
                    arrEnd = eval[0]+arrTangent[0],eval[1]+arrTangent[1],eval[2]+arrTangent[2]
                    newVec = rs.VectorCreate(arrTangent,eval)
                    newVec = rs.VectorUnitize(newVec)
                    rs.AddPoint(newVec)                    
                    print "USED THE NEXT POINT AS REFERENCE"                    
            meshClosest = rs.MeshClosestPoint(offsetMesh,eval)
            constLine = rs.AddLine(meshClosest[0],eval)
            rs.ObjectLayer(constLine,strLayer5)
            endPt = rs.CurveEndPoint(constLine)
            midPt = rs.CurveMidPoint(tangLine)
            translation = endPt-midPt
            rs.MoveObject(tangLine,translation)            
            rotVec = rs.VectorCreate(meshClosest[0],eval)
            rs.RotateObject(tangLine,endPt,90,rotVec)
            rs.ScaleObject(tangLine,endPt,[scaleFactor,scaleFactor,scaleFactor])          
            threshMult.append(ColorAction(centroid,eval,ave))            
            if threshMult[y] <= 0.2 :
                threshMult[y] == 0.1                
            strip.append(rs.ScaleObject(tangLine,endPt,[threshMult[y],threshMult[y],threshMult[y]]))
        for x in range(len(strip)-1):           
            arrCrvs = strip[x],strip[x+1]
            newSrf = rs.AddLoftSrf(arrCrvs)           
            meshFaceVerts99[0] = [0,1,2,3]          
            if not newSrf:                
                print "negative"               
            else:             
                surfPts = rs.SurfacePoints(newSrf[0])
                verts99 = surfPts[0],surfPts[1],surfPts[7],surfPts[6]              
                newMeshSet = rs.AddMesh(verts99,meshFaceVerts99)                
                if not newMeshSet:                    
                    print "negative again"                    
                else:                    
                    rs.DeleteObject(newSrf[0])   
    rs.LayerVisible(strLayer,False)
    rs.LayerVisible(strLayer5,False)
    rs.LayerVisible(strLayer4,False)
    rs.LayerVisible(strLayer6,False)
Main()
Update
  • Share