Commit 64810bc8 authored by Daniel Brown's avatar Daniel Brown
Browse files

more gui fixes

parent 486eb5c5
......@@ -6,7 +6,7 @@ import numpy as np
code = """
l l1 1 0 0 n1
s s1 10 1 n1 n2
m m1 1 0 0 n2 dump
m m1 1 0 0 n2 n3
gauss g1 m1 n2 1e-3 0
......
......@@ -10,52 +10,12 @@ from pykat.structs import *
import numpy as np
import pylab as pl
kat = finesse.kat()
code = """
l l1 1 0 0 n1
"""
laser(kat,'l1','n1',1)
space(kat,'s1','n1','n2',1)
kat = finesse.kat(kat_code = code)
mirror(kat,'m1','n2','n3',R=0.8,T=0.2)
space(kat,'s2','n3','n4',L=1)
mirror(kat,'m2','n4','n5',R=0.7,T=0.3)
cavity(kat, 'cav1','m1','n3','m2','n4')
space(kat,'s3','n5','n6',L=1)
photodiode(kat,'pd_cav','n4')
photodiode(kat,'pd_ref','n2')
photodiode(kat,'pd_trs','n5')
kat.m1.Rcx = -1000.0
kat.m1.Rcy = -1000.0
kat.m2.Rcx = 1000.0
kat.m2.Rcy = 1000.0
xaxis(kat, Scale.linear, [0,360], kat.m2, kat.m2.phi, 1000)
kat.maxtem = 0
run = kat.run(printout=0,printerr=0)
#pl.figure()
#pl.ion()
#pl.plot(run.x,run.y)
#pl.xlabel(run.xlabel)
#pl.ylabel("Intensity [W]")
#pl.legend(run.ylabels)
#pl.show()
kat.m1.R = 0.5
kat.m1.T = 0.5
kat.pd_cav.enabled = False
run = kat.run(printout=0,printerr=0)
#pl.figure()
#pl.plot(run.x,run.y)
#pl.xlabel(run.xlabel)
#pl.ylabel("Intensity [W]")
#pl.legend(run.ylabels)
#pl.show()
kat.openGUI()
......
......@@ -17,7 +17,7 @@ class Component(object) :
def __init__(self, name):
self.__name = name
self._svgItem = None
self.__nodes = []
self._nodes = []
self._requested_node_names = []
self._kat = None
......@@ -52,13 +52,13 @@ class Component(object) :
else:
n.connect(self)
self.__nodes.append(n)
self._nodes.append(n)
return n
def getNodes(self):
""" Returns a copy of the nodes the component has """
return self.__nodes[:]
return self._nodes[:]
def __getname(self):
return self.__name
......@@ -235,11 +235,11 @@ class space(Component):
node_new.connect(self)
node_old.disconnect(self)
if self.node1 == node_old:
self.node1 = node_new
if self._nodes[0] == node_old:
self._nodes[0] = node_new
if self.node2 == node_old:
self.node2 = node_new
if self._nodes[1] == node_old:
self._nodes[1] = node_new
class laser(Component):
......
......@@ -60,11 +60,16 @@ class SpaceQGraphicsItem(QGraphicsLineItem):
conn = nodes[0].amIConnected(self.__space)
x1 = 0
y1 = 0
x2 = 0
y2 = 0
if conn[0]:
if conn[1] != None:
if self.__n1 is not None:
# i.e. we have a node graphic item but now it is connected to something
self.__n1.scene().removeItem(self.__n2)
self.__n1.scene().removeItem(self.__n1)
self.__n1 = None
# now check if a connected component was returned too
......@@ -170,7 +175,7 @@ class ComponentQGraphicsItem(QGraphicsSvgItem):
n.refresh()
def itemChange(self, change, value):
# if the item move then update any spaces
# if the item is moved then update any spaces attached to it
if change == QGraphicsItem.ItemPositionHasChanged:
nodes = self.__component.getNodes()
......
......@@ -99,10 +99,27 @@ class pyKatGUI(QtGui.QMainWindow, qt_gui.Ui_MainWindow):
def addMirror(self, x,y):
name = self.kat.getNewComponentName('m')
n = self.kat.getNewNodeNames('n',2)
m = pykat.components.mirror(self.kat,name,n[0],n[1])
m = pykat.components.mirror(name,n[0],n[1])
self.kat.add(m)
self.addComponentToScene(m,x,y)
def addSpace(self, x,y):
name = self.kat.getNewComponentName('s')
n = self.kat.getNewNodeNames('n',2)
s = pykat.components.space(name, n[0], n[1])
self.kat.add(s)
self.addComponentToScene(s,x,y)
def addLaser(self, x,y):
name = self.kat.getNewComponentName('l')
n = self.kat.getNewNodeNames('n',1)
l = pykat.components.laser(name, n[0])
self.kat.add(l)
self.addComponentToScene(l,x,y)
class pyKatGraphicsScene(QGraphicsScene):
def drawBackground(self, painter, rect):
size = 10
......@@ -148,10 +165,15 @@ class pyKatGraphicsView(QGraphicsView):
menu = QMenu(self)
addmenu = menu.addMenu("Add...")
action = addmenu.addAction("Space")
action.triggered.connect(functools.partial(gui.addSpace, pt.x(), pt.y()))
action = addmenu.addAction("Mirror")
action.triggered.connect(functools.partial(gui.addMirror,pt.x(),pt.y()))
addmenu.addAction("Laser")
action.triggered.connect(functools.partial(gui.addMirror, pt.x(), pt.y()))
action = addmenu.addAction("Laser")
action.triggered.connect(functools.partial(gui.addLaser, pt.x(), pt.y()))
addmenu.addAction("Beamsplitter")
addmenu.addAction("Photodiode")
......@@ -204,6 +226,7 @@ class pyKatGraphicsView(QGraphicsView):
def mouseReleaseEvent(self, ev):
# if we have dragged a node and marked another to connect it too
if self.__selected_item is not None and isinstance(self.__selected_item, NodeQGraphicItem) and self.__marked is not None:
# node attached to space which needs to be removed
node_s = self.__selected_item.node
......@@ -217,13 +240,16 @@ class pyKatGraphicsView(QGraphicsView):
qcomp = self.__marked.parentItem()
# connect space of node dragged to the component node
space.changeNode(node_s,node_c)
node_s.remove()
# the space node that has been dragged gets deleted and we
# replace it with the components
space.changeNode(node_s, node_c)
node_s.remove() # now remove from node network completly
# then refresh the graphical items
qspace.refresh()
qcomp.refresh()
if self.__marked is not None:
self.__marked.marked = False
self.__marked.refresh()
......
......@@ -22,7 +22,7 @@ class NodeNetwork(object):
# then this node already exists
return self._nodes[node_name]
else:
n = Node(node_name,self)
n = Node(node_name, self)
self._nodes[node_name] = n
return n
......@@ -30,7 +30,7 @@ class NodeNetwork(object):
if not isinstance(node,Node):
raise exceptions.ValueError("node argument is not of type Node")
if node not in self._nodes:
if node.name not in self._nodes:
raise exceptions.RuntimeError("Trying to remove node {0} when it has not been added".format(node.name))
C = node.getComponents()
......@@ -87,7 +87,7 @@ class Node(object):
self._detectors = []
self.__name = name
self._item = None
self._network = None
self._network = network
@property
def network(self): return self._network
......@@ -100,8 +100,33 @@ class Node(object):
def remove(self):
self._network.removeNode(self)
self._item.scene().removeItem(self._item)
if self._item != None:
self._item.scene().removeItem(self._item)
def disconnect(self, obj):
if not (isinstance(obj,Component) or isinstance(obj,Detector)):
raise exceptions.ValueError("Object is not a component or detector")
if isinstance(obj, Component):
if self._comp1 == obj:
self._comp1 = None
elif self._comp2 == obj:
self._comp2 = None
else:
raise exceptions.RuntimeError("Cannot dettach {0} from node {1}".format(
obj.name, self.__name))
else:
# we must have a detector as we check above
self._detectors.remove(obj)
if self._item is not None:
self._item.refresh()
def connect(self, obj):
if not (isinstance(obj,Component) or isinstance(obj,Detector)):
......@@ -143,7 +168,7 @@ class Node(object):
def amIConnected(self, obj):
"""
Checks if obj is connected oto the node. Returns true or false in tuple
Checks if obj is connected to the node. Returns true or false in tuple
with None or the other object and the node index which it is attached to
"""
if obj == self._comp1:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment