/[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 2431 by joey, Sun Dec 5 15:05:02 2004 UTC revision 2587 by jonathan, Wed Mar 23 15:30:27 2005 UTC
# Line 16  __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, \      wxBitmapFromImage, wxImageFromStream, wxBITMAP_TYPE_BMP, \
27      wxBITMAP_TYPE_JPEG, wxBITMAP_TYPE_PNG, wxBITMAP_TYPE_TIF, wxBITMAP_TYPE_GIF      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 38  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
# Line 87  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 99  class MapRenderer(BaseRenderer): Line 113  class MapRenderer(BaseRenderer):
113          return wxFont(int(round(self.resolution * 10)), wxSWISS, wxNORMAL,          return wxFont(int(round(self.resolution * 10)), wxSWISS, wxNORMAL,
114                        wxNORMAL)                        wxNORMAL)
115    
116      def draw_raster_data(self, data, format = 'BMP'):      def projected_raster_layer(self, layer, srcProj, dstProj, extents,
117          stream = cStringIO.StringIO(data)                                 resolution, dimensions, options):
118          image = wxImageFromStream(stream, raster_format_map[format])  
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    
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 166  class ScreenRenderer(MapRenderer): Line 255  class ScreenRenderer(MapRenderer):
255    
256              # Get the size of the specific property for this              # Get the size of the specific property for this
257              # point              # point
258              if shapetype == SHAPETYPE_POINT:              if shapetype == SHAPETYPE_POINT and field is not None:
259                  value = table.ReadValue(shape.ShapeID(), field)                  value = table.ReadValue(shape.ShapeID(), field)
260                  group = lc.FindGroup(value)                  group = lc.FindGroup(value)
261                  size = group.GetProperties().GetSize()                  size = group.GetProperties().GetSize()
# Line 268  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.2431  
changed lines
  Added in v.2587

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26