###################################
### DM2_w22 # AGruber@tugraz.at ###
### ue_08 OSM demo PULA         ###
###################################


##############################
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)
##############################      reload (osm)

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(), "Ghosted")
dm.printDisplay(0)                                      # nomen est omen
rs.EnableRedraw(0) ### MAC >> uncomment !

#######################
OSMpath = "P:/WWW/default114/dm2/osmData/"
#######################


OSMfile = "pula_sm.osm"

osm.move2guinea = 1

if 0:
    dm.eAA() # erase absolutely all objects, even hidden & locked
    osm.OSMi(OSMfile, OSMpath, trimBounds=1, do3D=1, minHeight=1.0, heightFac=1.0, randomize=[6.0, 20.0], doAllCurves=1, verbose=0)
    rs.LayerVisible("OSM::diverses", 1)
    rs.ZoomBoundingBox( rs.BoundingBox( rs.ObjectsByName("bounds_*") ) )

if 0:
    dat = dm.getDateNow()
    dm.setSun ( year=dat[0], mon=dat[1], day=dat[2], hour=10, min=dat[4], sec=dat[5], verbose=0)
    rs.ViewDisplayMode(rs.CurrentView(), "Rendered")

if 1: ### the arena of pula rebuilt
    rs.LayerVisible("OSM", 1)
    dm.newEmptyLayer("PROJ::crv", [100,100,100] )
    
    arenaOSM = rs.ObjectsByName("_bldg3D_higBy_ran_inner_76174055")[0]
    arenaOSMcoords = dm.getSurfacePoints( arenaOSM )
    print len(arenaOSMcoords)
    arenaBase = rs.ObjectsByName("Wcrv_76174055")[0]
    coordsArenaBase = rs.CurveEditPoints(arenaBase)
    centerArena = dm.pntCentroid( coordsArenaBase )
    if 1:
        rs.AddLine( [0,0,0], centerArena )
        allBuildingsCoords = []
        for bldg in rs.ObjectsByLayer("OSM::buildings::_bldg3D_srf")[0:]:
            coords = dm.getSurfacePoints( bldg )
            allBuildingsCoords.extend( [cor for cor in coords if cor[2] > 0 and rs.Distance(centerArena, cor)<200.0  and cor not in arenaOSMcoords ] )
        dm.allBuildingsCoords = allBuildingsCoords
    
    allBuildingsCoords = dm.allBuildingsCoords
    print "len(allBuildingsCoords)", len(allBuildingsCoords)
    rs.AddCurve( allBuildingsCoords, 1 )
    
    arenaInnen = rs.ObjectsByName("Wcrv_678838314")[0]
    arenaAussen = rs.ObjectsByName("Wcrv_76174055")[0]
    
    arenaInnenCoords = rs.CurveEditPoints(arenaInnen)
    arenaAussenCoords = rs.CurveEditPoints(arenaAussen)
    
    ######################
    anzahl = 8
    hoeheArena = 16.0
    ######################
    
    #rs.LayerVisible("OSM", 0)
    arenaInnen = rs.AddCurve( arenaInnenCoords, 2)
    arenaAussen = rs.AddCurve( arenaAussenCoords, 2)
    arenaAussenCoords = rs.DivideCurve(arenaAussen, anzahl, 0)
    arenaInnenCoords = rs.DivideCurve(arenaInnen, anzahl, 0)
    
    
    #arenaInnenCoords = []
    for cor in arenaAussenCoords:
        closest = dm.pntCurveClosest( cor, arenaInnen )
        #rs.AddLine( cor, closest)
    
    
    #arenaInnenCoords = []
    for i in range(anzahl):
        pass
        #rs.AddLine( arenaInnenCoords[i], arenaAussenCoords[i])
    
    lin = rs.AddLine( dm.pntCentroid(arenaAussenCoords), rs.CurveStartPoint(arenaAussen) )
    
    intersX = rs.CurveCurveIntersection(arenaInnen, lin)[0][1]
    print intersX
    rs.AddPoint(intersX)
    
    param = rs.CurveClosestPoint(arenaInnen, intersX)
    print param
    
    dom = rs.CurveDomain(arenaInnen)[1]
    
    rs.CurveSeam(arenaInnen, dom*0.75)
    rs.AddPoint( rs.CurveStartPoint(arenaInnen))
    
    rs.CurveSeam(arenaInnen, param)
    rs.AddPoint( rs.CurveStartPoint(arenaInnen))
    
    rs.AddLine( rs.CurveStartPoint(arenaInnen), rs.CurveStartPoint(arenaAussen) )
    
    rs.ReverseCurve(arenaInnen)
    arenaAussenCoords = rs.DivideCurve(arenaAussen, anzahl, 1)
    arenaInnenCoords = rs.DivideCurve(arenaInnen, anzahl, 0)
    #arenaInnenCoords = []
    
    #dm.newEmptyLayer("PROJ::crv", [200,100,100] )
    
    arenaAussenOben = [ rs.VectorAdd(cor, [0,0,hoeheArena]) for cor in arenaAussenCoords ]
    for i in range(anzahl):
        pass
        rs.ObjectColor( rs.AddCurve( [arenaInnenCoords[i], arenaAussenCoords[i], arenaAussenOben[i]], 1 ), [110,110,200])
        rs.ObjectPrintWidth( rs.AllObjects()[0], 0.5 )
        if 1:
            crv = rs.AddCurve( [arenaAussenOben[i], arenaAussenOben[(i+1)*(i<anzahl-1)]], 2)
            rs.RebuildCurve(crv, 2, 3)
            rs.EnableObjectGrips( crv, 1)
            pM = rs.ObjectGripLocations(crv)[1]
            rs.ObjectGripLocation(crv, 1, rs.VectorAdd(pM, [0,0,40] ))
            rs.EnableObjectGrips( crv, 0)
    
            p0 = arenaAussenOben[i]
            p1 = arenaAussenOben[(i+1)*(i<anzahl-1)]
            p01 = rs.VectorAdd(p0, [0,0,20])
            p11 = rs.VectorAdd(p1, [0,0,20])
            rs.AddCurve( [p0, p01, p11, p1], 2)
            rs.ObjectPrintWidth( rs.AllObjects()[0:2], 0.5 )
            
    for i in range(anzahl):
        pX = arenaAussenOben[i]
        pC = allBuildingsCoords[rs.PointArrayClosestPoint(allBuildingsCoords, pX)]
        lin = rs.AddLine( pX, pC )
        rs.ObjectPrintWidth( lin, 1 )
    
    rs.AddCurve( arenaOSMcoords, 1)

if 1:
    for obj in rs.ObjectsByLayer("OSM::buildings::_bldg3D_srf"):
        R=random.randint(200,220)
        G=random.randint(200,210)
        B=random.randint(200,210)
        transe = random.uniform(0.7,0.9)
        dm.rgbMat2Obj( obj, R, G, B, T=transe, Gloss=125.0, Refl=0.5 )
    rs.LayerColor("OSM::buildings::_bldg3D_crv", [111, 111, 111] )


#################################
rs.EnableRedraw(1) ### 4 the MACs
dm.printDisplay(1)
dm.PointRadius(2, 2)
dm.eDup(1)
rs.CurrentLayer("Default")

if 0: # the problem of distance_from_guinea
    dm.newEmptyLayer("Default")
    rs.CopyObject( rs.AddLine( [0,0,0], [1400000,0,0] ), [0,0,150000] )
    srf = rs.AddLoftSrf( rs.AllObjects()[0:2] )
    dm.rgbMat2Obj( srf, 100,200,250)
    rs.Command( "ArrayPolar selid "+str(rs.AllObjects()[0])+" enter 0,0,0 12 360 enter", 0 )
    rs.AddCircle( [0,0,0], 1000000 )# 
    rs.MoveObject(rs.AddRectangle(rs.WorldXYPlane(), 2000000,2000000), [-1000000, -1000000, 0])
    rs.ZoomExtents()

###############################################
#___4_lazy_experts: automated capture to LW P:/
if 1:
    #rs.ZoomExtents()
    rs.ZoomBoundingBox( rs.BoundingBox( rs.ObjectsByLayer("OSM::buildings::_bldg3D_srf") ) )
    rs.Command("-zoom Factor 0.85 enter", 0) # decrease zoom for better framing
    rs.ViewDisplayMode(rs.CurrentView(), "Ghosted")
    rs.Redraw()
    if 0:
        path = "P:/ue_08/images/"
        name = "demo_ue_08_NYC_"
        # .png / transparent background
        rs.Command("-viewCaptureToFile Width=480  Height=360  Scale=2 DrawCPlaneAxes=No TransparentBackground=Yes "+path+name+".png", 0)
        # .jpg and Scale=4 for webSite submission
        name = name+str(int(time.time()))+".jpg"
        rs.Command("-viewCaptureToFile Width=480  Height=360  Scale=4 TransparentBackground=No  "+path+name, 0)