diff -r 343fa6867322 -r 722714c04dcd dialogs/ForceVariableDialog.py --- a/dialogs/ForceVariableDialog.py Fri Apr 01 15:33:36 2011 +0200 +++ b/dialogs/ForceVariableDialog.py Fri Apr 01 17:19:31 2011 +0200 @@ -22,6 +22,7 @@ #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import wx +import re import datetime #------------------------------------------------------------------------------- @@ -46,10 +47,33 @@ getfloat = gen_get_function(float) getstring = gen_get_function(str) -def gettime(v): - try: - return datetime.timedelta(0, float(v)) - except: +SECOND = 1000000 +MINUTE = 60 * SECOND +HOUR = 60 * MINUTE +DAY = 24 * HOUR +IEC_TIME_MODEL = re.compile("(?:T|TIME)#(-)?(?:(%(float)s)D_?)?(?:(%(float)s)H_?)?(?:(%(float)s)M_?)?(?:(%(float)s)S_?)?(?:(%(float)s)MS)?" % {"float": "[0-9]+(?:\.[0-9]+)?"}) + +def gettime(v): + result = IEC_TIME_MODEL.match(v.upper()) + if result is not None: + negative, days, hours, minutes, seconds, milliseconds = result.groups() + microseconds = 0 + not_null = False + for value, factor in [(days, DAY), + (hours, HOUR), + (minutes, MINUTE), + (seconds, SECOND), + (milliseconds, 1000)]: + if value is not None: + microseconds += float(value) * factor + not_null = True + if not not_null: + return None + if negative is not None: + microseconds = -microseconds + return datetime.timedelta(microseconds=microseconds) + + else: return None