############################
### Lukas Schmelzer      ###
### hu_03                ### 
############################


##############################
import rhinoscriptsyntax as rs
import random, time, sys   ###
sys.path.append("P:/")     ###                  ### diag's path to DM_lib.py  .. please keep it !                                               
sys.path.append("P:/TUGonlineUsernam/dm2/")     ### *your* path to DM_lib.py                                             
sys.path.append("P:/WWW/lukschme/dm2/") ### *your* path to DM_lib.py                                            
sys.path.append("/Users/macpro/Desktop/DM2")    ### *your* path to DM_lib.py      
import DM_lib as dm        ###                  ### "dm" is alias for DM_lib / for adressing definitions etc in "DM_lib.py"
############################## reload(dm)


rs.ShowGrid(show=0)
rs.ShowGridAxes(show=0)
rs.ViewDisplayMode(mode="Wireframe")
rs.EnableRedraw(0)

dm.PointRadius(displayModeX=0, rad=3, styl=3)                   ### displayModeX=0="Wireframe" / rad=size of points / styl=pointStyle (try 0..5) / default 3, 3
dm.printDisplay(state=1, scale=1, thickness=1, color="Display") ### state=0/1 = off/on / for showing printWidth etc

dm.eAA()

### BASIC SETUP / mandatory input:
allInOne = 1
allCoords = dm.coordsCub (what="F")
allCoords = dm.coordsCub (edge_len=10, anz_pts=10, what="A", angle=random.uniform(0,360), axe=dm.randVec(-1,1), pos=[0,0,10], allInOne=allInOne)

coordsSph = allCoords[0]
coordsCub = allCoords[1]


##### check setup - just visualization of coords
##### don't execute  @ final version of homework
if 0:
    rs.AddPoints( coordsSph )
    
    if allInOne:
        rs.AddPoints( coordsCub )
    else:
        for i,coords in enumerate(coordsCub): 
            pts = rs.AddPoints( coords )

##### end check setup

#######################################
################ HERE YOU GO AS YOU GO:

# parameter for size

anzahl_squ = 10
anzahl_sph = 1001
coords_squ = []
#######################################################################################
# create black sphere

pS = [5,0,0]
coords_sp = []
for i in range (anzahl_sph):
    #rs.AddLine([0,0,0],pS)
    pS = rs.VectorRotate( pS, 10.0*random.uniform(0,200), dm.randVec())
    coords_sp.append (pS)
    #rs.AddLine([0,0,0],pX)
    #pS = rs.VectorRotate( pS, 10.0*2, [0,0,1])
    #rs.AddLine([0,0,0],pS)
rs.AddPoints(coords_sp)
#coords_sp = sorted(coords_sp, key=lambda cor: cor[0])
#rs.AddCurve(coords_sp,2)

##################################################################################################
# create middle point

middle_point = [0,0,0]

#####################################
#Create orange sphere --> not finished yet --> wanna improve vektor

coords_sp_s = []
radius = 5

random_point = [random.uniform(-radius, radius),random.uniform(-radius, radius),random.uniform(-radius, radius)]  #generate random point
#print "random:" , random_point

pS_s = [1+random_point[0],0+random_point[1],0+random_point[2]] 
coords_sp_s = []
for z in range (anzahl_sph):
    pS_s = rs.VectorRotate( pS_s, 10.0*random.uniform(0,200), dm.randVec())
    coords_sp_s.append (pS_s)
small_sph = rs.AddPoints(coords_sp_s)
rs.ObjectColor(small_sph,[200,110,55])


####################################################################################################
# create squares on corners

corner_points = []
max_height = 6
min_height = -5
for y_squ in range(min_height,max_height):                                           #loop for doing it every itteration
    half = 5                                                                         #define half lenght of square
    p1 = [middle_point[0] - half, middle_point[1] - half, middle_point[2]+y_squ]     #generating the 4 corner points --> calculation
    p2 = [middle_point[0] + half, middle_point[1] - half, middle_point[2]+y_squ]
    p3 = [middle_point[0] + half, middle_point[1] + half, middle_point[2]+y_squ]
    p4 = [middle_point[0] - half, middle_point[1] + half, middle_point[2]+y_squ]
    square = rs.AddPolyline([p1, p2, p3, p4, p1])                                    #making a polyline around curves
    r = abs(y_squ*50)                                                                #giving the square color, going up in increments
    g = abs(y_squ*25)
    b = abs(y_squ*10)
    rs.ObjectColor(square,[r,g,b])
    if y_squ == 5:                                                                   #on the upper square corner points generate point clouds as square
        corner_points.extend([p1, p2, p3, p4])
        rs.AddPoints([p1, p2, p3, p4])
        for x in range(anzahl_squ):
            for y in range(anzahl_squ):
                for z in range(anzahl_squ):
                    pt_1 = [p1[0] - x, p1[1] - y, p1[2] + z]                         #offsets
                    coords_squ.append(pt_1)
                    pt_2 = [p2[0] + x, p2[1] - y, p2[2] + z]
                    coords_squ.append(pt_2)
                    pt_3 = [p3[0] + x, p3[1] + y, p3[2] + z]
                    coords_squ.append(pt_3)
                    pt_4 = [p4[0] - x, p4[1] + y, p4[2] + z]
                    coords_squ.append(pt_4)
    if y_squ == -5:                                                                   #same for lowest square
        corner_points.extend([p1, p2, p3, p4])
        rs.AddPoints([p1, p2, p3, p4])
        for x in range(anzahl_squ):
            for y in range(anzahl_squ):
                for z in range(anzahl_squ): 
                    pt_1 = [p1[0] - x, p1[1] - y, p1[2] - z]
                    coords_squ.append(pt_1)
                    pt_2 = [p2[0] + x, p2[1] - y, p2[2] - z]
                    coords_squ.append(pt_2)
                    pt_3 = [p3[0] + x, p3[1] + y, p3[2] - z]
                    coords_squ.append(pt_3)
                    pt_4 = [p4[0] - x, p4[1] + y, p4[2] - z]
                    coords_squ.append(pt_4)
    rs.AddPoints(coords_squ)



#################
#dm.eDup( 1 )
dm.zA( 0.5 )
