From 0e08d5814c6d5b87af757f72e0fdc9e330c0296f Mon Sep 17 00:00:00 2001
From: Daniel Brown <ddb@star.sr.bham.ac.uk>
Date: Mon, 16 May 2016 12:25:23 -0700
Subject: [PATCH] fixing lens issues

---
 pykat/__init__.py   |  2 +-
 pykat/components.py | 33 +++++++++++++++++----------------
 2 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/pykat/__init__.py b/pykat/__init__.py
index 05ad003..1474e20 100644
--- a/pykat/__init__.py
+++ b/pykat/__init__.py
@@ -3,7 +3,7 @@ from __future__ import division
 from __future__ import print_function
 from __future__ import unicode_literals
 
-__version__ = "1.0.7"
+__version__ = "1.0.8"
 
 # This flag is used to switch on the gui features in pkat at import time
 USE_GUI = False
diff --git a/pykat/components.py b/pykat/components.py
index b6c1212..f0653a6 100644
--- a/pykat/components.py
+++ b/pykat/components.py
@@ -987,34 +987,30 @@ class isolator(Component):
         return self._svgItem
 
 class lens(Component):
-    def __init__(self, name, node1, node2, f=1):
+    def __init__(self, name, node1, node2, f=1, p=None):
         Component.__init__(self, name)
         
+        if not ((f is None) ^ (p is None)):
+            raise pkex.BasePyKatException("Specify either a focal length or power, not both.")
+        
         self._requested_node_names.append(node1)
         self._requested_node_names.append(node2)
         self._svgItem = None
         self.__f = Param("f", self, SIfloat(f))
-        self.__p = Param("p", self, None)
+        self.__p = Param("p", self, SIfloat(p))
         
     @property
-    def f(self):
-        if self.__f is not None:
-            return self.__f
-        else:
-            return 1/self.__p
+    def f(self): return self.__f
+            
     @f.setter
     def f(self, value):
         self.__f.value = SIfloat(value)
         self.__p.value = None
     
     @property
-    def p(self):
-        if self.__p is not None:
-            return self.__p
-        else:
-            return 1/self.__f
+    def p(self): return self.__p
             
-    @f.setter
+    @p.setter
     def p(self, value):
         self.__p.value = SIfloat(value)
         self.__f.value = None
@@ -1023,18 +1019,23 @@ class lens(Component):
     def parseFinesseText(text):
         values = text.split()
 
-        if values[0] != "lens":
+        if not values[0].startswith("lens"):
             raise pkex.BasePyKatException("'{0}' not a valid Finesse lens command".format(text))
 
+        alt = values[0].endswith("*")
+        
         values.pop(0) # remove initial value
         
         if len(values) == 4:
-            return lens(values[0], values[2], values[3], values[1])
+            if not alt:
+                return lens(values[0], values[2], values[3], f=values[1], p=None)
+            else:
+                return lens(values[0], values[2], values[3], f=None, p=values[1])
         else:
             raise pkex.BasePyKatException("Lens Finesse code format incorrect '{0}'".format(text))
         
     def getFinesseText(self):
-        if self.__p is None:
+        if self.__p.value is None:
             rtn = ['lens {0} {1} {2} {3}'.format(self.name, self.f.value, self.nodes[0].name, self.nodes[1].name)]
         else:
             rtn = ['lens* {0} {1} {2} {3}'.format(self.name, self.p.value, self.nodes[0].name, self.nodes[1].name)]
-- 
GitLab