/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/baserenderer.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/baserenderer.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1914 by bh, Mon Nov 3 14:17:51 2003 UTC revision 2278 by bh, Tue Jul 13 11:07:45 2004 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001, 2002, 2003 by Intevation GmbH  # Copyright (c) 2001, 2002, 2003, 2004 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4  # Jonathan Coles <[email protected]>  # Jonathan Coles <[email protected]>
# Line 20  __version__ = "$Revision$" Line 20  __version__ = "$Revision$"
20  # $Source$  # $Source$
21  # $Id$  # $Id$
22    
23    import sys
24  import traceback  import traceback
25    
26  from Thuban.Model.layer import Layer, RasterLayer  from Thuban.Model.layer import Layer, RasterLayer
# Line 33  if Thuban.Model.resource.has_gdal_suppor Line 34  if Thuban.Model.resource.has_gdal_suppor
34      from gdalwarp import ProjectRasterFile      from gdalwarp import ProjectRasterFile
35    
36    
37    #
38    #       Renderer Extensions
39    #
40    # The renderer extensions provide a way to render layer types defined in
41    # Thuban extensions. The renderer extensions are stored as a list with
42    # (layer_class, draw_function) pairs. If the renderer has to draw a
43    # non-builtin layer type, i.e. a layer that is not a subclass of Layer
44    # or RasterLayer, it iterates through that list, tests whether the layer
45    # to be drawn is an instance of layer_class and if so calls
46    # draw_function with the renderer and the layer as arguments. Since
47    # drawing is done incrementally, the draw_function should return an
48    # iterable. The easiest way is to simply implement the draw_function as
49    # a generator and to yield in suitable places, or to return the empty
50    # tuple.
51    #
52    # New renderer extensions should be added with add_renderer_extension().
53    # If necessary the extensions list can be reset with
54    # init_renderer_extensions().
55    
56    _renderer_extensions = []
57    
58    def add_renderer_extension(layer_class, function):
59        """Add a renderer extension for the layer class layer_class
60    
61        When an instance of layer_class is to be drawn by the renderer the
62        renderer will call function with the renderer and the layer_class
63        instance as arguments. Since drawing is done incrementally, the
64        function should return an iterable. The easiest way is to simply
65        implement the draw_function as a generator and to yield True in
66        suitable places, or to return the empty tuple if it's not possible
67        to do the rendering incrementally.
68        """
69        _renderer_extensions.append((layer_class, function))
70    
71    def init_renderer_extensions():
72        """(Re)initialize the list of renderer extensions
73    
74        Calling this function outside of the test suite is probably not
75        useful.
76        """
77        del _renderer_extensions[:]
78    
79    
80    #
81    #       Base Renderer
82    #
83    
84  class BaseRenderer:  class BaseRenderer:
85    
86      """Basic Renderer Infrastructure for Thuban Maps      """Basic Renderer Infrastructure for Thuban Maps
# Line 150  class BaseRenderer: Line 198  class BaseRenderer:
198              # if honor_visibility is true, only draw visible layers,              # if honor_visibility is true, only draw visible layers,
199              # otherwise draw all layers              # otherwise draw all layers
200              if not self.honor_visibility or layer.Visible():              if not self.honor_visibility or layer.Visible():
201                  if isinstance(layer, Layer) and seenRaster:                  if isinstance(layer, Layer):
202                      for i in self.draw_shape_layer_incrementally(layer):                      if seenRaster:
203                          yield True                          for i in self.draw_shape_layer_incrementally(layer):
204                                yield True
205                  elif isinstance(layer, RasterLayer) \                  elif isinstance(layer, RasterLayer) \
206                      and Thuban.Model.resource.has_gdal_support():                      and Thuban.Model.resource.has_gdal_support():
207                      self.draw_raster_layer(layer)                      self.draw_raster_layer(layer)
208                      seenRaster = True                      seenRaster = True
209                      yield True                      yield True
210                    else:
211                        # look it up in the renderer extensions
212                        for cls, func in _renderer_extensions:
213                            if isinstance(layer, cls):
214                                for i in func(self, layer):
215                                    yield True
216                                break
217                        else:
218                            # No renderer found. Print a message about it
219                            print >>sys.stderr, ("Drawing layer %r not supported"
220                                                 % layer)
221                yield True
222    
223          self.draw_label_layer(self.map.LabelLayer())          self.draw_label_layer(self.map.LabelLayer())
224          yield False          yield False
# Line 212  class BaseRenderer: Line 273  class BaseRenderer:
273              if field is None:              if field is None:
274                  group = defaultGroup                  group = defaultGroup
275              else:              else:
276                  value = table.ReadRowAsDict(shape.ShapeID())[field]                  value = table.ReadValue(shape.ShapeID(), field)
277                  group = lc.FindGroup(value)                  group = lc.FindGroup(value)
278    
279              if not group.IsVisible():              if not group.IsVisible():
# Line 374  class BaseRenderer: Line 435  class BaseRenderer:
435          if not points:          if not points:
436              return              return
437    
438          radius = self.resolution * 5          radius = int(round(self.resolution * 5))
439          self.dc.SetBrush(brush)          self.dc.SetBrush(brush)
440          self.dc.SetPen(pen)          self.dc.SetPen(pen)
441          for part in points:          for part in points:
# Line 422  class BaseRenderer: Line 483  class BaseRenderer:
483              # better.              # better.
484              traceback.print_exc()              traceback.print_exc()
485          else:          else:
486              self.draw_raster_data(data)              self.draw_raster_data(data, "BMP")
487    
488      def draw_raster_data(self, data):      def draw_raster_data(self, data, format="BMP"):
489          """Draw the raster image in data onto the DC          """Draw the raster image in data onto the DC
490    
491          The raster image data is a string holding the data in BMP          The raster image data is a string holding the data in the format
492          format. The data is exactly the size of the dc and covers it          indicated by the format parameter. The image is assumed to be
493          completely.          exactly the size of the dc and to cover it completely.
494    
495            The format parameter is a string with the name of the format.
496            The following format names should be used:
497    
498              'BMP' -- Windows Bitmap
499              'JPEG' -- Jpeg
500    
501            The default format is 'bmp'.
502    
503          This method has to be implemented by derived classes.          This method has to be implemented by derived classes. The
504            implementation in the derived class should try to support at
505            least the formats specified above and may support more.
506          """          """
507          raise NotImplementedError          raise NotImplementedError
508    
# Line 461  class BaseRenderer: Line 532  class BaseRenderer:
532              text = label.text              text = label.text
533              if forward:              if forward:
534                  x, y = forward(x, y)                  x, y = forward(x, y)
535              x = x * scale + offx              x = int(round(x * scale + offx))
536              y = -y * scale + offy              y = int(round(-y * scale + offy))
537              width, height = self.dc.GetTextExtent(text)              width, height = self.dc.GetTextExtent(text)
538              if label.halign == ALIGN_LEFT:              if label.halign == ALIGN_LEFT:
539                  # nothing to be done                  # nothing to be done

Legend:
Removed from v.1914  
changed lines
  Added in v.2278

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26