# FREECAD functions to draw, given a textual description

import FreeCAD
import DraftTools
import Draft

# drawing as face or not? Path seems to like faces better?
faceflag= False

print 'Faceflag: ', faceflag
"""FreeCAD drawing functions"""

def place(x,y):
    pl=FreeCAD.Placement()
    #pl.Rotation.Q=(0.0,-0.0,-0.0,1.0)
    pl.Base=FreeCAD.Vector(x,y,0.0)
    return pl

def c(x,y,diameter):
    """circle"""	
    radius = diameter/2
    pl=place(x,y)	
    c = Draft.makeCircle(radius, placement=pl, face=faceflag)

def r(x,y,l,h):
    """rectangle		x,y = left bottom corner,  l = length,  h = height"""
    faceflag=True
    pl=place(x,y)
    r = Draft.makeRectangle(length=l,height=h,placement=pl, face=faceflag)

def p(x,y,diameter, nb_edges):
    """polygon"""
    radius = diameter/2
    pl=place(x,y)	
    p= Draft.makePolygon(nb_edges,radius, inscribed=True,placement=pl, face=faceflag)

def l(x1, y1, x2, y2):
    """line"""
    p1=FreeCAD.Vector(x1,y1,0)
    p2=FreeCAD.Vector(x2,y2,0) 
    l=Draft.makeLine(p1, p2)


def execute_text(t):
    """split text into commands that are executed = drawn
    text t must contain lines in the form e.g. 'p 0 0 10 3'	
    """

    lines=t.splitlines()
    for line in lines:
        line=line.strip()
        
        if len(line):                                      # e.g. line= 'p 0 0 10 3'
            if line[0] != '#':
                line = selective_decimate_to_tab(line)
                items=line.split("\t",1)				    # e.g. ['p', '0 0 10 3']
                args=items[1].replace('\t',',')		
                cmd=items[0]+'(' + args +')'		        # e.g. p(0,0,10,3)
                print cmd
                eval (cmd)

def selective_decimate_to_tab(s):
    # strip and change 3 and more spaces to 1 tab 
    s1=s.strip()
    while '   ' in s1:
        s1 = s1.replace('   ', '  ')
    s1 = s1.replace('  ', '\t')
    return s1        


def make_testdata():
    data ="""
r	0	0	85	50
c	5	5	3.5
c	5	45	3.5
c	80	5	3.5
c	80	45	3.5	
r	10	10	30	30	
c	60	25	30
p    60    25    30    6 
l    5    25    80    25   	
"""
    return data

def make_new_drawing():
    App.newDocument("TEST")
    App.setActiveDocument("TEST")
    
#----------------------------------------
if __name__ == '__main__':
    make_new_drawing()
    text=make_testdata()
    execute_text(text)
    Gui.SendMsgToActiveView("ViewFit")
