示例#1
0
    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)
示例#2
0
    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)
示例#3
0
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)
示例#4
0
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)