### https://www.student.tugraz.at/elisa.widhalm/dm2/hue_03/hue_03.py
### grabbed:  2021-10-28 22:12:59
#################################


### https://iam.tugraz.at/diag/dm2/hu_03/_4_elisa_widhalm_00.py
### grabbed:  2021-10-28 19:07:06
#################################


### https://www.student.tugraz.at/elisa.widhalm/dm2/hue_03/hu_03.py
### grabbed:  2021-10-28 18:41:26
#################################


########################################
### DM2_w21 # AGruber@tugraz.at        #############
### hu_03_startUp # tool4_g.mercator || g.hopper ###
####################################################

##############################
import rhinoscriptsyntax as rs
import random, time, itertools
##############################


rs.UnitSystem(5)                                        # km = 5, meters = 4, cm = 3 etc
rs.Command("-groundplane Options On=No enter enter", 0) # groundplane > off
rs.ShowGrid(None, 0)
rs.ShowGridAxes(None, 0)
rs.EnableRedraw(0)
rs.DeleteObjects( rs.AllObjects() )

print "\t   _____      ____"
print "\t  |     | >  /   .\\"
print "\t  |     | < /    . \\"
print "\t  |     | > |    . |  "
print "\t  |     | > \\      /  ____________________________  _____________"
print "\t  |_____| <  \____/   my_tools4_gerardus_mercator_||_grace_hopper\n"



def coords2sphere ( coords, center, radius, makePts=1, makeCrv=0, makeProjectCrv=0 ):
    if center in coords:
        coords.remove( center )
    coordsOnSphere=[]
    for vec in coords:
        cor = vec
        if not rs.Distance( vec, center ):
            continue
        vec = rs.VectorSubtract( vec, center ) # == vec center..cor
        vec = rs.VectorUnitize( vec )
        vec = rs.VectorScale( vec, radius )
        vec = rs.VectorAdd( center, vec)
        coordsOnSphere.append( vec )
        if makeProjectCrv==1:
            rs.AddLine( center, vec )
        if makeProjectCrv==2:
            rs.AddLine( cor, vec )
    if makePts:
        rs.ObjectColor(rs.AddPoints( coordsOnSphere ), [10,10,10] )
    if makeCrv:
        rs.AddCurve( coordsOnSphere, makeCrv )
    return coordsOnSphere


#______setUp hu_02 .. reUse
lenX = 10       
lenY = random.randint(lenX, lenX*4)
lenZ = random.randint(lenX, lenX*9)




vecX = [1, 0, 0]
vecY = rs.VectorUnitize([ random.uniform(0,0.5), random.uniform(0.5,1), 0 ])
vecZ = rs.VectorUnitize([ random.uniform(-0.5,0.5), random.uniform(-0.5,0.5), 1 ])

rs.ObjectColor( rs.AddCurve([ [0,0,0], rs.VectorScale(vecX, lenX) ] ), [200,0,0] )
rs.ObjectColor( rs.AddCurve([ [0,0,0], rs.VectorScale(vecY, lenY) ] ), [0,200,0] )
rs.ObjectColor( rs.AddCurve([ [0,0,0], rs.VectorScale(vecZ, lenZ) ] ), [0,0,200] )
rs.AddPoints( [rs.VectorScale(vecX, lenX), rs.VectorScale(vecY, lenY), rs.VectorScale(vecZ, lenZ)] )

#______(one) center of parallelepiped
centerX = rs.VectorAdd(rs.VectorScale(vecX, lenX*0.5), rs.VectorScale(vecY, lenY*0.5))
centerX = rs.VectorAdd(centerX, rs.VectorScale(vecZ, lenZ*0.5))
radiusX = rs.VectorLength( centerX )*1.0001
rs.AddPoint( centerX )

#rs.AddSphere( centerX, radiusX)
#radiusX = 6371                 # km, erdradius
anzAll_0 = len(rs.AllObjects()) # number of objects in scene, now

#______here comes a demo of coords2sphere(..):

crvZ = rs.AddCurve([ [0,0,0], rs.VectorScale(vecZ, lenZ) ] )
coordsZ = rs.DivideCurve( crvZ, lenZ, create_points=0, return_points=1)  
coords2sphere ( coordsZ, centerX, radiusX, makePts=0, makeCrv=1, makeProjectCrv=0 )

crvX = rs.AddCurve([ [0,0,0], rs.VectorScale(vecX, lenX) ] )
coordsX = rs.DivideCurve( crvX, lenX, create_points=0, return_points=1)  
coords2sphere ( coordsX, centerX, radiusX, makePts=0, makeCrv=1, makeProjectCrv=0 )

crvY = rs.AddCurve([ [0,0,0], rs.VectorScale(vecY, lenY) ] )
coordsY = rs.DivideCurve( crvY, lenY, create_points=0, return_points=1)  
coords2sphere ( coordsY, centerX, radiusX, makePts=0, makeCrv=1, makeProjectCrv=0 )

#rs.ZoomExtents()
#rs.Redraw()

rs.Sleep( 0 )                    # sleep: just for fun
anzAll_1 = len(rs.AllObjects())     # number of objects in scene, now
rs.DeleteObjects( rs.AllObjects()[0:anzAll_1 - anzAll_0] )


#______here comes my tool4_mercator:

rs.DeleteObjects( rs.ObjectsByType( 1+4 ) )

regalLevels = []
coordsX = []
coordsY0 = []
coordsYlenY = []
allCoords = []
for x in range(lenX+1):
    vec_x = rs.VectorScale(vecX, x)
    #rs.AddPoint( vec_x )
    for y in range(lenY+1):
        vec_y = rs.VectorScale(vecY, y)
        vec_y = rs.VectorAdd( vec_y, vec_x )
        #rs.AddPoint( vec_y )
        for z in range(lenZ+1):
            vec_z = rs.VectorScale(vecZ, z)
            vec_z = rs.VectorAdd( vec_y, vec_z )
            allCoords.append( vec_z )
            if (x==0 and z<lenZ/3) or (x==lenX and z>lenZ/3*2) :
                coordsX.append( vec_z )
            if y==0 and z<lenZ/3:
                coordsY0.append( vec_z )
            if y==lenY and z>lenZ/3*2:
                coordsYlenY.append( vec_z )

rs.AddPoints( coordsY0 )
rs.AddPoints( coordsYlenY )
rs.AddPoints( coordsX )

#random.shuffle(coordsY0)
#random.shuffle(coordsYlenY)

#rs.AddCurve( coordsY0, 1)
#rs.AddCurve( coordsYlenY, 1)

coordsXX = []
coordsYY = []
coordsZZ = []
for i in range(200):
    p0 = random.choice( coordsX )
    p1 = random.choice( coordsX )
    if rs.Distance( p0,p1 ) > 1:
        #rs.AddLine( p0, p1)
        coordsXX.extend( [p0,p1] )
    p0 = random.choice( coordsY0 )
    p1 = random.choice( coordsYlenY )
    if rs.Distance( p0,p1 ) > 1:
        #rs.AddLine( p0, p1)
        coordsYY.extend( [p0,p1] )
    p0 = random.choice( coordsX )
    p1 = random.choice( coordsX)
    if rs.Distance(p0,p1) > 1:
        #rs.AddLine(p0,p1)
        coordsZZ.extend ([p0,p1])


#rs.AddCurve(coordsXX, 1)
andisCrc = rs.AddCurve(coordsYY, 1)
#rs.AddCurve(coordsZZ, 1)



centerX = rs.VectorAdd( rs.VectorScale(vecX, lenX*.5), rs.VectorScale(vecY, lenY*.5) )
centerX = rs.VectorAdd( centerX, rs.VectorScale(vecZ, lenZ*.5) )
radiusX = lenZ*.9

#rs.AddSphere(centerX, radiusX)
crv_coords = coords2sphere ( coordsY0, centerX, radiusX, makePts=1, makeCrv=0, makeProjectCrv=0)
crv_coords = coords2sphere ( coordsYlenY, centerX, radiusX, makePts=1, makeCrv=0, makeProjectCrv=0)
crv_coords = coords2sphere ( coordsX, centerX, radiusX, makePts=1, makeCrv=0, makeProjectCrv=0)

andisCoords = rs.DivideCurve( andisCrc, 2001, create_points=0, return_points=1) 
#random.shuffle(andisCoords)
crv_coords = coords2sphere ( andisCoords, centerX, radiusX*0.3, makePts=1, makeCrv=0, makeProjectCrv=2)

rs.ObjectColor( andisCrc, [200,200,200] )


#______EOC


###############################################
#___4_lazy_experts: automated capture to LW P:/
if 1:
    rs.ZoomExtents()
    rs.Command("-zoom Factor 0.95 enter", 0) # decrease zoom for better framingg
    rs.Redraw()
if  0:
    path = "P:/ue_03/images/"
    name = "tst.png"
    rs.Command("-viewCaptureToFile Width=480  Height=360  Scale=1.5 DrawCPlaneAxes=No TransparentBackground=Yes "+path+name, 0)
    # .jpg and Scale=4 for webSite submission
    name = "tst_"+str(int(time.time()))+".jpg"
    #rs.Command("-viewCaptureToFile Width=480  Height=360  Scale=4 TransparentBackground=No  "+path+name, 0)