### https://iam.tugraz.at/diag/dm2/hu_07/elisa_widhalm_00.py
### grabbed:  2021-11-25 15:54:51
#################################


#######################################
### DM2_w21 # AGruber@tugraz.at     ###
### ue_06_tutorial_01 #  cana.letto ###
#######################################

##############################
import rhinoscriptsyntax as rs
import random, time, itertools, math
import sys
sys.path.append("/Volumes/app/WWW/sonne17/dm2/library")           ### add your path to rhino's default/search path
sys.path.append("/Volumes")                                    ### add _diag's path
sys.path.append("P:\WWW\maxi1234\dm2")                                    ### add _diag's path
import dm2_lib as dm2
##############################

#reload( dm2 )

##############################
##Unterwasserroehre fuehrt zu Campanile##
##Roehre voller Wirbel dieser wirbelt sich als Fassadendekor am Campanile empor##
##ueber den Campanile angekommen spannt sich ein Zeltdach ueber den Platz auf##
##los gehts

rs.UnitSystem(4)                                        # km = 5, meters = 4, cm = 3 etc
rs.Command("-groundplane Options On=No enter enter", 0) # groundplane > 0 = off
rs.ShowGrid(None, 0)                                    # grid > 0 = off
rs.ShowGridAxes(None, 0)                                # y/y/z axen display > 0 = off
rs.ViewDisplayMode(view=None, mode="Rendered")			# shadeMode fuer current view
rs.Command("cplane w t enter", 0)						# cPlane World Top

rs.EnableRedraw(0)
rs.UnselectAllObjects()
rs.Redraw()

dm2.newEmptyLayer( "PROJ", [32, 32, 32] )
dm2.newEmptyLayer( "PROJ::crv", [200,  100, 0] )
dm2.newEmptyLayer( "PROJ::srf", [ 100,  100, 200] )
dm2.newEmptyLayer( "PROJ::tmp",  [0, 0, 0] )
rs.Redraw()


#################################

rs.LayerVisible( "OSM", 1)

campanile = rs.ObjectsByName("_bldg3D_higBy_hig_252637693")[0]     #ID Campanile
coordsC = dm2.getSurfacePoints( campanile )                        # Koordinaten Campanile

centerX = dm2.pntInbetween( coordsC[1],coordsC[3], 0.5 )           #Definieren des Mittelpunkts im Campanile mittels der Eckpunkte 1 und 3 in halber Strecke
hoehe = centerX[2]                                                 #Definiert Hoehe des Mittelpunkts

centerX[2] = hoehe*0.3                                             #Endpunkt an definierter hoehe, Koordinate 2
#print centerX
centerX = dm2.pnt2cor( centerX )
#print centerX

rs.AddPoint( centerX )
#print "hoehe", hoehe



#dm2.textDots( coords ) # zeigt die Eckpunkte an


midLineNam = "crv_398987317"                # ID Curve die mittig durch den Fluss geht
objID = rs.ObjectsByName(midLineNam)[0]
coords = rs.CurvePoints( objID ) 
##print len(coords)
#crv = rs.AddCurve( coords, 3)           
#crv = rs.AddCurve( coords, 1)        ### ausblenden der Ursprungscurve mittig entlang Fluss         

coordsX = coords[6:56]              # Verbindung zwischen letzten Punkt und Campanile Mittelpunkt
coordsX.append(coords[58])          # Abrunden der Curve bei der Verbindung


          

#print len(coords)                                   

p1 = coordsC[3]
p1[2] = centerX[2]

vec = rs.VectorSubtract( p1, centerX)   #Vektor von Mitte zu Ecke
vecPlus = rs.VectorScale( vec, 5 )    #Vektor wird verlaengert

p0 = rs.VectorAdd(centerX, vecPlus)     #erster Punkt der Spirale
rs.AddPoint( p0 )

anzahl = 80
hoeheX = hoehe*0.9                      #Spirale anheben
steigg = hoeheX/(anzahl-1)
vecPlus = rs.VectorRotate( vecPlus, 35, [0,0,1] )   #Vektor rotiert um Campanile spiralig nach oben
coordsSpira = []                                    #Koordinaten Spirale
for i in range( anzahl ):
    vecPlus = rs.VectorScale( vecPlus, 0.975 )
    vecPlus = rs.VectorRotate( vecPlus, 10, [0,0,1] )
    p0 = rs.VectorAdd(centerX, vecPlus)
    p0 = rs.VectorAdd(p0, [0,0,steigg*i])
    coordsSpira.append( p0 )

coordsX.extend( coordsSpira )
coordsX = dm2.pnts2cors( coordsX )
crv = rs.AddCurve( coordsX, 3)   ###[Ursprung, Ende], definiert uebergang zackig zu weicher
coords = rs.DivideCurve( crv, 360*1 + 90, 0)


if 1:
    radius0 = 50               ##definiert den Radius der Roehre zu Beginn
    radius1 = 1                 ##definiert den Radius der Roehre Ende
    anz  = 20                   ##verdichtet die roehre
    if 1:
        allCoords = []
        for i ,cor in enumerate( coords ):
            param = rs.CurveClosestPoint( crv, cor )
            plnX = rs.CurvePerpFrame( crv, param )
            #radX = radius * (i + 1) / len(coords)
            # reMap(i, iMin, iMax, oMin, oMax) 
            radX = dm2.reMap( i, 0, len(coords)-1, radius0, radius1) 
            ptTop = plnX[0]
            circ = rs.AddCircle( plnX, radX)
            coordsX = rs.DivideCurve(circ , anz , 0)
            #rs.DeleteObject( circ )
            allCoords.append( coordsX )
        print plnX
        print ptTop
if 1:
    if 1: #erstellen einer roehre entlang fluss
        #rs.Redraw()
        for n in range(anz):
            coords = []
            for coordList in allCoords:
                #n +=1
                coords.append( coordList[n] )
                #if n>6: n=0
            rs.AddCurve(coords, 1)
            if n%2==0:rs.Redraw()
            if n==5:
                coordsStr = []
                coordsStr.extend (coords)


if 0:
    for ptX in coordsStr:                                   #Netz aus  geraden Linien, spannen sich vom obersten Punkt ueber Campanile zu der Roehre
        rs.ObjectColor(rs.AddLine (ptX, ptTop), [0,200,0])

if 1:                           # Netz spannt sich von obersten Punkt ueber Campanile zu mittelLinie auf der Roehre in einem Bogen
    for ptX in coordsStr:       # neue Liste fuer das Netz
        coordsCrv = []      
        coordsCrv.append (ptTop)
        ptMid = [ptX[0], ptX[1], ptTop[2]*0.6]         # Mittellinie auf der Roehre sitzt am Kreisbogen Punkt wird ueber Roehre projeziert
        coordsCrv.append (ptMid)
        coordsCrv.append (ptX)
        rs.ObjectColor(rs.AddCurve (coordsCrv), [100,100,100])
        #print ptMid[2], ptTop[2]


rs.CurrentLayer("Default")

rs.LayerVisible( "OSM", 1)
rs.LayerVisible( "OSM::other", 0)
#print len(allCoords)




