/[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 1866 by bh, Mon Oct 27 13:01:58 2003 UTC revision 2571 by jonathan, Fri Feb 18 14:54:17 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 20  from Thuban import _ Line 21  from Thuban import _
21  from wxPython.wx import wxPoint, wxRect, wxPen, wxBrush, wxFont, \  from wxPython.wx import wxPoint, wxRect, wxPen, wxBrush, wxFont, \
22      wxTRANSPARENT_PEN, wxTRANSPARENT_BRUSH, \      wxTRANSPARENT_PEN, wxTRANSPARENT_BRUSH, \
23      wxBLACK_PEN, wxBLACK, wxSOLID, wxCROSS_HATCH, wxSWISS, wxNORMAL, \      wxBLACK_PEN, wxBLACK, wxSOLID, wxCROSS_HATCH, wxSWISS, wxNORMAL, \
24      wxBitmapFromImage, wxImageFromStream, wxBITMAP_TYPE_BMP      wxBitmapFromImage, wxImageFromStream, wxBITMAP_TYPE_BMP, \
25        wxBITMAP_TYPE_JPEG, wxBITMAP_TYPE_PNG, wxBITMAP_TYPE_TIF, \
26        wxBITMAP_TYPE_GIF, wxEmptyImage, wxMask, wxBitmapFromBits
27    
28  from wxproj import draw_polygon_shape, draw_polygon_init  from wxproj import draw_polygon_shape, draw_polygon_init
29    
# Line 36  import Thuban.Model.resource Line 39  import Thuban.Model.resource
39    
40  from baserenderer import BaseRenderer  from baserenderer import BaseRenderer
41    
42    from math import floor
43    
44    from types import StringType
45    
46    from Thuban.version import versions
47    
48    if Thuban.Model.resource.has_gdal_support():
49        from gdalwarp import ProjectRasterFile
50    
51    
52    # Map the strings used for the format parameter of the draw_raster_data
53    # method to the appropriate wxWindows constants
54    raster_format_map = {
55        "BMP": wxBITMAP_TYPE_BMP,
56        "JPEG": wxBITMAP_TYPE_JPEG,
57        "PNG": wxBITMAP_TYPE_PNG,
58        "TIFF": wxBITMAP_TYPE_TIF,
59        "GIF": wxBITMAP_TYPE_GIF,
60        }
61    
62  class MapRenderer(BaseRenderer):  class MapRenderer(BaseRenderer):
63    
64      """Class to render a map onto a wxDC"""      """Class to render a map onto a wxDC"""
# Line 43  class MapRenderer(BaseRenderer): Line 66  class MapRenderer(BaseRenderer):
66      TRANSPARENT_PEN = wxTRANSPARENT_PEN      TRANSPARENT_PEN = wxTRANSPARENT_PEN
67      TRANSPARENT_BRUSH = wxTRANSPARENT_BRUSH      TRANSPARENT_BRUSH = wxTRANSPARENT_BRUSH
68    
69      make_point = wxPoint      def make_point(self, x, y):
70            return wxPoint(int(round(x)), int(round(y)))
71    
72      def tools_for_property(self, prop):      def tools_for_property(self, prop):
73          fill = prop.GetFill()          fill = prop.GetFill()
# Line 73  class MapRenderer(BaseRenderer): Line 97  class MapRenderer(BaseRenderer):
97          if (layer.ShapeStore().RawShapeFormat() == RAW_SHAPEFILE          if (layer.ShapeStore().RawShapeFormat() == RAW_SHAPEFILE
98              and layer.ShapeType() in (SHAPETYPE_ARC, SHAPETYPE_POLYGON)):              and layer.ShapeType() in (SHAPETYPE_ARC, SHAPETYPE_POLYGON)):
99              offx, offy = self.offset              offx, offy = self.offset
100                x = lambda a, b, c, d: None
101                #return (True, x, None)
102              return (True, draw_polygon_shape,              return (True, draw_polygon_shape,
103                      draw_polygon_init(layer.ShapeStore().Shapefile(),                      draw_polygon_init(layer.ShapeStore().Shapefile(),
104                                        self.dc, self.map.projection,                                        self.dc, self.map.projection,
# Line 82  class MapRenderer(BaseRenderer): Line 108  class MapRenderer(BaseRenderer):
108              return BaseRenderer.low_level_renderer(self, layer)              return BaseRenderer.low_level_renderer(self, layer)
109    
110      def label_font(self):      def label_font(self):
111          return wxFont(self.resolution * 10, wxSWISS, wxNORMAL, wxNORMAL)          return wxFont(int(round(self.resolution * 10)), wxSWISS, wxNORMAL,
112                          wxNORMAL)
113    
114        def projected_raster_layer(self, layer, srcProj, dstProj, extents,
115                                   resolution, dimensions, options):
116    
117            ret = None
118    
119            if Thuban.Model.resource.has_gdal_support():
120    
121                if versions['wxPython-tuple'] < (2,5,3):
122                    options = options | 4  # INVERT_MASK_BITS
123                    options = options & ~2 # ALPHA_MASK not supported
124    
125                try:
126                    ret = ProjectRasterFile(layer.GetImageFilename(),
127                                            srcProj, dstProj,
128                                            extents, resolution, dimensions,
129                                            options)
130                except (MemoryError, IOError, AttributeError, ValueError):
131                    # Why does this catch AttributeError and ValueError?
132                    # FIXME: The exception should be communicated to the user
133                    # better.
134                    traceback.print_exc()
135    
136            return ret
137    
138        def draw_raster_data(self, x,y, data, format = 'BMP'):
139    
140            mask = None
141            width = data[0]
142            height = data[1]
143            image_data, mask_data, alpha_data = data[2]
144    
145            if versions['wxPython-tuple'] < (2,5,3):
146                alpha_data = None
147    
148            if format == 'RAW':
149                image = wxEmptyImage(width, height)
150                image.SetData(image_data)
151                if mask_data is not None:
152                    mask = wxBitmapFromBits(mask_data, width, height, 1)
153                    mask = wxMask(mask)
154                elif alpha_data is not None:
155                    image.SetAlphaData(alpha_data)
156            else:
157                stream = cStringIO.StringIO(image_data)
158                image = wxImageFromStream(stream, raster_format_map[format])
159                if mask_data is not None:
160                    stream = cStringIO.StringIO(mask_data)
161                    mask = wxImageFromStream(stream, raster_format_map[format])
162                    mask = wxMask(wxBitmapFromImage(mask, 1))
163                elif alpha_data is not None:
164                    stream = cStringIO.StringIO(alpha_data)
165                    alpha = wxImageFromStream(stream, raster_format_map[format])
166                    image.SetAlpha(alpha.GetData()[:])
167    
     def draw_raster_data(self, data):  
         stream = cStringIO.StringIO(data)  
         image = wxImageFromStream(stream, wxBITMAP_TYPE_BMP)  
168          bitmap = wxBitmapFromImage(image)          bitmap = wxBitmapFromImage(image)
169          self.dc.DrawBitmap(bitmap, 0, 0)          bitmap.SetMask(mask)
170    
171            self.dc.DrawBitmap(bitmap, int(round(x)), int(round(y)), True)
172    
173    
174  class ScreenRenderer(MapRenderer):  class ScreenRenderer(MapRenderer):
# Line 119  class ScreenRenderer(MapRenderer): Line 199  class ScreenRenderer(MapRenderer):
199          return self.render_map_incrementally()          return self.render_map_incrementally()
200    
201      def draw_selection_incrementally(self, layer, selected_shapes):      def draw_selection_incrementally(self, layer, selected_shapes):
202            """Draw the selected shapes in a emphasized way (i.e.
203            with a special pen and brush.
204            The drawing is performed incrementally, that means every
205            n shapes, the user can have interactions with the map.
206            n is currently fixed to 500.
207    
208            layer -- the layer where the shapes belong to.
209            selected_shapes -- a list of the shape-ids representing the
210                               selected shapes for the given layer.
211            """
212          pen = wxPen(wxBLACK, 3, wxSOLID)          pen = wxPen(wxBLACK, 3, wxSOLID)
213          brush = wxBrush(wxBLACK, wxCROSS_HATCH)          brush = wxBrush(wxBLACK, wxCROSS_HATCH)
214    
215          shapetype = layer.ShapeType()          shapetype = layer.ShapeType()
216          useraw, func, param = self.low_level_renderer(layer)          useraw, func, param = self.low_level_renderer(layer)
217          args = (pen, brush)          args = (pen, brush)
218    
219            # for point shapes we need to find out the properties
220            # to determine the size. Based on table and field,
221            # we can find out the properties for object - see below.
222            if shapetype == SHAPETYPE_POINT:
223                lc = layer.GetClassification()
224                field = layer.GetClassificationColumn()
225                table = layer.ShapeStore().Table()
226    
227          count = 0          count = 0
228          for index in selected_shapes:          for index in selected_shapes:
229              count += 1              count += 1
230              shape = layer.Shape(index)              shape = layer.Shape(index)
231    
232                # Get the size of the specific property for this
233                # point
234                if shapetype == SHAPETYPE_POINT and field is not None:
235                    value = table.ReadValue(shape.ShapeID(), field)
236                    group = lc.FindGroup(value)
237                    size = group.GetProperties().GetSize()
238                    args = (pen, brush, size)
239    
240              if useraw:              if useraw:
241                  data = shape.RawData()                  data = shape.RawData()
242              else:              else:
# Line 225  class ExportRenderer(ScreenRenderer): Line 333  class ExportRenderer(ScreenRenderer):
333          self.shifty = (mmaxy - mminy)*0.5 - (ury - lly)*0.5          self.shifty = (mmaxy - mminy)*0.5 - (ury - lly)*0.5
334    
335          self.offset = (offx+self.shiftx, offy+self.shifty)          self.offset = (offx+self.shiftx, offy+self.shifty)
336            self.region = (llx + self.shiftx, lly + self.shifty, urx, ury)
337    
338          # Draw the map          # Draw the map
339          self.dc.BeginDrawing()          self.dc.BeginDrawing()

Legend:
Removed from v.1866  
changed lines
  Added in v.2571

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26