
###################################
### DM2_w25 # AGruber@tugraz.at ###
### hu_05   UN_headquaters  NYC ### ##########################
### paneling                    ### 87.5 x 22.0 x 156.0 meters
################################### ##########################


##############################
import rhinoscriptsyntax as rs
import random, time, sys   ###
sys.path.append("P:/")     ###
sys.path.append("P:/WWW/userName/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.ViewDisplayMode(rs.CurrentView(), "wireframe")
rs.Command("cplane w t enter", False)                       # cPlane World Top
dm.PointRadius(displayModeX=0, rad=3, styl=3)               # info: (.., verbose=1)
dm.printDisplay(state=True)                                 # nomen est omen
rs.EnableRedraw(False)



###_________________________________________#
### 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) ### = alle ~windows_panels
BigPanelCoords = dm.getUNpanelCoords(anzL=10*1, anzH=39, anzD=3, stepL=2, stepH=7, stepD=2) ### = less ~windows_panels
UnoPanelCoords = dm.getUNpanelCoords(anzL=10*1, anzH=39, anzD=3, stepL=2, stepH=7, stepD=2) ### = standard for hu_05

UnoPanelCoords = dm.getUNpanelCoords(anzL=10*1, anzH=39, anzD=4, stepL=1, stepH=3, stepD=1) ### my setting
###########################################################################################
frontPanels   = UnoPanelCoords[0]
backPanels    = UnoPanelCoords[1]
upSidePanels  = UnoPanelCoords[3]
sidePanels    = UnoPanelCoords[2]
dachPanels    = UnoPanelCoords[5]
allPanels     = UnoPanelCoords[4]
#################################

def myTsTPanel(panel, shuffle=1, sockel=20):
    p0,p1,p2,p3 = panel
    coords = [p0,p1,p2,p3,p0]
    if shuffle:
        random.shuffle( coords )
    if panel[0][2] < sockel or panel[0][2] > 155 or (80 < panel[0][2] < 90) or panel in sidePanels or panel in upSidePanels:
        rs.AddCurve( [p0,p2,p1,p3], 1 )
    else:
        deg = random.randint(1,3)
        rs.ObjectColor( rs.AddCurve( coords, deg ), [50*deg, 50*deg, 50*deg] )
        rs.ObjectPrintWidth( rs.AllObjects()[0], deg*.3)
        if panel in frontPanels:
            rs.ObjectColor( rs.AllObjects()[0], [222,111,222])
            rs.ObjectPrintWidth( rs.AllObjects()[0], 1-deg*.2)


tst = 1
if tst:
    dm.newEmptyLayer("UNO::setUp", [120,120,240])
    if 0: ### 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), [100,0,200])
        rs.ObjectPrintWidth( rs.AllObjects()[0], 1.0 )
        rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(0, 3, 0) ), [222, 0, 0] )
        rs.CurveArrows(rs.AllObjects()[0], 2)
        rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(2, 0, 0) ), [0, 222, 0] )
        rs.CurveArrows(rs.AllObjects()[0], 2)
        rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(0, 0, 7) ), [0, 0, 222] )
        rs.CurveArrows(rs.AllObjects()[0], 2)
        rs.ZoomExtents()
        #dm.textDots(frontPanels[0])
    if 0:
        dm.newEmptyLayer("UNO::big", [100,110,200])
        for coords in BigPanelCoords[0]+BigPanelCoords[1]+BigPanelCoords[2]+BigPanelCoords[3]: rs.AddCurve( coords, 1 )
    if 0:
        dm.UN_slab(showAll=1)
    
    ##### test_panel
    if 1:
        dm.newEmptyLayer("UNO::tst", [100,110,200])
        for i,panel in enumerate(allPanels):          ### +backPanels+upSidePanels
            dm.esc()
            if 1 or panel[0][2] >= 0:
                pass
                myTsTPanel( panel, shuffle=1, sockel=10 )
                if i and i%10==0:
                    rs.Redraw()


# HERE YOU GO AS YOU GO:
SOCKEL_HOEHE = 12.0  # hoehe des sockels in metern
GESCHOSSE = 14  # anzahl der geschosse
FARBVERLAUF_UNTEN = [245, 222, 179] # sandfarbener sockel rgb
FARBVERLAUF_OBEN = [50, 150, 250] # blau ton fuer obere geschosse

dm.newEmptyLayer("myPROJ::Fassade", [100,110,200]) # fassade fuer alle panels oberhalb von sockel
dm.newEmptyLayer("myPRPJ::Sockel", FARBVERLAUF_UNTEN) # fuer unteren gebaeudeteil


# farbinterpolation zwischen zwei farben wenn t null und wenn t eins
def interp_color(c1, c2, t):
    return [int(c1[i] + (c2[i]-c1[i])*t) for i in range(3)] # zwei rgb farben
    
    
# entstehung von sockel er ist zwei meter breit und hat sandfarbe
def sockel_erzeugen(panel):
    e0,e1,e2,e3 = panel
    coords =[
        [e0[0]-2, e0[1]-2, 0],
        [e1[0]+2, e1[1]-2, 0],
        [e2[0]+2, e2[1]+2, SOCKEL_HOEHE],
        [e3[0]-2, e3[1]+2, SOCKEL_HOEHE]
    ]
    pl = rs.AddPolyline(coords + [coords[0]])
    rs.ObjectColor(pl, FARBVERLAUF_UNTEN)
    return pl
    
    
# 
def fassaden_panel(panel):
    e0, e1, e2, e3 = panel
    
    steps = 5 # anzahl der unterteilungen fuer farbverlauf innerhalb panel
    for s in range(steps):
        t = s / float(steps-1)
        color = interp_color(FARBVERLAUF_UNTEN, FARBVERLAUF_OBEN, t)
        
        p0 = [e0[0], e0[1], e0[2] + t*(e2[2]-e0[2])] # berechnung von punkten fuer eine horizontale unterteilung
        p1 = [e1[0], e1[1], e1[2] + t*(e3[2]-e1[2])]
        p2 = [e2[0], e2[1], e2[2] + t*(e2[2]-e0[2])]
        p3 = [e3[0], e3[1], e3[2] + t*(e3[2]-e1[2])]
        
        pl = rs.AddPolyline([p0, p1, p2, p3, p0])  # linien und flaechen zeichnen
        rs.ObjectColor(pl, color)
        
        l1 = rs.AddLine(p0, p2)  # diagonale linien im paneel
        l2 = rs.AddLine(p1, p3)
        rs.ObjectColor([l1, l2], color)
        
        crv = rs.AddCurve([p2, p3], 2) # organische linie
        rs.ObjectColor(crv, color)

# hauptschleife ueber alle panels wenn es im sockel liegt dann sockel erzeugen ansonsten fassaden panel
rs.EnableRedraw(False)
for i, panel in enumerate(allPanels):
    z_mitte = sum([p[2] for p in panel]) / 4.0
    if z_mitte <= SOCKEL_HOEHE:
        sockel_erzeugen(panel)
    else:
        fassaden_panel(panel)
    if i%50 == 0:
        rs.Redraw()
rs.EnableRedraw(True)

# fenster erzeugen farbverlauf und sockel definieren
FENSTER_ANZAHL_X = 4
FENSTER_ANZAHL_Y = 2
FENSTER_MIN_SIZE = 0.5 
FENSTER_MAX_SIZE = 1.5

# funktion soll ueber jedes panel fenster erzeugen teilweise fehlerhaft 
def fenster_erzeugen(panel):
    e0, e1, e2, e3 = panel
    vec_x = [(e1[i]-e0[i])/FENSTER_ANZAHL_X for i in range(3)]
    vec_y = [(e3[i]-e0[i])/FENSTER_ANZAHL_Y for i in range(3)]
    
    for ix in range(FENSTER_ANZAHL_Y): 
        base = [e0[j] + vec_x[j]*ix + vec_y[j]*iy for j in range(3)] 
        w = random.uniform(FENSTER_MIN_SIZE, FENSTER_MAX_SIZE) 
        h = random.uniform(FENSTER_MIN_SIZE, FENSTER_MAX_SIZE)
        p0 = base 
        p1 = [base[0]+vec_x[0]*w, base[1]+vec_x[1]*w, base[2]+vec_x[2]*w]
        p2 = [p1[0]+vec_y[0]*h, p1[1]+vec_y[1]*h, p1[2]+vec_y[2]*h]
        p3 = [base[0]+vec_y[0]*h, base[1]+vec_y[1]*h, base[2]+vec_y[2]*h]
        
        fenster = rs.AddPolyline([p0, p1, p2, p3, p0]) 
        if fenster:
            rs.ObjectColor(fenster, [random.randint(50,255), random.randint(50,255)])




########## 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")


