/[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 1927 by bh, Mon Nov 10 16:57:35 2003 UTC revision 2602 by joey, Mon Apr 25 15:01:48 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 51  class MapRenderer(BaseRenderer): Line 70  class MapRenderer(BaseRenderer):
70      TRANSPARENT_PEN = wxTRANSPARENT_PEN      TRANSPARENT_PEN = wxTRANSPARENT_PEN
71      TRANSPARENT_BRUSH = wxTRANSPARENT_BRUSH      TRANSPARENT_BRUSH = wxTRANSPARENT_BRUSH
72    
73      make_point = wxPoint      def make_point(self, x, y):
74            return wxPoint(int(round(x)), int(round(y)))
75    
76      def tools_for_property(self, prop):      def tools_for_property(self, prop):
77          fill = prop.GetFill()          fill = prop.GetFill()
# Line 81  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 90  class MapRenderer(BaseRenderer): Line 112  class MapRenderer(BaseRenderer):
112              return BaseRenderer.low_level_renderer(self, layer)              return BaseRenderer.low_level_renderer(self, layer)
113    
114      def label_font(self):      def label_font(self):
115          return wxFont(self.resolution * 10, wxSWISS, wxNORMAL, wxNORMAL)          return wxFont(int(round(self.resolution * 10)), wxSWISS, wxNORMAL,
116                          wxNORMAL)
117    
118        def projected_raster_layer(self, layer, srcProj, dstProj, extents,
119                                   resolution, dimensions, options):
120            """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, layer, x,y, data, format = 'BMP'):
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                if mask_data is not None:
172                    stream = cStringIO.StringIO(mask_data)
173                    mask = wxImageFromStream(stream, raster_format_map[format])
174                    mask = wxMask(wxBitmapFromImage(mask, 1))
175                elif alpha_data is not None:
176                    stream = cStringIO.StringIO(alpha_data)
177                    alpha = wxImageFromStream(stream, raster_format_map[format])
178                    alpha = alpha.GetData()[:] # XXX: do we need to copy this?
179    
180            #
181            # if we are using the alpha_data then scale down the alpha values
182            # by the layer's opacity using a string translation table
183            #
184            if alpha is not None:
185                lo = layer.Opacity()
186                if lo == 0:
187                    return
188                elif lo == 1:
189                    a = alpha
190                else:
191                    tr = [int(i*lo) for i in range(256)]
192                    table = array.array('B', tr).tostring()
193                    a = alpha.translate(table)
194    
195                image.SetAlphaData(a)
196    
     def draw_raster_data(self, data, format = 'BMP'):  
         stream = cStringIO.StringIO(data)  
         image = wxImageFromStream(stream, raster_format_map[format])  
197          bitmap = wxBitmapFromImage(image)          bitmap = wxBitmapFromImage(image)
198          self.dc.DrawBitmap(bitmap, 0, 0)  
199            if mask is not None:
200                bitmap.SetMask(mask)
201    
202            self.dc.DrawBitmap(bitmap, int(round(x)), int(round(y)), True)
203    
204    
205  class ScreenRenderer(MapRenderer):  class ScreenRenderer(MapRenderer):
# Line 127  class ScreenRenderer(MapRenderer): Line 230  class ScreenRenderer(MapRenderer):
230          return self.render_map_incrementally()          return self.render_map_incrementally()
231    
232      def draw_selection_incrementally(self, layer, selected_shapes):      def draw_selection_incrementally(self, layer, selected_shapes):
233            """Draw the selected shapes in a emphasized way (i.e.
234            with a special pen and brush.
235            The drawing is performed incrementally, that means every
236            n shapes, the user can have interactions with the map.
237            n is currently fixed to 500.
238    
239            layer -- the layer where the shapes belong to.
240            selected_shapes -- a list of the shape-ids representing the
241                               selected shapes for the given layer.
242            """
243          pen = wxPen(wxBLACK, 3, wxSOLID)          pen = wxPen(wxBLACK, 3, wxSOLID)
244          brush = wxBrush(wxBLACK, wxCROSS_HATCH)          brush = wxBrush(wxBLACK, wxCROSS_HATCH)
245    
246          shapetype = layer.ShapeType()          shapetype = layer.ShapeType()
247          useraw, func, param = self.low_level_renderer(layer)          useraw, func, param = self.low_level_renderer(layer)
248          args = (pen, brush)          args = (pen, brush)
249    
250            # for point shapes we need to find out the properties
251            # to determine the size. Based on table and field,
252            # we can find out the properties for object - see below.
253            if shapetype == SHAPETYPE_POINT:
254                lc = layer.GetClassification()
255                field = layer.GetClassificationColumn()
256                table = layer.ShapeStore().Table()
257    
258          count = 0          count = 0
259          for index in selected_shapes:          for index in selected_shapes:
260              count += 1              count += 1
261              shape = layer.Shape(index)              shape = layer.Shape(index)
262    
263                # Get the size of the specific property for this
264                # point
265                if shapetype == SHAPETYPE_POINT and field is not None:
266                    value = table.ReadValue(shape.ShapeID(), field)
267                    group = lc.FindGroup(value)
268                    size = group.GetProperties().GetSize()
269                    args = (pen, brush, size)
270    
271              if useraw:              if useraw:
272                  data = shape.RawData()                  data = shape.RawData()
273              else:              else:
# Line 233  class ExportRenderer(ScreenRenderer): Line 364  class ExportRenderer(ScreenRenderer):
364          self.shifty = (mmaxy - mminy)*0.5 - (ury - lly)*0.5          self.shifty = (mmaxy - mminy)*0.5 - (ury - lly)*0.5
365    
366          self.offset = (offx+self.shiftx, offy+self.shifty)          self.offset = (offx+self.shiftx, offy+self.shifty)
367            self.region = (llx + self.shiftx, lly + self.shifty, urx, ury)
368    
369          # Draw the map          # Draw the map
370          self.dc.BeginDrawing()          self.dc.BeginDrawing()

Legend:
Removed from v.1927  
changed lines
  Added in v.2602

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26