#!/usr/bin/python
# -*- coding: iso-8859-2 -*-

## EMANIM 1.01 verzió
## írta: Szilágyi András
## Lásd e szoftver honlapját a http://www.enzim.hu/~szia/emanim címen.
##
## Ez a szoftver nyilvános közszoftver (public domain). E szoftver és dokumentációjának használata,
## másolása, módosítása és terjesztése bármely célra, díjmentesen engedélyezett, mindenféle feltétel
## és megkötés nélkül. E szoftverrel kapcsolatban semmiféle jótállási vagy kártérítési igény nem
## érvényesíthető, semmilyen körülmények között.
##
## Megjegyzés: az EMANIM operációsrendszer-specifikus disztribúcióiban előfordulhatnak olyan
## programkönyvtárak, melyekre saját, külön licenszszerződés vonatkozik.

from visual import *
from Tkinter import *
from tkColorChooser import *
from tkMessageBox import *
import thread
import tkColorChooser
import time,sys,os

# If while looking at the source, the electric vector of the light coming 
# toward you appears to be rotating clockwise, the light is said to be 
# right-circularly polarized. 
# If counterclockwise, then left-circularly polarized light.

scl=120

def box(a,b,c):
    a=a/2.0
    b=b/2.0
    c=c/2.0
    l1=(-a,-b,-c)
    l2=(-a, b,-c)
    l3=(-a, b, c)
    l4=(-a,-b, c)
    u1=( a,-b,-c)
    u2=( a, b,-c)
    u3=( a, b, c)
    u4=( a,-b, c)
    return [l1,l2,l3,l4,u4,u3,u2,u1,l1,l4,u4,u3,l3,l2,u2,u1,u4]

def tkvcolor(tkc):
    return tuple(map(lambda s:s/255.0,tkc[0]))

def vtkcolor(vc):
    rgb=map(lambda s: int(255*s),vc)
    return '#%02x%02x%02x' % (rgb[0],rgb[1],rgb[2])

class Application(Tk):
    def __init__(self,master=None):
        Tk.__init__(self,master)
        self.protocol('WM_DELETE_WINDOW',self.quitapp)
        self.geometry("-0+0")
        self.title('EMANIM: Vezérlés')
        if os.path.exists('emanim.ico'):
            self.wm_iconbitmap('emanim.ico')
        self.resizable(0,0)
        self.CreateWidgets()
        self.grid()
        self.findsizes()
        self.CreateVisObjects()
        #self.SetupScene()
        thread.start_new_thread(self.SetupScene,())
        
    def quitapp(self):
        ms="Az EMANIM-ból való kilépéshez zárd be az Animáció ablakot!"
        showinfo(title='Tájékoztatás',message=ms)
    
    def findsizes(self):
        self.update()
        sw=self.winfo_screenwidth()
        sh=self.winfo_screenheight()
        self.visx=0
        if sw>2*sh:  # desktop extended to multiple monitors
            sw=sw/2
            self.visx=sw/2
        self.viswidth=sw-self.winfo_width()-10
        self.visheight=sh-50
        
    def m1c(self):
        state=self.m1state.get()
        if state==1:
            self.Wa1On.set(1)
            self.Wa2On.set(0)
            self.SumOn.set(0)
            self.w1type.set("Függőleges")
            self.ampli1.set(5)
            self.wwll1.set(4.0)
            self.MatOn.set(0)
            self.hid.set(0)
            self.ti.config(text='Függőlegesen polarizált hullám')
            self.te.config(state=NORMAL)
            self.te.delete("1.0",END)
            self.te.insert(END,'Az elektromos mező vektora minden pontban függőleges síkban rezeg. ')
            self.te.insert(END,'A hullám a vízszintes tengely irányában terjed. Változtatgasd az 1. hullám ')
            self.te.insert(END,'amplitúdóját és hullámhosszát, hogy lásd, ezek hogyan befolyásolják a hullámot.')
            self.te.config(state=DISABLED)
        elif state==2:
            self.Wa1On.set(0)
            self.Wa2On.set(1)
            self.SumOn.set(0)
            self.w2type.set("Vízszintes")
            self.ampli2.set(5)
            self.wwll2.set(4.0)
            self.MatOn.set(0)
            self.hid.set(0)
            self.ti.config(text='Vízszintesen polarizált hullám')
            self.te.config(state=NORMAL)
            self.te.delete("1.0",END)
            self.te.insert(END,'Az elektromos mező vektora mindegyik pontban vízszintes síkban rezeg. ')
            self.te.insert(END,'Ha a hullám nem látszik világosan, forgasd el az ábrázolást.')
            self.te.config(state=DISABLED)
        elif state==3:
            self.Wa1On.set(1)
            self.Wa2On.set(0)
            self.SumOn.set(0)
            self.w1type.set("Balra cirkuláris")
            self.ampli1.set(5)
            self.wwll1.set(4.0)
            self.MatOn.set(0)
            self.hid.set(0)
            self.ti.config(text='Balra cirkulárisan polarizált hullám')
            self.te.config(state=NORMAL)
            self.te.delete("1.0",END)
            self.te.insert(END,'Rezgés helyett itt az elektromos mező vektora körben forog. Nagysága állandó, ')
            self.te.insert(END,'csak iránya változik időben. Ha a fény forrása felé nézünk, a vektort az óramutató ')
            self.te.insert(END,"járásával ellentétes irányban látjuk forogni.")
            self.te.config(state=DISABLED)
        elif state==4:
            self.Wa1On.set(0)
            self.Wa2On.set(1)
            self.SumOn.set(0)
            self.w2type.set("Jobbra cirkuláris")
            self.ampli2.set(5)
            self.wwll2.set(4.0)
            self.MatOn.set(0)
            self.hid.set(0)
            self.ti.config(text='Jobbra cirkulárisan polarizált hullám')
            self.te.config(state=NORMAL)
            self.te.delete("1.0",END)
            self.te.insert(END,"A vízszintes tengely mindegyik pontjában az elektromos mező vektorát az óramutató ")
            self.te.insert(END,"járásával megegyező irányban látjuk forogni, ha a fényforrás irányába nézünk.")
            self.te.config(state=DISABLED)
        elif state==5:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Függőleges')
            self.w2type.set('Vízszintes')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(4)
            self.wwll2.set(4)
            self.SumOn.set(1)
            self.MatOn.set(0)
            self.phase.set(0)
            self.hid.set(0)
            self.ti.config(text='Lineáris + Lineáris = Lineáris')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Ha egy vízszintesen polarizált hullámhoz hozzáadunk egy vele azonos hullámhosszú ")
            self.te.insert(END,"és amplitúdójú, s azzal azonos fázisban rezgő, függőlegesen polarizált hullámot, ")
            self.te.insert(END,"akkor az eredő hullám szintén lineárisan polarizált hullám lesz, mely az összetevő ")
            self.te.insert(END,"hullámokhoz képest 45 fokos szögben rezeg. Változtatgasd az amplitúdókat és a ")
            self.te.insert(END,"fáziskülönbséget, s figyeld meg ezek hatását.")
            self.te.config(state=DISABLED)
        elif state==6:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Függőleges')
            self.w2type.set('Vízszintes')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(4)
            self.wwll2.set(4)
            self.SumOn.set(1)
            self.MatOn.set(0)
            self.phase.set(90)
            self.hid.set(0)
            self.ti.config(text='Lineáris + Lineáris = Cirkuláris')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Ha egy vízszintesen polarizált hullámhoz hozzáadunk egy vele azonos hullámhosszú és ")
            self.te.insert(END,"amplitúdójú, de fázisában 90 fokkal eltolt, függőlegesen polarizált hullámot, akkor ")
            self.te.insert(END,"az eredő hullám egy balra cirkulárisan poláros hullám lesz. Állítsd a fáziskülönbséget ")
            self.te.insert(END,"-90 fokra, s figyeld meg, mi történik a polarizációval.")
            self.te.config(state=DISABLED)
        elif state==7:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Balra cirkuláris')
            self.w2type.set('Jobbra cirkuláris')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(4)
            self.wwll2.set(4)
            self.SumOn.set(1)
            self.MatOn.set(0)
            self.phase.set(90)
            self.hid.set(0)
            self.ti.config(text='Balra cirkuláris + Jobbra cirkuláris = Lineáris')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Ha szuperponálunk egy jobbra és egy balra cirkulárisan poláros hullámot, melyeknek ")
            self.te.insert(END,"hullámhossza és amplitúdója azonos, az eredő hullám egy lineárisan poláros hullám lesz. ")
            self.te.insert(END,"Ebből az is következik, hogy bármely lineárisan poláros hullám felbontható egy ")
            self.te.insert(END,"jobbra és egy balra cirkulárisan poláros hullámra. Változtatgasd a fáziskülönbséget, ")
            self.te.insert(END,"s figyeld meg, ez hogyan befolyásolja az eredő hullám ")
            self.te.insert(END,"polarizációjának irányát.")
            self.te.config(state=DISABLED)
        elif state==8:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Függőleges')
            self.w2type.set('Függőleges')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(4)
            self.wwll2.set(4)
            self.SumOn.set(1)
            self.MatOn.set(0)
            self.phase.set(0)
            self.hid.set(0)
            self.ti.config(text='Hullámhosszarány: 1:1')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Két azonos, függőlegesen polarizált hullámot szuperponálunk (lehet, hogy az egyik ")
            self.te.insert(END,"nem látszik, mivel fedik egymást). Az eredmény egy olyan hullám, melynek amplitúdója ")
            self.te.insert(END,"kétszer akkora, mint az összetevő hullámoké. Változtatgasd a fáziskülönbséget, s ")
            self.te.insert(END,"figyeld meg, hogyan változik az eredő hullám amplitúdja! Mi történik, ha a ")
            self.te.insert(END,"fáziskülönbség 180 fok?")
            self.te.config(state=DISABLED)
        elif state==9:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Függőleges')
            self.w2type.set('Függőleges')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(1)
            self.wwll2.set(8)
            self.SumOn.set(1)
            self.MatOn.set(0)
            self.phase.set(0)
            self.hid.set(0)
            self.ti.config(text='Hullámhosszarány: 1:8')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,'Egy rövid hullámhosszú hullámot egy hosszabb hullámhosszúra ültettünk.')
            self.te.config(state=DISABLED)
        elif state==10:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Függőleges')
            self.w2type.set('Függőleges')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(7)
            self.wwll2.set(8)
            self.SumOn.set(1)
            self.MatOn.set(0)
            self.phase.set(0)
            self.hid.set(0)
            self.ti.config(text='Hullámhosszarány: 7:8')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Két olyan hullámot szuperponálunk, melyek hullámhossza igen közel van egymáshoz (")
            self.te.insert(END,"a hullámhosszak: 7 és 8). Kísérd figyelemmel hosszabb időn át a hullámokat, s vedd ")
            self.te.insert(END,"észre, hogy némely helyen erősítik egymást (az eredő amplitúdó nagy), míg némely más ")
            self.te.insert(END,"helyen szinte kioltják egymást (az eredő amplitúdó majdnem nulla).")
            self.te.config(state=DISABLED)
        elif state==11:
            self.Wa1On.set(1)
            self.Wa2On.set(0)
            self.w1type.set('Függőleges')
            self.ampli1.set(5)
            self.wwll1.set(4)
            self.SumOn.set(0)
            self.MatOn.set(1)
            self.matlen.set(16)
            self.w1e.set(0.25)
            self.w1n.set(1.0)
            self.hid.set(0)
            self.ti.config(text='Fényelnyelés')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Ha a fény anyagon halad át, az anyag a fény egy részét elnyeli. Ennek következtében ")
            self.te.insert(END,"a fény amplitúdója csökken. Azt, hogy a fénynek mekkora részét nyeli el az anyag, ")
            self.te.insert(END,"(egységnyi hosszon) az anyag extinkciós koefficiense határozza meg. Változtatgasd ")
            self.te.insert(END,"az anyagdarab hosszát és az 1. hullámra vonatkozó extinkciós koefficiensét, s ")
            self.te.insert(END,"figyeld meg, hogyan változik az elnyelés mértéke.")
            self.te.config(state=DISABLED)
        elif state==12:
            self.Wa1On.set(1)
            self.Wa2On.set(0)
            self.w1type.set('Függőleges')
            self.ampli1.set(5)
            self.wwll1.set(4)
            self.SumOn.set(0)
            self.MatOn.set(1)
            self.matlen.set(16)
            self.w1e.set(0)
            self.w1n.set(1.5)
            self.hid.set(0)
            self.ti.config(text='Fénytörés')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"A fény anyagban lassabban halad, mint légüres térben. Ezért amikor a fény anyagba ")
            self.te.insert(END,"lép, hullámhossza lecsökken. Az anyag törésmutatója határozza meg, hogy mennyire ")
            self.te.insert(END,"lassul le a fény az anyagban és hogy mennyire rövidül a hullámhossz. Változtatgasd ")
            self.te.insert(END,"az 1. hullámra vonatkozó törésmutatót, s figyeld meg hatását.")
            self.te.config(state=DISABLED)
        elif state==13:
            self.Wa1On.set(1)
            self.Wa2On.set(0)
            self.w1type.set('Függőleges')
            self.ampli1.set(5)
            self.wwll1.set(4)
            self.SumOn.set(0)
            self.MatOn.set(1)
            self.matlen.set(16)
            self.w1e.set(0.25)
            self.w1n.set(1.5)
            self.hid.set(0)
            self.ti.config(text='Fényelnyelés + fénytörés')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Az anyagok általában mind fényelnyelő, mind fénytörő tulajdonsággal rendelkeznek, azaz ")
            self.te.insert(END,"amikor a fény anyagba lép, akkor gyengül is és lassul is. Tehát mind az amplitúdó, mind ")
            self.te.insert(END,"a hullámhossz csökken. Változtatgasd az anyag hosszát, valamint az 1. hullámra vonatkozó ")
            self.te.insert(END,"extinkciós koefficiensét és törésmutatóját. Figyeld meg ezek hatását.")
            self.te.config(state=DISABLED)
        elif state==14:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Függőleges')
            self.w2type.set('Vízszintes')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(4)
            self.wwll2.set(4)
            self.phase.set(0)
            self.SumOn.set(1)
            self.MatOn.set(1)
            self.matlen.set(16)
            self.w2smon.set(0)
            self.w1e.set(0.15)
            self.w2e.set(0)
            self.w1n.set(1)
            self.w2n.set(1)
            self.hid.set(0)
            self.ti.config(text='Lineáris dikroizmus')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Ha az anyag anizotróp (tulajdonságai iránytól függően mások és mások), akkor extinkciós ")
            self.te.insert(END,"koefficiense más lehet függőlegesen polarizált fényre nézve, mint vízszintesen ")
            self.te.insert(END,"polarizáltra nézve. Itt egy függőleges és egy vízszintes polarizációjú fény lép be az ")
            self.te.insert(END,"anyagba; szuperpozíciójuk egy, a vízszintessel 45 fokos szöget bezáró síkban polarizált ")
            self.te.insert(END,"hullám. Mivel az anyag csak a függőleges összetevőt nyeli el, az anyagból kilépő ")
            self.te.insert(END,"hullám polarizációjának síkja közelebb lesz a vízszinteshez. Változtatgasd mindkét ")
            self.te.insert(END,"extinkciós koefficienst, az anyagdarab hosszát és a fáziskülönbséget, s figyeld meg ")
            self.te.insert(END,"hatásukat a kilépő fényre.")
            self.te.config(state=DISABLED)
        elif state==15:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Függőleges')
            self.w2type.set('Vízszintes')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(4)
            self.wwll2.set(4)
            self.phase.set(0)
            self.SumOn.set(1)
            self.MatOn.set(1)
            self.matlen.set(16)
            self.w2smon.set(0)
            self.w1e.set(0)
            self.w2e.set(0)
            self.w1n.set(1.05)
            self.w2n.set(1)
            self.hid.set(0)
            self.ti.config(text='Lineáris kettőstörés')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Ha az anyag anizotróp (tulajdonságai iránytól függően mások és mások), akkor ")
            self.te.insert(END,"törésmutatója más lehet függőlegesen polarizált fényre nézve, mint vízszintesen ")
            self.te.insert(END,"polarizáltra nézve. Itt egy függőleges és egy vízszintes polarizációjú fény lép be az ")
            self.te.insert(END,"anyagba; szuperpozíciójuk egy, a vízszintessel 45 fokos szöget bezáró síkban polarizált ")
            self.te.insert(END,"hullám. Mivel az anyag csak a függőleges összetevőt töri (lassítja le), a két összetevő ")
            self.te.insert(END,"hullám közötti fáziskülönbség megváltozik, midőn a fény az anyagon áthalad. Ennek ")
            self.te.insert(END,"Ennek következtében a kilépő fény elliptikusan polarizált lesz. Változtatgasd mindkét ")
            self.te.insert(END,"törésmutatót és az anyag hosszát is, s figyeld meg, hogyan befolyásolják a kilépő ")
            self.te.insert(END,"fény polarizációját.")
            self.te.config(state=DISABLED)
        elif state==16:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Függőleges')
            self.w2type.set('Vízszintes')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(4)
            self.wwll2.set(4)
            self.phase.set(0)
            self.SumOn.set(1)
            self.MatOn.set(1)
            self.matlen.set(16)
            self.w2smon.set(0)
            self.w1e.set(0.15)
            self.w2e.set(0)
            self.w1n.set(1.05)
            self.w2n.set(1)
            self.hid.set(0)
            self.ti.config(text='Lineáris dikroizmus és kettőstörés')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Ha az anyag anizotróp (tulajdonságai iránytól függően mások és mások), akkor ")
            self.te.insert(END,"törésmutatója és extinkciós koefficiense is más lehet függőlegesen polarizált fényre nézve, ")
            self.te.insert(END,"mint vízszintesen ")
            self.te.insert(END,"polarizáltra nézve. Itt egy függőleges és egy vízszintes polarizációjú fény lép be az ")
            self.te.insert(END,"anyagba; szuperpozíciójuk egy, a vízszintessel 45 fokos szöget bezáró síkban polarizált ")
            self.te.insert(END,"hullám. Az anyag csak a függőleges összetevőt befolyásolja. ")
            self.te.insert(END,"Az anyagból kilépő eredő hullám polarizációjának síkja közelebb lesz a vízszintes síkhoz ")
            self.te.insert(END,"(a lineáris dikroizmus miatt) és elliptikusan polárossá válik (a lineáris kettőstörés ")
            self.te.insert(END,"miatt). Változtatgasd az extinkciós koefficienseket, a törésmutatókat és az anyagdarab ")
            self.te.insert(END,"hosszát, s figyeld meg e paraméterek hatását a kilépő fény polarizációjára.")
            self.te.config(state=DISABLED)
        elif state==17:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Balra cirkuláris')
            self.w2type.set('Jobbra cirkuláris')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(4)
            self.wwll2.set(4)
            self.phase.set(0)
            self.SumOn.set(1)
            self.MatOn.set(1)
            self.matlen.set(16)
            self.w2smon.set(0)
            self.w1e.set(0.15)
            self.w2e.set(0)
            self.w1n.set(1)
            self.w2n.set(1)
            self.hid.set(0)
            self.ti.config(text='Cirkuláris dikroizmus')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Ha az anyag optikailag aktív (más tulajdonságokat mutat balra és jobbra cirkulárisan ")
            self.te.insert(END,"poláros fénnyel szemben), akkor extinkciós koefficiense más lehet balra cirkulárisan ")
            self.te.insert(END,"poláros fényre nézve, mint jobbra cirkulárisan polárosra nézve. Itt egy jobbra és ")
            self.te.insert(END,"egy balra cirkulárisan poláros fény lép be az anyagba; eredőjük egy lineárisan, ")
            self.te.insert(END,"vízszintes síkban polarizált hullám. Az anyag csak a balra cirkulárisan poláros ")
            self.te.insert(END,"összetevőre hat: legyengíti azt, így a kilépő, eredő fény egy elliptikusan poláros ")
            self.te.insert(END,"hullám lesz. Az ellipszis nagytengelye egybeesik a bemenő fény polarizációjának ")
            self.te.insert(END,"síkjával. Változtatgasd az exktinkciós koefficienseket és az anyagdarab hosszát, ")
            self.te.insert(END,"s figyeld meg ezek hatását.")
            self.te.config(state=DISABLED)
        elif state==18:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Balra cirkuláris')
            self.w2type.set('Jobbra cirkuláris')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(4)
            self.wwll2.set(4)
            self.phase.set(0)
            self.SumOn.set(1)
            self.MatOn.set(1)
            self.matlen.set(16)
            self.w2smon.set(0)
            self.w1e.set(0)
            self.w2e.set(0)
            self.w1n.set(1.05)
            self.w2n.set(1)
            self.hid.set(0)
            self.ti.config(text='Cirkuláris kettőstörés')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Ha az anyag optikailag aktív (más tulajdonságokat mutat balra és jobbra cirkulárisan ")
            self.te.insert(END,"poláros fénnyel szemben), akkor törésmutatója más lehet balra cirkulárisan ")
            self.te.insert(END,"poláros fényre nézve, mint jobbra cirkulárisan polárosra nézve. Itt egy jobbra és ")
            self.te.insert(END,"egy balra cirkulárisan poláros fény lép be az anyagba; eredőjük egy lineárisan, ")
            self.te.insert(END,"vízszintes síkban polarizált hullám. Az anyag csak a balra cirkulárisan poláros ")
            self.te.insert(END,"összetevőre hat: lelassítja azt, így két összetevő hullám közötti fáziskülönbség ")
            self.te.insert(END,"megváltozik, midőn a fény az anyagon áthalad. Ennek következtében a kilépő fény ")
            self.te.insert(END,"polarizációjának síkja el lesz forgatva a bemenőéhez képest, de a lineáris polarizáció ")
            self.te.insert(END,"megmarad. Változtatgasd a törésmutatókat és az anyagdarab hosszát, ")
            self.te.insert(END,"s figyeld meg ezek hatását a kilépő fény polarizációjának irányára.")
            self.te.config(state=DISABLED)
        elif state==19:
            self.Wa1On.set(1)
            self.Wa2On.set(1)
            self.w1type.set('Balra cirkuláris')
            self.w2type.set('Jobbra cirkuláris')
            self.ampli1.set(5)
            self.ampli2.set(5)
            self.wwll1.set(4)
            self.wwll2.set(4)
            self.phase.set(0)
            self.SumOn.set(1)
            self.MatOn.set(1)
            self.matlen.set(16)
            self.w2smon.set(0)
            self.w1e.set(0.15)
            self.w2e.set(0)
            self.w1n.set(1.05)
            self.w2n.set(1)
            self.hid.set(0)
            self.ti.config(text='Cirkuláris dikroizmus és kettőstörés')
            self.te.config(state=NORMAL)
            self.te.delete('1.0',END)
            self.te.insert(END,"Ha az anyag optikailag aktív (más tulajdonságokat mutat balra és jobbra cirkulárisan ")
            self.te.insert(END,"poláros fénnyel szemben), akkor extinkciós koefficiense és törésmutatója más lehet balra ")
            self.te.insert(END,"cirkulárisan poláros fényre nézve, mint jobbra cirkulárisan polárosra nézve. Itt egy ")
            self.te.insert(END,"jobbra és egy balra cirkulárisan poláros fény lép be az anyagba; eredőjük egy lineárisan, ")
            self.te.insert(END,"vízszintes síkban polarizált hullám. Az anyag csak a balra cirkulárisan poláros ")
            self.te.insert(END,"összetevőre hat. Az anyagból kilépő fény elliptikusan polarizált (a cirkuláris ")
            self.te.insert(END,"dikroizmus miatt) és ellipszisének nagytengelye el van fordulva a belépő fény ")
            self.te.insert(END,"polarizációjának síkjához képest (a cirkuláris kettőstörés miatt). Változtatgasd az ")
            self.te.insert(END,"extinkciós koefficienseket és a törésmutatókat, valamint az anyagdarab hosszát, ")
            self.te.insert(END,"s figyeld meg ezek hatását a kilépő fény polarizációjának típusára és irányára.")
            self.te.config(state=DISABLED)

    def m2nice(self):
        self.hid.set(0)
        scene.forward=norm(vector(-0.669,-0.223,-0.708))
    def m2side(self):
        self.hid.set(0)
        scene.forward=(0,0,-1)
    def m2front(self):
        self.hid.set(0)
        scene.forward=(-1,0,0)
    def m2back(self):
        self.hid.set(0)
        scene.forward=(1,0,0)
    def m2veconly(self):
        self.hid.set(1)
        scene.forward=norm(vector(-0.95,-0.13,-0.26))

    def m3bg(self):
        bgc=askcolor(color=vtkcolor(scene.background))
        scene.background=tkvcolor(bgc)
        self.lw1.config(fg=bgc[1])
        self.lw2.config(fg=bgc[1])
        self.lws.config(fg=bgc[1])
        self.lwm.config(fg=bgc[1])
    def m3w1(self):
        w1c=askcolor(color=vtkcolor(self.w1.color[0]))
        self.lw1.config(bg=w1c[1])
        self.w1.color=tkvcolor(w1c)
        self.arr1a.color=self.w1.color[0]
        self.arr1b.color=self.w1.color[0]
    def m3w2(self):
        w2c=askcolor(color=vtkcolor(self.w2.color[0]))
        self.lw2.config(bg=w2c[1])
        self.w2.color=tkvcolor(w2c)
        self.arr2a.color=self.w2.color[0]
        self.arr2b.color=self.w2.color[0]
    def m3sc(self):
        wsc=askcolor(color=vtkcolor(self.sc.color[0]))
        self.lws.config(bg=wsc[1])
        self.sc.color=tkvcolor(wsc)
        self.arrsa.color=self.sc.color[0]
        self.arrsb.color=self.sc.color[0]
    def m3mat(self):
        wmc=askcolor(color=vtkcolor(self.mat.color[0]))
        self.lwm.config(bg=wmc[1])
        self.mat.color=tkvcolor(wmc)
    def m3ax(self):
        axcolor=tkvcolor(askcolor(color=vtkcolor(self.axes[0].color[0])))
        for ao in self.axes:
            ao.color=axcolor
    def m3hlp(self):
        slcolor=tkvcolor(askcolor(color=vtkcolor(self.sl1a.color[0])))
        self.sl1a.color=slcolor
        self.sl1b.color=slcolor
        self.sl2a.color=slcolor
        self.sl2b.color=slcolor
    def m3reset(self):
        scene.background=color.black
        self.w1.color=color.red
        self.arr1a.color=color.red
        self.arr1b.color=color.red
        self.w2.color=color.green
        self.arr2a.color=color.red
        self.arr2b.color=color.red
        self.sc.color=color.cyan
        self.arrsa.color=color.cyan
        self.arrsb.color=color.cyan
        self.mat.color=color.orange
        self.lw1.config(fg="#000000",bg="#ff0000")
        self.lw2.config(fg="#000000",bg="#00ff00")
        self.lws.config(fg="#000000",bg="#00ffff")
        self.lwm.config(fg="#000000",bg="#ff8000")
        self.sl1a.color=color.yellow
        self.sl2a.color=color.yellow
        self.sl1b.color=color.yellow
        self.sl2b.color=color.yellow
        for ao in self.axes:
            ao.color=(.3,.3,.3)

    def overview(self):
        ms='EMANIM: Áttekintés\n\n'
        ms+='Az EMANIM vákuumban és anyagban terjedő elektromágneses hullámok animációit mutatja be. '
        ms+='Az áttekinthetőség kedvéért mindig csak az elektromos mezőt ábrázolja (a mágneses mező mindig '
        ms+='merőleges az elektromosra és nagysága az elektromos mezővel azonos fázisban rezeg)\n\n'
        ms+='Az EMANIM-ban két hullám (1. és 2.) állítható be, választható polarizációval (vízszintes, függőleges, '
        ms+='balra cirkuláris, jobbra cirkuláris), és feltüntethető ezek szuperpozíciója (1.+2. hullám). '
        ms+='Az előrehaladó hullámokat két sík között mutatjuk; e síkokon feltüntetjük az elektromos mező vektorait. '
        ms+='A műszerfal segítségével a két hullám amplitúdója és hullámhossza változtatható, valamint meghatározható '
        ms+='a fáziskülönbség (a 2. hullám fázisa az 1.-hez képest).\n\n'
        ms+='A fény és az anyag kölcsönhatásának tanulmányozása végett a két sík közé egy téglatest alakú anyagdarab '
        ms+='helyezhető be. Az anyagdarab hosszát, valamint a két hullámmal szemben mutatott extinkciós koefficiensét '
        ms+='és törésmutatóját a műszerfal segítségével be lehet állítani.\n\n'
        ms+='Beállítható az animáció sebessége, továbbá választható, hogy csak a vektorokat mutassa a program, '
        ms+='a hullámprofilok nélkül, hogy a vektorok mozgása könnyebben összehasonlítható legyen.\n\n'
        ms+='A Jelenség menüben számos, előre definiált paraméterkészlet közül lehet választani, melyek különféle '
        ms+='elektromágneses jelenségeknek felelnek meg. Amikor egy jelenséget kiválasztunk, annak rövid magyarázata '
        ms+='is megjelenik.\n\n'
        ms+='A Nézet menü néhány előredefiniált kameraállást tartalmaz a jelenség több oldalról való megtekintésének '
        ms+='elősegítésére. Akinek az alapbeállítás színei nem tetszenek, beállíthat más színeket a Színek menü '
        ms+='segítségével.'
        showinfo(title='Áttekintés',message=ms)
    def usage(self):
        ms='A nézet vezérlése az Animáció ablakban:\n\n'
        ms+='FORGATÁS: tartsd nyomva a JOBB egérgombot (Macintoshon a shift billentyűt) '
        ms+='és mozgasd az egeret.\n\n'
        ms+='KÖZELÍTÉS/TÁVOLÍTÁS: Tartsd nyomva a KÖZÉPSŐ egérgombot '
        ms+='(kétgombos egér esetén a jobb+bal gombot egyszerre; Macintoshon a control billentyűt) és '
        ms+='mozgasd az egeret.\n\n'
        ms+='Megjegyzés: Az Animáció ablak átméretezése nem ajánlott, ugyanis csökkent teljesítményt eredményezhet. '
        ms+='Legcélszerűbb eredeti méretben használni.'
        showinfo(title='Egérhasználat',message=ms)
    def about(self):
        ms='EMANIM 1.0 verzió\n'
        ms+='írta: Szilágyi András\n'
        ms+='Lásd e szoftver honlapját a http://www.enzim.hu/~szia/emanim címen.\n\n'
        ms+='Ez a szoftver nyilvános közszoftver (public domain). E szoftver és dokumentációjának használata, '
        ms+='másolása, módosítása és terjesztése bármely célra, díjmentesen engedélyezett, mindenféle feltétel '
        ms+='és megkötés nélkül. E szoftverrel kapcsolatban semmiféle jótállási vagy kártérítési igény nem '
        ms+='érvényesíthető, semmilyen körülmények között.\n\n'
        ms+='Megjegyzés: az EMANIM operációsrendszer-specifikus disztribúcióiban előfordulhatnak olyan '
        ms+='programkönyvtárak, melyekre saját, külön licenszszerződés vonatkozik.'
        showinfo(title='A programról',message=ms)
        
    def CreateWidgets(self):
        mb=Menu(self)
        me1=Menu(mb,tearoff=0)
        me2=Menu(mb,tearoff=0)
        me3=Menu(mb,tearoff=0)
        me4=Menu(mb,tearoff=0)
        mb.add_cascade(label='Jelenség',menu=me1)
        m1s1=Menu(me1,tearoff=0)
        self.m1state=IntVar()
        self.m1state.set(1)
        m1s1.add_radiobutton(label='Függőleges',command=self.m1c,variable=self.m1state,value=1)
        m1s1.add_radiobutton(label='Vízszintes',command=self.m1c,variable=self.m1state,value=2)
        m1s1.add_radiobutton(label='Balra cirkuláris',command=self.m1c,variable=self.m1state,value=3)
        m1s1.add_radiobutton(label='Jobbra cirkuláris',command=self.m1c,variable=self.m1state,value=4)
        me1.add_cascade(label='Polarizáció',menu=m1s1)
        m1s2=Menu(me1,tearoff=0)
        m1s2.add_radiobutton(label='Lineáris+lineáris 1',command=self.m1c,variable=self.m1state,value=5)
        m1s2.add_radiobutton(label='Lineáris+lineáris 2',command=self.m1c,variable=self.m1state,value=6)
        m1s2.add_radiobutton(label='Balra+jobbra cirkuláris',command=self.m1c,variable=self.m1state,value=7)
        me1.add_cascade(label='Szuperpozíciók',menu=m1s2)
        m1s3=Menu(me1,tearoff=0)
        m1s3.add_radiobutton(label='Hullámhosszarány: 1:1',command=self.m1c,variable=self.m1state,value=8)
        m1s3.add_radiobutton(label='Hullámhosszarány: 1:8',command=self.m1c,variable=self.m1state,value=9)
        m1s3.add_radiobutton(label='Hullámhosszarány: 7:8',command=self.m1c,variable=self.m1state,value=10)
        me1.add_cascade(label='Interferencia',menu=m1s3)
        m1s4=Menu(me1,tearoff=0)
        m1s4.add_radiobutton(label='Fényelnyelés',command=self.m1c,variable=self.m1state,value=11)
        m1s4.add_radiobutton(label='Fénytörés',command=self.m1c,variable=self.m1state,value=12)
        m1s4.add_radiobutton(label='Elnyelés+Törés',command=self.m1c,variable=self.m1state,value=13)
        me1.add_cascade(label='Anyag: Alapok',menu=m1s4)
        m1s5=Menu(me1,tearoff=0)
        m1s5.add_radiobutton(label='Lineáris dikroizmus',command=self.m1c,variable=self.m1state,value=14)
        m1s5.add_radiobutton(label='Lineáris kettőstörés',command=self.m1c,variable=self.m1state,value=15)
        m1s5.add_radiobutton(label='Lin. dikr. + kettőstör.',command=self.m1c,variable=self.m1state,value=16)
        me1.add_cascade(label='Anyag: Anizotrópia',menu=m1s5)
        m1s6=Menu(me1,tearoff=0)
        m1s6.add_radiobutton(label='Cirkuláris dikroizmus',command=self.m1c,variable=self.m1state,value=17)
        m1s6.add_radiobutton(label='Cirkuláris kettőstörés',command=self.m1c,variable=self.m1state,value=18)
        m1s6.add_radiobutton(label='Cirk. dikr. + kettőstör.',command=self.m1c,variable=self.m1state,value=19)
        me1.add_cascade(label='Anyag: Optikai aktivitás',menu=m1s6)
        mb.add_cascade(label='Nézet',menu=me2)
        me2.add_command(label='Szemléletes',command=self.m2nice)
        me2.add_command(label='Oldalnézet',command=self.m2side)
        me2.add_command(label='Elölnézet',command=self.m2front)
        me2.add_command(label='Hátulnézet',command=self.m2back)
        me2.add_command(label='Csak vektorok',command=self.m2veconly)
        mb.add_cascade(label='Színek',menu=me3)
        me3.add_command(label='Háttér',command=self.m3bg)
        me3.add_command(label='1. hullám',command=self.m3w1)
        me3.add_command(label='2. hullám',command=self.m3w2)
        me3.add_command(label='1.+2. hullám',command=self.m3sc)
        me3.add_command(label='Anyag',command=self.m3mat)
        me3.add_command(label='Tengelyek',command=self.m3ax)
        me3.add_command(label='Segédvonalak',command=self.m3hlp)
        me3.add_command(label='Alapbeállítás',command=self.m3reset)
        mb.add_cascade(label='Súgó',menu=me4)
        me4.add_command(label='Áttekintés',command=self.overview)
        me4.add_command(label='Egérhasználat',command=self.usage)
        me4.add_command(label='A programról',command=self.about)
        self.config(menu=mb)
        self.ti=Label(self,fg="#0000ff")
        self.ti.grid(column=0,row=0,columnspan=2,sticky=E+W)
        desc=Frame(self)
        desc.grid(column=0,row=1,columnspan=2)
        tesc=Scrollbar(desc,orient=VERTICAL)
        tesc.grid(column=1,row=0)
        self.te=Text(desc,height=4,width=45,wrap=WORD,yscrollcommand=tesc.set)
        self.te.configure(state=DISABLED)
        tesc.configure(command=self.te.yview)
        self.te.grid(column=0,row=0)
        w1frame=Frame(self,bd=2,relief=RIDGE)
        w1frame.grid(column=0,row=2,padx=5,pady=5,sticky=N)
        w2frame=Frame(self,bd=2,relief=RIDGE)
        w2frame.grid(column=1,row=2,padx=5,pady=5,rowspan=2,sticky=N)
        wsframe=Frame(self,bd=2,relief=RIDGE)
        wsframe.grid(column=0,row=3,padx=5,pady=5,sticky=N)
        wmframe=Frame(self,bd=2,relief=RIDGE)
        wmframe.grid(column=0,row=4,padx=5,pady=5,columnspan=2,sticky=N)
        self.Wa1On=IntVar()
        self.lw1=Checkbutton(w1frame,variable=self.Wa1On,text="1. hullám",bg="#ff0000")
        self.lw1.grid(column=0,row=0,sticky=N+E+S+W)
        self.Wa2On=IntVar()
        self.lw2=Checkbutton(w2frame,variable=self.Wa2On,text="2. hullám",bg="#00ff00")
        self.lw2.grid(column=0,row=0,sticky=N+E+S+W)
        self.SumOn=IntVar()
        self.lws=Checkbutton(wsframe,variable=self.SumOn,text="1. hullám + 2. hullám",bg="#00ffff")
        self.lws.grid(column=0,row=0,sticky=N+E+S+W)
        self.MatOn=IntVar()
        self.lwm=Checkbutton(wmframe,variable=self.MatOn,text="Anyag",bg="#ff8000")
        self.lwm.grid(column=0,row=0,columnspan=2,sticky=N+E+S+W)
        w1tlab=Label(w1frame,text="Polarizáció:")
        w1tlab.grid(sticky=W,column=0)
        w2tlab=Label(w2frame,text="Polarizáció:")
        w2tlab.grid(sticky=W,column=0)
        self.w1type=StringVar()
        self.w1type.set("Függőleges")
        w1opt=OptionMenu(w1frame,self.w1type,"Függőleges","Vízszintes","Balra cirkuláris","Jobbra cirkuláris")
        w1opt.grid(column=0)
        self.w2type=StringVar()
        self.w2type.set("Vízszintes")
        w2opt=OptionMenu(w2frame,self.w2type,"Függőleges","Vízszintes","Balra cirkuláris","Jobbra cirkuláris")
        w2opt.grid(column=0)
        self.ampli1=IntVar()
        Amp1=Scale(w1frame,from_=0,to=10,label="Amplitúdó:",variable=self.ampli1,orient=HORIZONTAL,length=scl)
        Amp1.grid(column=0)
        self.ampli2=IntVar()
        Amp2=Scale(w2frame,from_=0,to=10,label="Amplitúdó:",variable=self.ampli2,orient=HORIZONTAL,length=scl)
        Amp2.grid(column=0)
        self.wwll1=DoubleVar()
        WL1=Scale(w1frame,from_=1,to=8,label="Hullámhossz:",variable=self.wwll1,orient=HORIZONTAL,length=scl)
        WL1.grid(column=0)
        self.wwll2=DoubleVar()
        WL2=Scale(w2frame,from_=1,to=8,label="Hullámhossz:",variable=self.wwll2,orient=HORIZONTAL,length=scl)
        WL2.grid(column=0)
        self.phase=DoubleVar()
        phd=Scale(w2frame,from_=-180,to=180,label="Fáziskülönbség:",variable=self.phase,orient=HORIZONTAL,
        resolution=10,length=scl)
        phd.grid(column=0)
        self.matlen=DoubleVar()
        self.matlen.set(16)
        mlscale=Scale(wmframe,from_=1,to=32,label="Hossz",variable=self.matlen,orient=HORIZONTAL,resolution=1,length=scl*2)
        mlscale.grid(column=0,columnspan=2)
        w1pf=LabelFrame(wmframe,text="Az 1. hullámra",bd=2,relief=RIDGE)
        self.w1e=DoubleVar()
        w1ex=Scale(w1pf,from_=0.0,to=1.0,label="Extinkciós koefficiens",variable=self.w1e,
        resolution=0.05,orient=HORIZONTAL,length=scl,command=self.w1excom)
        self.w1n=DoubleVar()
        w1ri=Scale(w1pf,from_=1.0,to=2.0,label="Törésmutató",variable=self.w1n,
        resolution=0.05,orient=HORIZONTAL,length=scl,command=self.w1ricom)
        w1dm=Label(w1pf,text=" ")
        w1pf.grid(column=0,padx=5,pady=5,sticky=N+S)
        w1ex.grid(column=0)
        w1ri.grid(column=0)
        w1dm.grid(column=0)
        w2pf=LabelFrame(wmframe,text="A 2. hullámra",bd=2,relief=RIDGE)
        self.w2e=DoubleVar()
        w2ex=Scale(w2pf,from_=0.0,to=1.0,label="Extinkciós koefficiens",variable=self.w2e,
        resolution=0.05,orient=HORIZONTAL,length=scl,command=self.w2excom)
        self.w2n=DoubleVar()
        w2ri=Scale(w2pf,from_=1.0,to=2.0,label="Törésmutató",variable=self.w2n,
        resolution=0.05,orient=HORIZONTAL,length=scl,command=self.w2ricom)
        self.w2smon=IntVar()
        w2smcb=Checkbutton(w2pf,text="Mint az 1. hullámra",variable=self.w2smon,command=self.w2same)
        w2pf.grid(column=1,row=2,padx=5,pady=5,sticky=N+S)
        w2ex.grid(column=0)
        w2ri.grid(column=0)
        w2smcb.grid(column=0)
        self.hid=IntVar()
        self.hid.set(0)
        hidw=Checkbutton(self,text="Csak a vektorokat mutasd",variable=self.hid)
        hidw.grid(column=0,row=5)
        self.arate=IntVar()
        self.arate.set(30)
        ratsc=Scale(self,from_=1,to=150,label="Animáció sebessége",variable=self.arate,
        orient=HORIZONTAL,length=scl)
        ratsc.grid(column=1,row=5)

        self.m1c()
        self.m2nice()
        
    def w2same(self):
        if self.w2smon.get():
            self.w2e.set(self.w1e.get())
            self.w2n.set(self.w1n.get())
    def w1excom(self,v):
        if self.w2smon.get():
            self.w2e.set(v)
    def w1ricom(self,v):
        if self.w2smon.get():
            self.w2n.set(v)
    def w2excom(self,v):
        if self.w2smon.get():
            self.w1e.set(v)
    def w2ricom(self,v):
        if self.w2smon.get():
            self.w1n.set(v)

        
    def CreateVisObjects(self):
        scene.x,scene.y=self.visx,0
        scene.width,scene.height=self.viswidth,self.visheight
        scene.autocenter=0
        scene.autoscale=0
        scene.title='EMANIM: Animáció'
        scene.range=27.0
        scene.fov=pi/12
        step=pi/18
        pih=pi/2
        
        Amp1=4.0
        Amp2=4.0
        SqAmp=1.5*max(Amp1,Amp2)
        amp=4.0
        
        x=arange(-8*pi,8*pi+step,step)


        self.w1=curve(x=x,color=color.red,radius=.1,visible=1)
        self.w2=curve(x=x,color=color.green,radius=.1,visible=0)
        self.sc=curve(x=x,color=color.cyan,radius=.2,visible=0)
        axis=curve(x=[-8*pi,8*pi],color=(.3,.3,.3))
        sq1=curve(pos=[(-8*pi,-SqAmp,-SqAmp),(-8*pi,-SqAmp,SqAmp),
        (-8*pi,SqAmp,SqAmp),(-8*pi,SqAmp,-SqAmp),(-8*pi,-SqAmp,-SqAmp)],
        color=(.3,.3,.3))
        sq2=curve(pos=[(8*pi,-SqAmp,-SqAmp),(8*pi,-SqAmp,SqAmp),
        (8*pi,SqAmp,SqAmp),(8*pi,SqAmp,-SqAmp),(8*pi,-SqAmp,-SqAmp)],
        color=(.3,.3,.3))
        c1y=curve(pos=[(-8*pi,-1.5*amp,0),(-8*pi,1.5*amp,0)],color=(.3,.3,.3))
        c1z=curve(pos=[(-8*pi,0,-1.5*amp),(-8*pi,0,1.5*amp)],color=(.3,.3,.3))
        c2y=curve(pos=[(8*pi,-1.5*amp,0),(8*pi,1.5*amp,0)],color=(.3,.3,.3))
        c2z=curve(pos=[(8*pi,0,-1.5*amp),(8*pi,0,1.5*amp)],color=(.3,.3,.3))
        self.axes=[sq1,sq2,axis,c1y,c1z,c2y,c2z]    
        self.arr1a=arrow(pos=(-8*pi,0,0),axis=(0,0,0),color=color.red,shaftwidth=0.3,fixedwidth=1)
        self.arr2a=arrow(pos=(-8*pi,0,0),axis=(0,0,0),color=color.green,shaftwidth=0.3,fixedwidth=1)
        self.arrsa=arrow(pos=(-8*pi,0,0),axis=(0,0,0),color=color.cyan,shaftwidth=0.5,fixedwidth=1)
        self.sl1a=curve(pos=(-8*pi,0,0),color=color.yellow,visible=0)
        self.sl2a=curve(pos=(-8*pi,0,0),color=color.yellow,visible=0)

        self.arr1b=arrow(pos=(8*pi,0,0),axis=(0,0,0),color=color.red,shaftwidth=0.3,fixedwidth=1)
        self.arr2b=arrow(pos=(8*pi,0,0),axis=(0,0,0),color=color.green,shaftwidth=0.3,fixedwidth=1)
        self.arrsb=arrow(pos=(8*pi,0,0),axis=(0,0,0),color=color.cyan,shaftwidth=0.5,fixedwidth=1)
        self.sl1b=curve(pos=(8*pi,0,0),color=color.yellow,visible=0)
        self.sl2b=curve(pos=(8*pi,0,0),color=color.yellow,visible=0)

        self.ampli2.set(5)
        self.wwll2.set(4)
        self.phase.set(0)
        self.matlen.set(16)

        self.mat=curve(pos=box(self.matlen.get()*pi/2,12,12),color=color.orange,visible=0)

    def SetupScene(self):
        
        
        step=pi/18
        pih=pi/2
        x=arange(-8*pi,8*pi+step,step)
        
        t=0.0

        pMatOn=self.MatOn.get()
        pmatlen=self.matlen.get()

        ibefore=int(144.0-4.5*pmatlen)
        iafter=int(144.0+4.5*pmatlen)
        xbefore=x[:ibefore]
        xbetween=x[ibefore:iafter]
        xafter=x[iafter:]
        
        # equations for extinction
        # E**E=E0**E0*exp(-eps*l)
        # E=sqrt(E0**E0*exp(-eps*l))
        # E=E0*exp(-0.5*eps*l)
        #
        # equations for refringence
        # wavelength_in_vacuum*frequency*2*pi=speed_in_vacuum
        # refraction index n=speed_in_vacuum/speed_in_matter, so speed_in_matter=speed_in_vacuum/n
        # frequency remains constant
        # so wavelength_in_matter*frequency*2pi=speed_in_vacuum/n
        # ie wavelength_in_matter*frequency*2pi=wavelength_in_vacuum*frequency*2pi/n
        # ie wavelength_in_matter=wavelength_in_vacuum/n

        # in x=xbetween[0], sin(x/wale1*n1-freq1*t+xd1a) = sin(x/wale1-freq1*t)
        # x/wale1*n1-freq1*t+xd1a=x/wale1-freq1*t
        # x/wale1*n1+xd1a=x/wale1
        # xd1a=x/wale1-x/wale1*n1
        # xd1a=x/wale1*(1-n1)
        #
        # in x=xafter[0], sin(x/wale1-freq1*t+xd1b) = sin(x/wale1*n1-freq1*t+xd1a)
        # xd1b=x/wale1*n1-x/wale1+xd1a
        # xd1b=x/wale1*(n1-1)+xd1a

        while 1:
            rate(self.arate.get())
            wale1=self.wwll1.get()/4.0
            wale2=self.wwll2.get()/4.0
            freq1=1.0/wale1
            freq2=1.0/wale2
            amp1=self.ampli1.get()
            amp2=self.ampli2.get()
            pdif=self.phase.get()/180.0*pi
            cMatOn=self.MatOn.get()
            if pMatOn!=cMatOn:
                self.mat.visible=cMatOn
                pMatOn=cMatOn
            cmatlen=self.matlen.get()
            if pmatlen!=cmatlen:
                self.mat.pos=box(cmatlen*pi/2,12,12)
                ibefore=int(144.0-4.5*cmatlen)
                iafter=int(144.0+4.5*cmatlen)
                xbefore=x[:ibefore]
                xbetween=x[ibefore:iafter]
                xafter=x[iafter:]
                pmatlen=cmatlen
            if cMatOn:
                e1=self.w1e.get()
                n1=self.w1n.get()
                xd1a=xbetween[0]/wale1*(1-n1)
                xd1b=xafter[0]/wale1*(n1-1)+xd1a
                e2=self.w2e.get()
                n2=self.w2n.get()
                xd2a=xbetween[0]/wale2*(1-n2)
                xd2b=xafter[0]/wale2*(n2-1)+xd2a
            if self.Wa1On.get():
                self.w1.visible=1-self.hid.get()
                w1typ=self.w1type.get()
                if cMatOn:
                    if w1typ=="Vízszintes":
                        zbefore=amp1*sin(xbefore/wale1-freq1*t)
                        zbetween=amp1*exp(e1*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale1*n1-freq1*t+xd1a)
                        zafter=amp1*exp(e1*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale1-freq1*t+xd1b)
                        self.w1.z=concatenate((zbefore,zbetween,zafter))
                        self.w1.y=0.0
                    elif w1typ=="Függőleges":
                        ybefore=amp1*sin(xbefore/wale1-freq1*t)
                        ybetween=amp1*exp(e1*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale1*n1-freq1*t+xd1a)
                        yafter=amp1*exp(e1*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale1-freq1*t+xd1b)
                        self.w1.y=concatenate((ybefore,ybetween,yafter))
                        self.w1.z=0.0
                    elif w1typ=="Jobbra cirkuláris":
                        zbefore=amp1*sin(xbefore/wale1-freq1*t)
                        zbetween=amp1*exp(e1*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale1*n1-freq1*t+xd1a)
                        zafter=amp1*exp(e1*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale1-freq1*t+xd1b)
                        self.w1.z=concatenate((zbefore,zbetween,zafter))
                        ybefore=amp1*sin(xbefore/wale1-freq1*t+pih)
                        ybetween=amp1*exp(e1*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale1*n1-freq1*t+xd1a+pih)
                        yafter=amp1*exp(e1*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale1-freq1*t+xd1b+pih)
                        self.w1.y=concatenate((ybefore,ybetween,yafter))
                    elif w1typ=="Balra cirkuláris":
                        zbefore=amp1*sin(xbefore/wale1-freq1*t)
                        zbetween=amp1*exp(e1*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale1*n1-freq1*t+xd1a)
                        zafter=amp1*exp(e1*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale1-freq1*t+xd1b)
                        self.w1.z=concatenate((zbefore,zbetween,zafter))
                        ybefore=amp1*sin(xbefore/wale1-freq1*t-pih)
                        ybetween=amp1*exp(e1*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale1*n1-freq1*t+xd1a-pih)
                        yafter=amp1*exp(e1*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale1-freq1*t+xd1b-pih)
                        self.w1.y=concatenate((ybefore,ybetween,yafter))
                else:
                    if w1typ=="Vízszintes":
                        self.w1.z=self.ampli1.get()*sin(x/wale1-freq1*t)
                        self.w1.y=0.0
                    elif w1typ=="Függőleges":
                        self.w1.z=0.0
                        self.w1.y=self.ampli1.get()*sin(x/wale1-freq1*t)
                    elif w1typ=="Jobrra cirkuláris":
                        self.w1.z=self.ampli1.get()*sin(x/wale1-freq1*t)
                        self.w1.y=self.ampli1.get()*sin(x/wale1-freq1*t+pih)
                    elif w1typ=="Balra cirkuláris":
                        self.w1.z=self.ampli1.get()*sin(x/wale1-freq1*t)
                        self.w1.y=self.ampli1.get()*sin(x/wale1-freq1*t-pih)
                self.arr1a.visible=1
                self.arr1a.axis=(0,self.w1.y[0],self.w1.z[0])
                self.arr1b.visible=1
                self.arr1b.axis=(0,self.w1.y[-1],self.w1.z[-1])
            else:
                self.SumOn.set(0) # if wave1 is off, turn off the sum wave
                self.w1.z=0.0
                self.w1.y=0.0
                self.w1.visible=0
                self.arr1a.visible=0
                self.arr1b.visible=0
            if self.Wa2On.get():
                self.w2.visible=1-self.hid.get()
                w2typ=self.w2type.get()
                if cMatOn:
                    if w2typ=="Vízszintes":
                        zbefore=amp2*sin(xbefore/wale2-freq2*t+pdif)
                        zbetween=amp2*exp(e2*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale2*n2-freq2*t+xd2a+pdif)
                        zafter=amp2*exp(e2*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale2-freq2*t+xd2b+pdif)
                        self.w2.z=concatenate((zbefore,zbetween,zafter))
                        self.w2.y=0.0
                    elif w2typ=="Függőleges":
                        ybefore=amp2*sin(xbefore/wale2-freq2*t+pdif)
                        ybetween=amp2*exp(e2*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale2*n2-freq2*t+xd2a+pdif)
                        yafter=amp2*exp(e2*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale2-freq2*t+xd2b+pdif)
                        self.w2.y=concatenate((ybefore,ybetween,yafter))
                        self.w2.z=0.0
                    elif w2typ=="Jobbra cirkuláris":
                        zbefore=amp2*sin(xbefore/wale2-freq2*t+pdif)
                        zbetween=amp2*exp(e2*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale2*n2-freq2*t+xd2a+pdif)
                        zafter=amp2*exp(e2*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale2-freq2*t+xd2b+pdif)
                        self.w2.z=concatenate((zbefore,zbetween,zafter))
                        ybefore=amp2*sin(xbefore/wale2-freq2*t+pih+pdif)
                        ybetween=amp2*exp(e2*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale2*n2-freq2*t+xd2a+pih+pdif)
                        yafter=amp2*exp(e2*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale2-freq2*t+xd2b+pih+pdif)
                        self.w2.y=concatenate((ybefore,ybetween,yafter))
                    elif w2typ=="Balra cirkuláris":
                        zbefore=amp2*sin(xbefore/wale2-freq2*t+pdif)
                        zbetween=amp2*exp(e2*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale2*n2-freq2*t+xd2a+pdif)
                        zafter=amp2*exp(e2*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale2-freq2*t+xd2b+pdif)
                        self.w2.z=concatenate((zbefore,zbetween,zafter))
                        ybefore=amp2*sin(xbefore/wale2-freq2*t-pih+pdif)
                        ybetween=amp2*exp(e2*(xbetween[0]-xbetween)/pi)*sin(xbetween/wale2*n2-freq2*t+xd2a-pih+pdif)
                        yafter=amp2*exp(e2*(xbetween[0]-xafter[0])/pi)*sin(xafter/wale2-freq2*t+xd2b-pih+pdif)
                        self.w2.y=concatenate((ybefore,ybetween,yafter))
                else:
                    if w2typ=="Vízszintes":
                        self.w2.z=self.ampli2.get()*sin(x/wale2-freq2*t+pdif)
                        self.w2.y=0.0
                    elif w2typ=="Függőleges":
                        self.w2.z=0.0
                        self.w2.y=self.ampli2.get()*sin(x/wale2-freq2*t+pdif)
                    elif w2typ=="Jobbra cirkuláris":
                        self.w2.z=self.ampli2.get()*sin(x/wale2-freq2*t+pdif)
                        self.w2.y=self.ampli2.get()*sin(x/wale2-freq2*t+pih+pdif)
                    elif w2typ=="Balra cirkuláris":
                        self.w2.z=self.ampli2.get()*sin(x/wale2-freq2*t+pdif)
                        self.w2.y=self.ampli2.get()*sin(x/wale2-freq2*t-pih+pdif)
                self.arr2a.visible=1
                self.arr2a.axis=(0,self.w2.y[0],self.w2.z[0])
                self.arr2b.visible=1
                self.arr2b.axis=(0,self.w2.y[-1],self.w2.z[-1])
            else:
                self.w2.z=0.0
                self.w2.y=0.0
                self.w2.visible=0
                self.arr2a.visible=0
                self.arr2b.visible=0
                self.SumOn.set(0) # if wave2 is off, turn off the sum wave
            if self.SumOn.get():
                self.sc.visible=1-self.hid.get()
                self.sc.z=self.w1.z+self.w2.z
                self.sc.y=self.w1.y+self.w2.y
                self.arrsa.visible=1
                self.arrsa.axis=(0,self.sc.y[0],self.sc.z[0])
                self.arrsb.visible=1
                self.arrsb.axis=(0,self.sc.y[-1],self.sc.z[-1])
                self.sl1a.visible=1
                self.sl1b.visible=1
                self.sl2a.visible=1
                self.sl2b.visible=1
                self.sl1a.pos=[(-8*pi,self.arr1a.axis.y,self.arr1a.axis.z),(-8*pi,self.arrsa.axis.y,self.arrsa.axis.z)]
                self.sl2a.pos=[(-8*pi,self.arr2a.axis.y,self.arr2a.axis.z),(-8*pi,self.arrsa.axis.y,self.arrsa.axis.z)]
                self.sl1b.pos=[(8*pi,self.arr1b.axis.y,self.arr1b.axis.z),(8*pi,self.arrsb.axis.y,self.arrsb.axis.z)]
                self.sl2b.pos=[(8*pi,self.arr2b.axis.y,self.arr2b.axis.z),(8*pi,self.arrsb.axis.y,self.arrsb.axis.z)]
            else:
                self.sc.visible=0
                self.arrsa.visible=0
                self.arrsb.visible=0
                self.sl1a.visible=0
                self.sl2a.visible=0
                self.sl1b.visible=0
                self.sl2b.visible=0
            t=t+step

app=Application()
app.mainloop()
