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

Legend:
Removed from v.76  
changed lines
  Added in v.442

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26