On 08/09/2010 12:22 PM, Benoit de Cabissole wrote:
Here is the code I'm using:

    # tell the layer to use a QgsColorRampShader function
    theLayer.setColorShadingAlgorithm( QgsRasterLayer.ColorRampShader )
    theLayer.rasterShader().setRasterShaderFunction( QgsColorRampShader() )

    # get the raster shader function: should be a QgsColorRampShader
    myColorRampShader = theLayer.rasterShader().rasterShaderFunction()

    # set parameter for the QgsColorRampShader function
    myColorRampShader.setColorRampItemList( theTBL )
    myColorRampShader.setMaximumColorCacheSize( nColo )
    myColorRampShader.setColorRampType( myColorRampShader.DISCRETE )

    # feed my custom QgsColorRampShader back to the raster
    theLayer.setRasterShaderFunction( myColorRampShader )

It does not produce an error but raster does not change to the given
colormap.

Benoit,

With Martin's recent updates you can remove a couple of lines,

---theLayer.rasterShader().setRasterShaderFunction( QgsColorRampShader() ) can be removed, setColorShadingAlgorithm() already creates a new shader instance and theLayer.rasterShader().rasterShaderFunction() new returns the actual class not the base class, thanks Martin!


---theLayer.setRasterShaderFunction( myColorRampShader ) is also not necessary, because you are already working with the actual shader (i.e., myColorRampShader ). This will also cause a crash/segfault because the setRasterShaderFunction() now is deleting the existing function and replacing it with the new, however, in this case it is deleting itself. MARTIN: This was why QgsRasterLayer managed deleting the functions and checked to see if the QgsRasterShaderFunction was user defined. I saw too many possibilities for crashes if the shader itself managed the deleting of functions. This case illustrates on instance of that problem.


I suspect you are not seeing your changes because the draying style is not set correctly. For example, if you load a gray scale image and then apply a color map using the above code, you will still have to set the drawing style to a type that will use the shader as apposed to a contrast enhancement.
>>theLayer.setDrawingStyle( QgsRasterLayer.SingleBandPseudoColor )
>>theLayer.triggerRepaint()

The same would apply for multi band images:
>>theLayer.setDrawingStyle( QgsRasterLayer.MultiBandSingleBandPseudoColor )


If it would help I could give you a complete example with sample data, but it would have to wait until the end of the week.

-pete

--
====================================
Peter J. Ersts, Software Developer
American Museum of Natural History
Center for Biodiversity and Conservation
Central Park West at 79th Street
New York, New York 10024
Web: http://biodiversityinformatics.amnh.org
Web: http://cbc.amnh.org

Open Source,
...evolving through community cooperation to change the world bit by bit

Quantum GIS Raster Development Team.

_______________________________________________
Qgis-developer mailing list
Qgis-developer@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-developer

Reply via email to