Qgis and QgsMapToolEmitPoint

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
sugarfox
User
Beiträge: 1
Registriert: Montag 28. Oktober 2019, 11:14

Hello!

I try to develop some Python modules for construction in landsurveying projects. Therefore these tools must be able to snap to existiing vertices in a map. I found a class,which snaps to existing vertices, settings are taken from qgis, which uses QgsMapToolEmitPoint

class ShowOnMapTool(QgsMapToolEmitPoint):

def __init__(self, iface, PointXY):
QgsMapToolEmitPoint.__init__(self, iface.mapCanvas())
self.iface = iface
self.canvas = iface.mapCanvas()
self.marker = None
self.vertex = None
self.rtnPoint = PointXY

...

def canvasPressEvent(self, event):
'''Capture the coordinate when the mouse button has been released,
format it, and copy it to the clipboard.'''
self.rtnPoint = self.snappoint(event.originalPixelPoint())
self.removeVertexMarker()

if self.marker is None:
self.marker = QgsVertexMarker(self.canvas)
self.marker.setIconSize(18)
self.marker.setPenWidth(2)
self.marker.setIconType(QgsVertexMarker.ICON_CROSS)
self.marker.setCenter(self.rtnPoint)

...

In my form I want to use the snapped coordinates in textboxes. Therefore I added the rtnPoint in the init-procedere and in the canvasPressEvent-Function listed above.

In my own class I did this:

class InputMeasurepoints:
def __init__(self, iface):
self.iface = iface
self.plugin_dir = os.path.dirname(__file__)
locale = QSettings().value('locale/userLocale')[0:2]
locale_path = os.path.join(
self.plugin_dir,
'i18n',
'InputMeasurepoints_{}.qm'.format(locale))

if os.path.exists(locale_path):
self.translator = QTranslator()
self.translator.load(locale_path)
QCoreApplication.installTranslator(self.translator)

self.actions = []
self.menu = self.tr(u'&SurveyingTools')
self.first_start = None
self.canvas = iface.mapCanvas()
self.Point=QgsPointXY()
self.ShowMapTool = ShowOnMapTool(self.iface,self.Point)

self.marker = None
self.vertex = None

...

def onMouseClick(self,button):
self.dlg.ledt_Rechts.setText(format("%.3f" %self.ShowMapTool.rtnPoint.x()))
self.dlg.ledt_Hoch.setText(format("%.3f" %self.ShowMapTool.rtnPoint.y()))

def getPoint(self):
self.canvas.setMapTool(self.ShowMapTool)
self.ShowMapTool.canvasClicked.connect(self.onMouseClick)

def run(self):
if self.first_start == True:
self.first_start = False
self.dlg = InputMeasurepointsDialog()
self.dlg.btnPickXY.clicked.connect(self.getPoint)

Nothing happens, the Programm does not reach the onMouseClick-Function, and the ShowMapTool does not stop. How can I get the rtnPoint of the ShowOnMapTool-Class, what is wrong? I found no example Code in the web, I do not understand how QgsMapToolEmitPoint and the Mouse events work together. Is there any document with simple examples?

Thank you for investing your time in a stupid beginner like me!

Sugarfox
Antworten