#########################       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/")     ###

import DM_lib as dm
import OSM_lib as osm
  
 ### 
#######################
OSMpath = "P:\WWW\daveh2\dm2/"
#OSMpath = "L:/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", [100,200,200])

bldg_0 = rs.ObjectsByName("_bldg3D_higBy_flo_28109240")[0]
rs.ObjectColor( bldg_0, [10,220,10])
bldg_1 = rs.ObjectsByName("_bldg3D_higBy_flo_38155606")[0]
rs.ObjectColor( bldg_1, [210,20,10])
bldg_2 = rs.ObjectsByName("_bldg3D_higBy_hig_1201148267")[0]
rs.ObjectColor( bldg_2, [210,20,50])


#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 )

bldgs = ["_bldg3D_higBy_flo_28109240", "_bldg3D_higBy_flo_38155606", "_bldg3D_higBy_hig_1201148267"]
#print bldgs

for i,blg in enumerate(bldgs):
    blg = rs.ObjectsByName( blg )[0]
    bldgs[i] = blg
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.3 ] for cor in allCenters ]
allCentersoben.append(allCentersoben[0])
rs.AddCurve(allCentersoben,2)
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)
        ####
        a=rs.CurveStartPoint(offsetA)
        rs.AddPoint(a)
        rs.AddTextDot("h",a)
        a1=rs.CurveEndPoint(offsetA)
        rs.AddPoint(a1)
        rs.AddTextDot("h",a1)
        b=rs.CurveStartPoint(offsetB)
        rs.AddPoint(b)
        rs.AddTextDot("h",b)
        b1=rs.CurveEndPoint(offsetB)
        rs.AddPoint(b1)
        rs.AddTextDot("h",b1)

 
        #rs.AddCurve([pnts],2]
        ###
        for j in range(600):
            rs.AddLine(leftside[j], rightside[j])



nVec=rs.VectorAdd([0,0,10],[0,0,10])
SeilEnds=[a,a1,b,b1]
rs.MoveObjects(SeilEnds,nVec)












#
#print center_0
#rs.AddTextDot("AAAA",a)
#rs.AddTextDot("BBBB",b)
#rs.AddTextDot("CCCC",c)
#
#
#










#rs.AddTextDot("midcenA",midcenA)
#rs.AddTextDot("midcenB",midcenB)
#rs.AddTextDot("midcenC",midcenC)
#StA=rs.AddPolyline([center_0,midcenA,center_1])
#StB=rs.AddPolyline([center_1,midcenB,center_2])
#StC=rs.AddPolyline([center_0,midcenC,center_2])


##midcenAstuetze
#rad=3
#Anz=50
#dom = rs.CurveDomain( StA )[1]
#dom1 = rs.CurveDomain( StA )[0]
#dom2 = rs.CurveDomain( StA )[1]
#para = dom
#para1 = dom1
#para2 = dom2
#planeX = rs.CurvePerpFrame( StA, para )
#planeX1 = rs.CurvePerpFrame( StA, para1 )
#planeX2 = rs.CurvePerpFrame( StA, para2 )
#circ1 = rs.AddCircle(planeX, rad)
#circ2 = rs.AddCircle(planeX1, rad)
#circ3 = rs.AddCircle(planeX2, rad)
##circ=rs.AddCircle(midcenA,rad)
##circdv=rs.DivideCurve(circ,50)
#circ1dv=rs.DivideCurve(circ1,50)
#circ2dv=rs.DivideCurve(circ2,50)
#circ3dv=rs.DivideCurve(circ3,50)
#
#for i in range(Anz):
#    CList=circ3dv[i]
#    CList1=circ1dv[i]
#    CList2=circ2dv[i]
#    rs.AddPolyline([CList1,CList,CList2])
#
##midcenBstuetze
#dom = rs.CurveDomain( StB )[1]
#dom1 = rs.CurveDomain( StB )[0]
#para = dom
#para1 = dom1
#planeX = rs.CurvePerpFrame( StB, para )
#planeX1 = rs.CurvePerpFrame( StB, para1 )
#circ1 = rs.AddCircle(planeX, rad)
#circ2 = rs.AddCircle(planeX1, rad)
#circ=rs.AddCircle(midcenB,rad)
#circdv=rs.DivideCurve(circ,50)
#circ1dv=rs.DivideCurve(circ1,50)
#circ2dv=rs.DivideCurve(circ2,50)
#
#for i in range(Anz):
#    CList=circdv[i]
#    CList1=circ1dv[i]
#    CList2=circ2dv[i]
#    rs.AddPolyline([CList1,CList,CList2])
#
#
##midcenCstuetze
#dom = rs.CurveDomain( StC )[1]
#dom1 = rs.CurveDomain( StC )[0]
#para = dom
#para1 = dom1
#planeX = rs.CurvePerpFrame( StC, para )
#planeX1 = rs.CurvePerpFrame( StC, para1 )
#circ1 = rs.AddCircle(planeX, rad)
#circ2 = rs.AddCircle(planeX1, rad)
#circ=rs.AddCircle(midcenC,rad)
#circdv=rs.DivideCurve(circ,50)
#circ1dv=rs.DivideCurve(circ1,50)
#circ2dv=rs.DivideCurve(circ2,50)
#
#for i in range(Anz):
#    CList=circdv[i]
#    CList1=circ1dv[i]
#    CList2=circ2dv[i]
#    rs.AddPolyline([CList1,CList,CList2])