Skip to content

Commit

Permalink
added layertree class
Browse files Browse the repository at this point in the history
  • Loading branch information
warrieka committed Nov 18, 2015
1 parent 85eaf46 commit 445c064
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 18 deletions.
52 changes: 48 additions & 4 deletions mxdTranslator/_mxd2qgs.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def __init__(self):
self.prjSrs = None
self.prjQgs = None

def convertMxd(self, mxdPath, qgsPath, startQgis=False ):
def convertMxd(self, mxdPath, qgsPath, startQgis=False ):
"""
:param mxdPath: path to the input
:param qgsPath: path to the output qgs-file
Expand All @@ -17,7 +17,7 @@ def convertMxd(self, mxdPath, qgsPath, startQgis=False ):
self.mxd = mxdReader(mxdPath)

self.prjSrs = qgsSrs(self.mxd.crsProj4, None, self.mxd.crsCode, self.mxd.crsName, self.mxd.crsProjectionacronym,
self.mxd.crsEllipsoidacronym, self.mxd.crsGeographic, self.mxd.crsAuth)
self.mxd.crsEllipsoidacronym, self.mxd.crsGeographic, self.mxd.crsAuth)

self.prjQgs = qgsWriter(projectname= self.mxd.title, bbox= self.mxd.bbox, mapUnits= self.mxd.mapUnits,
srs= self.prjSrs)
Expand All @@ -33,7 +33,7 @@ def convertMxd(self, mxdPath, qgsPath, startQgis=False ):

datageomType = arclyr["geomType"] if dataType == "vector" else None

qgsLyr = qgsMapLayer(dataName, dataType, datageomType, lyrSrs )
qgsLyr = qgsMapLayer(dataName, dataType, datageomType, lyrSrs, visible= arclyr['visible'])
qgsLyr.layerTitle = dataName

if dataType == "vector":
Expand Down Expand Up @@ -69,6 +69,8 @@ def convertMxd(self, mxdPath, qgsPath, startQgis=False ):

self.prjQgs.addLayer(qgsLyr, checked= arclyr['visible'])

# tree = self._makeLayerTree()
# self.prjQgs.addLayerTree(tree)
self.prjQgs.save(qgsPath)

if startQgis:
Expand Down Expand Up @@ -250,4 +252,46 @@ def getLineRender(self, layout):
else:
return None

return render
return render

#-----------private-------------
#TODO this only works only for 1 level
def _makeLayerTree(self):
self.qgsTree = qgsLayerTree()
layers = self.prjQgs.layers

tree = [{"id": k, 'path': v.layerName.split("\\"), "layer": v} for k,v in layers.items()]
self._parseTree(tree, self.qgsTree.tree)
return self.qgsTree

# def _parseTree(self, pathTree, layerTree):
#
# groupCount = 0
# groups = {}
# subGroups = []
#
# for rec in pathTree:
# layerId = rec['id']
# path = rec['path']
# layer = rec['layer']
#
# if len(pathTree) == 1:
# self.qgsTree.addLayer(layerId, layer.layerName, layerTree, layer.visible)
#
# elif len(pathTree) > 1:
# groupName = path[0]
# subPath = "\\".join( path[1:] )
#
# if not groupName in groups.values():
# subTree= layerTree['layers'][groupCount]
# groups[groupCount] = groupName
# self.qgsTree.addGroup( groupName, subTree )
#
# subGroups.append({"id": layerId, 'path': subPath, "layer": layer, 'groupID': groupCount})
#
# groupCount += 1
#
# for groupID in groups.keys():
# subPathTree = [ n for n in subGroups if n['groupID'] == groupID ]
# subLayerTree = layerTree['layers'][groupID]
# self._parseTree(subPathTree, subLayerTree)
3 changes: 2 additions & 1 deletion mxdTranslator/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ def fn_(*args, **kwargs):
thread = threading.Thread(target=function, args=args, kwargs=kwargs)
thread.start()
thread.join()
return fn_
return fn_

3 changes: 2 additions & 1 deletion qgsWriter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
from _qgsSrs import *
from _qgsMapLayer import *
from _qgsSymbol import *
from _qgsRenderer import *
from _qgsRenderer import *
from _qgsLayerTree import *
66 changes: 66 additions & 0 deletions qgsWriter/_qgsLayerTree.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET

class qgsLayerTree:
def __init__(self, rootName=""):
"""
:param rootName: the name of the rootlayer
"""
self.tree = dict(name=rootName, layers=[], checked='Qt::Checked', expanded='1')

def addLayer(self, layerId, name="", level=None, checked=True, expanded=True):
"""
Add a regular layer
:param layerId:
:param name:
:param level:
:param checked:
:param expanded:
"""
if not level:
level = self.tree

checkedStr = "Qt::Checked" if checked else "Qt::Unchecked"
expandedStr = "1" if expanded else "0"
layer = dict(id=str(layerId), name=name, checked=checkedStr, expanded=expandedStr)
level['layers'].append(layer)

def addGroup(self, name='', level=None, checked=True, expanded=True):
"""
Add a gropup layer
:param name:
:param level:
:param checked:
:param expanded:
"""
if not level:
level = self.tree
else:
if 'layers' in level.keys(): raise Exception("layer is not a group layer")

checkedStr = "Qt::Checked" if checked else "Qt::Unchecked"
expandedStr = "1" if expanded else "0"
layer = dict(name=name, layers=[], checked=checkedStr, expanded=expandedStr)
level['layers'].append( layer )
return

def _appendNodes(self, treeRecord, node):
if 'layers' in treeRecord.keys():
attribs = { k:n for k,n in treeRecord.items() if k <> 'layers' }

group = ET.SubElement(node ,'layer-tree-group', attribs)
for layer in treeRecord['layers']:
self._appendNodes( layer, group )
return group
else:
return ET.SubElement(node, 'layer-tree-layer', treeRecord)


def node(self):
rootName = self.tree['name']
rootGroup = ET.Element('layer-tree-group', expanded="1", checked="Qt::Checked", name=rootName)

for layer in self.tree['layers']:
self._appendNodes( layer, rootGroup )

return rootGroup
7 changes: 2 additions & 5 deletions qgsWriter/_qgsMapLayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from _qgsSymbol import qgsSymbol

class qgsMapLayer:
def __init__(self, name, dataType="vector", geometryType=None, srs=None, renderer=None):
def __init__(self, name, dataType="vector", geometryType=None, srs=None, renderer=None, visible=True):
"""
Create a maplayer object, only gdal/ogr sources are supported
:param name: a name for the layer
Expand All @@ -25,6 +25,7 @@ def __init__(self, name, dataType="vector", geometryType=None, srs=None, rendere

#public properties
self.layerName = name
self.visible = visible
self.layerTitle = ""
self.abstract = ""
self.keywords = []
Expand Down Expand Up @@ -95,10 +96,6 @@ def setRenderer(self, renderer=None):

return True

def rasterrenderer(self):
#TODO
pass

def node(self):
"""Convert to a XML node object"""
#base setting
Expand Down
16 changes: 13 additions & 3 deletions qgsWriter/_qgsWriter.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
import sys, os, datetime
import datetime
import xml.etree.ElementTree as ET
from _qgsMapLayer import qgsMapLayer
from _qgsSrs import qgsSrs
from _qgsLayerTree import qgsLayerTree

class qgsWriter:
def __init__(self, projectname="", version="2.0.1-Dufour", bbox=[0,-180,360,-180], srs=None, mapUnits="unknown" ):
Expand Down Expand Up @@ -45,6 +45,15 @@ def _setMapCanvas(self, bbox, mapUnits, srs):
self.qgis.append(mapcanvas)
return mapcanvas

def addLayerTree(self, tree):
"""
:param tree: a instance of qgsLayerTree
"""
if isinstance(tree, qgsLayerTree):
self.qgis.append( tree.node() )
else:
raise Exception("tree is not a qgsLayerTree")

def _addLegendItem(self, layerName, active=False, opened=True, checked=True, visible=True, drawingOrder=-1):
layerID = layerName + datetime.datetime.now().strftime("%Y%m%d%H%M%S")

Expand Down Expand Up @@ -72,10 +81,11 @@ def _setSrs(self, proj4="+proj=longlat +datum=WGS84 +no_defs",
return qgsSrs(proj4, srsid, crs, description, "", ellipsoidacronym, geographic)

#--------------Public-----------------#
def addLayer(self, mapLayer, active=False, opened=True, checked=True, visible=True, drawingOrder=-1):
def addLayer(self, mapLayer, active=False, opened=True, checked=True, visible=True, drawingOrder=-1, group=None):
layerID = self._addLegendItem( mapLayer.layerName, active, opened, checked, visible, drawingOrder)
#set new laterID
mapLayer.layerID = layerID
mapLayer.visible = checked
self.layers[layerID] = mapLayer
self._addProjectLayerItem(mapLayer)

Expand Down
6 changes: 2 additions & 4 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from distutils.core import setup
setup(name='mxdTranslator',
setup(name='QGIS Tools for Arcgis',
description='Translate ESRI Arcgis .mxd files to QGIS .qgs files.',
author='Kay Warrie',
author_email='[email protected]',
Expand All @@ -8,7 +8,5 @@
package_dir={'qgsWriter': 'qgsWriter',
'mxdTranslator':'mxdTranslator',
'mxdParser':'mxdParser'},
data_files=[('Lib/site-packages/mxdTranslator/esri/toolboxes', ['QGIStool.pyt'])] ,
# package_data={'mxdTranslator': ['esri/toolboxes/*.*']},
scripts=[]
data_files=[('Lib/site-packages/mxdTranslator/esri/toolboxes', ['QGIStool.pyt'])]
)

0 comments on commit 445c064

Please sign in to comment.