def __init__( self, *predefinedScales ): and you can do this forcedScale(25000, 50000, 100000)
On Fri, 17 Apr 2015 at 22:30 kimaidou <[email protected]> wrote: > Hi all, > > Improve version here: > https://gist.github.com/mdouchin/72a09b629a5557c1dc1c > > with: > > * "replayed" variable to avoid probable infinite loop, thanks to Hugo's > proposal > > * you can now initialize the method with a python list of scales you want > to force canvas to: > > fs = fs = forcedScale( [25000, 50000, 100000 ] ) > > Cheers, > Michaël > > 2015-04-17 12:27 GMT+02:00 kimaidou <[email protected]>: > >> Hi Hugo, >> >> Thanks for the anwser. I used some "print scale" and "print targetScale" >> in my script to check the behavious, and I did not have any "infinite loop" >> or strange behaviour with it. It seems the related QGIS code is armed >> against this risks. >> >> This python script was only a prototype, and I will surely have a look at >> the cpp classes and propose a PR to add this option in QGIS core. >> >> Michaël >> >> 2015-04-17 11:26 GMT+02:00 Hugo Mercier <[email protected]>: >> >>> Hi, >>> >>> Le 17/04/2015 10:46, kimaidou a écrit : >>> > Hi QGIS ! >>> > >>> > I would like to be able in QGIS to force the canvas scales to some >>> > predefined ones. Since we now have project scales (and QGIS pre-defined >>> > scales) in the scale selector, we could use them, and add a simple >>> > checkbox near the combobox "Stick to predefined scales". >>> > >>> > The aim is to force the canvas to render only at these scales. For >>> > example, if I use the rectangle zoom tool, and I should go toe 1/56003, >>> > I would instead land on 1/50000 , the closest pre-defined scale. >>> >>> That would be nice to have it in the core. I already had to do something >>> similar with a plugin. >>> >>> > >>> > I made a little python script as a proof of concept to illustrate it : >>> > http://paste.debian.net/167247/ >>> > >>> > In this script, I hard coded the scales, but oviously we should get >>> them >>> > from the project properties. >>> > >>> > I have a question regarding my script. Since I use the >>> > QgsMapCanvas::scaleChanged signal, I assume the rendering is done twice >>> > ? Once the "normal" way, and once again after I use the >>> > QgsMapCanvas::zoomScale method after calculating the new target scale. >>> > >>> > Any idea for improving it ? I assume I would have to disconnect one >>> (not >>> > found yet) signal/slot, then set the scale and reconnect this >>> > signal/slot afterwards ? >>> >>> QObject::blockSignals might be of help here. But in this case, you don't >>> want to block all signals, only yours. >>> >>> I guess your solution would work. >>> You can also use a flag in your callback, something like : >>> >>> def setScale( self, scale ): >>> if self.reentrant: >>> return >>> >>> targetScale = min( >>> self.predefinedScales, >>> key=lambda x:abs(x-scale) >>> ) >>> self.reentrant = True >>> self.mc.zoomScale( targetScale ) >>> self.reentrant = False >>> >>> _______________________________________________ >>> Qgis-developer mailing list >>> [email protected] >>> http://lists.osgeo.org/mailman/listinfo/qgis-developer >>> >> >> > _______________________________________________ > Qgis-developer mailing list > [email protected] > http://lists.osgeo.org/mailman/listinfo/qgis-developer
_______________________________________________ Qgis-developer mailing list [email protected] http://lists.osgeo.org/mailman/listinfo/qgis-developer
