[Qgis-developer] Problem definig snapping options programmatically

John Stevenson john.stevenson at thinkwhere.com
Fri Jun 24 01:42:38 PDT 2016


Hi all,

This is the same issue that I had a few months ago [1].  (Thanks Tom for flagging it up).

You can recreate in the console as follows as follows (QGIS 2.14.3, with one vector layer loaded):

```
vlayer = QgsMapLayerRegistry.instance().mapLayers().values()[0]
proj = QgsProject.instance()
proj.setSnapSettingsForLayer(vlayer.id(), True, QgsSnapper.SnapToVertex, QgsTolerance.LayerUnits, 5.0, False)
```

The settings are not applied.

"Settings > Snapping Options > Snapping Mode" remains at "Current Layer".  Changing this to to "Advanced" shows correct values have been set, but they are not activated until "Apply" is pressed.

Connecting a function to QgsProject.instance().snapSettingsChanged() shows that the signal fires with no arguments when setSnapSettingsForLayer is called.  Emitting the signal manually does nothing.

Cheers
John

[1]: http://osgeo-org.1560.x6.nabble.com/Setting-snapping-settings-via-Python-td5246362.html

John Stevenson
Senior Developer
Email:mailto:john.stevenson at thinkwhere.com

Glendevon House
Castle Business Park
Stirling FK9 4TZ

Tel: 01786 476060
Tel: 01786 476093 (Direct Dial)

________________________________________
From: Qgis-developer [qgis-developer-bounces at lists.osgeo.org] on behalf of Matthias Kuhn [matthias at opengis.ch]
Sent: 23 June 2016 14:55
To: qgis-developer at lists.osgeo.org
Subject: Re: [Qgis-developer] Problem definig snapping options programmatically

Hi Christian,

Does it help if you call

    QgsProject.instance().snapSettingsChanged()

Cheers
Matthias

On 06/23/2016 03:38 PM, EFTAS Christian Röttger wrote:
> Hi developers,
>
>
>
> i’m facing a problem which i do not understand. In our plugin I created
> a function to set snapping options and bound it to a shortcut.
>
> Using Qgis 2.14.3, source code see below.
>
>
>
> The assigned shortcut works well, but for the snapping I have to do the
> following on every QGIS start:
>
> Go to snapping options, mode = advanced, press ok (without changing
> anything). Then it works afterwards!
>
> But when I print the options *before* I do this, I definitely get the
> right options (see below).
>
>
>
> Does anyone know what I’m missing? Should I open an bug report? Is there
> a workaround do do: “Go to snapping options, mode = advanced, press ok”
> programmatically ?
>
>
>
> Thanks for any help
>
> Christian
>
>
>
> ## Print result
>
> Initialize, when aggroInstance is true
>
> (True, False, 2, 0, 2.0, True)
>
> (True, False, 2, 0, 2.0, True)
>
> (True, False, 2, 0, 2.0, True)
>
> (True, False, 2, 0, 2.0, True)
>
> (True, False, 2, 0, 2.0, True)
>
> (True, False, 2, 0, 2.0, True)
>
> (True, False, 2, 0, 2.0, True)
>
> (True, False, 2, 0, 2.0, True)
>
> checked
>
> (True, False, 2, 0, 2.0, True)
>
> (True, False, 2, 0, 2.0, True)
>
> (True, True, 2, 0, 2.0, False)
>
> (True, False, 2, 0, 2.0, True)
>
> (True, False, 2, 0, 2.0, True)
>
> (True, True, 2, 0, 2.0, False)
>
> (True, False, 2, 0, 2.0, True)
>
> (True, False, 2, 0, 2.0, True)
>
>
>
> ## function
>
>
>
> *def *toggleSnapping(checked):
>     /'''
>     Toggle snapping option
>     /*:param*/checked: True if snapping has been activated, False otherwise
>     '''
>     /aggroInstance = initModule.aggroInstance
>     *print **'Initialize'
>     **if *bool(agroInstance):
>         *for *item *in *QgsMapLayerRegistry.instance().mapLayers().values():
>             QgsProject.instance().setSnapSettingsForLayer(item.id(),
> False, 2, 0, 2, True)
>         fieldLayer =
> mapUtils.getLayerByName(aggroInstance.dictData[*'field'*])
>         backgroundLayer = mapUtils.getLayerByName(*'bg'*)
>         *for *item *in *QgsMapLayerRegistry.instance().mapLayers().values():
>             *print *QgsProject.instance().snapSettingsForLayer(item.id())
>         *if *checked:
>             *print **'checked'
>             */# Convenience function to set snap settings per layer.
>             # it defines the snapping options:
>             # id : the id of your layer, True : to enable the layer
> snapping, 2 : options (2: vertex+segment), 0: type of unit on map, 2 :
> tolerance, true : avoidIntersection)
>
> /QgsProject.instance().setSnapSettingsForLayer(fieldLayer.id(), True, 2,
> 0, 2, False)
>
> QgsProject.instance().setSnapSettingsForLayer(backgroundLayer.id(),
> True, 2, 0, 2, False)
>             *for *item *in
> *QgsMapLayerRegistry.instance().mapLayers().values():
>                 *print
> *QgsProject.instance().snapSettingsForLayer(item.id())
>
>
>
> ## initialization in run() method
>
>
>
> /# Call Snapping Tool by a key shortcut
> /*for *action *in *self.actions:
>     *if *action.text() == *'Toggle Snapping'*:
>         /# Action triggered by shortcut key
>         /self.iface.registerMainWindowAction(action, *"c"*)
>
>
>
>
>
>
>
>
>
>
>
> --
>
> image003
>
> eftas3
>
> Dipl.-Geoinf. Christian Röttger
>
> -Forschung und Entwicklung
>
> E F T A S    Fernerkundung
> Technologietransfer GmbH
> Oststraße 2-18
> 48145 Münster
>
> Fon: +49 251 13307-23         E-Mail: christian.roettger at eftas.com
> <mailto:christian.roettger at eftas.com>
> Fax:  +49 251 13307-33        Web:   http://www.eftas.com
> <http://www.eftas.com/>
>
> Geschäftsführer:
> Dipl.-Ing. Georg Altrogge
>
> Sitz der Gesellschaft: Münster
> Amtsgericht Münster, HRB 2999
> USt.-IdNr. DE 126038986
>
> ******************************************************************
>
> image007
>
>
>
>
>
> _______________________________________________
> Qgis-developer mailing list
> Qgis-developer at lists.osgeo.org
> List info: http://lists.osgeo.org/mailman/listinfo/qgis-developer
> Unsubscribe: http://lists.osgeo.org/mailman/listinfo/qgis-developer
>
_______________________________________________
Qgis-developer mailing list
Qgis-developer at lists.osgeo.org
List info: http://lists.osgeo.org/mailman/listinfo/qgis-developer
Unsubscribe: http://lists.osgeo.org/mailman/listinfo/qgis-developer




More information about the Qgis-developer mailing list