###################################
### DM2_w25 # AGruber@tugraz.at ###
### hu_05 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("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, 1)                                # 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(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*2, anzD=3, stepL=2, stepH=3, stepD=2) ### = standard for hu_06
###########################################################################################
##########################################################
frontPanels   = UnoPanelCoords[0] ### list of coordLists !
backPanels    = UnoPanelCoords[1]
sidePanels    = UnoPanelCoords[2]
upSidePanels  = UnoPanelCoords[3]
allPanels     = UnoPanelCoords[4]
#################################

dm.newEmptyLayer("UNO::setUp", [120,120,140])

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), [100,0,200])
    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:4], 1.0 )
    rs.ZoomExtents()
    #for coords in BigPanelCoords[4]: rs.AddCurve( coords, 1 )


#for list in frontPanels:
#    rs.AddCurve( list, 1)
#
#dm.textDots( frontPanels[0] )
#dm.textDots( frontPanels[13] )
#
#rs.AddSrfPt( frontPanels[13] )

if 1: ### DEMO  >> dont' exec @ homework !
    print len(frontPanels)
    #dm.textDots( frontPanels[0] )
    
    for coords in frontPanels[0:10]+sidePanels:
        pass
        rs.AddPoints( coords )
        rs.AddCurve( coords, 1 )
        #rs.AddSrfPt( coords )
    #for coords in sidePanels[0:]:
    #    rs.AddPoints( coords )
    
    for coords in BigPanelCoords[4]:
        pass
        #rs.AddCurve( coords, 1 )
        
        
#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 0 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:

import random

### panel_DEF:
def myPanel(panel, basement=0, auskrag=5):
    p0, p1, p2, p3 = panel  # get items (==coords) from list
    
    nVec = dm.normVec3pnts(p0, p1, p2)
    zCor = p0[2]

    base_auskrag = dm.reMap(zCor, 0, 156, 10.0, -22.0)
    auskrag = base_auskrag + random.uniform(-5, 5)
    nVec = rs.VectorScale(nVec, auskrag)

    if basement != 0:
        crv = rs.AddCurve([p0, p1, dm.pntInbetween(p1, p3), p2, p3], 1)
        rs.ObjectPrintWidth(crv, 1)
        rs.ObjectColor(crv, [200, 0, 0])
        return

    offset_min, offset_max = 0.1, 0.45
    p00 = dm.pntInbetween(p0, p2, random.uniform(offset_min, offset_max))
    p10 = dm.pntInbetween(p1, p3, random.uniform(offset_min, offset_max))
    p20 = dm.pntInbetween(p2, p0, random.uniform(offset_min, offset_max))
    p30 = dm.pntInbetween(p3, p1, random.uniform(offset_min, offset_max))

    base = rs.AddCurve([p0, p1, p2, p3, p0], 1)
    innen = rs.AddCurve([p00, p10, p20, p30, p00], 2)

    coords = []
    for cor in [p00, p10, p20, p30]:
        cor = rs.VectorAdd(cor, nVec)
        cor = rs.VectorAdd(cor, [random.uniform(-0.5, 0.5),
                                 random.uniform(-0.5, 0.5),
                                 random.uniform(-0.5, 0.5)])  
        coords.append(cor)

    aussen = rs.AddCurve(coords + [coords[0]], 2)

    anz = int(dm.reMap(zCor, 0, 156, 10, 200))
    anz = max(5, anz + random.randint(-10, 10))  #zufaellig

    coordsA = rs.DivideCurve(aussen, anz, False)
    coordsB = rs.DivideCurve(base, anz, False)

    for i in range(min(len(coordsA), len(coordsB))):  ##linien
        crv = rs.AddCurve([coordsA[i], coordsB[i]], 1)
        rs.ObjectColor(crv, [random.randint(100, 255),
                             random.randint(0, 180),
                             random.randint(100, 255)])
        rs.ObjectPrintWidth(crv, 0.8 + random.random() * 0.5)


for i, panel in enumerate(frontPanels + sidePanels):
    basementVar = 1 if i < 10 else 0  
    myPanel(panel, basement=basementVar, auskrag=50)


#____________________________:here you end

#################################
#rs.ZoomExtents()
rs.EnableRedraw(1) ### 4 the MACs
dm.printDisplay(1)
dm.newEmptyLayer("Default")