/[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 535 by bh, Fri Mar 14 20:42:18 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            lc = layer.GetClassification()
83            field = lc.GetField()
84    
85            defaultProps = lc.GetDefaultGroup().GetProperties()
86    
87            for i in self.layer_ids(layer):
88                value = None
89    
90                if field is not None:
91                    try:
92                        record = layer.table.read_record(i)
93                        if record is not None:
94                            value = record[field]
95                    except:
96                        pass
97    
98                    #
99                    # if the above statements fail 'value' should
100                    # be null, at which point this call will
101                    # at least retreive the NullData
102                    #
103                    prop = lc.GetProperties(value)
104                else:
105                    prop = defaultProps
106    
107                # don't recreate new objects if they are the same as before
108                if prop != old_prop:
109                    old_prop = prop
110    
111                    if shapetype == SHAPETYPE_ARC:
112                        fill = Color.None
113                    else:
114                        fill = prop.GetFill()
115        
116                    if fill is Color.None:
117                        brush = wxTRANSPARENT_BRUSH
118                    else:
119                        color = Color2wxColour(fill)
120                        brush = wxBrush(color, wxSOLID)
121        
122                    stroke = prop.GetLineColor()
123                    stroke_width = prop.GetLineWidth()
124                    if stroke is Color.None:
125                        pen = wxTRANSPARENT_PEN
126                    else:
127                        color = Color2wxColour(stroke)
128                        pen = wxPen(color, stroke_width, wxSOLID)
129        
130                if shapetype == SHAPETYPE_POINT:
131                    self.dc.SetBrush(brush)
132                    self.dc.SetPen(pen)
133                    self.draw_point_shape(layer, i)
134                else:
135                  self.draw_polygon_shape(layer, i, pen, brush)                  self.draw_polygon_shape(layer, i, pen, brush)
136          else:  
137              self.dc.SetBrush(brush)      def layer_ids(self, layer):
138              self.dc.SetPen(pen)          """Return the shape ids of the given layer that have to be drawn.
139              if shapetype == SHAPETYPE_ARC:          
140                  f = self.draw_arc_shape          The default implementation simply returns all ids in the layer.
141              elif shapetype == SHAPETYPE_POINT:          Override in derived classes to be more precise.
142                  f = self.draw_point_shape          """
143              for i in range(layer.NumShapes()):          return range(layer.NumShapes())
                 f(layer, i)  
144    
145      def draw_polygon_shape(self, layer, index, pen, brush):      def draw_polygon_shape(self, layer, index, pen, brush):
146          offx, offy = self.offset                  offx, offy = self.offset        
# Line 183  class ScreenRenderer(MapRenderer): Line 226  class ScreenRenderer(MapRenderer):
226      # On the screen we want to see only visible layers by default      # On the screen we want to see only visible layers by default
227      honor_visibility = 1      honor_visibility = 1
228            
229      def RenderMap(self, map, selected_layer, selected_shape):      def RenderMap(self, map, region, selected_layer, selected_shapes):
230            """Render the map.
231    
232            Only the given region (a tuple in window coordinates as returned
233            by a wxrect's asTuple method) needs to be redrawn. Highlight the
234            shapes given by the ids in selected_shapes in the
235            selected_layer.
236            """
237            self.update_region = region
238          self.selected_layer = selected_layer          self.selected_layer = selected_layer
239          self.selected_shape = selected_shape          self.selected_shapes = selected_shapes
240          self.render_map(map)          self.render_map(map)
241    
242      def draw_shape_layer(self, layer):      def draw_shape_layer(self, layer):
243          MapRenderer.draw_shape_layer(self, layer)          MapRenderer.draw_shape_layer(self, layer)
244          if layer is self.selected_layer and self.selected_shape is not None:          if layer is self.selected_layer and self.selected_shapes:
245              pen = wxPen(wxBLACK, 3, wxSOLID)              pen = wxPen(wxBLACK, 3, wxSOLID)
246              brush = wxBrush(wxBLACK, wxCROSS_HATCH)              brush = wxBrush(wxBLACK, wxCROSS_HATCH)
247                
248              shapetype = layer.ShapeType()              shapetype = layer.ShapeType()
             index = self.selected_shape  
249              if shapetype == SHAPETYPE_POLYGON:              if shapetype == SHAPETYPE_POLYGON:
250                  self.draw_polygon_shape(layer, index, pen, brush)                  func = self.draw_polygon_shape
251              else:                  args = (pen, brush)
252                elif shapetype == SHAPETYPE_ARC:
253                    func = self.draw_polygon_shape
254                    args = (pen, None)
255                elif shapetype == SHAPETYPE_POINT:
256                  self.dc.SetBrush(brush)                  self.dc.SetBrush(brush)
257                  self.dc.SetPen(pen)                  self.dc.SetPen(pen)
258                  if shapetype == SHAPETYPE_ARC:                  func = self.draw_point_shape
259                      f = self.draw_arc_shape                  args = ()
260                  elif shapetype == SHAPETYPE_POINT:              else:
261                      f = self.draw_point_shape                  raise TypeError(_("Unhandled shape type %s") % shapetype)
262                  f(layer, index)  
263                for index in self.selected_shapes:
264                    func(layer, index, *args)
265    
266        def layer_ids(self, layer):
267            """Return the shapeids covered by the region that has to be redrawn
268    
269            Call the layer's ShapesInRegion method to determine the ids so
270            that it can use the quadtree.
271            """
272            # FIXME: the quad-tree should be built from the projected
273            # coordinates not the lat-long ones because it's not trivial to
274            # determine an appropriate rectangle in lat-long for a given
275            # rectangle in projected coordinates which we have to start from
276            # here.
277            proj = self.map.projection
278            if proj is not None:
279                inverse = proj.Inverse
280            else:
281                inverse = None
282    
283            scale = self.scale
284            offx, offy = self.offset
285            xs = []
286            ys = []
287            x, y, width, height = self.update_region
288            for winx, winy in ((x, y), (x + width, y),
289                               (x + width, y + height), (x, y + height)):
290                px = (winx - offx) / scale
291                py = -(winy - offy) / scale
292                if inverse:
293                    px, py = inverse(px, py)
294                xs.append(px)
295                ys.append(py)
296            left = min(xs)
297            right = max(xs)
298            top = max(ys)
299            bottom = min(ys)
300    
301            return layer.ShapesInRegion((left, bottom, right, top))
302    
303    
304  class PrinterRender(MapRenderer):  class PrinterRender(MapRenderer):

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26