diff --git a/pykat/components.py b/pykat/components.py index ab3b40325b9348928ab5167762e9d91c5cab7033..8345bc64c99442ca15b9b370a8c31a117c05cfcb 100644 --- a/pykat/components.py +++ b/pykat/components.py @@ -23,17 +23,37 @@ class NodeGaussSetter: if not isinstance(component, Component): raise pkex.BasePyKatException("Value passed is not a Component") - if not isinstance(node, Node): + if not isinstance(node, pykat.node_network.Node): raise pkex.BasePyKatException("Value passed is not a Node") - self._comp = component - self._node = node + self.__comp = component + self.__node = node + + @property + def node(self): return self.__node + + @property + def q(self): return self.__node.qx + @q.setter + def q(self, value): + node.setGauss(self.__comp, value) + + @property + def qx(self): return self.__node.qx + @qx.setter + def qx(self, value): + node.setGauss(self.__comp, value) + + @property + def qy(self): return self.__node.qy + @qy.setter + def qy(self, value): + node.setGauss(self.__comp, self.qx, value) class Component(object) : def __init__(self, name): self.__name = name self._svgItem = None - self._nodes = None self._requested_node_names = [] self._kat = None self.tag = None @@ -59,32 +79,34 @@ class Component(object) : def __on_node_change(self): # need to update the node gauss parameter setter members - #self.__update_node_setters() - return + self.__update_node_setters() def __update_node_setters(self): # check if any node setters have already been added. If so we # need to remove them. This function should get called if the nodes # are updated, either by some function call or the GUI key_rm = [k for k in self.__dict__ if k.startswith("__nodesetter_", 0, 13)] + # now we have a list of which to remove for key in key_rm: ns = self.__dict__[key] detattr(self, '__nodesetter_' + ns._node.name) - delattr(self.__class__, ns._node.name) - + delattr(self, ns._node.name) + for node in self.nodes: - self.__add_node_setter(NodeGaussSetter(self, node)) + if type(node) != pykat.node_network.DumpNode: + ns = NodeGaussSetter(self, node) + self.__add_node_setter(ns) def __add_node_setter(self, ns): if not isinstance(ns, NodeGaussSetter): raise exceptions.ValueError("Argument is not of type NodeGaussSetter") - name = ns.__class__.__name__ + name = ns.node.name fget = lambda self: self.__get_node_setter(name) - setattr(self.__class__, name, property(fget)) + setattr(self, name, property(fget)) setattr(self, '__nodesetter_' + name, ns) def __get_node_setter(self, name): diff --git a/pykat/node_network.py b/pykat/node_network.py index 6570c4cdb2c4944feeb510d6d0cc2f95af531a0c..14d52e9123885756a84560ee0eb029adf4362507 100644 --- a/pykat/node_network.py +++ b/pykat/node_network.py @@ -141,7 +141,7 @@ class NodeNetwork(object): name = node.name fget = lambda self: self.__get_node_attr(name) - setattr(self.__class__, name, property(fget)) + setattr(self, name, property(fget)) setattr(self, '__node_' + name, node) def __remove_node_attr(self, node): @@ -150,23 +150,21 @@ class NodeNetwork(object): name = node.name detattr(self, '__node_' + name) - delattr(self.__class__, name) + delattr(self, name) def __get_node_attr(self, name): return getattr(self, '__node_' + name) class Node(object): - class gauss_version: - w0_z = 1 - z_zR = 2 - + def __init__(self, name, network, id): self._detectors = [] self.__name = name self._item = None self._network = network - self.__gauss = None - self.__gauss_version = None + self.__q_x = None + self.__q_y = None + self.__q_comp = None self.__id = id @property @@ -179,25 +177,46 @@ class Node(object): def components(self): return self._network.getNodeComponents(self) @property - def gauss(self): return self.__gauss + def q(self): + if self.__q_x == self.__q_y: + return self.__q_x + else: + return (self.__q_x, self.__q_y) + + @property + def qx(self): return self.__q_x + @property + def qy(self): return self.__q_y def removeGauss(): - self.__gauss_version = None - self.__gauss = None - - def gauss_w0_z(self, w0, z, w0y=None, zy=None): - self.__gauss = [] - self.__gauss.append(w0) - self.__gauss.append(z) + self.__q_x = None + self.__q_y = None + self.__q_comp = None + + def setGauss(self, component, *args): + self.__q_comp = component + + if len(args) == 1: + self.__q_x = args[0] + self.__q_y = args[0] + elif len(args) == 2: + self.__q_x = args[0] + self.__q_y = args[1] + else: + raise pkex.BasePyKatException("Must specify either 1 Gaussian beam parameter or 2 for astigmatic beams") - if w0y != None and zy != None: - self.__gauss.append(w0y) - self.__gauss.append(zy) + def getFinesseText(self): + if self.__q_x is None or self.__q_y is None or self.__q_comp is None: + return [] - self.__gauss_version = Node.gauss_version.w0_z + rtn = [] - def getFinesseText(self): - return [] + if self.__q_x == self.__q_y: + rtn.append("gauss* g_{node} {comp} {node} {z} {zr}".format(node=self.name, comp=self.__q_comp.name, z=self.__q_x.real, zr=self.__q_x.imag)) + else: + rtn.append("gauss* g_{node} {comp} {node} {zx} {zrx} {zy} {zry}".format(node=self.name, comp=self.__q_comp.name, zx=self.__q_x.real, zrx=self.__q_x.imag, zy=self.__q_y.real, zry=self.__q_y.imag)) + + return rtn def isConnected(self): if (self.components[0] is not None) and (self.self.components[1] is not None):