/[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 909 by frank, Fri May 16 16:23:12 2003 UTC revision 1298 by jonathan, Tue Jun 24 18:00:26 2003 UTC
# Line 9  Line 9 
9    
10  __version__ = "$Revision$"  __version__ = "$Revision$"
11    
12    import cStringIO
13    
14  from Thuban import _  from Thuban import _
15    
16  from wxPython.wx import wxMemoryDC, wxEmptyBitmap, \  from wxPython.wx import wxMemoryDC, wxEmptyBitmap, \
17      wxPoint, wxRect, wxPen, wxBrush, wxFont, \      wxPoint, wxRect, wxPen, wxBrush, wxFont, \
18      wxTRANSPARENT_PEN, wxTRANSPARENT_BRUSH, \      wxTRANSPARENT_PEN, wxTRANSPARENT_BRUSH, \
19      wxBLACK_PEN, wxRED_PEN, wxBLACK, wxSOLID, wxCROSS_HATCH, wxSWISS, wxNORMAL      wxBLACK_PEN, wxRED_PEN, wxBLACK, \
20        wxSOLID, wxCROSS_HATCH, wxSWISS, wxNORMAL, \
21        wxBitmap, wxImageFromBitmap, wxBitmapFromImage, \
22        wxImageFromStream, wxBITMAP_TYPE_BMP
23    
24  from wxproj import draw_polygon_shape, draw_polygon_init  from wxproj import draw_polygon_shape, draw_polygon_init
25    
# Line 22  from Thuban.UI.common import Color2wxCol Line 27  from Thuban.UI.common import Color2wxCol
27  from Thuban.UI.classifier import ClassDataPreviewer  from Thuban.UI.classifier import ClassDataPreviewer
28  from Thuban.UI.scalebar import ScaleBar  from Thuban.UI.scalebar import ScaleBar
29    
30  from Thuban.Model.layer import SHAPETYPE_POLYGON, SHAPETYPE_ARC, \  from Thuban.Model.layer import Layer, RasterLayer, \
31       SHAPETYPE_POINT       SHAPETYPE_POLYGON, SHAPETYPE_ARC, SHAPETYPE_POINT
32  from Thuban.Model.label import ALIGN_CENTER, ALIGN_TOP, ALIGN_BOTTOM, \  from Thuban.Model.label import ALIGN_CENTER, ALIGN_TOP, ALIGN_BOTTOM, \
33       ALIGN_LEFT, ALIGN_RIGHT, ALIGN_BASELINE       ALIGN_LEFT, ALIGN_RIGHT, ALIGN_BASELINE
34    
35  from Thuban.Model.classification import Classification  from Thuban.Model.classification import Classification
36  from Thuban.Model.color import Color  from Thuban.Model.color import Color
37    import Thuban.Model.resource
38    
39    if Thuban.Model.resource.has_gdal_support():
40        from gdalwarp import ProjectRasterFile
41    
42  class MapRenderer:  class MapRenderer:
43    
# Line 64  class MapRenderer: Line 73  class MapRenderer:
73    
74      def render_map(self, map):      def render_map(self, map):
75          self.map = map          self.map = map
76            seenRaster = True
77    
78            if self.scale == 0:
79                return
80    
81            #
82            # This is only a good optimization if there is only one
83            # raster layer and the image covers the entire window (as
84            # it currently does). We note if there is a raster layer
85            # and only begin drawing layers once we have drawn it.
86            # That way we avoid drawing layers that won't be seen.
87            #
88            if Thuban.Model.resource.has_gdal_support():
89                for layer in map.Layers():
90                    if isinstance(layer, RasterLayer) and layer.Visible():
91                        seenRaster = False
92                        break
93    
94          for layer in map.Layers():          for layer in map.Layers():
95              # if honor_visibility is true, only draw visible layers,              # if honor_visibility is true, only draw visible layers,
96              # otherwise draw all layers              # otherwise draw all layers
97              if not self.honor_visibility or layer.Visible():              if not self.honor_visibility or layer.Visible():
98                  self.draw_shape_layer(layer)                  if isinstance(layer, Layer) and seenRaster:
99                        self.draw_shape_layer(layer)
100                    elif isinstance(layer, RasterLayer) \
101                        and Thuban.Model.resource.has_gdal_support():
102                        self.draw_raster_layer(layer)
103                        seenRaster = True
104    
105          self.draw_label_layer(map.LabelLayer())          self.draw_label_layer(map.LabelLayer())
106    
107      def draw_shape_layer(self, layer):      def draw_shape_layer(self, layer):
# Line 99  class MapRenderer: Line 132  class MapRenderer:
132          else:          else:
133              draw_func = lambda i: \              draw_func = lambda i: \
134                     self.draw_polygon_shape(polygon_render_param, i, pen, brush)                     self.draw_polygon_shape(polygon_render_param, i, pen, brush)
135                
136            table = layer.ShapeStore().Table()
137          for i in self.layer_ids(layer):          for i in self.layer_ids(layer):
138    
139              if field is None:              if field is None:
140                  group = defaultGroup                  group = defaultGroup
141              else:              else:
142                  record = layer.table.ReadRowAsDict(i)                  record = table.ReadRowAsDict(i)
143                  assert record is not None                  assert record is not None
144                  group = lc.FindGroup(record[field])                  group = lc.FindGroup(record[field])
145    
# Line 149  class MapRenderer: Line 183  class MapRenderer:
183    
184              draw_func(i)              draw_func(i)
185    
186        def draw_raster_layer(self, layer):
187            data = None
188            offx, offy = self.offset
189            width, height = self.dc.GetSizeTuple()
190    
191            inProj = ""
192            proj = layer.GetProjection()
193            if proj is not None:
194                for p in proj.GetAllParameters():
195                    inProj += "+" + p + " "
196    
197            outProj = ""
198            proj = self.map.GetProjection()
199            if proj is not None:
200                for p in proj.GetAllParameters():
201                    outProj += "+" + p + " "
202    
203            xmin = (0 - offx) / self.scale
204            ymin = (offy - height) / self.scale
205            xmax = (width - offx) / self.scale
206            ymax = (offy - 0) / self.scale
207    
208            try:
209                data = ProjectRasterFile(
210                    layer.GetImageFilename(),
211                    inProj,
212                    outProj,
213                    (xmin, ymin, xmax, ymax),
214                    "", (width, height))
215            except IOError, (strerr):
216                print strerr
217            except (AttributeError, ValueError):
218                pass
219            else:
220                if data is not None:
221                    stream = cStringIO.StringIO(data)
222                    image = wxImageFromStream(stream, wxBITMAP_TYPE_BMP)
223                    bitmap = wxBitmapFromImage(image)
224                    self.dc.BeginDrawing()
225                    self.dc.DrawBitmap(bitmap, 0, 0)
226                    self.dc.EndDrawing()
227    
228      def layer_ids(self, layer):      def layer_ids(self, layer):
229          """Return the shape ids of the given layer that have to be drawn.          """Return the shape ids of the given layer that have to be drawn.
230    
# Line 160  class MapRenderer: Line 236  class MapRenderer:
236      def polygon_render_param(self, layer):      def polygon_render_param(self, layer):
237          """Return the low-lever render parameter for the layer"""          """Return the low-lever render parameter for the layer"""
238          offx, offy = self.offset          offx, offy = self.offset
239          return draw_polygon_init(layer.shapefile, self.dc,          return draw_polygon_init(layer.ShapeStore().Shapefile(), self.dc,
240                                   self.map.projection,                                   self.map.projection,
241                                   layer.projection,                                   layer.projection,
242                                   self.scale, -self.scale,                                   self.scale, -self.scale,
# Line 444  class ExportRenderer(ScreenRenderer): Line 520  class ExportRenderer(ScreenRenderer):
520                      # Render title                      # Render title
521                      dc.DrawText(l.Title(), posx, posy)                      dc.DrawText(l.Title(), posx, posy)
522                      posy+=stepy                      posy+=stepy
523                      # Render classification                      if l.HasClassification():
524                      clazz = l.GetClassification()                          # Render classification
525                      shapeType = l.ShapeType()                          clazz = l.GetClassification()
526                      for g in clazz:                          shapeType = l.ShapeType()
527                          if g.IsVisible():                          for g in clazz:
528                              previewer.Draw(dc,                              if g.IsVisible():
529                                  wxRect(posx+dx, posy, iconwidth, iconheight),                                  previewer.Draw(dc,
530                                  g.GetProperties(), shapeType)                                      wxRect(posx+dx, posy,
531                              dc.DrawText(g.GetDisplayText(),                                             iconwidth, iconheight),
532                                          posx+2*dx+iconwidth, posy)                                      g.GetProperties(), shapeType)
533                              posy+=stepy                                  dc.DrawText(g.GetDisplayText(),
534                                                posx+2*dx+iconwidth, posy)
535                                    posy+=stepy
536                    
537      def render_scalebar(self, map):      def render_scalebar(self, map):
538          """Render the scalebar."""          """Render the scalebar."""

Legend:
Removed from v.909  
changed lines
  Added in v.1298

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26