#!/usr/bin/python
import numpy as np
import getopt,re,os,sys
import subprocess
from numpy.linalg import eig, inv
import turtle
import fnmatch,math


def main(argv):
   n1=-1
   n2=-1
   p=0
   try:
      opts, args = getopt.getopt(argv,"hf:p:",["f=", "p="])
   except getopt.GetoptError:
      print 'plrn -f <flr and par file root> -p <1/0, 1: save plot, 0: default>'
      sys.exit(2)
   if len(opts)==0:
      print 'plring -f <flr and par file root> -p <1/0, 1: save plot, 0: default>'
      sys.exit()
 
   for opt, arg in opts:
      if opt == '-h':
         print 'plring -f <flr and par file root> -p <1/0, 1: save plot, 0: default>'
         sys.exit()
      elif opt in ("-f"):
         f1 = arg
      elif opt in ("-p"):
         p = arg

#   t=turtle.Turtle()
   
  # m = np.loadtxt(f1)
   os.system("exec sddsprocess "+f1+".par -match=col,ElementParameter=K1 -pipe=out | sddsconvert -pipe=in -rename=col,ParameterValue=K1 "+f1+".K1")
   v = os.popen("exec sddsxref "+f1+".flr "+f1+".K1 -take=K1 -match=ElementName -fillin -nowarning -pipe=out | sddsprintout -pipe=in -col=s -col=ElementName -col=ElementType -col=X,format=%10.6f -col=Z,format=%10.6f -col=theta,format=%10.6f -col=K1,format=%6.3f -notitle -nolabel -spreadsheet=delimiter=\'\\,\'").read()
   s=[]
   EN=[]
   ET=[]
   X=[]
   Z=[]
   Th=[]
   K1=[]
   t=turtle.Turtle()
   t.speed(0)
   t.clear()
   t.hideturtle()
   screen=turtle.Screen()
   screen.setup(1000,1000)
   screen.delay(1)
 
   for line in v.split('\n'):
     if line:
        ls=line.split(',')
        s.append(float(ls[0]))
        EN.append(ls[1])
        ET.append(ls[2])
        X.append(float(ls[3]))
        Z.append(float(ls[4]))
        Th.append(float(ls[5]))
        K1.append(float(ls[6]))
   xm1=np.min(X)
   xm2=np.max(X)
   zm1=np.min(Z)
   zm2=np.max(Z)
   dx=(xm2-xm1)*0.2
   dz=(zm2-zm1)*0.2
   dl=math.sqrt(dx*dx+dz*dz)/6
   screen.setworldcoordinates(xm1-dx,zm1-dz,xm2+dx,zm2+dz)
   i=1
   while i <len(s):
      ang=(Th[i]+Th[i-1])/2.
      if fnmatch.fnmatch(ET[i].upper(),'*DRIF*'):
         drawLine(t,dl,X[i-1],X[i],Z[i-1],Z[i],"black")
      elif fnmatch.fnmatch(ET[i].upper(),'*BEN*'):   
         drawBox(t,dl,X[i-1],X[i],Z[i-1],Z[i],ang,"blue")
      elif fnmatch.fnmatch(ET[i].upper(),'*QUAD*'):
         if K1[i]>0:
            drawQuadF(t,dl,X[i-1],X[i],Z[i-1],Z[i],ang,"red")
         else:
            drawQuadD(t,dl,X[i-1],X[i],Z[i-1],Z[i],ang,"red")
      elif fnmatch.fnmatch(ET[i].upper(),'*SEXT*'):
         drawBox(t,dl,X[i-1],X[i],Z[i-1],Z[i],ang,"green")
      else:
         drawLine(t,dl,X[i-1],X[i],Z[i-1],Z[i],"black")     
      i+=1

   if p!=0:
      ts = turtle.getscreen()
      ts.getcanvas().postscript(file=f1+"-overview.ps")
   screen.exitonclick()      
   os.system("rm "+f1+".K1")
   return                   

def rotate(x,y,angle):
   x2=x*math.cos(angle)-y*math.sin(angle)
   y2=x*math.sin(angle)+y*math.cos(angle)
   return x2,y2
def project(x,y,angle,l):
   x2=x-l*math.cos(angle)
   y2=y+l*math.sin(angle)
   return x2,y2


def drawBox(t,dl,x1,x2,y1,y2,angle,clr):
   l=dl
#   dl=math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
   r1,s1=project(x1,y1,angle,-l)
   r2,s2=project(x1,y1,angle,l)
   r3,s3=project(x2,y2,angle,l)
   r4,s4=project(x2,y2,angle,-l)
   t.color("",clr)
   t.begin_fill()
   t.goto(r1,s1)
   t.goto(r2,s2)
   t.goto(r3,s3)
   t.goto(r4,s4)
   t.goto(r1,s1)
   t.end_fill()
   t.goto(x2,y2)
   return

def drawQuadF(t,dl,x1,x2,y1,y2,angle,clr):
   l=dl
#   dl=math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
#   u1,v1=rotate(x1,y1,angle)
   r1,s1=project(x1,y1,angle,-l)
   r2,s2=project(x1,y1,angle,l)
   r3,s3=project(x2,y2,angle,l)
   r4,s4=project(x2,y2,angle,-l)
   t.color("",clr)
   t.begin_fill()
   t.goto(x1,y1)
   t.goto((r2+r3)/2.,(s2+s3)/2.)
   t.goto(x2,y2)
   t.goto((r1+r4)/2.,(s1+s4)/2.)
   t.goto(x1,y1)
   t.end_fill()
   t.goto(x2,y2)
   return

def drawQuadD(t,dl,x1,x2,y1,y2,angle,clr):
   l=dl
#   dl=math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
#   u1,v1=rotate(x1,y1,angle)
   r1,s1=project(x1,y1,angle,-l)
   r2,s2=project(x1,y1,angle,l)
   r3,s3=project(x2,y2,angle,l)
   r4,s4=project(x2,y2,angle,-l)
   t.color("",clr)
   t.begin_fill()
   t.goto((x1+x2)/2.,(y1+y2)/2.)
   t.goto(r2,s2)
   t.goto(r3,s3)
   t.goto((x1+x2)/2.,(y1+y2)/2.)
   t.goto(r4,s4)
   t.goto(r1,s1)
   t.goto((x1+x2)/2.,(y1+y2)/2.)
   t.end_fill()
   t.goto(x2,y2)
   return


def drawLine(t,dl,x1,x2,y1,y2,clr):
   t.color(clr,"black")
   t.begin_fill()
   t.goto(x1,y1)
   t.goto(x2,y2)
   t.end_fill()

   
   
if __name__ == "__main__":
   import sys
   main(sys.argv[1:])
