[QGIS-Developer] help needed for QgsMapToolEmitPoint

Johannes Grösbrink groesbrink at gmx.de
Sun Oct 27 09:19:41 PDT 2019


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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20191027/c00007bf/attachment.html>


More information about the QGIS-Developer mailing list