##################################
### DM2_w23 # AGruber@tugraz.at ###
### hu_06 UN_headquaters  NYC   ###
### paneling                    ###
###################################


##############################
import rhinoscriptsyntax as rs
import random, time, sys   ###
sys.path.append("P:/WWW/limafi/dm2")     ###
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])


################
lengthVec = lVec = rs.VectorUnitize(rs.VectorSubtract( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(1, 0, 0) )) ## rs.AddPoint( dm.getUnoCoord(1, 0, 0) )
depthVec  = dVec = rs.VectorUnitize(rs.VectorSubtract( dm.getUnoCoord(0, 1, 0), dm.getUnoCoord(0, 0, 0) )) ## rs.AddPoint( dm.getUnoCoord(0, 1, 0) )
################

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()

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 = []
# front
allPanels  = [[dm.getUnoCoord( 0, 0, 0), dm.getUnoCoord( 0, 0, 39), dm.getUnoCoord(10, 0, 39), dm.getUnoCoord(10, 0, 0)]]
# back:
#allPanels += [[dm.getUnoCoord( 0, 3, 0), dm.getUnoCoord( 0, 3, 39), dm.getUnoCoord(10, 3, 39), dm.getUnoCoord(10, 3, 0)]]
# side:
#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 )
#wiederholende def
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=550, minHig=12.0 ) #anzahl panels stoppt es 
print "::: len(allPanels)",len(allPanels)

def myPanel_V ( panel, anzahl=8 ):
    p0,p1,p2,p3 = panel
    rs.AddCurve( [p0,p1,p2,p3, p0],1)
    #rs.AddCurve( [p0,p1,p2,p3, p0],3)
    crv = rs.AddLine( p0, p3)
    if anzahl==0:
        anzahl = int(rs.Distance( p0, p3 ))
    coords03 = rs.DivideCurve( crv, anzahl)
    rs.DeleteObject(crv)
    #rs.AddPoints( coords03 )
    breite = rs.Distance( coords03[0], coords03[1])
    vecHoehe = rs.VectorSubtract( p1, p0)
    nVec = dm.normVec3pnts( p0, p1, p2 )
    nVec = rs.VectorScale( nVec, breite )
    nVec = rs.VectorRotate( nVec, random.uniform(-30,30), [0,0,1] )
    for pX in coords03:
        pX0 = pX
        pX1 = rs.VectorAdd(pX, nVec)
        pX2 = rs.VectorAdd(pX1, vecHoehe)
        pX3 = rs.VectorAdd(pX, vecHoehe)
        coords = [pX0,pX1,pX2,pX3,pX0] 
        #rs.AddLine( pX, rs.VectorAdd(pX, nVec) )
        rs.AddCurve( coords, 1)
    
def myPanel_H ( panel, anzahl=8 ):
    p0,p1,p2,p3 = panel
    rs.AddCurve( [p0,p1,p2,p3, p0],1)
    #rs.AddCurve( [p0,p1,p2,p3, p0],3)
    crv = rs.AddLine( p0, p1)
    coords = rs.DivideCurve( crv, anzahl )
    untenVec = rs.VectorSubtract( p3, p0 )
    for cor in coords:
        rs.AddLine( cor, rs.VectorAdd(cor, untenVec))



if 1:
    for i,panel in enumerate(allPanels[0:]):
        dm.esc()
        pass
        rs.AddCurve( panel, 1)
        if 1 and panel[0][2] > 10: #vertikal und horizontal fleckerlteppich 
            if random.uniform(0, 100) < 50:
                myPanel_V ( panel )
            elif random.uniform(0, 100) < 50:
                myPanel_H ( panel, anzahl=8 )

        if i%10==0:
            rs.Redraw()
rs.Command("cplane W T enter", 0)

coords = rs.DivideCurve(rs.AddCurve( [dm.getUnoCoord(0,0,39),
                dm.getUnoCoord(10,0,39),
                dm.getUnoCoord(10,3,39),
                dm.getUnoCoord(0,3,39),
                dm.getUnoCoord(0,0,39)
                ], 1), 11)
random.shuffle(coords)
rs.AddCurve( coords, 1 )



sunVec = dm.setSun(year=2023, mon=11, day=17, hour=17, min=32, sec=29, verbose=0)
print sunVec
#print dm.getDateNow()
print dm.number2date(31+29)
print dm.date2number(year=2023, mon=11, day=30, verbose=0)
dm.printDisplay(1)