コード例 #1
0
    def activate(self):
        cursor = QCursor()
        cursor.setShape(Qt.ArrowCursor)
        self.iface.mapCanvas().setCursor(cursor)

        myLayers = []
        # Editing
        layers = self.getLayers()
        for layer in layers:
            openedLayerPath = self.getLayerPath(layer)
            for name in self.ownMainLayers:
                layerPath = self.generatePath(self.ProjectDirectory, self.NetworkName + "_" + name + ".shp")
                if openedLayerPath == layerPath:
                    myLayers.append(layer)
                    if not layer.isEditable():
                        layer.startEditing()
        # Snapping
        self.snapper = QgsMapCanvasSnappingUtils(self.iface.mapCanvas())
        self.snapper.setMapSettings(self.iface.mapCanvas().mapSettings())
        config = QgsSnappingConfig(QgsProject.instance())
        config.setType(2)  # Vertex
        config.setMode(2)  # All layers
        config.setTolerance(1)
        config.setUnits(2)  # Pixels
        config.setEnabled(True)
        self.snapper.setConfig(config)
コード例 #2
0
    def __init__(self, iface: QgisInterface, layer):
        QgepMapToolAddFeature.__init__(self, iface, layer)
        self.snapping_marker = None
        self.node_layer = QgepLayerManager.layer('vw_wastewater_node')
        assert self.node_layer is not None
        self.reach_layer = QgepLayerManager.layer('vw_qgep_reach')
        assert self.reach_layer is not None
        self.setAdvancedDigitizingAllowed(True)
        self.setAutoSnapEnabled(True)

        layer_snapping_configs = [{
            'layer': self.node_layer,
            'mode': QgsSnappingConfig.Vertex
        }, {
            'layer': self.reach_layer,
            'mode': QgsSnappingConfig.VertexAndSegment
        }]
        self.snapping_configs = []
        self.snapping_utils = QgsMapCanvasSnappingUtils(self.iface.mapCanvas())

        for lsc in layer_snapping_configs:
            config = QgsSnappingConfig()
            config.setMode(QgsSnappingConfig.AdvancedConfiguration)
            config.setEnabled(True)
            settings = QgsSnappingConfig.IndividualLayerSettings(
                True, lsc['mode'], 10, QgsTolerance.Pixels)
            config.setIndividualLayerSettings(lsc['layer'], settings)
            self.snapping_configs.append(config)
コード例 #3
0
 def resetSnapping(self):
     self.unlink_mode = False
     # disable previous snapping setting
     proj = QgsProject.instance()
     snapConfig = QgsSnappingConfig()
     if self.settings[0] != '' and self.settings[0]:
         # proj.writeEntry('Digitizing', 'SnappingMode', 'advanced')
         layer = lfh.getLayerByName(self.settings[0])
         if layer:  # layer might have been removed
             snapConfig.setMode(QgsSnappingConfig.AdvancedConfiguration)
             layerSnapConfig = QgsSnappingConfig.IndividualLayerSettings(False, QgsSnappingConfig.Vertex,
                                                                         self.settings[2], QgsTolerance.LayerUnits)
             snapConfig.setIndividualLayerSettings(layer, layerSnapConfig)
             proj.setAvoidIntersectionsLayers([layer])
     if self.settings[1] != 'no unlinks' and self.settings[1]:
         # proj.writeEntry('Digitizing', 'SnappingMode', 'advanced')
         layer = lfh.getLayerByName(self.settings[1])
         if layer:
             snapConfig.setMode(QgsSnappingConfig.AdvancedConfiguration)
             layerSnapConfig = QgsSnappingConfig.IndividualLayerSettings(False, QgsSnappingConfig.Vertex,
                                                                         self.settings[2], QgsTolerance.LayerUnits)
             snapConfig.setIndividualLayerSettings(layer, layerSnapConfig)
             proj.setAvoidIntersectionsLayers([])
     snapConfig.setIntersectionSnapping(False)
     proj.setSnappingConfig(snapConfig)
     return
コード例 #4
0
def configure_snapping_settings():
    my_snap_config = QgsSnappingConfig()
    my_snap_config.setEnabled(True)
    my_snap_config.setMode(QgsSnappingConfig.AllLayers)
    my_snap_config.setType(QgsSnappingConfig.Vertex)
    my_snap_config.setUnits(QgsTolerance.Pixels)
    my_snap_config.setTolerance(10)
    my_snap_config.setIntersectionSnapping(True)

    QgsProject.instance().setSnappingConfig(my_snap_config)
コード例 #5
0
 def configSnapper(self, type):
     # Snapping
     self.snapper = QgsMapCanvasSnappingUtils(self.iface.mapCanvas())
     self.snapper.setMapSettings(self.iface.mapCanvas().mapSettings())
     config = QgsSnappingConfig(QgsProject.instance())
     config.setType(type)  # 1: Vertex; 2:Segment
     config.setMode(2)  # All layers
     config.setTolerance(10)
     config.setUnits(1)  # Pixels
     config.setEnabled(True)
     self.snapper.setConfig(config)
コード例 #6
0
ファイル: qgisred_createPipe.py プロジェクト: QAndrea/QGISRed
    def activate(self):
        QgsMapTool.activate(self)

        # Snapping
        self.snapper = QgsMapCanvasSnappingUtils(self.iface.mapCanvas())
        self.snapper.setMapSettings(self.iface.mapCanvas().mapSettings())
        config = QgsSnappingConfig(QgsProject.instance())
        config.setType(1)  # Vertex
        config.setMode(2)  # All layers
        config.setTolerance(2)
        config.setUnits(2)  # Pixels
        config.setEnabled(True)
        self.snapper.setConfig(config)
コード例 #7
0
    def setSnapLayers(self, snapper, layers):
        config = QgsSnappingConfig()
        config.setMode(QgsSnappingConfig.AdvancedConfiguration)
        config.setEnabled(True)

        for layer in layers:
            if layer:
                ils = QgsSnappingConfig.IndividualLayerSettings(
                    True, QgsSnappingConfig.VertexAndSegment, 16,
                    QgsTolerance.Pixels)
                config.setIndividualLayerSettings(layer, ils)

        snapper.setConfig(config)
コード例 #8
0
 def init_snapper(self):
     """
     Initialize snapper
     """
     if not self.snapper:
         self.node_layer = self.network_analyzer.getNodeLayer()
         self.snapper = QgsMapCanvasSnappingUtils(self.canvas)
         config = QgsSnappingConfig()
         config.setMode(QgsSnappingConfig.AdvancedConfiguration)
         config.setEnabled(True)
         ils = QgsSnappingConfig.IndividualLayerSettings(True, QgsSnappingConfig.VertexAndSegment,
                                                         16, QgsTolerance.Pixels)
         config.setIndividualLayerSettings(self.node_layer, ils)
         self.snapper.setConfig(config)
コード例 #9
0
    def setSnapLayers(self, snapper, layers):
        config = QgsSnappingConfig()
        config.setMode(QgsSnappingConfig.AdvancedConfiguration)
        config.setEnabled(True)

        for layer in layers:
            if layer:
                ils = QgsSnappingConfig.IndividualLayerSettings(True, QgsSnappingConfig.VertexAndSegment,
                                                                16, QgsTolerance.Pixels)
                config.setIndividualLayerSettings(layer, ils)

                layer.destroyed.connect(self.deactivate)

        snapper.setConfig(config)
        snapper.layer_priority = layers
コード例 #10
0
    def setAxialSnapping(self):
        # keep button pressed

        # un press other buttons

        # disable previous snapping setting
        self.resetSnapping()

        # self.axialButton.setCheckable(True)
        self.resetIcons()
        axial_icon = QPixmap(os.path.dirname(__file__) + "/custom_icons/axial.png")
        self.axialButton.setIcon(QIcon(axial_icon))
        self.axialButton.setIconSize(QSize(40, 40))

        # snap to nothing
        if self.settings[0] != '':
            proj = QgsProject.instance()
            # fix_print_with_import
            # fix_print_with_import
            print(proj, 'ax')
            proj.writeEntry('Digitizing', 'SnappingMode', 'advanced')
            layer = lfh.getLayerByName(self.settings[0])
            self.iface.setActiveLayer(layer)
            # if layer.isEditable():
            #    layer.commitChanges()
            # else:
            #    layer.startEditing()
            snapConfig = QgsSnappingConfig()
            snapConfig.setMode(QgsSnappingConfig.AdvancedConfiguration)
            layerSnapConfig = QgsSnappingConfig.IndividualLayerSettings(False, QgsSnappingConfig.Vertex,
                                                                        self.settings[2], QgsTolerance.LayerUnits)
            snapConfig.setIndividualLayerSettings(layer, layerSnapConfig)
            snapConfig.setEnabled(False)
            proj.setAvoidIntersectionsLayers([layer])
            proj.setSnappingConfig(snapConfig)
            proj.setTopologicalEditing(False)
            self.axial_mode = True
        else:
            self.iface.messageBar().pushMessage("Network layer not specified!", Qgis.Critical, duration=5)
            self.axial_mode = False
        return
コード例 #11
0
    def setUnlinkSnapping(self):
        # disable previous snapping setting if segment
        self.resetSnapping()

        # snap to vertex
        if self.settings[1] != 'no unlinks':
            self.resetIcons()
            unlink_icon = QPixmap(os.path.dirname(__file__) + "/custom_icons/unlink.png")
            self.unlinksButton.setIcon(QIcon(unlink_icon))
            self.unlinksButton.setIconSize(QSize(40, 40))
            proj = QgsProject.instance()
            # fix_print_with_import
            # fix_print_with_import
            print(proj, 'un')
            proj.writeEntry('Digitizing', 'SnappingMode', 'advanced')
            layer = lfh.getLayerByName(self.settings[0])
            unlinks_layer = lfh.getLayerByName(self.settings[1])
            # if unlinks_layer.isEditable():
            #    unlinks_layer.commitChanges()
            # else:
            #    unlinks_layer.startEditing()
            self.iface.setActiveLayer(unlinks_layer)
            snapConfig = QgsSnappingConfig()
            snapConfig.setMode(QgsSnappingConfig.AdvancedConfiguration)
            layerSnapConfig = QgsSnappingConfig.IndividualLayerSettings(True, QgsSnappingConfig.Vertex,
                                                                        self.settings[2], QgsTolerance.LayerUnits)
            snapConfig.setIndividualLayerSettings(layer, layerSnapConfig)
            proj.setAvoidIntersectionsLayers([layer])
            snapConfig.setIntersectionSnapping(True)
            snapConfig.setEnabled(True)
            QgsProject.instance().setSnappingConfig(snapConfig)
            proj.setTopologicalEditing(False)
            self.unlink_mode = True
        else:
            self.iface.messageBar().pushMessage("Unlinks layer not specified!", Qgis.Critical, duration=5)
            self.unlink_mode = False
        return
コード例 #12
0
ファイル: TOMsNodeTool.py プロジェクト: olivierdalang/TOMs
class TOMsNodeTool(MapToolMixin, RestrictionTypeUtilsMixin, NodeTool):

    def __init__(self, iface, proposalsManager, restrictionTransaction):

        #def __init__(self, iface, proposalsManager, restrictionTransaction, currFeature, currLayer):

        QgsMessageLog.logMessage("In TOMsNodeTool:initialising .... ", tag="TOMs panel")

        self.iface = iface
        canvas = self.iface.mapCanvas()
        cadDock = self.iface.cadDockWidget()

        NodeTool.__init__(self, canvas, cadDock)

        # set current layer to active layer to avoid any issues in NodeTools cadCanvasReleaseEvent
        #canvas.setCurrentLayer(self.iface.activeLayer())

        self.proposalsManager = proposalsManager
        self.restrictionTransaction = restrictionTransaction

        #self.constants = TOMsConstants()
        #self.origFeature = self.originalFeature()

        # taken from mapTools.CreateRestrictionTool (not sure if they will make a difference ...)
        # self.setMode(TOMsNodeTool.CaptureLine)
        self.snappingConfig = QgsSnappingConfig()
        self.snappingConfig.setMode(QgsSnappingConfig.AdvancedConfiguration)
        #RoadCasementLayer = QgsProject.instance().mapLayersByName("rc_nsg_sideofstreet")[0]

        # get details of the selected feature
        self.selectedRestriction = self.iface.activeLayer().selectedFeatures()[0]
        QgsMessageLog.logMessage("In TOMsNodeTool:initialising ... saving original feature + " + self.selectedRestriction.attribute("GeometryID"), tag="TOMs panel")

        # Create a copy of the feature
        self.origFeature = originalFeature()
        self.origFeature.setFeature(self.selectedRestriction)
        self.origLayer = self.iface.activeLayer()
        QgsMessageLog.logMessage("In TOMsNodeTool:initialising ... original layer + " + self.origLayer.name(), tag="TOMs panel")

        #self.origLayer.startEditing()
        self.origFeature.printFeature()

        self.origLayer.geometryChanged.connect(self.on_cached_geometry_changed)
        self.origLayer.featureDeleted.connect(self.on_cached_geometry_deleted)

        #*** New

        #RestInProp = self.constants.RESTRICTIONS_IN_PROPOSALS_LAYER()
        #QgsMessageLog.logMessage("In init: RestInProp: " + str(RestInProp.name()), tag="TOMs panel")

        #RestInProp.editCommandEnded.connect(self.proposalsManager.updateMapCanvas())

        advancedDigitizingPanel = iface.mainWindow().findChild(QDockWidget, 'AdvancedDigitizingTools')
        advancedDigitizingPanel.setVisible(True)
        self.setupPanelTabs(self.iface, advancedDigitizingPanel)

        self.setAdvancedDigitizingAllowed(True)
        self. setAutoSnapEnabled(True)
        #QgsMapToolAdvancedDigitizing.deactivate(self)
        #QgsMapToolAdvancedDigitizing.activate(self)

        #self.newFeature = None
        self.finishEdit = False

        self.iface.mapCanvas().mapToolSet.connect(self.setUnCheck)
        self.proposalsManager.TOMsToolChanged.connect(functools.partial(self.onGeometryChanged, self.origFeature.getFeature()))

        # get details of the selected feature
        #self.selectedRestriction = self.iface.activeLayer().selectedFeatures()[0]
        #QgsMessageLog.logMessage("In TOMsNodeTool:initialising ... saving original feature + " + self.selectedRestriction.attribute("GeometryID"), tag="TOMs panel")

        #self.origFeature.setFeature(self.selectedRestriction)
        #self.currFeature = currFeature
        #self.currLayer = currLayer
        #self.origLayer = self.iface.activeLayer()
        #self.origLayer.startEditing()
        #self.origFeature.printFeature()

        #cache = self.cached_geometry(self.currLayer, self.currFeature.id())

        #newFeature = self.prepareRestrictionForEdit(self.selectedRestriction, self.origLayer)

        #QgsMessageLog.logMessage("In TOMsNodeTool:init - fid: " + str(self.newFid), tag="TOMs panel")
        #self.origLayer.selectByIds([self.newFid])
        #self.origLayer.selectByIds([self.newFid])

    def setUnCheck(self):
        pass

    def deactivate(self):

        QgsMessageLog.logMessage("In TOMsNodeTool:deactivate .... ", tag="TOMs panel")
        NodeTool.deactivate(self)

    def shutDownNodeTool(self):

        QgsMessageLog.logMessage("In TOMsNodeTool:shutDownNodeTool .... ", tag="TOMs panel")

        # TODO: May need to disconnect geometryChange and featureDeleted signals
        self.origLayer.geometryChanged.disconnect(self.on_cached_geometry_changed)
        self.origLayer.featureDeleted.disconnect(self.on_cached_geometry_deleted)

        self.proposalsManager.TOMsToolChanged.disconnect()

        self.set_highlighted_nodes([])
        self.remove_temporary_rubber_bands()

        #currAction = self.iface.mapCanvas().mapTool().action()
        #currAction.setChecked(False)

        self.proposalPanel = self.iface.mainWindow().findChild(QDockWidget, 'ProposalPanelDockWidgetBase')
        self.setupPanelTabs(self.iface, self.proposalPanel)

        #self.iface.mapCanvas().unsetMapTool(self.mapTool)
        #NodeTool.deactivate()

    def onGeometryChanged(self, currRestriction):
        # Added by TH to deal with RestrictionsInProposals
        # When a geometry is changed; we need to check whether or not the feature is part of the current proposal
        QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged. fid: " + str(currRestriction.id()) + " GeometryID: " + str(currRestriction.attribute("GeometryID")), tag="TOMs panel")

        # disconnect signal for geometryChanged
        #self.origLayer.geometryChanged.disconnect(self.on_cached_geometry_changed)
        #self.proposalsManager.TOMsToolChanged.disconnect()

        #self.currLayer = self.iface.activeLayer()
        QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged. Layer: " + str(self.origLayer.name()), tag="TOMs panel")

        #currLayer.geometryChanged.disconnect(self.onGeometryChanged)
        #QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged. geometryChange signal disconnected.", tag="TOMs panel")

        idxRestrictionID = self.origLayer.fields().indexFromName("RestrictionID")
        QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged. currProposal: " + str(self.proposalsManager.currentProposal()), tag="TOMs panel")

        # Now obtain the changed feature (not sure which geometry)

        #currFeature = self.THgetFeature(fid, currLayer)
        #self.origFeature.printFeature()

        #currFeature = currRestriction
        newGeometry = QgsGeometry(self.feature_band.asGeometry())

        QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - newGeom incoming: " + newGeometry.asWkt(),
                                 tag="TOMs panel")

        QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged. currRestrictionID: " + str(currRestriction[idxRestrictionID]), tag="TOMs panel")

        if not self.restrictionInProposal(currRestriction[idxRestrictionID], self.getRestrictionLayerTableID(self.origLayer), self.proposalsManager.currentProposal()):
            QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - adding details to RestrictionsInProposal", tag="TOMs panel")
            #  This one is not in the current Proposal, so now we need to:
            #  - generate a new ID and assign it to the feature for which the geometry has changed
            #  - switch the geometries arround so that the original feature has the original geometry and the new feature has the new geometry
            #  - add the details to RestrictionsInProposal

            originalfeature = self.origFeature.getFeature()

            newFeature = QgsFeature(self.origLayer.fields())

            newFeature.setAttributes(currRestriction.attributes())
            newFeature.setGeometry(newGeometry)
            newRestrictionID = str(uuid.uuid4())

            newFeature[idxRestrictionID] = newRestrictionID

            idxOpenDate = self.origLayer.fields().indexFromName("OpenDate")
            idxGeometryID = self.origLayer.fields().indexFromName("GeometryID")

            newFeature[idxOpenDate] = None
            newFeature[idxGeometryID] = None

            #currLayer.addFeature(newFeature)
            self.origLayer.addFeatures([newFeature])

            QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - attributes: " + str(newFeature.attributes()), tag="TOMs panel")

            QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - newGeom: " + newFeature.geometry().asWkt(), tag="TOMs panel")

            originalGeomBuffer = QgsGeometry(originalfeature.geometry())
            QgsMessageLog.logMessage(
                "In TOMsNodeTool:onGeometryChanged - originalGeom: " + originalGeomBuffer.asWkt(),
                tag="TOMs panel")
            self.origLayer.changeGeometry(currRestriction.id(), originalGeomBuffer)

            QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - geometries switched.", tag="TOMs panel")

            self.addRestrictionToProposal(currRestriction[idxRestrictionID], self.getRestrictionLayerTableID(self.origLayer), self.proposalsManager.currentProposal(), RestrictionAction.OPEN) # close the original feature
            QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - feature closed.", tag="TOMs panel")

            self.addRestrictionToProposal(newRestrictionID, self.getRestrictionLayerTableID(self.origLayer), self.proposalsManager.currentProposal(), RestrictionAction.OPEN) # open the new one
            QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - feature opened.", tag="TOMs panel")

            #self.proposalsManager.updateMapCanvas()

        else:

            # assign the changed geometry to the current feature
            #currRestriction.setGeometry(newGeometry)
            pass


        QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - newGeom (2): " + currRestriction.geometry().asWkt(),
                                 tag="TOMs panel")

        # Trying to unset map tool to force updates ...
        #self.iface.mapCanvas().unsetMapTool(self.iface.mapCanvas().mapTool())
        #currMapTool = self.iface.mapCanvas().mapTool()
        #currAction = currMapTool.action()

        #currMapToolAction = self.iface.mapCanvas().mapTool().action().setChecked(False)

        # uncheck current tool


        self.restrictionTransaction.commitTransactionGroup(self.origLayer)
        #self.restrictionTransaction.deleteTransactionGroup()

        self.origLayer.deselect(self.origFeature.getFeature().id())

        self.shutDownNodeTool()

        # **** New
        """"#currRestrictionRestrictionID = currFeature[idxRestrictionID]

        QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged. currRestrictionID: " + str(self.currFeature[idxRestrictionID]), tag="TOMs panel")

        self.currFeature.setGeometry(newGeometry)

        QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - attributes: " + str(self.currFeature.attributes()),
                                 tag="TOMs panel")

        QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - newGeom: " + self.currFeature.geometry().asWkt(),
                                 tag="TOMs panel")

        # Trying to unset map tool to force updates ...
        #self.iface.mapCanvas().unsetMapTool(self.iface.mapCanvas().mapTool())

        # change active layer
        status = self.iface.setActiveLayer(None)

        self.restrictionTransaction.commitTransactionGroup(self.currLayer)
        #self.restrictionTransaction.deleteTransactionGroup()

        #QTimer.singleShot(0, functools.partial(RestrictionTypeUtils.commitRestrictionChanges, origLayer))

        #QgsMessageLog.logMessage("In TOMsNodeTool:onGeometryChanged - geometry saved.", tag="TOMs panel")"""

        return

    def cadCanvasPressEvent(self, e):

        QgsMessageLog.logMessage("In TOMsNodeTool:cadCanvasPressEvent", tag="TOMs panel")

        NodeTool.cadCanvasPressEvent(self, e)

        QgsMessageLog.logMessage("In TOMsNodeTool:cadCanvasPressEvent: after NodeTool.cadCanvasPressEvent", tag="TOMs panel")

        #currLayer = self.iface.activeLayer()

        if e.button() == Qt.RightButton:
            QgsMessageLog.logMessage("In TOMsNodeTool:cadCanvasPressEvent: right button pressed",
                                     tag="TOMs panel")

            self.finishEdit = True

            if self.origLayer.isModified():
                QgsMessageLog.logMessage("In TOMsNodeTool:cadCanvasPressEvent: orig layer modified",
                                         tag="TOMs panel")
                self.onGeometryChanged(self.selectedRestriction)

                #RestrictionTypeUtils.commitRestrictionChanges(self.origLayer)
                #self.iface.setActiveLayer(None)  # returns bool

                pass

        return

    def cadCanvasReleaseEvent(self, e):

        QgsMessageLog.logMessage("In TOMsNodeTool:cadCanvasReleaseEvent", tag="TOMs panel")

        if self.finishEdit == True:
            # unset Tool ??
            self.iface.mapCanvas().unsetMapTool(self.iface.mapCanvas().mapTool())
            return

        NodeTool.cadCanvasReleaseEvent(self, e)

    def snap_to_editable_layer(self, e):
        """ Temporarily override snapping config and snap to vertices and edges
         of any editable vector layer, to allow selection of node for editing
         (if snapped to edge, it would offer creation of a new vertex there).
        """
        QgsMessageLog.logMessage("In TOMsNodeTool:snap_to_editable_layer", tag="TOMs panel")

        map_point = self.toMapCoordinates(e.pos())
        tol = QgsTolerance.vertexSearchRadius(self.canvas().mapSettings())
        snap_type = QgsPointLocator.Type(QgsPointLocator.Vertex|QgsPointLocator.Edge)

        #snap_layers = []

        ### TH: Amend to choose only from selected feature (and layer)

        """snap_layers.append(QgsSnappingUtils.LayerConfig(
            self.origLayer, snap_type, tol, QgsTolerance.ProjectUnits))"""

        """for layer in self.canvas().layers():
            if not isinstance(layer, QgsVectorLayer) or not layer.isEditable():
                continue
            snap_layers.append(QgsSnappingUtils.LayerConfig(
                layer, snap_type, tol, QgsTolerance.ProjectUnits))"""

        snap_util = self.canvas().snappingUtils()
        old_snap_util = snap_util
        snap_config = snap_util.config()

        #snap_util = QgsSnappingUtils()
        #snap_config = snap_util.config()
        # old_layers = snap_util.layers()
        # old_mode = snap_util.mode()
        # old_intersections = old_snap_config.intersectionSnapping()

        """
        for layer in snap_config.individualLayerSettings().keys():
            snap_config.removeLayers([layer])
        """

        snap_util.setCurrentLayer(self.origLayer)

        snap_config.setMode(QgsSnappingConfig.ActiveLayer)
        snap_config.setIntersectionSnapping(False)  # only snap to layers
        #m = snap_util.snapToMap(map_point)
        snap_config.setTolerance(tol)
        snap_config.setUnits(QgsTolerance.ProjectUnits)
        snap_config.setType(QgsSnappingConfig.VertexAndSegment)
        snap_config.setEnabled(True)

        """snap_config.setMode(QgsSnappingConfig.AdvancedConfiguration)

        currLayerSnapSettings = snap_config.individualLayerSettings(self.origLayer)
        currLayerSnapSettings.setTolerance(tol)
        currLayerSnapSettings.setUnits(QgsTolerance.ProjectUnits)
        currLayerSnapSettings.setType(QgsSnappingConfig.VertexAndSegment)
        currLayerSnapSettings.setEnabled(True)

        snap_config.setIndividualLayerSettings(self.origLayer, currLayerSnapSettings)"""

        # try to stay snapped to previously used feature
        # so the highlight does not jump around at nodes where features are joined

        ### TH: Amend to choose only from selected feature (and layer)

        filter_last = OneFeatureFilter(self.origLayer, self.origFeature.getFeature().id())
        # m = snap_util.snapToMap(map_point, filter_last)
        """if m_last.isValid() and m_last.distance() <= m.distance():
            m = m_last"""
        self.origFeature.printFeature()
        QgsMessageLog.logMessage("In TOMsNodeTool:snap_to_editable_layer: origLayer " + self.origLayer.name(), tag="TOMs panel")

        """ v3 try to use some other elements of snap_config
            - snapToCurrentLayer
            - setCurrentLayer
            
        """
        QgsMessageLog.logMessage("In TOMsNodeTool:snap_to_editable_layer: pos " + str(e.pos().x()) + "|" + str(e.pos().y()),
                                 tag="TOMs panel")

        m = snap_util.snapToCurrentLayer(e.pos(), snap_type, filter_last)
        """self.canvas().setSnappingUtils(snap_util)
        m = snap_util.snapToMap(e.pos(), filter_last)"""

        #snap_util.setLayers(old_layers)
        #snap_config.setMode(old_mode)
        #snap_config.setIntersectionSnapping(old_intersections)
        self.canvas().setSnappingUtils(old_snap_util)

        #self.last_snap = m

        # TODO: Tidy up ...

        QgsMessageLog.logMessage("In TOMsNodeTool:snap_to_editable_layer: snap point " + str(m.type()) +";" + str(m.isValid()) + "; ", tag="TOMs panel")

        return m

    def keyPressEvent(self, e):

        QgsMessageLog.logMessage("In TOMsNodeTool:keyPressEvent", tag="TOMs panel")

        # want to pick up "esc" and exit tool

        if e.key() == Qt.Key_Escape:

            self.iface.mapCanvas().unsetMapTool(self.iface.mapCanvas().mapTool())
            self.restrictionTransaction.rollBackTransactionGroup()

            self.shutDownNodeTool()

            return

        NodeTool.keyPressEvent(self, e)
コード例 #13
0
def run(id, gtotool, config, debug):
    try:
        #common tool objects
        iface = gtotool.iface
        info = gtotool.info
        gtomain = gtotool.gtomain
        #tool data
        activelayer = config.get('active_layer', None)
        active_tool = config['active_tool']
        snapmode = config['snap_mode']
        topologicalediting = config['topologicalediting']
        snapping_on_intersection = config['snapping_on_intersection']
        #default snappings
        default_snap_type = config['default_snap_type']
        default_snap_tolerance = config['default_snap_tolerance']
        default_snap_tolerance_unit = config['default_snap_tolerance_unit']
        #layers for advanced setting
        layers = config['layers']

        # needed objects
        prj = QgsProject.instance()
        snapconfig = QgsSnappingConfig(prj)
        avoidIntersectLayers = []

        if snapmode == 0:
            snapconfig.setEnabled(False)
        else:
            # set default snapping
            snapconfig.setMode(snapmode)
            snapconfig.setIntersectionSnapping(snapping_on_intersection)
            snapconfig.setType(default_snap_type)
            snapconfig.setUnits(default_snap_tolerance_unit)
            snapconfig.setTolerance(default_snap_tolerance)

            if snapmode == QgsSnappingConfig.AdvancedConfiguration:
                #disable snapping for all layers
                for maplayername, layer in prj.mapLayers().items():
                    if isinstance(layer, QgsVectorLayer):
                        snaplayer = snapconfig.individualLayerSettings(layer)
                        if layer.name() in layers:
                            snaplayer.setEnabled(True)
                        else:
                            snaplayer.setEnabled(False)
                        snapconfig.setIndividualLayerSettings(layer, snaplayer)
                #set settings for layers
                for setting in layers:
                    if debug: info.log("settings:", setting)
                    maplayer = prj.mapLayersByName(setting['name'])[0]
                    snaplayer = snapconfig.individualLayerSettings(maplayer)
                    snaplayer.setEnabled(
                        setting.get('snap', snaplayer.enabled()))
                    snaplayer.setUnits(setting.get('units', snaplayer.units()))
                    snaplayer.setTolerance(
                        setting.get('tolerance', snaplayer.tolerance()))
                    snaplayer.setType(
                        setting.get('mode',
                                    setting.get('snap_type',
                                                snaplayer.type())))
                    snapconfig.setIndividualLayerSettings(maplayer, snaplayer)
                    if setting.get('avoidintersection', True):
                        avoidIntersectLayers.append(maplayer)

                prj.avoidIntersectionsLayers = avoidIntersectLayers
            #enable the settings (snapping)
            snapconfig.setEnabled(True)

        #set topology editing for project
        prj.setTopologicalEditing(topologicalediting)
        #set snappingconfig to project
        prj.setSnappingConfig(snapconfig)
    except IndexError as e:
        info.err(e)
    try:
        #set activelayer
        activelayer = prj.mapLayersByName(activelayer)
        if activelayer: activelayer = activelayer[0]
        if isinstance(activelayer, QgsVectorLayer):
            iface.setActiveLayer(activelayer)
    except IndexError as e:
        info.err(e)
    try:
        #start editing
        layer = iface.activeLayer()
        if not layer.isEditable():
            layer.startEditing()
        # run active tool
        if active_tool:
            gtomain.runcmd(active_tool)
    except IndexError as e:
        info.err(e)