2

I try to detect, if a newly created feature is snapped according the snap options:

def isSnapped(self,feat):
    try:
        snapper = QgsSnappingUtils(self.iface.mapCanvas())
        snapper.setMapSettings(self.iface.mapCanvas().mapSettings())
        pointxy = QgsGeometry(feat.geometry()).asPoint()
        #qPoint = QPoint(pointxy.x(),pointxy.y())
        matchres = snapper.snapToMap(pointxy)# QgsPointLocator.Match
        if self.debug:self.info.log("snapping",matchres is None)
        if self.debug: self.info.log("snapping", matchres )
        if self.debug: self.info.log("snapping",matchres.distance(),matchres.point(),matchres.isValid (),matchres.hasVertex () )
    except Exception as e:
        self.info.err(e)

But for any reasons, I always get the same results, eihter the feature is snapped or not. What I am missing? Please help!

The Rabbit
  • 556
  • 2
  • 15

1 Answers1

3
from PyQt5.QtCore import pyqtSignal

class MapTool(QgsMapTool):
    canvasReleased = pyqtSignal(QgsPointXY)

    def __init__(self, iface, canvas,useSnapped=True):
        super(MapTool, self).__init__(canvas)

        self.snapper = None
        self.markerSnapped = None
        self.useSnapped=useSnapped
        self.iface = iface
        self.canvas = self.iface.mapCanvas()
        self.setCursor(Qt.CrossCursor)
        self.prj = QgsProject.instance()
        self.snapConfig = self.prj.snappingConfig()
        self.prj.snappingConfigChanged.connect(self.setSnapping)

        self.setSnapping(self.prj.snappingConfig())

    def setSnapping(self, config):
        self.snapConfig = config
        self.snapper = QgsSnappingUtils(self.canvas)
        self.snapper.setConfig(self.snapConfig)
        self.snapper.setMapSettings(self.canvas.mapSettings())

    def canvasMoveEvent(self, event):
        point = self.toMapCoordinates(event.pos())
        if self.snapConfig.enabled() and self.useSnapped:
            self.isSnapped(point)
        else:
            self.resetMarker()

    def canvasReleaseEvent(self, event):
        point = self.toMapCoordinates(event.pos())
        if self.useSnapped: point=self.isSnapped(point)
        self.canvasReleased.emit(point)

    def deactivate(self):
        self.resetMarker()

    def isSnapped(self, pointxy):
        self.resetMarker()
        matchres = self.snapper.snapToMap(pointxy)  # QgsPointLocator.Match
        if matchres.isValid():
            self.markerSnapped = QgsVertexMarker(self.canvas)
            self.markerSnapped.setColor(Qt.red)
            self.markerSnapped.setIconSize(7)
            self.markerSnapped.setIconType(QgsVertexMarker.ICON_BOX)
            self.markerSnapped.setPenWidth(3)
            self.markerSnapped.setCenter(matchres.point())
            self.markerSnapped.show()
            return matchres.point()
        else:
            return pointxy
    def resetMarker(self):
        self.canvas.scene().removeItem(self.markerSnapped)

useSnap= True
tool=MapTool(iface, iface.mapCanvas(),useSnap)
iface.mapCanvas().setMapTool(tool)
The Rabbit
  • 556
  • 2
  • 15