### https://iam.tugraz.at/dm2/w20/diag/dm2/hu_05_UN/emmaKrenz_hu_05_ag.py
### grabbed:  2020-11-13 10:13:39
#################################


### https://www.student.tugraz.at/emma.kretz/dm2/hue_05/hue_05.py
### grabbed:  2020-11-12 13:23:19
#################################


### DM2_w20
### hu_05_basic_script_structure
### structure4_unitednations
############################
#____________________________#
import rhinoscriptsyntax as rs
import random
# import sys # sys.path.append( "P:/" )
import dm2_lib as dm2   # "dm2" is alias 4 calling defs @ _dm2_lib
import osm_lib as osm   # "osm" is alias 4 calling defs @ _osm_lib
#_______________________________________________________________#


dm2.eA()
rs.EnableRedraw(0)
rs.ViewDisplayMode(rs.CurrentView(), "wireframe")

###_________________________________________# import OSM objects
if 0 or "OSM" not in rs.LayerNames() or not rs.ObjectsByLayer("OSM"):
    OSMfile = "NYC_UN_00_small.osm"
    dm2.eAA()
    osm.OSMi(OSMfile)
rs.LayerVisible("OSM", 0)
###_________________________________________#
### basic settings for grid to fit UN_slab  #
###                                         # ! no need 2 change !
floors = H  = dm2.H = 40                    # def=40 / incl roof
slabs  = L  = dm2.L = 11                    # def=11
depth  = D  = dm2.D =  4                    # def= 4 / division in building_depth
floorHeight = fH = dm2.fH = 4.0             # def= 4.0 / 4.0*(H-1) = 156 meters
                                            #
#############                               # get gridCoords L*D*H = 1760
UnoGridCoords     = dm2.getUnoGridCoords(L, D, H, fH)
dm2.UnoGridCoords = UnoGridCoords           # for the defs @ dm2_lib
#################___________________________#

rs.EnableRedraw(0)
rs.ViewDisplayMode(rs.CurrentView(), "wireframe")

#UnoGridCoords = dm2.getUnoGridCoords(11, 4, 40, 4.0)
#UnoGridCoords = dm2.UnoGridCoords           # for the defs @ dm2_lib

dm2.newEmptyLayer("UNO::slabs", [20,60,100])
dm2.newEmptyLayer("UNO::stair", [250,200,10])
dm2.newEmptyLayer("UNO::geo", [150,20,150])

depthVec  = rs.VectorUnitize(rs.VectorSubtract( dm2.getUnoCoord(0, 0, 0), dm2.getUnoCoord(0, 2, 0) ))
lengthVec = rs.VectorUnitize(rs.VectorSubtract( dm2.getUnoCoord(0, 0, 0), dm2.getUnoCoord(1, 0, 0) ))
rs.AddLine( dm2.getUnoCoord(0, 0, 0), dm2.getUnoCoord(0, 2, 0) )
rs.AddLine( dm2.getUnoCoord(0, 0, 0), dm2.getUnoCoord(1, 0, 0) )

p0 = dm2.getUnoCoord( 0,   0,   0)
p1 = dm2.getUnoCoord( L-1, 0,   0)
p2 = dm2.getUnoCoord( L-1, D-1, 0)
p3 = dm2.getUnoCoord( 0,   D-1, 0)
unoBaseCoords = [p0, p1, p2, p3, p0]
unoBaseCrv = rs.AddCurve( unoBaseCoords, 1)

     ######
##### demo:
if 0:######
    rs.CurrentLayer("UNO::slabs")
    for s in range(slabs):
        coords =                [ dm2.getUnoCoord( L, D, H ) for L in range(s,s+1) for D in range(0,1) for H in range(0, floors+0) ]
        coords.extend(          [ dm2.getUnoCoord( L, D, H ) for L in range(s,s+1) for D in range(1,depth-1) for H in range(floors-1, floors)] )
        coords.extend( reversed([ dm2.getUnoCoord( L, D, H ) for L in range(s,s+1) for D in range(depth-1,depth-0) for H in range(0, floors+0) ] ))
        coords.extend( reversed([ dm2.getUnoCoord( L, D, H ) for L in range(s,s+1) for D in range(1,depth-1) for H in range(0, 1)] ))
        rs.AddCurve( coords, 1), [20,60,100] 
        rs.ZoomBoundingBox(rs.BoundingBox(rs.ObjectsByLayer("UNO::slabs")))
        rs.Redraw()
    ### superSlim:
    crv = rs.AddCurve( [ dm2.getUnoCoord( L, D, H ) for L in range(0,11) for D in range(0,4) for H in range(37,40) ], 4)
    rs.ViewDisplayMode( rs.CurrentView(), "Ghosted")
    rs.ZoomBoundingBox(rs.BoundingBox(rs.ObjectsByLayer("UNO::slabs")))
    rs.LayerVisible("OSM", 1)
    rs.Redraw()
    rs.Sleep(2000)
    rs.LayerVisible("OSM", 0)
    rs.CurrentLayer("Default")

dm2.newEmptyLayer("UNO::points", [150,150,150])
#rs.AddPoints( UnoGridCoords ) #punkteraster
if 0:
    dm2.newEmptyLayer("UNO::proj", [250,50,50])
    pX = dm2.getUnoCoord( 4, 2, 20 )
    p7 = dm2.getUnoCoord( L-1, D-1, H-1 )
    rs.AddPoint( pX )
    
    dirDepthvec = rs.VectorSubtract( p0, p3 )
    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 ) #curve quer
    p1 = rs.VectorAdd( p1, [0,0,lenDepth*2.5] ) 
    crv = rs.AddCurve( [p0, pX, pVorFass, p1, p7] , 2 ) #curve
    divCoords = rs.DivideCurve( crv, 20, create_points=0, return_points=1 )
    rs.AddPoints( divCoords ) #points auf der curve
    
    anz = 59
    circDiv = 48
    allCircCoords = []
    for p in range(anz+1):
        fac = p/anz
        coord = dm2.pntCurvePerp( crv, fac )
        pnt = rs.AddPoint( coord )
        para = rs.CurveClosestPoint(unoBaseCrv, coord, segment_index=-1 )
        coordOnCrv = rs.EvaluateCurve( unoBaseCrv, para )
        rs.AddCurve( [coord,coordOnCrv ] )
        planeX = dm2.plnCurvePerp( crv, fac )
        #print planeX
        circ = rs.AddCircle(planeX, 10.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


#hausuebung_05_emmakretz
#achterbahn 

dm2.newEmptyLayer("UNO::_8terBahn", [10,150,30])

#definition der punkte

p0 = dm2.getUnoCoord ( 0, 0, 0) 
p1 = dm2.getUnoCoord ( 0, 0, 1) 
gridZ = rs.VectorSubtract( p1, p0 )

rs.AddCurve( [[0,0,0] , gridZ] )

pnt0 = dm2.getUnoCoord ( 0, 0, 0)     
pnt1 = dm2.getUnoCoord ( 0, 0, 39)   
pnt2 = dm2.getUnoCoord ( 5, 0, 39)   
pnt3 = dm2.getUnoCoord (10, 0, 39)     
pnt4 = dm2.getUnoCoord (10, 0, 0)     

p3 = dm2.getUnoCoord ( 10, 0, 0)
p4 = dm2.getUnoCoord ( 10, 1, 0)
gridX = rs.VectorSubtract( p4, p3 )

pnt5 = rs.VectorAdd(pnt4, gridX*-10)
pnt13= rs.VectorAdd(pnt5, gridZ*-10)

pnt7 = dm2.getUnoCoord (10, 3, 0)
pnt6 = rs.VectorAdd(pnt7, gridZ*-10)
pnt8 = dm2.getUnoCoord (10, 3, 39)
pnt14= dm2.getUnoCoord (8, 3, 39)
pnt19= dm2.getUnoCoord (7, 3, 20)
pnt16= dm2.getUnoCoord (6, 0, 15)
pnt9 = dm2.getUnoCoord (5, 0, 15)
pnt17= dm2.getUnoCoord (4, 0, 15)
pnt18= dm2.getUnoCoord (3, 3, 20)
pnt15= dm2.getUnoCoord (2, 3, 39)

#p5 = dm2.getUnoCoord ( 10, 3, 0)
#p6 = dm2.getUnoCoord ( 10, 2, 0)
#gridY = rs.VectorSubtract (p6, p5)

pnt10= dm2.getUnoCoord (0, 3, 39)
pnt11= dm2.getUnoCoord (0, 3, 0)
pnt12= dm2.getUnoCoord (0, 1, 0)

coords = [pnt0, pnt1, pnt3,pnt4, pnt5, pnt13, pnt6, pnt7, pnt8, pnt14, pnt19, pnt16, pnt17, pnt18, pnt15, pnt10, pnt11, pnt12]

crv_achterbahn = rs.AddCurve ( coords , 2 )#, pnt2, pnt3, pnt4, pnt5, pnt6], 1)
rs.AddPoints( coords )



if 1:
    #Ringe erstellen auf der crv_achterbahn
    num = 1000
    for i in range (num+1) :
       fac = i / num 
       coord = dm2.pntCurvePerp (crv_achterbahn, fac)
       rs.AddPoint ( coord )
       pln = dm2.plnCurvePerp (crv_achterbahn, fac)
       rs.AddCircle(pln, 8)

