def __init__(self, iface, toolBar): # Save reference to the QGIS interface self.iface = iface self.canvas = self.iface.mapCanvas() #self.lineLayer = None self.selected_points = 0 self.side1_x = [] self.side1_y = [] self.side2_x = [] self.side2_y = [] self.point_list = [] #create action self.median_digitizer = QtGui.QAction( QtGui.QIcon(":/medianLine.png"), QtCore.QCoreApplication.translate( "digitizingtools", "Digitize median line between adjacent polygons"), self.iface.mainWindow()) self.median_digitizer.triggered.connect(self.run) self.iface.currentLayerChanged.connect(self.enable) toolBar.addAction(self.median_digitizer) self.enable() self.tool = DtMedianLineTool(self) self.tool.finishedDigitizing.connect(self.digitizingFinished)
def __init__(self, iface, toolBar): # Save reference to the QGIS interface self.iface = iface self.canvas = self.iface.mapCanvas() #self.lineLayer = None self.selected_points = 0 self.side1_x = [] self.side1_y = [] self.side2_x = [] self.side2_y = [] self.point_list = [] #create action self.median_digitizer = QtWidgets.QAction(QtGui.QIcon(":/medianLine.png"), QtCore.QCoreApplication.translate("digitizingtools", "Digitize median line between adjacent polygons"), self.iface.mainWindow()) self.median_digitizer.triggered.connect(self.run) self.iface.currentLayerChanged.connect(self.enable) toolBar.addAction(self.median_digitizer) self.enable() self.tool = DtMedianLineTool(self) self.tool.finishedDigitizing.connect(self.digitizingFinished)
class DtMedianLine(): '''Digitize median line by selecting vertices on adjacent polygons''' def __init__(self, iface, toolBar): # Save reference to the QGIS interface self.iface = iface self.canvas = self.iface.mapCanvas() #self.lineLayer = None self.selected_points = 0 self.side1_x = [] self.side1_y = [] self.side2_x = [] self.side2_y = [] self.point_list = [] #create action self.median_digitizer = QtGui.QAction( QtGui.QIcon(":/medianLine.png"), QtCore.QCoreApplication.translate( "digitizingtools", "Digitize median line between adjacent polygons"), self.iface.mainWindow()) self.median_digitizer.triggered.connect(self.run) self.iface.currentLayerChanged.connect(self.enable) toolBar.addAction(self.median_digitizer) self.enable() self.tool = DtMedianLineTool(self) self.tool.finishedDigitizing.connect(self.digitizingFinished) def reset(self): self.selected_points = 0 del self.side1_x[:] del self.side1_y[:] del self.side2_x[:] del self.side2_y[:] del self.point_list[:] def enableTool(self): self.tool.activate() self.canvas.setMapTool(self.tool) #Connect to the DtSelectVertexTool QtCore.QObject.connect(self.tool, QtCore.SIGNAL("vertexFound(PyQt_PyObject)"), self.storePoints) def disableTool(self): self.reset() #self.tool.deactivate() self.canvas.unsetMapTool(self.tool) QtCore.QObject.disconnect(self.tool, QtCore.SIGNAL("vertexFound(PyQt_PyObject)"), self.storePoints) self.tool.deactivate() def deactivate(self): self.disableTool() self.median_digitizer.setChecked(False) def run(self): '''Function that does all the real work''' self.reset() layer = self.iface.activeLayer() title = QtCore.QCoreApplication.translate("digitizingtools", "Digitize median line") if layer.selectedFeatureCount() == 0: self.enableTool() #self.lineLayer = layer self.median_digitizer.setChecked(True) else: QtGui.QMessageBox.information( None, title, QtCore.QCoreApplication.translate("digitizingtools", "Please clear selection.")) def storePoints(self, result): tmp_x = result[0].x() tmp_y = result[0].y() modulo = self.selected_points % 2 if (modulo == 0): # Select first vertex if ((tmp_x in self.side1_x) and (tmp_y in self.side1_y)): #print "Point (%f,%f) already in list1" % (tmp_x, tmp_y) self.selected_points = self.selected_points + 1 return else: #print "Point (%f,%f) added in list1" % (tmp_x, tmp_y) self.side1_x.append(tmp_x) self.side1_y.append(tmp_y) self.selected_points = self.selected_points + 1 return else: # Select second vertex if ((tmp_x in self.side2_x) and (tmp_y in self.side2_y)): #print "Point (%f,%f) already in list2" % (tmp_x, tmp_y) self.selected_points = self.selected_points + 1 return else: #print "Point (%f,%f) added in list2" % (tmp_x, tmp_y) self.side2_x.append(tmp_x) self.side2_y.append(tmp_y) self.selected_points = self.selected_points + 1 return def digitizingFinished(self): #print "side1_x" #print self.side1_x #print "side1_y" #print self.side1_y #print "side2_x" #print self.side2_x #print "side2_y" #print self.side2_y (x, y) = median_polyline(self.side1_x, self.side1_y, self.side2_x, self.side2_y) #print "x" #print x #print "y" #print y for i in range(len(x)): p = QgsPoint(x[i], y[i]) #print "current p is:" #print p self.point_list.append(p) # Debug #print "Point list:" #print self.point_list new_geom = QgsGeometry.fromPolyline(self.point_list) addGeometryToCadLayer(new_geom) self.canvas.refresh() self.reset() self.deactivate() def enable(self): '''Enables/disables the corresponding button.''' # Disable the Button by default self.reset() self.median_digitizer.setEnabled(False) layer = self.iface.activeLayer() if layer is not None: #Only for vector layers. if layer.type() == QgsMapLayer.VectorLayer: # only for polygon layers if layer.geometryType() == 2: # enable if editable self.median_digitizer.setEnabled(layer.isEditable()) try: layer.editingStarted.disconnect(self.enable) # disconnect, will be reconnected except: pass try: layer.editingStopped.disconnect(self.enable) # when it becomes active layer again except: pass layer.editingStarted.connect(self.enable) layer.editingStopped.connect(self.enable)
class DtMedianLine(object): '''Digitize median line by selecting vertices on adjacent polygons''' def __init__(self, iface, toolBar): # Save reference to the QGIS interface self.iface = iface self.canvas = self.iface.mapCanvas() #self.lineLayer = None self.selected_points = 0 self.side1_x = [] self.side1_y = [] self.side2_x = [] self.side2_y = [] self.point_list = [] #create action self.median_digitizer = QtWidgets.QAction(QtGui.QIcon(":/medianLine.png"), QtCore.QCoreApplication.translate("digitizingtools", "Digitize median line between adjacent polygons"), self.iface.mainWindow()) self.median_digitizer.triggered.connect(self.run) self.iface.currentLayerChanged.connect(self.enable) toolBar.addAction(self.median_digitizer) self.enable() self.tool = DtMedianLineTool(self) self.tool.finishedDigitizing.connect(self.digitizingFinished) def reset(self): self.selected_points = 0 del self.side1_x[:] del self.side1_y[:] del self.side2_x[:] del self.side2_y[:] del self.point_list[:] def enableTool(self): self.tool.activate() self.canvas.setMapTool(self.tool) #Connect to the DtSelectVertexTool self.tool.vertexFound.connect(self.storePoints) def disableTool(self): self.reset() #self.tool.deactivate() self.canvas.unsetMapTool(self.tool) self.tool.vertexFound.disconnect(self.storePoints) self.tool.deactivate() def deactivate(self): self.disableTool() self.median_digitizer.setChecked(False) def run(self): '''Function that does all the real work''' self.reset() layer = self.iface.activeLayer() title = QtCore.QCoreApplication.translate("digitizingtools", "Digitize median line") if layer.selectedFeatureCount() == 0: self.enableTool() #self.lineLayer = layer self.median_digitizer.setChecked(True) else: QtWidgets.QMessageBox.information(None, title, QtCore.QCoreApplication.translate("digitizingtools", "Please clear selection.")) def storePoints(self, result): tmp_x = result[0].x() tmp_y = result[0].y() modulo = self.selected_points % 2 if (modulo == 0): # Select first vertex if ((tmp_x in self.side1_x) and (tmp_y in self.side1_y)): #print "Point (%f,%f) already in list1" % (tmp_x, tmp_y) self.selected_points = self.selected_points + 1 return else: #print "Point (%f,%f) added in list1" % (tmp_x, tmp_y) self.side1_x.append(tmp_x) self.side1_y.append(tmp_y) self.selected_points = self.selected_points + 1 return else: # Select second vertex if ((tmp_x in self.side2_x) and (tmp_y in self.side2_y)): #print "Point (%f,%f) already in list2" % (tmp_x, tmp_y) self.selected_points = self.selected_points + 1 return else: #print "Point (%f,%f) added in list2" % (tmp_x, tmp_y) self.side2_x.append(tmp_x) self.side2_y.append(tmp_y) self.selected_points = self.selected_points + 1 return def digitizingFinished(self): #print "side1_x" #print self.side1_x #print "side1_y" #print self.side1_y #print "side2_x" #print self.side2_x #print "side2_y" #print self.side2_y (x, y) = median_polyline(self.side1_x, self.side1_y, self.side2_x, self.side2_y) #print "x" #print x #print "y" #print y for i in range(len(x)): p = QgsPoint(x[i], y[i]) #print "current p is:" #print p self.point_list.append(p) # Debug #print "Point list:" #print self.point_list new_geom = QgsGeometry.fromPolyline(self.point_list) addGeometryToCadLayer(new_geom) self.canvas.refresh() self.reset() self.deactivate() def enable(self): '''Enables/disables the corresponding button.''' # Disable the Button by default self.reset() self.median_digitizer.setEnabled(False) layer = self.iface.activeLayer() if layer is not None: #Only for vector layers. if layer.type() == QgsMapLayer.VectorLayer: # only for polygon layers if layer.geometryType() == 2: # enable if editable self.median_digitizer.setEnabled(layer.isEditable()) try: layer.editingStarted.disconnect(self.enable) # disconnect, will be reconnected except: pass try: layer.editingStopped.disconnect(self.enable) # when it becomes active layer again except: pass layer.editingStarted.connect(self.enable) layer.editingStopped.connect(self.enable)