/
saving.py
executable file
·133 lines (90 loc) · 3.32 KB
/
saving.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import os
from xml.dom import minidom
from debug import *
from lambdaparser import parser
from figure import Figure
from fielditem import TextItem
from vector import Vector
import refnames
def save( manipulator, pretty = False ):
doc = minidom.Document()
workspace = doc.createElement("workspace")
doc.appendChild( workspace )
label = doc.createElement( 'label' )
label.setAttribute( 'name', 'Visual Lambda workspace' )
workspace.appendChild( label )
items = doc.createElement('items')
workspace.appendChild( items )
for i in manipulator.items:
item = doc.createElement('item')
pos = i.position * Vector((0,0,1,1))
item.setAttribute( 'pos', '%f,%f' % (pos[0],pos[1]) )
if isinstance( i, Figure ):
refnames.reset()
item.setAttribute( 'figure', repr(i.expression.expr) )
elif isinstance( i, TextItem ):
item.setAttribute( 'text', i.text )
items.appendChild( item )
if pretty:
return doc.toprettyxml(indent=' ', newl='\n')
else:
return doc.toxml()
def load( manipulator, xmlData ):
try:
dom = minidom.parseString( xmlData )
except:
print("Error. Can't parse workspace xml")
return False
# Reset library local defines
parser.lib.reset_local_items()
# Load items
manipulator.items = []
lastOrigin = Vector((0, 0))
for item in dom.getElementsByTagName('item'):
# Define
if item.hasAttribute('define'):
parser.lib.add_line( item.getAttribute('define'), isGlobal = False )
continue
# Figure or Text item
i = None
if item.hasAttribute('figure'):
i = Figure( item.getAttribute('figure') )
elif item.hasAttribute('text'):
i = TextItem( item.getAttribute('text') )
if i:
pos = item.getAttribute('pos').split(',')
pos = tuple(map( float, pos ))
pos = lastOrigin + Vector(pos)
i.position.setTranspose( pos[0],pos[1], 1 )
i.refreshTransform()
manipulator.items.append( i )
if item.hasAttribute('origin'):
lastOrigin = pos
dom.unlink()
refnames.reset()
return True
def save_to_file( manipulator, filename ):
xml = save( manipulator, pretty = True )
if not xml:
return False
filepath = os.path.join('workspaces', filename )
with open( filepath, "w" ) as f:
f.write(xml)
f.close()
debug('save', 'Workspace saved to', filename )
return True
print("Error. Can't write to", filepath)
return False
def load_from_file( manipulator, filename ):
filepath = os.path.join('workspaces', filename )
xmlData = None
with open( filepath, "r" ) as f:
xmlData = f.read()
f.close()
if not xmlData:
print("Error. Can't read (or empty)", filepath)
return False
if load( manipulator, xmlData ):
debug('save', 'Workspace loaded from', filename )
return True
return False