##################################
### DM2_w23 # AGruber@tugraz.at ###
### hu_06 UN_headquaters  NYC   ###
### paneling                    ###
###################################


##############################
import rhinoscriptsyntax as rs
import random, time, sys   ###
sys.path.append("P:/")     ###
sys.path.append("P:/WWW/flobber27/dm2")     # path for library !!
import DM_lib as dm        ### 
reload( dm )
##############################      

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.eAA()


###_________________________________________#
### basic settings for grid to fit UN_slab  #
###                                         # 
floors = H  = dm.H = 40                     # default=40 / incl roof
slabs  = L  = dm.L = 11                     # default=11
depth  = D  = dm.D =  4                     # default= 4 / division in building_depth
floorHeight = fH = dm.fH = 4.0              # default= 4.0 / 4.0*(H-1) = 156 meters
                                            #
################                            # get from DM_lib as dm:
UnoGridCoords  = dm.UnoGridCoords       # get gridCoords L*D*H = 1760
UnoPanelCoords = dm.UnoPanelCoords      # get panelCoords [frontPanels, backPanels, sidePanels, upSidePanels] / default arguments s.u.
################____________________________#

dm.newEmptyLayer("UNO::setUp", [120,120,140])


##################
depthVec  = dVec = dm.dVec
lengthVec = lVec = dm.lVec
##################

if 1: ### SETUP >> dont' exec @ homework !
    rs.AddCurve( [dm.getUnoCoord(0,0,0), dm.getUnoCoord(0,0,39), dm.getUnoCoord(10,0,39), dm.getUnoCoord(10,0,0), dm.getUnoCoord(10,3,0), dm.getUnoCoord(0,3,0), dm.getUnoCoord(0,3,39), dm.getUnoCoord(10,3,39)], 1)
    rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(0, 1, 0) ), [222, 0, 0] )
    rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(1, 0, 0) ), [0, 222, 0] )
    rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(0, 0, 2) ), [0, 0, 222] )
    rs.ObjectPrintWidth( rs.AllObjects()[0:3], 1.0 )
    #rs.AddPoints( UnoGridCoords )
    rs.ZoomExtents()

#UnoPanelCoords = dm.getUNpanelCoords(anzL=10, anzH=39, anzD=1, stepL=1, stepH=4, stepD=1)
frontPanels   = UnoPanelCoords[0]
backPanels    = UnoPanelCoords[1]
sidePanels    = UnoPanelCoords[2]
upSidePanels  = UnoPanelCoords[3]
allPanels     = UnoPanelCoords[4]

#_____________________________here you go:
dm.newEmptyLayer("myPROJ", [100,100,200])

allPanels = []
allPanels  = [[dm.getUnoCoord( 0, 0, 0), dm.getUnoCoord( 0, 0, 39), dm.getUnoCoord(10, 0, 39), dm.getUnoCoord(10, 0, 0)]]
#allPanels += [[dm.getUnoCoord( 0, 3, 0), dm.getUnoCoord( 0, 3, 39), dm.getUnoCoord(10, 3, 39), dm.getUnoCoord(10, 3, 0)]]
#allPanels += [[dm.getUnoCoord( 0, 3, 0), dm.getUnoCoord( 0, 3, 39), dm.getUnoCoord( 0, 0, 39), dm.getUnoCoord( 0, 0, 0)]]
#allPanels += [[dm.getUnoCoord(10, 0, 0), dm.getUnoCoord(10, 0, 39), dm.getUnoCoord(10, 3, 39), dm.getUnoCoord(10, 3, 0)]]

random.shuffle( allPanels )
def dividePanel( panel=allPanels[0], maxPanels=25, minHig=4.0 ):
        dm.esc()
        if maxPanels>500:maxPanels=500
        if rs.Distance( panel[0], panel[1] ) > minHig*2:
            allPanels.remove( panel )
            pMid = dm.pntInbetween(panel[0],panel[2])
            allPanels.append([panel[0], dm.pntInbetween(panel[0],panel[1]), pMid, dm.pntInbetween(panel[3],panel[0])])
            allPanels.append([dm.pntInbetween(panel[0],panel[1]), panel[1],dm.pntInbetween(panel[1],panel[2]), pMid])
            allPanels.append([pMid, dm.pntInbetween(panel[1],panel[2]), panel[2], dm.pntInbetween(panel[2],panel[3])])
            allPanels.append([dm.pntInbetween(panel[0],panel[3]), pMid, dm.pntInbetween(panel[2],panel[3]), panel[3]])
        if len(allPanels) <= maxPanels :
            dividePanel( panel=random.choice( allPanels[0: int(len(allPanels)*0.666)]), maxPanels=maxPanels )  

dividePanel(panel=allPanels[0], maxPanels=360, minHig=4.0 )
print "::: len(allPanels)",len(allPanels)

sunVecs = dm.setSun(year=2023, mon=11, day=17, hour=14, min=51, sec=55, verbose=0)
sunVec = sunVecs[2]

def StarPan(panel):
    p0,p1,p2,p3 = panel
    outline = rs.AddCurve(panel, 1)
    hhVec = rs.VectorUnitize(rs.VectorSubtract( p2, p3 ))
    llVec = rs.VectorUnitize(rs.VectorSubtract( p3, p0 ))
    sp0 = rs.VectorAdd(p1, rs.VectorScale(llVec, rs.Distance(p1,p2)/2))
    sp1 = rs.VectorAdd(p0, rs.VectorScale(hhVec, rs.Distance(p1,p3)* 2/3))
    sp2 = rs.VectorAdd(p3, rs.VectorScale(hhVec, rs.Distance(p1,p3)* 2/3))
    #rs.AddPoints([sp0, sp1, sp2])
    StarPts = [sp0, p0, sp2, sp1, p3, sp0]
    star = rs.AddCurve(StarPts, 1)
    rs.ObjectPrintWidth(star, 0.75)
    rs.ObjectColor(star, [220,20,20])
    rs.ObjectName( star, "redStar")
    #rs.MoveObject(star, rs.VectorScale(dVec, random.uniform(-2,2)))
    return star


def CircPan(panel, count=16):
    p0,p1,p2,p3 = panel
    outline = rs.AddCurve(panel,1)
    midPt = dm.pntCentroid(panel)
    circ = rs.AddCurve([p0, p1, p2, p3, p0], 4)
    #rs.ObjectPrintWidth(circ, 0.75)
    coords = rs.DivideCurve(circ, count, 0)
    star= StarPan(panel)
    cirLins = []
    for pt in coords:
        cirLin = rs.AddLine(midPt,pt)
        rs.ObjectName( cirLin, "cirLin")
        #rs.SplitCurve(cirLin, star)
        #rs.Command("split selID "+str(cirLins)+" enter selId "+str(star)+" enter enter", 0)
        cirLins.append( cirLin )
    rs.UnselectAllObjects()
    rs.SelectObjects( cirLins )
    rs.Command("split selId "+str(star)+" enter enter", 0)
    rs.UnselectAllObjects()
        

def panel_0( panel, anzLins = 9 ):
    p0,p1,p2,p3 = panel
    crv = rs.AddCurve( [p0,p1,p2,p3,p0], 1 )
    #dm.textDots( panel )
    nVec = dm.normVec3pnts( p0,p1,p2 )
    center = dm.pntInbetween(p0, p2)
    rs.Command("cplane object selID "+str(crv)+" enter", 0)
    dist = rs.Distance(p0, p3)
    offs = rs.OffsetCurve( crv, center, dist*(random.uniform(0.1, 0.3)) )
    coords = rs.CurveEditPoints( offs )
    #dm.textDots( coords[0:-1] )
    movVec = rs.VectorSubtract( p0, coords[0] )
    if random.uniform(0,100) < 50:
        movVec = rs.VectorSubtract( p1, coords[1] )
    #rs.AddCurve( [center, rs.VectorAdd(center, movVec)] )
    movVec = rs.VectorScale( movVec, random.uniform(-0.9, 0.9))
    reinRaus = random.randint(-1,1)
    movVec = rs.VectorAdd(movVec, rs.VectorScale( nVec, dist*0.5*reinRaus*(p0[2]>20) ) )
    rs.MoveObject( offs, movVec )
    coords = rs.CurveEditPoints( offs )
    #offs = rs.AddCurve( coords, 1)
    
    if 1 or (p0[2]>20):
        anzLins = int(rs.CurveLength(offs))*4
        coordsOff = rs.DivideCurve( offs, anzLins, 0)
        coordsPan = rs.DivideCurve( crv, anzLins, 0)
        for i,cor in enumerate(panel):
            rs.AddLine( panel[i], coords[i] )
        if reinRaus==1:
            col = [110,140,140]
            rangeX = range(0, int(anzLins*0.5))
        if reinRaus==-1:
            rangeX = range(int(anzLins*0.5), anzLins)
            col = [140,110,140]
        if reinRaus==0 or (p0[2]<20):
            rangeX = range(0, anzLins)
            col = [200,200,200]
        for i in rangeX:
            lin = rs.AddLine( coordsPan[i], coordsOff[i] )
            rs.ObjectColor(lin, col)
            
date = dm.getDateNow()
#print date
sunVec = dm.setSun(year=date[0], mon=date[1], day=date[2], hour=date[3], min=date[4], sec=11, verbose=0)[2]

def sunPanel( panel, dayX = 10):
    p0, p1,p2,p3 = panel
    center = dm.pntInbetween(p0, p2)
    mon = dm.number2date(dayX)[0]
    day = dm.number2date(dayX)[1]
    date = dm.getDateNow()
    #print date
    sunVecs = dm.setSun(year=date[0], mon=mon, day=day, hour=date[3], min=date[4], sec=11, verbose=0)
    alti = sunVecs[1]
    sunVec = sunVecs[2]
    
    #sunVec = dm.setSun(year=2023, mon=11, day=17, hour=17, min=00, sec=0, verbose=0)[2]
    dist = rs.Distance( p0, p3 )
    if alti < 0:
        dist *= -1 
    sunVec= rs.VectorScale( sunVec, -dist)
    rs.AddLine( center, rs.VectorAdd(center, sunVec) )



if 1:
    for i,panel in enumerate(allPanels[0:]):
        dm.esc()
        pass
        rs.AddCurve( panel, 1)
        sunPanel( panel, dayX = i+1)
        #panel_0( panel, anzLins=64 )
        if i%200==0:
            rs.Redraw()


rs.Command("cplane W T enter", 0)

sunVec = dm.setSun(year=2023, mon=11, day=17, hour=18, min=20, sec=29, verbose=0)
#print sunVec
#print dm.getDateNow()
#print dm.number2date(321)
#print dm.date2number(year=2023, mon=11, day=17, verbose=0)
