]>
Commit | Line | Data |
---|---|---|
42463de2 RD |
1 | """ |
2 | This is the floatcanvas package. It provides two primary modules, and a | |
3 | support module. | |
4 | ||
2a0495c9 | 5 | FloatCanvas.py contains the main FloatCanvas class, and its supporting |
42463de2 RD |
6 | classes. NavCanvas.py contains a wrapper for the FloatCanvas that |
7 | provides the canvas and a toolbar with tools that allow you to navigate | |
8 | the canvas (zooming, panning, etc.) Resources.py is a module that | |
9 | contains a few resources required by the FloatCanvas (icons, etc) | |
10 | ||
11 | The FloatCanvas is a high level window for drawing maps and anything | |
12 | else in an arbitrary coordinate system. | |
13 | ||
14 | The goal is to provide a convenient way to draw stuff on the screen | |
15 | without having to deal with handling OnPaint events, converting to pixel | |
16 | coordinates, knowing about wxWindows brushes, pens, and colors, etc. It | |
17 | also provides virtually unlimited zooming and scrolling | |
18 | ||
19 | I am using it for two things: | |
20 | 1) general purpose drawing in floating point coordinates | |
21 | 2) displaying map data in Lat-long coordinates | |
22 | ||
23 | If the projection is set to None, it will draw in general purpose | |
24 | floating point coordinates. If the projection is set to 'FlatEarth', it | |
25 | will draw a FlatEarth projection, centered on the part of the map that | |
26 | you are viewing. You can also pass in your own projection function. | |
27 | ||
28 | It is double buffered, so re-draws after the window is uncovered by | |
29 | something else are very quick. | |
30 | ||
31 | It relies on NumPy, which is needed for speed (maybe, I haven't profiled | |
32 | it). It will also use numarray, if you don't have Numeric, but it is | |
33 | slower. | |
34 | ||
35 | Bugs and Limitations: Lots: patches, fixes welcome | |
36 | ||
37 | For Map drawing: It ignores the fact that the world is, in fact, a | |
38 | sphere, so it will do strange things if you are looking at stuff near | |
39 | the poles or the date line. so far I don't have a need to do that, so I | |
40 | havn't bothered to add any checks for that yet. | |
41 | ||
42 | Zooming: I have set no zoom limits. What this means is that if you zoom | |
43 | in really far, you can get integer overflows, and get weird results. It | |
44 | doesn't seem to actually cause any problems other than weird output, at | |
45 | least when I have run it. | |
46 | ||
47 | Speed: I have done a couple of things to improve speed in this app. The | |
48 | one thing I have done is used NumPy Arrays to store the coordinates of | |
49 | the points of the objects. This allowed me to use array oriented | |
50 | functions when doing transformations, and should provide some speed | |
51 | improvement for objects with a lot of points (big polygons, polylines, | |
52 | pointsets). | |
53 | ||
54 | The real slowdown comes when you have to draw a lot of objects, because | |
55 | you have to call the wx.DC.DrawSomething call each time. This is plenty | |
56 | fast for tens of objects, OK for hundreds of objects, but pretty darn | |
57 | slow for thousands of objects. | |
58 | ||
59 | If you are zoomed in, it checks the Bounding box of an object before | |
60 | drawing it. This makes it a great deal faster when there are a lot of | |
61 | objects and you are zoomed in so that only a few are shown. | |
62 | ||
63 | One solution is to be able to pass some sort of object set to the DC | |
64 | directly. I've used DC.DrawPointList(Points), and it helped a lot with | |
65 | drawing lots of points. However, when zoomed in, the Bounding boxes need | |
66 | to be checked, so I may some day write C++ code that does the loop and | |
67 | checks the BBs. | |
68 | ||
69 | Mouse Events: | |
70 | ||
095315e2 RD |
71 | There are a full set of custom mouse events. They are just like the |
72 | regular mouse events, but include an extra attribute: Event.GetCoords(), | |
73 | that returns the (x,y) position in world coordinates, as a length-2 | |
74 | NumPy vector of Floats. | |
42463de2 | 75 | |
2a0495c9 | 76 | There are also a full set of bindings to mouse events on objects, so |
095315e2 | 77 | that you can specify a given function be called when an object is |
2a0495c9 RD |
78 | clicked, mouse-over'd, etc. |
79 | ||
42463de2 RD |
80 | See the Demo for what it can do, and how to use it. |
81 | ||
82 | Copyright: Christopher Barker | |
83 | ||
84 | License: Same as the version of wxPython you are using it with. | |
85 | ||
095315e2 | 86 | Check for updates or answers to questions, send me an email. |
42463de2 RD |
87 | |
88 | Please let me know if you're using this!!! | |
89 | ||
90 | Contact me at: | |
91 | ||
92 | Chris.Barker@noaa.gov | |
93 | ||
94 | """ | |
95 | ||
095315e2 | 96 | __version__ = "0.9.9" |
42463de2 RD |
97 | |
98 |