mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-13 00:03:09 -04:00
fix python plugins after API cleanup
This commit is contained in:
parent
6880a7600f
commit
e742d5e63e
@ -176,7 +176,7 @@ class LayerRegistry(QObject):
|
||||
# only gdal raster layers
|
||||
if layer.type() != layer.RasterLayer:
|
||||
return False
|
||||
if layer.usesProvider() and layer.providerKey() != 'gdal':
|
||||
if layer.providerType() != 'gdal':
|
||||
return False
|
||||
return True
|
||||
|
||||
|
@ -34,20 +34,20 @@ current_path = os.path.dirname(__file__)
|
||||
# @param db is the selected database
|
||||
# @param mainwindow is the DBManager mainwindow
|
||||
def load(db, mainwindow):
|
||||
# check whether the selected database has topology enabled
|
||||
# (search for topology.topology)
|
||||
sql = u"""SELECT count(*)
|
||||
FROM pg_class AS cls JOIN pg_namespace AS nsp ON nsp.oid = cls.relnamespace
|
||||
WHERE cls.relname = 'topology' AND nsp.nspname = 'topology'"""
|
||||
c = db.connector._get_cursor()
|
||||
db.connector._execute( c, sql )
|
||||
res = db.connector._fetchone( c )
|
||||
if res == None or int(res[0]) <= 0:
|
||||
return
|
||||
# check whether the selected database has topology enabled
|
||||
# (search for topology.topology)
|
||||
sql = u"""SELECT count(*)
|
||||
FROM pg_class AS cls JOIN pg_namespace AS nsp ON nsp.oid = cls.relnamespace
|
||||
WHERE cls.relname = 'topology' AND nsp.nspname = 'topology'"""
|
||||
c = db.connector._get_cursor()
|
||||
db.connector._execute( c, sql )
|
||||
res = db.connector._fetchone( c )
|
||||
if res == None or int(res[0]) <= 0:
|
||||
return
|
||||
|
||||
# add the action to the DBManager menu
|
||||
action = QAction( QIcon(), "&TopoViewer", db )
|
||||
mainwindow.registerAction( action, "&Schema", run )
|
||||
# add the action to the DBManager menu
|
||||
action = QAction( QIcon(), "&TopoViewer", db )
|
||||
mainwindow.registerAction( action, "&Schema", run )
|
||||
|
||||
|
||||
# The run function is called once the user clicks on the action TopoViewer
|
||||
@ -56,146 +56,146 @@ def load(db, mainwindow):
|
||||
# @param action is the clicked action on the DBManager menu/toolbar
|
||||
# @param mainwindow is the DBManager mainwindow
|
||||
def run(item, action, mainwindow):
|
||||
db = item.database()
|
||||
uri = db.uri()
|
||||
conninfo = uri.connectionInfo()
|
||||
iface = mainwindow.iface
|
||||
db = item.database()
|
||||
uri = db.uri()
|
||||
conninfo = uri.connectionInfo()
|
||||
iface = mainwindow.iface
|
||||
|
||||
quoteId = db.connector.quoteId
|
||||
quoteStr = db.connector.quoteString
|
||||
quoteId = db.connector.quoteId
|
||||
quoteStr = db.connector.quoteString
|
||||
|
||||
# check if the selected item is a topology schema
|
||||
isTopoSchema = False
|
||||
# check if the selected item is a topology schema
|
||||
isTopoSchema = False
|
||||
|
||||
if not hasattr(item, 'schema'):
|
||||
QMessageBox.critical(mainwindow, "Invalid topology", u'Select a topology schema to continue.')
|
||||
return False
|
||||
if not hasattr(item, 'schema'):
|
||||
QMessageBox.critical(mainwindow, "Invalid topology", u'Select a topology schema to continue.')
|
||||
return False
|
||||
|
||||
if item.schema() != None:
|
||||
sql = u"SELECT count(*) FROM topology.topology WHERE name = %s" % quoteStr(item.schema().name)
|
||||
c = db.connector._get_cursor()
|
||||
db.connector._execute( c, sql )
|
||||
res = db.connector._fetchone( c )
|
||||
isTopoSchema = res != None and int(res[0]) > 0
|
||||
if item.schema() != None:
|
||||
sql = u"SELECT count(*) FROM topology.topology WHERE name = %s" % quoteStr(item.schema().name)
|
||||
c = db.connector._get_cursor()
|
||||
db.connector._execute( c, sql )
|
||||
res = db.connector._fetchone( c )
|
||||
isTopoSchema = res != None and int(res[0]) > 0
|
||||
|
||||
if not isTopoSchema:
|
||||
QMessageBox.critical(mainwindow, "Invalid topology", u'Schema "%s" is not registered in topology.topology.' % item.schema().name)
|
||||
return False
|
||||
if not isTopoSchema:
|
||||
QMessageBox.critical(mainwindow, "Invalid topology", u'Schema "%s" is not registered in topology.topology.' % item.schema().name)
|
||||
return False
|
||||
|
||||
# load layers into the current project
|
||||
toponame = item.schema().name
|
||||
template_dir = os.path.join(current_path, 'templates')
|
||||
registry = QgsMapLayerRegistry.instance()
|
||||
legend = iface.legendInterface()
|
||||
# load layers into the current project
|
||||
toponame = item.schema().name
|
||||
template_dir = os.path.join(current_path, 'templates')
|
||||
registry = QgsMapLayerRegistry.instance()
|
||||
legend = iface.legendInterface()
|
||||
|
||||
# do not refresh the canvas until all the layers are added
|
||||
prevRenderFlagState = iface.mapCanvas().renderFlag()
|
||||
iface.mapCanvas().setRenderFlag( False )
|
||||
try:
|
||||
# NOTE: -1 parent is an attempt to always add to the root, but
|
||||
# it is currently broken: http://hub.qgis.org/issues/6879
|
||||
group = legend.addGroup(u'%s topology' % toponame, False, -1)
|
||||
# do not refresh the canvas until all the layers are added
|
||||
prevRenderFlagState = iface.mapCanvas().renderFlag()
|
||||
iface.mapCanvas().setRenderFlag( False )
|
||||
try:
|
||||
# NOTE: -1 parent is an attempt to always add to the root, but
|
||||
# it is currently broken: http://hub.qgis.org/issues/6879
|
||||
group = legend.addGroup(u'%s topology' % toponame, False, -1)
|
||||
|
||||
provider = db.dbplugin().providerName()
|
||||
uri = db.uri();
|
||||
provider = db.dbplugin().providerName()
|
||||
uri = db.uri();
|
||||
|
||||
# face
|
||||
layer = db.toSqlLayer(u'SELECT face_id, topology.ST_GetFaceGeometry(%s, face_id) as geom ' \
|
||||
'FROM %s.face WHERE face_id > 0' % (quoteStr(toponame), quoteId(toponame)),
|
||||
'geom', 'face_id', u'%s.face' % toponame)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'face.qml'))
|
||||
registry.addMapLayer(layer)
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
# face
|
||||
layer = db.toSqlLayer(u'SELECT face_id, topology.ST_GetFaceGeometry(%s, face_id) as geom ' \
|
||||
'FROM %s.face WHERE face_id > 0' % (quoteStr(toponame), quoteId(toponame)),
|
||||
'geom', 'face_id', u'%s.face' % toponame)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'face.qml'))
|
||||
registry.addMapLayers([layer])
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
|
||||
# node
|
||||
uri.setDataSource(toponame, 'node', 'geom', '', 'node_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.nodes' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'node.qml'))
|
||||
registry.addMapLayer(layer)
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
# node
|
||||
uri.setDataSource(toponame, 'node', 'geom', '', 'node_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.nodes' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'node.qml'))
|
||||
registry.addMapLayers([layer])
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
|
||||
# node labels
|
||||
uri.setDataSource(toponame, 'node', 'geom', '', 'node_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.node label' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'node_label.qml'))
|
||||
registry.addMapLayer(layer)
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
# node labels
|
||||
uri.setDataSource(toponame, 'node', 'geom', '', 'node_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.node label' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'node_label.qml'))
|
||||
registry.addMapLayers([layer])
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
|
||||
# edge
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.edge' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'edge.qml'))
|
||||
registry.addMapLayer(layer)
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
# edge
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.edge' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'edge.qml'))
|
||||
registry.addMapLayers([layer])
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
|
||||
# edge labels
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.edge label' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'edge_label.qml'))
|
||||
registry.addMapLayer(layer)
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
# edge labels
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.edge label' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'edge_label.qml'))
|
||||
registry.addMapLayers([layer])
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
|
||||
# face_left
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.face_left' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'face_left.qml'))
|
||||
registry.addMapLayer(layer)
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
# face_left
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.face_left' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'face_left.qml'))
|
||||
registry.addMapLayers([layer])
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
|
||||
# face_right
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.face_right' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'face_right.qml'))
|
||||
registry.addMapLayer(layer)
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
# face_right
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.face_right' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'face_right.qml'))
|
||||
registry.addMapLayers([layer])
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
|
||||
# next_left
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.next_left' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'next_left.qml'))
|
||||
registry.addMapLayer(layer)
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
# next_left
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.next_left' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'next_left.qml'))
|
||||
registry.addMapLayers([layer])
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
|
||||
# next_right
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.next_right' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'next_right.qml'))
|
||||
registry.addMapLayer(layer)
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
# next_right
|
||||
uri.setDataSource(toponame, 'edge_data', 'geom', '', 'edge_id')
|
||||
layer = QgsVectorLayer(uri.uri(), u'%s.next_right' % toponame, provider)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'next_right.qml'))
|
||||
registry.addMapLayers([layer])
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
|
||||
# face_seed
|
||||
layer = db.toSqlLayer(u'SELECT face_id, ST_PointOnSurface(topology.ST_GetFaceGeometry(%s, face_id)) as geom ' \
|
||||
'FROM %s.face WHERE face_id > 0' % (quoteStr(toponame), quoteId(toponame)),
|
||||
'geom', 'face_id', u'%s.face_seed' % toponame)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'face_seed.qml'))
|
||||
registry.addMapLayer(layer)
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
# face_seed
|
||||
layer = db.toSqlLayer(u'SELECT face_id, ST_PointOnSurface(topology.ST_GetFaceGeometry(%s, face_id)) as geom ' \
|
||||
'FROM %s.face WHERE face_id > 0' % (quoteStr(toponame), quoteId(toponame)),
|
||||
'geom', 'face_id', u'%s.face_seed' % toponame)
|
||||
layer.loadNamedStyle(os.path.join(template_dir, 'face_seed.qml'))
|
||||
registry.addMapLayers([layer])
|
||||
legend.setLayerVisible(layer, False)
|
||||
legend.setLayerExpanded(layer, False)
|
||||
legend.moveLayer(layer, group)
|
||||
|
||||
# TODO: add polygon0, polygon1 and polygon2 ?
|
||||
# TODO: add polygon0, polygon1 and polygon2 ?
|
||||
|
||||
finally:
|
||||
# restore canvas render flag
|
||||
iface.mapCanvas().setRenderFlag( prevRenderFlagState )
|
||||
finally:
|
||||
# restore canvas render flag
|
||||
iface.mapCanvas().setRenderFlag( prevRenderFlagState )
|
||||
|
||||
return True
|
||||
return True
|
||||
|
||||
|
@ -29,121 +29,121 @@ from .db_model import DBModel
|
||||
from .db_plugins.plugin import DBPlugin, Schema, Table
|
||||
|
||||
class DBTree(QTreeView):
|
||||
def __init__(self, mainWindow):
|
||||
QTreeView.__init__(self, mainWindow)
|
||||
self.mainWindow = mainWindow
|
||||
def __init__(self, mainWindow):
|
||||
QTreeView.__init__(self, mainWindow)
|
||||
self.mainWindow = mainWindow
|
||||
|
||||
self.setModel( DBModel(self) )
|
||||
self.setHeaderHidden(True)
|
||||
self.setEditTriggers(QTreeView.EditKeyPressed|QTreeView.SelectedClicked)
|
||||
self.setModel( DBModel(self) )
|
||||
self.setHeaderHidden(True)
|
||||
self.setEditTriggers(QTreeView.EditKeyPressed|QTreeView.SelectedClicked)
|
||||
|
||||
self.setDragEnabled(True)
|
||||
self.setAcceptDrops(True)
|
||||
self.setDropIndicatorShown(True)
|
||||
self.setDragEnabled(True)
|
||||
self.setAcceptDrops(True)
|
||||
self.setDropIndicatorShown(True)
|
||||
|
||||
self.connect(self.selectionModel(), SIGNAL("currentChanged(const QModelIndex&, const QModelIndex&)"), self.currentItemChanged)
|
||||
self.connect(self, SIGNAL("expanded(const QModelIndex&)"), self.itemChanged)
|
||||
self.connect(self, SIGNAL("collapsed(const QModelIndex&)"), self.itemChanged)
|
||||
self.connect(self.model(), SIGNAL("dataChanged(const QModelIndex&, const QModelIndex&)"), self.modelDataChanged)
|
||||
self.connect(self.model(), SIGNAL("notPopulated"), self.collapse)
|
||||
self.connect(self.selectionModel(), SIGNAL("currentChanged(const QModelIndex&, const QModelIndex&)"), self.currentItemChanged)
|
||||
self.connect(self, SIGNAL("expanded(const QModelIndex&)"), self.itemChanged)
|
||||
self.connect(self, SIGNAL("collapsed(const QModelIndex&)"), self.itemChanged)
|
||||
self.connect(self.model(), SIGNAL("dataChanged(const QModelIndex&, const QModelIndex&)"), self.modelDataChanged)
|
||||
self.connect(self.model(), SIGNAL("notPopulated"), self.collapse)
|
||||
|
||||
def refreshItem(self, item=None):
|
||||
if item == None:
|
||||
item = self.currentItem()
|
||||
if item == None: return
|
||||
self.model().refreshItem(item)
|
||||
def refreshItem(self, item=None):
|
||||
if item == None:
|
||||
item = self.currentItem()
|
||||
if item == None: return
|
||||
self.model().refreshItem(item)
|
||||
|
||||
def showSystemTables(self, show):
|
||||
pass
|
||||
def showSystemTables(self, show):
|
||||
pass
|
||||
|
||||
def currentItem(self):
|
||||
indexes = self.selectedIndexes()
|
||||
if len(indexes) <= 0:
|
||||
return
|
||||
return self.model().getItem(indexes[0])
|
||||
def currentItem(self):
|
||||
indexes = self.selectedIndexes()
|
||||
if len(indexes) <= 0:
|
||||
return
|
||||
return self.model().getItem(indexes[0])
|
||||
|
||||
|
||||
def currentDatabase(self):
|
||||
item = self.currentItem()
|
||||
if item == None: return
|
||||
def currentDatabase(self):
|
||||
item = self.currentItem()
|
||||
if item == None: return
|
||||
|
||||
if isinstance(item, (DBPlugin, Schema, Table)):
|
||||
return item.database()
|
||||
return None
|
||||
if isinstance(item, (DBPlugin, Schema, Table)):
|
||||
return item.database()
|
||||
return None
|
||||
|
||||
def currentSchema(self):
|
||||
item = self.currentItem()
|
||||
if item == None: return
|
||||
def currentSchema(self):
|
||||
item = self.currentItem()
|
||||
if item == None: return
|
||||
|
||||
if isinstance(item, (Schema, Table)):
|
||||
return item.schema()
|
||||
return None
|
||||
if isinstance(item, (Schema, Table)):
|
||||
return item.schema()
|
||||
return None
|
||||
|
||||
def currentTable(self):
|
||||
item = self.currentItem()
|
||||
if item == None: return
|
||||
def currentTable(self):
|
||||
item = self.currentItem()
|
||||
if item == None: return
|
||||
|
||||
if isinstance(item, Table):
|
||||
return item
|
||||
return None
|
||||
if isinstance(item, Table):
|
||||
return item
|
||||
return None
|
||||
|
||||
|
||||
def itemChanged(self, index):
|
||||
self.setCurrentIndex(index)
|
||||
self.emit( SIGNAL('selectedItemChanged'), self.currentItem() )
|
||||
def itemChanged(self, index):
|
||||
self.setCurrentIndex(index)
|
||||
self.emit( SIGNAL('selectedItemChanged'), self.currentItem() )
|
||||
|
||||
def modelDataChanged(self, indexFrom, indexTo):
|
||||
self.itemChanged(indexTo)
|
||||
def modelDataChanged(self, indexFrom, indexTo):
|
||||
self.itemChanged(indexTo)
|
||||
|
||||
def currentItemChanged(self, current, previous):
|
||||
self.itemChanged(current)
|
||||
def currentItemChanged(self, current, previous):
|
||||
self.itemChanged(current)
|
||||
|
||||
def contextMenuEvent(self, ev):
|
||||
index = self.indexAt( ev.pos() )
|
||||
if not index.isValid():
|
||||
return
|
||||
def contextMenuEvent(self, ev):
|
||||
index = self.indexAt( ev.pos() )
|
||||
if not index.isValid():
|
||||
return
|
||||
|
||||
if index != self.currentIndex():
|
||||
self.itemChanged(index)
|
||||
if index != self.currentIndex():
|
||||
self.itemChanged(index)
|
||||
|
||||
item = self.currentItem()
|
||||
item = self.currentItem()
|
||||
|
||||
menu = QMenu(self)
|
||||
menu = QMenu(self)
|
||||
|
||||
if isinstance(item, (Table, Schema)):
|
||||
menu.addAction("Rename", self.rename)
|
||||
menu.addAction("Delete", self.delete)
|
||||
if isinstance(item, (Table, Schema)):
|
||||
menu.addAction("Rename", self.rename)
|
||||
menu.addAction("Delete", self.delete)
|
||||
|
||||
if isinstance(item, Table):
|
||||
menu.addSeparator()
|
||||
menu.addAction("Add to QGis canvas", self.addLayer)
|
||||
if isinstance(item, Table):
|
||||
menu.addSeparator()
|
||||
menu.addAction("Add to QGis canvas", self.addLayer)
|
||||
|
||||
elif isinstance(item, DBPlugin) and item.database() is not None:
|
||||
menu.addAction("Re-connect", self.reconnect)
|
||||
elif isinstance(item, DBPlugin) and item.database() is not None:
|
||||
menu.addAction("Re-connect", self.reconnect)
|
||||
|
||||
if not menu.isEmpty():
|
||||
menu.exec_(ev.globalPos())
|
||||
if not menu.isEmpty():
|
||||
menu.exec_(ev.globalPos())
|
||||
|
||||
menu.deleteLater()
|
||||
menu.deleteLater()
|
||||
|
||||
def rename(self):
|
||||
index = self.currentIndex()
|
||||
item = self.model().getItem(index)
|
||||
if isinstance(item, (Table, Schema)):
|
||||
self.edit( index )
|
||||
def rename(self):
|
||||
index = self.currentIndex()
|
||||
item = self.model().getItem(index)
|
||||
if isinstance(item, (Table, Schema)):
|
||||
self.edit( index )
|
||||
|
||||
def delete(self):
|
||||
item = self.currentItem()
|
||||
if isinstance(item, (Table, Schema)):
|
||||
self.mainWindow.invokeCallback(item.database().deleteActionSlot)
|
||||
def delete(self):
|
||||
item = self.currentItem()
|
||||
if isinstance(item, (Table, Schema)):
|
||||
self.mainWindow.invokeCallback(item.database().deleteActionSlot)
|
||||
|
||||
def addLayer(self):
|
||||
table = self.currentTable()
|
||||
if table is not None:
|
||||
QgsMapLayerRegistry.instance().addMapLayer(table.toMapLayer())
|
||||
def addLayer(self):
|
||||
table = self.currentTable()
|
||||
if table is not None:
|
||||
QgsMapLayerRegistry.instance().addMapLayers([table.toMapLayer()])
|
||||
|
||||
def reconnect(self):
|
||||
db = self.currentDatabase()
|
||||
if db is not None:
|
||||
self.mainWindow.invokeCallback(db.reconnectActionSlot)
|
||||
def reconnect(self):
|
||||
db = self.currentDatabase()
|
||||
if db is not None:
|
||||
self.mainWindow.invokeCallback(db.reconnectActionSlot)
|
||||
|
||||
|
@ -35,193 +35,193 @@ from .completer import SqlCompleter
|
||||
|
||||
class DlgSqlWindow(QDialog, Ui_Dialog):
|
||||
|
||||
def __init__(self, iface, db, parent=None):
|
||||
QDialog.__init__(self, parent)
|
||||
self.iface = iface
|
||||
self.db = db
|
||||
self.setupUi(self)
|
||||
self.setWindowTitle( u"%s - %s [%s]" % (self.windowTitle(), db.connection().connectionName(), db.connection().typeNameString()) )
|
||||
def __init__(self, iface, db, parent=None):
|
||||
QDialog.__init__(self, parent)
|
||||
self.iface = iface
|
||||
self.db = db
|
||||
self.setupUi(self)
|
||||
self.setWindowTitle( u"%s - %s [%s]" % (self.windowTitle(), db.connection().connectionName(), db.connection().typeNameString()) )
|
||||
|
||||
self.defaultLayerName = 'QueryLayer'
|
||||
self.defaultLayerName = 'QueryLayer'
|
||||
|
||||
settings = QSettings()
|
||||
self.restoreGeometry(settings.value("/DB_Manager/sqlWindow/geometry").toByteArray())
|
||||
settings = QSettings()
|
||||
self.restoreGeometry(settings.value("/DB_Manager/sqlWindow/geometry").toByteArray())
|
||||
|
||||
self.editSql.setAcceptRichText(False)
|
||||
SqlCompleter(self.editSql, self.db)
|
||||
SqlHighlighter(self.editSql, self.db)
|
||||
self.editSql.setAcceptRichText(False)
|
||||
SqlCompleter(self.editSql, self.db)
|
||||
SqlHighlighter(self.editSql, self.db)
|
||||
|
||||
# allow to copy results
|
||||
copyAction = QAction("copy", self)
|
||||
self.viewResult.addAction( copyAction )
|
||||
copyAction.setShortcuts(QKeySequence.Copy)
|
||||
QObject.connect(copyAction, SIGNAL("triggered()"), self.copySelectedResults)
|
||||
# allow to copy results
|
||||
copyAction = QAction("copy", self)
|
||||
self.viewResult.addAction( copyAction )
|
||||
copyAction.setShortcuts(QKeySequence.Copy)
|
||||
QObject.connect(copyAction, SIGNAL("triggered()"), self.copySelectedResults)
|
||||
|
||||
self.connect(self.btnExecute, SIGNAL("clicked()"), self.executeSql)
|
||||
self.connect(self.btnClear, SIGNAL("clicked()"), self.clearSql)
|
||||
self.connect(self.buttonBox.button(QDialogButtonBox.Close), SIGNAL("clicked()"), self.close)
|
||||
self.connect(self.btnExecute, SIGNAL("clicked()"), self.executeSql)
|
||||
self.connect(self.btnClear, SIGNAL("clicked()"), self.clearSql)
|
||||
self.connect(self.buttonBox.button(QDialogButtonBox.Close), SIGNAL("clicked()"), self.close)
|
||||
|
||||
# hide the load query as layer if feature is not supported
|
||||
self._loadAsLayerAvailable = self.db.connector.hasCustomQuerySupport()
|
||||
self.loadAsLayerGroup.setVisible( self._loadAsLayerAvailable )
|
||||
if self._loadAsLayerAvailable:
|
||||
self.layerTypeWidget.hide() # show if load as raster is supported
|
||||
self.connect(self.loadLayerBtn, SIGNAL("clicked()"), self.loadSqlLayer)
|
||||
self.connect(self.getColumnsBtn, SIGNAL("clicked()"), self.fillColumnCombos)
|
||||
self.connect(self.loadAsLayerGroup, SIGNAL("toggled(bool)"), self.loadAsLayerToggled)
|
||||
self.loadAsLayerToggled(False)
|
||||
# hide the load query as layer if feature is not supported
|
||||
self._loadAsLayerAvailable = self.db.connector.hasCustomQuerySupport()
|
||||
self.loadAsLayerGroup.setVisible( self._loadAsLayerAvailable )
|
||||
if self._loadAsLayerAvailable:
|
||||
self.layerTypeWidget.hide() # show if load as raster is supported
|
||||
self.connect(self.loadLayerBtn, SIGNAL("clicked()"), self.loadSqlLayer)
|
||||
self.connect(self.getColumnsBtn, SIGNAL("clicked()"), self.fillColumnCombos)
|
||||
self.connect(self.loadAsLayerGroup, SIGNAL("toggled(bool)"), self.loadAsLayerToggled)
|
||||
self.loadAsLayerToggled(False)
|
||||
|
||||
|
||||
def closeEvent(self, e):
|
||||
""" save window state """
|
||||
settings = QSettings()
|
||||
settings.setValue("/DB_Manager/sqlWindow/geometry", QVariant(self.saveGeometry()))
|
||||
def closeEvent(self, e):
|
||||
""" save window state """
|
||||
settings = QSettings()
|
||||
settings.setValue("/DB_Manager/sqlWindow/geometry", QVariant(self.saveGeometry()))
|
||||
|
||||
QDialog.closeEvent(self, e)
|
||||
QDialog.closeEvent(self, e)
|
||||
|
||||
def loadAsLayerToggled(self, checked):
|
||||
self.loadAsLayerGroup.setChecked( checked )
|
||||
self.loadAsLayerWidget.setVisible( checked )
|
||||
def loadAsLayerToggled(self, checked):
|
||||
self.loadAsLayerGroup.setChecked( checked )
|
||||
self.loadAsLayerWidget.setVisible( checked )
|
||||
|
||||
def getSql(self):
|
||||
# If the selection obtained from an editor spans a line break,
|
||||
# the text will contain a Unicode U+2029 paragraph separator
|
||||
# character instead of a newline \n character
|
||||
# (see https://qt-project.org/doc/qt-4.8/qtextcursor.html#selectedText)
|
||||
sql = self.editSql.textCursor().selectedText().replace(unichr(0x2029), "\n")
|
||||
if sql.isEmpty():
|
||||
sql = self.editSql.toPlainText()
|
||||
# try to sanitize query
|
||||
sql = sql.replace( QRegExp( ";\\s*$" ), "" )
|
||||
return sql
|
||||
def getSql(self):
|
||||
# If the selection obtained from an editor spans a line break,
|
||||
# the text will contain a Unicode U+2029 paragraph separator
|
||||
# character instead of a newline \n character
|
||||
# (see https://qt-project.org/doc/qt-4.8/qtextcursor.html#selectedText)
|
||||
sql = self.editSql.textCursor().selectedText().replace(unichr(0x2029), "\n")
|
||||
if sql.isEmpty():
|
||||
sql = self.editSql.toPlainText()
|
||||
# try to sanitize query
|
||||
sql = sql.replace( QRegExp( ";\\s*$" ), "" )
|
||||
return sql
|
||||
|
||||
def clearSql(self):
|
||||
self.editSql.clear()
|
||||
def clearSql(self):
|
||||
self.editSql.clear()
|
||||
|
||||
def executeSql(self):
|
||||
sql = self.getSql()
|
||||
if sql.isEmpty(): return
|
||||
def executeSql(self):
|
||||
sql = self.getSql()
|
||||
if sql.isEmpty(): return
|
||||
|
||||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
||||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
||||
|
||||
# delete the old model
|
||||
old_model = self.viewResult.model()
|
||||
self.viewResult.setModel(None)
|
||||
if old_model: old_model.deleteLater()
|
||||
# delete the old model
|
||||
old_model = self.viewResult.model()
|
||||
self.viewResult.setModel(None)
|
||||
if old_model: old_model.deleteLater()
|
||||
|
||||
self.uniqueCombo.clear()
|
||||
self.geomCombo.clear()
|
||||
self.uniqueCombo.clear()
|
||||
self.geomCombo.clear()
|
||||
|
||||
try:
|
||||
# set the new model
|
||||
model = self.db.sqlResultModel( sql, self )
|
||||
self.viewResult.setModel( model )
|
||||
self.lblResult.setText("%d rows, %.1f seconds" % (model.affectedRows(), model.secs()))
|
||||
try:
|
||||
# set the new model
|
||||
model = self.db.sqlResultModel( sql, self )
|
||||
self.viewResult.setModel( model )
|
||||
self.lblResult.setText("%d rows, %.1f seconds" % (model.affectedRows(), model.secs()))
|
||||
|
||||
except BaseError, e:
|
||||
QApplication.restoreOverrideCursor()
|
||||
DlgDbError.showError(e, self)
|
||||
return
|
||||
except BaseError, e:
|
||||
QApplication.restoreOverrideCursor()
|
||||
DlgDbError.showError(e, self)
|
||||
return
|
||||
|
||||
cols = self.viewResult.model().columnNames()
|
||||
cols.sort()
|
||||
self.uniqueCombo.addItems( cols )
|
||||
self.geomCombo.addItems( cols )
|
||||
cols = self.viewResult.model().columnNames()
|
||||
cols.sort()
|
||||
self.uniqueCombo.addItems( cols )
|
||||
self.geomCombo.addItems( cols )
|
||||
|
||||
self.update()
|
||||
QApplication.restoreOverrideCursor()
|
||||
self.update()
|
||||
QApplication.restoreOverrideCursor()
|
||||
|
||||
def loadSqlLayer(self):
|
||||
uniqueFieldName = self.uniqueCombo.currentText()
|
||||
geomFieldName = self.geomCombo.currentText()
|
||||
def loadSqlLayer(self):
|
||||
uniqueFieldName = self.uniqueCombo.currentText()
|
||||
geomFieldName = self.geomCombo.currentText()
|
||||
|
||||
if geomFieldName.isEmpty() or uniqueFieldName.isEmpty():
|
||||
QMessageBox.warning(self, self.tr( "Sorry" ), self.tr( "You must fill the required fields: \ngeometry column - column with unique integer values" ) )
|
||||
return
|
||||
if geomFieldName.isEmpty() or uniqueFieldName.isEmpty():
|
||||
QMessageBox.warning(self, self.tr( "Sorry" ), self.tr( "You must fill the required fields: \ngeometry column - column with unique integer values" ) )
|
||||
return
|
||||
|
||||
query = self.getSql()
|
||||
if query.isEmpty():
|
||||
return
|
||||
query = self.getSql()
|
||||
if query.isEmpty():
|
||||
return
|
||||
|
||||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
||||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
||||
|
||||
from qgis.core import QgsMapLayer, QgsMapLayerRegistry
|
||||
layerType = QgsMapLayer.VectorLayer if self.vectorRadio.isChecked() else QgsMapLayer.RasterLayer
|
||||
from qgis.core import QgsMapLayer, QgsMapLayerRegistry
|
||||
layerType = QgsMapLayer.VectorLayer if self.vectorRadio.isChecked() else QgsMapLayer.RasterLayer
|
||||
|
||||
# get a new layer name
|
||||
names = []
|
||||
for layer in QgsMapLayerRegistry.instance().mapLayers().values():
|
||||
names.append( layer.name() )
|
||||
# get a new layer name
|
||||
names = []
|
||||
for layer in QgsMapLayerRegistry.instance().mapLayers().values():
|
||||
names.append( layer.name() )
|
||||
|
||||
layerName = self.layerNameEdit.text()
|
||||
if layerName.isEmpty():
|
||||
layerName = self.defaultLayerName
|
||||
newLayerName = layerName
|
||||
index = 1
|
||||
while newLayerName in names:
|
||||
index += 1
|
||||
newLayerName = u"%s_%d" % (layerName, index)
|
||||
layerName = self.layerNameEdit.text()
|
||||
if layerName.isEmpty():
|
||||
layerName = self.defaultLayerName
|
||||
newLayerName = layerName
|
||||
index = 1
|
||||
while newLayerName in names:
|
||||
index += 1
|
||||
newLayerName = u"%s_%d" % (layerName, index)
|
||||
|
||||
# create the layer
|
||||
layer = self.db.toSqlLayer(query, geomFieldName, uniqueFieldName, newLayerName, layerType, self.avoidSelectById.isChecked())
|
||||
if layer.isValid():
|
||||
QgsMapLayerRegistry.instance().addMapLayer(layer, True)
|
||||
# create the layer
|
||||
layer = self.db.toSqlLayer(query, geomFieldName, uniqueFieldName, newLayerName, layerType, self.avoidSelectById.isChecked())
|
||||
if layer.isValid():
|
||||
QgsMapLayerRegistry.instance().addMapLayers([layer], True)
|
||||
|
||||
QApplication.restoreOverrideCursor()
|
||||
QApplication.restoreOverrideCursor()
|
||||
|
||||
def fillColumnCombos(self):
|
||||
query = self.getSql()
|
||||
if query.isEmpty(): return
|
||||
def fillColumnCombos(self):
|
||||
query = self.getSql()
|
||||
if query.isEmpty(): return
|
||||
|
||||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
||||
self.uniqueCombo.clear()
|
||||
self.geomCombo.clear()
|
||||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
||||
self.uniqueCombo.clear()
|
||||
self.geomCombo.clear()
|
||||
|
||||
# get a new alias
|
||||
aliasIndex = 0
|
||||
while True:
|
||||
alias = "_%s__%d" % ("subQuery", aliasIndex)
|
||||
escaped = '\\b("?)' + QRegExp.escape(alias) + '\\1\\b'
|
||||
if not query.contains( QRegExp(escaped, Qt.CaseInsensitive) ):
|
||||
break
|
||||
aliasIndex += 1
|
||||
# get a new alias
|
||||
aliasIndex = 0
|
||||
while True:
|
||||
alias = "_%s__%d" % ("subQuery", aliasIndex)
|
||||
escaped = '\\b("?)' + QRegExp.escape(alias) + '\\1\\b'
|
||||
if not query.contains( QRegExp(escaped, Qt.CaseInsensitive) ):
|
||||
break
|
||||
aliasIndex += 1
|
||||
|
||||
# get all the columns
|
||||
cols = []
|
||||
connector = self.db.connector
|
||||
sql = u"SELECT * FROM (%s\n) AS %s LIMIT 0" % ( unicode(query), connector.quoteId(alias) )
|
||||
# get all the columns
|
||||
cols = []
|
||||
connector = self.db.connector
|
||||
sql = u"SELECT * FROM (%s\n) AS %s LIMIT 0" % ( unicode(query), connector.quoteId(alias) )
|
||||
|
||||
c = None
|
||||
try:
|
||||
c = connector._execute(None, sql)
|
||||
cols = connector._get_cursor_columns(c)
|
||||
c = None
|
||||
try:
|
||||
c = connector._execute(None, sql)
|
||||
cols = connector._get_cursor_columns(c)
|
||||
|
||||
except BaseError as e:
|
||||
QApplication.restoreOverrideCursor()
|
||||
DlgDbError.showError(e, self)
|
||||
return
|
||||
except BaseError as e:
|
||||
QApplication.restoreOverrideCursor()
|
||||
DlgDbError.showError(e, self)
|
||||
return
|
||||
|
||||
finally:
|
||||
if c:
|
||||
c.close()
|
||||
del c
|
||||
finally:
|
||||
if c:
|
||||
c.close()
|
||||
del c
|
||||
|
||||
cols.sort()
|
||||
self.uniqueCombo.addItems( cols )
|
||||
self.geomCombo.addItems( cols )
|
||||
cols.sort()
|
||||
self.uniqueCombo.addItems( cols )
|
||||
self.geomCombo.addItems( cols )
|
||||
|
||||
QApplication.restoreOverrideCursor()
|
||||
QApplication.restoreOverrideCursor()
|
||||
|
||||
def copySelectedResults(self):
|
||||
if len(self.viewResult.selectedIndexes()) <= 0:
|
||||
return
|
||||
model = self.viewResult.model()
|
||||
def copySelectedResults(self):
|
||||
if len(self.viewResult.selectedIndexes()) <= 0:
|
||||
return
|
||||
model = self.viewResult.model()
|
||||
|
||||
# convert to string using tab as separator
|
||||
text = model.headerToString( "\t" )
|
||||
for idx in self.viewResult.selectionModel().selectedRows():
|
||||
text += "\n" + model.rowToString( idx.row(), "\t" )
|
||||
# convert to string using tab as separator
|
||||
text = model.headerToString( "\t" )
|
||||
for idx in self.viewResult.selectionModel().selectedRows():
|
||||
text += "\n" + model.rowToString( idx.row(), "\t" )
|
||||
|
||||
QApplication.clipboard().setText( text, QClipboard.Selection )
|
||||
QApplication.clipboard().setText( text, QClipboard.Clipboard )
|
||||
QApplication.clipboard().setText( text, QClipboard.Selection )
|
||||
QApplication.clipboard().setText( text, QClipboard.Clipboard )
|
||||
|
||||
|
@ -29,92 +29,92 @@ from qgis.core import QgsVectorLayer, QgsMapLayerRegistry
|
||||
from .db_plugins.plugin import DbError, Table
|
||||
|
||||
class LayerPreview(QgsMapCanvas):
|
||||
def __init__(self, parent=None):
|
||||
QgsMapCanvas.__init__(self, parent)
|
||||
self.setCanvasColor(QColor(255,255,255))
|
||||
def __init__(self, parent=None):
|
||||
QgsMapCanvas.__init__(self, parent)
|
||||
self.setCanvasColor(QColor(255,255,255))
|
||||
|
||||
self.item = None
|
||||
self.dirty = False
|
||||
self.item = None
|
||||
self.dirty = False
|
||||
|
||||
# reuse settings from QGIS
|
||||
settings = QSettings()
|
||||
self.enableAntiAliasing( settings.value( "/qgis/enable_anti_aliasing", QVariant(False) ).toBool() )
|
||||
self.useImageToRender( settings.value( "/qgis/use_qimage_to_render", QVariant(False) ).toBool() )
|
||||
action = settings.value( "/qgis/wheel_action", QVariant(0) ).toInt()[0]
|
||||
zoomFactor = settings.value( "/qgis/zoom_factor", QVariant(2) ).toDouble()[0]
|
||||
self.setWheelAction( QgsMapCanvas.WheelAction(action), zoomFactor )
|
||||
# reuse settings from QGIS
|
||||
settings = QSettings()
|
||||
self.enableAntiAliasing( settings.value( "/qgis/enable_anti_aliasing", QVariant(False) ).toBool() )
|
||||
self.useImageToRender( settings.value( "/qgis/use_qimage_to_render", QVariant(False) ).toBool() )
|
||||
action = settings.value( "/qgis/wheel_action", QVariant(0) ).toInt()[0]
|
||||
zoomFactor = settings.value( "/qgis/zoom_factor", QVariant(2) ).toDouble()[0]
|
||||
self.setWheelAction( QgsMapCanvas.WheelAction(action), zoomFactor )
|
||||
|
||||
self._clear()
|
||||
self._clear()
|
||||
|
||||
|
||||
def refresh(self):
|
||||
self.setDirty(True)
|
||||
self.loadPreview( self.item )
|
||||
def refresh(self):
|
||||
self.setDirty(True)
|
||||
self.loadPreview( self.item )
|
||||
|
||||
def loadPreview(self, item, force=False):
|
||||
if item == self.item and not self.dirty:
|
||||
return
|
||||
self._clear()
|
||||
if item is None:
|
||||
return
|
||||
def loadPreview(self, item, force=False):
|
||||
if item == self.item and not self.dirty:
|
||||
return
|
||||
self._clear()
|
||||
if item is None:
|
||||
return
|
||||
|
||||
if isinstance(item, Table) and item.type in [Table.VectorType, Table.RasterType]:
|
||||
# update the preview, but first let the manager chance to show the canvas
|
||||
runPrev = lambda: self._loadTablePreview( item )
|
||||
QTimer.singleShot(50, runPrev)
|
||||
else:
|
||||
return
|
||||
if isinstance(item, Table) and item.type in [Table.VectorType, Table.RasterType]:
|
||||
# update the preview, but first let the manager chance to show the canvas
|
||||
runPrev = lambda: self._loadTablePreview( item )
|
||||
QTimer.singleShot(50, runPrev)
|
||||
else:
|
||||
return
|
||||
|
||||
self.item = item
|
||||
self.connect(self.item, SIGNAL('aboutToChange'), self.setDirty)
|
||||
self.item = item
|
||||
self.connect(self.item, SIGNAL('aboutToChange'), self.setDirty)
|
||||
|
||||
def setDirty(self, val=True):
|
||||
self.dirty = val
|
||||
def setDirty(self, val=True):
|
||||
self.dirty = val
|
||||
|
||||
def _clear(self):
|
||||
""" remove any layers from preview canvas """
|
||||
if self.item is not None:
|
||||
self.disconnect(self.item, SIGNAL('aboutToChange'), self.setDirty)
|
||||
self.item = None
|
||||
self.dirty = False
|
||||
def _clear(self):
|
||||
""" remove any layers from preview canvas """
|
||||
if self.item is not None:
|
||||
self.disconnect(self.item, SIGNAL('aboutToChange'), self.setDirty)
|
||||
self.item = None
|
||||
self.dirty = False
|
||||
|
||||
self.currentLayerId = None
|
||||
self.setLayerSet( [] )
|
||||
self.currentLayerId = None
|
||||
self.setLayerSet( [] )
|
||||
|
||||
def _loadTablePreview(self, table, limit=False):
|
||||
""" if has geometry column load to map canvas """
|
||||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
||||
self.setRenderFlag(False)
|
||||
newLayerId = None
|
||||
def _loadTablePreview(self, table, limit=False):
|
||||
""" if has geometry column load to map canvas """
|
||||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
||||
self.setRenderFlag(False)
|
||||
newLayerId = None
|
||||
|
||||
if table.geomType:
|
||||
# limit the query result if required
|
||||
if limit and table.rowCount > 1000:
|
||||
uniqueField = table.getValidQGisUniqueFields(True)
|
||||
if uniqueField == None:
|
||||
QMessageBox.warning(self, "Sorry", "Unable to find a valid unique field")
|
||||
return
|
||||
if table.geomType:
|
||||
# limit the query result if required
|
||||
if limit and table.rowCount > 1000:
|
||||
uniqueField = table.getValidQGisUniqueFields(True)
|
||||
if uniqueField == None:
|
||||
QMessageBox.warning(self, "Sorry", "Unable to find a valid unique field")
|
||||
return
|
||||
|
||||
uri = table.database().uri()
|
||||
uri.setDataSource("", u"(SELECT * FROM %s LIMIT 1000)" % table.quotedName(), table.geomColumn, "", uniqueField.name)
|
||||
provider = table.database().dbplugin().providerName()
|
||||
vl = QgsVectorLayer(uri.uri(), table.name, provider)
|
||||
else:
|
||||
vl = table.toMapLayer()
|
||||
uri = table.database().uri()
|
||||
uri.setDataSource("", u"(SELECT * FROM %s LIMIT 1000)" % table.quotedName(), table.geomColumn, "", uniqueField.name)
|
||||
provider = table.database().dbplugin().providerName()
|
||||
vl = QgsVectorLayer(uri.uri(), table.name, provider)
|
||||
else:
|
||||
vl = table.toMapLayer()
|
||||
|
||||
if not vl.isValid():
|
||||
self.setLayerSet( [] )
|
||||
else:
|
||||
newLayerId = vl.id() if hasattr(vl, 'id') else vl.getLayerID()
|
||||
self.setLayerSet( [ QgsMapCanvasLayer(vl) ] )
|
||||
QgsMapLayerRegistry.instance().addMapLayer(vl, False)
|
||||
self.zoomToFullExtent()
|
||||
if not vl.isValid():
|
||||
self.setLayerSet( [] )
|
||||
else:
|
||||
newLayerId = vl.id() if hasattr(vl, 'id') else vl.getLayerID()
|
||||
self.setLayerSet( [ QgsMapCanvasLayer(vl) ] )
|
||||
QgsMapLayerRegistry.instance().addMapLayers([vl], False)
|
||||
self.zoomToFullExtent()
|
||||
|
||||
# remove old layer (if any) and set new
|
||||
if self.currentLayerId:
|
||||
QgsMapLayerRegistry.instance().removeMapLayer(self.currentLayerId, False)
|
||||
self.currentLayerId = newLayerId
|
||||
# remove old layer (if any) and set new
|
||||
if self.currentLayerId:
|
||||
QgsMapLayerRegistry.instance().removeMapLayer(self.currentLayerId, False)
|
||||
self.currentLayerId = newLayerId
|
||||
|
||||
self.setRenderFlag(True)
|
||||
QApplication.restoreOverrideCursor()
|
||||
self.setRenderFlag(True)
|
||||
QApplication.restoreOverrideCursor()
|
||||
|
||||
|
@ -98,7 +98,7 @@ class Dialog(QDialog, Ui_Dialog):
|
||||
addToTOC = QMessageBox.question(self, self.tr("Coordinate statistics"), self.tr("Created output point shapefile:\n%1\n\nWould you like to add the new layer to the TOC?").arg( outPath ), QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton)
|
||||
if addToTOC == QMessageBox.Yes:
|
||||
vlayer = QgsVectorLayer(outPath, unicode(outName), "ogr")
|
||||
QgsMapLayerRegistry.instance().addMapLayer(vlayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayers([vlayer])
|
||||
self.populateLayers()
|
||||
self.progressBar.setValue(0)
|
||||
self.buttonOk.setEnabled( True )
|
||||
|
@ -120,7 +120,7 @@ class Dialog(QDialog, Ui_Dialog):
|
||||
fileInfo = QFileInfo( self.outShape.text() )
|
||||
layerName = fileInfo.completeBaseName()
|
||||
layer = QgsVectorLayer(self.outShape.text(), layerName, "ogr")
|
||||
QgsMapLayerRegistry.instance().addMapLayer(layer)
|
||||
QgsMapLayerRegistry.instance().addMapLayers([layer])
|
||||
self.populateLayers()
|
||||
|
||||
self.restoreGui()
|
||||
|
@ -128,7 +128,7 @@ class Dialog(QDialog, Ui_Dialog):
|
||||
self.tr("Created output point shapefile:\n%1\n\nWould you like to add the new layer to the TOC?").arg(outPath), QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton)
|
||||
if addToTOC == QMessageBox.Yes:
|
||||
self.vlayer = QgsVectorLayer(outPath, unicode(outName), "ogr")
|
||||
QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayer([self.vlayer])
|
||||
self.populateLayers()
|
||||
self.progressBar.setValue(0)
|
||||
self.buttonOk.setEnabled( True )
|
||||
|
@ -92,7 +92,7 @@ class Dialog(QDialog, Ui_Dialog):
|
||||
addToTOC = QMessageBox.question(self, self.tr("Generate Regular Points"), self.tr("Created output point shapefile:\n%1\n\nWould you like to add the new layer to the TOC?").arg( outPath ), QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton)
|
||||
if addToTOC == QMessageBox.Yes:
|
||||
self.vlayer = QgsVectorLayer(outPath, unicode(outName), "ogr")
|
||||
QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayer([self.vlayer])
|
||||
self.populateLayers()
|
||||
self.progressBar.setValue(0)
|
||||
self.buttonOk.setEnabled( True )
|
||||
|
@ -109,7 +109,7 @@ class Dialog(QDialog, Ui_Dialog):
|
||||
.arg(unicode(outPath)), QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton)
|
||||
if addToTOC == QMessageBox.Yes:
|
||||
self.vlayer = QgsVectorLayer(outPath, unicode(outName), "ogr")
|
||||
QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayer([self.vlayer])
|
||||
self.progressBar.setValue(0)
|
||||
self.buttonOk.setEnabled( True )
|
||||
|
||||
|
@ -81,7 +81,7 @@ class Dialog(QDialog, Ui_Dialog):
|
||||
addToTOC = QMessageBox.question(self, self.tr("Sum line lengths"), self.tr("Created output shapefile:\n%1\n\nWould you like to add the new layer to the TOC?").arg(unicode(outPath)), QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton)
|
||||
if addToTOC == QMessageBox.Yes:
|
||||
self.vlayer = QgsVectorLayer(outPath, unicode(outName), "ogr")
|
||||
QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayers([self.vlayer])
|
||||
self.populateLayers()
|
||||
self.progressBar.setValue(0)
|
||||
self.buttonOk.setEnabled( True )
|
||||
|
@ -285,7 +285,7 @@ def addShapeToCanvas( shapefile_path ):
|
||||
vlayer_new = QgsVectorLayer( shapefile_path, layer_name, "ogr" )
|
||||
print layer_name
|
||||
if vlayer_new.isValid():
|
||||
QgsMapLayerRegistry.instance().addMapLayer( vlayer_new )
|
||||
QgsMapLayerRegistry.instance().addMapLayers( [vlayer_new] )
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
@ -192,7 +192,7 @@ class OsmLoadDlg(QDialog, Ui_OsmLoadDlg):
|
||||
|
||||
if self.chkCustomRenderer.isChecked():
|
||||
self.setCustomRenderer(polygonLayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayer(polygonLayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayers([polygonLayer])
|
||||
|
||||
# add line layer
|
||||
lineLayer = QgsVectorLayer(self.fname+"?type=line"+observer + tag + style, basename+" lines", "osm")
|
||||
@ -206,7 +206,7 @@ class OsmLoadDlg(QDialog, Ui_OsmLoadDlg):
|
||||
|
||||
if self.chkCustomRenderer.isChecked():
|
||||
self.setCustomRenderer(lineLayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayer(lineLayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayers([lineLayer])
|
||||
|
||||
# add point layer
|
||||
pointLayer = QgsVectorLayer(self.fname+"?type=point"+observer + tag + style, basename+" points", "osm")
|
||||
@ -220,7 +220,7 @@ class OsmLoadDlg(QDialog, Ui_OsmLoadDlg):
|
||||
|
||||
if self.chkCustomRenderer.isChecked():
|
||||
self.setCustomRenderer(pointLayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayer(pointLayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayers([pointLayer])
|
||||
|
||||
# remember layers
|
||||
self.polygonLayer=polygonLayer
|
||||
|
@ -266,7 +266,7 @@ def addShapeToCanvas( shapefile_path ):
|
||||
vlayer_new = QgsVectorLayer( shapefile_path, layer_name, "ogr" )
|
||||
print layer_name
|
||||
if vlayer_new.isValid():
|
||||
QgsMapLayerRegistry.instance().addMapLayer( vlayer_new )
|
||||
QgsMapLayerRegistry.instance().addMapLayers( [vlayer_new] )
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
@ -44,7 +44,7 @@ class QGisLayers:
|
||||
|
||||
for layer in layers:
|
||||
if layer.type() == layer.RasterLayer:
|
||||
if layer.usesProvider() and layer.providerKey() == 'gdal':#only gdal file-based layers
|
||||
if layer.providerType() == 'gdal':#only gdal file-based layers
|
||||
raster.append(layer)
|
||||
return raster
|
||||
|
||||
@ -52,12 +52,12 @@ class QGisLayers:
|
||||
def getVectorLayers(shapetype=-1):
|
||||
layers = QGisLayers.iface.legendInterface().layers()
|
||||
vector = list()
|
||||
for layer in layers:
|
||||
if layer.type() == layer.VectorLayer:
|
||||
if shapetype == QGisLayers.ALL_TYPES or layer.geometryType() == shapetype:
|
||||
uri = unicode(layer.source())
|
||||
for layer in layers:
|
||||
if layer.type() == layer.VectorLayer:
|
||||
if shapetype == QGisLayers.ALL_TYPES or layer.geometryType() == shapetype:
|
||||
uri = unicode(layer.source())
|
||||
if not uri.endswith("csv") and not uri.endswith("dbf"):
|
||||
|
||||
|
||||
vector.append(layer)
|
||||
return vector
|
||||
|
||||
@ -112,7 +112,7 @@ class QGisLayers:
|
||||
else:
|
||||
style = SextanteConfig.getSetting(SextanteConfig.VECTOR_POLYGON_STYLE)
|
||||
qgslayer.loadNamedStyle(style)
|
||||
QgsMapLayerRegistry.instance().addMapLayer(qgslayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayers([qgslayer])
|
||||
else:
|
||||
qgslayer = QgsRasterLayer(layer, name)
|
||||
if qgslayer.isValid():
|
||||
@ -121,7 +121,7 @@ class QGisLayers:
|
||||
if style == None:
|
||||
style = SextanteConfig.getSetting(SextanteConfig.RASTER_STYLE)
|
||||
qgslayer.loadNamedStyle(style)
|
||||
QgsMapLayerRegistry.instance().addMapLayer(qgslayer)
|
||||
QgsMapLayerRegistry.instance().addMapLayers([qgslayer])
|
||||
QGisLayers.iface.legendInterface().refreshLayerSymbology(qgslayer)
|
||||
else:
|
||||
if prjSetting:
|
||||
@ -172,51 +172,51 @@ class QGisLayers:
|
||||
|
||||
@staticmethod
|
||||
def features(layer):
|
||||
'''this returns an iterator over features in a vector layer, considering the
|
||||
selection that might exist in the layer, and the SEXTANTE configuration that
|
||||
'''this returns an iterator over features in a vector layer, considering the
|
||||
selection that might exist in the layer, and the SEXTANTE configuration that
|
||||
indicates whether to use only selected feature or all of them.
|
||||
This should be used by algorithms instead of calling the QGis API directly,
|
||||
to ensure a consistent behaviour across algorithms'''
|
||||
return Features(layer)
|
||||
|
||||
|
||||
|
||||
|
||||
class Features():
|
||||
|
||||
def __init__(self, layer):
|
||||
|
||||
def __init__(self, layer):
|
||||
self.layer = layer
|
||||
self.selection = False;
|
||||
self.selection = False;
|
||||
if SextanteConfig.getSetting(SextanteConfig.USE_SELECTED):
|
||||
self.selected = layer.selectedFeatures()
|
||||
if len(self.selected) > 0:
|
||||
self.selection = True
|
||||
self.idx = 0;
|
||||
|
||||
self.selection = True
|
||||
self.idx = 0;
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
|
||||
def next(self):
|
||||
if self.selection:
|
||||
if self.idx < len(self.selected):
|
||||
if self.idx < len(self.selected):
|
||||
feature = self.selected[self.idx]
|
||||
self.idx += 1
|
||||
return feature
|
||||
else:
|
||||
raise StopIteration()
|
||||
raise StopIteration()
|
||||
else:
|
||||
f = QgsFeature()
|
||||
if self.layer.dataProvider().nextFeature(f):
|
||||
return f
|
||||
else:
|
||||
raise StopIteration()
|
||||
|
||||
|
||||
def __len__(self):
|
||||
if self.selection:
|
||||
return int(self.layer.selectedFeatureCount())
|
||||
else:
|
||||
return int(self.layer.dataProvider().featureCount())
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -44,7 +44,7 @@ class OgrAlgorithm(GeoAlgorithm):
|
||||
return uri;
|
||||
provider = layer.dataProvider().name()
|
||||
qDebug("inputLayer provider '%s'" % provider)
|
||||
#qDebug("inputLayer layer '%s'" % layer.providerKey())
|
||||
#qDebug("inputLayer layer '%s'" % layer.providerType())
|
||||
qDebug("inputLayer.source '%s'" % layer.source())
|
||||
if provider == 'spatialite':
|
||||
#dbname='/geodata/osm_ch.sqlite' table="places" (Geometry) sql=
|
||||
|
@ -47,7 +47,7 @@ class SextantePostprocessing:
|
||||
try:
|
||||
if out.value.startswith("memory:"):
|
||||
layer = out.memoryLayer
|
||||
QgsMapLayerRegistry.instance().addMapLayer(layer)
|
||||
QgsMapLayerRegistry.instance().addMapLayers([layer])
|
||||
else:
|
||||
if SextanteConfig.getSetting(SextanteConfig.USE_FILENAME_AS_LAYER_NAME):
|
||||
name = os.path.basename(out.value)
|
||||
|
Loading…
x
Reference in New Issue
Block a user