import Tkinter  
from Tkconstants import *
import Canvas

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
# GRAFIKBIBLIOTHEK grafik.py (nach einer Vorlage von Bernd Kokavecz) #
# fuer Unterrichtszwecke                                             #
# Version: 1.1 (13.04.2004)                                          #
# Autoren: Jeanine Umlang, Clemens Wagner                            #
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#

class TBild:
   def __init__(self,Name):
      self.Bild=Tkinter.PhotoImage(file=Name)
      self.Breite=self.Bild.width()-2
      self.Hoehe=self.Bild.height()-2

   def holeBild(self):
      return self.Bild

   def holeBreite(self):
      return self.Breite
   
   def holeHoehe(self):
      return self.Hoehe

class TFarbe:
   # Nachschlagefeld für die Umwandlung von Farbnummer in Farbee
   FNummernInv={	0:"",\
                    1:"#000",\
                    2:"#00f",\
                    3:"#0f0",\
                    4:"#0ee",\
                    5:"#f00",\
                    6:"#ff0",\
                    7:"#ccc",\
                    8:"#fff"}
   # Nachschlagefeld für die Umwandlung  Farbname ---> Farbee
   FNamenInv={"transparent":"",\
                "schwarz":"#000",\
                "blau":"#00f",\
                "gruen":"#0f0",\
                "tuerkis":"#0ee",\
                "rot":"#f00",\
                "gelb":"#ff0",\
                "grau":"#ccc",\
                "weiss":"#fff"}
   # Nachschlagefeld für die Umwandlung  Farbe ---> Farbename
   FNamen={} 
   for k,v in FNamenInv.items():
      FNamen[v]=k
   # Nachschlagefeld für die Umwandlung  Farbe ---> Farbnummere
   FNummern={}
   for k,v in FNummernInv.items():
      FNummern[v]=k       
   
   def __init__(self):
      self.Farbe = "#000"
      
   def holeFarbe(self):
      return self.Farbe

   def setzeFarbe(self,f):
      self.Farbe=f 

   def holeFarbnummer(self):   
      return TFarbe.FNummern[self.Farbe]

   def setzeFarbnummer(self,f):
      self.Farbe=TFarbe.FNummernInv[f]   

   def holeFarbname(self):
       return TFarbe.FNamen[self.Farbe]

   def setzeFarbname(self,f):
      self.Farbe=TFarbe.FNamenInv[f]

class TFigur:
   def __init__(self,Zb):
      self.X1=0
      self.Y1=0
      self.X2=0   
      self.Y2=0
      self.Farbe=TFarbe()
      self.Fuellfarbe=TFarbe()
      self.DiffX=2  #  Differenzpixel für die genaue Darstellung im  Zeichenblattt
      self.DiffY=2  #  Differenzpixel für die genaue Darstellung im  Zeichenblattt
      self.ZB=Zb
      
   def holeX1Pos(self):
      return self.X1-self.DiffX
 
   def holeY1Pos(self):
      return self.Y1-self.DiffY   

   def holeX2Pos(self):
      return self.X2-self.DiffX
 
   def holeY2Pos(self):
      return self.Y2-self.DiffY   

   def setzePos(self,x1,y1,x2,y2):
      self.X1=x1+self.DiffX
      self.Y1=y1+self.DiffY
      self.X2=x2+self.DiffX
      self.Y2=y2+self.DiffY
      
   def posVersetzenUm(self,dx,dy):
      self.X1=self.X1+dx
      self.X2=self.X2+dx
      self.Y1=self.Y1+dy
      self.Y2=self.Y2+dy

   def zeigen(self):
      pass

   def loeschen(self):
      self.ZB.move(self.grafObj,1000,1000)

   def entfernen(self):
      self.ZB.delete(self.grafObj)


class TLinie(TFigur):
   def __init__(self,Zb):
      TFigur.__init__(self,Zb)
      self.grafObj=self.ZB.create_line(self.X1, self.Y1,\
                                self.X2, self.Y2)
      self.ZB.config(self.grafObj,fill=self.Farbe.holeFarbe())
      
   def zeigen(self):
      self.ZB.config(self.grafObj,fill=self.Farbe.holeFarbe())
      self.ZB.coords(self.grafObj,self.X1,self.Y1,self.X2,self.Y2)
      self.ZB.aktualisieren()
      self.ZB.config(self.grafObj,fill=self.Farbe.holeFarbe())
      self.ZB.coords(self.grafObj,self.X1,self.Y1,self.X2,self.Y2)
      self.ZB.aktualisieren()

class TEllipse(TFigur):
   def __init__(self,Zb):
      TFigur.__init__(self,Zb)
      self.grafObj=self.ZB.create_oval(self.X1, self.Y1,\
                                self.X2, self.Y2)
      self.ZB.config(self.grafObj,fill=self.Fuellfarbe.holeFarbe(),outline=self.Farbe.holeFarbe())
      
   def zeigen(self):
      self.ZB.config(self.grafObj,fill=self.Fuellfarbe.holeFarbe(),outline=self.Farbe.holeFarbe())
      self.ZB.coords(self.grafObj,self.X1,self.Y1,self.X2,self.Y2)
      self.ZB.aktualisieren()

class TKreis(TFigur):
   def __init__(self,Zb):
      TFigur.__init__(self,Zb)
      self.R=0
      self.Mx=0
      self.My=0
      self.grafObj=self.ZB.create_oval(self.X1, self.Y1, \
                             self.X2, self.Y2)
      self.ZB.itemconfig(self.grafObj,fill=self.Fuellfarbe.holeFarbe(),outline=self.Farbe.holeFarbe())
      
   def holeRadius(self):
      return self.R
   
   def setzeRadius(self,r):
      self.R=r
      self.berechneStandard()

   def holeMx(self):
      self.berechneMittelpunkt()
      return self.Mx

   def holeMy(self):
      self.berechneMittelpunkt()
      return self.My

   def setzeMPos(self,mx,my):
      self.Mx=mx+self.DiffX
      self.My=my+self.DiffY
      self.berechneStandard()
      
   def berechneStandard(self):
      self.X1=self.Mx-self.R
      self.X2=self.Mx+self.R
      self.Y1=self.My-self.R
      self.Y2=self.My+self.R

   def berechneMittelpunkt(self):
      self.Mx=self.X1+self.R
      self.My=self.Y1+self.R

   def zeigen(self):
      self.ZB.itemconfig(self.grafObj,fill=self.Fuellfarbe.holeFarbe(),outline=self.Farbe.holeFarbe())
      self.ZB.coords(self.grafObj,self.X1,self.Y1,self.X2,self.Y2)
      self.ZB.aktualisieren()
      self.ZB.itemconfig(self.grafObj,fill=self.Fuellfarbe.holeFarbe(),outline=self.Farbe.holeFarbe())
      self.ZB.coords(self.grafObj,self.X1,self.Y1,self.X2,self.Y2)
      self.ZB.aktualisieren()


class TRechteck(TFigur):
   def __init__(self,Zb):
      TFigur.__init__(self,Zb)
      x = self.Farbe.holeFarbe()
      y = self.Fuellfarbe.holeFarbe()
      self.grafObj=self.ZB.create_rectangle(self.X1, self.Y1, \
                             self.X2, self.Y2)

   def zeigen(self):
      self.ZB.itemconfig(self.grafObj,fill=self.Fuellfarbe.holeFarbe(),outline=self.Farbe.holeFarbe())
      self.ZB.coords(self.grafObj,self.X1,self.Y1,self.X2,self.Y2)
      self.ZB.aktualisieren()
      self.ZB.itemconfig(self.grafObj,fill=self.Fuellfarbe.holeFarbe(),outline=self.Farbe.holeFarbe())
      self.ZB.coords(self.grafObj,self.X1,self.Y1,self.X2,self.Y2)
      self.ZB.aktualisieren()

class TText(TFigur):
   def __init__(self,Zb):
      TFigur.__init__(self,Zb)
      self.Text=""
      self.Schriftart="*"
      self.Hoehe=10
      self.grafObj=self.ZB.create_text(self.X1, self.Y1+(self.Hoehe/2), \
             anchor="w", text=self.Text, fill=self.Farbe.holeFarbe(), font=(self.Schriftart, self.Hoehe))

   def setzePos(self,x,y):
      self.X1=x+self.DiffX
      self.Y1=y+self.DiffY
      
   def setzeText(self,t):
      self.Text=t

   def setzeFont(self,art,grad):
      self.Schriftart=art
      self.Hoehe=grad    

   def zeigen(self):
      self.ZB.itemconfig(self.grafObj, \
             anchor="w", text=self.Text, fill=self.Farbe.holeFarbe(), font=(self.Schriftart, self.Hoehe))
      self.ZB.coords(self.grafObj,self.X1, self.Y1+(self.Hoehe/2))
      self.ZB.aktualisieren()
      

class TZeichenblatt(Tkinter.Canvas):
   def __init__(self,bildDatei=None,hgFarbe="weiss",breite=600,hoehe=400):
      self.BildDatei=bildDatei
      self.Breite=breite
      self.Hoehe=hoehe
      self.Farbe=TFarbe()
      self.Farbe.setzeFarbname(hgFarbe)
 
      # Wurde ein Hintergrundbild übergeben??
      if self.BildDatei!=None:
         #TBild-Instanz erzeugen
         self.Bild=TBild(self.BildDatei)
         #Breite und Hoehe anpassen
         self.Breite=self.Bild.holeBreite()
         self.Hoehe=self.Bild.holeHoehe()
         # Konstruktor der Superklasse aufrufen
         Tkinter.Canvas.__init__(self,bd=0,bg=self.Farbe.holeFarbe(),width=self.Breite,height=self.Hoehe)
         #Bild erzeugen
         self.create_image(0,0,anchor="nw",image=self.Bild.holeBild())
      else:
         # Konstruktor der Superklasse aufrufen
         Tkinter.Canvas.__init__(self,bd=0,bg=self.Farbe.holeFarbe(),width=self.Breite,height=self.Hoehe)


   def holeBreite(self):
      return self.Breite

   def holeHoehe(self):
      return self.Hoehe
   
   def aktualisieren(self):
      self.update()