-
-
Save slarosa/653e6d759cf0d82c2a24dcc499b094e0 to your computer and use it in GitHub Desktop.
| ''' | |
| QGIS macro to enable selection on referenced geometry layer from | |
| referencing geometryless table in a Project with Relations. | |
| How it works: | |
| 1. Enable macros for the QGIS Project | |
| 2. Paste this code in Project->Macro | |
| 3. Save the Project. | |
| Note: The QGIS project must have relationship between tables. | |
| See https://goo.gl/w4NMZJ on how to create one-to-many relations. | |
| ''' | |
| from qgis.PyQt.QtCore import QSettings | |
| from qgis.utils import iface, reloadProjectMacros | |
| from qgis.core import QgsFeatureRequest, QgsProject | |
| from functools import partial | |
| def openProject(): | |
| def selectionChanged(rl, fts): | |
| referencingLayer = rl.referencingLayer() | |
| referencedLayer = rl.referencedLayer() | |
| ids = [] | |
| request = QgsFeatureRequest().setFilterFids(fts) | |
| for f in referencingLayer.getFeatures(request): | |
| ids.append(rl.getReferencedFeature(f).id()) | |
| referencedLayer.selectByIds(ids) | |
| iface.setActiveLayer(referencedLayer) | |
| rM = QgsProject.instance().relationManager() | |
| rls = rM.relations() | |
| for rlid, rl in rls.iteritems(): | |
| referencingLayer = rl.referencingLayer() | |
| referencingLayer.selectionChanged.connect(partial(selectionChanged, rl)) | |
| def saveProject(): | |
| s = QSettings() | |
| s.setValue("qgis/enableMacros", 3) | |
| reloadProjectMacros() | |
| def closeProject(): | |
| pass |
No, you have just written it, sorry!!!
@aborruso Yeah, it could be unclear, I added that the project must have relationship between tables. thanks!
Hi Salvo,
I tested your macro on Ubuntu 16.04 (QGIS 2.18), but it does'nt work.
This is the log:
An error occurred during execution of following code:
qgis.utils.reloadProjectMacros()
traceback.print_exception() failed
Python version:
2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609]
QGIS version:
2.18.6 'Las Palmas', 5f369b0
@nformica wrote:
I tested your macro on Ubuntu 16.04 (QGIS 2.18), but it does'nt work.
This is the log:
An error occurred during execution of following code:
qgis.utils.reloadProjectMacros()
traceback.print_exception() failed
when it is occurring? saving the project or anywhere you try to select a row?
Just when I open the project !
Then, when I select a row nothing happens: no error alert and no features selection.
@nformica that is odd. That method should be called on saving the project. You just try to replace reloadProjectMacros() with pass. That code actually is not working as expected.
I tried "to replace reloadProjectMacros() with pass", but problem is the same.
This is message on Log panel (Python):
evalString()) error!
Command:
str(sys.path)
Error:
SystemError: NULL object passed to Py_BuildValue
Peraphs qgis-python module is'nt good !? ... Should I try to reinstall it?
@nformica, I managed to test the macro on Ubuntu-16.04 (64bit) QGIS 2.18.6 and has worked fine for me. So, the error you are getting could be a local problem.
Also, you could test if the following code work fine for you in python console:
from qgis.utils import reloadProjectMacros
reloadProjectMacros()
I will a row in the bullet points notes: "create the layers relation in the Project".
Thank you very much