Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class myToolbar:
- def __init__(self, iface, toolBar):
- # References to QGIS interface
- self.iface = iface
- self.canvas = iface.mapCanvas()
- # Actions
- self.addFeatureAction = QAction(QIcon(
- ":/myPlugin/images/icon.png"),
- u"Add nodes or edges",
- self.iface.mainWindow())
- self.addFeatureAction.setWhatsThis(u"MyPlugin: Add nodes or edges")
- self.addFeatureAction.setStatusTip(u"MyPlugin: Add nodes or edges")
- # Set checkable
- self.addFeatureAction.setCheckable(True)
- # Disable tools
- self.addFeatureAction.setEnabled(False)
- # Connect signals
- self.addFeatureAction.triggered.connect(self.newFeatureRun)
- # Add action to toolBar
- toolBar.addAction(self.anadirFeatureAction)
- # Create tools
- self.newFeatureTool = addFeaturesTool(self.iface)
- self.newFeatureTool.setAction(self.addFeatureAction)
- # Store previous tool
- self.previousTool = self.canvas.mapTool()
- # Activate tools on layer change
- QObject.connect(self.iface, SIGNAL("currentLayerChanged(QgsMapLayer*)"), self.onCurrentLayerChanged)
- QObject.connect(self.iface.mapCanvas(), SIGNAL("layersChanged()"), self.onCurrentLayerChanged)
- def onCurrentLayerChanged(self):
- try:
- layer = self.canvas.currentLayer()
- if layer == None or layer.type() != QgsMapLayer.VectorLayer
- or not self.iface.legendInterface().isLayerVisible(layer):
- self.addFeatureAction.setEnabled(False)
- return
- # Activate according geometry
- if layer.geometryType() == QGis.Point:
- if layer.customProperty("customEditable"):
- self.addFeatureAction.setEnabled(True)
- else:
- self.addFeatureAction.setEnabled(False)
- elif layer.geometryType() == QGis.Line:
- if layer.customProperty("customEditable"):
- self.addFeatureAction.setEnabled(True)
- else:
- self.addFeatureAction.setEnabled(False)
- else:
- self.addFeatureAction.setEnabled(False)
- except Exception as e:
- QgsMessageLog.logMessage( "ERROR onCurrentLayerChanged: {0}".format(e), "issueLayers", 2)
- def newFeatureRun(self):
- if self.addFeatureAction.isChecked():
- # Save last tool and select new one
- self.previousTool = self.canvas.mapTool()
- self.canvas.setMapTool(self.newFeatureTool)
- else:
- tmpTool = self.canvas.mapTool()
- self.canvas.setMapTool(self.previousTool)
- class addFeaturesTool(QgsMapTool):
- def __init__(self, iface):
- QgsMapTool.__init__(self, iface.mapCanvas())
- self.iface = iface
- self.canvas = iface.mapCanvas()
- self.layer = None
- self.previousNode = QgsPoint(0,0)
- self.nextNode = QgsPoint(0,0)
- # Rubberband
- self.rubber = QgsRubberBand(self.canvas, False)
- # Lists to store initial and end nodes
- self.capturedNodes = []
- self.markers = []
- self.cursor = QCursor(QPixmap(["16 16 3 1",
- " c None",
- ". c #FF0000",
- "+ c #FFFFFF",
- " ",
- " +.+ ",
- " ++.++ ",
- " +.....+ ",
- " +. .+ ",
- " +. . .+ ",
- " +. . .+ ",
- " ++. . .++",
- " ... ...+... ...",
- " ++. . .++",
- " +. . .+ ",
- " +. . .+ ",
- " ++. .+ ",
- " ++.....+ ",
- " ++.++ ",
- " +.+ "]))
- def canvasPressEvent(self,event):
- pass
- def canvasMoveEvent(self,event):
- ptCursor = self.toMapCoordinates(event.pos())
- self.rubber.movePoint(ptCursor)
- pass
- def canvasReleaseEvent(self,event):
- if event.button() == Qt.LeftButton:
- coordinates = self.toMapCoordinates(event.pos())
- if self.layer.geometryType() == QGis.Point:
- self.addNode( coordinates )
- elif self.layer.geometryType() == QGis.Line:
- self.addEdgeExtrem( coordenadas )
- else:
- self.resetCaptura()
- pass
- def activate(self):
- self.layer = self.canvas.currentLayer()
- caps = self.layer.dataProvider().capabilities()
- if not caps & QgsVectorDataProvider.AddFeatures:
- QMessageBox.critical(None, "MyPlugin",
- u"Layer provider does not allow to add new elements")
- return
- QgsMapTool.activate(self)
- self.canvas.setCursor(self.cursor)
- def deactivate(self):
- self.resetCapture()
- QgsMapTool.deactivate(self)
- def resetCapture(self):
- self.capturedNodes = []
- self.rubber.reset(False)
- for mItem in self.markers:
- self.canvas.scene().removeItem(mItem)
- del mItem
- def isZoomTool(self):
- return False
- def isTransient(self):
- return False
- def isEditTool(self):
- return True
- def addNode(self, coord):
- # Adds node
- def saveNode(self, point):
- # Saves node to layer
- def addEdgeExtrem(self, coord):
- # Add extrems to edge
- def addEdge(self, previousNode, currentNode):
- # adds new edge
Add Comment
Please, Sign In to add comment