|
@@ -5,6 +5,7 @@
|
|
|
|
|
|
Classes:
|
|
|
- ProcessWorkspaceFile
|
|
|
+ - WriteWorkspaceFile
|
|
|
- ProcessGrcFile
|
|
|
|
|
|
(C) 2007-2008 by the GRASS Development Team
|
|
@@ -47,10 +48,19 @@ class ProcessWorkspaceFile(HandlerBase):
|
|
|
self.inDisplay = False
|
|
|
self.inLayerManager = False
|
|
|
|
|
|
+ #
|
|
|
+ # Nviz section
|
|
|
+ #
|
|
|
+ self.inNviz = False
|
|
|
+ self.inAttribute = False
|
|
|
+
|
|
|
+ #
|
|
|
# layer manager properties
|
|
|
+ #
|
|
|
self.layerManager = {}
|
|
|
self.layerManager['pos'] = None # window position
|
|
|
self.layerManager['size'] = None # window size
|
|
|
+
|
|
|
# list of mapdisplays
|
|
|
self.displays = []
|
|
|
# list of map layers
|
|
@@ -153,6 +163,15 @@ class ProcessWorkspaceFile(HandlerBase):
|
|
|
else:
|
|
|
pass
|
|
|
|
|
|
+ #
|
|
|
+ # Nviz section
|
|
|
+ #
|
|
|
+ elif name == 'nviz':
|
|
|
+ self.inNviz = True
|
|
|
+
|
|
|
+ elif name == 'attribute':
|
|
|
+ self.inAttribute = True
|
|
|
+
|
|
|
def endElement(self, name):
|
|
|
if name == 'gxw':
|
|
|
self.inGxw = False
|
|
@@ -201,6 +220,15 @@ class ProcessWorkspaceFile(HandlerBase):
|
|
|
elif name == 'layer_manager':
|
|
|
self.inLayerManager = False
|
|
|
|
|
|
+ #
|
|
|
+ # Nviz section
|
|
|
+ #
|
|
|
+ elif name == 'nviz':
|
|
|
+ self.inNviz = False
|
|
|
+
|
|
|
+ elif name == 'attribute':
|
|
|
+ self.inAttribute = False
|
|
|
+
|
|
|
def characters(self, ch):
|
|
|
self.my_characters(ch)
|
|
|
|
|
@@ -208,6 +236,217 @@ class ProcessWorkspaceFile(HandlerBase):
|
|
|
if self.inValue:
|
|
|
self.value += ch
|
|
|
|
|
|
+class WriteWorkspaceFile(object):
|
|
|
+ """Generic class for writing workspace file"""
|
|
|
+ def __init__(self, lmgr, file):
|
|
|
+ self.file = file
|
|
|
+ self.lmgr = lmgr
|
|
|
+ self.indent = 0
|
|
|
+
|
|
|
+ # write header
|
|
|
+ self.file.write('<?xml version="1.0" encoding="UTF-8"?>\n')
|
|
|
+ self.file.write('<!DOCTYPE gxw SYSTEM "grass-gxw.dtd">\n')
|
|
|
+ self.file.write('%s<gxw>\n' % (' ' * self.indent))
|
|
|
+
|
|
|
+ self.indent =+ 4
|
|
|
+
|
|
|
+ # layer manager
|
|
|
+ windowPos = self.lmgr.GetPosition()
|
|
|
+ windowSize = self.lmgr.GetSize()
|
|
|
+ file.write('%s<layer_manager dim="%d,%d,%d,%d">\n' % (' ' * self.indent,
|
|
|
+ windowPos[0],
|
|
|
+ windowPos[1],
|
|
|
+ windowSize[0],
|
|
|
+ windowSize[1]
|
|
|
+ ))
|
|
|
+
|
|
|
+ file.write('%s</layer_manager>\n' % (' ' * self.indent))
|
|
|
+
|
|
|
+ # list of displays
|
|
|
+ for page in range(0, self.lmgr.gm_cb.GetPageCount()):
|
|
|
+ mapTree = self.lmgr.gm_cb.GetPage(page).maptree
|
|
|
+ region = mapTree.Map.region
|
|
|
+
|
|
|
+ displayPos = mapTree.mapdisplay.GetPosition()
|
|
|
+ displaySize = mapTree.mapdisplay.GetSize()
|
|
|
+
|
|
|
+ file.write('%s<display render="%d" '
|
|
|
+ 'mode="%d" showCompExtent="%d" '
|
|
|
+ 'dim="%d,%d,%d,%d" '
|
|
|
+ 'extent="%f,%f,%f,%f">\n' % (' ' * self.indent,
|
|
|
+ int(mapTree.mapdisplay.autoRender.IsChecked()),
|
|
|
+ mapTree.mapdisplay.toggleStatus.GetSelection(),
|
|
|
+ int(mapTree.mapdisplay.showRegion.IsChecked()),
|
|
|
+ displayPos[0],
|
|
|
+ displayPos[1],
|
|
|
+ displaySize[0],
|
|
|
+ displaySize[1],
|
|
|
+ region['w'],
|
|
|
+ region['s'],
|
|
|
+ region['e'],
|
|
|
+ region['n']
|
|
|
+ ))
|
|
|
+
|
|
|
+ # list of layers
|
|
|
+ item = mapTree.GetFirstChild(mapTree.root)[0]
|
|
|
+ self.__writeLayer(mapTree, item)
|
|
|
+ file.write('%s</display>\n' % (' ' * self.indent))
|
|
|
+
|
|
|
+ self.indent =- 4
|
|
|
+ file.write('%s</gxw>\n' % (' ' * self.indent))
|
|
|
+
|
|
|
+ def __writeLayer(self, mapTree, item):
|
|
|
+ """Write bunch of layers to GRASS Workspace XML file"""
|
|
|
+ self.indent += 4
|
|
|
+ while item and item.IsOk():
|
|
|
+ type = mapTree.GetPyData(item)[0]['type']
|
|
|
+ if type != 'group':
|
|
|
+ maplayer = mapTree.GetPyData(item)[0]['maplayer']
|
|
|
+ else:
|
|
|
+ maplayer = None
|
|
|
+
|
|
|
+ checked = int(item.IsChecked())
|
|
|
+ cmd = mapTree.GetPyData(item)[0]['cmd']
|
|
|
+ if type == 'command':
|
|
|
+ self.file.write('%s<layer type="%s" name="%s" checked="%d">\n' % \
|
|
|
+ (' ' * self.indent, type, ' '.join(cmd), checked));
|
|
|
+ self.file.write('%s</layer>\n' % (' ' * self.indent));
|
|
|
+ elif type == 'group':
|
|
|
+ name = mapTree.GetItemText(item)
|
|
|
+ self.file.write('%s<group name="%s" checked="%d">\n' % \
|
|
|
+ (' ' * self.indent, name, checked));
|
|
|
+ self.indent += 4
|
|
|
+ subItem = mapTree.GetFirstChild(item)[0]
|
|
|
+ self.WriteLayer(subItem)
|
|
|
+ self.indent -= 4
|
|
|
+ self.file.write('%s</group>\n' % (' ' * self.indent));
|
|
|
+ else:
|
|
|
+ name = mapTree.GetItemText(item)
|
|
|
+ opacity = maplayer.GetOpacity(float=True)
|
|
|
+ self.file.write('%s<layer type="%s" name="%s" checked="%d" opacity="%f">\n' % \
|
|
|
+ (' ' * self.indent, type, name, checked, opacity));
|
|
|
+
|
|
|
+ self.indent += 4
|
|
|
+ # selected ?
|
|
|
+ if item == mapTree.layer_selected:
|
|
|
+ self.file.write('%s<selected />\n' % (' ' * self.indent))
|
|
|
+ # layer properties
|
|
|
+ self.file.write('%s<task name="%s">\n' % (' ' * self.indent, cmd[0]))
|
|
|
+ self.indent += 4
|
|
|
+ for option in cmd[1:]:
|
|
|
+ if option[0] == '-': # flag
|
|
|
+ self.file.write('%s<flag name="%s" />\n' %
|
|
|
+ (' ' * self.indent, option[1]))
|
|
|
+ else: # parameter
|
|
|
+ key, value = option.split('=', 1)
|
|
|
+ self.file.write('%s<parameter name="%s">\n' %
|
|
|
+ (' ' * self.indent, key))
|
|
|
+ self.indent += 4
|
|
|
+ self.file.write('%s<value>%s</value>\n' %
|
|
|
+ (' ' * self.indent, value))
|
|
|
+ self.indent -= 4
|
|
|
+ self.file.write('%s</parameter>\n' % (' ' * self.indent));
|
|
|
+ self.indent -= 4
|
|
|
+ self.file.write('%s</task>\n' % (' ' * self.indent));
|
|
|
+ nviz = mapTree.GetPyData(item)[0]['nviz']
|
|
|
+ if nviz:
|
|
|
+ self.file.write('%s<nviz>\n' % (' ' * self.indent));
|
|
|
+ if maplayer.type == 'raster':
|
|
|
+ self.__writeNvizSurface(nviz)
|
|
|
+ elif maplayer.type == 'vector':
|
|
|
+ self.__writeNvizVector(nviz)
|
|
|
+ self.file.write('%s</nviz>\n' % (' ' * self.indent));
|
|
|
+ self.indent -= 4
|
|
|
+ self.file.write('%s</layer>\n' % (' ' * self.indent));
|
|
|
+ item = mapTree.GetNextSibling(item)
|
|
|
+ self.indent -= 4
|
|
|
+
|
|
|
+ def __writeNvizSurface(self, data):
|
|
|
+ """Save Nviz raster layer properties to workspace
|
|
|
+
|
|
|
+ @param data Nviz layer properties
|
|
|
+ """
|
|
|
+ self.indent += 4
|
|
|
+ for attrb in data.iterkeys():
|
|
|
+ if len(data[attrb]) < 1: # skip empty attributes
|
|
|
+ continue
|
|
|
+ for name in data[attrb].iterkeys():
|
|
|
+ # surface attribute
|
|
|
+ if attrb == 'attribute':
|
|
|
+ self.file.write('%s<%s name="%s" map="%d">\n' % \
|
|
|
+ (' ' * self.indent, attrb, name, data[attrb][name]['map']))
|
|
|
+ self.indent += 4
|
|
|
+ self.file.write('%s<value>%s</value>\n' % (' ' * self.indent, data[attrb][name]['value']))
|
|
|
+ self.indent -= 4
|
|
|
+ # draw mode
|
|
|
+ if attrb == 'draw':
|
|
|
+ self.file.write('%s<%s' %(' ' * self.indent, attrb))
|
|
|
+ resTag = None
|
|
|
+ for name in data[attrb]:
|
|
|
+ if name == 'resolution':
|
|
|
+ self.indent += 4
|
|
|
+ resTag = ''
|
|
|
+ for type, value in (('coarse', data[attrb][name][0]),
|
|
|
+ ('fine', data[attrb][name][1])):
|
|
|
+ resTag += '%s<resolution type="%s">\n' % (' ' * self.indent, type)
|
|
|
+ self.indent += 4
|
|
|
+ resTag += '%s<value>%s</value>\n' % (' ' * self.indent, value)
|
|
|
+ self.indent -= 4
|
|
|
+ resTag += '%s</resolution>\n' % (' ' * self.indent)
|
|
|
+ self.indent -= 4
|
|
|
+ else:
|
|
|
+ # note: second argument is 'all' -> skip
|
|
|
+ self.file.write(' %s="%s"' % (name, data[attrb][name][0]))
|
|
|
+ self.file.write('>\n') # <draw ...>
|
|
|
+ if resTag:
|
|
|
+ self.file.write(resTag)
|
|
|
+ # position
|
|
|
+ elif attrb == 'position':
|
|
|
+ self.file.write('%s<%s>\n' %(' ' * self.indent, attrb))
|
|
|
+ i = 0
|
|
|
+ for tag in ('x', 'y', 'z'):
|
|
|
+ self.indent += 4
|
|
|
+ self.file.write('%s<%s>%s<%s>\n' % (' ' * self.indent, tag,
|
|
|
+ data[attrb][name][i], tag))
|
|
|
+ i += 1
|
|
|
+ self.indent -= 4
|
|
|
+ # end tag
|
|
|
+ self.file.write('%s<%s>\n' % (' ' * self.indent, attrb))
|
|
|
+ self.indent -= 4
|
|
|
+
|
|
|
+ def __writeNvizVector(self, data):
|
|
|
+ """Save Nviz vector layer properties to workspace
|
|
|
+
|
|
|
+ @param data Nviz layer properties
|
|
|
+ """
|
|
|
+ self.indent += 4
|
|
|
+ for attrb in data.iterkeys():
|
|
|
+ if len(data[attrb]) < 1: # skip empty attributes
|
|
|
+ continue
|
|
|
+ self.file.write('%s<%s>\n' % (' ' * self.indent, attrb))
|
|
|
+ self.indent += 4
|
|
|
+ for name in data[attrb].iterkeys():
|
|
|
+ self.file.write('%s<%s>' % (' ' * self.indent, name))
|
|
|
+ if type(data[attrb][name]) == type({}):
|
|
|
+ self.file.write('\n')
|
|
|
+ self.indent += 4
|
|
|
+ for subname in data[attrb][name].iterkeys():
|
|
|
+ if subname == 'flat':
|
|
|
+ self.file.write('%s<style flat="%d">%s</style>\n' % (' ' * self.indent,
|
|
|
+ data[attrb][name][subname][0],
|
|
|
+ data[attrb][name][subname][1]))
|
|
|
+ else:
|
|
|
+ self.file.write('%s<%s>%s</%s>\n' % (' ' * self.indent, subname,
|
|
|
+ data[attrb][name][subname], subname))
|
|
|
+ self.indent -= 4
|
|
|
+ self.file.write('%s</%s>\n' % (' ' * self.indent, name))
|
|
|
+ else:
|
|
|
+ self.file.write('%s</%s>\n' % (data[attrb][name], name))
|
|
|
+ self.indent -= 4
|
|
|
+ self.file.write('%s</%s>\n' % (' ' * self.indent, attrb))
|
|
|
+
|
|
|
+ self.indent -= 4
|
|
|
+
|
|
|
class ProcessGrcFile(object):
|
|
|
def __init__(self, filename):
|
|
|
"""Process GRC file"""
|