##################################
### DM2_w22 # AGruber@tugraz.at ###
### ue_07 UN_headquaters  NYC   ###
###################################


##############################
import rhinoscriptsyntax as rs      ###
import random, time, sys            ###
sys.path.append("P:/")              ### add LW P:/ to rhino's default search path AND
sys.path.append("P:/WWW/default114/dm2/")     ### add YOUR LW P:/WWW/user/ to rhino's default search path ...
import DM2_lib as dm                ### ... thus DM2_lib.py can be found !
#import OSM_lib as osm               ### "osm" is alias 4 calling defs @ _osm_lib
##############################      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.printDisplay(1)                                      # nomen est omen
rs.EnableRedraw(0) ### MAC >> uncomment !


###_________________________________________# import OSM objects

###_________________________________________#
### basic settings for grid to fit UN_slab  #
###                                         # ! no need 2 change !
floors = H  = dm.H = 40                    # def=40 / incl roof
slabs  = L  = dm.L = 11                    # def=11
depth  = D  = dm.D =  4                    # def= 4 / division in building_depth
floorHeight = fH = dm.fH = 4.0             # def= 4.0 / 4.0*(H-1) = 156 meters
                                            #
#############                               # get gridCoords L*D*H = 1760
#UnoGridCoords     = dm.getUnoGridCoords(L, D, H, fH)
UnoGridCoords = dm.UnoGridCoords           # for the defs @ dm_lib
#################___________________________#




####################################################
#UnoGridCoords = dm.getUnoGridCoords(11, 4, 40, 4.0) ### is executed at the end of DM2_lib
UnoGridCoords = dm.UnoGridCoords
####################################################

dm.newEmptyLayer("UNO::slabs", [20,60,100])
dm.newEmptyLayer("UNO::stair", [250,200,10])
dm.newEmptyLayer("UNO::geo", [150,20,150])

depthVec  = dVec = rs.VectorUnitize(rs.VectorSubtract( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(0, 1, 0) ))
lengthVec = lVec = rs.VectorUnitize(rs.VectorSubtract( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(1, 0, 0) ))
heightVec = hVec = rs.VectorUnitize(rs.VectorSubtract( dm.getUnoCoord(0, 0, 1), dm.getUnoCoord(0, 0, 0) ))
rs.AddLine( dm.getUnoCoord(0, 0, 1), dm.getUnoCoord(0, 2, 1) )
rs.AddLine( dm.getUnoCoord(0, 0, 1), dm.getUnoCoord(1, 0, 1) )
rs.AddLine( dm.getUnoCoord(0, 0, 1), dm.getUnoCoord(0, 0, 4) )

pX = dm.getUnoCoord(0, 2, 10)
pY = dm.getUnoCoord(L-1, 0, H-1)
#rs.AddLine(pX,pY)

#rs.AddCircle(pX,30.5)

################################
pXX = dm.getUnoCoord(5, 0, 40-1)
lenx = 50.1
#rs.AddLine( pXX , rs.VectorAdd(pXX, rs.VectorScale( dVec, lenx*-1 ) ) )
#rs.AddLine( pXX , rs.VectorAdd(pXX, rs.VectorScale( lVec, lenx*-5 ) ) )
####################################################################

############################################################
############################################################
############################################################

p0 = dm.getUnoCoord( L-1,   0,   H-1)
p1 = rs.VectorAdd(p0,rs.VectorScale(dVec,20))
p10 = dm.getUnoCoord( L-1, 3,   H-1)
p11 = rs.VectorAdd(p10,rs.VectorScale(dVec,-20))
p2 = dm.getUnoCoord( L-3, 0,   H-3)
p3 = rs.VectorAdd(p2,rs.VectorScale(dVec,35))
p4 = dm.getUnoCoord( L-5, 0,   H-5)
p5 = rs.VectorAdd(p4,rs.VectorScale(dVec,30))
p6 = dm.getUnoCoord( L-5, 3,   H-5)
p7 = rs.VectorAdd(p6,rs.VectorScale(dVec,-5))
p8 = dm.getUnoCoord( L-5, 3,   H-1)
p9 = rs.VectorAdd(p8,rs.VectorScale(dVec,-30))
p12 = rs.VectorAdd(rs.VectorAdd(p9,rs.VectorScale(hVec,40)),rs.VectorScale(lVec,5.825))
p13 = rs.VectorAdd(rs.VectorAdd(dm.getUnoCoord(L-6,D-2,H-1),rs.VectorScale(dVec,4.7)),rs.VectorScale(hVec,60))
p14 = rs.VectorAdd(rs.VectorAdd(rs.VectorAdd(dm.getUnoCoord(L-7,0,H-1),rs.VectorScale(lVec,-5.825)),rs.VectorScale(hVec,40)),rs.VectorScale(dVec,30))
p15 = dm.getUnoCoord( L-7, 0,   H-1)
p16 = rs.VectorAdd(p15,rs.VectorScale(dVec,30))
p17 = dm.getUnoCoord( L-7, 0,   H-5)
p18 = rs.VectorAdd(p17,rs.VectorScale(dVec,5))
p19 = dm.getUnoCoord( L-7, 3,   H-7)
p20 = rs.VectorAdd(p19,rs.VectorScale(dVec,-5))
p21 = rs.VectorAdd(dm.getUnoCoord(L-9,3,H-9),rs.VectorScale(dVec,-20))
p22 = rs.VectorAdd(dm.getUnoCoord(0,3,H-11),rs.VectorScale(dVec,-20))
p23 = rs.VectorAdd(rs.VectorAdd(dm.getUnoCoord(0,2,H-11),rs.VectorScale(dVec,4.7)),rs.VectorScale(lVec,20))
p24 = rs.VectorAdd(dm.getUnoCoord(0,0,H-11),rs.VectorScale(dVec,20))
p25 = rs.VectorAdd(dm.getUnoCoord(L-9,0,H-9),rs.VectorScale(dVec,20))
p26 = rs.VectorAdd(dm.getUnoCoord(L-1,0,H-6),rs.VectorScale(dVec,20))
p27 = rs.VectorAdd(dm.getUnoCoord(L-1,0,H-5),rs.VectorScale(lVec,-20))
p28 = rs.VectorAdd(dm.getUnoCoord(L-1,3,H-3),rs.VectorScale(lVec,-20))
p29 = rs.VectorAdd(rs.VectorAdd(p28,rs.VectorScale(dVec,-20)),rs.VectorScale(hVec,4))

points_inside = [p0,p2,p10,p4,p6,p8,p15,p17,p19]
points_outside = [p1,p11,p3,p5,p7,p9,p12,p13,p14,p16,p18,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29]
#pntsin = rs.AddPoints(points_inside)
#rs.ObjectColor(pntsin,[255,0,0])
#pntsout = rs.AddPoints(points_outside)
#rs.ObjectColor(pntsout,[0,255,0])
#rs.AddPoint(p3)
unoBaseCoords = [p11,p10,p0,p1,p3,p5,p4,p6,p7,p9,p12,p13,p14,p16,p18,p17,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p11]
unoBaseCrv = rs.AddCurve( unoBaseCoords, 2)
rs.ObjectPrintWidth(unoBaseCrv,0.5)


#pts_crv = rs.DivideCurve(unoBaseCrv,100,create_points= True)
dom = rs.CurveDomain(unoBaseCrv)[1]
circles = []
crl_pnts = []

for i in range(101):
    fakt = i/100
    a = dm.plnCurvePerp(unoBaseCrv,dom*fakt)
    crl = rs.AddCircle(a,2)
    circles.append(crl)
    crl_dom = rs.CurveDomain(crl)
    crl_pnts.append(rs.DivideCurve(crl,8,create_points= False))

#p = crl_pnts[7][7]
#ps = rs.AddPoint(p)
#rs.SelectObject(ps)
crl_rows = []
lowest_points = []

for f in range(8):
    crl_rows = []
    for i in range(100):
        coords = sorted(crl_pnts[i], key=lambda vecZ: (vecZ[2]) )
        crl_rows.append(crl_pnts[i][f])
        lowest_points.append(coords[0])#crl_pnts[i][7]
    crl_rows.append(crl_pnts[0][f])
    rs.AddCurve(crl_rows,2)



border = []
border_top = []
border_front = []
border_back = []
border_left = []
border_right = []
for l in range(11):
        for d in range(4):
            border_top.append( dm.getUnoCoord(l,d,39))
for l in range(11):
    for h in range(40):
        border_front.append( dm.getUnoCoord(l,0,h))
        border_back.append( dm.getUnoCoord(l,3,h))
for d in range(4):
    for h in range(40):
        border_left.append( dm.getUnoCoord(0,d,h))
        border_right.append( dm.getUnoCoord(10,d,h))
border.extend(border_top)
border.extend(border_front)
border.extend(border_back)
border.extend(border_left)
border.extend(border_right)
#for i in enumerate( border):
    #print i

dis_pnts = []
for i,point in enumerate(lowest_points):
    if i%5==0:
        vec1 = rs.VectorAdd(point,rs.VectorScale(hVec,-20))
        #curve1 = rs.AddCurve([point,vec1],1)
        dis_pnts = dm.pntsSortDistancePnt(vec1,UnoGridCoords)
        for i in range(1244):
            if dis_pnts[0] == border[i]:
                rs.AddCurve([point,dis_pnts[0]],1)



############################################################
############################################################
############################################################

dm.newEmptyLayer("UNO::points", [150,150,150])
rs.AddPoints( UnoGridCoords )

dm.newEmptyLayer("UNO::proj", [250,50,50])
for i in range(64):
    p0 = dm.getUnoCoord( random.randint(0,L-1), random.randint(0,D-1), random.randint(0,H-1) )
    p1 = dm.getUnoCoord( random.randint(0,L-1), random.randint(0,D-1), random.randint(0,H-1) )
    #rs.AddCurve( [p0, p1] )
    #dm.textDots(  [p0, p1] )
    
rs.ZoomExtents()

if 0:
    coords = UnoGridCoords[:]
    random.shuffle( coords )
    rs.AddCurve( coords[0:100] )


#############################
##### demo karla m. / DM2_w20
if 0:
    pX = dm.getUnoCoord( 4, 2, 20 )
    dirDepthvec = rs.VectorSubtract( dm.getUnoCoord( 0,   0,   0), dm.getUnoCoord( 0,   D-1, 0) )
    lenDepth = rs.VectorLength( dirDepthvec )
    print "lenDepth",lenDepth
    dirDepthvec = rs.VectorScale( rs.VectorUnitize( dirDepthvec ), lenDepth*2 )
    pVorFass = rs.VectorAdd( pX , dirDepthvec )
    #rs.AddCurve( [pX, pVorFass] , 2 )
    p1 = rs.VectorAdd( p1, [0,0,lenDepth*2.5] ) 
    #crv = rs.AddCurve( [p0, pX, pVorFass, p1, p7, p2, p3] , 2 )
    
    karlaCoords = []
    counter = 0
    for h in range(0, H-1, 2):
        counter = counter+1
        if counter%4 == 1:
            karlaCoor = rs.VectorAdd(dm.getUnoCoord( int((L-1)/2), 0, h ), dirDepthvec)
        if counter%4 == 2:
            karlaCoor = dm.getUnoCoord( L-1, int((D-1)/2), h )
        if counter%4 == 3:
    #        karlaCoor = rs.VectorAdd(dm.getUnoCoord( int((L-1)/2), D-1, h ), [0,0,0])
            karlaCoor = rs.VectorAdd(dm.getUnoCoord( int((L-1)/2), D-1, h ), rs.VectorScale(dirDepthvec, -1))
        if counter%4 == 0:
            karlaCoor = dm.getUnoCoord( 0, int((D-1)/2), h )
        karlaCoords.append(karlaCoor)
    crv = rs.AddCurve(karlaCoords, 3)
    
    
    anz = 200
    circDiv = 18
    allCircCoords = []
    dom = rs.CurveDomain(crv)[1]
    for p in range(anz+1):
        fac = p/anz
        #print fac
        coord = dm.pntCurvePerp( crv, dom*fac )
        pnt = rs.AddPoint( coord )
        para = rs.CurveClosestPoint(unoBaseCrv, coord)
        coordOnCrv = rs.EvaluateCurve( unoBaseCrv, para )
        #rs.AddCurve( [coord,coordOnCrv ] )
        planeX = dm.plnCurvePerp( crv, dom*fac )
        #print planeX
        circ = rs.AddCircle(planeX, 3.4 )
        coords = rs.DivideCurve( circ, circDiv, 0)
        allCircCoords.append(coords)
    
    for i in range(circDiv):
        corrdsX = []
        for circList in allCircCoords:
            corrdsX.append(circList[i])
        rs.ObjectColor(rs.AddCurve(corrdsX, 1), [100,100,100] )
    
    anzPoints = len(rs.ObjectsByType(1))
    print "anzPoints", anzPoints

###################################
rs.EnableRedraw(1) ### 4 the MACs
dm.newEmptyLayer("Default")