
###################################
### DM2_w25 # AGruber@tugraz.at ###
### DEMO SUN & gherkin             
###################################

##############################
import rhinoscriptsyntax as rs
import random, time, sys, os   ###
sys.path.append("P:/")     ###
sys.path.append("P:/WWW/XXX/dm2/")
import DM_lib as dm        ### dm.reload_lib(dm)
##############################      

rs.UnitSystem(4)                                            # meters = 4, cm = 3 etc
rs.ShowGrid(None, False)                                    # grid > False = off
rs.ShowGridAxes(None, True)                                 # y/y/z axen display > False/True = off/on
rs.Command("cplane w t enter", False)				        # cPlane World Top
#rs.ViewDisplayMode(rs.CurrentView(), "pen")
rs.EnableRedraw(False)     ### 4_the_MACs

dm.newEmptyLayer("SUN::demo")
rs.Redraw()

crCords = []
cCordPt = []
anz = 15            # Anzahl der Kreise
hoehe = 30          # Hoehe der einzelnen Kreissegmente
rad = 50            # Anfangsradius
ptAnz = 20         # 20 Anzahl der Unterteilungen
grSteps = 5         # Wachstum bis zum wievieltem Kreis
shrinkSteps = 3     # Anuzahl der Kreise fuer Spitze

factor = 180/420
rad *= factor
hoehe *= factor

allCoords = []
for i in range(anz+1):
    level = hoehe*i
    if i <= grSteps:
        NeuRad = rad * ((i+1)**(1/6))       # Wachstumsfkt fuer Anfang
        #print NeuRad
    elif i <= anz-shrinkSteps:
        NeuRad = NeuRad * (0.985**(i-grSteps))  # Schrumpffunktion
        #print NeuRad
    else:
        n = i - (anz-shrinkSteps)
        NeuRad = NeuRad * (1- (n/4))
    if i==anz:
        NeuRad = 1
        level = hoehe*(i-1)+5
    cir = rs.AddCircle([0,0,level],NeuRad)
    rs.ObjectName( cir, "level_"+str(int(level)))
    pts = rs.DivideCurve(cir, ptAnz)
    #rs.AddPoints(pts)
    pts.append(pts[0])
    cCordPt.append(pts)
    allCoords.append( pts )

#print "len(allCoords[0])", len(allCoords[0])
#dm.textDots(allCoords[0][0:-1])

for i in range(ptAnz):
    dm.esc()
    coordsPositiv = []
    coordsNegativ = []
    for c,coordList in enumerate(allCoords):
        ptX = coordList[(i+c+1)%ptAnz]       ### %ptAnz: starte bei 0 wenn (i+c+1)==ptAnz
        coordsPositiv.append( ptX )
        ptX = coordList[ptAnz-(i+c+1)%ptAnz] ### %ptAnz: starte bei 0 wenn (i+c+1)==ptAnz
        coordsNegativ.append( ptX )
    rs.AddCurve( coordsPositiv, 1 )
    rs.AddCurve( coordsNegativ, 1 )
    #rs.ObjectColor(rs.AllObjects()[0], [250-10*i,0,50+10*i])
    #rs.ObjectColor(rs.AllObjects()[1], [0,250-10*i,50+10*i])
    rs.ObjectName(rs.AllObjects()[0], "negativ_"+str(i))
    rs.ObjectName(rs.AllObjects()[1], "positiv_"+str(i))
    rs.Redraw()

############################################
dm.ort = "shepperton" # "NYC UN", "HONOLULU"
dm.ort = "graz"
#dm.ort = "HONOLULU"
print "dm.ortX", dm.ortX( dm.ort )

dat = dm.getDateNow() 
print "dat / tim", dat
print "sonnenstand:", dm.setSun( verbose=0 )[0], "-", dm.setSun( verbose=0 )[1]
### https://www.sonnenverlauf.de/#/47.0696,15.4382,12/2025.12.12/12:14/1/3
############################################

dat=dm.number2date(365)
print "datt", dat

if 1:
    levels = rs.ObjectsByName("level_*")
    levels.reverse()
    for hor in range(10, 14, 1):
        for lev in range(1, len(levels), 2):
            dm.esc()
            coords = rs.DivideCurve(levels[lev], 365, 0)
            sha_coords = []
            for i,cor in enumerate(coords):
                dm.esc()
                pSun = cor
                #rs.AddPoint( pTop )
                if 1 and i%10==0:
                    #print i, dm.number2date( i )
                    dat=dm.number2date( i+1 )
                    rs.AddLoftSrf( rs.ObjectsByName("positiv*")[0:5] )
                    sun = dm.setSun(year=2025, mon=dat[0], day=dat[1], hour=hor, min=0, sec=0, verbose=0)
                    sunVec = sun[2]
                    sunVec = rs.VectorScale( sunVec, 1000.0)
                    pSha = rs.VectorAdd( pSun, sunVec )
                    pSha = rs.LinePlaneIntersection([pSun, pSha], rs.WorldXYPlane())
                    #rs.AddPoint( pSha )
                    sha_coords.append( pSha )
            if i and lev==len(levels)-1:
                beam = rs.AddLine( pSun, pSha )
                rs.CurveArrows(beam, arrow_style=2)
                rs.ObjectColor(beam, [100,100,10])
                rs.ObjectName( beam, str(hor)+"h - azi="+str(round(sun[0],2))+" alt="+str(round(sun[1],2))+" deg" )
    
            
            sha_coords.append(sha_coords[0])
            sha = rs.AddCurve( sha_coords, 1 )
            rs.ObjectName( sha, str(dat[0])+"_"+str(dat[1])+"_"+str(hor)+"h_lev_"+str(lev) )
            #rs.AddPlanarSrf( sha )
            dm.zA()
dat=dm.number2date( 112 )
#print "dat=", dat
#dm.setSun(year=2025, mon=12, day=12, hour=8, min=43, sec=25, verbose=0)




############################
########## EOS / EndOfScript
rs.EnableRedraw(True)     ### 4_the_MACs
#dm.eDup()                 ### delete duplicate objects 
dm.printDisplay(state=True, scale=1000)
#dm.zA( 0.9 )
dm.newEmptyLayer("Default")
print "done"