/[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 2587 by jonathan, Wed Mar 23 15:30:27 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  from Thuban import _  from Thuban import _
22    
23  from wxPython.wx import wxPoint, wxRect, wxPen, wxBrush, wxFont, \  from wxPython.wx import wxPoint, wxRect, wxPen, wxBrush, wxFont, \
24      wxTRANSPARENT_PEN, wxTRANSPARENT_BRUSH, \      wxTRANSPARENT_PEN, wxTRANSPARENT_BRUSH, \
25      wxBLACK_PEN, wxBLACK, wxSOLID, wxCROSS_HATCH, wxSWISS, wxNORMAL, \      wxBLACK_PEN, wxBLACK, wxSOLID, wxCROSS_HATCH, wxSWISS, wxNORMAL, \
26      wxBitmapFromImage, wxImageFromStream, wxBITMAP_TYPE_BMP, wxBITMAP_TYPE_JPEG      wxBitmapFromImage, wxImageFromStream, wxBITMAP_TYPE_BMP, \
27        wxBITMAP_TYPE_JPEG, wxBITMAP_TYPE_PNG, wxBITMAP_TYPE_TIF, \
28        wxBITMAP_TYPE_GIF, wxEmptyImage, wxMask, wxBitmapFromBits
29    
30  from wxproj import draw_polygon_shape, draw_polygon_init  from wxproj import draw_polygon_shape, draw_polygon_init
31    
# Line 36  import Thuban.Model.resource Line 41  import Thuban.Model.resource
41    
42  from baserenderer import BaseRenderer  from baserenderer import BaseRenderer
43    
44    from math import floor
45    
46    from types import StringType
47    
48    from Thuban.version import versions
49    
50    if Thuban.Model.resource.has_gdal_support():
51        from gdalwarp import ProjectRasterFile
52    
53    
54  # 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
55  # method to the appropriate wxWindows constants  # method to the appropriate wxWindows constants
56  raster_format_map = {  raster_format_map = {
57      "BMP": wxBITMAP_TYPE_BMP,      "BMP": wxBITMAP_TYPE_BMP,
58      "JPEG": wxBITMAP_TYPE_JPEG,      "JPEG": wxBITMAP_TYPE_JPEG,
59        "PNG": wxBITMAP_TYPE_PNG,
60        "TIFF": wxBITMAP_TYPE_TIF,
61        "GIF": wxBITMAP_TYPE_GIF,
62      }      }
63    
64  class MapRenderer(BaseRenderer):  class MapRenderer(BaseRenderer):
# Line 51  class MapRenderer(BaseRenderer): Line 68  class MapRenderer(BaseRenderer):
68      TRANSPARENT_PEN = wxTRANSPARENT_PEN      TRANSPARENT_PEN = wxTRANSPARENT_PEN
69      TRANSPARENT_BRUSH = wxTRANSPARENT_BRUSH      TRANSPARENT_BRUSH = wxTRANSPARENT_BRUSH
70    
71      make_point = wxPoint      def make_point(self, x, y):
72            return wxPoint(int(round(x)), int(round(y)))
73    
74      def tools_for_property(self, prop):      def tools_for_property(self, prop):
75          fill = prop.GetFill()          fill = prop.GetFill()
# Line 81  class MapRenderer(BaseRenderer): Line 99  class MapRenderer(BaseRenderer):
99          if (layer.ShapeStore().RawShapeFormat() == RAW_SHAPEFILE          if (layer.ShapeStore().RawShapeFormat() == RAW_SHAPEFILE
100              and layer.ShapeType() in (SHAPETYPE_ARC, SHAPETYPE_POLYGON)):              and layer.ShapeType() in (SHAPETYPE_ARC, SHAPETYPE_POLYGON)):
101              offx, offy = self.offset              offx, offy = self.offset
102                x = lambda a, b, c, d: None
103                #return (True, x, None)
104              return (True, draw_polygon_shape,              return (True, draw_polygon_shape,
105                      draw_polygon_init(layer.ShapeStore().Shapefile(),                      draw_polygon_init(layer.ShapeStore().Shapefile(),
106                                        self.dc, self.map.projection,                                        self.dc, self.map.projection,
# Line 90  class MapRenderer(BaseRenderer): Line 110  class MapRenderer(BaseRenderer):
110              return BaseRenderer.low_level_renderer(self, layer)              return BaseRenderer.low_level_renderer(self, layer)
111    
112      def label_font(self):      def label_font(self):
113          return wxFont(self.resolution * 10, wxSWISS, wxNORMAL, wxNORMAL)          return wxFont(int(round(self.resolution * 10)), wxSWISS, wxNORMAL,
114                          wxNORMAL)
115    
116        def projected_raster_layer(self, layer, srcProj, dstProj, extents,
117                                   resolution, dimensions, options):
118    
119            ret = None
120    
121            if Thuban.Model.resource.has_gdal_support():
122    
123                if versions['wxPython-tuple'] < (2,5,3):
124                    options = options | 4  # INVERT_MASK_BITS
125                    options = options & ~2 # ALPHA_MASK not supported
126    
127                try:
128                    ret = ProjectRasterFile(layer.GetImageFilename(),
129                                            srcProj, dstProj,
130                                            extents, resolution, dimensions,
131                                            options)
132                except (MemoryError, IOError, AttributeError, ValueError):
133                    # Why does this catch AttributeError and ValueError?
134                    # FIXME: The exception should be communicated to the user
135                    # better.
136                    traceback.print_exc()
137    
138            return ret
139    
140        def draw_raster_data(self, layer, x,y, data, format = 'BMP'):
141    
142            mask = None
143            alpha = None
144            width = data[0]
145            height = data[1]
146            image_data, mask_data, alpha_data = data[2]
147    
148            if versions['wxPython-tuple'] < (2,5,3):
149                alpha_data = None
150    
151            if format == 'RAW':
152                image = wxEmptyImage(width, height)
153                image.SetData(image_data)
154                if mask_data is not None:
155                    mask = wxBitmapFromBits(mask_data, width, height, 1)
156                    mask = wxMask(mask)
157                elif alpha_data is not None:
158                    # alpha_data is already in the right format
159                    alpha = alpha_data
160    
161            else:
162                stream = cStringIO.StringIO(image_data)
163                image = wxImageFromStream(stream, raster_format_map[format])
164                if mask_data is not None:
165                    stream = cStringIO.StringIO(mask_data)
166                    mask = wxImageFromStream(stream, raster_format_map[format])
167                    mask = wxMask(wxBitmapFromImage(mask, 1))
168                elif alpha_data is not None:
169                    stream = cStringIO.StringIO(alpha_data)
170                    alpha = wxImageFromStream(stream, raster_format_map[format])
171                    alpha = alpha.GetData()[:] # XXX: do we need to copy this?
172    
173            #
174            # if we are using the alpha_data then scale down the alpha values
175            # by the layer's opacity using a string translation table
176            #
177            if alpha is not None:
178                lo = layer.Opacity()
179                if lo == 0:
180                    return
181                elif lo == 1:
182                    a = alpha
183                else:
184                    tr = [int(i*lo) for i in range(256)]
185                    table = array.array('B', tr).tostring()
186                    a = alpha.translate(table)
187    
188                image.SetAlphaData(a)
189    
     def draw_raster_data(self, data, format = 'BMP'):  
         stream = cStringIO.StringIO(data)  
         image = wxImageFromStream(stream, raster_format_map[format])  
190          bitmap = wxBitmapFromImage(image)          bitmap = wxBitmapFromImage(image)
191          self.dc.DrawBitmap(bitmap, 0, 0)  
192            if mask is not None:
193                bitmap.SetMask(mask)
194    
195            self.dc.DrawBitmap(bitmap, int(round(x)), int(round(y)), True)
196    
197    
198  class ScreenRenderer(MapRenderer):  class ScreenRenderer(MapRenderer):
# Line 127  class ScreenRenderer(MapRenderer): Line 223  class ScreenRenderer(MapRenderer):
223          return self.render_map_incrementally()          return self.render_map_incrementally()
224    
225      def draw_selection_incrementally(self, layer, selected_shapes):      def draw_selection_incrementally(self, layer, selected_shapes):
226            """Draw the selected shapes in a emphasized way (i.e.
227            with a special pen and brush.
228            The drawing is performed incrementally, that means every
229            n shapes, the user can have interactions with the map.
230            n is currently fixed to 500.
231    
232            layer -- the layer where the shapes belong to.
233            selected_shapes -- a list of the shape-ids representing the
234                               selected shapes for the given layer.
235            """
236          pen = wxPen(wxBLACK, 3, wxSOLID)          pen = wxPen(wxBLACK, 3, wxSOLID)
237          brush = wxBrush(wxBLACK, wxCROSS_HATCH)          brush = wxBrush(wxBLACK, wxCROSS_HATCH)
238    
239          shapetype = layer.ShapeType()          shapetype = layer.ShapeType()
240          useraw, func, param = self.low_level_renderer(layer)          useraw, func, param = self.low_level_renderer(layer)
241          args = (pen, brush)          args = (pen, brush)
242    
243            # for point shapes we need to find out the properties
244            # to determine the size. Based on table and field,
245            # we can find out the properties for object - see below.
246            if shapetype == SHAPETYPE_POINT:
247                lc = layer.GetClassification()
248                field = layer.GetClassificationColumn()
249                table = layer.ShapeStore().Table()
250    
251          count = 0          count = 0
252          for index in selected_shapes:          for index in selected_shapes:
253              count += 1              count += 1
254              shape = layer.Shape(index)              shape = layer.Shape(index)
255    
256                # Get the size of the specific property for this
257                # point
258                if shapetype == SHAPETYPE_POINT and field is not None:
259                    value = table.ReadValue(shape.ShapeID(), field)
260                    group = lc.FindGroup(value)
261                    size = group.GetProperties().GetSize()
262                    args = (pen, brush, size)
263    
264              if useraw:              if useraw:
265                  data = shape.RawData()                  data = shape.RawData()
266              else:              else:
# Line 233  class ExportRenderer(ScreenRenderer): Line 357  class ExportRenderer(ScreenRenderer):
357          self.shifty = (mmaxy - mminy)*0.5 - (ury - lly)*0.5          self.shifty = (mmaxy - mminy)*0.5 - (ury - lly)*0.5
358    
359          self.offset = (offx+self.shiftx, offy+self.shifty)          self.offset = (offx+self.shiftx, offy+self.shifty)
360            self.region = (llx + self.shiftx, lly + self.shifty, urx, ury)
361    
362          # Draw the map          # Draw the map
363          self.dc.BeginDrawing()          self.dc.BeginDrawing()

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26