###################################

### DEMO COCO_verdome           ###
###################################

##############################
import rhinoscriptsyntax as rs
import random, time, sys, os
sys.path.append("C:\Users\lukschme\Downloads") 
sys.path.append("/Users/lukas/Desktop/Studium_Architektur/Semester_3/dm2")     ###
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 0:
    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:
    
    ### CRV for deckel
    allDeckelCoords=[]
    deckel_crv = rs.ObjectsByName("spiral")
    deckel_coords = rs.DivideCurve(deckel_crv,50)
    allDeckelCoords.extend(deckel_coords)
    print(deckel_coords)
    dm.allDeckelCoords = allDeckelCoords
    ### 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])
    
    
allDeckelCoords = dm.allDeckelCoords[:]
allChanelCoords = dm.allChanelCoords[:]
allPlaceCoords = dm.allPlaceCoords[:]

#allChanelCoords = allChanelCoords
new_allChanelCoords = []

fuellstand = 0.5
full_flacon = len(allChanelCoords)
keep_n = max(1, int(full_flacon * fuellstand))
allChanelCoords = allChanelCoords[:keep_n]



new_chanel_crv = rs.AddCurve(allChanelCoords,1)
new_allChanelCoords = rs.DivideCurve(new_chanel_crv,int(len(allPlaceCoords))+1, False)

print "chanel len crvs XX, >>", len(allChanelCoords), "coords"


#max_coords_for_place = len(allChanelCoords)


#if len(allPlaceCoords) > max_coords_for_place:
#    allPlaceCoords = allPlaceCoords[:max_coords_for_place]


#if len(allPlaceCoords) < max_coords_for_place:
#    max_coords_for_place = len(allPlaceCoords)
#    allChanelCoords = allChanelCoords[:max_coords_for_place]



random.shuffle(new_allChanelCoords)
allPlaceCoords  = allPlaceCoords[:]
new_allChanelCoords = sorted(new_allChanelCoords, key=lambda sKey: sKey[2])
##allChanelCoords = random.sample(allChanelCoords, len(allPlaceCoords))
#allChanelCoords = allChanelCoords[0:len(allPlaceCoords)]
#allChanelCoords = [ rs.VectorAdd(cor, [0,0,random.uniform(-5,5)]) for cor in allChanelCoords ]
new_allChanelCoords = new_allChanelCoords[0:len(allPlaceCoords)]
new_allChanelCoords = [ rs.VectorAdd(cor, [0,0,random.uniform(-5,5)]) for cor in new_allChanelCoords ]
print "place  >>", len(allPlaceCoords), "coords"
print "chanel >>", len(allChanelCoords), "coords"
print "new chanel >>", len(new_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
    
    deckel = rs.ObjectsByName("deckel")[0]
    dummer_cnt = 50
    deckelPos = [27742.114823987707,110100.30099588417,72.11759903972955]
    captureIt = 1
    framNr = 0
    deg = 2
    anzFrames = 300
    intervall_crv = int(len(allPlaceCoords)/(anzFrames+100)) + 1
    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]=new_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_crv], 1 )
    rs.HideObject(crv_P2C2)
    rs.ObjectColor(crv_P2C1, [0,0,0])
    rs.ObjectPrintWidth(crv_P2C1,3)

    if 1:
        dm.setTime()
        for i in range(0, len(allPlaceCoords)-3, 1):#len(allPlaceCoords)):
            dm.esc()
            allPlaceCoords[i]=new_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 !
                #dummer_cnt += 1
                #print("dummi",dummer_cnt)
                
                
                ###Deckel auf
                if framNr <= 50:
                    deckel_to_P1_vec = rs.VectorSubtract(allDeckelCoords[framNr],dm.getSurfacePoints( deckel )[0])
                    rs.MoveObject( deckel, deckel_to_P1_vec)
                    imageName = dm.makeName(name=imgName, frameNumber=framNr, anzahl=4, format='jpg')
                    if captureIt:
                        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 and captureIt:
                        print "done", framNr-1, "von", anzFrames, "in", str(dm.getTime())+"sec"
                    rs.Redraw()
                    
                    
                    
                ### Flakon_fill
                if framNr > 50 and framNr <=250:
                    rs.ShowObject(crv_P2C2)
                    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, [0,0,0])
                    rs.ObjectPrintWidth(crv_P2C1,3)
                    rs.ObjectColor(crv_P2C2, [255, 221, 153])
                    rs.Redraw()
                    imageName = dm.makeName(name=imgName, frameNumber=framNr, anzahl=4, format='jpg')
                    if captureIt:
                        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 and captureIt:
                        print "done", framNr-1, "von", anzFrames, "in", str(dm.getTime())+"sec"
                        
                        
                        
                        
                ### Deckel zu
                if framNr > 250 :
                    if framNr == 251:
                        pInnen_pnt=rs.AddPoint(pInnen)
                        param_pnt=rs.CurveClosestPoint(crv_P2C2,pInnen_pnt)
                        
                        #rs.AddPoint(param_pnt)
                        rs.SplitCurve(crv_P2C2,param_pnt)
                        
                        end_crv=rs.LastCreatedObjects()
                        rs.SelectObjects( end_crv )
                        
                        rs.ObjectColor(end_crv, [255, 255, 0])
                        print("crv=split")
                    dummer_cnt = dummer_cnt-1
                    deckel_to_P1_vec = rs.VectorSubtract(allDeckelCoords[dummer_cnt],dm.getSurfacePoints( deckel )[36])
                    rs.MoveObject( deckel, deckel_to_P1_vec)
                    imageName = dm.makeName(name=imgName, frameNumber=framNr, anzahl=4, format='jpg')
                    if captureIt:
                        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 and captureIt :
                        print "done", framNr-1, "von", anzFrames, "in", str(dm.getTime())+"sec"
                        
                        
                if framNr == 300 :
                    print ("deckel wird geschlossen")
                    #dummer_cnt = dummer_cnt-1
                    deckel_to_startPos_vec = rs.VectorSubtract(deckelPos, dm.getSurfacePoints( deckel )[36] )
                    rs.MoveObject( deckel, deckel_to_startPos_vec)
                    imageName = dm.makeName(name=imgName, frameNumber=framNr, anzahl=4, format='jpg')
                    if captureIt:
                        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 and captureIt :
                        print "done", framNr-1, "von", anzFrames, "in", str(dm.getTime())+"sec"
        #if frameNr<=20:
            #deckel_to_P1_vec = rs.VectorSubtract(allDeckelCoords[i],dm.getSurfacePoints( deckel )[0])
            #rs.MoveObject( deckel, deckel_to_P1_vec)
        #if frameNr==150:
            #deckel_to_startPos_vec = rs.VectorSubtract(deckelPos, dm.getSurfacePoints( deckel )[0] )
            #rs.MoveObject( deckel, deckel_to_startPos_vec)
        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')
        if captureIt:
            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')
            if captureIt:
                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"