/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/renderer.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/renderer.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1937 by bh, Tue Nov 11 18:16:42 2003 UTC revision 2618 by jonathan, Fri May 6 14:18:31 2005 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001, 2002, 2003 by Intevation GmbH  # Copyright (c) 2001-2004 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]> (2001-2003)
4  # Jonathan Coles <[email protected]>  # Jonathan Coles <[email protected]> (2003)
5  # Frank Koormann <[email protected]>  # Frank Koormann <[email protected]> (2003)
6    # Jan-Oliver Wagner <[email protected]> (2003, 2004)
7  #  #
8  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
9  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
# Line 15  __version__ = "$Revision$" Line 16  __version__ = "$Revision$"
16    
17  import cStringIO  import cStringIO
18    
19    import array
20    
21    import traceback
22    
23  from Thuban import _  from Thuban import _
24    
25  from wxPython.wx import wxPoint, wxRect, wxPen, wxBrush, wxFont, \  from wxPython.wx import wxPoint, wxRect, wxPen, wxBrush, wxFont, \
26      wxTRANSPARENT_PEN, wxTRANSPARENT_BRUSH, \      wxTRANSPARENT_PEN, wxTRANSPARENT_BRUSH, \
27      wxBLACK_PEN, wxBLACK, wxSOLID, wxCROSS_HATCH, wxSWISS, wxNORMAL, \      wxBLACK_PEN, wxBLACK, wxSOLID, wxCROSS_HATCH, wxSWISS, wxNORMAL, \
28      wxBitmapFromImage, wxImageFromStream, wxBITMAP_TYPE_BMP, wxBITMAP_TYPE_JPEG      wxBitmapFromImage, wxImageFromStream, wxBITMAP_TYPE_BMP, \
29        wxBITMAP_TYPE_JPEG, wxBITMAP_TYPE_PNG, wxBITMAP_TYPE_TIF, \
30        wxBITMAP_TYPE_GIF, wxEmptyImage, wxMask, wxBitmapFromBits
31    
32  from wxproj import draw_polygon_shape, draw_polygon_init  from wxproj import draw_polygon_shape, draw_polygon_init
33    
# Line 36  import Thuban.Model.resource Line 43  import Thuban.Model.resource
43    
44  from baserenderer import BaseRenderer  from baserenderer import BaseRenderer
45    
46    from math import floor
47    
48    from types import StringType
49    
50    from Thuban.version import versions
51    
52    if Thuban.Model.resource.has_gdal_support():
53        from gdalwarp import ProjectRasterFile
54    
55    
56  # Map the strings used for the format parameter of the draw_raster_data  # Map the strings used for the format parameter of the draw_raster_data
57  # method to the appropriate wxWindows constants  # method to the appropriate wxWindows constants
58  raster_format_map = {  raster_format_map = {
59      "BMP": wxBITMAP_TYPE_BMP,      "BMP": wxBITMAP_TYPE_BMP,
60      "JPEG": wxBITMAP_TYPE_JPEG,      "JPEG": wxBITMAP_TYPE_JPEG,
61        "PNG": wxBITMAP_TYPE_PNG,
62        "TIFF": wxBITMAP_TYPE_TIF,
63        "GIF": wxBITMAP_TYPE_GIF,
64      }      }
65    
66  class MapRenderer(BaseRenderer):  class MapRenderer(BaseRenderer):
# Line 82  class MapRenderer(BaseRenderer): Line 101  class MapRenderer(BaseRenderer):
101          if (layer.ShapeStore().RawShapeFormat() == RAW_SHAPEFILE          if (layer.ShapeStore().RawShapeFormat() == RAW_SHAPEFILE
102              and layer.ShapeType() in (SHAPETYPE_ARC, SHAPETYPE_POLYGON)):              and layer.ShapeType() in (SHAPETYPE_ARC, SHAPETYPE_POLYGON)):
103              offx, offy = self.offset              offx, offy = self.offset
104                x = lambda a, b, c, d: None
105                #return (True, x, None)
106              return (True, draw_polygon_shape,              return (True, draw_polygon_shape,
107                      draw_polygon_init(layer.ShapeStore().Shapefile(),                      draw_polygon_init(layer.ShapeStore().Shapefile(),
108                                        self.dc, self.map.projection,                                        self.dc, self.map.projection,
# Line 94  class MapRenderer(BaseRenderer): Line 115  class MapRenderer(BaseRenderer):
115          return wxFont(int(round(self.resolution * 10)), wxSWISS, wxNORMAL,          return wxFont(int(round(self.resolution * 10)), wxSWISS, wxNORMAL,
116                        wxNORMAL)                        wxNORMAL)
117    
118      def draw_raster_data(self, data, format = 'BMP'):      def projected_raster_layer(self, layer, srcProj, dstProj, extents,
119          stream = cStringIO.StringIO(data)                                 resolution, dimensions, options):
120          image = wxImageFromStream(stream, raster_format_map[format])          """Returns a raster layer image in projected space
121    
122            Based on a given filename.  This method must be implemented in
123            classes derived from BaseRenderer.
124            """
125    
126            ret = None
127    
128            if Thuban.Model.resource.has_gdal_support():
129    
130                if versions['wxPython-tuple'] < (2,5,3):
131                    options = options | 4  # INVERT_MASK_BITS
132                    options = options & ~2 # ALPHA_MASK not supported
133    
134                try:
135                    ret = ProjectRasterFile(layer.GetImageFilename(),
136                                            srcProj, dstProj,
137                                            extents, resolution, dimensions,
138                                            options)
139                except (MemoryError, IOError, AttributeError, ValueError):
140                    # Why does this catch AttributeError and ValueError?
141                    # FIXME: The exception should be communicated to the user
142                    # better.
143                    traceback.print_exc()
144    
145            return ret
146    
147        def draw_raster_data(self, x,y, data, format = 'BMP', opacity=1.0):
148    
149            mask = None
150            alpha = None
151            width = data[0]
152            height = data[1]
153            image_data, mask_data, alpha_data = data[2]
154    
155            if versions['wxPython-tuple'] < (2,5,3):
156                alpha_data = None
157    
158            if format == 'RAW':
159                image = wxEmptyImage(width, height)
160                image.SetData(image_data)
161                if mask_data is not None:
162                    mask = wxBitmapFromBits(mask_data, width, height, 1)
163                    mask = wxMask(mask)
164                elif alpha_data is not None:
165                    # alpha_data is already in the right format
166                    alpha = alpha_data
167    
168            else:
169                stream = cStringIO.StringIO(image_data)
170                image = wxImageFromStream(stream, raster_format_map[format])
171    
172                if mask_data is not None:
173                    stream = cStringIO.StringIO(mask_data)
174                    mask = wxImageFromStream(stream, raster_format_map[format])
175                    mask = wxMask(wxBitmapFromImage(mask, 1))
176                elif alpha_data is not None:
177                    stream = cStringIO.StringIO(alpha_data)
178                    alpha = wxImageFromStream(stream, raster_format_map[format])
179                    alpha = alpha.GetData() #[:] # XXX: do we need to copy this?
180                elif image.HasAlpha():
181                    alpha = image.GetAlphaData()
182    
183            #
184            # scale down the alpha values the opacity level using a string
185            # translation table for efficiency.
186            #
187            if alpha is not None:
188                if opacity == 0:
189                    return
190                elif opacity == 1:
191                    a = alpha
192                else:
193                    tr = [int(i*opacity) for i in range(256)]
194                    table = array.array('B', tr).tostring()
195                    a = alpha.translate(table)
196    
197                image.SetAlphaData(a)
198    
199          bitmap = wxBitmapFromImage(image)          bitmap = wxBitmapFromImage(image)
200          self.dc.DrawBitmap(bitmap, 0, 0)  
201            if mask is not None:
202                bitmap.SetMask(mask)
203    
204            self.dc.DrawBitmap(bitmap, int(round(x)), int(round(y)), True)
205    
206    
207  class ScreenRenderer(MapRenderer):  class ScreenRenderer(MapRenderer):
# Line 129  class ScreenRenderer(MapRenderer): Line 232  class ScreenRenderer(MapRenderer):
232          return self.render_map_incrementally()          return self.render_map_incrementally()
233    
234      def draw_selection_incrementally(self, layer, selected_shapes):      def draw_selection_incrementally(self, layer, selected_shapes):
235            """Draw the selected shapes in a emphasized way (i.e.
236            with a special pen and brush.
237            The drawing is performed incrementally, that means every
238            n shapes, the user can have interactions with the map.
239            n is currently fixed to 500.
240    
241            layer -- the layer where the shapes belong to.
242            selected_shapes -- a list of the shape-ids representing the
243                               selected shapes for the given layer.
244            """
245          pen = wxPen(wxBLACK, 3, wxSOLID)          pen = wxPen(wxBLACK, 3, wxSOLID)
246          brush = wxBrush(wxBLACK, wxCROSS_HATCH)          brush = wxBrush(wxBLACK, wxCROSS_HATCH)
247    
248          shapetype = layer.ShapeType()          shapetype = layer.ShapeType()
249          useraw, func, param = self.low_level_renderer(layer)          useraw, func, param = self.low_level_renderer(layer)
250          args = (pen, brush)          args = (pen, brush)
251    
252            # for point shapes we need to find out the properties
253            # to determine the size. Based on table and field,
254            # we can find out the properties for object - see below.
255            if shapetype == SHAPETYPE_POINT:
256                lc = layer.GetClassification()
257                field = layer.GetClassificationColumn()
258                table = layer.ShapeStore().Table()
259    
260          count = 0          count = 0
261          for index in selected_shapes:          for index in selected_shapes:
262              count += 1              count += 1
263              shape = layer.Shape(index)              shape = layer.Shape(index)
264    
265                # Get the size of the specific property for this
266                # point
267                if shapetype == SHAPETYPE_POINT and field is not None:
268                    value = table.ReadValue(shape.ShapeID(), field)
269                    group = lc.FindGroup(value)
270                    size = group.GetProperties().GetSize()
271                    args = (pen, brush, size)
272    
273              if useraw:              if useraw:
274                  data = shape.RawData()                  data = shape.RawData()
275              else:              else:
# Line 235  class ExportRenderer(ScreenRenderer): Line 366  class ExportRenderer(ScreenRenderer):
366          self.shifty = (mmaxy - mminy)*0.5 - (ury - lly)*0.5          self.shifty = (mmaxy - mminy)*0.5 - (ury - lly)*0.5
367    
368          self.offset = (offx+self.shiftx, offy+self.shifty)          self.offset = (offx+self.shiftx, offy+self.shifty)
369            self.region = (llx + self.shiftx, lly + self.shifty, urx, ury)
370    
371          # Draw the map          # Draw the map
372          self.dc.BeginDrawing()          self.dc.BeginDrawing()

Legend:
Removed from v.1937  
changed lines
  Added in v.2618

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26