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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26