[QGIS-Developer] Rotating selected features programmatically

Jacky Volpes jacky.volpes at oslandia.com
Mon Aug 5 02:14:17 PDT 2024


Hi Luke,

My guess is that when more than one feature is selected, and the 
rotation is ended, geometryChanged signal is emitted for each rotated 
feature.

element_layer_rotated() is run when the first geometryChanged signal is 
emitted, and is disconnected, and the layer is saved, and the other 
geometryChanged signals don't trigger anything.

NB: self.vector_layer.editBuffer().geometryChanged.disconnect() is 
risky, if other slots are connected, prefer 
self.vector_layer.editBuffer().geometryChanged.disconnect(self.element_layer_rotated)

Regards,

--
Jacky Volpes

Ingénieur développeur SIG - Oslandia

Le 01/08/2024 à 20:29, Catania, Luke A ERDC-RDE-GRL-VA CIV a écrit :
>
> def rotateFeature(self):
>
>         """Find the rotate feature action in QGIS toolbar and trigger 
> it so the user can rotate the element.
>
>         """
>
>         # We want to detect when the rotation is complete with a 
> geometryChanged signal so we can commit the changes and
>
>         # end the edit session.
>
> self.vector_layer.editBuffer().geometryChanged.connect(self.element_layer_rotated)
>
>         # Get all actions so we can search for the 
> mActionRotateFeature action.
>
>         actions = iface.mainWindow().findChildren(QAction)
>
>         action = [x for x in actions if 
> x.objectName()=='mActionRotateFeature'][0]
>
>         expression = '"Element_Nb" = '
>
>         expression = expression + "\'" + f'{self.element_number}' + "\'"
>
> QgsMessageLog.logMessage(f"expression: {expression}", 
> "StandoffLayers", Qgis.Info)
>
> processing.run("qgis:selectbyexpression",
>
>                        {'INPUT':self.vector_layer,
>
>                         'EXPRESSION': expression,
>
>                         'METHOD':0
>
>                         }
>
>         )
>
>         # Inititates rotate feature action allowing to select a snap 
> to value.
>
>         action.trigger()
>
>         QgsMessageLog.logMessage(f"Rotate Feature Action Triggered", 
> "ElementPlacementTool", Qgis.Info)
>
> def element_layer_rotated(self):
>
>         """When the rotate action is triggered it seems to ignore the 
> ElementPlacementTool events, so in order to end the edit session
>
>         we need to detect a geometryChanged event after the rotation 
> is complete.
>
>         """
>
>         QgsMessageLog.logMessage(f"Element Layer Rotated: 
> {self.vector_layer.name()}", "ElementPlacementTool", Qgis.Info)
>
>         # Disconnect from the signal so we can just commit the changes.
>
> self.vector_layer.editBuffer().geometryChanged.disconnect()
>
>         # Save changes and end edit mode
>
>         self.vector_layer.commitChanges()
>
>         self.vector_layer.endEditCommand()
>
>         self.deactivate()
>
> *From:*Jacky Volpes <jacky.volpes at oslandia.com>
> *Sent:* Thursday, August 1, 2024 8:26 AM
> *To:* Catania, Luke A ERDC-RDE-GRL-VA CIV 
> <Luke.A.Catania at erdc.dren.mil>; 'qgis-developer' 
> <qgis-developer at lists.osgeo.org>
> *Subject:* Re: [QGIS-Developer] Rotating selected features 
> programmatically
>
> Hi Luke,
>
> Please provide a PyQGIS code snippet to reproduce. It will be more 
> convenient to comment and suggest modifications.
> Thanks,
>
> --
> Jacky Volpes
> Ingénieur développeur SIG - Oslandia
>
>
> Le 26/07/2024 à 22:06, Catania, Luke A ERDC-RDE-GRL-VA CIV via 
> QGIS-Developer a écrit :
>
>     I am using the select by expression tool through python to select
>     my features and then I trigger rotation through python I see both
>     selected features rotating, but when I click to end the rotation,
>     it only rotated one of the features and left the other one as is.
>     If I do this through the QGIS using the selection by expression in
>     the selection toolbar and the rotate in the advanced digitizing
>     tool bar rotating both features works fine.
>
>     Any Ideas?
>
>     Luke
>
>
>
>     _______________________________________________
>
>     QGIS-Developer mailing list
>
>     QGIS-Developer at lists.osgeo.org
>
>     List info:Blockedhttps://lists.osgeo.org/mailman/listinfo/qgis-developerBlocked  <Blockedhttps://lists.osgeo.org/mailman/listinfo/qgis-developerBlocked>
>
>     Unsubscribe:Blockedhttps://lists.osgeo.org/mailman/listinfo/qgis-developerBlocked  <Blockedhttps://lists.osgeo.org/mailman/listinfo/qgis-developerBlocked>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20240805/da530513/attachment.htm>


More information about the QGIS-Developer mailing list