/[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 6 by bh, Tue Aug 28 15:41:52 2001 UTC revision 432 by jonathan, Mon Feb 24 18:47:36 2003 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001 by Intevation GmbH  # Copyright (c) 2001, 2002, 2003 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4    # Jonathan Coles <[email protected]>
5  #  #
6  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
7  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
# Line 13  from wxPython.wx import wxPoint, wxColou Line 14  from wxPython.wx import wxPoint, wxColou
14    
15  from wxproj import draw_polygon_shape  from wxproj import draw_polygon_shape
16    
17    from Thuban import _
18    
19  from Thuban.Model.layer import SHAPETYPE_POLYGON, SHAPETYPE_ARC, \  from Thuban.Model.layer import SHAPETYPE_POLYGON, SHAPETYPE_ARC, \
20       SHAPETYPE_POINT       SHAPETYPE_POINT
21  from Thuban.Model.label import ALIGN_CENTER, ALIGN_TOP, ALIGN_BOTTOM, \  from Thuban.Model.label import ALIGN_CENTER, ALIGN_TOP, ALIGN_BOTTOM, \
22       ALIGN_LEFT, ALIGN_RIGHT, ALIGN_BASELINE       ALIGN_LEFT, ALIGN_RIGHT, ALIGN_BASELINE
23    
24    from Thuban.Model.classification import Classification
25    from Thuban.Model.color import Color
26    
27    
28  class MapRenderer:  class MapRenderer:
29    
# Line 63  class MapRenderer: Line 69  class MapRenderer:
69          scale = self.scale          scale = self.scale
70          offx, offy = self.offset          offx, offy = self.offset
71    
         fill = layer.fill  
         if fill is None:  
             brush = wxTRANSPARENT_BRUSH  
         else:  
             color = wxColour(fill.red * 255,  
                              fill.green * 255,  
                              fill.blue * 255)  
             brush = wxBrush(color, wxSOLID)  
         stroke = layer.stroke  
         if stroke is None:  
             pen = wxTRANSPARENT_PEN  
         else:  
             color = wxColour(stroke.red * 255,  
                              stroke.green * 255,  
                              stroke.blue * 255)  
             pen = wxPen(color, 1, wxSOLID)  
   
72          map_proj = self.map.projection          map_proj = self.map.projection
73          layer_proj = layer.projection          layer_proj = layer.projection
74    
75          shapetype = layer.ShapeType()          shapetype = layer.ShapeType()
76    
77          if shapetype == SHAPETYPE_POLYGON:          brush = wxTRANSPARENT_BRUSH
78              for i in range(layer.NumShapes()):          pen   = wxTRANSPARENT_PEN
79    
80            old_prop = None
81            for i in self.layer_ids(layer):
82                value = None
83                lc = layer.GetClassification()
84                field = lc.field
85    
86                if field is not None:
87                    record = layer.table.read_record(i)
88                    if record is not None:
89                        value = record[field]
90    
91                #
92                # if the above statements fail 'value' should
93                # be null, at which point this call will
94                # at least retreive the NullData
95                #
96                prop = lc.GetClassData(value)
97    
98                if prop != old_prop:
99                    old_prop = prop
100    
101                    if shapetype == SHAPETYPE_ARC:
102                        fill = Color.None
103                    else:
104                        fill = prop.GetFill()
105        
106                    if fill is Color.None:
107                        brush = wxTRANSPARENT_BRUSH
108                    else:
109                        color = wxColour(fill.red * 255,
110                                         fill.green * 255,
111                                         fill.blue * 255)
112                        brush = wxBrush(color, wxSOLID)
113        
114                    stroke = prop.GetStroke()
115                    stroke_width = prop.GetStrokeWidth()
116                    if stroke is Color.None:
117                        pen = wxTRANSPARENT_PEN
118                    else:
119                        color = wxColour(stroke.red * 255,
120                                         stroke.green * 255,
121                                         stroke.blue * 255)
122                        pen = wxPen(color, stroke_width, wxSOLID)
123        
124                if shapetype == SHAPETYPE_POINT:
125                    self.dc.SetBrush(brush)
126                    self.dc.SetPen(pen)
127                    self.draw_point_shape(layer, i)
128                else:
129                  self.draw_polygon_shape(layer, i, pen, brush)                  self.draw_polygon_shape(layer, i, pen, brush)
130          else:  
131              self.dc.SetBrush(brush)      def layer_ids(self, layer):
132              self.dc.SetPen(pen)          """Return the shape ids of the given layer that have to be drawn.
133              if shapetype == SHAPETYPE_ARC:          
134                  f = self.draw_arc_shape          The default implementation simply returns all ids in the layer.
135              elif shapetype == SHAPETYPE_POINT:          Override in derived classes to be more precise.
136                  f = self.draw_point_shape          """
137              for i in range(layer.NumShapes()):          return range(layer.NumShapes())
                 f(layer, i)  
138    
139      def draw_polygon_shape(self, layer, index, pen, brush):      def draw_polygon_shape(self, layer, index, pen, brush):
140          offx, offy = self.offset                  offx, offy = self.offset        
# Line 182  class ScreenRenderer(MapRenderer): Line 220  class ScreenRenderer(MapRenderer):
220      # On the screen we want to see only visible layers by default      # On the screen we want to see only visible layers by default
221      honor_visibility = 1      honor_visibility = 1
222            
223      def RenderMap(self, map, selected_layer, selected_shape):      def RenderMap(self, map, region, selected_layer, selected_shape):
224            """Render the map.
225    
226            Only the given region (a tuple in window coordinates as returned
227            by a wxrect's asTuple method) needs to be redrawn. Highlight the
228            shape with id selected_shape in the selected_layer.
229            """
230            self.update_region = region
231          self.selected_layer = selected_layer          self.selected_layer = selected_layer
232          self.selected_shape = selected_shape          self.selected_shape = selected_shape
233          self.render_map(map)          self.render_map(map)
# Line 197  class ScreenRenderer(MapRenderer): Line 242  class ScreenRenderer(MapRenderer):
242              index = self.selected_shape              index = self.selected_shape
243              if shapetype == SHAPETYPE_POLYGON:              if shapetype == SHAPETYPE_POLYGON:
244                  self.draw_polygon_shape(layer, index, pen, brush)                  self.draw_polygon_shape(layer, index, pen, brush)
245                elif shapetype == SHAPETYPE_ARC:
246                    self.draw_polygon_shape(layer, index, pen, None)
247              else:              else:
248                  self.dc.SetBrush(brush)                  self.dc.SetBrush(brush)
249                  self.dc.SetPen(pen)                  self.dc.SetPen(pen)
250                  if shapetype == SHAPETYPE_ARC:                  if shapetype == SHAPETYPE_POINT:
251                      f = self.draw_arc_shape                      self.draw_point_shape(layer, index)
252                  elif shapetype == SHAPETYPE_POINT:                  else:
253                      f = self.draw_point_shape                      raise TypeError(_("Unhandled shape type %s") % shapetype)
254                  f(layer, index)  
255        def layer_ids(self, layer):
256            """Return the shapeids covered by the region that has to be redrawn
257    
258            Call the layer's ShapesInRegion method to determine the ids so
259            that it can use the quadtree.
260            """
261            # FIXME: the quad-tree should be built from the projected
262            # coordinates not the lat-long ones because it's not trivial to
263            # determine an appropriate rectangle in lat-long for a given
264            # rectangle in projected coordinates which we have to start from
265            # here.
266            proj = self.map.projection
267            if proj is not None:
268                inverse = proj.Inverse
269            else:
270                inverse = None
271    
272            scale = self.scale
273            offx, offy = self.offset
274            xs = []
275            ys = []
276            x, y, width, height = self.update_region
277            for winx, winy in ((x, y), (x + width, y),
278                               (x + width, y + height), (x, y + height)):
279                px = (winx - offx) / scale
280                py = -(winy - offy) / scale
281                if inverse:
282                    px, py = inverse(px, py)
283                xs.append(px)
284                ys.append(py)
285            left = min(xs)
286            right = max(xs)
287            top = max(ys)
288            bottom = min(ys)
289    
290            return layer.ShapesInRegion((left, bottom, right, top))
291    
292    
293  class PrinterRender(MapRenderer):  class PrinterRender(MapRenderer):

Legend:
Removed from v.6  
changed lines
  Added in v.432

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26