###################################
### DM2_w24 # tanja.konrad@student.tugraz.at ###
### hu_06 UN_headquaters  NYC   ### ######################################################
### paneling  / new dimensions  ### 87.5 x 22.0 meters (was lenY = 116.56 / lenX =  28.18)
################################### ######################################################


##############################
import rhinoscriptsyntax as rs
import random, time, sys   ###
sys.path.append("P:/")     ###
sys.path.append("C:/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, 1)                                # y/y/z axen display > 0/1 = off/on
#rs.ViewDisplayMode(rs.CurrentView(), "wireframe")
rs.ViewDisplayMode(rs.CurrentView(), "rendered")
rs.Command("cplane w t enter", 0)						# cPlane World Top
dm.PointRadius(displayModeX=0, rad=3, styl=3)
dm.printDisplay(1)                                      # nomen est omen
rs.EnableRedraw(0)



###_________________________________________#
### 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.
################____________________________#
################
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) )
################
###########################################################################################
UnoPanelCoords = dm.getUNpanelCoords(anzL=10*7, anzH=39, anzD=3, stepL=1, stepH=1, stepD=1) ### = all ~windows_panels
BigPanelCoords = dm.getUNpanelCoords(anzL=10*1, anzH=39, anzD=3, stepL=2, stepH=6, stepD=2) ### = all ~windows_panels
UnoPanelCoords = dm.getUNpanelCoords(anzL=10*1, anzH=39, anzD=3, stepL=1, stepH=3, stepD=1) ### = standard for hu_06
###########################################################################################
##########################################################
frontPanels   = UnoPanelCoords[0] ### list of coordLists !
backPanels    = UnoPanelCoords[1]
sidePanels    = UnoPanelCoords[2]
upSidePanels  = UnoPanelCoords[3]
allPanels     = UnoPanelCoords[4]
#################################

dm.newEmptyLayer("myPROJ", [120,120,140])

#print "***\n*** check RHINO 8 SAMMEL-BESTELLUNG / via FakArch / @ https://workdrive.zohopublic.eu/writer/open/8243091847f125bad45ba9abb31e1e1733f3e\n***\n"

#if 1: ### SETUP >> dont' exec @ homework !
#    rs.ObjectColor(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), [200,200,200])
#    rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(0, 1, 0) ), [200,200,200] )
#    rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(1, 0, 0) ), [200,200,200] )
#    rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(0, 0, 2) ), [200,200,200] )
#    rs.ObjectPrintWidth( rs.AllObjects()[0:4], 1.0 )
#    #rs.ZoomExtents()
#    #for coords in BigPanelCoords[4]: rs.AddCurve( coords, 1 )

if 0: 
    print "len(frontPanels) =", len(frontPanels)
    dm.textDots( frontPanels[0] )
    
    for coords in frontPanels[0:20]+sidePanels[6:]:
        pass
        rs.AddPoints( coords )
        rs.AddCurve( coords, 1 )

    for coords in BigPanelCoords[1][5:]:
        pass
        coords[-1]=coords[random.randint(0,3)]
        rs.ObjectColor( rs.AddCurve( coords, degree=random.randint(1,3) ), [0,0,0])
        rs.Redraw()

if 1: 
###########
### Random Triangle
    crv = []
    def switch_triangle(p0,p1,p2,p3):
        zahl = random.randint(0, 3)
        mp = dm.pntInbetween(p1,p3)
        if zahl == 0:
            crv = rs.AddCurve( [p0, p1, mp,p0], 1 )
            return crv
        elif zahl == 1:
            crv = rs.AddCurve( [p1, p2, mp,p1], 1 )
            return crv 
        elif zahl == 2:
            crv = rs.AddCurve( [p0, p3, mp,p0], 1 )
            return crv 
        elif zahl == 3:
            crv = rs.AddCurve( [p2, p3, mp,p2], 1 )
            rs.ObjectPrintWidth( crv, 1.0 )
            return crv 


#############:
### panel_DEF:
    def myPanel( dach, panel, basement = 0 ):
        #print "basementVal",basementVal
        p0, p1, p2, p3 = panel ### get items (==coords) from list
        nVec = dm.normVec3pnts( p0, p1, p2)
        zCor = p0[2]
        auskrag = dm.reMap(zCor, 0, 156, 10.0, -5.0)
        nVec = rs.VectorScale( nVec, auskrag)
        if basement != 0:
            for i in range(2):
                switch_triangle(p0,p1,p2,p3)
                rs.ObjectColor( crv, [50,50,50])
        else:
             rs.AddCurve( panel, 1 )
             base = rs.AddCurve( [p0, p1, p2, p3, p0], 1)
             rs.ObjectPrintWidth( base, 1.5 )
             rs.ObjectColor( base, [0,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) )
             dVec2 = rs.VectorUnitize(rs.VectorSubtract( dm.getUnoCoord(1, 0, 0), dm.getUnoCoord(0, 0, 0) ))
             p01 = dm.pntInbetween(p0, p1)
             p02 = dm.pntInbetween(p0, p2)
             p12 = dm.pntInbetween(p1, p2)
             #print "dach",dach
             if dach == 1:
                 p12 = rs.VectorAdd(p12, rs.VectorScale( dVec2, -15.0 ) )
             if dach == 2:
                 p12 = rs.VectorAdd(p12, rs.VectorScale( dVec, -15.0 ) )
             p23 = dm.pntInbetween(p2, p3)
             p30 = dm.pntInbetween(p3, p0)
             p31 = dm.pntInbetween(p3, p1)
             
             x = random.randint(0,1)
             if x == 0:
                 coords = [p30, p01, p12, p23,p30]
             else:
                 coords = [p01, p12, p23, p01]
#             innen = rs.AddCurve( coords, 1)
             for i,cor in enumerate(coords):
                cor = rs.VectorAdd(cor, nVec)
                coords[i] = cor
             aussen = rs.AddCurve( coords, 1)
             rs.ObjectColor( aussen, [30,30,50])
#             rs.ObjectPrintWidth( aussen, 0.75 )
             anz = int(dm.reMap(zCor, 0, 156, 10, 200)) ### type_casting
             coordsA = rs.DivideCurve( aussen, anz , 0)
             coordsB = rs.DivideCurve( base, anz , 0)
             for i in range( anz) :
                face = rs.AddCurve( [coordsA[i], coordsB[i]], 1)
                rs.ObjectColor( face, [80,80,100])
    for i,panel in enumerate(frontPanels[:]+sidePanels):
        pass
        basementVal = 0 
        dach = 2
        #print "i",i
        if i<20 or (i>=130 and i<136) or (i>=100 and i<110) or (i>=160 and i<163):
            basementVal = 1
            dach = 0
        elif (i>=136 and i<160) or (i>=165 and i<169):
#            basementVal = 1
            dach = 1 
        elif i%10==0:
            rs.Redraw()
        myPanel( dach, panel, basement=basementVal ) ### or: basement=(i<20 or i>=130 and i<136)


#################################
#rs.ZoomExtents()
rs.EnableRedraw(1) ### 4 the MACs
dm.printDisplay(1)
dm.newEmptyLayer("Default")

