/[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 641 by jonathan, Thu Apr 10 14:36:19 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.
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 41  class MapRenderer: Line 48  class MapRenderer:
48                  the renderer's default.                  the renderer's default.
49          """          """
50          # resolution in pixel/inch          # resolution in pixel/inch
51    
52            assert scale > 0
53    
54          self.dc = dc          self.dc = dc
55          self.scale = scale          self.scale = scale
56          self.offset = offset          self.offset = offset
# Line 63  class MapRenderer: Line 73  class MapRenderer:
73          scale = self.scale          scale = self.scale
74          offx, offy = self.offset          offx, offy = self.offset
75    
         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)  
   
76          map_proj = self.map.projection          map_proj = self.map.projection
77          layer_proj = layer.projection          layer_proj = layer.projection
78    
79          shapetype = layer.ShapeType()          shapetype = layer.ShapeType()
80    
81          if shapetype == SHAPETYPE_POLYGON:          brush = wxTRANSPARENT_BRUSH
82              for i in range(layer.NumShapes()):          pen   = wxTRANSPARENT_PEN
83    
84            old_prop = None
85            lc = layer.GetClassification()
86            field = lc.GetField()
87    
88            defaultProps = lc.GetDefaultGroup().GetProperties()
89    
90            for i in self.layer_ids(layer):
91                value = None
92    
93                if field is not None:
94                    try:
95                        record = layer.table.read_record(i)
96                        if record is not None:
97                            value = record[field]
98                    except:
99                        pass
100    
101                    #
102                    # if the above statements fail 'value' should
103                    # be null, at which point this call will
104                    # at least retreive the NullData
105                    #
106    
107                    group = lc.FindGroup(value)
108                    if not group.IsVisible():
109                        continue
110    
111                    #prop = lc.GetProperties(value)
112                    prop = group.GetProperties()
113                else:
114                    prop = defaultProps
115    
116                # don't recreate new objects if they are the same as before
117                if prop != old_prop:
118                    old_prop = prop
119    
120                    if shapetype == SHAPETYPE_ARC:
121                        fill = Color.Transparent
122                    else:
123                        fill = prop.GetFill()
124        
125                    if fill is Color.Transparent:
126                        brush = wxTRANSPARENT_BRUSH
127                    else:
128                        color = Color2wxColour(fill)
129                        brush = wxBrush(color, wxSOLID)
130        
131                    stroke = prop.GetLineColor()
132                    stroke_width = prop.GetLineWidth()
133                    if stroke is Color.Transparent:
134                        pen = wxTRANSPARENT_PEN
135                    else:
136                        color = Color2wxColour(stroke)
137                        pen = wxPen(color, stroke_width, wxSOLID)
138        
139                if shapetype == SHAPETYPE_POINT:
140                    self.dc.SetBrush(brush)
141                    self.dc.SetPen(pen)
142                    self.draw_point_shape(layer, i)
143                else:
144                  self.draw_polygon_shape(layer, i, pen, brush)                  self.draw_polygon_shape(layer, i, pen, brush)
145          else:  
146              self.dc.SetBrush(brush)      def layer_ids(self, layer):
147              self.dc.SetPen(pen)          """Return the shape ids of the given layer that have to be drawn.
148              if shapetype == SHAPETYPE_ARC:          
149                  f = self.draw_arc_shape          The default implementation simply returns all ids in the layer.
150              elif shapetype == SHAPETYPE_POINT:          Override in derived classes to be more precise.
151                  f = self.draw_point_shape          """
152              for i in range(layer.NumShapes()):          return range(layer.NumShapes())
                 f(layer, i)  
153    
154      def draw_polygon_shape(self, layer, index, pen, brush):      def draw_polygon_shape(self, layer, index, pen, brush):
155          offx, offy = self.offset                  offx, offy = self.offset        
# Line 134  class MapRenderer: Line 187  class MapRenderer:
187          self.dc.DrawLines(points)          self.dc.DrawLines(points)
188    
189      def draw_point_shape(self, layer, index):      def draw_point_shape(self, layer, index):
190          p = self.projected_points(layer, index)[0]          pp = self.projected_points(layer, index)
191    
192            if len(pp) == 0: return # ignore Null Shapes which have no points
193    
194            p = pp[0]
195          radius = self.resolution * 5          radius = self.resolution * 5
196          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)
197    
# Line 182  class ScreenRenderer(MapRenderer): Line 239  class ScreenRenderer(MapRenderer):
239      # On the screen we want to see only visible layers by default      # On the screen we want to see only visible layers by default
240      honor_visibility = 1      honor_visibility = 1
241            
242      def RenderMap(self, map, selected_layer, selected_shape):      def RenderMap(self, map, region, selected_layer, selected_shapes):
243            """Render the map.
244    
245            Only the given region (a tuple in window coordinates as returned
246            by a wxrect's asTuple method) needs to be redrawn. Highlight the
247            shapes given by the ids in selected_shapes in the
248            selected_layer.
249            """
250            self.update_region = region
251          self.selected_layer = selected_layer          self.selected_layer = selected_layer
252          self.selected_shape = selected_shape          self.selected_shapes = selected_shapes
253          self.render_map(map)          self.render_map(map)
254    
255      def draw_shape_layer(self, layer):      def draw_shape_layer(self, layer):
256          MapRenderer.draw_shape_layer(self, layer)          MapRenderer.draw_shape_layer(self, layer)
257          if layer is self.selected_layer and self.selected_shape is not None:          if layer is self.selected_layer and self.selected_shapes:
258              pen = wxPen(wxBLACK, 3, wxSOLID)              pen = wxPen(wxBLACK, 3, wxSOLID)
259              brush = wxBrush(wxBLACK, wxCROSS_HATCH)              brush = wxBrush(wxBLACK, wxCROSS_HATCH)
260                
261              shapetype = layer.ShapeType()              shapetype = layer.ShapeType()
             index = self.selected_shape  
262              if shapetype == SHAPETYPE_POLYGON:              if shapetype == SHAPETYPE_POLYGON:
263                  self.draw_polygon_shape(layer, index, pen, brush)                  func = self.draw_polygon_shape
264              else:                  args = (pen, brush)
265                elif shapetype == SHAPETYPE_ARC:
266                    func = self.draw_polygon_shape
267                    args = (pen, None)
268                elif shapetype == SHAPETYPE_POINT:
269                  self.dc.SetBrush(brush)                  self.dc.SetBrush(brush)
270                  self.dc.SetPen(pen)                  self.dc.SetPen(pen)
271                  if shapetype == SHAPETYPE_ARC:                  func = self.draw_point_shape
272                      f = self.draw_arc_shape                  args = ()
273                  elif shapetype == SHAPETYPE_POINT:              else:
274                      f = self.draw_point_shape                  raise TypeError(_("Unhandled shape type %s") % shapetype)
275                  f(layer, index)  
276                for index in self.selected_shapes:
277                    func(layer, index, *args)
278    
279        def layer_ids(self, layer):
280            """Return the shapeids covered by the region that has to be redrawn
281    
282            Call the layer's ShapesInRegion method to determine the ids so
283            that it can use the quadtree.
284            """
285            # FIXME: the quad-tree should be built from the projected
286            # coordinates not the lat-long ones because it's not trivial to
287            # determine an appropriate rectangle in lat-long for a given
288            # rectangle in projected coordinates which we have to start from
289            # here.
290            proj = self.map.projection
291            if proj is not None:
292                inverse = proj.Inverse
293            else:
294                inverse = None
295    
296            scale = self.scale
297            offx, offy = self.offset
298            xs = []
299            ys = []
300            x, y, width, height = self.update_region
301            for winx, winy in ((x, y), (x + width, y),
302                               (x + width, y + height), (x, y + height)):
303                px = (winx - offx) / scale
304                py = -(winy - offy) / scale
305                if inverse:
306                    px, py = inverse(px, py)
307                xs.append(px)
308                ys.append(py)
309            left = min(xs)
310            right = max(xs)
311            top = max(ys)
312            bottom = min(ys)
313    
314            return layer.ShapesInRegion((left, bottom, right, top))
315    
316    
317  class PrinterRender(MapRenderer):  class PrinterRender(MapRenderer):

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26