import rhinoscriptsyntax as rs
import random as rand
import sys                                  # load System Library
import math


# Get all the system paths
#print(sys.path)

# sys.path.append( "lib/" )                ## set relative path,
sys.path.append( "P:/dm2/lib/")            ## set absolute path to our P:// Drive

# Import our own library file (uncomment to use it)
# import my_dm2_lib as dm2lib

# reload the library in case wie change something in the meantime (uncomment to use it only while changing code)
# reload(dm2lib)

#delet everything and start from scratch
allobjs = rs.AllObjects()
rs.DeleteObjects (allobjs)

# some static variables
bsize = 10
ysize = 10
xsize= 10                   # side length of box
dist = 5                    # distance between boxes
offs = bsize + dist         # offset of boxes

corners = [(0,0,0), (bsize,0,0), (bsize,ysize,0), (0,ysize,0),
           (0,0,xsize),(bsize,0,xsize),(bsize,ysize,xsize),(0,ysize,xsize)]

def wuerfel(start, stop, step):
    point_list = []
    ausgabe= ""
    for i in range(start, stop+1,step):
        for v in range (start,stop+1,step):
            if v==i:
                ausgabe+="LOL"
                point =rs.AddPoint(i*offs, i*offs*rand.randint(1,10), v*offs)
                point_list.append(point)
                # box = rs.AddBox(corners)
                # rs.MoveObject(box, (i*offs, i*offs ,v*offs))
            else:
                ausgabe +=" "
        ausgabe += "\n"
    rs.AddCurve(point_list, 11)
    return ausgabe

rs.EnableRedraw(False)


#point_list = []
#radius = 20

"""
for x in range(radius *(-1),radius +1):
    r = radius
    z = 0
    y = (r**2 - x**2)**(1/2)
    
    point = (x,y,z)
    rs.AddPoint(point)
    box = rs.AddBox(corners)
    rs.MoveObject(box, point)
    point = (x,y*(-1),z)
    rs.AddPoint(point)
    box = rs.AddBox(corners)
    rs.MoveObject(box, point)
"""


def circle(radius):
    # Bresenham circle algorithm
    # init vars
    switch = 3 - (2 * radius)
    points = set()
    x = 0
    y = radius
    # first quarter/octant starts clockwise at 12 o'clock
    while x <= y:
        # first quarter first octant
        points.add((x,-y))
        # first quarter 2nd octant
        points.add((y,-x))
        # second quarter 3rd octant
        points.add((y,x))
        # second quarter 4.octant
        points.add((x,y))
        # third quarter 5.octant
        points.add((-x,y))
        # third quarter 6.octant
        points.add((-y,x))
        # fourth quarter 7.octant
        points.add((-y,-x))
        # fourth quarter 8.octant
        points.add((-x,-y))
        if switch < 0:
            switch = switch + (4 * x) + 6
        else:
            switch = switch + (4 * (x - y)) + 10
            y = y - 1
        x = x + 1
    return points


#radius = 8
#p_list = circle(radius)
# print the point coords
# print(p)

"""
for point in p_list:
    rs.AddPoint(point)
    box = rs.AddBox(corners)
    rs.MoveObject(box, point)
"""
point_list = []

def drawCircle(centerX, centerY, x, y):
    # Fill the circle
    for xx in range(centerX - x, centerX + x + 1):

        # box = rs.AddBox(corners)
        # rs.MoveObject(box,(xx*offs, (centerY + y)*offs, 50.0))
        point_var = (xx*offs, (centerY + y)*offs, 50.0)
        point_list.append(point_var)

        # box = rs.AddBox(corners)
        # rs.MoveObject(box,(xx*offs, (centerY - y)*offs, 50.0))
        point_var = (xx*offs, (centerY - y)*offs, 50.0)
        point_list.append(point_var)


    for xx in range(centerX - y, centerX + y + 1):
        # box = rs.AddBox(corners)
        # rs.MoveObject(box,(xx*offs, (centerY + x)*offs, 50.0))
        point_var = (xx*offs, (centerY + x)*offs, 50.0)
        point_list.append(point_var)
        # box = rs.AddBox(corners)
        # rs.MoveObject(box,(xx*offs, (centerY - x)*offs, 50.0))
        point_var = (xx*offs, (centerY - x)*offs, 50.0)
        point_list.append(point_var)

    '''
    # do not fill the circle
    box = rs.AddBox(corners)
    rs.MoveObject(box,((centerX + x)*offs, (centerY + y)*offs, 50.0))
    box = rs.AddBox(corners)
    rs.MoveObject(box,((centerX - x)*offs, (centerY + y)*offs, 50.0))
    box = rs.AddBox(corners)
    rs.MoveObject(box,((centerX + x)*offs, (centerY - y)*offs, 50.0))
    box = rs.AddBox(corners)
    rs.MoveObject(box,((centerX - x)*offs, (centerY - y)*offs, 50.0))
    box = rs.AddBox(corners)
    rs.MoveObject(box,((centerX + y)*offs, (centerY + x)*offs, 50.0))
    box = rs.AddBox(corners)
    rs.MoveObject(box,((centerX - y)*offs, (centerY + x)*offs, 50.0))
    box = rs.AddBox(corners)
    rs.MoveObject(box,((centerX + y)*offs, (centerY - x)*offs, 50.0))
    box = rs.AddBox(corners)
    rs.MoveObject(box,((centerX - y)*offs, (centerY - x)*offs, 50.0))
    '''

def circleBres(xc, yc, r):
    x = 0
    y = r
    d = 3 - (2*r)
    drawCircle(xc, yc, x, y)
    while(y>=x):
        x+=1
        if(d>0):
            y-=1
            d = d+4*(x-y)+10
        else:
            d = d + 4 * x + 6
        drawCircle(xc, yc, x, y)
        # rs.Redraw()



circleBres(0, 0, 13)
# print(point_list)
point_list_start = point_list

# rechtes auge
point_list_1 = [(60, 90, 50.0), (60, 30, 50.0), (30, 60, 50.0), (30, 60, 50.0), (45, 60, 50.0), (45, 60, 50.0), (60, 60, 50.0), (60, 60, 50.0), (75, 60, 50.0), (75, 60, 50.0), (90, 60, 50.0), (90, 60, 50.0), (45, 90, 50.0), (45, 30, 50.0), (60, 90, 50.0), (60, 30, 50.0), (75, 90, 50.0), (75, 30, 50.0), (30, 75, 50.0), (30, 45, 50.0), (45, 75, 50.0), (45, 45, 50.0), (60, 75, 50.0), (60, 45, 50.0), (75, 75, 50.0), (75, 45, 50.0), (90, 75, 50.0), (90, 45, 50.0), (30, 75, 50.0), (30, 45, 50.0), (45, 75, 50.0), (45, 45, 50.0), (60, 75, 50.0), (60, 45, 50.0), (75, 75, 50.0), (75, 45, 50.0), (90, 75, 50.0), (90, 45, 50.0), (45, 90, 50.0), (45, 30, 50.0), (60, 90, 50.0), (60, 30, 50.0), (75, 90, 50.0), (75, 30, 50.0)]
# linkes auge
point_list_2 = [(-60, 90, 50.0), (-60, 30, 50.0), (-90, 60, 50.0), (-90, 60, 50.0), (-75, 60, 50.0), (-75, 60, 50.0), (-60, 60, 50.0), (-60, 60, 50.0), (-45, 60, 50.0), (-45, 60, 50.0), (-30, 60, 50.0), (-30, 60, 50.0), (-75, 90, 50.0), (-75, 30, 50.0), (-60, 90, 50.0), (-60, 30, 50.0), (-45, 90, 50.0), (-45, 30, 50.0), (-90, 75, 50.0), (-90, 45, 50.0), (-75, 75, 50.0), (-75, 45, 50.0), (-60, 75, 50.0), (-60, 45, 50.0), (-45, 75, 50.0), (-45, 45, 50.0), (-30, 75, 50.0), (-30, 45, 50.0), (-90, 75, 50.0), (-90, 45, 50.0), (-75, 75, 50.0), (-75, 45, 50.0), (-60, 75, 50.0), (-60, 45, 50.0), (-45, 75, 50.0), (-45, 45, 50.0), (-30, 75, 50.0), (-30, 45, 50.0), (-75, 90, 50.0), (-75, 30, 50.0), (-60, 90, 50.0), (-60, 30, 50.0), (-45, 90, 50.0), (-45, 30, 50.0)]
# mund
point_list_3 = [(0, -90, 50.0), (-15, -90, 50.0), (0, -90, 50.0), (15, -90, 50.0), (-30, -75, 50.0), (-15, -75, 50.0), (0, -75, 50.0), (15, -75, 50.0), (30, -75, 50.0), (-45, -60, 50.0), (-30, -60, 50.0), (-15, -60, 50.0), (0, -60, 50.0), (15, -60, 50.0), (30, -60, 50.0), (45, -60, 50.0)]

A = set(point_list_start)
B = set(point_list_1)
C = set(point_list_2)
D = set(point_list_3)

E = B.union(C)
E = E.union(D)

A = A.difference(E)

rs.EnableRedraw(False)

for i in A:
    box = rs.AddBox(corners)
    #print(i)
    point = rs.AddPoint(i)
    rs.MoveObject(box,i)
#rs.AddLine((rand.randint(-50,50),rand.randint(-50,50),rand.randint(-50,50)),i)