###################################
### DM2_w25 # AGruber@tugraz.at ###
### DEMO COCO_verdome           ###
###################################

##############################
import rhinoscriptsyntax as rs
import random, time, sys, os
#sys.path.append("P:/WWW/lukschme/dm2/") 
sys.path.append("C:\Users\lukschme\Downloads")     ###
sys.path.append("P:/WWW/simsci14/dm2/")     ###
import DM_lib as dm        ### dm.reload_lib(dm)
##############################      

rs.UnitSystem(4)                                            # meters = 4, cm = 3 etc
rs.ShowGrid(None, False)                                    # grid > False = off
rs.ShowGridAxes(None, True)                                 # y/y/z axen display > False/True = off/on
rs.Command("cplane w t enter", False)				        # cPlane World Top
#rs.ViewDisplayMode(rs.CurrentView(), "pen")

dm.PointRadius(displayModeX=0, rad=3, styl=3)               # 0 => wireframe | info: (.., verbose=1)
dm.PointRadius(displayModeX=1, rad=4, styl=1)               # 1 => shaded    | info: (.., verbose=1)
dm.PointRadius(displayModeX=2, rad=2, styl=0)               # 2 => rendered  | info: (.., verbose=1)
dm.printDisplay(state=True, scale=1000)                              # nomen est omen
rs.EnableRedraw(False)

dm.newEmptyLayer("Default", [222,122,122])

if 1:
    rs.AllObjects(1)
    rs.Command("boundingBox  Output=Curves  enter", False)
    rs.UnselectAllObjects()
    bBox = rs.BoundingBox( rs.AllObjects() )
    bBox.append( dm.pntInbetween(bBox[4], bBox[6]) )
    bBox.append( dm.pnt2XY0( dm.pntInbetween(bBox[4], bBox[6]) ) )
    bBox = [ rs.VectorAdd( cor, [0,0,rs.Distance(bBox[1], bBox[5])*2] ) for cor in bBox ]
    bBox[0][2] = 0.0
    dm.textDots( bBox )
    camCrv = rs.AddCurve( bBox, 2 )
    
    anzahl = 250
    camCoords = rs.DivideCurve( camCrv, anzahl, 1)


if 1:
    targetX = dm.pntCentroid( camCoords )
    targetX[2] = 0.0
    i=0
    dm.newEmptyLayer("Default", [222,122,122])
    
    path    = "C:\Users\lukschme\Downloads\flakon"
    imgName = "chanel_cam"
    
    dm.setTime()
    frameNr = 0
    deltaRota = 56.0/anzahl
    intervall = 1
    for i in range(anzahl):
        dm.esc()
        cameraX = camCoords[i]
        #rs.AddLine( cameraX, targetX )
        lens = 20+(i/10)
        dm.setCameraTarget(camera=cameraX, target=targetX, lens=lens, rota=deltaRota*i, upVec=0, verbose=0)
        if i%intervall==0:
            #dm.zA()
            rs.Redraw()
            avgTim = dm.getTime()/(frameNr+1)*250/intervall
            print "i",i, "farme", frameNr, " tim", dm.getTime(), " von", int(avgTim), "s..l3ns", round(lens, 2), "mm"
            imageNameX = dm.makeName(name=imgName, frameNumber=frameNr, anzahl=4, format='jpg')
            rs.Command("-_viewCaptureToFile Width=640 Height=360 Scale=2 TransparentBackground="+dm.trans["png" in imageNameX]+" "+path+imageNameX, False)
            frameNr += 1


#rs.SelectObject( rs.ObjectsByLayer("meshBorders")[6102]
dm.newEmptyLayer("COCO::crvs", [122,122,122])
rs.Redraw()
if 1:
    ### PLACE
    allPlaceCoords = []
    crvs = rs.ObjectsByLayer("meshBorders")
    for i,crv in enumerate(crvs[0:]):
        dm.esc()
        if rs.CurveArea(crv)and rs.CurveArea(crv)[0] > 5:
            coords = rs.CurveEditPoints( crvs[i] )
            if i and (rs.Distance(rs.CurveStartPoint(crvs[i]), rs.CurveStartPoint(crvs[i-1])) < 1120) and rs.CurveStartPoint(crvs[i])[2] > 0:
                allPlaceCoords.extend( coords )
    print "place len crvs", len(crvs), ">>", len(allPlaceCoords), "coords"
    
    ### FLACON
    allChanelCoords = []
    crvs = rs.ObjectsByLayer("chanel_No5::contis")
    for crv in crvs:
        coords = rs.DivideCurve( crv, int(len(allPlaceCoords)/len(crvs))+1, False)
        allChanelCoords.extend( coords )
    print "chanel len crvs", len(crvs), ">>", len(allChanelCoords), "coords"
    
    random.shuffle(allChanelCoords)
    dm.allPlaceCoords  = allPlaceCoords
    dm.allChanelCoords = sorted(allChanelCoords, key=lambda sKey: sKey[2])

allPlaceCoords  = dm.allPlaceCoords[:]
#allChanelCoords = random.sample(dm.allChanelCoords, len(allPlaceCoords))
allChanelCoords = dm.allChanelCoords[0:len(allPlaceCoords)]
allChanelCoords = [ rs.VectorAdd(cor, [0,0,random.uniform(-5,5)]) for cor in allChanelCoords ]
print "place  >>", len(allPlaceCoords), "coords"
print "chanel >>", len(allChanelCoords), "coords"

rs.Redraw()

##### ANIMATZI
dm.getCameraTarget()
dm.setCameraTarget( [27663.8756060, 109979.709367, 50.88912908], [27750.8145814, 110101.981703, 21.00592782], lens=15.0, rota=0, upVec=[0,0,1] ) # ... danke, andi !

if 1:
    dm.newEmptyLayer("Default")
    path    = "C:\Users\lukschme\Downloads\flakon"
    imgName = "chanel_cam"
    if not os.path.exists(path): os.makedirs(path)
    dm.path = path
    dm.imgName = imgName
    
    framNr = 0
    deg = 2
    anzFrames = 150
    intervall = int(len(allPlaceCoords)/anzFrames) + 1
    print "intervall", intervall
    fuellCrv = rs.ObjectsByName("einfuell*")[0]
    pInnen = rs.CurveStartPoint( fuellCrv )
    pMitte = rs.CurveMidPoint( fuellCrv )
    pOben  = rs.CurveEndPoint( fuellCrv )

    dm.newEmptyLayer("COCO::crvs", [122,122,122])
    i=0
    allPlaceCoords[i]=allChanelCoords[i]
    allPlaceCoords[i+1]= pInnen
    allPlaceCoords[i+2]= pOben
    pOben[2]=130.0
    allPlaceCoords[i+3]= dm.pntInbetween(allPlaceCoords[i+2], allPlaceCoords[i+3])
    allPlaceCoords[i+3][2] = random.uniform(70, 80)

    rs.HideObject(rs.ObjectsByName("einfuell*")[0])
    crv_P2C2 = rs.AddCurve( allPlaceCoords[0:5], deg )
    crv_P2C1 = rs.AddCurve( allPlaceCoords[5:-intervall], 1 )
    

    if 1:
        dm.setTime()
        for i in range(0, len(allPlaceCoords)-3, 1):#len(allPlaceCoords)):
            dm.esc()
            allPlaceCoords[i]=allChanelCoords[i]
            allPlaceCoords[i+1]= pInnen
            allPlaceCoords[i+2]= pOben
            allPlaceCoords[i+3]= dm.pntInbetween(allPlaceCoords[i+2], allPlaceCoords[i+3])
            allPlaceCoords[i+3][2] = random.uniform(70, 80)
            if i%intervall==0 and framNr < anzFrames:      ### last frame !
                rs.DeleteObjects( [crv_P2C2, crv_P2C1] )
                crv_P2C2 = rs.AddCurve( allPlaceCoords[0:(i+5)], deg )
                crv_P2C1 = rs.AddCurve( allPlaceCoords[i+4:], 1 )
                #dm.textDots(allPlaceCoords[0:5])
                #rs.ObjectColor(crv_P2C1, [200,0,0])
                rs.Redraw()
                imageName = dm.makeName(name=imgName, frameNumber=framNr, anzahl=4, format='jpg')
                rs.Command("-_viewCaptureToFile Width=640 Height=360 Scale=2 TransparentBackground="+dm.trans["png" in imageName]+" "+path+imageName, False)
                framNr += 1
                if i==5*intervall:
                    pass
                    #break
                if i and i%(intervall*10)==0:
                    print "done", framNr-1, "von", anzFrames, "in", str(dm.getTime())+"sec"
        rs.DeleteObjects( [crv_P2C2, crv_P2C1] )
        dm.newEmptyLayer("COCO::crvs", [122,122,122])
        crv_P2C2 = rs.AddCurve( allPlaceCoords[0:(i+0)], deg )
        rs.Redraw()
        imageName = dm.makeName(name=imgName, frameNumber=framNr, anzahl=4, format='jpg')
        rs.Command("-_viewCaptureToFile Width=640 Height=360 Scale=2 TransparentBackground="+dm.trans["png" in imageName]+" "+path+imageName, False)
        for i in range(5):
            framNr += 1
            imageName = dm.makeName(name=imgName, frameNumber=framNr, anzahl=4, format='jpg')
            rs.Command("-_viewCaptureToFile Width=640 Height=360 Scale=2 TransparentBackground="+dm.trans["png" in imageName]+" "+path+imageName, False)

############################
########## EOS / EndOfScript
rs.EnableRedraw(True)     ### 4_the_MACs
#dm.eDup()                 ### delete duplicate objects 
dm.printDisplay(state=True, scale=1000)
#dm.zA( 0.9 )
dm.newEmptyLayer("Default")
print "done"