We could create a function whereby:
- If the mActionMeasure button is checked, the snapping mode is turned
Off
- If the mActionMeasure button is unchecked, the snapping mode is turned
On
Here is the function which you can paste into the Python Console (change the parameters to fit your needs, you don't need to change the lines which include proj.setSnapSettingsForLayer(...)
):
def snap_func():
proj = QgsProject.instance()
layer = qgis.utils.iface.activeLayer()
if iface.actionMeasure().isChecked():
proj.writeEntry('Digitizing', 'DefaultSnapType', 'off')
proj.setSnapSettingsForLayer(layer.id(), True, 0, 0, 0, True)
else:
proj.writeEntry('Digitizing', 'DefaultSnapType', 'to vertex and segment')
proj.writeEntry('Digitizing', 'SnappingMode', 'current_layer')
proj.writeEntry('Digitizing','DefaultSnapTolerance', 10.0)
proj.setSnapSettingsForLayer(layer.id(), True, 0, 0, 0, True)
Then type the following to connect the mActionMeasure button to the function:
iface.actionMeasure().toggled.connect(snap_func)
Edit:
To save and restore snapping settings for Current
and All visible layers
:
proj = QgsProject.instance()
# Create dictionary
snap_options_dict = {}
def snap_func():
layer = qgis.utils.iface.activeLayer()
if iface.actionMeasure().isChecked():
# Save current snapping settings
snap_options_dict['SnappingMode'] = proj.readEntry('Digitizing','SnappingMode')[0]
snap_options_dict['DefaultSnapType'] = proj.readEntry('Digitizing','DefaultSnapType')[0]
snap_options_dict['DefaultSnapTolerance'] = proj.readEntry('Digitizing','DefaultSnapTolerance')[0]
# Switch snapping off
proj.writeEntry('Digitizing', 'DefaultSnapType', 'off')
proj.writeEntry('Digitizing', 'DefaultSnapTolerance', 0.0)
proj.setSnapSettingsForLayer(layer.id(), True, 0, 0, 0, True)
else:
# Load snapping settings saved in dictionary
proj.writeEntry('Digitizing', 'SnappingMode', snap_options_dict['SnappingMode'])
proj.writeEntry('Digitizing', 'DefaultSnapType', snap_options_dict['DefaultSnapType'])
proj.writeEntry('Digitizing','DefaultSnapTolerance', snap_options_dict['DefaultSnapTolerance'])
proj.setSnapSettingsForLayer(layer.id(), True, 0, 0, 0, True)
iface.actionMeasure().toggled.connect(snap_func)
To save and restore snapping settings for Advanced
:
proj = QgsProject.instance()
# Create dictionary
snap_options_dict = {}
def snap_func():
if iface.actionMeasure().isChecked():
for layer in QgsMapLayerRegistry.instance().mapLayers().values():
# Save current snapping settings
snap_options_dict[layer.id()] = proj.snapSettingsForLayer(layer.id())
# Switch snapping off
proj.setSnapSettingsForLayer(layer.id(), False, 0, 0, 0, False)
else:
for layer in QgsMapLayerRegistry.instance().mapLayers().values():
# Load snapping settings saved in dictionary
proj.setSnapSettingsForLayer(layer.id(), \
snap_options_dict[layer.id()][1], \
snap_options_dict[layer.id()][2], \
snap_options_dict[layer.id()][3], \
snap_options_dict[layer.id()][4], \
snap_options_dict[layer.id()][5])
iface.actionMeasure().toggled.connect(snap_func)