###################################
### DM2_w23 # AGruber@tugraz.at ###
### finale CC_100 / timon.T.    ###
### project atom 2 screen       ###
###################################


##############################
import rhinoscriptsyntax as rs
import random, time, sys   ###
sys.path.append("/Users/Titi/Desktop/DM2 End:/")     ###
sys.path.append("P:/")     ###
import DM_lib as dm        ### reload( dm )
import gagaCoords_inted as gaga
##############################      

##################
rs.UnitSystem(4)                                        # km = 5, meters = 4, cm = 3 etc
rs.ShowGrid(None, 0)                                    # grid > 0 = off
rs.ShowGridAxes(None, 0)                                # y/y/z axen display > 0/1 = off/on
rs.ViewDisplayMode(rs.CurrentView(), "wireframe")
rs.Command("cplane w t enter", 0)						# cPlane World Top
dm.PointRadius(displayModeX=0, rad=3, styl=3)
dm.printDisplay(0)                                      # nomen est omen
rs.EnableRedraw(0)
##################


dm.newEmptyLayer("PROJECT")
gagaCoords = gaga.gagaCoords
print "len(gagaCoords)", len(gagaCoords)
#rs.AddPoints( gagaCoords )

def makeAtomKern (position=[1,2,3], radius=0.1, dichte=32):
    arcs = []
    for i in range(dichte):
        pX = [ random.uniform(-1001,1001) for i in range(3) ]
        pY = [ random.uniform(-1001,1001) for i in range(3) ]
        planeX = rs.PlaneFromPoints(position, pX, pY)
        arc = rs.AddArc(planeX, radius, 180.0)
        arcs.append( arc )
    return arcs


### make screen - und hide it, weil wir ja eigentlich keine surfaces verwenden duerfen :)
screenSize = 100.0
rs.Command("cPlane W R enter", 0)
p0 = [screenSize*2, screenSize*1, -10]
p1 = [screenSize*2, screenSize*1, screenSize-10]
p2 = [screenSize*2, screenSize*-0, screenSize-10]
p3 = [screenSize*2, screenSize*-0, -10]
screenCrv = rs.AddCurve( [p0, p1, p2, p3, p0], 1 )
screen = rs.AddSrfPt( [p0, p1, p2, p3] )
rs.HideObject( screen )
### make screen


#anzahl = 3
#arcs = makeAtomKern (position=[0, 50, 10], radius=11.1, dichte=8*1)
#projected = rs.ProjectCurveToSurface(arcs, [screen], [1,0,0])

#fac = 1/anzahl
if 0:
    for i,arc in enumerate(arcs[0:9]):
        coordsA = rs.CurveEditPoints( arcs[i] )
        coordsP = rs.CurveEditPoints( projected[i] )
        #rs.AddLine( coordsA[0],  coordsP[0] )
        for j in range(0,anzahl+1):
            pX = dm.pntInbetween(coordsA[0], coordsP[0], fac*j)
            #rs.AddPoint( pX )
            cop = rs.CopyObject( arcs[i], rs.VectorSubtract(pX, coordsA[0] ) )
            coords = rs.CurvePoints( cop )
            p0 = dm.pntInbetween( coords[0], coords[1], fac*j)
            p5 = dm.pntInbetween( coords[4], coords[3], fac*j)
            #rs.AddPoint(coords[0] )
            #rs.AddPoint(p0)
            #rs.ObjectColor( rs.AllObjects()[0:2], [0,200,0] )
            rs.DeleteObject( cop )
            coords[0] = p0
            coords[4] = p5
            rs.AddCurve( coords, 2 )


#rs.ObjectColor(projected , [200,0,0])


if 1:
    random.shuffle(gagaCoords)
    allArcs = []
    for i,cor in enumerate( gagaCoords[0:500] ):
        arcs = makeAtomKern (position=cor, radius=0.5, dichte=8)
        allArcs.append( arcs )
        if i%200==0: rs.Redraw()
#rs.Command("cPlane W R enter", 0)



arcs = makeAtomKern (position=cor, radius=0.5, dichte=8)
projected = rs.ProjectCurveToSurface(arcs, [screen], [1,0,0])
anzahl = 3
fac = 1/anzahl

if 1:
    for i,arc in enumerate(allArcs):
        coordsA1 = rs.CurveEditPoints( arcs[i] )
        coordsP1 = rs.CurveEditPoints( projected[i] )
        #rs.AddLine( coordsA[0],  coordsP[0] )
        for j in range(0,anzahl+1):
                pX = dm.pntInbetween(coordsA1[0], coordsP1[0], fac*j)
                #rs.AddPoint( pX )
                cop = rs.CopyObject( arcs[i], rs.VectorSubtract(pX, coordsA1[0] ) )
                coords = rs.CurvePoints( cop )
                p0 = dm.pntInbetween( coords[0], coords[1], fac*j)
                p5 = dm.pntInbetween( coords[4], coords[3], fac*j)
                rs.DeleteObject( cop )
                coords[0] = p0
                coords[4] = p5
                rs.AddCurve( coords, 2 )
        if i%20==0:
            rs.Redraw()
if 1:

    print "len(allArcs)", len(allArcs), "len(allArcs[0])", len(allArcs[0]), "\n" 
    for i,arcs in enumerate(allArcs):
        #lines = rs.ProjectCurveToSurface(arcs, [screen], [1,0,0])
        for arc in arcs:
            pts = rs.ProjectPointToSurface( [rs.CurveStartPoint(arc), rs.CurveEndPoint(arc)], [screen], [1,0,0])
            pts = [ rs.VectorAdd(pX, [ random.uniform(-1,1) for j in range(3) ]) for pX in pts ] ### bissl ungenauigkeit !
            projected = rs.AddCurve( pts )
            rand = random.uniform(0.1, 0.9)
            rs.ObjectColor( projected, [255*rand, 255*rand, 255*rand])
            rs.ObjectPrintWidth( projected, rand)
        if i%20==0:
            rs.Redraw()
dm.zA()
dm.printDisplay(1)                                     
rs.EnableRedraw(1)
