###################################
### 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) ### = all ~windows_panels
BigPanelCoords = dm.getUNpanelCoords(anzL=10*1, anzH=39, anzD=3, stepL=2, stepH=7, stepD=2) ### = all ~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 = 0
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 0:
        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:
dm.newEmptyLayer("myPROJ", [100,110,200])

if 0:
    for panel in allPanels:

        #print panel #ein  Panel ist eine Liste an Punkten
        #print len(panel) #Anzahl der Punkte von einem Panel

        randomPoint = [0, 0, 0]
        randomPoint[0] = random.randint(-2000, 2000)/1000
        randomPoint[1] = random.randint(-2000, 2000)/1000
        randomPoint[2] = random.randint(-2000, 2000)/1000 #generiert mir eine random Zahl von -2 zu 2

        for i in range(4):
            startPoint = [panel[i][0], panel[i][1], panel[i][2]]
            endPoint = [panel[(i + 1) % 4][0], panel[(i + 1) % 4][1], panel[(i + 1) % 4][2]]

            startPoint[0] = startPoint[0] + randomPoint[0]
            startPoint[1] = startPoint[1] + randomPoint[1]
            startPoint[2] = startPoint[2] + randomPoint[2]

            endPoint[0] = endPoint[0] + randomPoint[0]
            endPoint[1] = endPoint[1] + randomPoint[1]
            endPoint[2] = endPoint[2] + randomPoint[2]

            rs.AddLine(startPoint, endPoint)
        

for panel in frontPanels:
    x = -5
    y = 2

    randomOffset = random.randint(0, 800)/1000

    for i in range(4):
        startPoint = rs.CreatePoint(panel[i])
        endPoint = rs.CreatePoint(panel[(i+1) % 4])

        randomOffsetStartPoint = rs.CreatePoint(panel[i])
        randomOffsetStartPoint[0] += x * randomOffset
        randomOffsetStartPoint[1] += y * randomOffset

        rs.AddLine(startPoint, randomOffsetStartPoint)

        endPoint[0] += x * randomOffset
        endPoint[1] += y * randomOffset

        rs.AddLine(randomOffsetStartPoint, endPoint) #blau

for panel in backPanels:
    x = 5
    y = -2

    randomOffset = random.randint(0, 800)/1000

    for i in range(4):
        startPoint = rs.CreatePoint(panel[i])
        endPoint = rs.CreatePoint(panel[(i+1) % 4])

        randomOffsetStartPoint = rs.CreatePoint(panel[i])
        randomOffsetStartPoint[0] += x * randomOffset
        randomOffsetStartPoint[1] += y * randomOffset

        line1 = rs.AddLine(startPoint, randomOffsetStartPoint)

        endPoint[0] += x * randomOffset
        endPoint[1] += y * randomOffset

        line2 = rs.AddLine(randomOffsetStartPoint, endPoint)
        rs.ObjectColor([line1, line2], (180, 100, 140)) #pink

for panel in upSidePanels:
    x = 2
    y = 5

    randomOffset = random.randint(0, 800)/1000
    
    for i in range(4):
        startPoint = rs.CreatePoint(panel[i])
        endPoint = rs.CreatePoint(panel[(i+1) % 4])

        randomOffsetStartPoint = rs.CreatePoint(panel[i])
        randomOffsetStartPoint[0] += x * randomOffset
        randomOffsetStartPoint[1] += y * randomOffset

        line1 = rs.AddLine(startPoint, randomOffsetStartPoint)

        endPoint[0] += x * randomOffset
        endPoint[1] += y * randomOffset

        line2 = rs.AddLine(randomOffsetStartPoint, endPoint)
        rs.ObjectColor([line1, line2], (100, 50, 255)) #weiß

for panel in sidePanels:
    x = -2
    y = -5

    randomOffset = random.randint(0, 800)/1000

    for i in range(4):
        startPoint = rs.CreatePoint(panel[i])
        endPoint = rs.CreatePoint(panel[(i+1) % 4])

        randomOffsetStartPoint = rs.CreatePoint(panel[i])
        randomOffsetStartPoint[0] += x * randomOffset
        randomOffsetStartPoint[1] += y * randomOffset

        line1 = rs.AddLine(startPoint, randomOffsetStartPoint)

        endPoint[0] += x * randomOffset
        endPoint[1] += y * randomOffset

        line2 = rs.AddLine(randomOffsetStartPoint, endPoint)
        rs.ObjectColor([line1, line2], (0, 250, 250)) #cyan

for panel in dachPanels:
    z = 5

    randomOffset = random.randint(0, 800)/1000

    for i in range(4):
        startPoint = rs.CreatePoint(panel[i])
        endPoint = rs.CreatePoint(panel[(i+1) % 4])

        randomOffsetStartPoint = rs.CreatePoint(panel[i])
        randomOffsetStartPoint[2] += z * randomOffset

        line1 = rs.AddLine(startPoint, randomOffsetStartPoint)

        endPoint[2] += z * randomOffset

        line2 = rs.AddLine(randomOffsetStartPoint, endPoint)
        rs.ObjectColor([line1, line2], (0, 250, 40)) #grün


       



########## 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")

