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
