########################################
### 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*7)


print "\t _____________/################"
print "\t my randomized para.llel.epiped"
print "\t X/Y/Z =", str(lenX)+"/"+str(lenY)+"/"+str(lenZ)+" _____________"
print "\t ################/  \n"


#______base vectors
vecX = [1, 0, 0]
#vecY = [2, 1, 0]
#vecZ = [0, 0, 1]
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*3, create_points=0, return_points=1)  
anzAll_0 = len(rs.AllObjects()) # number of objects in scene, now

coords2sphere ( coordsZ, centerX, radiusX, makePts=0, makeCrv=1, makeProjectCrv=2 )

anzAll_1 = len(rs.AllObjects()) 
rs.SelectObjects( rs.AllObjects()[ 1: anzAll_1 - anzAll_0] )
rs.ObjectColor( rs.SelectedObjects(), [250,0,0] )
rs.UnselectAllObjects()
rs.SelectObjects( rs.AllObjects()[lenZ : anzAll_1 - anzAll_0 - lenZ] )
rs.ObjectColor( rs.SelectedObjects(), [250,250,250] )
rs.UnselectAllObjects()



if 1:
    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=2 )
    
    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=2 )

rs.ZoomExtents()
rs.Redraw()

#rs.Sleep( 1000 )                    # 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:

pointA = [0, 0, 0]
pointB = rs.VectorScale (vecX, lenX)
pointC = rs.VectorAdd ( pointB, rs.VectorScale(vecY, lenY))
pointD = rs.VectorScale (vecY, lenY)

#Erstellung der Linien
rs.AddCurve( [pointA, pointB, pointC, pointD, pointA], 1)

rs.AddCurve( [pointA, rs.VectorAdd(pointA, rs.VectorScale(vecZ, lenZ))], 1)
rs.AddCurve( [pointB, rs.VectorAdd(pointB, rs.VectorScale(vecZ, lenZ))], 1)
rs.AddCurve( [pointC, rs.VectorAdd(pointC, rs.VectorScale(vecZ, lenZ))], 1)
rs.AddCurve( [pointD, rs.VectorAdd(pointD, rs.VectorScale(vecZ, lenZ))], 1)

if 1:
    face_base = [pointA, pointB, pointC, pointD, pointA]
    face_top = []
    for pt in face_base:
        face_top.append( rs.VectorAdd( pt, rs.VectorScale(vecZ, lenZ)))
    rs.AddCurve (face_top, 1)
    face_b_t = face_base + face_top

#Erstellung verschiedener Kurven
    random.shuffle (face_b_t)
    rs.AddCurve( face_b_t, 2)
    rs.AddCurve( face_b_t, 3)
    rs.AddCurve( face_b_t, 4)
    rs.AddCurve( face_b_t, 5)
    rs.AddCurve( face_b_t, 6)
    rs.AddCurve( face_b_t, 7)
    rs.AddCurve( face_b_t, 8)
    rs.AddCurve( face_b_t, 9)
    rs.AddCurve( face_b_t, 10)

allCoords = []
anzRahmen = 1
listXY = []
for x in range(lenX+1):
    print x
    vec_x = rs.VectorScale( vecX, x )
    for y in range(lenY+1):
        #rs.AddPoint( vec_x )
        vec_y = rs.VectorScale( vecY, y )
        vec_y = rs.VectorAdd( vec_y, vec_x )
        for z in range(lenZ+1):
            vec_z = rs.VectorScale( vecZ, z )
            vec_z = rs.VectorAdd( vec_z, vec_y )
            if (x<anzRahmen or x>lenX-anzRahmen) or (z<anzRahmen or z>lenZ-anzRahmen): #or z<anzRahmen :
                listXY.append( vec_z )

rs.AddSphere( centerX, radiusX)
anzAll_0 = len(rs.AllObjects())

coords2sphere ( listXY, centerX, radiusX )
#listXY = rs.VectorUnitize( listXY )
#PointsOnSpere = rs.VectorScale( listXY, radiusX )





#______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:/hu_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)