/[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 394 by jonathan, Mon Feb 10 15:27:13 2003 UTC revision 676 by jonathan, Tue Apr 15 19:20:40 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, draw_polygon_init
16    
17  from Thuban import _  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
# Line 21  from Thuban.Model.label import ALIGN_CEN Line 23  from Thuban.Model.label import ALIGN_CEN
23       ALIGN_LEFT, ALIGN_RIGHT, ALIGN_BASELINE       ALIGN_LEFT, ALIGN_RIGHT, ALIGN_BASELINE
24    
25  from Thuban.Model.classification import Classification  from Thuban.Model.classification import Classification
26    from Thuban.Model.color import Color
27    
28    import time
29    
30    
31  class MapRenderer:  class MapRenderer:
# Line 45  class MapRenderer: Line 50  class MapRenderer:
50                  the renderer's default.                  the renderer's default.
51          """          """
52          # resolution in pixel/inch          # resolution in pixel/inch
53    
54            assert scale > 0
55    
56          self.dc = dc          self.dc = dc
57          self.scale = scale          self.scale = scale
58          self.offset = offset          self.offset = offset
# Line 76  class MapRenderer: Line 84  class MapRenderer:
84          pen   = wxTRANSPARENT_PEN          pen   = wxTRANSPARENT_PEN
85    
86          old_prop = None          old_prop = None
87            lc = layer.GetClassification()
88            field = lc.GetField()
89    
90            #print "drawing layer: ", layer.Title(),
91            #start = time.clock()
92            #count = 0
93    
94            if shapetype != SHAPETYPE_POINT:
95                offx, offy = self.offset        
96                draw_polygon_init(layer.shapefile.cobject(),
97                                  self.dc,
98                                  self.map.projection, layer.projection,
99                                  self.scale, -self.scale, offx, offy)
100    
101          for i in self.layer_ids(layer):          for i in self.layer_ids(layer):
102              value = None              value = None
             shape = layer.Shape(i)  
             lc = layer.classification  
             field = lc.field  
103    
104              if field is not None:              if field is not None:
105                  record = layer.table.read_record(i)                  try:
106                  if record is not None:                      record = layer.table.read_record(i)
107                      value = record[field]                      if record is not None:
108                            value = record[field]
109              #                  except:
110              # if the above statements fail 'value' should                      pass
111              # be null, at which point this call will  
112              # at least retreive the NullData                  #
113              #                  # if the above statements fail 'value' should
114              prop = lc.GetProperties(value)                  # be null, at which point this call will
115                    # at least retreive the NullData
116                    #
117    
118                    group = lc.FindGroup(value)
119    
120                    #prop = lc.GetProperties(value)
121                else:
122                    group = lc.GetDefaultGroup()
123    
124    
125                if not group.IsVisible():
126                    continue
127    
128                prop = group.GetProperties()
129    
130              if prop != old_prop:              # don't recreate new objects if they are the same as before
131                if prop != old_prop:
132                  old_prop = prop                  old_prop = prop
133    
134                  if shapetype == SHAPETYPE_ARC:                  if shapetype == SHAPETYPE_ARC:
135                      fill = None                      fill = Color.Transparent
136                  else:                  else:
137                      fill = prop.GetFill()                      fill = prop.GetFill()
138    
139            
140                  if fill is None:                  if fill is Color.Transparent:
141                      brush = wxTRANSPARENT_BRUSH                      brush = wxTRANSPARENT_BRUSH
142                  else:                  else:
143                      color = wxColour(fill.red * 255,                      color = Color2wxColour(fill)
                                      fill.green * 255,  
                                      fill.blue * 255)  
144                      brush = wxBrush(color, wxSOLID)                      brush = wxBrush(color, wxSOLID)
145            
146                  stroke = prop.GetStroke()                  stroke = prop.GetLineColor()
147                  stroke_width = prop.GetStrokeWidth()                  stroke_width = prop.GetLineWidth()
148                  if stroke is None:                  if stroke is Color.Transparent:
149                      pen = wxTRANSPARENT_PEN                      pen = wxTRANSPARENT_PEN
150                  else:                  else:
151                      color = wxColour(stroke.red * 255,                      color = Color2wxColour(stroke)
                                      stroke.green * 255,  
                                      stroke.blue * 255)  
152                      pen = wxPen(color, stroke_width, wxSOLID)                      pen = wxPen(color, stroke_width, wxSOLID)
153        
             if shapetype == SHAPETYPE_POINT:  
154                  self.dc.SetBrush(brush)                  self.dc.SetBrush(brush)
155                  self.dc.SetPen(pen)                  self.dc.SetPen(pen)
156        
157                if shapetype == SHAPETYPE_POINT:
158                  self.draw_point_shape(layer, i)                  self.draw_point_shape(layer, i)
159              else:              else:
160                  self.draw_polygon_shape(layer, i, pen, brush)                  self.draw_polygon_shape(layer, i, pen, brush)
161    
162                #count += 1
163    
164            #end = time.clock()
165            #print (end-start), "seconds -- ", count
166    
167    
168      def layer_ids(self, layer):      def layer_ids(self, layer):
169          """Return the shape ids of the given layer that have to be drawn.          """Return the shape ids of the given layer that have to be drawn.
170                    
# Line 136  class MapRenderer: Line 174  class MapRenderer:
174          return range(layer.NumShapes())          return range(layer.NumShapes())
175    
176      def draw_polygon_shape(self, layer, index, pen, brush):      def draw_polygon_shape(self, layer, index, pen, brush):
177          offx, offy = self.offset                  draw_polygon_shape(index, pen, brush)
         draw_polygon_shape(layer.shapefile.cobject(), index,  
                            self.dc, pen, brush,  
                            self.map.projection, layer.projection,  
                            self.scale, -self.scale, offx, offy)  
178    
179      def projected_points(self, layer, index):      def projected_points(self, layer, index):
180          proj = self.map.projection          proj = self.map.projection
# Line 171  class MapRenderer: Line 205  class MapRenderer:
205          self.dc.DrawLines(points)          self.dc.DrawLines(points)
206    
207      def draw_point_shape(self, layer, index):      def draw_point_shape(self, layer, index):
208          p = self.projected_points(layer, index)[0]          pp = self.projected_points(layer, index)
209    
210            if len(pp) == 0: return # ignore Null Shapes which have no points
211    
212            p = pp[0]
213          radius = self.resolution * 5          radius = self.resolution * 5
214          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)
215    
# Line 219  class ScreenRenderer(MapRenderer): Line 257  class ScreenRenderer(MapRenderer):
257      # On the screen we want to see only visible layers by default      # On the screen we want to see only visible layers by default
258      honor_visibility = 1      honor_visibility = 1
259            
260      def RenderMap(self, map, region, selected_layer, selected_shape):      def RenderMap(self, map, region, selected_layer, selected_shapes):
261          """Render the map.          """Render the map.
262    
263          Only the given region (a tuple in window coordinates as returned          Only the given region (a tuple in window coordinates as returned
264          by a wxrect's asTuple method) needs to be redrawn. Highlight the          by a wxrect's asTuple method) needs to be redrawn. Highlight the
265          shape with id selected_shape in the selected_layer.          shapes given by the ids in selected_shapes in the
266            selected_layer.
267          """          """
268          self.update_region = region          self.update_region = region
269          self.selected_layer = selected_layer          self.selected_layer = selected_layer
270          self.selected_shape = selected_shape          self.selected_shapes = selected_shapes
271          self.render_map(map)          self.render_map(map)
272    
273      def draw_shape_layer(self, layer):      def draw_shape_layer(self, layer):
274          MapRenderer.draw_shape_layer(self, layer)          MapRenderer.draw_shape_layer(self, layer)
275          if layer is self.selected_layer and self.selected_shape is not None:          if layer is self.selected_layer and self.selected_shapes:
276              pen = wxPen(wxBLACK, 3, wxSOLID)              pen = wxPen(wxBLACK, 3, wxSOLID)
277              brush = wxBrush(wxBLACK, wxCROSS_HATCH)              brush = wxBrush(wxBLACK, wxCROSS_HATCH)
278                
279              shapetype = layer.ShapeType()              shapetype = layer.ShapeType()
             index = self.selected_shape  
280              if shapetype == SHAPETYPE_POLYGON:              if shapetype == SHAPETYPE_POLYGON:
281                  self.draw_polygon_shape(layer, index, pen, brush)                  func = self.draw_polygon_shape
282                    args = (pen, brush)
283              elif shapetype == SHAPETYPE_ARC:              elif shapetype == SHAPETYPE_ARC:
284                  self.draw_polygon_shape(layer, index, pen, None)                  func = self.draw_polygon_shape
285              else:                  args = (pen, None)
286                elif shapetype == SHAPETYPE_POINT:
287                  self.dc.SetBrush(brush)                  self.dc.SetBrush(brush)
288                  self.dc.SetPen(pen)                  self.dc.SetPen(pen)
289                  if shapetype == SHAPETYPE_POINT:                  func = self.draw_point_shape
290                      self.draw_point_shape(layer, index)                  args = ()
291                  else:              else:
292                      raise TypeError(_("Unhandled shape type %s") % shapetype)                  raise TypeError(_("Unhandled shape type %s") % shapetype)
293    
294                for index in self.selected_shapes:
295                    func(layer, index, *args)
296    
297      def layer_ids(self, layer):      def layer_ids(self, layer):
298          """Return the shapeids covered by the region that has to be redrawn          """Return the shapeids covered by the region that has to be redrawn

Legend:
Removed from v.394  
changed lines
  Added in v.676

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26