###################################
### DM2_w24 # 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/lukschme/dm2/")
import DM_lib as dm        ### reload( dm )
##############################      

rs.UnitSystem(4)                                        # 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.AppearanceColor(item=0, color=[235, 235, 255]) 
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.newEmptyLayer("Default")
dm.eA()
rs.Command("_-purge enter", 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=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
###VO Panel
UnoPanelCoords = dm.getUNpanelCoords(anzL=10*2, anzH=39*2, anzD=3*2, stepL=2, stepH=7, stepD=2) ### = 

###########################################################################################
##########################################################
frontPanels   = UnoPanelCoords[0]
backPanels    = UnoPanelCoords[1]
upSidePanels  = UnoPanelCoords[3]
sidePanels    = UnoPanelCoords[2]
allPanels     = UnoPanelCoords[4]
#################################

def myTsTPanel(panel, shuffle=1):
    p0,p1,p2,p3 = panel
    coords = [p0,p1,p2,p3,p0]
    if shuffle:
        random.shuffle( coords )
    deg = random.randint(1,3)
    rs.ObjectColor( rs.AddCurve( coords, deg ), [40*deg, 40*deg, 40*deg] )
    crv = rs.AddCurve( [p0,p2,p1,p3,p0], 1 )


def myPanel_fenster_open( panelX, anzahl = 3, anzahl_door=3, fac=0.1, fac_window=0.1,fac_balken=0.5, abstand=5 ):
    # create wall panel with a window with open shutters
    ### create frame
    p0,p1, p2, p3 = panelX
    panel_curve=rs.AddCurve([p0,p1,p2,p3,p0],1)
    ### create points for later making the correct lines
    p01 = dm.pntInbetween(p0,p2, fac)
    p02 = dm.pntInbetween(p2,p0, fac)
    p03 = dm.pntInbetween(p1,p3, fac)
    p04 = dm.pntInbetween(p3,p1, fac)
    px01 = dm.pntInbetween(p01,p02, fac_window)
    px02 = dm.pntInbetween(p02,p01, fac_window)
    px03 = dm.pntInbetween(p04,p03, fac_window)
    px04 = dm.pntInbetween(p03,p04, fac_window)
    py01 = dm.pntInbetween(px01,px04, fac_balken)
    py02 = dm.pntInbetween(px02,px03, fac_balken)
    py03 = dm.pntInbetween(px04,px02, fac_balken)
    py04 = dm.pntInbetween(px01,px03, fac_balken)
    ### create points and lines for shutters right side
    p_a_l_r_1=dm.pntInbetween(p04,p01, fac_window)
    p_a_l_r_2=dm.pntInbetween(p01,p04, fac_window)
    p_balkr_1=dm.pntInbetween(px04,p_a_l_r_2, fac_window)
    p_balkr_2=dm.pntInbetween(px02,p_a_l_r_1, fac_window)
    linbalkr_1= rs.AddLine(px04,p_balkr_1)
    linbalkr_2= rs.AddLine(px02,p_balkr_2)
    linbalkr_3= rs.AddLine(p_balkr_1,p_balkr_2)
    ### create points and lines for shutters right side
    p_a_l_l_1=dm.pntInbetween(p02,p03, fac_window)
    p_a_l_l_2=dm.pntInbetween(p03,p02, fac_window)
    p_balkl_1=dm.pntInbetween(px01,p_a_l_l_2, fac_window)
    p_balkl_2=dm.pntInbetween(px03,p_a_l_l_1, fac_window)
    linbalkl_1= rs.AddLine(px01,p_balkl_1)
    linbalkl_2= rs.AddLine(px03,p_balkl_2)
    linbalkl_3= rs.AddLine(p_balkl_1,p_balkl_2)
    ### create lines to make connection between window and shutter
    linx_0103=rs.AddLine(px01,px03)
    linx_0203=rs.AddLine(px04,px02)
    liny_0102=rs.AddLine(py01,py02)
    liny_0304=rs.AddLine(py03,py04)
    coordslinx_0103 = rs.DivideCurve(linx_0103, anzahl_door, 0)
    coordslinx_0203 = rs.DivideCurve(linx_0203, anzahl_door, 0)
    coordslinbalkl_3 = rs.DivideCurve(linbalkl_3, anzahl_door, 0)
    coordslinbalkr_3 = rs.DivideCurve(linbalkr_3, anzahl_door, 0)
    ###create shutter lines
    for i in range(anzahl_door):
        pS = coordslinx_0103[i]
        pE = coordslinx_0203[i]
        pS1 = coordslinbalkl_3[i]
        pE2 = coordslinbalkr_3[i]
        rs.AddLine(pS,pS1)
        rs.AddLine(pE,pE2)
    #rs.AddPoint(p02)
    coords_frame = [p01,p03,p02,p04,p01]
    coords_window = [px01,px03,px02,px04,px01]
    frame=rs.AddCurve(coords_frame,1)
    window=rs.AddCurve(coords_window,1)
    div_frame=rs.DivideCurve(frame,anzahl*5)
    div_panel=rs.DivideCurve(panel_curve,anzahl*5)
    #div_panel=rs.DivideCurve(door,anzahl*5)
    for i in range(anzahl*5):
        rs.AddLine(div_frame[i],div_panel[i])

def myPanel_dachfenster( panelX, anzahl = 3, fac=0.1, abstand=0.5 ):
    #took the one from ue_04
    p0,p1, p2, p3 = panelX
    lin_03 = rs.AddLine(p0,p3)
    lin_12 = rs.AddLine(p1,p2)
    #diag_02 = rs.AddLine(p0,p2)
    #diag_13 = rs.AddLine(p1,p3)
    vec_01 = rs.VectorSubtract(p0,p1)
    vec_03 = rs.VectorSubtract(p3,p0)
    normal_vec = rs.VectorCrossProduct(vec_01,vec_03)
    normal_vec = rs.VectorUnitize(normal_vec)
    normal_vec = rs.VectorScale(normal_vec, abstand)
    p01 = dm.pntInbetween(p0,p2, fac)
    p02 = dm.pntInbetween(p2,p0, fac)
    p03 = dm.pntInbetween(p1,p3, fac)
    p04 = dm.pntInbetween(p3,p1, fac)
    coords_abstand = [rs.VectorAdd(cor, normal_vec) for cor in[p01,p03,p02,p04,p01]]
    coords_dach = [p0,p1,p2,p3,p0]
    dach=rs.AddCurve(coords_dach,1)
    abstand=rs.AddCurve(coords_abstand,1)
    div_dach=rs.DivideCurve(dach,anzahl*5)
    div_abst=rs.DivideCurve(abstand,anzahl*5)
    for i in range(anzahl*5):
        rs.AddLine(div_dach[i],div_abst[i])

tst = 1
if tst:
    if 1: ### SETUP >> dont' exec @ homework !
        dm.newEmptyLayer("UNO::setUp", [120,120,240])
        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=0)
    if 1:
        dm.newEmptyLayer("UNO::tst", [100,110,200])
        for i,panel in enumerate(frontPanels+upSidePanels):          ### +backPanels+upSidePanels
            dm.esc()
            if 0 or panel[0][2] >=20: ###[x,y,z] >> 0,1,2
                pass
                randomsi = random.choice([0,1])
                if randomsi == 1:
                    myPanel_fenster_open( panel, anzahl = 3, anzahl_door=3, fac=0.1, fac_window=0.1,fac_balken=0.5, abstand=5 )
                else:
                    myPanel_dachfenster(panel,anzahl=10, fac=random.uniform(0.1,0.2),abstand=random.uniform(0.2,0.9999999))
                #myTsTPanel(panel, shuffle=1)
                if i and i%9==0:
                    rs.Redraw()


#######################################
################ HERE YOU GO AS YOU GO:
dm.newEmptyLayer("myPROJ", [100,110,200])






########## EOS / EndOfScript
rs.EnableRedraw(1)          ### 4_the_MACs
#dm.eDup( )                 ### delete duplicate objects 
dm.printDisplay(state=1, scale=1000, thickness=1, color='Display')
dm.zA( 0.9 )
rs.CurrentLayer("Default")

