From 64810bc84e7cf1d05f2fac8b97d2378f911f35f7 Mon Sep 17 00:00:00 2001
From: Daniel Brown <ddb@star.sr.bham.ac.uk>
Date: Tue, 26 Nov 2013 18:57:55 +0000
Subject: [PATCH] more gui fixes

---
 bin/test_aperture.py  |  2 +-
 bin/test_pykat_gui.py | 48 ++++---------------------------------------
 pykat/components.py   | 14 ++++++-------
 pykat/gui/graphics.py |  9 ++++++--
 pykat/gui/gui.py      | 42 +++++++++++++++++++++++++++++--------
 pykat/node_network.py | 37 +++++++++++++++++++++++++++------
 6 files changed, 84 insertions(+), 68 deletions(-)

diff --git a/bin/test_aperture.py b/bin/test_aperture.py
index 2824b4e..b88ce17 100644
--- a/bin/test_aperture.py
+++ b/bin/test_aperture.py
@@ -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
 
diff --git a/bin/test_pykat_gui.py b/bin/test_pykat_gui.py
index fa1ad52..3b39da5 100644
--- a/bin/test_pykat_gui.py
+++ b/bin/test_pykat_gui.py
@@ -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()
 
diff --git a/pykat/components.py b/pykat/components.py
index c8c578b..bbb62d1 100644
--- a/pykat/components.py
+++ b/pykat/components.py
@@ -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):
diff --git a/pykat/gui/graphics.py b/pykat/gui/graphics.py
index 6e95ae3..b5b1368 100644
--- a/pykat/gui/graphics.py
+++ b/pykat/gui/graphics.py
@@ -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()
             
diff --git a/pykat/gui/gui.py b/pykat/gui/gui.py
index eecad83..6b82e3d 100644
--- a/pykat/gui/gui.py
+++ b/pykat/gui/gui.py
@@ -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()
diff --git a/pykat/node_network.py b/pykat/node_network.py
index b39431c..b872b45 100644
--- a/pykat/node_network.py
+++ b/pykat/node_network.py
@@ -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:
-- 
GitLab