#########################       https://www.openstreetmap.org/export
### AGruber@tugraz.at ###       https://osmbuildings.org/
### OSM demo  2023/12 ###       
#########################


##############################
import rhinoscriptsyntax as rs
import sys, math, random   ###
sys.path.append("P:\WWW\daveh2\dm2/")     ###
sys.path.append("P:/")     ###

import DM_lib as dm
import OSM_lib as osm
  
 ### 
#######################
OSMpath = "P:\WWW\daveh2\dm2/"
OSMpath = "D:/OSM/osmData/"
#OSMpath = "C:/Users/Badarau Artiom/Desktop/OSM-Hu_08/osmData/"
#######################

OSMfile = "wien.osm"

##############################  # 
#rs.Sleep( 1000 )
#osm.eAA()                       # erase absolutely all objects, even hidden & locked
#osm.OSMi(OSMfile, OSMpath)
#osm.OSMi(OSMfile, OSMpath, trimBounds=1, do3D=1, minHeight=1.0, heightFac=10.0, randomize=[5.0, 10.0], doAllCurves=1, move2Guinea = 1, verbose=0)
##############################  reload (osm)

rs.UnitSystem(4)                # meters = 4
rs.ShowGrid(None, 0) 
rs.ShowGridAxes(None, 1) 
rs.EnableRedraw(0)
currentMode = rs.ViewDisplayMode(rs.CurrentView())
rs.ViewDisplayMode(rs.CurrentView(), "shaded")
rs.Redraw()
##############################

rs.ShowObjects(rs.AllObjects())

dm.newEmptyLayer("BRIDGES", [50,50,50])



bldg_0 = rs.ObjectsByName("_bldg3D_higBy_flo_253584766")[0]
rs.ObjectColor( bldg_0, [10,220,10])
bldg_1 = rs.ObjectsByName("_bldg3D_higBy_flo_236781457")[0]
rs.ObjectColor( bldg_1, [210,20,10])
bldg_2 = rs.ObjectsByName("_bldg3D_higBy_flo_31609644")[0]

rs.ObjectColor( bldg_2, [210,20,50])

bldgs = [bldg_0, bldg_1, bldg_2]


#rs.HideObjects( rs.AllObjects())
#rs.ShowObjects( [bldg_0, bldg_1] )


coords0 = dm.getSurfacePoints(bldg_0)
coords1 = dm.getSurfacePoints(bldg_1)
coords2 = dm.getSurfacePoints(bldg_2)
center_0 = dm.pntCentroid( coords0 )
center_1 = dm.pntCentroid( coords1 )
center_2 = dm.pntCentroid( coords2 )
#dm.textDots( coords1 )

zVal = center_0[2]
if  center_1[2] < zVal:
    zVal = center_1[2]

center_0[2] = zVal
center_1[2] = zVal
center_2[2] = zVal

rs.AddLine( center_0, center_1 )

#print bldgs


rs.HideObjects( rs.AllObjects())
rs.ShowObjects( bldgs )
allCoords = []
allCenters = []
for i,blg in enumerate(bldgs):
    rs.ObjectColor( blg, [50*i, 100, 255-50*i])
    coords = dm.getSurfacePoints(blg)
    center = dm.pntCentroid( coords ) 
    allCoords.append( coords ) 
    allCenters.append( center )

zVals = sorted( [ cor[2] for cor in allCenters ] )
zValmin=zVals[0]

#print zVals[0], zVals[-1]
######################################################################################################################
allCenters = [ [ cor[0], cor[1], zVals[0]*0.7*2 ] for cor in allCenters ]
allCentersoben = [ [ cor[0], cor[1], zVals[0]*0.7*2.5 ] for cor in allCenters ]
allCentersoben.append(allCentersoben[0])

allCentersobenBogen = []
for i in range(len(allCentersoben)-1):
    allCentersobenBogen.append(allCentersoben[i])
    allCentersobenBogen.append(allCentersoben[i])
    midPt = dm.pntInbetween(allCentersoben[i], allCentersoben[i+1], 0.5)
    midPt[2] -= 20.0
    allCentersobenBogen.append(midPt)
allCentersobenBogen.append(allCentersobenBogen[0])


print allCenters

combis = dm.combinate(bldgs, 3)
for comb in combis:
    coords0 = dm.getSurfacePoints(comb[0])
    coords1 = dm.getSurfacePoints(comb[1])
    coords2 = dm.getSurfacePoints(comb[2])
    center_0 = dm.pntCentroid( coords0 )
    center_1 = dm.pntCentroid( coords1 )
    center_2=dm.pntCentroid( coords2 )
    #rs.AddLine( center_0, center_1 )
combis = dm.combinate(bldgs, 2)

print center_0
rs.AddTextDot("P3",center_0)
rs.AddTextDot("P1",center_1)
rs.AddTextDot("P2",center_2)
#################################################################################

combis = dm.combinate(allCenters, 3)
for comb in combis:
    baselines = [rs.AddLine(comb[i], comb[(i + 1) % 3]) for i in range(3)]
    colors = [[200, 200, 0], [0, 200, 0], [200, 0, 0]]

    for i, baseline in enumerate(baselines):
        rs.ObjectColor(baseline, colors[i])
        
        offsetA = rs.OffsetCurve(baseline, [0, 1, 0], 10)
        offsetB = rs.OffsetCurve(baseline, [0, -1, 0], -10)
        
        leftside = rs.DivideCurve(offsetA, 600)
        rightside = rs.DivideCurve(offsetB, 600)
        midofa =rs.DivideCurve(baselines[0],2)
        midofb =rs.DivideCurve(baselines[1],2)
        midofc =rs.DivideCurve(baselines[2],2)
        midcenA=dm.pntCentroid(midofa)
        midcenB=dm.pntCentroid(midofb)
        midcenC=dm.pntCentroid(midofc)

 

 
        #rs.AddCurve([pnts],2]

        for j in range(600):
            BL=rs.AddLine(leftside[j], rightside[j])
            rs.ObjectPrintWidth(BL,4.0)
#################################################################################
fac=19
nVec=rs.VectorAdd([0,0,-10],[0,0,-10])
combiso = dm.combinate(allCentersoben, 3)
anzahl=300
rad=5
circDivision = 32*3
for combo in combiso:
    baselinesob = [rs.AddLine(combo[i], combo[(i + 1) % 2]) for i in range(2)]
    rs.HideObject(baselinesob)
    for i, baselineo in enumerate(baselinesob):
        colors = [[200, 200, 0], [0, 200, 0], [200, 0, 0]]
        rs.ObjectColor(baselineo, colors[i])
            
        offsetA = rs.OffsetCurve(baselineo, [0, 1, 0], 10)
        rs.HideObjects(offsetA)
        Pntofa=rs.DivideCurve(offsetA,2)[1]
        a=rs.AddPoint(Pntofa)
        a1=rs.MoveObject(a,nVec*fac)
        startp=rs.CurveStartPoint(offsetA)
        endp=rs.CurveEndPoint(offsetA)
        seil=rs.AddCurve([startp,a,endp],2)
        offseil=rs.OffsetCurve(seil, [0, 1, 0], -20)
        rs.HideObjects(offseil)
        dom = rs.CurveDomain( seil )[1]
        dom1 = rs.CurveDomain( offseil )[1]
        for i in range(anzahl+1):
                para = dom/anzahl*i
                para1=dom1/anzahl*i
                pX = rs.EvaluateCurve( seil, para)
                pX1 = rs.EvaluateCurve( offseil, para1)
                rs.AddPoint( pX )
                rs.AddPoint( pX1 )
                planeX = rs.CurvePerpFrame( seil, para )
                planeX1 = rs.CurvePerpFrame( offseil, para1 )
                circ = rs.AddCircle(planeX, rad)
                circ1 = rs.AddCircle(planeX1, rad)
                coords = rs.DivideCurve(circ, circDivision, 0)
                coords1 = rs.DivideCurve(circ1, circDivision, 0)
                


####################
rs.CurrentLayer("Default")
rs.ViewDisplayMode(None, "shaded")
dm.printDisplay(1)