diff options
Diffstat (limited to 'Build/source/utils/asymptote/GUI/xasyFile.py')
-rwxr-xr-x | Build/source/utils/asymptote/GUI/xasyFile.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/GUI/xasyFile.py b/Build/source/utils/asymptote/GUI/xasyFile.py new file mode 100755 index 00000000000..eee6d69a856 --- /dev/null +++ b/Build/source/utils/asymptote/GUI/xasyFile.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +########################################################################### +# +# xasyFile implements the loading, parsing, and saving of an xasy file. +# +# +# Author: Orest Shardt +# Created: June 29, 2007 +# +############################################################################ + +from string import * +import xasy2asy as x2a +import io +import re + + +class xasyParseError(Exception): + """A parsing error""" + pass + + +class xasyFileError(Exception): + """An i/o error or other error not related to parsing""" + pass + + +def extractTransform(line): + """Returns key and the new transform.""" + # see https://regex101.com/r/6DqkRJ/4 for info + mapString = x2a.xasyItem.mapString + testMatch = re.match( + r'^{0:s}\s*\(\s*\"([^\"]+)\"\s*,\s*\(([-\d, .]+)\)\s*\)'.format(mapString), line.strip()) + if testMatch is None: + mapOnlyMatch = re.match(r'^{0:s}\s*\(\s *\"([^\"]+)\"\s*\)'.format(mapString), line.strip()) + if mapOnlyMatch is None: + return None + else: + key = mapOnlyMatch.group(1) + return key, x2a.identity() + else: + key = testMatch.group(1) + rawStr = testMatch.group(2) + rawStrArray = rawStr.split(',') + + if len(rawStrArray) != 6: + return None + transf = [float(val.strip()) for val in rawStrArray] + return key, x2a.asyTransform(transf) + + +def extractTransformsFromFile(fileStr): + transfDict = {} + maxItemCount = 0 + with io.StringIO() as rawCode: + for line in fileStr.splitlines(): + test_transf = extractTransform(line.rstrip()) + if test_transf is None: + rawCode.write(line + '\n') + else: + key, transf = test_transf + if key not in transfDict.keys(): + transfDict[key] = [] + transfDict[key].append(transf) + + # see https://regex101.com/r/RgeBVc/2 for regex + + testNum = re.match(r'^x(\d+)($|:.*$)', key) + if testNum is not None: + maxItemCount = max(maxItemCount, int(testNum.group(1))) + final_str = rawCode.getvalue() + return final_str, transfDict, maxItemCount + + +def saveFile(file, xasyItems, asy2psmap): + """Write a list of xasyItems to a file""" + for item in xasyItems: + file.write(item.getTransformCode(asy2psmap)) + + for item in xasyItems: + file.write(item.getObjectCode(asy2psmap)) + + file.write('size('+str(asy2psmap*x2a.yflip())+'); '+ x2a.xasyItem.resizeComment+'\n') |