/[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 1467 by jonathan, Tue Jul 22 14:02:57 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 Transparent
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            self.dc.BeginDrawing()
79    
80            #
81            # This is only a good optimization if there is only one
82            # raster layer and the image covers the entire window (as
83            # it currently does). We note if there is a raster layer
84            # and only begin drawing layers once we have drawn it.
85            # That way we avoid drawing layers that won't be seen.
86            #
87            if Thuban.Model.resource.has_gdal_support():
88                for layer in map.Layers():
89                    if isinstance(layer, RasterLayer) and layer.Visible():
90                        seenRaster = False
91                        break
92    
93          for layer in map.Layers():          for layer in map.Layers():
94              # if honor_visibility is true, only draw visible layers,              # if honor_visibility is true, only draw visible layers,
95              # otherwise draw all layers              # otherwise draw all layers
96              if not self.honor_visibility or layer.Visible():              if not self.honor_visibility or layer.Visible():
97                  self.draw_shape_layer(layer)                  if isinstance(layer, Layer) and seenRaster:
98                        self.draw_shape_layer(layer)
99                    elif isinstance(layer, RasterLayer) \
100                        and Thuban.Model.resource.has_gdal_support():
101                        self.draw_raster_layer(layer)
102                        seenRaster = True
103    
104          self.draw_label_layer(map.LabelLayer())          self.draw_label_layer(map.LabelLayer())
105    
106            self.dc.EndDrawing()
107    
108      def draw_shape_layer(self, layer):      def draw_shape_layer(self, layer):
109          scale = self.scale          scale = self.scale
110          offx, offy = self.offset          offx, offy = self.offset
# Line 86  class MapRenderer: Line 120  class MapRenderer:
120          old_prop = None          old_prop = None
121          old_group = None          old_group = None
122          lc = layer.GetClassification()          lc = layer.GetClassification()
123          field = lc.GetField()          field = layer.GetClassificationColumn()
124          defaultGroup = lc.GetDefaultGroup()          defaultGroup = lc.GetDefaultGroup()
125    
126    
         if shapetype != SHAPETYPE_POINT:  
             polygon_render_param = self.polygon_render_param(layer)  
127    
128          if shapetype == SHAPETYPE_POINT:          if shapetype == SHAPETYPE_POINT:
129              draw_func = lambda i: \              draw_func = self.draw_point_shape
130                     self.draw_point_shape(layer, i)              draw_func_param = layer
131          else:          else:
132              draw_func = lambda i: \              draw_func = draw_polygon_shape
133                     self.draw_polygon_shape(polygon_render_param, i, pen, brush)              draw_func_param = self.polygon_render_param(layer)
134                
135            table = layer.ShapeStore().Table()
136          for i in self.layer_ids(layer):          for i in self.layer_ids(layer):
137    
138              if field is None:              if field is None:
139                  group = defaultGroup                  group = defaultGroup
140              else:              else:
141                  record = layer.table.ReadRowAsDict(i)                  record = table.ReadRowAsDict(i)
142                  assert record is not None                  assert record is not None
143                  group = lc.FindGroup(record[field])                  group = lc.FindGroup(record[field])
144    
# Line 124  class MapRenderer: Line 157  class MapRenderer:
157                      old_prop = prop                      old_prop = prop
158    
159                      if shapetype == SHAPETYPE_ARC:                      if shapetype == SHAPETYPE_ARC:
160                          fill = Color.Transparent                          fill = Transparent
161                      else:                      else:
162                          fill = prop.GetFill()                          fill = prop.GetFill()
163    
164    
165                      if fill is Color.Transparent:                      if fill is Transparent:
166                          brush = wxTRANSPARENT_BRUSH                          brush = wxTRANSPARENT_BRUSH
167                      else:                      else:
168                          color = Color2wxColour(fill)                          color = Color2wxColour(fill)
# Line 137  class MapRenderer: Line 170  class MapRenderer:
170    
171                      stroke = prop.GetLineColor()                      stroke = prop.GetLineColor()
172                      stroke_width = prop.GetLineWidth()                      stroke_width = prop.GetLineWidth()
173                      if stroke is Color.Transparent:                      if stroke is Transparent:
174                          pen = wxTRANSPARENT_PEN                          pen = wxTRANSPARENT_PEN
175                      else:                      else:
176                          color = Color2wxColour(stroke)                          color = Color2wxColour(stroke)
177                          pen = wxPen(color, stroke_width, wxSOLID)                          pen = wxPen(color, stroke_width, wxSOLID)
178    
179                      if shapetype == SHAPETYPE_POINT:              draw_func(draw_func_param, i, pen, brush)
                         self.dc.SetBrush(brush)  
                         self.dc.SetPen(pen)  
180    
181              draw_func(i)      def draw_raster_layer(self, layer):
182            data = None
183            offx, offy = self.offset
184            width, height = self.dc.GetSizeTuple()
185    
186            inProj = ""
187            proj = layer.GetProjection()
188            if proj is not None:
189                for p in proj.GetAllParameters():
190                    inProj += "+" + p + " "
191    
192            outProj = ""
193            proj = self.map.GetProjection()
194            if proj is not None:
195                for p in proj.GetAllParameters():
196                    outProj += "+" + p + " "
197    
198            xmin = (0 - offx) / self.scale
199            ymin = (offy - height) / self.scale
200            xmax = (width - offx) / self.scale
201            ymax = (offy - 0) / self.scale
202    
203            try:
204                data = ProjectRasterFile(
205                    layer.GetImageFilename(),
206                    inProj,
207                    outProj,
208                    (xmin, ymin, xmax, ymax),
209                    "", (width, height))
210            except IOError, (strerr):
211                print strerr
212            except (AttributeError, ValueError):
213                pass
214            else:
215                if data is not None:
216                    stream = cStringIO.StringIO(data)
217                    image = wxImageFromStream(stream, wxBITMAP_TYPE_BMP)
218                    bitmap = wxBitmapFromImage(image)
219                    self.dc.DrawBitmap(bitmap, 0, 0)
220    
221      def layer_ids(self, layer):      def layer_ids(self, layer):
222          """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.
# Line 160  class MapRenderer: Line 229  class MapRenderer:
229      def polygon_render_param(self, layer):      def polygon_render_param(self, layer):
230          """Return the low-lever render parameter for the layer"""          """Return the low-lever render parameter for the layer"""
231          offx, offy = self.offset          offx, offy = self.offset
232          return draw_polygon_init(layer.shapefile, self.dc,          return draw_polygon_init(layer.ShapeStore().Shapefile(), self.dc,
233                                   self.map.projection,                                   self.map.projection,
234                                   layer.projection,                                   layer.projection,
235                                   self.scale, -self.scale,                                   self.scale, -self.scale,
# Line 197  class MapRenderer: Line 266  class MapRenderer:
266          points = self.projected_points(layer, index)          points = self.projected_points(layer, index)
267          self.dc.DrawLines(points)          self.dc.DrawLines(points)
268    
269      def draw_point_shape(self, layer, index):      def draw_point_shape(self, layer, index, pen, brush):
270          pp = self.projected_points(layer, index)          pp = self.projected_points(layer, index)
271    
272          if len(pp) == 0: return # ignore Null Shapes which have no points          if len(pp) == 0: return # ignore Null Shapes which have no points
273    
274          p = pp[0]          p = pp[0]
275          radius = self.resolution * 5          radius = self.resolution * 5
276            self.dc.SetBrush(brush)
277            self.dc.SetPen(pen)
278          self.dc.DrawEllipse(p.x - radius, p.y - radius, 2*radius, 2*radius)          self.dc.DrawEllipse(p.x - radius, p.y - radius, 2*radius, 2*radius)
279    
280      def draw_label_layer(self, layer):      def draw_label_layer(self, layer):
# Line 284  class ScreenRenderer(MapRenderer): Line 355  class ScreenRenderer(MapRenderer):
355                  self.dc.SetBrush(brush)                  self.dc.SetBrush(brush)
356                  self.dc.SetPen(pen)                  self.dc.SetPen(pen)
357                  func = self.draw_point_shape                  func = self.draw_point_shape
358                  args = ()                  args = (pen, brush)
359              else:              else:
360                  raise TypeError(_("Unhandled shape type %s") % shapetype)                  raise TypeError(_("Unhandled shape type %s") % shapetype)
361    
362              for index in self.selected_shapes:              for index in self.selected_shapes:
363                  func(renderparam, index, *args)                  func(renderparam, index, *args)
364    
   
365      def layer_ids(self, layer):      def layer_ids(self, layer):
366          """Return the shapeids covered by the region that has to be redrawn          """Return the shapeids covered by the region that has to be redrawn
367    
# Line 439  class ExportRenderer(ScreenRenderer): Line 509  class ExportRenderer(ScreenRenderer):
509          # Render the legend          # Render the legend
510          dc.SetTextForeground(wxBLACK)          dc.SetTextForeground(wxBLACK)
511          if map.HasLayers():          if map.HasLayers():
512              for l in map.Layers():              layers = map.Layers()
513                layers.reverse()
514                for l in layers:
515                  if l.Visible():                  if l.Visible():
516                      # Render title                      # Render title
517                      dc.DrawText(l.Title(), posx, posy)                      dc.DrawText(l.Title(), posx, posy)
518                      posy+=stepy                      posy+=stepy
519                      # Render classification                      if l.HasClassification():
520                      clazz = l.GetClassification()                          # Render classification
521                      shapeType = l.ShapeType()                          clazz = l.GetClassification()
522                      for g in clazz:                          shapeType = l.ShapeType()
523                          if g.IsVisible():                          for g in clazz:
524                              previewer.Draw(dc,                              if g.IsVisible():
525                                  wxRect(posx+dx, posy, iconwidth, iconheight),                                  previewer.Draw(dc,
526                                  g.GetProperties(), shapeType)                                      wxRect(posx+dx, posy,
527                              dc.DrawText(g.GetDisplayText(),                                             iconwidth, iconheight),
528                                          posx+2*dx+iconwidth, posy)                                      g.GetProperties(), shapeType)
529                              posy+=stepy                                  dc.DrawText(g.GetDisplayText(),
530                                                posx+2*dx+iconwidth, posy)
531                                    posy+=stepy
532                    
533      def render_scalebar(self, map):      def render_scalebar(self, map):
534          """Render the scalebar."""          """Render the scalebar."""

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26