More pythonesque Nathan, thanks ! 2015-04-17 14:32 GMT+02:00 Nathan Woodrow <[email protected]>:
> 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
