/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Contents of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2672 - (show annotations)
Mon Oct 17 21:31:43 2005 UTC (19 years, 4 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 467303 byte(s)
* Thuban/__init__.py (set_internal_encoding): added a forwards
and backward translation, so that we fail early if the
internal_encoding is bad.

* test/test_stringrepresentation.py: New file, for now testing
that set_internal_coding() is throwing an exception for bad exceptions.

1 2005-10-17 Bernhard Reiter <[email protected]>
2
3 * test/test_stringrepresentation.py: New file, for now testing
4 that set_internal_coding() is throwing an exception for bad exceptions.
5
6 * Thuban/__init__.py (set_internal_encoding): added a forwards
7 and backward translation, so that we fail early if the
8 internal_encoding is bad.
9
10 2005-10-17 Bernhard Reiter <[email protected]>
11
12 svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
13 You could actually get polylines with filling in between,
14 when the classification for the lines had a fill color.
15 E.g. this happens when you generate a classification from a ramp.
16
17 * Extensions/svgexport/test/test_svgmapwriter.py:
18 New test_export_arc_no_fill(). Extend copyright notice to 2005.
19
20 * Extensions/svgexport/svgmapwriter.py
21 (SVGRenderer.draw_shape_layer_incrementally()):
22 Setting TRANSPARENT_BRUSH for shaptype ARC.
23 Extend copyright notice to 2005.
24
25 * Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
26
27 2005-09-08 Frank Koormann <[email protected]>
28
29 * Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
30 by Erik (sigra.at.home.se)
31
32 2005-08-18 Jan-Oliver Wagner <[email protected]>
33
34 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
35 Call the right method for the default size.
36
37 2005-08-11 Jan-Oliver Wagner <[email protected]>
38
39 * Extensions/export_shapefile: New.
40
41 * Extensions/export_shapefile/__init__.py: New. Initialize
42 the export_shapefile extension.
43
44 * Extensions/export_shapefile/export_shapefile.py: New.
45 Exports a layer as a Shapefile.
46
47 2005-08-08 Jan-Oliver Wagner <[email protected]>
48
49 * po/de.po: String fixes. This fixes Debian bug #313843.
50
51 2005-07-27 Jan-Oliver Wagner <[email protected]>
52
53 Remove the attributes from the layer element in
54 .thuban files for the save routine.
55 This also solves RT bug #3149,
56 https://intevation.de/rt/webrt?serial_num=3149
57
58 * test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
59 TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
60 TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
61 attributes from layer element to classification clnull element.
62
63 * test/test_save.py (SaveSessionTest.testSingleLayer,
64 SaveSessionTest.testLayerProjection,
65 SaveSessionTest.testClassifiedLayer,
66 SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
67 Removed attributes from layer element to classification clnull element.
68 (test_save_postgis.NonConnectionStore._fetch_table_information):
69 added pretending to have a shape_type.
70
71 * Resources/XML/thuban-1.1.dtd: Make the attributes field
72 and field_type of classification optional.
73
74 * Thuban/Model/classification.py (Classification.TreeItem.build_info):
75 Added output of size.
76
77 * Thuban/Model/load.py (SessionLoader.start_classification):
78 Change attribute 'field' and 'field_type' from obligatory to
79 optional to allow empty classes (ie. only with a default=clnull).
80
81 * Thuban/Model/save.py (SessionSaver.write_layer): Don't write
82 any attributes anymore for the layer element.
83 (SessionSaver.write_classification): Even if there is no
84 classification field, still write the classification because
85 the clnull (default) symbol will not be defined anymore as
86 part of the layer element.
87
88 2005-07-05 Bernhard Herzog <[email protected]>
89
90 * setup.py (setup call): Version 1.1.0
91
92 * NEWS: Update for 1.1.0
93
94 * MANIFEST.in: Add *.txt to files taken from Doc. Otherwise the
95 technores won't be included
96
97 * Thuban/UI/about.py (About.__init__): Extend copyright notice to
98 2005
99
100 * po/de.po: Updated.
101
102 2005-07-05 Bernhard Herzog <[email protected]>
103
104 * README: gdal 1.1.8 is too old. 1.2.5 works.
105
106 2005-07-05 Bernhard Herzog <[email protected]>
107
108 * Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
109 masktype attributes.
110
111 2005-07-05 Bernhard Herzog <[email protected]>
112
113 * Thuban/Model/layer.py (Layer.__mangle_bounding_box)
114 (Layer.ClipBoundingBox): Rename ClipBoundingBox to
115 __mangle_bounding_box. See the comments in the code and RT #2845
116
117 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
118 Remove the explicit test of ClipBoundingBox. The method isn't
119 public anymore and the direct call in the test wasn't necessary in
120 the first place. If ClipBoundingBox (now __mangle_bounding_box)
121 isn't called, the return value of ShapesInRegion will be
122 different.
123
124 2005-07-05 Bernhard Herzog <[email protected]>
125
126 * Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
127 ZeroDivisionError exceptions. I don't know when they happen
128 exactly. It probably happens when the projections aren't set
129 properly.
130
131 2005-07-01 Bernhard Herzog <[email protected]>
132
133 First step towards unicode. With this roughly we're at step 1
134 string_representation.txt
135
136 * Doc/technotes/string_representation.txt: New. Document how
137 strings are represented in Thuban and how to get to a Unicode
138 Thuban.
139
140 * Thuban/__init__.py (set_internal_encoding)
141 (unicode_from_internal, internal_from_unicode): New. The first few
142 functions for the internal string representation
143
144 * Thuban/UI/about.py (unicodeToLocale): Removed. Use
145 internal_from_unicode instead.
146
147 * Thuban/UI/__init__.py (install_wx_translation): Determine the
148 encoding to use for the internal string representation. Also,
149 change the translation function to return strings in internal
150 representation even on unicode builds of wxPython
151
152 * Thuban/Model/load.py (SessionLoader.check_attrs): Decode
153 filenames too.
154 (SessionLoader.start_clrange): Use check_attrs to decode and check
155 the attributes.
156
157 * Thuban/Model/xmlreader.py (XMLReader.encode): Use
158 internal_from_unicode to convert unicode strings.
159
160 * Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
161 unicode_from_internal when applicable
162
163 * test/runtests.py (main): New command line option:
164 internal-encoding to specify the internal string encoding to use
165 in the tests.
166
167 * test/support.py (initthuban): Set the internal encoding to
168 latin-1
169
170 * test/test_load.py (TestSingleLayer.test, TestClassification.test)
171 (TestLabelLayer.test): Use the internal string representation when
172 dealing with non-ascii characters
173
174 * test/test_load_1_0.py (TestSingleLayer.test)
175 (TestClassification.test, TestLabelLayer.test): Use the internal
176 string representation when dealing with non-ascii characters
177
178 * test/test_load_0_9.py (TestSingleLayer.test)
179 (TestClassification.test): Use the internal string representation
180 when dealing with non-ascii characters
181
182 * test/test_load_0_8.py (TestUnicodeStrings.test): Use the
183 internal string representation when dealing with non-ascii
184 characters
185
186 * test/test_save.py (XMLWriterTest.testEncode)
187 (SaveSessionTest.testClassifiedLayer): Use the internal string
188 representation when dealing with non-ascii characters where
189 applicable
190
191 2005-06-30 Bernhard Herzog <[email protected]>
192
193 * test/runtests.py: Untabify.
194
195 2005-06-30 Bernhard Herzog <[email protected]>
196
197 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
198 untabify.
199
200 2005-06-30 Bernhard Herzog <[email protected]>
201
202 * Extensions/ogr/test/__init__.py: Add missing coding directive
203
204 2005-06-28 Jan-Oliver Wagner <[email protected]>
205
206 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
207 Use the default size for rendering selected items of default type.
208 Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
209
210 2005-06-28 Jan-Oliver Wagner <[email protected]>
211
212 * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
213 (APR_TClr.GetThubanColor): Fix bug in color interpretation.
214 Thanks to Frank Koormann who identified this problem.
215
216 * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
217 another symbol identified.
218
219 2005-06-27 Jan-Oliver Wagner <[email protected]>
220
221 * Doc/manual/thuban-manual-de.xml: More translations.
222
223 2005-05-12 Jonathan Coles <[email protected]>
224
225 * Thuban/UI/projdialog.py: Add missing import, which led to an
226 exception when opening a layer's projection.
227
228 2005-05-09 Bernhard Herzog <[email protected]>
229
230 * test/support.py (FileLoadTestCase.filename): Fix doc-string.
231
232 2005-05-09 Bernhard Herzog <[email protected]>
233
234 * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
235 connection to autoconnect. Fixes RT#3148.
236
237 * test/test_postgis_db.py
238 (TestPostGISSpecialCases.test_simple_error_handling): New test
239 that attempts to reproduce RT#3148.
240
241 2005-05-06 Jonathan Coles <[email protected]>
242
243 Add support for saving and loading the opacity and mask type
244 properties of RasterLayers. Also add support for proper use
245 of alpha information while drawing images not in 'RAW' format.
246 If transparency in an image format (e.g, PNG) is supported by
247 wxWidgets then the image would previously have been draw with
248 transparent regions, but the opaque regions would have been
249 unaffected by a change in the layer's opacity. This patch
250 corrects the problem.
251
252 * Thuban/Model/layer.py (RasterLayer): Added opacity and
253 masktype parameters to the constructor, and set the
254 appropriate variables to those values.
255
256 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
257 code to read the opacity and mask type of the layer and construct
258 a new layer with the additional parameters.
259
260 * Thuban/Model/save.py (SessionSaver.write_layer): Added code
261 to save the opacity and mask type of a layer.
262
263 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
264 the opacity of the layer to draw_raster_data rather than the layer.
265 (BaseRenderer.draw_raster_data): Remove the layer parameter because
266 the function doesn't need to know about the layer. Add the optional
267 opacity parameter whose default is 1.0. Add 'PNG' as a supported
268 graphics format.
269
270 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
271 signature to match that in BaseRenderer. Use the new opacity argument
272 in place of calling layer.Opacity(). In the case where the
273 format is not 'RAW', alpha_data is None and the loaded image has
274 alpha information, use the file's alpha information. This is
275 still subject to the layer's opacity setting.
276
277 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
278 Fixed signature to match that in BaseRenderer.
279
280 * test/test_load.py (TestRasterLayer): Change file_contents to
281 include opacity and masktype variables.
282 (TestRasterLayer.test): Include tests for opacity and masktype
283 changes.
284
285 * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
286 test to cover a variety of combinations of masktype and opacity
287 settings.
288
289 2005-05-02 Jan-Oliver Wagner <[email protected]>
290
291 * debian/rules: add --use-wx-python-swig-hack
292 to the build command.
293 Thanks to Moritz Lennert for pointing this out.
294
295 2005-04-28 Jan-Oliver Wagner <[email protected]>
296
297 Introduce OGRFileShapeStore in ogr extension.
298 This allows at least that loaded shapefile shape stores
299 can be saved correctly in the thuban session file
300 and reloaded again (reload is via core shapefile
301 routine, not OGR). For other types, .thuban files
302 can not be reloaded for the time being.
303
304 * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
305 class ist to be used for any file-based shape stores
306 accessed through OGR.
307
308 * Extensions/ogr/ogrstart.py (open_with_ogr): Added
309 forgotten _ for i18n. Adapted call OpenFileShapestore
310 regarding new parameter.
311 (OpenFileShapestore): Use OGRFileShapeStore instead of
312 OGRShapeStore. Fix return value (None instead of null).
313 Add new parameter "mainwindow" to avoid accessing global
314 context.
315
316 2005-04-27 Jan-Oliver Wagner <[email protected]>
317
318 Introduce FileShapeStore as generalization for
319 file-based shape stores. In a first instance
320 this allows additional modules to handle shapefile
321 format as well, namely the OGR extension.
322
323 * Thuban/Model/data.py: Various small fixes in doc-strings.
324 (FileShapeStore): New class.
325 (ShapefileStore): Derive from FileShapeStore.
326 (ShapefileStore.__init__): Call __init__ of FileShapeStore,
327 rename self.table to self._table, initialize self._bbox
328 (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
329 and self.FileName() instead of self.filename.
330 (ShapefileStore.Table): Use self._table instead of self.table.
331 (ShapefileStore.FileName): Removed (moved to FileShapeStore).
332 (ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
333
334 * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
335 (SessionSaver.write_data_containers): Only use methods of the
336 base class FileShapeStore.
337
338 2005-04-26 Martin Schulze <[email protected]>
339
340 * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
341 function to the modified render engine
342
343 2005-04-25 Martin Schulze <[email protected]>
344
345 * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
346 Added a description according to the CVS log message
347
348 2005-04-23 Martin Schulze <[email protected]>
349
350 * Thuban/UI/renderer.py: Added a missing import
351
352 2005-04-23 Russell Nelson <[email protected]>
353
354 * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
355 way the previous tool is remembered, so that middle-button
356 panning works even if you haven't selected a tool.
357
358 2005-04-11 Bernhard Herzog <[email protected]>
359
360 * libraries/thuban/wxproj.cpp: Move the compatibility code that
361 deals with the wxPython 2.4 version of wxPython.h into the #ifdef
362 branch that includes wxPython.h because it's only needed when
363 wxPython.h is used. Also, it won't compile when
364 USE_WX_PYTHON_SWIG_HACK is set otherwise.
365
366 2005-04-07 Bernhard Herzog <[email protected]>
367
368 * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
369 (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
370 ClassGrid.__init__ and it's value is outside of the valid
371 range (must be < 32768). wxPython 2.5 complains about it with an
372 exception.
373
374 2005-04-05 Jan-Oliver Wagner <[email protected]>
375
376 * Doc/manual/thuban-manual-de.xml: More translations.
377
378 2005-04-05 Bernhard Herzog <[email protected]>
379
380 * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
381 wxPython 2.4 as well. Also, remove a now obsolete comment.
382
383 2005-04-05 Bernhard Herzog <[email protected]>
384
385 Use wxPython.h by default but provide a workaround when it isn't
386 available.
387
388 * setup.py (wxproj_extension): New variable. Assign the Extension
389 instance for Lib.wxproj to this variable instead of putting it
390 directly into the listso that it can be accessed by other code
391 later.
392 (thuban_build_ext.user_options): Added boolean option
393 --use-wx-python-swig-hack.
394 (thuban_build_ext.initialize_options): Initialize the new option
395 to False.
396 (thuban_build_ext.finalize_options): If the new option was given,
397 define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
398 (thuban_build_ext): Update the doc-string
399
400 * libraries/thuban/wxproj.cpp: Normally we use
401 wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
402 defined, use swigPtrConvertHack.h instead.
403
404 * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
405 copied over from wxPython.h.
406 (decode_pointer_new): New. Equivalent of decode_pointer for
407 wxPython 2.5.
408 (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
409
410 * README: Add section on potential build problems which explains
411 how the work-around for a missing wxPython.h is activated.
412
413 2005-03-29 Bernhard Herzog <[email protected]>
414
415 * test/postgissupport.py (find_postgis_sql): Added yet another
416 potential location for (lw)postgis.sql because the file has moved
417 again in postgis 1.0.0 rc4.
418
419 2005-03-29 Bernhard Herzog <[email protected]>
420
421 * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
422 match the site of the legend_icon_layer icon. Otherwise wxpython
423 2.5 complains when the legend is created with the error:
424
425 PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
426 bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
427 0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
428 in wxImageList: this might work on this platform but definitely
429 won't under Windows.
430
431 2005-03-23 Jonathan Coles <[email protected]>
432
433 These changes add support for adjusting the opacity of a raster layer.
434
435 * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
436 (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
437 a LAYER_CHANGED event if the opacity actually changes.
438
439 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
440 layer parameter needed in the implementation of this method in
441 renderer.py.
442
443 * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
444 typo 00 -> 0.
445
446 * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
447 control to adjust opacity.
448
449 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
450 alpha data based on the opacity level of the layer.
451
452 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
453 accepts a layer parameter.
454
455 * test/test_layer.py (TestLayerModification.test_raster_layer):
456 Rename opacity method calls and add test for LAYER_CHANGED.
457
458 2005-03-16 Bernhard Herzog <[email protected]>
459
460 * test/test_connector.py (DeletionTestMixin.check_deletions)
461 (DeletionTestMixin.check_deletetions): renamed to check_deletions.
462 update the callers.
463
464 2005-03-14 Jan-Oliver Wagner <[email protected]>
465
466 * Doc/manual/thuban-manual-de.xml: More translations.
467
468 2005-03-10 Jan-Oliver Wagner <[email protected]>
469
470 Introducing initialization callbacks for extensions.
471
472 * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
473 optional parameter init_callback.
474 (ExtensionDesc.init_ext): New. Executes the callback and sets
475 a status.
476
477 * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
478 initialization of the extensions.
479 (ThubanApplication.init_extensions): Init all extensions.
480
481 * Thuban/UI/about.py (About.__init__): Added status of the extensions
482 to the about text.
483
484 * Extensions/gns2shp/__init__.py: Added init method for Extension
485 description.
486 (init): New. Contains the initialization of the module.
487
488 2005-03-04 Nina Hüffmeyer <[email protected]>
489
490 * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
491 OGRConnection to open a datasource. Removed dialog to display all
492 available drivers. Added some doc strings.
493
494 * Extensions/ogr/ogrstart.py: Added menu entry for opening an
495 OGRDatasource with a string. Added two opening methods which return an
496 OGRDatasource (either data from file or from DB).
497
498 * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
499 represents a geometry reference of an OGRFeature. OGRShape now has a
500 list of referenced geometry objects (important for geometry
501 collections).
502 For OGRShapeStores loaded from a DB an ID column can be specified now.
503
504 2005-02-22 Jan-Oliver Wagner <[email protected]>
505
506 * test/test_map.py (TestMapWithContents.test_tree_info):
507 Added label layer for comparison.
508
509 2005-02-18 Jonathan Coles <[email protected]>
510
511 * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
512 which builds a mask. Handle the majority of an image in a loop,
513 creating 8 bits at a time. Later, handle the edge case where less
514 than 8 bits are packed.
515
516 2005-02-18 Bernhard Herzog <[email protected]>
517
518 * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
519 doc-string
520
521 2005-02-18 Jonathan Coles <[email protected]>
522
523 * setup.py: Remove wx_cs_params from gdal compile options.
524
525 2005-02-18 Jonathan Coles <[email protected]>
526
527 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
528 dependencies on wxPython. Added a new method projected_raster_layer()
529 that returns a raster layer image in projected space. This must be
530 implemented in classes derived from BaseRenderer. This also eliminates
531 the dependency on gdal in baserenderer.py.
532
533 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
534 new projected_raster_layer() to get projected raster image instead
535 of directly calling ProjectRasterFile().
536 (BaseRenderer.projected_raster_layer): New. This must be implemented
537 by derived classes. It takes almost the same arguments as ProjectRasterFile
538 did and returns a projected image with mask and alpha data (if requested).
539 (BaseRenderer.render_map_incrementally): Remove the check for gdal since
540 that check will be done in MapRenderer.projected_raster_layer(). This
541 also allows other implementations to use different projection code.
542
543 * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
544 Implementation of BaseRenderer.projected_raster_layer. Checks for
545 gdal support and wxPython version. Also handles exceptions from
546 ProjectRasterFile.
547
548 * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
549 and added a variable which can be set through the options argument
550 of ProjectRasterFile.
551
552 * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
553 Calls ProjectRasterFile and returns the result.
554 (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
555 of calling projected_raster_layer() with different options.
556 (TestBaseRenderer.test_raster_no_projection): Removed tests based on
557 wxPython version and all tests of masks and alpha channels. These are
558 now in test_projected_raster_layer().
559
560 2005-02-17 Jan-Oliver Wagner <[email protected]>
561
562 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
563 doc-strings to comply with coding_guidelines.
564
565 2005-02-17 Jan-Oliver Wagner <[email protected]>
566
567 Docstring improvements and minor fixes for labellayer.
568
569 * Thuban/Model/map.py:
570 (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
571 Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
572 Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
573 Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
574 doc string.
575 (Map.BoundingBox): Removed superfluous test for label_layer
576 and improved doc string.
577 (Map.TreeInfo): Added label_layer and improved sdo string.
578
579 * Thuban/Model/label.py: Added import of _.
580 (Label, Label.__init__): Improved/added doc string.
581 (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
582 LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
583 Improved/added doc string.
584 (LabelLayer.AddLabel): Use already defined names for
585 align strings and improved doc string.
586 (LabelLayer.TreeInfo): New. Return the object data for
587 the tree view.
588
589 2005-02-16 Jonathan Coles <[email protected]>
590
591 Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
592 so that that wxproj doesn't crash. Added GUI support for selecting
593 alpha channel (opacity can't be selected yet).
594
595 NOTE: If wxPython.h is including in future distribution packages
596 then it will not be necessary to have the files swigPtrConvertHack.h
597 and wxPython_int.h included with Thuban. This is hopefully
598 a temporary workaround.
599
600 * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
601 access to the macro wxCHECK_VERSION so that it will properly
602 generate a bit mask. There was a problem between wx2.4 and wx2.5
603 that this works around.
604
605 * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
606 of RasterLayer.MaskType.
607 (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
608 (RasterLayer.MaskType): New. Returns the type of mask to use. Can
609 specify none, a bitmap, or an alpha channel.
610 (RasterLayer.SetMaskType): New. Set what kind of mask to use.
611
612 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
613 Set the raster warping options for the mask based on the value
614 of RasterLayer.MaskType.
615
616 * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
617 deprecated calls to SetItemSelectedImage in favor of SetItemImage
618 with wxTreeItemIcon_Selected.
619
620 * Thuban/UI/rasterlayerproperties.py: Support selecting to use
621 an alpha channel for the mask.
622
623 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
624 data if it is available and an alpha channel is supported under
625 the current version of wxPython.
626
627 * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
628 to select whether 1's or 0's select the desired portion of an image
629 in the bit mask. wx2.4 has a bug where the documentation is the opposite
630 from behavior.
631 (ProjectRasterFile): Only generate an alpha channel if the version
632 of wxPython is >= 2.5.3.
633
634 * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
635 When wxPython >= 2.5.3 use the special swig functions to decode an
636 object's address.
637
638 * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
639 based on the version of wxPython. If >= 2.5.3 use the special swig
640 functions from wxPython to decode wxPython objects, otherwise use
641 the old method of retrieving the address from the object __repr__ string.
642
643 * libraries/thuban/wxPython_int.h: Copied from wxPython source.
644 Unnecessary code was removed to make it smaller.
645
646 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
647 Add tests for returning an alpha channel.
648
649 * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
650 tests that used removed functions UseMask and SetUseMask
651
652
653 2005-02-08 Bernhard Herzog <[email protected]>
654
655 More wxPython 2.5 changes. This time taken from a patch from
656 Daniel Calvelo Aros.
657
658 * Thuban/UI/tableview.py (QueryTableFrame.__init__)
659 (QueryTableFrame.__init__): Pass the size of a spacer as a single
660 item.
661
662 * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
663 (ProjFrame.build_dialog): Pass the size of a spacer as a single
664 item.
665
666 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
667 size of a spacer as a single item.
668
669 * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
670 size of a spacer as a single item.
671
672 2005-02-08 Bernhard Herzog <[email protected]>
673
674 Compatibility with wxPython 2.5. The changes should make it work
675 better with 2.5 while still keeping compatibility with 2.4. There
676 are still problems with 2.5, though.
677
678 * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
679 of a spacer as a single item.
680
681 * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
682 from wxControl
683
684 * Thuban/UI/legend.py (LegendTree): When running with wxPython <
685 2.5, add an implementation of the GetFirstChild method that does
686 not require the second parameter.
687 (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
688 (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
689 (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
690 pass the second parameter to GetFirstChild
691
692 2005-02-08 Nina Hüffmeyer <[email protected]>
693
694 * Extensions/ogr/ogrshapes.py: Removed some print commands.
695
696 * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
697 additional menu but appears as a possibility in the menu Map.
698
699 2005-02-07 Jonathan Coles <[email protected]>
700 * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
701 and PYTHON_ERRF since they were no longer necessary.
702
703 2005-02-07 Bernhard Reiter <[email protected]>
704 * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
705 Enable translation for message string.
706
707 2005-02-06 Martin Schulze <[email protected]>
708
709 * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
710 the arguments of the contstructor to fit the global scheme
711
712 2005-01-31 Nina Hüffmeyer <[email protected]>
713
714 * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
715 some dialogs needed to start ogr.
716
717 * Extensions/ogr/__init__.py: Changed comments to avoid encoding
718 warnings.
719
720 * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
721 encoding warnings.
722
723 2005-01-28 Jonathan Coles <[email protected]>
724
725 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
726 mask is packed into a bit array. It's now slightly faster.
727
728 2005-01-28 Jonathan Coles <[email protected]>
729
730 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
731 default to true.
732
733 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
734 code that loads the state of the layer's use_mask flag. Its
735 usefulness is still being debated.
736
737 * Thuban/Model/save.py (SessionSaver.write_layer): Remove
738 code that saves the state of the layer's use_mask flag. Its
739 usefulness is still being debated.
740
741 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
742 options to ProjectRasterFile based on the state of layer.UseMask().
743 Catch more exceptions from ProjectRasterFile so that Thuban doesn't
744 quit is there is a problem projecting.
745 (BaseRenderer.draw_raster_data): Change the documentation to
746 describe the new format (XBM) that the mask data will be in.
747
748 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
749 data is in XBM format when format='RAW' which means it doesn't
750 need to be converted to a wxImage before being used as a mask
751 for a wxBitmap. Assume that if format != 'RAW' that the image
752 data and mask data are in the same format.
753
754 * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
755 and a mask is requested, convert the alpha band to a bit array in
756 XBM format. if an alpha channel is requested, simply return the
757 data in the alpha band. Provide better error handling by returning
758 python error messages (also fixes RT #2947).
759 (ProjectRasterFile): Support multiple mask options, rather than simply
760 a flag indicating that a mask should or should not be used. Provide
761 better error handling by returning python error messages.
762
763 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
764 Add mask data to test.
765
766 * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
767 should use the mask by default.
768 (TestLayerModificaton.test_raster_layer): Test that a layer should use
769 the mask by default.
770
771 * test/test_load.py (TestRasterLayer.test): Remove testing for
772 use_mask flag in file.
773
774 * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
775 for use_mask in file.
776
777 * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
778
779 2005-01-26 Jonathan Coles <[email protected]>
780
781 Add a new dialog box for raster layers. The dialog box allows
782 the user to toggle a mask that is generated by ProjectRasterFile
783 and is used to only draw the real parts of the projected image.
784
785 * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
786 Instruct the warping code to generate a mask if the raster layer
787 requests one.
788 (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
789
790 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
791 obsolete optional mask argument.
792
793 * Thuban/UI/classifier.py (Classifier): Change the parent class
794 to LayerProperties and rework the code to support layout calls
795 from the parent.
796 (Classifier.dialog_layout): New. Layout the dialog box.
797 (Classifier.map_layers_removed): Removed. Moved to parent class.
798 (Classifier.map_replaced): Removed. Moved to parent class.
799 (Classifier._OnTry): Renamed to OnTry to support parent class.
800 (Classifier.OnClose): Removed. Supplied in parent class.
801 (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
802 (Classifier._OnOK): Renamed to OnOK to support parent class.
803 (Classifier._OnRevert): Renamed to OnRevert to support parent class.
804
805 * Thuban/UI/layerproperties.py: New. Base class for layer properties
806 dialog boxes.
807
808 * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
809 raster layer properties.
810
811 * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
812 with the non-simple version supplied with gdal. This allows added
813 features such as creating an alpha band.
814 (GetImageData): Generate a mask array from the alpha band that is
815 generated by gdal if the user has selected it. Try to support images
816 that have more than three bands, such as images with RGB plus an
817 alpha band.
818 (ProjectRasterFile): Convert python argument for mask and tell
819 gdal to enable or disable an alpha band.
820
821 * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
822 describing what kind of layer the class is. Defaults to "Unknown",
823 but should be overridden by subclasses.
824 (Layer.Type): New. Override base class method.
825 (RasterLayer.__init__): Create a flag for using a mask. Record extra
826 data from gdal for display in the properties dialog.
827 (RasterLayer.Type): New. Override base class method.
828 (RasterLayer.UseMask): New. Returns True if the mask should be used.
829 (RasterLayer.SetUseMask): New. Set if the mask should be used.
830 (RasterLayer.ImageInfo): New. Return extra information about the image.
831
832 * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
833 the mask information.
834
835 * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
836
837 * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
838 Classifier classes as dialogs to use with the proper layer types.
839
840 * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
841 Fix test.
842
843 * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
844 (TestLayerModification.build_path): New. Support function.
845 (TestLayerModification.test_raster_layer): New. Test new methods.
846
847 * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
848
849 * test/test_load.py (TestRasterLayer): Add tests for mask.
850
851 * test/test_load_1_0_1.py: New. Copied from test_load.py.
852
853 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
854 obsolete optional mask argument.
855
856 2005-01-26 Nina Hüffmeyer <[email protected]>
857
858 * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
859 which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
860 RowOrdinalToId() and ReadRowAsDict().
861
862 * Extensions/ogr/ogrstart.py: Added menu item which opens database
863 layers for existing database connections.
864
865 * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
866
867
868 2005-01-26 Jan-Oliver Wagner <[email protected]>
869
870 * Doc/manual/thuban-manual-de.xml: More translations.
871
872 2005-01-24 Bernhard Herzog <[email protected]>
873
874 Rework the status bar updates a bit to make sure the message about
875 the projections is produced at the right times.
876
877 * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
878 New class variable with messages that may require a status bar
879 update.
880 (MainWindow.view_position_changed)
881 (MainWindow.update_status_bar): Rename from view_position_changed
882 to update_status_bar. It's meaning has changed now that it may
883 also generate messages about problems with projection settings.
884 (MainWindow.__init__): Use the new update_status_bar_messages
885 class variable to subscribe update_status_bar
886 (MainWindow.set_position_text): Update doc-string. This method
887 has to be renamed at some point. See doc-string and comments.
888 (MainWindow.OnClose): Unsubscribe update_status_bar from all
889 messages in update_status_bar_messages
890
891 * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
892 class attribute. map messages to be forwarded by the viewport.
893 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
894 the messages in forwarded_map_messages
895
896 2005-01-21 Bernhard Herzog <[email protected]>
897
898 * test/postgissupport.py (PostGISDatabase.__init__): Tweak
899 doc-string
900 (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
901 different name for the initialization SQL file.
902
903 2005-01-21 Jonathan Coles <[email protected]>
904
905 * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
906 a projection and returns a formatted string representing the
907 parameters to feed to gdalwarp. This function eliminates
908 redundancy in draw_raster_layer().
909 (BaseRenderer.render_map_incrementally): Removed the optimization which
910 drew the top most raster layer first and then only those vector-
911 based layers that are above it. With the support for transparency
912 this optimization breaks correct behaviour.
913 (BaseRenderer.draw_raster_layer): Reorganize code to support possible
914 future enhancements to raster layer bounding box. The old behaviour has
915 not changed. Also, change calling parameters to draw_raster_data()
916 to specify new RAW data format and mask.
917 (BaseRenderer.draw_raster_data): Change signature to include an optional
918 parameter for mask information. Change documentation to mention
919 support for new parameter and added option for RAW data format.
920 The data argument is now a list of [width, height, data].
921
922 * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
923 mask parameter. Add new condition for RAW format, which
924 significantly reduces rendering time. Add condition for
925 mask parameter.
926
927 * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
928 data array of RGB values from the projected image returned from
929 the gdal warping functions. In the case of palette based images, it
930 converts the NO_DATA index to the mask color.
931 (ProjectRasterFile): Removed all custom memory driver references
932 and replaced it with the standard in-memory dataset provided
933 by gdal. The return data is no longer a BMP file, but an array
934 of RGB values, one set triple per pixel.
935
936 * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
937 * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
938 * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
939
940 * setup.py (thuban_build_ext.finalize_options): Removed mention
941 of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
942 files. These are obsolete with the new version of gdalwarp.cpp
943
944 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
945 Updated signature.
946 (TestBaseRenderer.test_raster_no_projection): Changed the test
947 data to be data in the uncompressed RAW format returned from
948 ProjectRasterFile.
949
950 2005-01-21 Jan-Oliver Wagner <[email protected]>
951
952 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
953 string available for i18n.
954
955 2005-01-20 Russell Nelson <[email protected]>
956
957 * Resources/Projections/defaults.proj: Ruin the speling of the
958 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
959 It's the wrong thing to do in the long run, but it's necessary for
960 those users until that bug is fixed. Otherwise the projection
961 dialog segfaults. Better to annoy some Lambert-93 users with a
962 spelling mistake than every Fedora Core 3 user of Thuban-CVS.
963
964 2005-01-20 Bernhard Reiter <[email protected]>
965
966 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
967 docstring and comment that the warning code here is a hack.
968
969 2005-01-20 Russell Nelson <[email protected]>
970
971 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
972 user about misprojected layers when their lat/lon bounding
973 box exceeds rational lat/lon values.
974
975 2005-01-20 Bernhard Reiter <[email protected]>
976
977 * Thuban/UI/about.py (unicodeToLocale): Improved:
978 Use 'ascii' and then 'replace' for other characters
979 when getdefaultlocale returns None. Thanks to Bernhard H. .
980
981 2005-01-20 Bernhard Reiter <[email protected]>
982
983 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
984 that OnRangeText might be called twice and using None as argument.
985
986 2005-01-20 Bernhard Reiter <[email protected]>
987
988 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
989 OnRangeText(0) to work around a different in wx Behaviour noticed
990 on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
991
992 2005-01-20 Bernhard Reiter <[email protected]>
993
994 * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
995 None. (Fixes rt#2910.)
996
997 2005-01-18 Frank Koormann <[email protected]>
998
999 New Extension: mouseposition
1000 Tool to collect mouse click positions (map coordinates) in a dialog.
1001
1002 * Extensions/mouseposition/__init__.py: New, extension registration
1003
1004 * Extensions/mouseposition/mouseposition.py: New, implements the
1005 dialog and adds a tool to Thuban mainwindow.
1006
1007 * Extensions/mouseposition/position.xpm: New, icon for tool.
1008
1009 2005-01-14 Jan-Oliver Wagner <[email protected]>
1010
1011 * Doc/manual/thuban-manual-de.xml: More translations.
1012
1013 2005-01-11 Frank Koormann <[email protected]>
1014
1015 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1016 Fix indention bug.
1017
1018 2005-01-09 Frank Koormann <[email protected]>
1019
1020 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1021 BugFix 2901: Explicitly copy layers ClassificationColumn since it
1022 is not part of the layers Classification.
1023
1024 2005-01-03 Frank Koormann <[email protected]>
1025
1026 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
1027 BugFix 2883: Former implementation only worked on classified point
1028 layers: KeyError was raised, now use the default size if field is None.
1029
1030 2004-12-27 Bernhard Reiter <[email protected]>
1031
1032 svgexport 1.0.0cvs: Fixed label export.
1033
1034 * Extensions/svgexport/test/test_svgmapwriter.py:
1035 class TestSVGRenderer(): New class; new test test_label_font().
1036
1037 * Extensions/svgexport/svgmapwriter.py
1038 (SVGRenderer.label_font()): initialised Font size with self.factor now,
1039 makes test_label_font happy.
1040
1041 * Extensions/svgexport/TODO: crossed out fixed label export item.
1042 Added item for options.
1043
1044 * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
1045
1046 2004-12-27 Russell Nelson <[email protected]>
1047
1048 Middle mouse button pans.
1049
1050 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
1051 OnMiddleDown and OnMiddleUp events.
1052 (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
1053 previously used tool.
1054 (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
1055 pressing the middle mouse button.
1056
1057 2004-12-27 Jan-Oliver Wagner <[email protected]>
1058
1059 * Doc/manual/thuban-manual-de.xml: More translations.
1060
1061 2004-12-23 Jan-Oliver Wagner <[email protected]>
1062
1063 * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
1064 \n to stderr after the warnings. Thanks to Russell Nelson.
1065
1066 2004-12-20 Nina Hueffmeyer <[email protected]>
1067
1068 * Extensions/ogr/ogrshapes.py: Fixed some issues from
1069 Bernhard (coding guidelines etc.). Additionally it is now possible to
1070 display shapefiles containing feature collections (e.g.polygons
1071 with holes). Works with gdal 1.2.1 now.
1072
1073 * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
1074 from Bernhard (coding guidelines etc.). If ogr can't be imported,
1075 tests are skipped now.
1076
1077 * Extensions/ogr/ogrstart.py: Fixed some typings.
1078
1079 2004-12-20 Bernhard Reiter <[email protected]>
1080
1081 * Extensions/svgexport/TODO: updated to add support for
1082 raster layers and labels for 1.0.1.
1083
1084 * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
1085 Issue a warning now.
1086
1087 2004-12-19 Bernhard Reiter <[email protected]>
1088
1089 * Extensions/svgexport/TODO: Added idea to support triggering
1090 the application down the pipe.
1091
1092 2004-12-19 Bernhard Reiter <[email protected]>
1093
1094 svgexport: Improved code quality, mainly by better naming.
1095
1096 * Extensions/svgexport/svgmapwriter.py:
1097 DrawPath() renamed to DrawPolygonPath(),
1098 added documentation, improved comments and variable names.
1099
1100 * Extensions/svgexport/svgmapwriter.py,
1101 Extensions/svgexport/test/test_svgmapwriter.py:
1102 All using DrawPolygonPath() now, the default parameter closed=True
1103 omitted.
1104
1105 * Extensions/svgexport/test/test_svgmapwriter.py:
1106 renamed test_polygon_opened() to test_polyline()
1107 renamed test_transparent_polygon() to test_transparent_polyline()
1108
1109 2004-12-18 Jan-Oliver Wagner <[email protected]>
1110
1111 Some fixes of gns2shp extension.
1112
1113 * Extensions/gns2shp/test/__init__.py: New. Make this directory a
1114 package.
1115
1116 * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
1117 dynamically.
1118
1119 * Extensions/gns2shp/test/README: Simplified description how to test.
1120
1121 * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
1122 fixed some dimensions of fields according to the GNS documentation
1123 which seems to change undocumented.
1124 Now killing trailing \n and/or \r from MODIFY_DATE.
1125 This fixes RT#2453.
1126
1127 2004-12-18 Bernhard Reiter <[email protected]>
1128
1129 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
1130
1131 * Extensions/svgexport/test/test_svgmapwriter.py:
1132 Added new tests: test_export_polygon_with_hole()
1133 and test_polygon_with_hole().
1134
1135 * Extensions/svgexport/svgmapwriter.py
1136 (draw_polygon_shape()): Uses DrawPath correctly now.
1137
1138 * Doc/manual/thuban-manual.xml: Added documentation for stable
1139 extention svgexport.
1140 * Doc/manual/thuban-manual-de.xml: Copied English section about
1141 svexport over.
1142
1143 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
1144
1145 * Extensions/svgexport/svgsaver.py,maplegend.py:
1146 Moved from experimental to stable extension menu.
1147
1148 * Extensions/svgexport/TODO: updated.
1149
1150
1151 2004-12-18 Bernhard Reiter <[email protected]>
1152
1153 Added Extensions/svgexport/TODO
1154
1155 2004-12-18 Bernhard Reiter <[email protected]>
1156
1157 Refactored in svgexport:
1158 DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
1159
1160 * Extensions/svgexport/svgmapwriter.py
1161 Added verbosity level 3 to print out polygon points.
1162 (class Point): added __repr__
1163 (class Brush, __str__()): Added space after ,.
1164 (DrawPolygon): Renamed to DrawPath()
1165 (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
1166 (DrawLines): Using DrawPath now.
1167
1168 * Extensions/svgexport/test/test_svgmapwriter.py:
1169 Replaced DrawPolygon() calls with DrawPath() and put the first argument
1170 inside another list. Adapted test data with a newline before "M".
1171
1172 2004-12-18 Bernhard Reiter <[email protected]>
1173
1174 Refactored svgexport tests: 9 double tests runs eliminated;
1175 code size reduced by 8 lines.
1176
1177 * Extensions/svgexport/test/test_svgmapwriter.py:
1178 (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
1179 (class BaseWithDCtools): New, subclass from BaseTestWithDC.
1180 (class TestDrawSplines): now subclass from BaseTestWithDCtools,
1181 this fixed the double running of the nine tests of TestVirtualDC.
1182 (class TestVirtualDC): Using self.dc and self.file from setUp().
1183
1184 2004-12-17 Bernhard Herzog <[email protected]>
1185
1186 Two windows specific fixes ported from thuban-1­0-branch:
1187
1188 * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
1189 instead of getlocale because getlocale doesn't return a usable
1190 encoding name on a german windows 2000
1191
1192 * setup.py: windows build: Removed the absolute path names and
1193 made all prfixes relative to the directory containing setup.py.
1194 Makes it a little easier to adapt to a different system.
1195
1196 2004-12-16 Bernhard Herzog <[email protected]>
1197
1198 Add support for PostGIS tables with LINESTRING geometries.
1199 Fixes RT#2299
1200
1201 * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
1202
1203 * test/postgissupport.py
1204 (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1205 table to "roads-multi" because it now uses MULTILINESTRING
1206 geometries and introduce a new "roads" table that uses LINESTRING
1207 (coords_to_multilinestring): Make the doc string more precise
1208 (coords_to_linestring): New. Create a LINESTRING WKT
1209 representatin
1210 (wkt_converter): Add coords_to_linestring
1211 (upload_shapefile): Rephrase the doc-string a bit.
1212
1213 * test/test_postgis_db.py (TestPostGISShapestoreArc)
1214 (LineStringTests)
1215 (TestPostGISShapestoreLineString)
1216 (TestPostGISShapestoreMultiLineString): Split
1217 TestPostGISShapestoreArc into a base class LineStringTests and two
1218 derived classes TestPostGISShapestoreLineString for LINESTRING
1219 geometries and TestPostGISShapestoreMultiLineString for
1220 MULTILINESTRING geometries. Most test methods are in the base
1221 class with the exception of tests that explicitly check the raw
1222 format.
1223
1224 2004-12-16 Bernhard Herzog <[email protected]>
1225
1226 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1227
1228 * test/postgissupport.py (find_postgis_sql): Different postgis
1229 versions put the postgis.sql file into slightly different places
1230 so we have to look in both. The updated doc string describes this
1231 is more detail.
1232
1233 * test/test_postgis_db.py
1234 (TestPostGISSpecialCases.test_column_name_quoting): The return
1235 value of UniqueValues is unsorted, so it has to be sorted for
1236 comparison.
1237
1238 2004-12-16 Bernhard Herzog <[email protected]>
1239
1240 Fix for RT#2237
1241
1242 * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1243 panel to be shown is the UnknownProjPanel disable the OK and Try
1244 buttons. Otherwise enable them.
1245 (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1246 the parameters. In that case __GetProjection also returns None
1247 now.
1248
1249 2004-12-15 Bernhard Herzog <[email protected]>
1250
1251 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1252 minimum number of classes to 2. The calculate_quantiles needs at
1253 least two and raises an exception otherwise.
1254 Fixes RT#2549
1255
1256 2004-12-15 Bernhard Herzog <[email protected]>
1257
1258 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1259 so that it returns a result for select statements.
1260 (PostgreSQLServer.server_version): New. Return the version of the
1261 server software.
1262 (PostgreSQLServer.require_authentication): The format of
1263 pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
1264 server version and generate the file in the correct format
1265
1266 2004-12-15 Bernhard Herzog <[email protected]>
1267
1268 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1269 in the doc string and rephrase it a little.
1270
1271 2004-12-15 Frank Koormann <[email protected]>
1272
1273 * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1274 session has been loaded successfully. The check is called by the relevant
1275 tests after executing load_session().
1276
1277 2004-12-13 Bernhard Herzog <[email protected]>
1278
1279 Make sure the region used to determine which shapes are visible
1280 actually matches the region on the printed page. If this isn't
1281 done properly some shapes might not be printed.
1282 Fixes RT #2692
1283
1284 * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1285 renderer has to be at the same position as the mapregion
1286
1287 * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1288 has to be moved by (self.shiftx, self.shifty) too.
1289
1290 2004-12-13 Bernhard Herzog <[email protected]>
1291
1292 * libraries/pyprojection/Projection.i: Work around a bug in the
1293 generated python code which leads to exception in the __del__
1294 method when the constructor fails. See the comments in the code
1295 for more details.
1296
1297 * libraries/pyprojection/Projection.py: Updated from Projection.i
1298 with SWIG.
1299
1300 2004-12-13 Bernhard Herzog <[email protected]>
1301
1302 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1303 (TestAltPath.test_02_path_error_fix_from_list)
1304 (TestAltPath.test_05_path_error_fix_from_list_changed)
1305 (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1306 is destroyed in tearDown, so there's no need to do it in a test
1307 case.
1308
1309 * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1310 debug print
1311
1312 2004-12-13 Bernhard Herzog <[email protected]>
1313
1314 * Extensions/svgexport/test/test_svgmapwriter.py
1315 (TestDrawSplines.setUp): Do not use super with the unittest
1316 classes because in Python 2.2 they're still old-style classes.
1317
1318 2004-12-13 Frank Koormann <[email protected]>
1319
1320 Alternative Path feature: When loading a (moved) session where
1321 shapefiles cannot be found, ask the user. Use the specified path
1322 if further shapefiles are missing. However, ask the usr for confirmation
1323 in such cases.
1324
1325 * test/test_load.py (TestAltPath): New, tests for alternative path feature
1326 in load_session()
1327 (Shapefile_CallBack): Helper, implements controllable callback.
1328
1329 * Thuban/UI/application.py (ThubanApplication.OnInit):
1330 Added "alt_path" to self.path
1331 (ThubanApplication.OpenSession): Added shapefile_callback as second
1332 callback similar to db_connection_callback.
1333 (ThubanApplication.run_alt_path_dialog): New, implementaion of
1334 shapefile_callback. In addition to raising the dialog the control of
1335 self.path('alt_path') is implemented here.
1336
1337 * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1338 (SessionLoader.open_shapefile): Open shapefile, eventually with
1339 alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1340 formerly used in start_fileshapesource()/start_layer().
1341 (SessionLoader.start_fileshapesource): Call open_shapefile().
1342 (SessionLoader.start_layer): Call open_shapefile().
1343 (load_session): Added shapefile_callback.
1344
1345 * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1346 feature (search / check).
1347
1348 * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1349
1350 2004-12-11 Bernhard Reiter <[email protected]>
1351
1352 svgexport 0.9.2: Point size supports for maps.
1353
1354 * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1355 (def draw_point_shape): new parameter size defaults to 2 as before.
1356 (draw_shape_layer_incrementally): Moved draw_func log line higher.
1357 Added draw_func call with size when dealing with a point layer.
1358
1359 * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1360
1361 2004-12-11 Bernhard Reiter <[email protected]>
1362
1363 Made sure that newlines are inserted in the svg path d attributes
1364 to raise the chance that the line length will be below 255 characters,
1365 as recommended by REC SVG 1.1 in section 8.3.1.
1366
1367 * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1368 Adding \n before L's and changed whitespace handling.
1369
1370 * Extensions/svgexport/test/test_svgmapwriter.py:
1371 Adapted tests to new whitespace handling of DrawPolygon.
1372
1373 2004-12-11 Bernhard Reiter <[email protected]>
1374
1375 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1376
1377 * Extensions/svgexport/test/test_svgmapwriter.py:
1378 Removed test_drawbezier in favour of new test_drawspline3 and
1379 test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1380 All only to test DrawSpline.
1381
1382 * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1383 New implementation now really using the strange algorithm of
1384 xfig 3.1's approximated splines and its conversion to postscript
1385 with one twist: SVG can do quadratic beziers, so skipped translation
1386 to cubic beziers.
1387 (TestWithDC): Typo in comment fixed.
1388
1389 2004-12-09 Martin Schulze <[email protected]>
1390
1391 * Thuban/Model/classgen.py: Added missing character encoding
1392
1393 * Extensions/wms/properties.py (OpenWMSProperties): removed
1394
1395 * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1396 support for get_srs_discrepancies() since there are no
1397 discrepancies anymore (was a thinko)
1398
1399 * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1400 format priority now that more formats are supported globally by
1401 the render engine.
1402
1403 2004-12-08 Silke Reimer <[email protected]>
1404 * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1405 because it is not available in all versions of ogr
1406
1407 2004-12-08 Bernhard Reiter <[email protected]>
1408 * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1409 global tests until a real one is commited.
1410
1411 2004-12-07 Nina Hüffmeyer <[email protected]>
1412
1413 * /Extensions/ogr/: Adding a new extension to read shapefiles with
1414 ogr. It is planned to add other vector formats.
1415
1416 * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1417
1418 2004-12-07 Jan-Oliver Wagner <[email protected]>
1419
1420 * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1421 part of a (non-)fix to renable that the tests are always
1422 executed.
1423
1424 2004-12-07 Bernhard Reiter <[email protected]>
1425
1426 * Extensions/svgexport/test/test_svgmapwriter.py:
1427 Added test_drawbezier() to test DrawSpline().
1428
1429 * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1430 Really implemented bezier drawing.
1431
1432 * Extensions/svgexport/__init__.py: Bumped version of svgexport
1433 to 0.9.1 because now the legend examples lines styles
1434 will be drawing with beziers.
1435
1436 2004-12-05 Martin Schulze <[email protected]>
1437
1438 * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1439 GIF as supported bitmap image formats (helpful for the WMS extension)
1440
1441 2004-11-30 Martin Schulze <[email protected]>
1442
1443 * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1444 Improved the test for the internal compare method
1445
1446 2004-11-27 Jan-Oliver Wagner <[email protected]>
1447
1448 * Thuban/UI/about.py (About.__init__): Added
1449 Norbert Solymosi for hungarian translation and Ole Rahn
1450 as contrbutor. Moved Bernhard Reiter from Contributor
1451 to Developer.
1452
1453 2004-11-27 Bernhard Reiter <[email protected]>
1454
1455 * Extensions/svgexport/test/test_svgmapwriter.py:
1456 Removed Jan from author list as he did not change enough significant
1457 lines yet.
1458
1459 * Extensions/svgexport/__init__.py: Added Bernhard as author
1460 of the Extension.
1461
1462 2004-11-27 Jan-Oliver Wagner <[email protected]>
1463
1464 * po/hu.po: New. Hungarian translation. Contributed
1465 by Norbert Solymosi.
1466
1467 2004-11-26 Bernhard Herzog <[email protected]>
1468
1469 * Extensions/svgexport/test/test_svgmapwriter.py
1470 (Testobjectexport.test_transparent_polygon): Commented out some
1471 debug prints
1472
1473 2004-11-24 Jan-Oliver Wagner <[email protected]>
1474
1475 Fix broken tests for svg extension and added svg legend
1476 to Experimental menu.
1477
1478 * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1479 the test run correctly even if the extension is a package.
1480 Also removed the "import Thuban" which makes no sense.
1481
1482 * Extensions/svgexport/__init__.py: Fix to have the extensions'
1483 test module also be executed from the global test routine.
1484 This is done by looking for the absense of the DISPLAY variable.
1485
1486 * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1487 to Experimental menu since this module has yet not reached a stable
1488 status (ie. 1.0).
1489
1490 2004-11-22 Bernhard Reiter <[email protected]>
1491
1492 * Extensions/svgexport/svgmapwriter.py:
1493 Added verbose variable and some logging depending on it.
1494 (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1495 because counting i is not necessary.
1496 (class Pen, class Brush): Added simple __str__ methods.
1497 (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1498 not exported to svg file) Note: holes still unhandled.
1499
1500 * Extensions/svgexport/test/test_svgmapwriter.py:
1501 Made a baseclass TestWithDC for test needed a DC.
1502 Added tests for bug #2698 (transparent polygons are not
1503 exported to svg file):
1504 Testobjectexport.test_transparent_polygon()
1505
1506 * Thuban/Model/base.py (UnsetModified):
1507 Fixed some typos in docstring.
1508
1509 * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1510 Added hints on the used algorithm for handling holes.
1511
1512 2004-11-20 Jan-Oliver Wagner <[email protected]>
1513
1514 Some face lifting for the examples.
1515
1516 * Examples/__init__.py: Make this directory a package.
1517
1518 * Examples/simple_extensions/__init__.py: Make this directory a package.
1519
1520 * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1521 menu to Examples menu.
1522
1523 * Examples/simple_extensions/simple_command.py: Some more comments,
1524 minor changes.
1525
1526 * Examples/simple_extensions/simple_tool.py: Minor changes.
1527
1528 2004-11-20 Jan-Oliver Wagner <[email protected]>
1529
1530 Changed way of extension registry for wms and added extension
1531 registry for umn_mapserver extension.
1532
1533 * Extensions/wms/__init__.py: Added registry entry and the importing
1534 of the actual wms module. Included a test for the required PyOGCLib.
1535
1536 * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1537
1538 * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1539 importing of the actual umn mapserver management modules.
1540 Included a test for the required Python MapScript.
1541
1542 2004-11-20 Jan-Oliver Wagner <[email protected]>
1543
1544 Changed way of extension registry for importAPR, bboxdump
1545 and added extension registry for svgexport.extension registry for
1546 svgexport.
1547
1548 * Extensions/importAPR/__init__.py: Added registry entry and the importing
1549 of the actual importAPR module.
1550
1551 * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1552 __init__.py).
1553
1554 * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1555 »···of the actual bboxdump module.
1556
1557 * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1558 »···__init__.py).
1559
1560 * Extensions/svgexport/__init__.py: Added registry entry and the importing
1561 of the svgsaver module.
1562
1563 * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1564 to Experimental menu since this module has yet not reached a stable
1565 status (ie. 1.0).
1566
1567 2004-11-18 Jan-Oliver Wagner <[email protected]>
1568
1569 Now the hit test considers the size of point symbols.
1570
1571 * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1572 'size' defaulting to the previously fixed value 5.
1573 Extended doc-string.
1574 (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1575 for symbols.
1576 Now the size of the largest point symbol is determined to find out
1577 about whether the point has been hit.
1578 This fixes the problem that only clicks inside a fixed distance of
1579 5 where found.
1580
1581 2004-11-17 Jan-Oliver Wagner <[email protected]>
1582
1583 Another open issue fixed regarding sizeable symbols: correct rendering of
1584 selected symbols.
1585
1586 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1587 Added consideration of the specific size of point symbols.
1588 The property for each point symbol is retrieved and the size applied
1589 for the rendering method.
1590 Added doc-string.
1591
1592 2004-11-16 Jan-Oliver Wagner <[email protected]>
1593
1594 Changed way of Extension Registry for gns2shp and profiling.
1595
1596 * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1597 __init__.py).
1598
1599 * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1600 of the actual gns2shp module.
1601
1602 * Extensions/profiling/profiling.py: Removed registry entry (moved to
1603 __init__.py).
1604
1605 * Extensions/profiling/__init__.py: Added registry entry and the importing
1606 of the actual profiling module.
1607
1608 2004-10-28 Bernhard Reiter <[email protected]>
1609
1610 * Extensions/svgexport/: Minor improvements to doc strings.
1611
1612 2004-10-07 Jan-Oliver Wagner <[email protected]>
1613
1614 Further elements for sizable point objects now
1615 making this feature usable though not yet complete.
1616
1617 * Thuban/Model/save.py (SessionSaver.write_classification): Write
1618 attribute 'size' for cldata when the shape layer is of point type.
1619 This also now make the test_load.py tests happy.
1620
1621 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1622 gradient.
1623
1624 * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1625 ID_SELPROP_SPINCTRL_LINEWIDTH.
1626 (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1627 (ID_SELPROP_SPINCTRL_SIZE): New Id.
1628 (SelectPropertiesDialog.__init__): Added a second spin control
1629 for the size in case the corresponding layer is of point type.
1630 (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1631 (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1632 (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1633 and refresh preview.
1634
1635
1636
1637 2004-10-04 Martin Schulze <[email protected]>
1638
1639 * Extensions/wms/test/test_parser.py
1640 (TestWMSCapabilitiesParser.test_compareLists): Added missing
1641 self-test for compareLists()
1642 (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1643 self-test for compareDicts()
1644 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1645 to verify the test routine fails with non-equal arguments
1646 (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1647 to verify the test routine fails with non-equal arguments
1648
1649 2004-10-03 Jan-Oliver Wagner <[email protected]>
1650
1651 First elements for sizeable point objects.
1652
1653 * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1654
1655 * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1656
1657 * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1658 of a corresponding argument is given.
1659 (TestSymbolSize): New. Test the size attribute of cldata.
1660
1661 * Thuban/Model/classification.py: Removed some trailing whitespaces.
1662 (ClassGroupProperties.__init__): Set default size.
1663 (ClassGroupProperties.SetProperties): Set the size.
1664 (ClassGroupProperties.GetSize): New. Return the size.
1665 (ClassGroupProperties.SetSize): New. Set the size.
1666 (ClassGroupProperties__eq__): Compare also size.
1667 (ClassGroupProperties__repr__): Print also size.
1668
1669 * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1670 the size attribute.
1671
1672 * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1673 Also, now there is a return value that indicates whether the drawing
1674 size exceeded the given rect extent and if so the new extent.
1675 Finally, point objects are drawn depending on the size. If either
1676 the width or height is exceeded, the new extent is returned.
1677 (ClassRenderer.Draw): Now when calling the previewer drawing function,
1678 evaluate the return value and, if not None, adapt the grid widget size
1679 accordingly and redraw again.
1680
1681 * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1682 If the draw function is for points, call it with the size as additional
1683 parameter.
1684 (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1685 the size. Compute the radius using the size.
1686
1687 * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1688 that Thuban supports size, apply this correctly.
1689
1690 * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1691
1692 2004-10-03 Jan-Oliver Wagner <[email protected]>
1693
1694 * Doc/manual/thuban-manual-de.xml: Started translation of
1695 Map chapter.
1696
1697 2004-10-01 Martin Schulze <[email protected]>
1698
1699 * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1700 argument for general use through properties-dialog selector
1701
1702 * Thuban/UI/classifier.py: Register properties dialog classes for
1703 both provided layer classes/types.
1704
1705 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1706 map can be retrieved through the parent which is passed to the
1707 constructor anyway and doesn't require an argument of its own,
1708 required for the unification of arguments for general use through
1709 properties-dialog selector.
1710 (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1711 whether a dialog is already opened (and raising it to the users
1712 attention) and creating a new dialog into a function of its own
1713 (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1714 method
1715 (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1716 global registration of properties dialog classes (which are indeed
1717 layer-specific).
1718
1719 * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1720 for general use through properties-dialog selector, the map can be
1721 retrieved through the parent and doesn't require an argument of
1722 its own.
1723
1724 * Extensions/wms/wms.py: Register the properties dialog class for
1725 the provided WMS layer
1726
1727 2004-09-28 Jan-Oliver Wagner <[email protected]>
1728
1729 New feature: Registry for Extensions.
1730
1731 * Thuban/UI/extensionregistry.py: This module defines a registry for
1732 Extensions.
1733
1734 * Thuban/UI/about.py (About.__init__): Added description
1735 of the registered extensions with all of the information.
1736
1737 * Thuban/Model/extension.py (Extension): Improved doc-string.
1738
1739 * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
1740 Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
1741 Extensions/wms/wms.py: Added registration of the extension.
1742
1743 2004-09-27 Bernhard Reiter <[email protected]>
1744
1745 More fixes to svgexport to make used ids unique and
1746 conforming to XML's Name production.
1747
1748 * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
1749 test_xml_id_constraints(), test_make_ide_nosetbaseid() and
1750 test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
1751 Added Bernhard R. as author.
1752 * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
1753 concatenation char now (makes test_make_ide_nosetbaseid() valid).
1754 Also transform second id part with "%d" and catch the TypeError
1755 to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
1756 Corrected typo inBernhard's author line.
1757 (SetBaseID): Return the transformed base id. Transform characters
1758 which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
1759 import binascii. If to be set string starts with "xml" or so, add "t".
1760 (draw_shape_layer_incrementally): use the returned value of SetBaseID
1761 for used_baseids checks.
1762
1763 2004-09-25 Bernhard Herzog <[email protected]>
1764
1765 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
1766 Remove a debug print and some tab characters.
1767
1768 2004-09-25 Bernhard Reiter <[email protected]>
1769
1770 * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
1771 (SetBaseID, SetID, make_id): Improved docstring comments to explain
1772 the interaction of the three functions and the XML id contrains.
1773
1774
1775 2004-09-23 Jan-Oliver Wagner <[email protected]>
1776
1777 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
1778 Module.
1779
1780 * Doc/README: Added info on ThubanModel.xmi.
1781
1782 2004-09-23 Jan-Oliver Wagner <[email protected]>
1783
1784 * Doc/README: New. Some info about how to generate technical
1785 documentation from the source code.
1786 This text was send to the Thuban developer mailing list on
1787 September 21st 2004 by Bernhard Reiter.
1788
1789 2004-09-21 Bernhard Reiter <[email protected]>
1790
1791 Improved the svgexport to only use unique ids. Will issues
1792 an error message dialoge when two layer names are the same.
1793 ShapeIDs are now added with a dash within the svg ids.
1794
1795 * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
1796 * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
1797 (TestSVGRenderer): New test class with test_make_in() and
1798 test_check_for_layer_name_clash()
1799 * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
1800 and draw_shape_layer_incrementally() to not use a baseid twice,
1801 satisfying test_check_for_layer_name_clash()
1802 (VirtualDC.make_id): Use a dash between baseit and id, satisfies
1803 test_make_in().
1804 * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
1805 and wxICON_HAND.
1806 (write_to_svg): Put dc and rendering in a try statement and on
1807 catching SVGmapWriterError notify the user and delete the target file.
1808
1809 2004-09-20 Bernhard Reiter <[email protected]>
1810
1811 * Model/base.by, Model/layer.py: Fixed typos in docstrings.
1812
1813 2004-09-03 Jan Schüngel <[email protected]>
1814
1815 * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
1816 small bug with the line color. Now the line color will now only set
1817 if it is set in Thuban an not Transparent.
1818
1819 * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
1820 deleting the layers from mapfile. Now all layers will delete backwards
1821 from the last.
1822
1823 2004-08-20 Silke Reimer <[email protected]>
1824
1825 * Thuban/Model/layer.py:
1826 Fixes bug in projection handling: Otherwise very large region might not
1827 have valid values in the layer's projection.
1828
1829 2004-08-20 Silke Reimer <[email protected]>
1830
1831 * Thuban/UI/about.py:
1832 small changes to be consistent with coding style.
1833
1834 2004-08-13 Martin Schulze <[email protected]>
1835
1836 * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
1837 Adjusted a comment
1838
1839 2004-08-11 Silke Reimer <[email protected]>
1840
1841 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
1842 too many and too enhanced imports of locale
1843
1844 2004-08-10 Silke Reimer <[email protected]>
1845
1846 * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
1847 function unicodeToLocale() to convert special characters to users
1848 locale encoding
1849
1850 2004-08-10 Jan-Oliver Wagner <[email protected]>
1851
1852 * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
1853 lower case letter'
1854
1855 2004-08-09 Jan Schüngel <[email protected]>
1856
1857 * ChangeLog: Rewrite the last ChangeLog entry to follow
1858 the standard way.
1859
1860 * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
1861 the function where it is needed, because it don't works if it stands
1862 at the beginning.
1863 (MF_Layer.__init__): Removed the extra numclassed variable. Now
1864 numclasses from the mapscript will be used.
1865 (MF_Layer.get_index): New. Return the index of the layer in mapfile.
1866 (MF_Layer.set_classes): New. A Classlist will be set to the layer.
1867 (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
1868 (MF_Layer.remove_allclasses): New. All class of the layer will remove.
1869 (MF_Map.create_new_layer): New. A new Layer is created and associated
1870 with the mapscript object.
1871 (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
1872 the mapscript.
1873 (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
1874 linked to the layer in thuban, else the layerobject linked to the
1875 thubanlayer will be used.
1876 AnnotationLayer will now store the filename of the shapefile.
1877 (MF_Map.remove_layer): If a layer is removed the associated object
1878 must be set new.
1879
1880 * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
1881 layers which are exists in thuban to the mapobj. All removed Layers
1882 will be removed from the mapobj.
1883 Added comments to all functions.
1884 (thuban_to_map): No layer will be removed here.
1885
1886 * Extensions/umn_mapserver/mf_handle.py
1887 (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
1888 Layersettings for the mapserver kann be edited.
1889
1890 * Extensions/umn_mapserver/mf_import.py: Now all layers which are
1891 imported, will be linked with the associated MF_Layer.
1892 (import_mapfile): All layers, which are not selected, will be removed.
1893 Disable the "import layer from mapfile" menu option.
1894
1895 * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
1896 Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
1897 layer on permanently.
1898
1899 2004-08-03 Jan Schüngel <[email protected]>
1900
1901 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
1902 New. This function removes all metadata
1903 (MF_Layer.set_group): New. Set the group setting.
1904 (MF_Layer.get_group): New. Get the group setting.
1905 (MF_Map): Removed the extra numlayers variable, used the mapscript
1906 parameter instead.
1907 (MF_Map.get_numlayers): New. This get numlayers.
1908 (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
1909 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
1910 if the object is an instance. Also added the annotation layer here to
1911 export, but only the layer is created in the mapfile.
1912
1913 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
1914 the check if a mapobj exist, because its not needed anymore. The
1915 export function is only available if a mapobj exist.
1916 Use the new function to remove all layers.
1917
1918 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
1919 option and the metadata button. The layer dialog is temporary disabled.
1920 (Metadata_CustomDataTable): Added some functions to show the grid
1921 correct.
1922
1923 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
1924 the number of layer from import_mapfile to this function.
1925 (AnnotationLayer): New. This Class shows the Annotation layer in
1926 thuban. The layer don't do anything. It's only to show the layer
1927 and to save the layer order.
1928 (add_annotationlayer): New. Import an annotation layer to thuban.
1929 (select_layer2import): New. Import only layers to thuban and not
1930 the other settings like projection or scalebar.
1931 (create_new_mapfile): Moved the _has_umn_mapobj function and the
1932 create_new_mapfile functions from mf_handle.py to mf_import.py.
1933
1934 * Extensions/umn_mapserver/sample/iceland.map: Added the group
1935 parameter to the roads and cultural layers. Also added a new
1936 Annotation Layer for the cultural points.
1937
1938 * Extensions/umn_mapserver/sample/iceland.html: Added the select
1939 option for the annotation layer.
1940
1941 * Extensions/umn_mapserver/sample/index.html: Added the start
1942 parameter for the annotation layer.
1943
1944 2004-08-01 Jan-Oliver Wagner <[email protected]>
1945
1946 * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
1947 translation completed.
1948
1949 * Doc/manual/thuban-manual.xml (Chapter Session Management):
1950 Fixed unprecise description for Save Session.
1951
1952 2004-07-31 Jan-Oliver Wagner <[email protected]>
1953
1954 Started translation of Users Manual into german.
1955
1956 * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
1957
1958 * Doc/manual/Makefile: Added build instructions for german
1959 users manual.
1960
1961 * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
1962
1963 2004-07-28 Jan Schüngel <[email protected]>
1964
1965 * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
1966 functions. Now all metadata will handle by the function and its not
1967 needed to initialize it from outside. Therefor the associated mapobj
1968 will be stored in the Metadata Object. So we can use the special
1969 functions from the associated mapobj to get the Metadata.
1970 Therefor all initialization code for the metadata is removed from the
1971 other classes.
1972 (MF_Layer): Added a function to get the metadata object.
1973 (MF_Map): Added a function to set the mappath, the path where
1974 the mapfile ist stored.
1975
1976 * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
1977 to set the extent in the mapfile. Now the code is set by the displayed
1978 data in the Thuban-view.
1979 (export_mapfile): The shapepath is now set empty, until relative
1980 pathnames are supported.
1981
1982 * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
1983 metadata. Yet only mapfile metadata are supported. Layer and class
1984 supported are not implemented.
1985 Added a dialog to handle layer informations. The dialog only shows the
1986 selected layer at the moment.
1987
1988 * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
1989 code for setting the extent in thuban. Now the extent is set to the
1990 given extent from the mapfile.
1991 Fixed a logical mistake. Now the extent is set when realy a layer is
1992 loaded, and not if one is selected to load.
1993
1994 * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
1995 move the shown map in the browser.
1996
1997 * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
1998 line to the mapobj and added metadata to the political layer.
1999
2000 * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
2001 for Metadata.
2002
2003 2004-07-26 Martin Schulze <[email protected]>
2004
2005 * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
2006 ClassMapper
2007
2008 * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
2009 case for the new ClassMapper
2010
2011
2012 2004-07-22 Bernhard Herzog <[email protected]>
2013
2014 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
2015 visible extent of the map in projected coordinates
2016
2017 * test/test_viewport.py (SimpleViewPortTest.test_default_size)
2018 (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
2019 tests.
2020 (SimpleViewPortTest.test_visible_extent): New. The real test for
2021 VisibleExtent()
2022
2023 2004-07-22 Bernhard Herzog <[email protected]>
2024
2025 * test/test_viewport.py: Use support.run_tests as the main
2026 function when running asa script.
2027
2028 2004-07-22 Jan Schüngel <[email protected]>
2029
2030 * Extensions/umn_mapserver/mf_export.py: Added "import os"
2031 Removed the old "import Thuban.UI.mainwindow" code.
2032 (tbextent_to_map): Removed the extra function and at the code direct
2033 to "thuban_to_map" function.
2034 (write_creatorcomment): Added. Now a short comment is added to the
2035 beginning of an generated mapfile.
2036 (export_mapfile): Now the Path and filename are saved in to variables,
2037 and not together in one variable. This is needed for the new
2038 write_creatorcomment function.
2039
2040 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
2041 import module "re". Also added Range and the ClassGroupRange import
2042 from Thuban. Both are needed for the new range expression import.
2043 (create_rangeexpression): Added. Creates a Range Expression in Thuban
2044 style from a given mapfile expression.
2045 (added_rasterlayer): Make some small code changes. The shapepath is
2046 now stored in an extra variable and the clazz_name is set empty if no
2047 class name set in the mapfile.
2048 Changed the Error message for Range Expressions, becaus the new
2049 function create a error string which will be shown in the dialog.
2050
2051 * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
2052 range expression import.
2053
2054 2004-07-21 Jan-Oliver Wagner <[email protected]>
2055
2056 * Extensions/umn_mapserver/README: Added hint that
2057 installation as root can be avoided. Removed all tabs.
2058
2059 2004-07-16 Bernhard Herzog <[email protected]>
2060
2061 * test/test_viewport.py
2062 (ViewPortTest.test_changing_map_projection): Check that changing
2063 the projection of an empty map shown in a viewport doesn't lead to
2064 exceptions in the viewport's handler for the
2065 MAP_PROJECTION_CHANGED messages
2066
2067 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
2068 try to keep the same region visible when the map actually contains
2069 something
2070
2071 2004-07-15 Jan Schüngel <[email protected]>
2072
2073 * Extensions/umn_mapserver/mapfile.py: Added a function to get the
2074 mappath directly from the mapobj. Is needed because of the changes
2075 in mf_import.py.
2076 (MF_Layer.add_thubanclass): Added a new comment.
2077 (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
2078 mapobj is empty there is no extent get from thuban an so no one can
2079 set to th mapobj.
2080
2081 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
2082 the discription.
2083 Split the funktion in to three smaller ones. The new functions are
2084 add_rasterlayer, add_polygonlayer and select_layer2import.
2085 Removed the mapfilepath and filepath initialisation, because its know
2086 include in the new functions.
2087 Now nothing will be imported if cancel is pressed in the
2088 layer choice dialog.
2089
2090 2004-07-14 Jan Schüngel <[email protected]>
2091
2092 * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
2093 import.
2094 (MF_Symbolset): Removed the extra variable for numsymbols.
2095 (MF_Class.__init__): Added a comment to the exception clause.
2096 Removed the extent init, because it was not needed anymore.
2097 (MF_Layer.add_thubanclass): Added the code to set the class name to
2098 the expression value from thuban if no label is defined.
2099 Added the code to export Range expressions from thuban to the mapfile.
2100 (MF_Map.set_extent): Removed the exception and replace it by some if
2101 code. If the size of a map is not defined the size will be set to 1,1.
2102 This is necessary because if the extent is set, mapscript checks if
2103 the size is greater than zero.
2104 (MF_Web): Added the get and set function for the template.
2105
2106 * Extensions/umn_mapserver/mf_export.py: Added the function to check
2107 if a mapobject exists and used it to set the status of the menu items.
2108 If no mapfile exists the settings could not be edditied.
2109 Define after which menuitem the exportitem will include.
2110
2111 * Extensions/umn_mapserver/mf_handle.py: Removed the import
2112 Thuban.UI.mainwindow clause, because it is not needed.
2113 Added the command Refresh() to all "OnChangeColor()" functions,
2114 because the color preview window was not updated on a color change.
2115 Added the function to check if a mapobject exists and used it to set the
2116 status of the menu items. If no mapobject exists the settings could not
2117 be edditied.
2118 (Map_Dialog): Moved the imagetype selector from the
2119 Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
2120 (Web_Dialog): Removed the name label and added the template textbox.
2121
2122 * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
2123 the exception handling on loading the layers by an if statement. It
2124 is not necessary to us the exception there.
2125 The Filepath creation now use os.path.join to build the path.
2126
2127 * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
2128 definition from global to the setUp function. Now the testMap will
2129 initialize new on each test.
2130
2131 * Extensions/umn_mapserver/sample/iceland.map: Include three new
2132 classes in the Line Layer, to test logical Expressions.
2133 Set the status of the class "Point9" in the Point Layer to off
2134
2135 2004-07-13 Bernhard Herzog <[email protected]>
2136
2137 * Thuban/UI/baserenderer.py
2138 (BaseRenderer.render_map_incrementally): Fix a logic bug in the
2139 optimization that tries not to draw layers under a raster layer.
2140 The bug was harmless. All it effectively did was to produce The a
2141 strange messages about not being able to draw Layer instances for
2142 all vector layers below a raster layer which would be invisible
2143 anyway because the raster layer currently always covers the entire
2144 window
2145
2146 2004-07-08 Jan Schüngel <[email protected]>
2147
2148 * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
2149 a list of supported outputformats. This formats are not alle supported
2150 because there is no possibility to get the outputformat without the
2151 name known. Make some formal changes to the code.
2152 (MF_Map.set_name()): Fixed a bug if the name is None.
2153
2154 * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
2155 statement, because its not needed anymore. The Outputformat is now
2156 given as string from the object. Make some formal changes to the code.
2157
2158 * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
2159 most of the new setting which were added during the last changes.
2160 Removed the MF_Size Test.
2161
2162 * Extensions/umn_mapserver/test/test.map: Added a new class to the
2163 cultural Layer to test expressions and the the status of that layer
2164 from on to default.
2165 Changed the data path the the correct Thuban Data
2166 Added the Outputformat Object and Symbol Object
2167
2168 2004-07-07 Jan Schüngel <[email protected]>
2169
2170 * Extensions/umn_mapserver/mapfile.py: Added some new
2171 settings to edit (outputformat, label, imagetype)
2172
2173 * Extensions/umn_mapserver/mf_handle.py: Added some setting to
2174 the Label Dialog and add the OutputDialog.
2175 Make some changes to the code order.
2176
2177 2004-07-06 Jan Schüngel <[email protected]>
2178
2179 * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
2180 and line Obj and add the scalebar_status_type, scalebar_style_type and
2181 scalebar_position_type.
2182 Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
2183 are only used to create a Symbol like the circle in Thuban.
2184 Added the scalebarObject (MF_Scalebar)
2185 (MF_Class): Added set_status and get_status.
2186 (MF_Layer.add_thubanclass): Added code to set the class status
2187 (MF_Map): Added code to handle the symbols and scalebar
2188 (MF_Label): Added the set_partials and get_partials functions
2189
2190 * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
2191 from mapfile. Added a function to create a circle object like the one
2192 from thuban if no one exists.
2193
2194 * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
2195 press ok in the assosiated dialog and not at the end of the
2196 colordialog.
2197 Added the Dialog for the Scalebar.
2198 (Label_Dialog): Added the offset option
2199
2200 * Extensions/umn_mapserver/mf_import.py: Added code to import the
2201 status of the Classes.
2202 Fixed a bug with the projection. Now the to_meter parameter will be
2203 added to the Projection only if it doesn't exists.
2204
2205 2004-07-01 Jan Schüngel <[email protected]>
2206
2207 Added the functionality to handle the content thuban is not
2208 able to handle directly.
2209
2210 * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2211 Thuban with the possibility to edit the mapfile content.
2212
2213 * Extensions/umn_mapserver/mf_import.py: Added the possibility
2214 to import mapfiles without any layer selected. So it is possible
2215 to edit the other settings in a mapfile.
2216 (import_mapfile): Added code to use the editing functions.
2217 Added the possibility to import the projection to a layer if one
2218 is defined.
2219 Status settings (On,Off) will now set in thuban (visible, invisible).
2220 fixed a bug with with classnames. If no classname is set in mapfile
2221 the value in Thuban will set to the expression.
2222
2223 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2224 possibility to save a new mapfile or use the old one which is
2225 imported or new created.
2226 Added code to use the editing functions.
2227 Remove some not needed import statements
2228
2229 * Extensions/umn_mapserver/mapfile.py: Added new types which are
2230 need for the editing functions.
2231 Added needed set-functions for the editing functions.
2232 Added the possibility to export rasterimages.
2233 Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2234 MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2235 moment.
2236 (MF_Class.set_thubanstyle): Now point layers will set to a default
2237 symbol to show a circle in mapserver and not only a 1px dot.
2238 (MF_Style.__init__): Fixed a bug with the color. Color was not set
2239 correct before.
2240 (MF_Size): Removed, because it is not needed.
2241
2242 * Extensions/umn_mapserver/README: Added the hints to use the
2243 export and editing functions, too.
2244
2245 * Extensions/umn_mapserver/sample/iceland.map: Added the
2246 new parameter "UNITS METERS".
2247 Change the political layer to status OFF.
2248
2249 * Extensions/umn_mapserver/sample/README: Added some
2250 more details to setup the sample in the MapServer.
2251
2252 2004-06-26 Bernhard Reiter <[email protected]>
2253
2254 * Extensions/svgexport/test/test_svgmapwriter.py:
2255 Removed class VFile and used standard StringIO instead.
2256
2257 2004-06-23 Jan Schüngel <[email protected]>
2258
2259 Add the export function to the umn_mapserver extension.
2260
2261 * Extension/umn_mapserver/mf_export.py: New. This module extents
2262 Thuban with the possibility to export the Thuban content.
2263
2264 * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2265 with the export module. Especially added the possibility to
2266 add thuban objects directly to the map objects.
2267
2268 * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2269 because of the hint from Bernhard Herzog.
2270 Corrected the handling of absolute pathnames.
2271 Changed the Text of the Menu-Item, now the beginning is upper case.
2272
2273 * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2274
2275 2004-06-16 Jan Schüngel <[email protected]>
2276
2277 Add a sample and make some changes.
2278
2279 * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2280 import from * to explicit used statements. Changed the
2281 Thuban.UI.mainwindow import phrase, too.
2282 (import_mapfile):Corrected a clerical mistake.
2283 Added wxCHANGE_DIR in OpenFile Dialog.
2284 Added a MultipleChoiceDialog, to select the layers to load from
2285 mapfile into thuban. Thereby the projection is only set if one layer
2286 is selected.
2287 Added the possibility to handle relative pathnames which uses
2288 up-level references.
2289 Removed some doubled code.
2290 Corrected an error with integer values used as label in thuban
2291 ClassGroup.
2292
2293 * Extensions/umn_mapserver/sample: New.
2294
2295 * Extensions/umn_mapserver/sample/README: New. Describes the
2296 usage of the sample files.
2297
2298 * Extensions/umn_mapserver/sample/iceland.map: New. This is
2299 a suitable .map-file for the iceland data.
2300
2301 * Extensions/umn_mapserver/sample/index.html: New. The template
2302 for the mapfile.
2303
2304 * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2305 file for the Iceland Application on web.
2306
2307 * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2308 some details.
2309
2310 * Extensions/umn_mapserver/test/test_mapserver
2311 (mapserver_import_Test_generalClasses.test_MF_Color):
2312 Corrected the thubancolor test.
2313
2314 2004-06-15 Jan Schüngel <[email protected]>
2315
2316 * Extensions/umn_mapserver/README: New. Install instruction.
2317
2318 2004-06-14 Bernhard Reiter <[email protected]>
2319
2320 * libraries/thuban/cpl_mfile.h: Added copyright header.
2321
2322 * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2323 Free Software License so that it is most useful with gdalwarp
2324 and bmpdataset.
2325
2326 2004-06-14 Bernhard Herzog <[email protected]>
2327
2328 * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2329 import of wxPython.wx itself (as opposed to the contents of
2330 wxPython.wx). For some reason wxPython.wx is available as
2331 wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
2332 wrt. wxPython 2.4.
2333
2334 2004-06-10 Jan Schüngel <[email protected]>
2335
2336 Initial version of new extension "umn_mapserver". This extension aims
2337 to manage configuration for the UMN MapServer application. This
2338 inital version just imports the .map-files and displays all, Thuban is
2339 capable of.
2340
2341 * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2342
2343 * Extensions/umn_mapserver/test/README: New. Describes how to run the
2344 tests.
2345
2346 * Extensions/umn_mapserver/test/test.map: New. This is a test
2347 .map-file for automated tests of the umn_mapserver extension of
2348 Thuban.
2349
2350 * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2351 UMN Mapserver classes.
2352
2353 * Extensions/umn_mapserver/__init__.py: New. Init to make this
2354 directory a package.
2355
2356 * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2357 '.map'-file objects.
2358
2359 * Extensions/umn_mapserver/mf_import.py: New. This module extends
2360 Thuban with the possibility to handle UMN MapServer mapfiles.
2361
2362 2004-06-03 Bernhard Herzog <[email protected]>
2363
2364 * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2365 to a tuple before using it as arguments to the % operator. This
2366 fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2367 reported today on thuban-list by Jan Schüngel
2368
2369 * test/test_layer.py (TestLayerModification.setUp): Save the
2370 filename as an instance variable so we can refer to it in tests
2371 (TestLayerModification.test_tree_info): Uncomment this method
2372 again and make it work. This tests for the formatting issue
2373 filed in RT#2239 on 2004-01-13
2374
2375 2004-05-28 Bernhard Herzog <[email protected]>
2376
2377 * Thuban/UI/baserenderer.py: Fix some typos.
2378
2379 2004-05-18 Jan-Oliver Wagner <[email protected]>
2380
2381 * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2382 by increasing a field size.
2383
2384 2004-05-17 Bernhard Herzog <[email protected]>
2385
2386 Update to newest shapelib and get rid of Thuban specific
2387 extensions, i.e. use the new DBFUpdateHeader instead of our
2388 DBFCommit kludge
2389
2390 * libraries/shapelib/shpopen.c: Update to version from current
2391 shapelib CVS.
2392
2393 * libraries/shapelib/shapefil.h: Update to version from current
2394 shapelib CVS.
2395
2396 * libraries/shapelib/dbfopen.c: Update to version from current
2397 shapelib CVS.
2398 (DBFCommit): Effectively removed since shapelib itself has
2399 DBFUpdateHeader now which is better for what DBFCommit wanted to
2400 achieve.
2401 We're now using an unmodified version of dbfopen.
2402
2403 * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2404 value '1' to the Lib.dbflibc extension. This simply reflects the
2405 shapelib and pyshapelib updates
2406
2407 2004-05-16 Jan-Oliver Wagner <[email protected]>
2408
2409 Finished introduction of Menu.FindOrInsertMenu.
2410
2411 * Extensions/drawshape/drawshape.py: Add the command
2412 to the experimental menu additionally to the toolbar.
2413
2414 * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2415 finding menu on its own.
2416
2417 * Doc/manual/thuban-manual.xml: updated sample file
2418 to use FindOrInsertMenu().
2419
2420 * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2421 instead of finding menu on its own.
2422
2423 2004-05-11 Jan-Oliver Wagner <[email protected]>
2424
2425 * test/test_menu.py (MenuTest.test): Added testing
2426 of method Menu.FindOrInsertMenu.
2427
2428 2004-05-10 Jan-Oliver Wagner <[email protected]>
2429
2430 Introduce and use Menu.FindOrInsertMenu.
2431
2432 * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2433 given menu or, if not found, insert it.
2434
2435 * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2436 /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2437 /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2438 menu on its own.
2439
2440 2004-05-06 Jan-Oliver Wagner <[email protected]>
2441
2442 Introduce a abstract ColorDialog class and remove
2443 and outdated file.
2444
2445 * Thuban/UI/proj4dialog.py: Removed. It is has been
2446 replaced by projdialog for quite a while and is not used
2447 anymore.
2448
2449 * Thuban/UI/colordialog.py: New. Abstraction for color selection
2450 dialog(s).
2451
2452 * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2453 Now calls the abstract ColorDialog instead of wxColourDialog.
2454 This also removed the dependency to Color class conversion
2455 from this function.
2456
2457 2004-05-04 Frank Koormann <[email protected]>
2458
2459 * Extensions/bboxdump/__init__.py: Fixed string left over from
2460 copying.
2461
2462 * Extensions/bboxdump/bboxdump.py (bboxdump):
2463 Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2464 xrange(layer.NumShapes()). Compile the bboxmessage from a list
2465 of formatted outputs (string.join) instead of appending to the
2466 message. Two progress bar dialogs to report progress on the sometimes
2467 lenghty processing.
2468
2469 2004-04-22 Frank Koormann <[email protected]>
2470
2471 New Extension to dump bounding boxes of all shapes of the selected
2472 layer. An optional column can be specified to group the objects,
2473 in this case the bounding box is a union of the separate boxes.
2474 Dump can be displayed in a ScrolledMessageDialog or written to file.
2475 The Extension is simply a combination of available and well tested
2476 Thuban functionality.
2477
2478 * Extensions/bboxdump/__init__.py: New: Init to make this
2479 directory a package.
2480
2481 * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2482 all shapes of the selected layer.
2483
2484 2004-04-22 Jan-Oliver Wagner <[email protected]>
2485
2486 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2487 strings to be i18n now.
2488
2489 2004-04-18 Jan-Oliver Wagner <[email protected]>
2490
2491 Changing popup menu of legend from direct building
2492 to using the Menu construction as used for the mainwindow.
2493
2494 * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2495 layer_to_bottom, layer_visibility
2496 (MainWindow.LayerToTop): New. Put current layer to the top.
2497 (MainWindow.LayerToBottom): New. Put current layer to bottom.
2498 (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2499 Replace 1,0 by True, False.
2500 (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2501 current layer.
2502 (MainWindow.LayerShowTable): Removed raising of dialog.
2503 (_has_selected_layer_visible): New. Support function.
2504
2505 * Thuban/UI/legend.py: ID_POP_xxx: removed.
2506 (LegendPanel.__init__): Removed EVT_MENU bindings.
2507 (LegendTree._OnRightClick): Replace direct creation of
2508 menu via wx Classes by applying the menu definition
2509 as of Menu class of menu.py.
2510
2511 2004-04-16 Jan-Oliver Wagner <[email protected]>
2512
2513 * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2514 button string to stronger clearify that Thuban will be closed when hitting
2515 the button.
2516
2517 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2518 Now for layers without a ShapeStore a corresponding message is given
2519 to the user, that this layer has no table to show.
2520
2521 2004-04-15 Martin Schulze <[email protected]>
2522
2523 * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2524 recalculate the format for the internal render engine as well.
2525
2526 * Extensions/wms/properties.py (wmsProperties): First start for a
2527 properties dialog. It's functional for a first selection of
2528 layers, but still has some weired wxWidgets/GTK problems but
2529 beautification can be done later.
2530
2531 * Extensions/wms/layer.py: Added more documentation
2532 (WMSLayer.getFormats): New: Return list of supported image formats
2533 by the WMS server
2534 (WMSLayer.getLayers): New: Return the list of layer names
2535 supported by the WMS server
2536 (WMSLayer.getLayerTitle): New: Return the title of the named layer
2537 (WMSLayer.getWMSFormat): New: Return the image format that is used
2538 for WMS GetMap requests
2539 (WMSLayer.setWMSFormat): New: Set the image format that is used
2540 for WMS GetMap requests
2541 (WMSLayer.__init__): Move away from using only one layer to using
2542 a list of layers (unsorted at the moment, though).
2543 (WMSLayer.getVisibleLayers): New: Return the list of names for all
2544 visible layers
2545 (WMSLayer.setVisibleLayers): New: Set the list of names for all
2546 visible layers
2547
2548 * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2549 order to establish a clean structure.
2550
2551 * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2552 own in order to establish a clean structure.
2553
2554 2004-04-13 Martin Schulze <[email protected]>
2555
2556 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2557 support for oldstyle (WMS 1.0 apparently) image format
2558 specification.
2559
2560 * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2561 supported graphic formats back to JPEG and BMP, PNG and others are
2562 too *cough* experimental... Sorry, I meant to filter this out
2563 before I committed this part. This should make the WMS extension
2564 run from CVS again.
2565 (wms_dialog): Reset an empty URL to None so that the subsequent
2566 program can depend on this, since the dialog will indeed return an
2567 empty URL, causing another declaration of love by Python.
2568
2569 * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2570 Whenever a native BoundingBox request cannot be fulfilled, check
2571 whether the requested SRS is EPSG:3426, in which case return the
2572 LatLonBoundingBox values.
2573
2574 * Extensions/wms/test/test_parser.py
2575 (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2576 ignoring AUTO:* SRS.
2577 (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2578 Added another test method to test whether the LatLonBoundingBox
2579 values will be returned if BoundingBox values are requested with
2580 SRS set to EPSG:3426.
2581
2582 * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2583 Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2584 the moment by placing them into a variable which is currently
2585 unused. Also test whether the EPSG SRS is numerical as it should
2586 be and add an error message if it is not.
2587
2588 * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2589 appear in the real world as well. Since we cannot handle them yet
2590 (OGCLib can't either), we will ignore them for the moment.
2591
2592 * Extensions/wms/parser.py: Use a variable for denoting the sample
2593 filename
2594 (WMSCapabilitiesParser.peekLayers): Added support for error
2595 messages during grok(). They will be aggregated in an array and
2596 may be displayed later. We may have to add a classification
2597 "Warning" and "Error" to this. That requires more experience,
2598 though, since not every error may be lethal.
2599
2600 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2601 ShowTable() dialog/frame when the user attempts to display it
2602 while it has been opened before already and not closed again.
2603
2604 2004-04-11 Martin Schulze <[email protected]>
2605
2606 * Extensions/wms/infodialog.py: Adjusted the class documentation
2607
2608 * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2609 Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2610 wxWidgets variants.
2611 (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2612
2613 * Extensions/wms/infodialog.py: Added an information dialog that
2614 will display various information about the WMS current resource,
2615 so that additional information such as the title, the abstract,
2616 fees and access constraints can be displayed for the user if they
2617 are documented in the WMS XML.
2618
2619 2004-04-10 Martin Schulze <[email protected]>
2620
2621 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2622 string handling. It's "foo".lower() and not lower(foo) without
2623 lower imported from strings or something.
2624
2625 * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2626 from capabilities.py and parser.py. Implement priority list for
2627 supported graphics formats, take care of wbmp != bmp. PNG, TIFF
2628 and GIF are supported here, but not yet by main Thuban. Hence,
2629 support for them may be removed later. Special contribution to
2630 usability: get wxWidgets to change the cursor when we're waiting
2631 for data from the network so the user won't start to worry. This
2632 causes a redrawing error/warning, though.
2633
2634 * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2635 the DOM object.
2636
2637 2004-04-01 Martin Schulze <[email protected]>
2638
2639 * Extensions/wms/capabilities.py: Adjusted documentation
2640 (WMSCapabilities.__init__): Improved documentation, fixed syntax
2641 (WMSCapabilities.saveCapabilities): Only catch IOError when
2642 handling files
2643 (WMSCapabilities.loadCapabilities): Only catch IOError when
2644 handling files
2645 __main__: corrected variable naming
2646 (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2647 class a specialisation of WMSCapabilitiesParser as well. Also
2648 execute grok() after loading or fetching capabilities, if that
2649 went well, so that subsequent calls can already access the data.
2650 (WMSCapabilities.getVersion): Export the used version of the
2651 GetCapabilities request, so we can use it for subsequent calls,
2652 i.e. for GetMap requests.
2653 (WMSCapabilities.fetchCapabilities): Added proper error handling
2654 when the GetCapabilities request failed, so that the surrounding
2655 program can act accordingly.
2656
2657 2004-03-30 Martin Schulze <[email protected]>
2658
2659 * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2660 Adjusted the getLayerSRS method to return the list of SRSes
2661 extracted from <SRS> elements instead of <BoundingBox> elements.
2662 Added a bit of documentation as well.
2663 (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2664 since it was only implemented due to a misunderstanding.
2665
2666 * Extensions/wms/test/test_parser.py
2667 (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2668 reflect the corrected interpretation of the standard: i.e. a layer
2669 does not have to define a BoundingBox for all SRSes it supports.
2670 Hence the <SRS></SRS> specification is authoritative, not the list
2671 of BoundingBoxes.
2672 (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2673 to ensure None is returned for a non-existing SRS.
2674 (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2675 since it is not applicable anymore. Listing more SRSes in <SRS>
2676 elements is valid according to the specs.
2677
2678 2004-03-26 Bernhard Reiter <[email protected]>
2679
2680 * README: Nicer formatting of text. Improved descriptions.
2681 Reflected wxWidgets name change.
2682
2683 * Thuban/UI/about.py: Extended copyright to 2004 and added
2684 information about the thuban-devel mailinglist.
2685
2686 2004-03-24 Martin Schulze <[email protected]>
2687
2688 * Extensions/wms/capabilities.py: Renamed the class to contain
2689 'WMS', also added a linebreak where required
2690
2691 * Extensions/wms/parser.py: Finally added the XML parser for the
2692 GetCapabilities response.
2693
2694 * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2695 <SRS> elements match the <BoundingBox> elements, except for the
2696 layer 'beschriftung'.
2697
2698 * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2699 since Python uses unicode strings internally, otherwise
2700 comparisons will fail. Removed tests for getLayerBBoxSRS() since
2701 the SRS will be calculated anyway and this method is obsoleted by
2702 getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
2703 Move loading the sample file into the setUp method. Added a test
2704 for finding the integrity problem in the sample response.
2705 Improved formatting.
2706
2707 * Extensions/wms/domutils.py: Added convenience routines for
2708 handling of Document Object Model (DOM) nodes.
2709
2710 * Extensions/wms/test/test_domutils.py: Added a test for the
2711 domutils module
2712
2713 2004-03-19 Martin Schulze <[email protected]>
2714
2715 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2716 Moved path detection and adding into a module of its own,
2717 adjustpath, which exports thubandir as main Thuban directory.
2718
2719 * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2720 detection and adding into a module of its own, adjustpath, which
2721 exports thubandir as main Thuban directory. Reorganised the
2722 module in order to support the SkipTest feature for Thuban test
2723 cases.
2724
2725 * Extensions/wms/test/adjustpath.py: Moved path detection and
2726 adding into a module of its own.
2727
2728 2004-03-18 Martin Schulze <[email protected]>
2729
2730 * Extensions/wms/test/test_parser.py: Added another test for
2731 checking whether the WMS XML parser (to be implemented) returns
2732 the information we expect. This requires a sample WMS WML file
2733 (sample.xml) which has been extracted from the frida server and
2734 "improved" manually.
2735
2736 * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2737 main Thuban directory to the path in order to be able to import
2738 random modules. Adjusted the PyOGCLib detection to reuse the
2739 information gathered. Also added a note about the PYTHONPATH
2740 environment variable.
2741
2742 * Extensions/wms/test/test_ogclib.py: The format specification is
2743 a mime-type, not a graphic format, hence image/jpeg wou ld be the
2744 proper format and not JPEG. We'll also have to take care of the
2745 encoding of / as %2F.
2746
2747 2004-03-16 Martin Schulze <[email protected]>
2748
2749 * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
2750 comprehensive test for the getMapURL method, built compare URLs
2751 according to the documentation in OGC 01-068r3
2752
2753 * Extensions/wms/capabilities.py (WMSCapabilities): Added the
2754 class WMSCapabilities to manage capabilites, will incorporate
2755 parsing the capabilities response and provide details for other
2756 classes.
2757
2758 2004-03-12 Bernhard Herzog <[email protected]>
2759
2760 Support views in addition to normal tables in the postgis
2761 shapestore
2762
2763 * Thuban/Model/postgisdb.py
2764 (PostGISShapeStore._fetch_table_information): Add a fallback for
2765 the case where the table name is not in the geometry_columns
2766 table. This is usually the case for views. Also, set
2767 self.shapestore here.
2768 (PostGISShapeStore.ShapeType): No need to query the database all
2769 the time. The shape type is now determined in
2770 _fetch_table_information
2771
2772 * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
2773 (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
2774 New parameter to specify views.
2775 (PostGISDatabase.has_data): Also compare the views. New views
2776 parameter
2777 (PostGISDatabase.initdb): Create the views.
2778 (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
2779 view
2780
2781 * test/test_postgis_db.py
2782 (TestPostGISShapestorePointFromViews): New. Test a
2783 PostGISShapeStore with a view
2784 (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
2785 the geometry_column explicitly to test whether that works
2786
2787 2004-03-12 Bernhard Herzog <[email protected]>
2788
2789 Final step for explicit id/geometry columns: Loading and saving
2790
2791 * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
2792 with the following changes:
2793 (dbshapesource): Two new attributes id_column and geometry_column
2794
2795 * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
2796 (SessionSaver.write_session): Use the new namespace
2797 (SessionSaver.write_data_containers): Write the new dbshapesource
2798 parameters
2799
2800 * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
2801 the new file format version
2802 (SessionLoader.start_dbshapesource): Handle the new db parameters
2803
2804 * test/test_save.py: Update to the new dtd and namespace
2805 (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
2806 mock object to provide a working IDColumn method.
2807
2808 * test/test_load_1_0.py: New. Copy of the test_load.py before
2809 today's changes but with the round-trip tests removed.
2810
2811 * test/test_load_0_9.py: Update doc-string.
2812
2813 * test/test_load.py: Update all .thuban files to the new dtd and
2814 namespace.
2815 (TestPostGISLayer.file_contents): Add the new dbshapesource
2816 paramters
2817
2818 2004-03-11 Bernhard Herzog <[email protected]>
2819
2820 Next step for explicit id/geometry columns: User interaction
2821
2822 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
2823 the dialog is constructed. Add combo boxes to select id and
2824 geometry column. Rename some instance variables.
2825 (ChooseDBTableDialog.GetTable): Return id and geometry column
2826 names
2827 (ChooseDBTableDialog.OnTableSelect): New. Event handler for
2828 selections in the table list
2829
2830 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
2831 and geometry_column
2832
2833 * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
2834 parameters for id_column and geometry column of PostGISShapeStore
2835 here as well.
2836
2837 * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
2838 (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
2839 (PostGISConnection.GeometryTables): Use a better query to
2840 determine which relations in the database might be usable for
2841 shapestores. Now supports views as well but is more PostgreSQL
2842 specific
2843 (PostGISConnection.table_columns): New. Somewhat experimental
2844 method to let the db dialogs provide lists of columns to users so
2845 that they can select id and geometry columns.
2846 (PostGISTable.__init__): The default value of the id_column
2847 parameter is now None it still means "gid" effectively, though.
2848 (PostGISTable.IDColumn): New introspection method to return a
2849 column object for the id column
2850 (PostGISShapeStore.GeometryColumn): New introspection method to
2851 return a column object for the geometry column
2852
2853 * test/test_postgis_db.py
2854 (TestPostGISConnection.test_gis_tables_non_empty):
2855 Removed. Subsumed by the new:
2856 (TestPostGISConnection.test_gis_tables_with_views_and_tables):
2857 New. Tes the GeometryTables and table_columns methods with actual
2858 tables and views.
2859 (PointTests.test_id_column, PointTests.test_geometry_column):
2860 New. tests for the new methods.
2861 (TestPostGISShapestorePoint.setUp)
2862 (TestPostGISShapestorePointSRID.setUp)
2863 (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
2864 instance variables needed by the new tests
2865
2866 2004-03-11 Bernhard Herzog <[email protected]>
2867
2868 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
2869 numbers given to ReadValue are ordinals.
2870
2871 2004-03-11 Bernhard Herzog <[email protected]>
2872
2873 Elimiate the requirement for PostGIS tables to have a column
2874 called "gid".
2875
2876 * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
2877 id_column to specify which column to use to identify rows. Also
2878 new instance variables id_column and quoted_id_column
2879 (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
2880 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
2881 (PostGISTable.SimpleQuery): Use the id column name provided to the
2882 constructor instead of "gid"
2883 (PostGISShapeStore.__init__): New parameter id_column analogously
2884 to PostGISTable.__init__. This parameter is simply passed through
2885 to the base class constructor
2886 (PostGISShapeStore._create_col_from_description): Fix typo in
2887 doc-string
2888 (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
2889 (PostGISShapeStore.ShapesInRegion): Use the id column name
2890 provided to the constructor instead of "gid"
2891
2892 * test/postgissupport.py
2893 (PostgreSQLServer.get_default_static_data_db): New static table
2894 landmarks_point_id with an id column != "gid. Update the comments
2895 a bit.
2896 (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
2897 doc-
2898 (upload_shapefile): New parameter gid_column to use a name other
2899 than "gid" for the column to store the shape ids
2900
2901 * test/test_postgis_db.py (TableTests): New. Mixin-class
2902 containing all tests previously in TestPostGISTable. The actual
2903 tests are the same but the code is a bit more configurable to
2904 allow for different id columns etc.
2905 (TestPostGISTable): Derive from TableTests now for the actual
2906 tests.
2907 (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
2908 except that it the landmarks_point_id table to test the id_column
2909 parameter
2910 (PointTests): Extend the doc-string
2911 (TestPostGISShapestorePointExplicitGIDColumn)
2912 (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
2913 from PointTests to test the explicit id_column parameter. One
2914 tests with the name of the column holding the shape ids, the other
2915 uses PostgreSQL's OID column. For the latter a number of methods
2916 have to be overwritten to make them independent of the actual id
2917 values.
2918
2919 2004-03-08 Silke Reimer <[email protected]>
2920
2921 Update debian directory:
2922
2923 * debian/changelog: Added new version.
2924 * deiban/rules: Updated management of patches (with cbds)
2925 * debian/control: Added cbds to dependencies
2926 * debian/patches/*: New. Adds better support for patches of thuban in
2927 debian
2928 * debian/menu: Syntax of menu changed slightly
2929 * debian/setup.py.patch: removed because it has been moved to
2930 debian/patechs/setup.py.patch
2931
2932
2933 2004-02-26 Bernhard Herzog <[email protected]>
2934
2935 Create the Doc/technotes directory for text files with information
2936 for developers
2937
2938 * Doc/technotes/README: New. README for the technotes
2939
2940 * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
2941 Thuban
2942
2943 * Doc/technotes/release_process.txt: New. Used to be
2944 HOWTO-Release. Now slightly adapted to technote formatting style.
2945
2946 * HOWTO-Release: Removed. It's contents are now in
2947 Doc/technotes/release_process.txt
2948
2949 2004-02-25 Bernhard Herzog <[email protected]>
2950
2951 * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
2952 version of wxWindows the module was compiled with so we can check
2953 that against the wxPython version.
2954
2955 * Thuban/version.py (thuban_branch, thuban_release): New variables
2956 controlling which and how Thuban versions are shown. See the
2957 comments for details.
2958 (verify_versions): Also check that the wx version that wxproj is
2959 compiled against matches that of the wxPython we use at runtime
2960
2961 2004-02-20 Bernhard Herzog <[email protected]>
2962
2963 * Extensions/wms/wms.py (epsg_code_to_projection): Use
2964 get_system_proj_file to read the epsg projections. The old way
2965 depended on the current directory being the top Thuban directory.
2966
2967 2004-02-20 Bernhard Herzog <[email protected]>
2968
2969 * Extensions/svgexport/test/test_svgmapwriter.py
2970 (TestVirtualDC.test_clippath): Remove a debug print
2971
2972 2004-02-20 Bernhard Herzog <[email protected]>
2973
2974 * Extensions/svgexport/__init__.py: New. Turn
2975 Extensions/svgexport into a package.
2976
2977 * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
2978 doc-string a bit. The doc-string must come first, otherwise it's
2979 not a doc-string. The __future__ import must be the first thing
2980 after the doc-string. Use only double quotes in doc-strings.
2981 Single quotes trip up emacs syntax highlighting if the text
2982 contains apostrophes.
2983
2984 2004-02-20 Bernhard Herzog <[email protected]>
2985
2986 * Extensions/svgexport/test/__init__.py,
2987 Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
2988 suite for svgexport
2989
2990 * test/runtests.py (find_test_modules): New. Function with the
2991 module finding code from main.
2992 (main): Use find_test_modules to figure out the default test
2993 modules and take modules from Extensions.svgexport.test too.
2994
2995 2004-02-19 Bernhard Herzog <[email protected]>
2996
2997 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
2998 the mainwindow has a reference to the map of the initial session.
2999 This fixes a bug introduced with the fix for RT#2245
3000
3001 2004-02-19 Bernhard Herzog <[email protected]>
3002
3003 * Extensions/svgexport/svgsaver.py,
3004 Extensions/svgexport/svgmapwriter.py,
3005 Extensions/svgexport/maplegend.py: Added again. This time in the
3006 correct place.
3007
3008 2004-02-17 Bernhard Herzog <[email protected]>
3009
3010 Fix for RT#2245
3011
3012 * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
3013 instance variables before trying to create any windows. Creating
3014 windows can start an event loop if e.g. message boxes are popped
3015 up for some reason, and event handlers, especially EVT_UPDATE_UI
3016 may want to access things from the application.
3017 (ThubanApplication.maps_changed): The mainwindow may not have been
3018 created yet, so check whether it has been created before calling
3019 its methods
3020
3021 * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
3022 have a map
3023
3024 2004-02-17 Bernhard Herzog <[email protected]>
3025
3026 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
3027 Extensions/svgmapwriter.py, Extensions/maplegend.py,
3028 extensions/svgexport/svgsaver.py,
3029 extensions/svgexport/svgmapwriter.py,
3030 extensions/svgexport/maplegend.py: Removed. These files were in
3031 the wrong places or didn't work at all.
3032
3033 2004-02-16 Bernhard Herzog <[email protected]>
3034
3035 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
3036 line
3037
3038 2004-02-16 Bernhard Herzog <[email protected]>
3039
3040 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
3041
3042 2004-02-15 Markus Rechtien <[email protected]>
3043
3044 * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
3045 to write a session to a file in SVG format.
3046 * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
3047 to write a SVG map of a session.
3048 * Extensions/svgexport/maplegend: New. Writes a basic maplegend
3049 in SVG format for the current session.
3050
3051 2004-02-13 Bernhard Herzog <[email protected]>
3052
3053 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
3054 can't be created, return immediately after displaying the error
3055 message.
3056
3057 2004-02-11 Bernhard Herzog <[email protected]>
3058
3059 Handle postgis tables with more than one geometry column.
3060
3061 * Thuban/Model/postgisdb.py
3062 (PostGISTable._fetch_table_information): Delegate the creation of
3063 column objects to a different method so that we can extend that in
3064 derived classes
3065 (PostGISTable._create_col_from_description): New. Column object
3066 creation part of _fetch_table_information
3067 (PostGISShapeStore._create_col_from_description): New. Extend
3068 inherited method to handle geometry columns
3069 (PostGISShapeStore.__init__): New parameter geometry_column to
3070 specify which geometry column to use. Optional but mandatory for
3071 tables with more than one geometry column
3072 (PostGISShapeStore._fetch_table_information): Also use the name of
3073 the geometry column when looking for the srid
3074 (PostGISShapeStore.ShapeType): Also use the name of the geometry
3075 column when looking for the shape type
3076
3077 * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
3078 NonConnectionStore to changes in the PostGISShapeStore
3079
3080 * test/test_postgis_db.py
3081 (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
3082 PostGISShapeStore with tables having two geometry columns.
3083
3084 2004-02-10 Bernhard Herzog <[email protected]>
3085
3086 Fix some postgis problems. What remains to be done is real
3087 handling of SRIDs as they affect how reprojection is done
3088
3089 * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
3090 doc-string
3091 (PostGISShapeStore._fetch_table_information): New. Extend
3092 inherited method to retrieve srid
3093 (PostGISShapeStore.BoundingBox): Handle tables without data.
3094 extent yields NULL for those
3095 (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
3096
3097 * test/test_postgis_db.py
3098 (TestPostGISSpecialCases.test_shapestore_empty_table): New test
3099 for the special case of a table without any data
3100 (TestPostGISShapestorePointSRID): New class with tests for a table
3101 that uses srids
3102 (PolygonTests): Fix a doc-string typo
3103
3104 * test/postgissupport.py (PostGISDatabase.__init__): New parameter
3105 reference_systems with a specification of spacial reference
3106 systems to create in the new db.
3107 (PostgreSQLServer.new_postgis_db)
3108 (PostgreSQLServer.get_static_data_db): New parameter
3109 reference_systems to be passed through ultimately to
3110 PostGISDatabase. In new_postgis_db also check whether an existing
3111 db already has the right srids
3112 (PostgreSQLServer.get_default_static_data_db): Add srids and a
3113 table that uses srids
3114 (PostGISDatabase.initdb): Create the entries for the reference
3115 systems
3116 (PostGISDatabase.has_data): Add reference_systems parameter to
3117 check for those too
3118 (upload_shapefile): New parameter srid to create tables with a
3119 specific srid
3120
3121 2004-02-06 Frank Koormann <[email protected]>
3122
3123 * po/pt_BR.po: Fixed charset
3124
3125 2004-02-05 Frank Koormann <[email protected]>
3126
3127 * po/pt_BR.po: Fixed format string for error message, missing %s
3128 added (Thuban/UI/application.py:273)
3129
3130 2004-02-03 Frank Koormann <[email protected]>
3131
3132 First version of Portuguese (Brazilian) translation
3133
3134 * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
3135 Brazilian Portuguese by Eduardo Patto Kanegae.
3136
3137 * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
3138 translators.
3139
3140
3141 2004-01-22 Frank Koormann <[email protected]>
3142
3143 * Doc/manual/thuban-manual.xml: Added section on installation of
3144 Thuban under Win32 systems. Fixed image path references in the postgis
3145 section. Some minor source formattings.
3146
3147 2004-01-21 Frank Koormann <[email protected]>
3148
3149 Make Thuban remember path selections (at least for one application run).
3150
3151 * Thuban/UI/application.py (Application.OnInit): Initialize path as a
3152 attribute of application object. Path is a dictionary of
3153 strings, currently with the items "data" and "projection".
3154 (Application.SetPath): New, stores path for the specified item.
3155 (Application.Path): New, return path for the specified item.
3156
3157 * Thuban/UI/mainwindow.py
3158 (MainWindow.OpenSession, MainWindow.SaveSessionAs,
3159 MainWindow.AddLayer, MainWindow.AddRasterLayer,
3160 MainWindow.TableOpen): Access "data" path information of the
3161 application.
3162
3163 * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
3164 Access "projection" path information of the application.
3165
3166 2004-01-05 Bernhard Herzog <[email protected]>
3167
3168 * po/ru.po: Updated translations from Alex Shevlakov
3169
3170 2004-01-05 Bernhard Herzog <[email protected]>
3171
3172 * po/Makefile, po/README: Move the description of how to generate
3173 the translation statistics to the README.
3174
3175 2003-12-23 Bernhard Herzog <[email protected]>
3176
3177 * NEWS: Update for 1.0.0
3178
3179 * po/it.po: Another update from Maurizio Napolitano
3180
3181 2003-12-23 Bernhard Herzog <[email protected]>
3182
3183 * po/it.po: Updated translation from Maurizio Napolitano
3184
3185 2003-12-23 Bernhard Herzog <[email protected]>
3186
3187 * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
3188 for translation
3189
3190 * Thuban/UI/mainwindow.py (MainWindow.TableRename)
3191 (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
3192 strings for translation
3193
3194 * po/de.po: Update with the newly marked strings.
3195
3196 2003-12-22 Bernhard Herzog <[email protected]>
3197
3198 * HOWTO-Release: Fix the places where version numbers have to be
3199 updated
3200
3201 2003-12-22 Bernhard Herzog <[email protected]>
3202
3203 * setup.py (setup call): 1.0.0, yeah!
3204
3205 * Thuban/version.py (longversion): 1.0.0, yeah!
3206
3207 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3208 1.0.0 namespace too
3209
3210 * Thuban/Model/save.py (SessionSaver.write_session): Save with
3211 1.0.0 namespace
3212
3213 * test/test_load.py (LoadSessionTest.dtd)
3214 (TestSingleLayer.file_contents)
3215 (TestNonAsciiColumnName.file_contents)
3216 (TestLayerVisibility.file_contents)
3217 (TestClassification.file_contents, TestLabels.file_contents)
3218 (TestLayerProjection.file_contents)
3219 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3220 (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3221 (TestPostGISLayerPassword.file_contents)
3222 (TestLoadError.file_contents, TestLoadError.test): Update for
3223 1.0.0 namespace
3224
3225 * test/test_save.py (SaveSessionTest.dtd)
3226 (SaveSessionTest.testEmptySession)
3227 (SaveSessionTest.testSingleLayer)
3228 (SaveSessionTest.testLayerProjection)
3229 (SaveSessionTest.testRasterLayer)
3230 (SaveSessionTest.testClassifiedLayer)
3231 (SaveSessionTest.test_dbf_table)
3232 (SaveSessionTest.test_joined_table)
3233 (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3234
3235 2003-12-22 Bernhard Herzog <[email protected]>
3236
3237 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3238 alignment flags are byte strings not unicode and that they have
3239 valid values
3240
3241 * test/test_load.py (TestLabelLayer): New. Test loading (and
3242 indirectly saving) of maps with labels.
3243
3244 2003-12-22 Bernhard Herzog <[email protected]>
3245
3246 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3247 (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3248 unsubscribe all subscribers.
3249 (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3250 self.grid since it may already have been destroyed.
3251 Fixes RT #2256
3252
3253 2003-12-19 Bernhard Herzog <[email protected]>
3254
3255 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3256
3257 2003-12-16 Bernhard Herzog <[email protected]>
3258
3259 * debian/bitmappath.patch, debian/setup.py.patch:
3260 added to ensure compliance with FHS for debian
3261 * debian/rules, debian/changelog:
3262 added patches in rules to ensure compliance with FHS for debian
3263
3264 2003-12-16 Bernhard Herzog <[email protected]>
3265
3266 * po/Makefile (mo): Make the output a bit nicer so that it prints
3267 statistics about the translations. Add a comment how produce even
3268 nicer statistics with sed.
3269
3270 2003-12-09 Frank Koormann <[email protected]>
3271
3272 * Resources/Projections/defaults.proj:
3273 French projection sample with correct accents (UNICODE).
3274
3275 2003-12-05 Bernhard Herzog <[email protected]>
3276
3277 * MANIFEST.in: Add the devtools directory
3278
3279 * setup.py (setup call): Use license instead of licence. This
3280 silences a deprecation warning on Python 2.3
3281
3282 2003-12-05 Frank Koormann <[email protected]>
3283
3284 Documentation synced with 1.0rc1
3285
3286 * Doc/manual/thuban-manual.xml:
3287 Minor formatting changes and references to database layers .
3288 Introduction.Internationalization: New section on i18n.
3289 MapManagement.AddingandRemovingLayers: Added item on database layers.
3290 MapManagement.TheLegend: Added section and screenshot on popup menu.
3291 ProjectionManagement: Updated screenshot and sentence on EPSG.
3292 Appendix.SupportedDataSources: Added PostGIS.
3293 Appendix.WorkingwithPostGIS: New section.
3294
3295 * Doc/manual/images/6_projection.png: Updated screenshot including
3296 EPSG checkboxes.
3297
3298 * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3299
3300 * Doc/manual/images/app_postgis_add_layer.png,
3301 Doc/manual/images/app_postgis_db_add.png,
3302 Doc/manual/images/app_postgis_db_management.png:
3303 New screenshots focussing on database layers
3304
3305 2003-12-05 Frank Koormann <[email protected]>
3306
3307 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3308 write warning to stderr instead of rising a warning dialog
3309
3310 2003-12-03 Bernhard Herzog <[email protected]>
3311
3312 Fix for RT #2243
3313
3314 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3315 New. Like has_selected_layer but for shape layers only
3316 (_has_selected_shape_layer): New. Like _has_selected_layer but for
3317 shape layers only
3318 (layer_show_table command, layer_jointable command): Use these
3319 commands should only be available for shape layers
3320
3321 2003-12-03 Bernhard Herzog <[email protected]>
3322
3323 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3324 publishers that are wx objects and may have been destroyed by wx
3325 already. Fixes RT #2242.
3326
3327 2003-12-03 Bernhard Herzog <[email protected]>
3328
3329 * po/ru.po: Updates from Alex Shevlakov
3330
3331 2003-12-03 Silke Reimer <silkeintevation.de>
3332
3333 * debian/control, debian/changelog: Added gdal-support to
3334 debian package, updated to new thuban version
3335
3336
3337 2003-12-03 Bernhard Herzog <[email protected]>
3338
3339 * Thuban/Lib/version.py: New. Module for version number
3340 manipulations. The version of make_tuple here also deals better
3341 with more unusual version number strings, such as e.g.
3342 "1.2+cvs20031111"
3343
3344 * Thuban/version.py (make_tuple): Removed. It's now in
3345 Thuban.Lib.version. Use that implementation instead.
3346
3347 * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3348
3349 2003-12-02 Bernhard Herzog <[email protected]>
3350
3351 * MANIFEST.in: Add debian files
3352
3353 * setup.py (setup call): Add packages for the Extensions so that
3354 they're installed too
3355 (data_files): Add READMEs and sample data from some Extensions
3356
3357 * NEWS: Add note about the extensions in binary packages
3358
3359 2003-12-02 Bernhard Herzog <[email protected]>
3360
3361 * Thuban/Model/save.py (SessionSaver.write_session): Save files
3362 with the thuban-1.0rc1
3363
3364 * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3365 thuban-1.0rc1 namespace too
3366
3367 * test/test_save.py (SaveSessionTest.dtd)
3368 (SaveSessionTest.testEmptySession)
3369 (SaveSessionTest.testSingleLayer)
3370 (SaveSessionTest.testLayerProjection)
3371 (SaveSessionTest.testRasterLayer)
3372 (SaveSessionTest.testClassifiedLayer)
3373 (SaveSessionTest.test_dbf_table)
3374 (SaveSessionTest.test_joined_table)
3375 (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3376 namespace
3377
3378 * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3379 namespace
3380 (TestSingleLayer.file_contents)
3381 (TestNonAsciiColumnName.file_contents)
3382 (TestLayerVisibility.file_contents)
3383 (TestClassification.file_contents, TestLabels.file_contents)
3384 (TestLayerProjection.file_contents)
3385 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3386 (TestPostGISLayer.file_contents)
3387 (TestPostGISLayerPassword.file_contents)
3388 (TestLoadError.file_contents, TestLoadError.test): Update to
3389 thuban-1.0rc1 namespace
3390
3391 2003-12-01 Bernhard Herzog <[email protected]>
3392
3393 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3394 nt to better match Intevation's current w32 setup
3395
3396 * HOWTO-Release: Add note about updating MANIFEST.in
3397
3398 * MANIFEST.in: Add the Extensions
3399
3400 * NEWS: Update for 1.0rc1
3401
3402 2003-12-01 Bernhard Herzog <[email protected]>
3403
3404 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3405 cards for the dialog so that shapefiles ending in all uppercase
3406 SHP are listed too
3407
3408 2003-11-28 Bernhard Herzog <[email protected]>
3409
3410 * Thuban/version.py (longversion): Update to 1.0rc1
3411
3412 * setup.py (setup call): Update version to 1.0rc1. Use the
3413 [email protected] email address as author email instead of my
3414 personal one.
3415
3416 2003-11-28 Bernhard Herzog <[email protected]>
3417
3418 * po/de.po: Update german translation.
3419
3420 2003-11-28 Bernhard Herzog <[email protected]>
3421
3422 Unify the filenames stored in .thuban files so that the .thuban
3423 files are more platform independend
3424
3425 * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3426 that they can be used on both windows and unix
3427 (SessionSaver.prepare_filename): New. Handle all filename
3428 transformations for filenames stored in the thuban file
3429 (SessionSaver.write_data_containers, SessionSaver.write_layer):
3430 Use prepare_filename
3431
3432 * test/test_save.py (SaveSessionTest.testSingleLayer)
3433 (SaveSessionTest.testLayerProjection)
3434 (SaveSessionTest.testRasterLayer)
3435 (SaveSessionTest.testClassifiedLayer)
3436 (SaveSessionTest.test_dbf_table)
3437 (SaveSessionTest.test_joined_table): Filenames are always stored
3438 with slashes on all currently supported platforms so adapt all
3439 tests to this
3440
3441 * test/test_load.py (LoadSessionTest.filenames): With the new
3442 filename scheme the filenames in the tests should be
3443 understandable on all currently supported platforms so we turn
3444 this into an empty list because we don't have to normalize them
3445 anymore
3446
3447 2003-11-28 Bernhard Herzog <[email protected]>
3448
3449 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3450 Add the ellipsoid to the projection since some Proj versions
3451 complain if it's missing.
3452
3453 2003-11-27 Bernhard Herzog <[email protected]>
3454
3455 Corect some bounding box projection problems
3456
3457 * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3458 version of ForwardBBox
3459 (Projection._transform_bbox): New. common implementation of
3460 ForwardBBox and InverseBBox
3461 (Projection.ForwardBBox): Use _transform_bbox.
3462
3463 * test/test_proj.py (TestProjection.test): Add test for
3464 InverseBBox
3465
3466 * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3467 (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3468 new InverseBBox method to determine the unprojected bounding box
3469 (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3470 bbox.
3471
3472 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3473 Removed.
3474 (TestLayer.test_arc_layer_with_projection): New. This test is
3475 better able to test whether bounding boxes are projected correctly
3476 than test_point_layer_with_projection
3477
3478 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3479 InverseBBox to unproject bboxes
3480
3481 2003-11-25 Bernhard Herzog <[email protected]>
3482
3483 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3484 source code.
3485
3486 2003-11-25 Bernhard Herzog <[email protected]>
3487
3488 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3489 there for backwards compatibility and all code relying on that
3490 should have been updated by now.
3491
3492 2003-11-25 Bernhard Herzog <[email protected]>
3493
3494 * test/test_load.py (TestClassification.test): Add the missing
3495 round trip test.
3496 (TestClassification.file_contents): Update to the newest file
3497 format
3498
3499 2003-11-25 Bernhard Herzog <[email protected]>
3500
3501 Add very experimental (and possibly dangerous) extension to draw
3502 polygons:
3503
3504 * Extensions/drawshape/README: New. Brief installation
3505 instructions
3506
3507 * Extensions/drawshape/drawshape.py: New. Implementation of the
3508 drawshape extensions
3509
3510 * Extensions/drawshape/patch.diff: Patch to apply before the
3511 extension can be used.
3512
3513 2003-11-24 Bernhard Herzog <[email protected]>
3514
3515 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3516 (ShapefileStore.__init__): Factor opening the shapefile into a
3517 separate method (the new _open_shapefile). This makes the code a
3518 bit more readable but the real reason is that it makes some evil
3519 hacks easier. :-)
3520
3521 2003-11-24 Bernhard Herzog <[email protected]>
3522
3523 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3524 converter is specified for an attribute assume it's a string
3525 containing only Latin1 characters. Update doc-string accordingly.
3526 This change should fix many places where unicode objects might
3527 accidentally enter Thuban.
3528
3529 * test/test_load.py (TestNonAsciiColumnName): New test to check
3530 what happens with column names in DBF files that contain non-ascii
3531 characters
3532
3533 2003-11-21 Bernhard Herzog <[email protected]>
3534
3535 Enable the experimental attribute editing again and introduce a
3536 command line switch to actually activate it
3537
3538 * Thuban/UI/main.py (options): New. Container for options set on
3539 the commmand line
3540 (main): Add the --enable-attribute-editing flag.
3541
3542 * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3543 editing is enabled use the grid ctrl which allows editing of the
3544 values
3545
3546 * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3547 New. Just delegate this to the underlying table.
3548
3549 2003-11-20 Bernhard Herzog <[email protected]>
3550
3551 * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3552 Skip this test if run under non-posix systems since it only works
3553 there
3554
3555 2003-11-19 Bernhard Herzog <[email protected]>
3556
3557 * Thuban/Model/resource.py: Rework the way gdal support is
3558 determined so that we can give a reason in the about why gdal is
3559 not supported.
3560 (gdal_support_status): New. Variable holding a string with the
3561 reason for no gdal support
3562
3563 * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3564 not supported to the message
3565
3566 2003-11-19 Bernhard Herzog <[email protected]>
3567
3568 Remove the old table interface and its test cases
3569
3570 * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3571 (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3572 anymore
3573
3574 * Thuban/Model/transientdb.py (TransientTableBase)
3575 (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3576 anymore
3577
3578 * test/test_table.py: Removed since the old interface it tests is
3579 gone.
3580
3581 * test/runtests.py (main): The old table interface is gone and
3582 with it the deprecation warnings so remove the code that turns
3583 these warnings into errors
3584
3585 2003-11-19 Bernhard Herzog <[email protected]>
3586
3587 * test/test_table.py: Revert to revision 1.5 again. Changing the
3588 tests to use the new table interface is completely wrong since the
3589 whole purpose of the tests in this module is to test the old
3590 interface.
3591
3592 2003-11-18 Bernhard Herzog <[email protected]>
3593
3594 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3595 New. Test whether the connection matches a set of connection
3596 parameters
3597
3598 * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3599 (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3600 for existing connections with the same parameters and break out of
3601 the loop correctly.
3602
3603 * test/test_postgis_db.py (TestBriefDescription)
3604 (TestPostGISSimple.test_brief_description): Rename
3605 TestBriefDescription to TestPostGISSimple and the test method to
3606 test_brief_description so that we can add more test methods.
3607 (TestPostGISSimple.test_matches_parameters): New. Test the new
3608 MatchesParameters method
3609
3610 2003-11-18 Bernhard Herzog <[email protected]>
3611
3612 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3613 _was_destroyed, to indicate whether an publisher instance has
3614 already been destroyed.
3615 (Publisher.Unsubscribe): Only disconnect if the publisher has not
3616 been destroyed yet.
3617 (Publisher.Destroy): Set the _was_destroyed flag to true.
3618
3619 * test/test_connector.py
3620 (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3621 calling Unsubscribe after Destroy doesn't raise an exception
3622
3623 2003-11-14 Bernhard Herzog <[email protected]>
3624
3625 * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3626 typo in doc-string
3627
3628 2003-11-13 Bernhard Herzog <[email protected]>
3629
3630 Quote table and column names properly for postgis.
3631
3632 * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3633 quote an identifier for use in an sql statement
3634 (PostGISColumn.__init__): Add the quoted_name attribute
3635 (PostGISTable.__init__): New instance variable quoted_tablename
3636 (PostGISTable._fetch_table_information): Use the quoted table
3637 name. New isntance variable quoted_geo_col with a quoted version
3638 of geometry_column
3639 (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3640 (PostGISTable.RowOrdinalToId): Use the quoted table name
3641 (PostGISTable.ReadValue, PostGISTable.ValueRange)
3642 (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3643 (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3644 (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3645 Use quoted table and column names
3646
3647 * test/test_postgis_db.py (TestPostGISSpecialCases)
3648 (TestPostGISIgnoredColumns): Rename the class to
3649 TestPostGISSpecialCases because that better describes the new
3650 cases
3651 (TestPostGISSpecialCases.test_unsupported_types)
3652 (TestPostGISSpecialCases.test): Rename the method to
3653 test_unsupported_types because we need a more descriptive name now
3654 that there are more methods
3655 (TestPostGISSpecialCases.test_table_name_quoting)
3656 (TestPostGISSpecialCases.test_column_name_quoting)
3657 (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3658 cases to test quoting of table and column names in PostGISTable
3659 and PostGISShapeStore
3660
3661 * test/postgissupport.py
3662 (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3663 AddGeometryColumn desn't support table or column names with sapces
3664 or double quotes
3665
3666 2003-11-12 Jan-Oliver Wagner <[email protected]>
3667
3668 * Extensions/wms/__init__.py: New: Init to make this
3669 directory a package.
3670
3671 * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3672
3673 2003-11-11 Bernhard Herzog <[email protected]>
3674
3675 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3676 Constant for the file woth deprecated epsg projections
3677 (get_system_proj_file): Update doc-string
3678
3679 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3680 above the EPS widgets, introduce a check box for the deprecated
3681 eps projections and a label for the epsg widgets
3682 (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3683 too
3684
3685 2003-11-11 Bernhard Herzog <[email protected]>
3686
3687 Avoid warnings when run under Python 2.3
3688
3689 * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3690 (BaseRenderer.draw_label_layer): Coordinates must be ints.
3691
3692 * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3693 real method so that we can convert to int.
3694 (MapRenderer.label_font): The font size mist be an int.
3695
3696 * Thuban/UI/common.py (Color2wxColour): The color values must be
3697 ints. Also, remove the unnecessary asserts.
3698
3699 * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3700 (TestUnicodeStrings.test): Python source code should not contain
3701 non-ascii characters unless an encoding is specified in the file.
3702 Therefore use \x escapes in the string literals for non-ascii
3703 characters.
3704
3705 2003-11-11 Bernhard Herzog <[email protected]>
3706
3707 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3708 parameter so that this function can be used for all proj files in
3709 Resource/Projections
3710 (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3711 get_system_proj_file
3712
3713 * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3714 ProjFile self.__sysProjFile use a dictionary of system ProjFile
3715 objects self._sys_proj_files
3716 (ProjFrame.build_dialog): Adapt to the new changes in the
3717 ProjectionList constructor. Add a check button to toggle whether
3718 EPSG projections are shown
3719 (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3720 events.
3721 (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3722 the busy cursor if the files have not yet been loaded by the
3723 dialog.
3724 (ProjFrame.load_system_proj): Add a parameter for the name of the
3725 proj file. Maintain the dictionary of system projections
3726 self._sys_proj_files
3727
3728 * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3729 user_projs parameters into one parameter proj_files which is a
3730 list of proj files.
3731 (ProjectionList._subscribe_proj_files)
3732 (ProjectionList._unsubscribe_proj_files): New. Move
3733 subscription/unsubscription of projfile messages to separate
3734 methods
3735 (ProjectionList.Destroy): The unsubscribe is now done in
3736 _unsubscribe_proj_files
3737 (ProjectionList.update_projections): We now have a list of proj
3738 file objects
3739 (ProjectionList.SetProjFiles): New method to set a new list of
3740 proj file objects
3741
3742 * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
3743 Specify explicitly which system proj file to load.
3744
3745 2003-11-11 Bernhard Herzog <[email protected]>
3746
3747 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
3748 instance variables to cut cyclic references. The GC would have
3749 collected the loader eventually but it can happen that it doesn't
3750 run at all until thuban is closed (2.3 but not 2.2 tries a bit
3751 harder and forces a collection when the interpreter terminates)
3752 (load_session): Call the handler's Destroy method to make sure
3753 that it gets garbage collected early. Otherwise it will be
3754 collected very late if at all and it holds some references to e.g.
3755 shapestores and the session which can lead to leaks (of e.g. the
3756 temporary files)
3757
3758 * test/test_load.py (TestSingleLayer.test_leak): New. test for the
3759 resource leak in load_session
3760
3761 2003-11-10 Bernhard Herzog <[email protected]>
3762
3763 * Thuban/UI/baserenderer.py: Add a way to specify how layers in
3764 extensions are to be rendered.
3765 (_renderer_extensions): New. List with renderer for layers in
3766 extensions
3767 (add_renderer_extension): New. Add a renderer extension
3768 (init_renderer_extensions): New. Init the renderer extensions
3769 (BaseRenderer.render_map_incrementally): Search
3770 _renderer_extensions for how to draw unknown layer types
3771 (BaseRenderer.draw_raster_data): Add format parameter so that
3772 formats other than BMP can be drawn
3773 (BaseRenderer.draw_raster_layer): Pass an explicit format to
3774 draw_raster_data
3775
3776 * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
3777 strings of the format parameter of draw_raster_data method to wx
3778 constants
3779 (MapRenderer.draw_raster_data): Add the format parameter and use
3780 raster_format_map to map it to the right wxwindows constant for
3781 wxImageFromStream
3782
3783 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
3784 the format parameter and record it
3785 (TestBaseRenderer.test_raster_no_projection): check the format
3786 paramter of the draw_raster_data method
3787 (TestBaseRenderer.test_renderer_extension): New. Test the renderer
3788 extension facility
3789
3790 2003-11-07 Bernhard Herzog <[email protected]>
3791
3792 Tweak the usage of the sqlite database to make common use cases
3793 more responsive. In most cases copying the data to the sqlite
3794 database takes so long that using sqlite doesn't have enough
3795 advantages.
3796
3797 * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
3798 comments about performance and query the min and max in separate
3799 statements because only that way will indexes be used.
3800 (TransientTableBase.UniqueValues): Add some comments about
3801 performance.
3802 (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
3803 Do not copy the data to the transient DB but use the transient
3804 copy if it exists. See the new comments for the performance trade
3805 offs
3806
3807 * test/test_transientdb.py
3808 (TestTransientTable.test_auto_transient_table): Make sure that the
3809 data is copied to the transient database at some point.
3810
3811 2003-11-03 Bernhard Herzog <[email protected]>
3812
3813 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
3814 globals to locals so that it's a bit faster
3815
3816 2003-11-03 Bernhard Herzog <[email protected]>
3817
3818 * Thuban/UI/baserenderer.py
3819 (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
3820 method. ReadValue is faster than ReadRowAsDict since it only reads
3821 one cell especially now that the dbf file objects actually
3822 implement it.
3823
3824 * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
3825 read_attribute method of the dbf objects
3826
3827 2003-11-03 Bernhard Herzog <[email protected]>
3828
3829 * Extensions/profiling/profiling.py (popup_dialog_box): New config
3830 variable to indicate whether the result should be shown in a
3831 dialog box
3832 (profile_screen_renderer, time_screen_renderer): Only show a
3833 dialog box if popup_dialog_box is true.
3834 (profile_screen_renderer): Flush stdout after the printing the
3835 first part of the "profiling..." message
3836
3837 * Thuban/UI/baserenderer.py
3838 (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
3839 brushes for the groups so that they're not created over and over
3840 again
3841
3842 * Thuban/Model/classification.py (Classification.__getattr__)
3843 (Classification._compile_classification)
3844 (Classification._clear_compiled_classification): New. Methods to
3845 manage a 'compiled' representation of the classification groups
3846 which is created on demand
3847 (Classification.InsertGroup, Classification.RemoveGroup)
3848 (Classification.ReplaceGroup): reset the compiled representation
3849 (Classification.FindGroup): Use the compiled representation to
3850 find the matching group
3851 (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
3852
3853 2003-10-31 Bernhard Herzog <[email protected]>
3854
3855 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
3856 Send a CLASS_CHANGED message
3857 (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
3858 not return the removed group since it wasn't used.
3859
3860 * test/test_classification.py
3861 (TestClassification.test_set_default_group): New. Test the
3862 SetDefaultGroup method
3863 (TestClassification.test_insert_group): New. Test the InsertGroup
3864 method
3865 (TestClassification.test_remove_group): New. Test the RemoveGroup
3866 method
3867 (TestClassification.test_replace_group): New. Test the
3868 ReplaceGroup method
3869
3870 2003-10-31 Bernhard Herzog <[email protected]>
3871
3872 * test/test_classification.py (TestClassification.setUp):
3873 Subscribe to the CLASS_CHANGED messages
3874 (TestClassification.tearDown): New. Destroy the classification
3875 properly
3876 (TestClassification.test_defaults): Add tests for the default line
3877 width and whether no messages were sent yet
3878 (TestClassification.test_set_default_properties): Add tests for
3879 messages and setting the default line width
3880 (TestClassification.test_add_singleton)
3881 (TestClassification.test_add_range)
3882 (TestClassification.test_multiple_groups): Add tests for messages
3883
3884 2003-10-31 Bernhard Herzog <[email protected]>
3885
3886 Some more refactoring in preparation for new tests:
3887
3888 * test/test_classification.py (TestClassification.setUp): New.
3889 Instantiate the classification here. Update the test methods
3890 accordingly.
3891 (TestClassification.test_multiple_groups): Make sure that the two
3892 singletons matching 1 are considered different.
3893
3894 2003-10-31 Bernhard Herzog <[email protected]>
3895
3896 * test/test_classification.py (red, green, blue): New. These
3897 constants were used in several cases. Update the relevant methods.
3898 (TestClassification.test_defaults)
3899 (TestClassification.test_set_default_properties)
3900 (TestClassification.test_add_singleton)
3901 (TestClassification.test_add_range)
3902 (TestClassification.test_multiple_groups)
3903 (TestClassification.test_deepcopy): New. These were formerly all
3904 part of the single method test.
3905 (TestClassification.test_deepcopy): Removed.
3906 (TestClassIterator): Removed. The test case is now a method of
3907 TestClassification since it tests part of the public interface of
3908 Classification
3909 (TestClassification.test_iterator): New. Used to be
3910 TestClassIterator effectively
3911
3912 2003-10-31 Jan-Oliver Wagner <[email protected]>
3913
3914 GUIfied the functions of the profiling extension.
3915
3916 * /Extensions/profiling/__init__.py: New: Init to make this
3917 directory a package.
3918
3919 * Extensions/profiling/profiling.py: Moved menu entries to
3920 the Extensions menu. Applied _() for strings.
3921 (profile_screen_renderer): Catch the detailed printout and present
3922 it in a dialog.
3923 (time_screen_renderer): Raise a dialog to present the result instead
3924 of printing it to stdout.
3925
3926 2003-10-31 Bernhard Herzog <[email protected]>
3927
3928 * test/test_classification.py (TestClassGroupProperties)
3929 (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
3930 (TestClassGroupSingleton, TestClassIterator, TestClassification):
3931 Split TestClassification into several classes, one for each class
3932 being tested. TestClassification itself now only tests
3933 Classification. This split makes changes to the tests a bit easier
3934
3935 2003-10-31 Bernhard Herzog <[email protected]>
3936
3937 * Extensions/profiling/profiling.py: New. Extension to measure
3938 Thuban performance
3939
3940 2003-10-31 Frank Koormann <[email protected]>
3941
3942 Added two items to legend popup menu: Remove Layer and Show Layer Table
3943
3944 * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
3945 LegendPanel._OnShowTable): New event handlers, call the corresponding
3946 mainwindow methods.
3947 (LegendTree._OnRightClick): Added items to popup menu.
3948
3949 2003-10-30 Bernhard Herzog <[email protected]>
3950
3951 * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
3952 EVT_WINDOW_DESTROY
3953 (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
3954 nothing but is convenient for the derived classes.
3955
3956 * Thuban/UI/tableview.py
3957 (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
3958 Unsubscribe the messages here not in OnClose because that might
3959 get called multiple times. Fixes RT #2196
3960 (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
3961 anymore.
3962
3963 * README: Update the minimum requirement for wxPython. Since we
3964 now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
3965 the version in which that was introduced for all platforms
3966
3967 2003-10-30 Frank Koormann <[email protected]>
3968
3969 * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
3970 the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
3971 frame.
3972
3973 2003-10-30 Jan-Oliver Wagner <[email protected]>
3974
3975 Improved APR import extension, added further EPSG definitions
3976 and some cleanup regarding string class.
3977
3978 * test/test_proj.py (TestProjection.test_get_projection_units_geo):
3979 Added test for alias 'longlat'.
3980
3981 * Resources/Projections/epsg-deprecated.proj: New. Contains
3982 deprecated EPSG definitions.
3983
3984 * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
3985 the variable names for objects.
3986
3987 * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
3988 Copied from importAPR and provided with documentation.
3989
3990 * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
3991 Moved to apr.py.
3992 (APR_View): Added object ref 'ITheme'.
3993
3994 * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
3995 split function by corresponding use of the string class method.
3996
3997 * Thuban/Model/xmlwriter.py: Replaced string replace function by
3998 corresponding string method.
3999
4000 2003-10-29 Bernhard Herzog <[email protected]>
4001
4002 * Thuban/UI/baserenderer.py
4003 (BaseRenderer.draw_shape_layer_incrementally): Speed up the
4004 special case of a classification that only has the default group
4005
4006 2003-10-27 Bernhard Herzog <[email protected]>
4007
4008 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
4009
4010 * po/de.po: Update.
4011
4012 * Thuban/UI/application.py
4013 (ThubanApplication.ShowExceptionDialog): Handle translation of the
4014 dialog message properly
4015
4016 2003-10-27 Bernhard Herzog <[email protected]>
4017
4018 Rework how localization works so that we use wx's translation
4019 functions when running Thuban as a normal application but not when
4020 we don't need any UI, such as in the test suite. See the comment
4021 in Thuban/__init__.py for details
4022
4023 * Thuban/__init__.py (_): Add one level of indirection to make the
4024 translation handling more flexible and to make it possible to use
4025 either wx's translation services or not.
4026 (gettext_identity, translation_function_installed)
4027 (install_translation_function): New function to help with this
4028
4029 * Thuban/UI/__init__.py: Install the wx specific translation
4030 function if it's OK to do that
4031
4032 * test/support.py (initthuban): Install a dummy translation
4033 function so that importing Thuban.UI doesn't install a wx specific
4034 one for which would need to import wxPython
4035
4036 2003-10-27 Bernhard Herzog <[email protected]>
4037
4038 * HOWTO-Release: Source archives should be created first and the
4039 binary packages should be created from the source archives.
4040 There's an official debian package now so there's no need to test
4041 the rpm on debian anymore
4042
4043 2003-10-27 Bernhard Herzog <[email protected]>
4044
4045 Several rendering changes:
4046
4047 - Render the selection into a separate bitmap so that only that
4048 bitmap needs to be redrawn when the selection changes
4049
4050 - Render incrementally showing previews and allowing interaction
4051 before rendering is complete
4052
4053 - Update the renderer interface a bit. Most parameters of
4054 RenderMap are now parameters of the constructor
4055
4056 * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
4057 and the update region as parameters. Update the doc-string
4058 (BaseRenderer.render_map_incrementally): New. Generator function
4059 to renders the map incrementally
4060 (BaseRenderer.render_map): Remove the map argument (it's now in
4061 the constructor) and simply iterate over the
4062 render_map_incrementally generator to draw the map.
4063 (BaseRenderer.draw_shape_layer_incrementally)
4064 (BaseRenderer.draw_shape_layer): Renamed to
4065 draw_shape_layer_incrementally and changed into a generator that
4066 yields True every 500 shapes. Used by render_map_incrementally to
4067 render shape layers incrementally
4068
4069 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
4070 map and region parameters which are now in the constructor
4071 (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
4072 the inherited render_map_incrementally.
4073 (BaseRenderer.draw_shape_layer): Removed.
4074 (ScreenRenderer.draw_selection_incrementally): New. The selection
4075 drawing part of the removed draw_shape_layer as a generator
4076 (ScreenRenderer.layer_shapes): Update because of the region
4077 parameter change
4078 (ExportRenderer.__init__): New. Extend the inherited constructor
4079 with the destination region for the drawing
4080 (ExportRenderer.RenderMap): Removed the map and region parameters
4081 which are now in the constructor
4082
4083 * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
4084 bitmap suitable for a preview in a tool
4085 (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
4086 bitmap
4087 (MapPrintout.draw_on_dc): Adapt to new renderer interface
4088 (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
4089 exists
4090 (MapCanvas.OnIdle): Update the logic to deal with incremental
4091 rendering and the selection bitmap
4092 (MapCanvas._do_redraw): Handle the instantiation of the render
4093 iterator and the redraws during rendering
4094 (MapCanvas._render_iterator): New. Generator to incrementally
4095 redraw both bitmaps
4096 (MapCanvas.Export): Adapt to new renderer interface.
4097 (MapCanvas.full_redraw): Reset the selection bitmap and the
4098 renderer iterator too
4099 (MapCanvas.redraw_selection): New. Force a redraw of the selection
4100 bitmap
4101 (MapCanvas.shape_selected): Only redraw the selection bitmap
4102
4103 * test/test_baserenderer.py
4104 (TestBaseRenderer.test_polygon_no_projection)
4105 (TestBaseRenderer.test_raster_no_projection)
4106 (TestBaseRenderer.test_point_map_projection)
4107 (TestBaseRenderer.test_point_layer_and_map_projection)
4108 (TestBaseRenderer.test_point_layer_projection)
4109 (TestBaseRenderer.test_point_with_classification): Adapt to new
4110 renderer interface
4111
4112 2003-10-24 Bernhard Herzog <[email protected]>
4113
4114 * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4115 (point_in_polygon_shape, shape_centroid): Raise an exception if
4116 the shape can't be read. Previously invalid shape ids would lead
4117 to a segfault.
4118
4119 * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
4120 New. test whether an exception is raised for invalid shape ids
4121
4122 2003-10-24 Jan-Oliver Wagner <[email protected]>
4123
4124 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
4125 as alias for 'latlong'.
4126
4127 * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
4128 as alias for 'latlong'.
4129
4130 2003-10-24 Jan-Oliver Wagner <[email protected]>
4131
4132 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
4133 the projection even for the UnknownPanel.
4134 (UnknownProjPanel.__init__): Define the text and create the textctrl
4135 widget.
4136 (UnknownProjPanel._DoLayout): Replaced static text widget by the
4137 textctrl created in __init__.
4138 (UnknownProjPanel.SetProjection): Set the text for the text ctrl
4139 including the parameters of the projection.
4140
4141 2003-10-24 Jan-Oliver Wagner <[email protected]>
4142
4143 * Resources/Projections/epsg.proj: New. This is a list of
4144 EPSG codes with parameters for proj. The list has been
4145 generated using devtools/create_epsg.py based on the
4146 file nad/epsg of the proj 4.4.7 package. Four projection
4147 definitions have been deleted as they are not accepted by proj:
4148 "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
4149 and "HD72 / EOV".
4150
4151 2003-10-22 Bernhard Herzog <[email protected]>
4152
4153 Some more tweaks to the projection dialog which should fix RT
4154 #1886.
4155
4156 * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
4157 the ProjFile's messages and call the base class methods correctly
4158 (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
4159 flag on the newly selected item too. Otherwise some other item is
4160 focused and the first time the focus is moved with the keyboard
4161 the selection moves in unexpected ways.
4162
4163 * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
4164 focus on the OK button, only on the projection list. That way the
4165 list really has the focus initially
4166 (ProjFrame.OnClose): Call the projection list's Destroy method to
4167 make it unsubscribe all messages
4168
4169 2003-10-21 Bernhard Herzog <[email protected]>
4170
4171 Rework the projection dialog to fix a few bugs, including RT 2166
4172 and most of 2168
4173
4174 * Thuban/UI/projlist.py: New. The class ProjectionList is a
4175 special wxListCtrl to show a list of projections in a more MVC
4176 fashion
4177
4178 * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
4179 throughout the class. The main change is to use the ProjectionList
4180 class instead of a normal wxListBox. Also, add an explicit
4181 "Unknown" projection to the projection choice control.
4182 (ProjPanel.__init__): Add an "unknown" ellipsoid
4183 (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
4184 instantiation of the panel's controls to make the tab-order more
4185 natural
4186
4187 2003-10-21 Bernhard Herzog <[email protected]>
4188
4189 * test/test_load.py (TestSingleLayer.file_contents)
4190 (TestSingleLayer.test): Add non-ascii characters to the titles of
4191 session, map and layer. This is effectively a port of the
4192 TestUnicodeStrings test in test_load_0_8.py which for some reason
4193 was only added there.
4194
4195 * test/test_load_0_9.py (TestSingleLayer.file_contents)
4196 (TestSingleLayer.test): Same as in test_load.py: add non-ascii
4197 characters to the titles of session, map and layer,.
4198
4199 2003-10-21 Bernhard Herzog <[email protected]>
4200
4201 Add EPSG projection handling to .thuban files
4202
4203 * test/test_save.py (SaveSessionTest.dtd)
4204 (SaveSessionTest.testEmptySession)
4205 (SaveSessionTest.testLayerProjection)
4206 (SaveSessionTest.testRasterLayer)
4207 (SaveSessionTest.testClassifiedLayer)
4208 (SaveSessionTest.test_dbf_table)
4209 (SaveSessionTest.test_joined_table)
4210 (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4211 (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4212 use a and epsg projection to test saving them
4213
4214 * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4215 namespace
4216 (TestLayerVisibility.file_contents, TestLabels.file_contents)
4217 (TestLayerProjection.file_contents)
4218 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4219 (TestPostGISLayer.file_contents)
4220 (TestPostGISLayerPassword.file_contents)
4221 (TestLoadError.file_contents, TestLoadError.test): Update to use
4222 1.0-dev namespace
4223 (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4224 use 1.0-dev namespace and use an EPSG projection to test whether
4225 loading it works
4226
4227 * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4228 as of Thuban 0.9. These are now tests to determine whether Thuban
4229 can still read files generated by Thuban 0.9
4230
4231 * Thuban/Model/save.py (SessionSaver.write)
4232 (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4233 namespace
4234 (SessionSaver.write_projection): Write the projection's epsg
4235 attribute
4236
4237 * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4238 thuban-1.0-dev.dtd namespace
4239 (SessionLoader.check_attrs): Allow a callable object as conversion
4240 too
4241 (SessionLoader.start_projection, SessionLoader.end_projection)
4242 (SessionLoader.start_parameter): Handle the epsg attribute and
4243 rename a few instance variables to lower case
4244
4245 * Resources/XML/thuban-1.0.dtd: New. Only difference to
4246 thuban-0.9.dtd is the epsg attribute for projections.
4247
4248 2003-10-21 Bernhard Herzog <[email protected]>
4249
4250 * test/runtests.py (main): Let the user specify which tests to run
4251 on the command line
4252
4253 * test/support.py (ThubanTestResult.getDescription): Override to
4254 give a better short description. The description can be used as a
4255 parameter to run_tests to run that particular test in isolation.
4256
4257 2003-10-21 Frank Koormann <[email protected]>
4258
4259 Popup menu for legend. Scheduled for the 1.2 release this was too
4260 simple to implement: The popup menu is bound to the legend tree, while
4261 the events are hanlded by its anchestor, the legend panel. This
4262 allows reuse of all the event handlers already implemented for the
4263 legend toolbar buttons.
4264
4265 * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4266 to add handlers for the events issued by the popup menu.
4267 (LegendPanel._OnToggleVisibility): Handler for toggling layer
4268 visibility event
4269 (LegendPanel._OnProjection): Handler for layer projection event.
4270 (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4271 (LegendTree._OnRightClick): Event handler for right click, select item
4272 and pop up menu.
4273 (LegendTree.ToggleVisibility): Toggle layer visibility
4274 (LegendTree.LayerProjection): Raise layer projection dialog for
4275 current layer.
4276
4277 2003-10-21 Bernhard Herzog <[email protected]>
4278
4279 * Resources/Projections/defaults.proj: Use correct DOCTYPE
4280 declaration. The top-level element is projectionlist not projfile
4281
4282 2003-10-20 Bernhard Herzog <[email protected]>
4283
4284 * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4285 method to write a projfile and display a busy cursor and error
4286 dialogs.
4287 (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4288 (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4289 (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4290 busy cursor while loading the user and system prj files.
4291
4292 2003-10-16 Bernhard Herzog <[email protected]>
4293
4294 * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4295 ProjFile objects
4296 (clear_proj_file_cache): New function to clear the cache. Mainly
4297 useful for use by the test suite
4298 (read_proj_file): Use the cache.
4299
4300 * test/test_proj.py (TestProjFile): Clarify the doc-string
4301 (ProjFileReadTests): Update doc-string
4302 (ProjFileReadTests.test_get_system_proj_file): Check whether the
4303 system proj files is cached.
4304 (ProjFileLoadTestCase): New base class for the proj file tests
4305 derived from support.FileLoadTestCase to provide some common
4306 behavior.
4307 (TestLoadingProjFile)
4308 (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4309 (TestProjFileWithInvalidParameters.file_contents): Derive from
4310 ProjFileLoadTestCase
4311 (TestLoadingProjFile.test_caching): New. Test whether the cache
4312 works
4313
4314 2003-10-16 Silke Reimer <[email protected]>
4315
4316 * debian/*: New directory with configuration files for building a thuban
4317 deb-package.
4318
4319 2003-10-14 Bernhard Herzog <[email protected]>
4320
4321 * test/test_proj.py: Execute support.run_tests when run as
4322 __main__ so that missing unsubscribes are detected
4323 (TestProjFile.tearDown): Destroy the proj_file properly
4324
4325 2003-10-14 Bernhard Herzog <[email protected]>
4326
4327 * Thuban/Model/messages.py (PROJECTION_ADDED)
4328 (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4329 the ProjFile objects
4330
4331 * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4332 easily send messages when the projections change
4333 (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4334 when the change was successful
4335
4336 * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4337 proj file messages
4338 (TestProjFile.test_add_remove)
4339 (TestProjFile.test_remove_non_existing)
4340 (TestProjFile.test_replace)
4341 (TestProjFile.test_replace_non_existing): Test whether the right
4342 messages are sent
4343
4344 2003-10-14 Bernhard Herzog <[email protected]>
4345
4346 * test/test_proj.py (TestProjFile.test): Refactor into several
4347 tests
4348 (TestProjFile.test_add_remove)
4349 (TestProjFile.test_remove_non_existing)
4350 (TestProjFile.test_replace)
4351 (TestProjFile.test_replace_non_existing): Some of the new
4352 individual test cases
4353 (TestProjFileSimple): New class for the rest of the test cases
4354 that came out of the refactoring
4355 (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4356 derived classes don't have to
4357
4358 2003-10-13 Bernhard Herzog <[email protected]>
4359
4360 Add an optional EPSG code to the projection objects and extend the
4361 .proj file format accordingly.
4362
4363 * Resources/XML/projfile.dtd (element projection): Add epsg
4364 attribute
4365
4366 * Thuban/Model/proj.py (Projection.__init__): New parameter and
4367 instance variable epsg. Update doc-string
4368 (Projection.EPSGCode, Projection.Label): New methods to provide
4369 access to EPSG code and a label for use in dialogs
4370
4371 * Thuban/Model/resource.py (ProjFileReader.start_projection)
4372 (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4373 Handle the epsg code attribute when reading or writing proj files
4374
4375 * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4376 (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4377 (ProjFrame.__FillAvailList): Use the projection's Label method to
4378 get the string for the list box
4379
4380 * test/test_proj.py (TestProjection.test_label)
4381 (TestProjection.test_label_epsg)
4382 (TestProjection.test_epsgcode_for_non_epsg_projection)
4383 (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4384 for the label and EPSGCode methods
4385 (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4386 (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4387 objects in the test cases and put the expected contents into the
4388 test case methods too. Update doTestWrite accordingly
4389 (TestLoadingProjFile)
4390 (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4391 read tests from TestProjFile.
4392 (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4393 tests are now in the new classes.
4394 (sample_projfile, sample_projfile_data)
4395 (sample_projfile2, sample_projfile_data2): Removed. Not used
4396 anymore.
4397 (TestProjFile.test_read_unreadable_file): No need to reset the
4398 permissions at the end anymore since we use a unique filename
4399
4400 2003-10-13 Bernhard Herzog <[email protected]>
4401
4402 * test/test_proj.py: Some more refactoring of the test cases
4403 (ProjFileTest): New base class for the proj file tests.
4404 (TestProjFile): Derive from ProjFileTest
4405 (TestProjFile.test_read_unreadable_file)
4406 (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4407 the new filename method to get a unique filename
4408 (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4409 (WriteProjFileTests): New class for proj file write tests.
4410 Contains the write test that were in TestProjFile originally.
4411
4412 2003-10-13 Bernhard Herzog <[email protected]>
4413
4414 * test/test_proj.py (TestProjFile.testRead)
4415 (TestProjFile.test_read_non_existing_file)
4416 (TestProjFile.test_read_unreadable_file)
4417 (TestProjFile.test_read_empty_file): Split into several methods.
4418
4419 2003-10-10 Bernhard Herzog <[email protected]>
4420
4421 * Thuban/UI/sizers.py: New file with custom sizers.
4422
4423 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4424 all projection type specific panels and put them into a
4425 NotebookLikeSizer. This way the dialog doesn't change its size
4426 when a different projection is selected
4427 (ProjFrame.__init__): Rename projection_panels
4428 projection_panel_defs and reuse projection_panels for a list of
4429 the instantiated panels.
4430 (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4431 (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4432 the panels
4433 (UnknownProjPanel._DoLayout): Place the newlines in the message
4434 differently to make the panel narrower.
4435 (TMPanel._DoLayout): Layout the parameters in one column.
4436
4437 2003-10-10 Bernhard Herzog <[email protected]>
4438
4439 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4440 that contains all the setup for the dialog's widgets, layout and
4441 event handling.
4442 (__): Call build_dialog to build the dialog.
4443 (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4444 Their functionality is now in build_dialog
4445 (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4446 (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4447 (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4448 different widget names and hierarchy introduced with build_dialog.
4449
4450 2003-10-10 Bernhard Herzog <[email protected]>
4451
4452 * README: Fix typo.
4453
4454 2003-10-09 Bernhard Herzog <[email protected]>
4455
4456 * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4457 projection is already in the list. This is *a lot* faster when
4458 loading files with hundreds of projections since it saves a linear
4459 search. OTOH this will allow adding the same projection to the
4460 user.proj file multiple times in the projection dialog but we'll
4461 deal with that later
4462
4463 2003-10-09 Jan-Oliver Wagner <[email protected]>
4464
4465 * devtools: New. Directory for developer tools that are not intended
4466 for the regular user.
4467
4468 * devtools/create_epsg.py: New. Convert the epsg file of proj into
4469 a python .proj file.
4470
4471 2003-10-09 Bernhard Herzog <[email protected]>
4472
4473 * test/test_proj.py
4474 (TestProjection.test_get_parameter_without_equals_sign): New. Test
4475 whether GetParameter handles parameters without "=" sign correctly
4476
4477 * Thuban/Model/proj.py (Projection.GetParameter): Handle
4478 parameters that do not contain a "=". Update the doc-string
4479
4480 2003-10-08 Bernhard Herzog <[email protected]>
4481
4482 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4483 length limit on the projname text control
4484
4485 2003-10-08 Bernhard Herzog <[email protected]>
4486
4487 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4488 (TestProjection.test_get_projection_units_normal): New. Tests for
4489 the Projection.GetProjectedUnits method
4490
4491 2003-10-08 Jan-Oliver Wagner <[email protected]>
4492
4493 * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4494 Added missing 'val' parameter.
4495
4496 2003-10-08 Bernhard Herzog <[email protected]>
4497
4498 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4499 projection type of the currently selected projection is not known,
4500 i.e. there's no panel for it, use the UnknownProjPanel
4501 (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4502 the actual replacing of the proj panel into the new method
4503 _show_proj_panel.
4504 (UnknownProjPanel): Add doc-string.
4505 (UnknownProjPanel._DoLayout): Insert a newline into the text so
4506 that the panel is not so wide.
4507
4508 2003-10-08 Bernhard Herzog <[email protected]>
4509
4510 * Thuban/Model/resource.py (read_proj_file): Return the warnings
4511 too. Update the doc-string
4512 (get_proj_files): Removed. It wasn't used anywhere
4513 (get_system_proj_files, get_system_proj_file): Rename to
4514 get_system_proj_file and return the ProjFile object and not a list
4515 of ProjFile objects. Update the callers.
4516 (get_user_proj_files, get_user_proj_file): Rename to
4517 get_user_proj_file return the ProjFile object and not a list of
4518 ProjFile objects. Update the callers.
4519 (ProjFileReader.__init__): New instance variable for the warnings.
4520 Rename the __pf ivar to projfile. Update the methods referring to
4521 __pf
4522 (ProjFileReader.end_projection): Catch any errors raised when
4523 instantiating the projection and record that as an error. The
4524 projection will not be in the final ProjFile object.
4525 (ProjFileReader.GetWarnings): New method to return the warnings.
4526
4527 * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4528 show the warnings from the projfile reader
4529 (ProjFrame._OnImport): Deal with any warnings returned by
4530 read_proj_file
4531 (ProjFrame.__FillAvailList): Deal with any warnings returned by
4532 get_system_proj_file or get_user_proj_file.
4533
4534 * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4535 (TestProjFileWithInvalidParameters.file_contents): New test cases
4536 to test whether read_proj_file handles invalid projection
4537 parameters correctly
4538 (TestProjFile.test_get_system_proj_file): New. Simple test for
4539 resource.get_system_proj_file
4540
4541 2003-10-07 Bernhard Herzog <[email protected]>
4542
4543 * test/test_derivedshapestore.py
4544 (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4545 properly so that the temporary directories get deleted correctly
4546
4547 2003-10-06 Bernhard Herzog <[email protected]>
4548
4549 Handle the title changes in a proper MVC way.
4550
4551 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4552 canvas' TITLE_CHANGED messages
4553 (MainWindow.update_title): New. Update the main window's title
4554 (MainWindow.__SetTitle): Removed. Use update_title instead.
4555 (MainWindow.SetMap): Use update_title instead of __SetTitle
4556 (MainWindow.RenameMap): Do change the window title explicitly
4557 here. That's handled in a proper MVC way now.
4558 (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4559 messages
4560
4561 * Thuban/Lib/connector.py (Conduit): New class to help classes
4562 that forward messages
4563
4564 * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4565 (ViewPort): Derive from Conduit instead of Publisher
4566 (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4567 when calling the inherited versions
4568 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4569 methods to subscribe and unsubscribe map messages
4570 (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4571 handle the map subscriptions
4572 (ViewPort.Map, ViewPort.map_projection_changed)
4573 (ViewPort.layer_projection_changed): Add or update doc-strings
4574
4575 * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4576 typo
4577 (MyConduit): Helper class for the Conduit test.
4578 (TestConduit): Test cases for Conduit
4579
4580 * test/test_connector.py: Use support.run_tests as main.
4581
4582 * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4583 the TITLE_CHANGED messages
4584 (ViewPortTest.test_forwarding_title_changed): New test to check
4585 whether the viewport forwards the map's TITLE_CHANGED messages
4586 (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4587 after the port's because the latter may require a still functional
4588 map.
4589
4590 2003-10-06 Bernhard Herzog <[email protected]>
4591
4592 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4593 doc-string
4594
4595 2003-10-06 Bernhard Herzog <[email protected]>
4596
4597 * test/test_viewport.py (ViewPortTest.setUp)
4598 (SimpleViewPortTest.test_init_with_size): Move the test for the
4599 initial size as a constructor parameter from ViewPortTest.setUp
4600 method to a new separate test in SimpleViewPortTest.
4601
4602 2003-10-06 Bernhard Herzog <[email protected]>
4603
4604 * test/test_viewport.py (MockView): New class derived from
4605 ViewPort with a mock implementation of GetTextExtent to be used in
4606 the test cases
4607 (ViewPortTest.setUp): Use MockView instead of ViewPort
4608
4609 * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4610 into what would be a "pure virtual function" in C++: always raise
4611 NotImplementedError. Mock implementations for test cases don't
4612 belong into the real code
4613
4614 2003-10-02 Bernhard Herzog <[email protected]>
4615
4616 * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4617 close the dbf file we create so that it's contents have been
4618 written properly.
4619
4620 * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4621 libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4622 Update to shapelib 1.2.10
4623
4624 2003-10-01 Jan-Oliver Wagner <[email protected]>
4625
4626 * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4627 it annoys lintian which warns about these files not being
4628 executable. The #! isn't necessary here since if you absolutely
4629 must execute them you can always say "python <filename>".
4630
4631 2003-09-26 Bernhard Herzog <[email protected]>
4632
4633 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4634 only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4635 is ported to a newer the import will fail, so it should be noticed
4636 immediately that this function is gone.
4637 Fixes RT#1919
4638
4639 2003-09-26 Bernhard Herzog <[email protected]>
4640
4641 Add a DTD for the projection files and make thuban write valid
4642 projection files
4643
4644 * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4645 files
4646
4647 * Thuban/Model/resource.py (ProjFileSaver.write): Use
4648 'projectionlist' as the name in the document type declaration so
4649 that it matches the element type of the root element.
4650
4651 * test/test_proj.py (sample_projfile, sample_projfile2): Use
4652 'projectionlist' as the name in the document type declaration just
4653 as it is done now in the files thuban would write
4654 (sample_projfile, sample_projfile_data): Fix spelling of
4655 "Mercator"
4656 (TestProjFile.doTestWrite): Validate the written and the expected
4657 XML data
4658 (TestProjFile): Derive from ValidationTest so that we can run xml
4659 validation tests
4660
4661 2003-09-24 Bernhard Herzog <[email protected]>
4662
4663 * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4664 modify the list returned by map.Layers() in place since it is the
4665 actual list of layers used by the map.
4666
4667 2003-09-23 Jan-Oliver Wagner <[email protected]>
4668
4669 * Doc/manual/thuban-manual.xml: Added subsection to chapter
4670 Extensions to describe the extensions coming with the Thuban
4671 standard package (gns2shp and importAPR).
4672
4673 2003-09-23 Bernhard Herzog <[email protected]>
4674
4675 * libraries/thuban/wxproj.cpp (project_point): if there's an
4676 inverse but no forward projection, convert to degrees after
4677 applying the inverse projection. Fixes RT#2096
4678
4679 * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4680 implicitly tests for the fix to RT#2096
4681
4682 * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4683 Check that the sequences have the same lengths
4684
4685 * Resources/Projections/defaults.proj (Geographic projection): Use
4686 a much more precise value for the to_meter attribute.
4687
4688 2003-09-22 Bernhard Herzog <[email protected]>
4689
4690 * test/support.py (initthuban): Make sure to unset the LANG env.
4691 var. so that tests that compare translated strings work. Solves RT
4692 #2094
4693
4694 2003-09-22 Jan-Oliver Wagner <[email protected]>
4695
4696 Small improvement of APR import.
4697
4698 * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4699 Added tests for text-ranges.
4700
4701 * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4702 returns a string object if the range is based on text.
4703
4704 * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4705 range retrieval.
4706
4707 2003-09-22 Jan-Oliver Wagner <[email protected]>
4708
4709 Initial version of the importAPR extension which is in
4710 experimental state.
4711
4712 * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4713 /Extensions/importAPR/test/: New directories.
4714
4715 * /Extensions/importAPR/samples/README: New: Howto load the samples.
4716
4717 * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4718 file which refers to the Thuban Iceland demo data.
4719
4720 * /Extensions/importAPR/test/README: New: Howto execute the tests.
4721
4722 * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4723
4724 * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4725 as in '.apr'-files.
4726
4727 * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4728 ODB Objects as in '.apr', '.avl' and other files.
4729
4730 * /Extensions/importAPR/__init__.py: New: Init to make this
4731 directory a package.
4732
4733 * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4734 project file (.apr) and convert it to Thuban.
4735
4736 2003-09-22 Jan-Oliver Wagner <[email protected]>
4737
4738 * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
4739
4740 2003-09-19 Jan-Oliver Wagner <[email protected]>
4741
4742 * Doc/manual/thuban-manual.xml: Extended section 'Installation'
4743 with description on RPM installation and RPM binary package
4744 creation.
4745
4746 2003-09-18 Bernhard Herzog <[email protected]>
4747
4748 * setup.py (data_files): Only add the mo files if the Locales
4749 directory actually exists, so that setup.py works with a fresh CVS
4750 checkout
4751
4752 2003-09-12 Jan-Oliver Wagner <[email protected]>
4753
4754 * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
4755 in viewport, not anymore in view
4756
4757 2003-09-04 Jan-Oliver Wagner <[email protected]>
4758
4759 Introducing first Extension (gns2shp).
4760
4761 * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
4762
4763 * Extensions/__init__.py: New. init to make this dir a package.
4764
4765 * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
4766
4767 * Extensions/gns2shp/test/README: New. some info on this test directory.
4768
4769 * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
4770
4771 * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
4772 of Shapefile from GNS text file format
4773
4774 2003-09-03 Jan-Oliver Wagner <[email protected]>
4775
4776 Fix/workaround for bug #2019:
4777 https://intevation.de/rt/webrt?serial_num=2019
4778
4779 * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
4780 (IdentifyView.__init__): Added another button that allows to
4781 stop the identify mode.
4782 (IdentifyView.OnStop): New. Stops the identify mode.
4783
4784 2003-09-03 Jan-Oliver Wagner <[email protected]>
4785
4786 Introducing a new exception dialog that allows to exit the
4787 application immediately.
4788 This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
4789
4790 * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
4791
4792 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4793 Made strings available to translations. Exchanged the simple
4794 ScrolledMessageDialog by the new ExceptionDialog.
4795
4796 2003-09-01 Bernhard Herzog <[email protected]>
4797
4798 * NEWS: New. Summary of changes and release notes.
4799
4800 * MANIFEST.in: Add NEWS
4801
4802 2003-09-01 Bernhard Herzog <[email protected]>
4803
4804 * MANIFEST.in: Correct the include statement for the mo-files and
4805 include the documentation too.
4806
4807 * setup.py (data_files): Add the .mo files
4808 (setup call): Up to version 0.9.0
4809
4810 2003-09-01 Bernhard Herzog <[email protected]>
4811
4812 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
4813 parameter list to just parent and session
4814 (ChooseDBTableDialog.__set_properties): Removed. Setting the
4815 selection of empty list boxes is not allowed (and produces C++
4816 assertion errors) and the rest of the setup is better done in
4817 __init__ anyway.
4818 (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
4819 (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
4820 builtins True/False for booleans to avoid warnings from wxPython
4821
4822 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
4823 ChooseDBTableDialog constructor parameters.
4824
4825 2003-09-01 Bernhard Herzog <[email protected]>
4826
4827 * Thuban/Model/postgisdb.py
4828 (PostGISTable): Extend doc-string
4829 (PostGISTable._fetch_table_information): Set the column index
4830 correctly, pretending ignored columns don't exist.
4831
4832 * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
4833 for postgis tables with data types not yet supported by thuban.
4834
4835 2003-08-29 Bernhard Herzog <[email protected]>
4836
4837 * HOWTO-Release: Tweak item about running the tests.
4838
4839 2003-08-29 Jan-Oliver Wagner <[email protected]>
4840
4841 * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
4842
4843 2003-08-29 Bernhard Herzog <[email protected]>
4844
4845 Add some missing parameters to projections. Proj complains about
4846 them on windows but for some reason not on Linux.
4847
4848 * test/test_save.py (SaveSessionTest.testLayerProjection): Add
4849 missing required projection parameters
4850
4851 * test/test_proj.py (TestProjFile.test): Add missing required
4852 projection parameters
4853
4854 * test/test_load_0_8.py (TestLayerProjection.file_contents)
4855 (TestLayerProjection.test): Add missing required projection
4856 parameters and tests for them
4857
4858 * test/test_load.py (TestLayerProjection.file_contents)
4859 (TestLayerProjection.test): Add missing required projection
4860 parameters and tests for them
4861
4862 * test/test_layer.py (TestLayer.test_base_layer): Add missing
4863 required projection parameters
4864
4865 2003-08-29 Bernhard Herzog <[email protected]>
4866
4867 * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
4868 access the pj_errno because directly accessing pj_errno doesn't
4869 work on windows if the proj library is in a DLL
4870
4871 * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
4872
4873 2003-08-28 Bernhard Herzog <[email protected]>
4874
4875 * test/test_proj.py: Import things from Thuban after calling
4876 initthuban
4877
4878 * test/test_load.py (LoadSessionTest.filenames): New class
4879 variable with the filename attributes to normalize
4880 (LoadSessionTest.check_format): Pass self.filenames to
4881 sax_eventlist to normalize the filename attributes
4882
4883 * test/xmlsupport.py: Add cvs keywords
4884 (SaxEventLister.__init__): New parameter filenames which indicates
4885 attributes that contain filenames
4886 (SaxEventLister.startElementNS): Normalize the filename attributes
4887 with os.path.normpath
4888 (sax_eventlist): New parameter filenames to pass through to
4889 SaxEventLister
4890
4891 * test/test_derivedshapestore.py: Make this file callable as a
4892 program to execute the tests
4893 (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
4894 the session to self.session so that it gets destroyed properly
4895
4896 * test/test_layer.py (TestLayer.tearDown): Call the session's
4897 Destroy method
4898
4899 * test/test_map.py (TestMapBase.tearDown): Destroy self.session
4900 too if it exists
4901 (TestMapAddLayer.test_add_layer): Bind the session to self.session
4902 so that it gets destroyed properly
4903
4904 * test/postgissupport.py (reason_for_not_running_tests): Add a
4905 test for the existence of popen2.Popen4.
4906
4907 * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
4908 reliable way to destroy the sessions created in the test cases
4909 (SaveSessionTest.test_dbf_table): Bind the session to self.session
4910 so that it gets destroyed properly
4911 (SaveSessionTest.testLayerProjection): Bind the session to
4912 self.session so that it gets destroyed properly
4913
4914 * test/test_session.py (UnreferencedTablesTests.tearDown): Make
4915 sure that the session is destroyed properly
4916
4917 * test/test_shapefilestore.py: Make this callable as a program to
4918 execute the tests
4919
4920 * test/test_scalebar.py: Remove unnecessary import of _ from
4921 Thuban
4922
4923 * test/support.py (print_garbage_information): Call initthuban
4924 here because it may be called indirectly from test cases that test
4925 test support modules which do not use anything from thuban itself
4926 (ThubanTestProgram.runTests): Remove unnecessary debug print
4927
4928 2003-08-28 Bernhard Herzog <[email protected]>
4929
4930 * Thuban/version.py (longversion): Update to 0.9
4931
4932 * Thuban/UI/mainwindow.py: Remove some unused imports
4933
4934 * README: Add section about required additional software. Add date
4935 and revision CVS keywords
4936
4937 * HOWTO-Release: Add item about the translations. Add date and
4938 revision CVs keywords and change formatting to match README a bit
4939 better
4940
4941 * po/de.po: Update for 0.9
4942
4943 * test/README: Tweak the wording a little because many tests are
4944 not really unittest.
4945
4946 2003-08-27 Bernhard Herzog <[email protected]>
4947
4948 As preparation for the 0.9 release, switch thuban files to a
4949 non-dev namespace
4950
4951 * Thuban/Model/save.py (SessionSaver.write_session): Write files
4952 with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
4953 namespace
4954
4955 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
4956 http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
4957
4958 * test/test_save.py (SaveSessionTest.dtd)
4959 (SaveSessionTest.testEmptySession)
4960 (SaveSessionTest.testSingleLayer)
4961 (SaveSessionTest.testLayerProjection)
4962 (SaveSessionTest.testRasterLayer)
4963 (SaveSessionTest.testClassifiedLayer)
4964 (SaveSessionTest.test_dbf_table)
4965 (SaveSessionTest.test_joined_table)
4966 (SaveSessionTest.test_save_postgis): Update for new namespace
4967
4968 * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
4969 (TestLayerVisibility.file_contents, TestLabels.file_contents)
4970 (TestLayerProjection.file_contents)
4971 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4972 (TestPostGISLayer.file_contents)
4973 (TestPostGISLayerPassword.file_contents)
4974 (TestLoadError.file_contents, TestLoadError.test): Update for new
4975 namespace
4976
4977 2003-08-27 Bernhard Herzog <[email protected]>
4978
4979 Make the table interface distinguish between row ids (an integer
4980 that uniquely identifies a row) and row ordinals (a simple row
4981 count from 0 to NumRows() - 1)
4982
4983 * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
4984 (PostGISTable.RowOrdinalToId): New methods to conver between row
4985 ids and row ordinals
4986 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
4987 parameter row_is_ordinal to indicate whether the row parameter is
4988 the row id or the ordinal
4989
4990 * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
4991 (TransientTableBase.RowOrdinalToId)
4992 (AutoTransientTable.RowIdToOrdinal)
4993 (AutoTransientTable.RowOrdinalToId): Same new methods as in
4994 PostGISTable.
4995 (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
4996 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
4997 Same new parameter as in PostGISTable.
4998
4999 * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
5000 (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
5001 (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
5002 (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
5003 (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
5004 parameter as in PostGISTable.
5005
5006 * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
5007 (DataTable.RowOrdinalToId): New methods to convert between row ids
5008 and row ordinals.
5009 (TableGrid.SelectRowById): New method to select a row based on its
5010 ID as opposed to its ordinal
5011 (DataTable.GetValue, TableGrid.OnRangeSelect)
5012 (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
5013 (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
5014 (LayerTableFrame.__init__): Convert between row ids and row
5015 ordinals as appropriate
5016
5017 * test/postgissupport.py (PostGISDatabase.__init__): Add
5018 doc-string.
5019 (PostGISDatabase.initdb): The optional third item in a tuple in
5020 tables is now a (key, value) list with additional arguments to
5021 pass to upload_shapefile
5022 (upload_shapefile): New parameter gid_offset to allow gids that
5023 are not the same as the shapeids in the shapefile
5024 (PostgreSQLServer.get_default_static_data_db): Use the new
5025 gid_offset to make the gids in landmarks 1000 higher than the
5026 shapeids in the shapefile
5027
5028 * test/test_viewport.py
5029 (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
5030 new shapeids in the landmarks table
5031
5032 * test/test_transientdb.py
5033 (TestTransientTable.run_iceland_political_tests)
5034 (TestTransientTable.test_transient_joined_table): Add tests for
5035 the new table methods and new keywords arguments.
5036
5037 * test/test_postgis_db.py
5038 (TestPostGISTable.test_read_row_as_dict_row_count_mode)
5039 (TestPostGISTable.test_read_value_row_count_mode)
5040 (TestPostGISTable.test_row_id_to_ordinal)
5041 (TestPostGISTable.test_row_oridnal_to_id): New test for the new
5042 table methods and the new arguments
5043 (TestPostGISShapestorePoint.test_shapes_in_region)
5044 (TestPostGISShapestorePoint.test_shape_raw_data)
5045 (TestPostGISShapestorePoint.test_shape_points)
5046 (TestPostGISShapestorePoint.test_shape_shapeid)
5047 (TestPostGISShapestorePoint.test_all_shapes)
5048 (TestPostGISTable.test_simple_query)
5049 (TestPostGISTable.test_simple_query)
5050 (TestPostGISTable.test_simple_query)
5051 (TestPostGISTable.test_read_value)
5052 (TestPostGISTable.test_read_row_as_dict): Adapt to the new
5053 shapeids in the landmarks table
5054
5055 * test/test_memory_table.py
5056 (TestMemoryTable.test_read_row_as_dict_row_count_mode)
5057 (TestMemoryTable.test_read_value_row_count_mode)
5058 (TestMemoryTable.test_row_id_to_ordinal)
5059 (TestMemoryTable.test_row_oridnal_to_id): New test for the new
5060 table methods and the new arguments
5061
5062 * test/test_dbf_table.py
5063 (TestDBFTable.test_read_row_as_dict_row_count_mode)
5064 (TestDBFTable.test_read_value_row_count_mode)
5065 (TestDBFTable.test_row_id_to_ordinal)
5066 (TestDBFTable.test_row_oridnal_to_id): New test for the new table
5067 methods and the new arguments
5068
5069 2003-08-26 Bernhard Herzog <[email protected]>
5070
5071 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
5072 more postgis specific but much faster method to get the bounding
5073 box
5074
5075 2003-08-26 Bernhard Herzog <[email protected]>
5076
5077 * Thuban/Model/postgisdb.py (PostGISTable.Title)
5078 (PostGISShapeStore.AllShapes): Add these missing methods.
5079 (PostGISShapeStore.ShapesInRegion): No need to raise
5080 StopIteration. We can simply return
5081
5082 * test/test_postgis_db.py (TestPostGISTable.test_title)
5083 (TestPostGISShapestorePoint.test_all_shapes): New tests for the
5084 new methods
5085
5086 2003-08-25 Bernhard Herzog <[email protected]>
5087
5088 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
5089
5090 * test/test_postgis_db.py (PolygonTests): New class containing
5091 those tests from TestPostGISShapestorePolygon that can also be
5092 used to test MUTLIPOLYGON tables
5093 (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
5094 so derive from that
5095 (TestPostGISShapestoreMultiPolygon): New class with tests for
5096 MUTLIPOLYGON tables
5097
5098 * test/postgissupport.py (PostGISDatabase.initdb): Allow the
5099 tables argument to have tuples with three items to override the
5100 WKT type used.
5101 (PostgreSQLServer.get_default_static_data_db): Use the above to
5102 create a polygon table with MUTLIPOLYGONs
5103 (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
5104 (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
5105 coords_to*
5106 (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
5107 (wkt_converter): New. Map WKT types to converters
5108 (upload_shapefile): New parameter force_wkt_type to use a
5109 different WKT type than the default
5110
5111 2003-08-25 Bernhard Herzog <[email protected]>
5112
5113 * Thuban/UI/application.py
5114 (ThubanApplication.run_db_param_dialog): New. Suitable as a
5115 db_connection_callback. Main difference is that the dialog run
5116 from this method doesn't have a parent so it can be used even when
5117 there is no main window
5118 (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
5119 no db_connection_callback was given. This way the dialog pops up
5120 even when the .thuban file was given as a command line parameter.
5121
5122 2003-08-25 Bernhard Herzog <[email protected]>
5123
5124 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
5125 before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
5126 which leads to an effectively frozen X session because the user
5127 can only interact with the dialog but the mouse is still grabbed
5128 by the canvas.
5129 Also, call the tool's Hide method before MouseLeftUp because
5130 MouseLeftUp may change the tool's coordinates.
5131
5132 2003-08-25 Bernhard Herzog <[email protected]>
5133
5134 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
5135 LoadCancelled exceptions and handle them by returning immediately.
5136
5137 2003-08-25 Bernhard Herzog <[email protected]>
5138
5139 GUI part of loading sessions with postgis connections which may
5140 require user interaction to get passwords or updated parameters
5141
5142 * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
5143 bit nucer and be more generic.
5144 (DBFrame.OnAdd): Adapt to new DBDialog interface
5145
5146 * Thuban/UI/application.py (ThubanApplication.OpenSession): New
5147 optional parameter db_connection_callback which is passed to
5148 load_session.
5149
5150 * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
5151 Suitable as a db_connection_callback
5152 (MainWindow.OpenSession): Use self.run_db_param_dialog as the
5153 db_connection_callback of the application's OpenSession method
5154
5155
5156 2003-08-25 Bernhard Herzog <[email protected]>
5157
5158 Basic loading of sessions containing postgis connections:
5159
5160 * Thuban/Model/load.py (LoadError): Add doc-string
5161 (LoadCancelled): New exception class to indicate a cancelled load
5162 (SessionLoader.__init__): Add the db_connection_callback parameter
5163 which will be used by the loader to get updated parameters and a
5164 password for a database connection
5165 (SessionLoader.__init__): Add the new XML elements to the
5166 dispatchers dictionary
5167 (SessionLoader.check_attrs): Two new conversions, ascii to convert
5168 to a byte-string object and idref as a generic id reference
5169 (SessionLoader.start_dbconnection)
5170 (SessionLoader.start_dbshapesource): New. Handlers for the new XML
5171 elements
5172 (load_session): Add the db_connection_callback to pass through the
5173 SessionLoader
5174
5175 * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
5176 New classes to test loading of sessions with postgis database
5177 connections.
5178
5179 2003-08-25 Bernhard Herzog <[email protected]>
5180
5181 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
5182 replace it and the comment with __BuildDate__ by the Source: and
5183 Id: cvs keywords as used in the other files.
5184
5185 2003-08-25 Bernhard Herzog <[email protected]>
5186
5187 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
5188 LoadError when a required attribute is missing. The code used to
5189 be commented out for some reason, but probably should have been
5190 active.
5191
5192 * test/test_load.py (TestLoadError.test): Test the message in the
5193 LoadError too to make sure it really is about the missing
5194 attribute
5195
5196 2003-08-22 Bernhard Herzog <[email protected]>
5197
5198 * test/test_save.py (SaveSessionTest.test_dbf_table)
5199 (SaveSessionTest.test_joined_table): Add XML validation tests.
5200
5201 2003-08-22 Bernhard Herzog <[email protected]>
5202
5203 Implement saving a session with a postgis connection
5204
5205 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5206 elements for database connections and shapestores using db
5207 connections
5208 (session): Add the dbconnections to the content model
5209
5210 * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5211 Write the db connections
5212 (SessionSaver.write_session): Call write_db_connections to write
5213 the connection before the data sources
5214 (SessionSaver.write_data_containers): Handle postgis shapestores
5215
5216 * test/test_save.py (SaveSessionTest.thubanids)
5217 (SaveSessionTest.thubanidrefs): Update for new DTD
5218 (SaveSessionTest.test_save_postgis): New. Test saving a session
5219 with postgis connections
5220
5221 * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5222 (PostGISTable.TableName): New accessor methods for the connection
5223 and table name
5224
5225 * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5226 (TestPostGISTable.test_dbname): New methods to test the new
5227 PostGISConnection methods
5228
5229 2003-08-22 Bernhard Herzog <[email protected]>
5230
5231 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5232 for exceptions occurring when establishing a Database connection
5233 (PostGISConnection.connect): Catch psycopg.OperationalError during
5234 connects and raise ConnectionError.
5235
5236 * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5237 tests for database exceptions
5238
5239 2003-08-22 Bernhard Herzog <[email protected]>
5240
5241 Prepare the test suite for tests with required authentication
5242
5243 * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5244 variables with two predefined users/passwords, one for the admin
5245 and one for a non-privileged user.
5246 (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5247 the non-privileged user to the database and set the admin password
5248 (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5249 Better error reporting
5250 (PostgreSQLServer.connection_params)
5251 (PostgreSQLServer.connection_string): New methods to return
5252 information about how to connect to the server
5253 (PostgreSQLServer.execute_sql): New. Convenience method to execute
5254 SQL statements
5255 (PostgreSQLServer.require_authentication): Toggle whether the
5256 server requires authentication
5257 (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5258 Add or alter users
5259 (PostGISDatabase.initdb): Pass the admin name one the
5260 subprocesses' command lines. Grant select rights on
5261 geometry_columns to everybody.
5262 (upload_shapefile): Use the admin name and password when
5263 connecting. Grant select rights on the new table to everybody.
5264
5265 * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5266 server's new methods to get the connection parameters.
5267
5268 * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5269 (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5270 server's new methods to get the connection parameters.
5271
5272 * test/test_postgis_db.py
5273 (TestPostGISConnection.test_gis_tables_empty)
5274 (TestPostGISConnection.test_gis_tables_non_empty)
5275 (PostGISStaticTests.setUp): Use the server's new methods to get
5276 the connection parameters.
5277
5278 2003-08-22 Bernhard Herzog <[email protected]>
5279
5280 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5281
5282 * Thuban/version.py: Add psycopg version
5283
5284 * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5285 version of the psycopg module
5286
5287 2003-08-22 Bernhard Herzog <[email protected]>
5288
5289 * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5290 (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5291 at the moment. The functionality should probably be implemented
5292 some time, though.
5293 (DBFrame.OnRemove): Display a message if the connection can't be
5294 removed because it's still in use.
5295
5296 2003-08-22 Jan-Oliver Wagner <[email protected]>
5297
5298 * Thuban/UI/about.py (About.__init__): split up the huge about
5299 text into elements/lists for easier translation. This fixes bug
5300 https://intevation.de/rt/webrt?serial_num=2058
5301 Also, made some forgotten string available for the i18n.
5302
5303 2003-08-21 Bernhard Herzog <[email protected]>
5304
5305 Make postgis support really optional including insensitive menu
5306 items.
5307
5308 * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5309 whether the postgis is supported.
5310
5311 * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5312 to make postgis support optional
5313
5314 * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5315 version of Thuban.Model.postgisdb.has_postgis_support
5316 (database_management command): Make it only sensitive if postgis
5317 is supported.
5318
5319 2003-08-21 Jan-Oliver Wagner <[email protected]>
5320
5321 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5322 (section Adding and Removing Layers): Added text and described
5323 multi-selection.
5324 (chapter Extensions): New.
5325
5326 2003-08-21 Jan-Oliver Wagner <[email protected]>
5327
5328 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5329 settings to allow multiple files to load into the map.
5330 Also reduced selection to *.shp as a default.
5331
5332 2003-08-20 Bernhard Herzog <[email protected]>
5333
5334 Add dialogs and commands to open database connections and add
5335 database layers.
5336
5337 * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5338 method to open the database connection management dialog
5339 (MainWindow.AddDBLayer): New method to add a layer from a database
5340 (_has_dbconnections): New helper function to use for sensitivity
5341 (database_management command, layer_add_db command): New commands
5342 that call the above new methods.
5343 (main_menu): Add the new commands to the menu.
5344
5345 * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5346 (PostGISConnection.connect): Establish the actual connection in a
5347 separate method and call it in __init__. This makes it easier to
5348 override the behavior in test cases
5349 (PostGISConnection.BriefDescription): New method to return a brief
5350 description for use in dialogs.
5351
5352 * test/test_postgis_db.py (NonConnection): DB connection that
5353 doesn't actually connect
5354 (TestBriefDescription): New class with tests for the new
5355 BriefDescription method
5356
5357 2003-08-19 Jan-Oliver Wagner <[email protected]>
5358
5359 Moved anything from extensions to libraries.
5360
5361 * libraries: New.
5362
5363 * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5364
5365 * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5366 Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5367 been moved here from thuban/extensions/pyprojection/
5368 See there in the Attic for the older history.
5369
5370 * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5371 dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5372 shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5373 have been moved here from thuban/extensions/pyshapelib/
5374 See there in the Attic for the older history.
5375
5376 * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5377 files have been moved here from thuban/extensions/shapelib/
5378 See there in the Attic for the older history.
5379
5380 * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5381 gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5382 thuban/extensions/thuban/
5383 See there in the Attic for the older history.
5384
5385 * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5386
5387 * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5388 gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5389
5390 * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5391 Moved to libraries/shapelib.
5392
5393 * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5394 shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5395 ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5396 Moved to libraries/pyshapelib.
5397
5398 * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5399 LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5400 Moved to libraries/pyprojection.
5401
5402 * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5403
5404 * extensions: Removed.
5405
5406 2003-08-19 Bernhard Herzog <[email protected]>
5407
5408 * test/test_viewport.py (ViewPortTest): We don't use the
5409 facilities of FileTestMixin so don't derive from it.
5410 (TestViewportWithPostGIS): New class with tests for using a
5411 viewport on a map with postgis layers.
5412
5413 2003-08-19 Bernhard Herzog <[email protected]>
5414
5415 Add the db connection management to the session.
5416
5417 * Thuban/Model/session.py (Session.__init__): New instance
5418 variable db_connections
5419 (Session.AddDBConnection, Session.DBConnections)
5420 (Session.HasDBConnections, Session.CanRemoveDBConnection)
5421 (Session.RemoveDBConnection): New methods to manage and query the
5422 db connections managed by the session
5423 (Session.OpenDBShapeStore): New method to open a shapestore from a
5424 db connection
5425
5426 * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5427 messages for the db connection handling in the session
5428
5429 * test/test_postgis_session.py: New. test cases for the session's
5430 db connection handling with postgis connections
5431
5432 2003-08-19 Bernhard Herzog <[email protected]>
5433
5434 Add very basic postgis database support and the corresponding test
5435 cases. The test cases require a PostgreSQL + postgis installation
5436 but no existing database. The database will be created
5437 automatically by the test cases
5438
5439 * test/README: Add note about skipped tests and the requirements
5440 of the postgis tests.
5441
5442 * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5443
5444 * test/test_postgis_db.py: New. Test cases for the postgis
5445 support.
5446
5447 * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5448 format
5449
5450 * test/test_wellknowntext.py: New. Test cases for the
5451 wellknowntext parser
5452
5453 * test/postgissupport.py: New. Support module for tests involving
5454 a postgis database.
5455
5456 * test/support.py (execute_as_testsuite): Shut down the postmaster
5457 if it's still running after the tests
5458
5459 * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5460 well known text format
5461
5462 2003-08-19 Jan-Oliver Wagner <[email protected]>
5463
5464 * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5465 message dialog.
5466
5467 2003-08-18 Bernhard Herzog <[email protected]>
5468
5469 * test/support.py (ThubanTestResult.printErrors): Indent the
5470 reason for the skips in the output to make it a bit more readable.
5471 (execute_as_testsuite): New helper function to run a test suite
5472 and print some more information.
5473 (run_tests): Use execute_as_testsuite to run the tests
5474
5475 * test/runtests.py (main): Use execute_as_testsuite to run the
5476 tests
5477
5478 2003-08-18 Bernhard Herzog <[email protected]>
5479
5480 Fix some bugs in Thuban and the test suite that were uncovered by
5481 changes introduced in Python 2.3:
5482
5483 * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5484 filename is an absolute name
5485
5486 * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5487 filename is an absolute name
5488
5489 * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5490 unique filename to save to and use the correct relative filename
5491 in the expected output.
5492 (SaveSessionTest.test_dbf_table): Use the correct relative
5493 filename in the expected output.
5494
5495 * test/test_layer.py (TestLayer.test_raster_layer): Update the
5496 test to check whether the filename is absolute.
5497
5498 2003-08-18 Jan-Oliver Wagner <[email protected]>
5499
5500 * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5501
5502 2003-08-15 Bernhard Herzog <[email protected]>
5503
5504 Change the way shapes are returned by a shape store. The
5505 ShapesInRegion method returns an iterator over actual shape
5506 objects instead of a list of shape ids.
5507
5508 * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5509 id.
5510 (ShapefileStore.ShapesInRegion): Return an iterator over the
5511 shapes which yields shape objects instead of returning a list of
5512 shape ids
5513 (ShapefileStore.AllShapes): New. Return an iterator over all
5514 shapes in the shape store
5515 (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5516
5517 * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5518 doc-string.
5519
5520 * Thuban/UI/baserenderer.py
5521 (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5522 layer_shapes and make it return an iterator containg shapes
5523 instead of a list of ids.
5524 (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5525 layer_shapes() change
5526
5527 * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5528 (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5529
5530 * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5531 changes in the ShapesInRegion return value.
5532 (ViewPort._get_hit_tester): Remove commented out code
5533
5534 * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5535 new return value.
5536 (SimpleShapeStore.AllShapes): New. Implement this method too.
5537
5538 * test/test_layer.py (TestLayer.test_arc_layer)
5539 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5540 (TestLayer.test_point_layer_with_projection)
5541 (TestLayer.test_derived_store): Adapt to changes in the
5542 ShapesInRegion return value.
5543
5544 * test/test_shapefilestore.py
5545 (TestShapefileStoreArc.test_shapes_in_region)
5546 (TestShapefileStorePolygon.test_shapes_in_region)
5547 (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5548 in the ShapesInRegion return value.
5549 (TestShapefileStorePoint.test_all_shapes)
5550 (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5551 methods
5552
5553 * test/test_derivedshapestore.py
5554 (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5555 the ShapesInRegion return value.
5556 (TestDerivedShapeStore.test_all_shapes)
5557 (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5558 methods
5559
5560 2003-08-15 Bernhard Herzog <[email protected]>
5561
5562 Make the renderers deal correctly with raw vs. python level
5563 representation of shape geometries
5564
5565 * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5566 Return a flag useraw in addition to the callable and the parameter
5567 to indicate whether the callable can deal with the raw shape data
5568 or uses the higher level python lists of coordinates. The callable
5569 now should accept either the raw data or the return value of the
5570 shape's Points() method.
5571 (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5572 change
5573 (BaseRenderer.projected_points): Instead of the shape id use the
5574 points list as parameter.
5575 (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5576 (BaseRenderer.draw_point_shape): Adapt to projected_points()
5577 change and accept the points list as parameter instead of the
5578 shape id.
5579
5580 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5581 the useraw flag as required by the BaseRenderer
5582 (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5583 changes.
5584
5585 * test/test_baserenderer.py
5586 (TestBaseRenderer.test_point_with_classification): New test for
5587 rendering a map with classifications.
5588
5589 2003-08-15 Bernhard Herzog <[email protected]>
5590
5591 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5592 (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5593 (ViewPort._get_hit_tester, ViewPort.projected_points)
5594 (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5595 (ViewPort._find_label_at): Split the find_shape_at method into
5596 several new methods and use the functions in the hit-test module.
5597
5598 * Thuban/UI/hittest.py: New module with Python-level hit-testing
5599 functions
5600
5601 * test/test_hittest.py: New. Test for the new hittest module
5602
5603 2003-08-15 Bernhard Herzog <[email protected]>
5604
5605 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5606 projection to all corners of the bounding box to get a better
5607 approximation of the projected bounding box
5608
5609 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5610 New. Test coordinate handling of a layer with a projection.
5611 Catches the bug fixed in Layer.ShapesInRegion
5612
5613 2003-08-15 Bernhard Herzog <[email protected]>
5614
5615 Move some of the mock objects in test_baserenderer into their own
5616 module so they can easily be used from other tests
5617
5618 * test/mockgeo.py: New test helper module with some mock objects
5619 for geometry related things like shapes, shapestores and
5620 projections.
5621
5622 * test/test_mockgeo.py: New. Tests for the new helper module
5623
5624 * test/test_baserenderer.py: Some of the mock-objects are in
5625 mockgeo now.
5626
5627 2003-08-12 Jan-Oliver Wagner <[email protected]>
5628
5629 * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
5630
5631 2003-08-12 Bernhard Herzog <[email protected]>
5632
5633 * po/de.po: New. German translations by Bjoern Broscheit
5634
5635 2003-08-12 Bernhard Herzog <[email protected]>
5636
5637 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5638 strings have to be one string literal.
5639
5640 2003-08-11 Bernhard Herzog <[email protected]>
5641
5642 * test/support.py (FloatComparisonMixin.assertPointListEquals):
5643 New. This method was used in various derived classes, but it's
5644 better to have it here.
5645
5646 * test/test_shapefilestore.py
5647 (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5648 FloatComparisonMixin
5649
5650 * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5651 It's now in FloatComparisonMixin
5652
5653 * test/test_derivedshapestore.py
5654 (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5655 in FloatComparisonMixin
5656
5657 2003-08-11 Bernhard Herzog <[email protected]>
5658
5659 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5660 error message
5661
5662 2003-08-08 Jan-Oliver Wagner <[email protected]>
5663
5664 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5665 with version number.
5666 Changed title to reflect version number of Thuban.
5667
5668 2003-08-08 Jan-Oliver Wagner <[email protected]>
5669
5670 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5671 the list corresponds to the "About" web page.
5672
5673 2003-08-08 Bernhard Herzog <[email protected]>
5674
5675 * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5676 Make sure translated strings are recognized as one string literal.
5677
5678 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5679 Make sure translated strings are recognized as one string literal.
5680
5681 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5682 translated strings are recognized as one string literal.
5683
5684 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5685 sure translated strings are recognized as one string literal.
5686
5687 2003-08-07 Bernhard Herzog <[email protected]>
5688
5689 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5690 Simply delegates to the original shapestore.
5691
5692 * test/test_derivedshapestore.py
5693 (TestDerivedShapeStore.test_raw_format): New. Test case for
5694 DerivedShapeStore.RawShapeFormat
5695
5696 2003-08-07 Bernhard Herzog <[email protected]>
5697
5698 Add raw data interface to shape objects.
5699
5700 * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5701 class to ShapefileShape which now holds shapefile specific
5702 information.
5703 (ShapefileShape.compute_bbox): Simplified to not cache any
5704 information. The way this method is used that shouldn't matter
5705 performance wise.
5706 (ShapefileShape.RawData): New. Return the shapeid which is the raw
5707 data format for shapes from shapefiles.
5708 (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5709 in the shape objects returned by a shapestore. For a
5710 ShapefileStore this is always RAW_SHAPEFILE.
5711 (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5712 method.
5713
5714 * test/test_shapefilestore.py
5715 (TestShapefileStore.test_raw_format): New test to test the raw
5716 format feature of shapes.
5717
5718 * Thuban/Model/layer.py: Remove the unused import of Shape from
5719 data. It was only there for interface compatibility but it's not
5720 used inside of Thuban and the generic Shape class has gone away.
5721
5722 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5723 the raw data format and only use an optimized version of its a
5724 shapefile.
5725
5726 2003-08-07 Bernhard Herzog <[email protected]>
5727
5728 * test/test_baserenderer.py (SimpleShape): Shape class for the
5729 tests.
5730 (SimpleShapeStore.Shape): Use SimpleShape instead of
5731 Thuban.Model.data.Shape to make the tests independed of the coming
5732 changes.
5733
5734 2003-08-07 Bernhard Herzog <[email protected]>
5735
5736 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5737 (ThubanTestProgram): New classes that extend the respective
5738 classes from unittest. These new version support skipping tests
5739 under certain expected conditions. In the Thuban test suite we
5740 uses this for tests that require the optional gdal support.
5741 (run_tests): Use ThubanTestProgram instead of the unittest.main()
5742
5743 * test/runtests.py (main): Use the new ThubanTestRunner instead of
5744 the normal one from unittest
5745
5746 * test/test_layer.py (TestLayer.test_raster_layer): If this test
5747 is not run because gdal support isn't available report this to the
5748 runner.
5749
5750 * test/test_baserenderer.py
5751 (TestBaseRenderer.test_raster_no_projection): Do not run this test
5752 if gdal support isn't available and report this to the runner.
5753
5754 2003-08-06 Bernhard Herzog <[email protected]>
5755
5756 Rearrange the renderers a bit, partly in preparation for changes
5757 required for the postgis merge, partly to make it more testable.
5758 Also make the representation of coordinates in Shapes more
5759 consistent.
5760
5761 * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
5762 this class is now in BaseRenderer. This class is now practically
5763 only a specialization of BaseRenderer for rendering to an actual
5764 wx DC.
5765 (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
5766 to get the shapetype specific rendering functions.
5767
5768 * Thuban/UI/baserenderer.py: New file with the basic rendering
5769 logic. The code in this file is completely independend of wx.
5770 (BaseRenderer): Class with the basic rendering logic
5771
5772 * test/test_baserenderer.py: New. Test cases for BaseRenderer
5773
5774 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5775 error_on_redraw to guard agains endless loops and stack overflows
5776 when there's a bug in the rendering code that raises exceptions.
5777 (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
5778 rendering into a separate method _do_redraw so that error handling
5779 is a bit easier. When an exception occurs, set error_on_redraw to
5780 true. When it's true on entry to OnIdle do nothing and return
5781 immediately.
5782
5783 * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
5784 Shape object will always have the coordinates as a list of list of
5785 coordinate pairs (tuples).
5786 (Shape.compute_bbox): Adapt to new representation.
5787
5788 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5789 (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
5790 Shape objects.
5791
5792 * test/test_shapefilestore.py
5793 (ShapefileStoreTests.assertFloatTuplesEqual)
5794 (ShapefileStoreTests.assertPointListEquals): Rename to
5795 assertPointListEquals and change purpose to checking equality of
5796 the lists returned by Shape.Points().
5797 (TestShapefileStoreArc.test_shape)
5798 (TestShapefileStorePolygon.test_shape)
5799 (TestShapefileStorePoint.test_shape): Use the new
5800 assertPointListEquals instead of assertFloatTuplesEqual
5801
5802 * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
5803 (TestLayer.assertPointListEquals): Rename to assertPointListEquals
5804 and change purpose to checking equality of the lists returned by
5805 Shape.Points().
5806 (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
5807 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5808 (TestLayer.test_derived_store): Use the new assertPointListEquals
5809 instead of assertFloatTuplesEqual
5810
5811 * test/test_derivedshapestore.py
5812 (TestDerivedShapeStore.assertFloatTuplesEqual)
5813 (TestDerivedShapeStore.assertPointListEquals): Rename to
5814 assertPointListEquals and change purpose to checking equality of
5815 the lists returned by Shape.Points().
5816 (TestDerivedShapeStore.test_shape): Use the new
5817 assertPointListEquals instead of assertFloatTuplesEqual
5818
5819 2003-08-06 Jan-Oliver Wagner <[email protected]>
5820
5821 * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
5822 a bounding box. A dialog is raised in case, no bounding box
5823 is found. This fixes bug #2043:
5824 https://intevation.de/rt/webrt?serial_num=2043
5825
5826 2003-08-05 Bernhard Herzog <[email protected]>
5827
5828 * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
5829 object look like a Color instantiation. Formerly it looked like a
5830 tuple.
5831
5832 * test/test_color.py (TestColor.test_repr)
5833 (TestColor.test_equality, TestColor.test_inequality): New. test
5834 some more apects of the Color class
5835 (TestTransparent.test_repr, TestTransparent.test_hex)
5836 (TestTransparent.test_equality): New. Test cases for the
5837 Transparent object.
5838
5839 2003-08-04 Jan-Oliver Wagner <[email protected]>
5840
5841 * Doc/manual/thuban-manual.xml: a number of small improvements.
5842 The resulting file is the version submitted for GREAT-ER II.
5843
5844 2003-08-01 Bernhard Herzog <[email protected]>
5845
5846 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
5847 Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
5848 Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
5849
5850 * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
5851 (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
5852 (ThubanEndBusyCursor): Add doc-strings
5853
5854 2003-08-01 Bernhard Herzog <[email protected]>
5855
5856 First step towards PostGIS integration. More abstraction by movin
5857 more code from the layer to the shapestore. More methods of the
5858 layer are now simply delegated to the equivalent method of the
5859 shapestore. The SHAPETYPE_* constants are now in data not in
5860 layer.
5861
5862 * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
5863 (SHAPETYPE_POINT, Shape): Move these constants and classes from
5864 layer.py to data.py
5865 (ShapefileStore.__init__): More Initialization for the new methods
5866 and functionality.
5867 (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
5868 (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
5869 (ShapefileStore.Shape): New methods that were formerly implemented
5870 in the layer.
5871 (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
5872 (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
5873 (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
5874 equivalents of the new shape methods. These versions are simply
5875 delegated to the original shapstore.
5876
5877 * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
5878 (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
5879 (Layer.SetShapeStore): Removed the initializatin of instance
5880 variables that were needed for the stuff that's now in
5881 ShapefileStore
5882 (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
5883 (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
5884 shapestore.
5885
5886 * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
5887 Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
5888 instead of layer.
5889
5890 * test/test_shapefilestore.py: New. Tests for ShapefileStore.
5891
5892 * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
5893
5894 * test/test_layer.py: Import the SHAPETYPE_* constants from data
5895 instead of layer.
5896 (TestLayer.test_derived_store): Remove the test for the exception
5897 when instantiating the DerivedShapeStore with an incompatible
5898 table which is now in test_derivedshapestore.py. Add some more
5899 tests of the layer methods to determine whether they work for a
5900 DerivedShapeStore as well.
5901
5902 2003-07-31 Jonathan Coles <[email protected]>
5903
5904 * Doc/manual/thuban-manual.xml: Fix the list of required packages
5905 by just listing the name and where they can be found.
5906
5907 2003-07-31 Frank Koormann <[email protected]>
5908
5909 * Doc/manual/thuban-manual.xml:
5910 Changed the screenshot elements to figure.
5911 Changed some variablelist elements to itemizedlist.
5912 Added section on GDAL formats.
5913
5914 2003-07-31 Jonathan Coles <[email protected]>
5915
5916 * Doc/manual/thuban-manual.xml: Added a few sentences about
5917 the Fix Border Color option when generating classes.
5918
5919 2003-07-30 Jonathan Coles <[email protected]>
5920
5921 * Thuban/Model/classgen.py: Add docstrings. Rename specific
5922 Ramp instances to use lower_case_style.
5923
5924 * Thuban/UI/classgen.py: Use renamed Ramp instances.
5925
5926 * Thuban/UI/classifier.py: Add docstrings.
5927
5928 * Thuban/UI/dock.py: Add docstrings.
5929
5930 * test/test_classgen.py: Use renamed Ramp instances.
5931
5932 2003-07-30 Bernhard Herzog <[email protected]>
5933
5934 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
5935 was never used in Thuban.
5936
5937 2003-07-30 Bernhard Herzog <[email protected]>
5938
5939 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
5940 method directly instead of going through the transient_table
5941 method. This faster because transient_table may force the copy of
5942 a DBF file into the transient database and setting a table's title
5943 doesnm't affect the title of the associated transient table, so
5944 this fixes RT #2042
5945
5946 * Thuban/UI/main.py (__version__): Don't import the already
5947 removed show_exception_dialog.
5948
5949 2003-07-29 Jonathan Coles <[email protected]>
5950
5951 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5952 Put back this method and remove the equivalent function since we
5953 are setting the exception hook from within this class (OnInit).
5954
5955 2003-07-29 Jonathan Coles <[email protected]>
5956
5957 * Doc/manual/images/5_2_custom_ramp.png,
5958 Doc/manual/images/5_2_quantiles.png,
5959 Doc/manual/images/5_2_uniform_dist.png,
5960 Doc/manual/images/5_2_unique_values.png,
5961 Doc/manual/images/8_int_error.png: New screen shots.
5962
5963 * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
5964 some points, and added more screen shots.
5965
5966 2003-07-29 Bernhard Herzog <[email protected]>
5967
5968 * Thuban/Model/data.py: Remove the now unused import of warnings
5969
5970 2003-07-29 Bernhard Herzog <[email protected]>
5971
5972 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
5973 deprecated since before the 0.8 release and isn't used in Thuban
5974 itself anymore.
5975
5976 * Thuban/Model/transientdb.py: Remove some unnecessary imports
5977
5978 2003-07-29 Jonathan Coles <[email protected]>
5979
5980 * Thuban/UI/application.py (ThubanApplication.OnInit): set the
5981 python exception hook here so that we are sure to catch any
5982 Thuban exception that happen during initialization.
5983
5984 * Thuban/UI/main.py (main): Don't set the exception hook here,
5985 it will get set in ThubanApplication.OnInit.
5986
5987 2003-07-29 Jonathan Coles <[email protected]>
5988
5989 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5990 Removed and called it show_exception_dialog() so that the exception
5991 handler can be set before the class is created.
5992
5993 * Thuban/UI/main.py (main): Install the exception handler before
5994 a ThubanApplication is created.
5995
5996 2003-07-29 Bernhard Herzog <[email protected]>
5997
5998 * po/it.po: New. Italian translation by Maurizio Napolitano
5999
6000 * po/ru.po: New. Russian translation by Alex Shevlakov
6001
6002 2003-07-29 Frank Koormann <[email protected]>
6003
6004 * Doc/manual/thuban-manual.xml: Extended section on supported
6005 projections.
6006
6007 2003-07-29 Frank Koormann <[email protected]>
6008
6009 * Doc/manual/thuban-manual.xml: gaspell-checked.
6010
6011 2003-07-29 Jonathan Coles <[email protected]>
6012
6013 * Doc/manual/images/3_5_legend.png: Added border to improve look
6014 on white background.
6015
6016 2003-07-29 Jonathan Coles <[email protected]>
6017
6018 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
6019 descriptions for the legend toolbar.
6020
6021 * Doc/manual/images/4_2_raster_layer_properties.png: Removed
6022 cursor from dialog box.
6023
6024 2003-07-28 Jonathan Coles <[email protected]>
6025
6026 * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
6027
6028 * Doc/manual/images/2_4_session_tree.png,
6029 Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
6030 Doc/manual/images/4_2_layer_properties.png,
6031 Doc/manual/images/4_2_raster_layer_properties.png,
6032 Doc/manual/images/5_3_genclass.png,
6033 Doc/manual/images/5_classification.png,
6034 Doc/manual/images/6_projection.png,
6035 Doc/manual/images/7_1_table_view.png,
6036 Doc/manual/images/7_2_5_join.png: New screenshots.
6037
6038 2003-07-24 Jonathan Coles <[email protected]>
6039
6040 * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
6041
6042 2003-07-24 Jonathan Coles <[email protected]>
6043
6044 * Doc/manual/thuban-manual.xml: Added EPS images and wrote
6045 chapter on Layer Management.
6046
6047 * Doc/manual/Makefile: New. Makefile to generate all formats for the
6048 manual and images.
6049
6050 2003-07-24 Bernhard Herzog <[email protected]>
6051
6052 * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
6053 it annoys lintian which warns about these files not being
6054 executable. The #! isn't necessary here since if you absolutely
6055 must execute them you can always say "python <filename>".
6056
6057 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
6058 superfluous code to set brush and pen for point shapes
6059
6060 * Thuban/UI/viewport.py: Remove commented out code that wouldn't
6061 belong in viewport anyway
6062
6063 2003-07-24 Frank Koormann <[email protected]>
6064
6065 * Doc/manual/thuban-manual.xml: Added section on table management.
6066
6067 2003-07-24 Bernhard Herzog <[email protected]>
6068
6069 * test/runtests.py (main): Recognize the long "verbose" option
6070 correctly.
6071
6072 2003-07-22 Jonathan Coles <[email protected]>
6073
6074 * Doc/manual/thuban-manual.xml: Continue to write first revision
6075 of the manual.
6076
6077 * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
6078 with Begin/EndDrawing() calls to ensure we aren't doing to
6079 many updates to the dc during rendering.
6080 (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
6081 a pen and brush argument so they need to be passed to the function.
6082
6083 * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
6084 Calculates the minimum and maximum scale values. Factored out
6085 of set_view_transform so that it could be used to zoom all the
6086 way into a single point.
6087 (ViewPort.set_view_transform): Call calc_min_max_scales().
6088 (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
6089 if only a single point is selected.
6090
6091 * Doc/manual/images/1_2_legend_close.png,
6092 Doc/manual/images/1_2_legend_dock.png,
6093 Doc/manual/images/1_2_mainwindow.png,
6094 Doc/manual/images/1_2_mainwindow.ps,
6095 Doc/manual/images/1_2_mainwindow.sk,
6096 Doc/manual/images/3_2_fullextent.png,
6097 Doc/manual/images/3_2_fulllayerextent.png,
6098 Doc/manual/images/3_2_fullshapeextent.png,
6099 Doc/manual/images/3_2_pan.png,
6100 Doc/manual/images/3_2_zoomin.png,
6101 Doc/manual/images/3_2_zoomout.png,
6102 Doc/manual/images/3_3_identify.png,
6103 Doc/manual/images/3_3_label.png,
6104 Doc/manual/images/3_5_invisible.png,
6105 Doc/manual/images/3_5_movedown.png,
6106 Doc/manual/images/3_5_moveup.png,
6107 Doc/manual/images/3_5_props.png,
6108 Doc/manual/images/3_5_tobottom.png,
6109 Doc/manual/images/3_5_totop.png,
6110 Doc/manual/images/3_5_visible.png: New. Images for the documentation.
6111
6112 2003-07-18 Bernhard Herzog <[email protected]>
6113
6114 * Thuban/UI/messages.py (MAP_REPLACED): New message.
6115
6116 * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
6117 after the new map has been assigned
6118
6119 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
6120 Delegate MAP_REPLACED to the canvas too
6121 (MainWindow.prepare_new_session): Removed. Thanks to the new
6122 MAP_REPLACED message it's no longer needed
6123 (MainWindow.OpenSession, MainWindow.NewSession):
6124 prepare_new_session has been removed.
6125
6126 * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
6127 MAP_REPLACED so that we can close the dialog if a new map is set.
6128 (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
6129 (Classifier.map_replaced): Handle MAP_REPLACED by closing the
6130 dialog
6131
6132 * test/test_viewport.py (SimpleViewPortTest)
6133 (SimpleViewPortTest.test_default_size): Add doc-strings
6134 (ViewPortTest.setUp): Bind map to self.map so we can use it in
6135 tests. Subscribe to MAP_REPLACED messages too.
6136 (ViewPortTest.tearDown): No need to explicitly unsubscribe
6137 (ViewPortTest.test_set_map): New test for the SetMap method.
6138
6139 2003-07-18 Bernhard Herzog <[email protected]>
6140
6141 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
6142 Move this test from ViewPortTest.setUp to this new separate test
6143 case. setUp is not the place for the actual tests.
6144 (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
6145 more of the test from setUp to the new test test_inital_settings.
6146 (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
6147 (ViewPortTest.test_proj_conv): Split test_proj_conv into
6148 test_win_to_proj and test_proj_to_win and make the tests easier to
6149 understand
6150 (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
6151 (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
6152 (ViewPortTest.test_unprojected_rect_around_point)
6153 (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
6154 Reformat to increase readability.
6155
6156 2003-07-18 Bernhard Herzog <[email protected]>
6157
6158 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
6159
6160 2003-07-18 Bernhard Herzog <[email protected]>
6161
6162 * test/runtests.py: The test suite can now be run without an X
6163 connection. To make sure this remains true, remove the DISPLAY
6164 environment variable so that an error occurs if the wxGTK is
6165 imported accidentally
6166
6167 2003-07-18 Bernhard Herzog <[email protected]>
6168
6169 * Thuban/UI/viewport.py: Remove unused imports
6170
6171 * Thuban/UI/view.py: Remove unused imports
6172
6173 2003-07-18 Bernhard Herzog <[email protected]>
6174
6175 * test/test_export.py Remove unused imports. The OutputTransform
6176 function is now in viewport.py and is called output_transform
6177 (TestScalebar.test_output_transform)
6178 (TestScalebar.test_OutputTransform): Renamed to
6179 test_output_transform and updated to use output_transform instead
6180 of OutputTransform
6181
6182 * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
6183 renamed.
6184 (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
6185 renamed to output_transform
6186
6187 * Thuban/UI/viewport.py (OutputTransform, output_transform):
6188 Rename to output_transform
6189
6190 2003-07-18 Bernhard Herzog <[email protected]>
6191
6192 * Thuban/Model/layer.py (Layer.__init__): Rename
6193 classificationField to classificatin_column and init it here so
6194 that it can be used in SetClassificationColumn
6195 (Layer.GetClassificationColumn, Layer.GetClassificationField):
6196 Rename to GetClassificationColumn.
6197 (Layer.SetClassificationColumn, Layer.SetClassificationField):
6198 Rename to SetClassificationColumn and issue a LAYER_CHANGED
6199 message if the column changes.
6200 (Layer._classification_changed, Layer.ClassChanged): Rename to
6201 _classification_changed. Update the callers.
6202 (Layer.SetShapeStore): Further field->column renames.
6203
6204 * Thuban/Model/load.py (SessionLoader.start_classification)
6205 (SessionLoader.start_clpoint): Updates because of
6206 field->column method name changes in the Layer class
6207
6208 * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6209 because of field->column method name changes in the Layer class
6210
6211 * Thuban/UI/classifier.py (Classifier.__init__)
6212 (Classifier._OnTry, Classifier._OnRevert): Updates because of
6213 field->column method name changes in the Layer class
6214
6215 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6216 because of field->column method name changes in the Layer class
6217
6218 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6219 of field->column method name changes in the Layer class
6220
6221 * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6222 (SaveSessionTest.testClassifiedLayer): Update because of
6223 field->column method name changes in the Layer class
6224
6225 * test/test_layer.py (SetShapeStoreTests.setUp)
6226 (SetShapeStoreTests.test_sanity): Update because of field->column
6227 method name changes in the Layer class
6228 (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6229 (TestLayerModification.test_sanity)
6230 (TestLayerModification.test_initial_settings): remove unsued code
6231 and rename to test_sanity.
6232 (TestLayerModification.test_set_classification): New test for
6233 SetClassification and SetClassificationField.
6234
6235 2003-07-18 Bernhard Herzog <[email protected]>
6236
6237 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6238 the non-fixed values as well. The old test would have accepted a
6239 fixed ramp that only returnes the fixed properties
6240
6241 2003-07-17 Jonathan Coles <[email protected]>
6242
6243 * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6244 shots for the manual. The XCF file is the source image and
6245 has additional layers to support changes.
6246
6247 * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6248
6249 * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6250 Return both the new class and the field name.
6251
6252 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6253 fit the map to the window as this changes any zoom level that
6254 the user may have set.
6255
6256 2003-07-16 Jonathan Coles <[email protected]>
6257
6258 * Thuban/Model/classgen.py (generate_singletons,
6259 generate_uniform_distribution, generate_quantiles): Remove
6260 fixes parameter, but maintain the same functionality by having
6261 the calling function pass a FixedRamp object for the ramp.
6262 (FixedRamp): New. Adapts a ramp to have fixed property values.
6263
6264 * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6265 (Classification): Inherit from Publisher.
6266 (Classification.__init__): Remove the layer parameter.
6267 Classifications no longer need to have a parent layer.
6268 (Classification.GetField, Classification.GetFieldType,
6269 Classification.SetFieldInfo): Removed. The field name is stored
6270 in the layer, and the type can be retreived by calling
6271 Layer.GetFieldType().
6272 (Classification._set_layer, Classification.GetLayer): Removed.
6273 Classifications no longer have a parent layer.
6274
6275 * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6276 classification.
6277 (Layer.SetShapeStore): Reset the classification first while
6278 we still have the old shape store to work with.
6279 (Layer.GetClassificationField, Layer.SetClassificationField):
6280 New. Method for getting/setting the field to classify on.
6281 (Layer.SetClassification): Simplified now that the layer
6282 simply has to hold a reference to the classification and not
6283 tell the classification who owns it.
6284 Fixes RTbug #2023.
6285
6286 * Thuban/Model/load.py (SessionLoader.start_classification):
6287 Set the field name on the layer, not the classification.
6288
6289 * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6290 classification is modified.
6291
6292 * Thuban/Model/save.py (SessionSaver.write_classification):
6293 Get the field name and type from the layer.
6294
6295 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6296 parameter records to rows and add docstring. Fixes RTbug #1997.
6297
6298 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6299 ramp when we need to fix certain values of a ramp rather than
6300 using the old fixes parameter. Fixes RTbug #2024.
6301
6302 * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6303 parameter.
6304 (ClassTable.Reset): Add fieldType parameter and use it, rather
6305 than asking the classification.
6306 (Classifier.__init__): Remember the original class's field
6307 and ask the layer for the field type, rather than the classification.
6308 (Classifier.__SetGridTable): Retrieve the field and field type
6309 for the table because they are not in the classification.
6310 (Classifier._OnTry, Classifier._OnRevert): Set the classification
6311 field on the layer in addition to the classification itself.
6312
6313 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6314 classification field from layer.
6315
6316 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6317 classification field from layer. Split up tests and remove
6318 *-imports. Fixes RTbug #1992.
6319
6320 * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6321
6322 * test/test_classification.py
6323 (TestClassification.test_classification): Remove tests for methods
6324 that no longer exist.
6325
6326 * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6327 __init__ no longer has a field parameter, use SetClassificationField.
6328 (SetShapeStoreTests.test_sanity): Use layer object to get class
6329 field info.
6330
6331 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6332 SetClassificationField on layer to set class field info.
6333
6334 * test/test_viewport.py: Renamed from test/test_view.py.
6335
6336 2003-07-16 Jan-Oliver Wagner <[email protected]>
6337
6338 * Doc/manual/thuban-manual.xml: Added authors and an initial
6339 coarse structure.
6340
6341 2003-07-15 Bernhard Herzog <[email protected]>
6342
6343 * test/support.py (FloatComparisonMixin): This is a mix-in class
6344 and therefore should not be derived from any other class.
6345
6346 * test/test_range.py (RangeTest): FloatComparisonMixin is a
6347 mix-in, so derive from TestCase as well.
6348
6349 2003-07-15 Bernhard Herzog <[email protected]>
6350
6351 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6352 draw_func handling a bit to remove one layer of indirection. This
6353 makes the renderer about 10% faster in the non-classifying case
6354 and the code a bit cleaner
6355 (MapRenderer.draw_point_shape): Add the pen and brush parameters
6356 and set them in the dc. Now the draw_point_shape method and
6357 wxproj's draw_polygon_shape function have basically the same
6358 signature so that both can be directly used as draw_func
6359
6360 2003-07-15 Bernhard Herzog <[email protected]>
6361
6362 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6363 string values (in addition to the labels) as UTF 8
6364
6365 * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6366 values if the field type is string
6367
6368 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6369 saving a session with non-ascii string classification values.
6370
6371 * test/test_load.py (TestClassification.file_contents)
6372 (TestClassification.test): Check for non-ascii values in string
6373 classifications
6374
6375 2003-07-14 Jonathan Coles <[email protected]>
6376
6377 * test/test_view.py: New. Tests for ViewPort.
6378
6379 2003-07-14 Frank Koormann <[email protected]>
6380
6381 * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6382 title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
6383
6384 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6385 unicode strings from session file: session title, map title and
6386 projection name.
6387
6388 2003-07-10 Jonathan Coles <[email protected]>
6389
6390 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6391 drag_stop, not drag_move when the mouse is released.
6392
6393 2003-07-10 Jonathan Coles <[email protected]>
6394
6395 The most important part of this is the seperation of view.py into
6396 two pieces. viewport.py now has a class called ViewPort which
6397 contains all the non-wx parts of view.py and can therefore be
6398 tested. view.py contains only the wx-specific parts and is fairly
6399 simple.
6400
6401 * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6402 RTTbug #1992.
6403 * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6404 RTTbug #1992.
6405
6406 * Thuban/Model/classgen.py (generate_singletons,
6407 generate_uniform_distribution, generate_quantiles):
6408 Added 'fixes' parameter so that property attributes can
6409 be held constant over the generated classification groups.
6410 (CustomRamp.GetProperties): Remove unused variables.
6411
6412 * Thuban/Model/map.py (Map.SetProjection): Send the old
6413 projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6414 event.
6415
6416 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6417 parameter which is a list of records that restricts which
6418 records are saved. Fixes RTbug #1997.
6419
6420 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6421 Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6422
6423 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6424 to allow the user to fix line color/width on generated groups.
6425 (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6426 functions to optionally fix group properties.
6427
6428 * Thuban/UI/main.py (main): Set exception hook to the
6429 ShowExceptionDialog. Fixes RTbug #1993.
6430
6431 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6432 the table window when it is selectd to be shown.
6433
6434 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6435 Export Selection button and move the export buttons underneath
6436 the table.
6437 (QueryTableFrame.UpdateStatusText): Added event argument so
6438 that it can respond to grid selection events. The status text
6439 is now updated even when the table is not associated with a
6440 layer as was previously assumed.
6441 (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6442 UpdateStatusText responds to these events.
6443 (QueryTableFrame.OnSaveAs): Renamed to doExport.
6444 (QueryTableFrame.doExport): Helper function that saves the
6445 entire table, or selected rows, to a file.
6446 (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6447 Respond to export button events and call doExport.
6448
6449 * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6450 the function doesn't return NULL without first setting a Python
6451 Error.
6452
6453 * test/runtests.py (main): Only print "Unknown option" for
6454 unsupported options.
6455
6456 * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6457 optional epsilon argument to specify floating point accuracy.
6458 (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6459 for each item test.
6460
6461 * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6462 tests for saving selected records.
6463
6464 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6465 tests for saving selected records.
6466
6467 * test/test_map.py (TestMapWithContents.test_set_projection):
6468 MAP_PROJECTION_CHANGED events send the old projection.
6469
6470 * test/test_session.py
6471 (TestSessionWithContent.test_forward_map_projection):
6472 MAP_PROJECTION_CHANGED events send the old projection.
6473
6474 * test/test_table.py (TableTest): Update tests to use non-deprecated
6475 functions.
6476
6477 2003-07-08 Bernhard Herzog <[email protected]>
6478
6479 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6480 constants in the column objects are the standard ones defined in
6481 the table module.
6482
6483 * test/test_transientdb.py
6484 (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6485 exporting transient tables as DBF works. This should catch the bug
6486 just fixed in TransientTableBase.Width.
6487
6488 2003-07-08 Bernhard Herzog <[email protected]>
6489
6490 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6491 interpolated colors correctly.
6492
6493 * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6494 New. Test case for the fix in classgen.py
6495
6496 2003-07-08 Bernhard Herzog <[email protected]>
6497
6498 * test/runtests.py (main): Make the default output less verbose
6499 and add a verbosity option (-v) to get the old output
6500
6501 2003-07-08 Bernhard Herzog <[email protected]>
6502
6503 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6504 0.9.
6505
6506 * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6507 New. Return the join type
6508
6509 * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6510 DTD
6511 (SessionSaver.write_data_containers): Save the join type for
6512 joined tables
6513
6514 * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6515 namespace
6516 (SessionLoader.start_jointable): Handle the jointype attribute
6517
6518 * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6519 as of Thuban 0.8. These are now tests to determine whether Thuban
6520 can still read files generated by Thuban 0.8
6521
6522 * test/test_load.py (LoadSessionTest.dtd)
6523 (TestSingleLayer.file_contents)
6524 (TestLayerVisibility.file_contents, TestLabels.file_contents)
6525 (TestLayerProjection.file_contents)
6526 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6527 (TestJoinedTable.file_contents)
6528 (TestLoadError.file_contents): Update for new DTD
6529 (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6530 for new join type attribute
6531
6532 * test/test_save.py (SaveSessionTest.dtd)
6533 (SaveSessionTest.testEmptySession)
6534 (SaveSessionTest.testSingleLayer)
6535 (SaveSessionTest.testLayerProjection)
6536 (SaveSessionTest.testRasterLayer)
6537 (SaveSessionTest.testClassifiedLayer)
6538 (SaveSessionTest.test_dbf_table)
6539 (SaveSessionTest.test_joined_table): Update for new DTD
6540 (SaveSessionTest.test_joined_table): Add test for new join type
6541 attribute
6542
6543 2003-07-04 Bernhard Herzog <[email protected]>
6544
6545 * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6546 function for table_to_dbf
6547 (table_to_dbf): Deal with names longer than the 10 character limit
6548
6549 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6550 doc-string
6551 (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6552 long column names
6553
6554 2003-07-03 Bernhard Herzog <[email protected]>
6555
6556 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6557
6558 2003-07-03 Bernhard Herzog <[email protected]>
6559
6560 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6561 for the Thuban manual and README with some basic information about
6562 the manual
6563
6564 2003-07-03 Bernhard Herzog <[email protected]>
6565
6566 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6567 Update doc-string
6568 (TransientJoinedTable.create): Do not modify the column objects of
6569 the input tables in place and copy all columns of the input tables
6570 into the joined table after all.
6571
6572 * test/test_transientdb.py
6573 (TestTransientTable.test_transient_joined_table_same_column_name):
6574 Update to reflect the new behavior
6575 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6576 Update to reflect the new behavior
6577 (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6578 New test case for a bug which modified the column objects in place
6579
6580 2003-07-02 Jonathan Coles <[email protected]>
6581
6582 * Thuban/Model/classgen.py (generate_singletons,
6583 generate_uniform_distribution, generate_quantiles,
6584 GenQuantiles0): Make sure maxValue isn't less than
6585 one, otherwise we could divide by zero.
6586
6587 * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6588 ClassGenTest.doClassSingleTest): Call doBoundsTest to
6589 check the end classification groups against the
6590 proper property values.
6591 (ClassGenTest.doBoundsTest): New. Checks the first and
6592 last classification groups to make sure their properties
6593 are the correct upper and lower bounds for a color ramp.
6594
6595 2003-07-02 Jonathan Coles <[email protected]>
6596
6597 * Thuban/Model/classgen.py (generate_singletons,
6598 generate_uniform_distribution, generate_quantiles,
6599 GenQuantiles0): The denominator was one to high when
6600 calculating the index for the ramp causing the index
6601 to never to reach one.
6602
6603 2003-07-02 Jonathan Coles <[email protected]>
6604
6605 Changed the singature of ClassGroupRange.__init__ and
6606 ClassGroupRange.SetRange() so that the min/max values are
6607 passed as a tuple. This makes a better calling scheme for
6608 when a Range object is passed instead.
6609
6610 * Thuban/Model/classgen.py: Fixed parameters to
6611 ClassGroupRange constructor.
6612
6613 * Thuban/Model/classification.py (ClassGroupRange.__init__):
6614 Consolidate the min/max parameters into a single _range which
6615 can either be a tuple or a Range object.
6616 (ClassGroupRange.SetRange): Consolidate the min/max parameters
6617 into a single _range which can either be a tuple or a Range object.
6618
6619 * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6620 call to ClassGroupRange constructor to use a tuple.
6621
6622 * Thuban/Model/layer.py (Layer.SetClassification): Switch
6623 the classification instance variable to the new class
6624 before calling _set_layer otherwise subscribers to a
6625 LAYER_CHANGED event will not see any difference.
6626
6627 * test/test_classification.py: Fix tests of ClassGroupRange
6628 so that they use the new signature.
6629
6630 * test/test_load.py: Fix use of ClassGroupRange so that it
6631 uses the new signature.
6632
6633 * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6634 uses the new signature.
6635
6636 * test/test_save.py: Fix use of ClassGroupRange so that it
6637 uses the new signature.
6638
6639
6640 2003-07-01 Jonathan Coles <[email protected]>
6641
6642 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6643 Import used objects/class from color.
6644 (generate_singletons): We don't
6645 need the numGroups parameter anymore because we are using
6646 the new ramps with GetProperties().
6647 (generate_uniform_distribution): Use new ramp method
6648 GetProperties().
6649 (generate_quantiles, GenQuantiles0): Use new ramp method
6650 GetProperties().
6651 (CustomRamp.SetNumGroups): Removed. The ramps now map
6652 a value from 0 to 1 to class properties so the number
6653 of groups is not needed ahead of time.
6654 (CustomRamp.next): Removed. CustomRamp does not support
6655 interation anymore.
6656 (CustomRamp.GetProperties): Returns a ClassGroupProperties
6657 object based on the index value from 0 to 1 that is
6658 passed to it.
6659 (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6660 Made into instances of Monochromatic class instread of
6661 deriving from it.
6662 (HotToCold.SetNumGroups): Removed. See CustomRamp.
6663 (HotToCold.next): Removed. See CustomRamp.
6664
6665 * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6666 (Classification.SetField, Classification.SetFieldType):
6667 Replaced with SetFieldInfo.
6668 (Classification.SetFieldInfo): New. Does a better job of
6669 what SetField and SetFieldType used to do by combining
6670 their function since they should really always be done
6671 at the same time.
6672 (Classification.SetLayer): Renamed to _set_layer.
6673 (Classification._set_layer): Should only be called from
6674 Layer's SetClassification. This does not cause a recursive
6675 call as SetLayer did because we know that Layer knows about
6676 the classification.
6677
6678 * Thuban/Model/color.py: Fixes RTbug #1971.
6679 (_Transparent): Renamed from Transparent so it doesn't
6680 conflict with the module variable.
6681 (Transparent, Black): Renamed from Color.Transparent,
6682 Color.Black so they are not class variables.
6683
6684 * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6685 (Layer.Destroy): We don't need to call SetClassification
6686 anymore to clear out the back reference in the classifcation
6687 to the layer. It's better to set it to None using _set_layer,
6688 and we won't be creating another clas object too.
6689 (Layer.SetClassification): Classification._set_layer is not
6690 recursive so remove all the locking variables. Also clean
6691 up the code so that it remains unchanged if something fails.
6692
6693 * Thuban/Model/load.py: Fixes RTbug #1971.
6694 (SessionLoader.start_classification): Call
6695 Classification.SetFieldInfo().
6696
6697 * Thuban/Model/save.py: Removed import of Color which wasn't
6698 being used.
6699
6700 * Thuban/UI/classgen.py: Fixes RTbug #1972.
6701 (ClassGenDialog.__init__): Color ramps are now instances
6702 already so we don't need to create any new objects.
6703 (ClassGenDialog.OnOK): Check for numGroups is no longer
6704 necessary because we never use it.
6705
6706 * Thuban/UI/classifier.py: Fixes RTbug #1971.
6707 (Classifier.__BuildClassification, Classifier.__SetGridTable):
6708 Call Classification.SetFieldInfo() instead of SetFieldType.
6709
6710 * Thuban/UI/renderer.py: Fixes RTbug #1971.
6711
6712 * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6713 (MapCanvas.__init__): Subscribe to the idle time event. Set
6714 background color to white.
6715 (MapCanvas.OnPaint): Set a flag indicating that we should
6716 render the map during idle time. If we already have a bitmap
6717 just draw it now.
6718 (MapCanvas.OnIdle): New. Render the map only during idle time.
6719 This also fixes a problem with the busy cursor under gtk.
6720
6721 * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6722 Fix calls to generate_singletons because the signature changed.
6723
6724 * test/test_classification.py: Fix color references and
6725 change calls to Classification.[SetField|SetFieldType] to
6726 SetFieldInfo.
6727
6728 * test/test_load.py: Fix color references.
6729
6730 * test/test_load_0_2.py: Fix color references.
6731
6732 * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6733 Change calls to Classification.[SetField|SetFieldType] to
6734 SetFieldInfo.
6735
6736 2003-07-01 Frank Koormann <[email protected]>
6737
6738 MERGE from the greater-ms3 branch.
6739
6740 * test/test_transientdb.py
6741 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6742 New. Test join of two tables with partly equal column names.
6743
6744 * Thuban/Model/transientdb.py (TransientJoinedTable.create):
6745 If duplicates in left and right tables column names are found,
6746 append '_' (underscores) to the name until it is unique.
6747 Create always new internal names for the resulting table and reference
6748 columns in the join statement with <table>.<column>
6749
6750 2003-07-01 Bernhard Herzog <[email protected]>
6751
6752 * test/test_transientdb.py
6753 (TestTransientTable.test_transient_joined_table_same_column_name):
6754 New. Test whether joining on columns with the same names in both
6755 tables works.
6756
6757 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
6758 sure to use the right internal names even when joining on field
6759 with the same names in both tables. Also, detect duplicate names
6760 in the joined table correctly.
6761
6762 2003-07-01 Frank Koormann <[email protected]>
6763
6764 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6765 Reverse List of layers to render in same order as in desktop legend.
6766
6767 2003-06-30 Jonathan Coles <[email protected]>
6768
6769 * Thuban/version.py (make_tuple): Takes a version string
6770 and splits it into a tuple of at most three integers.
6771 Used make_tuple() to make tuple versions of the version
6772 numbers.
6773
6774 * Thuban/UI/about.py: Add Thuban email addresses.
6775
6776 2003-06-30 Jonathan Coles <[email protected]>
6777
6778 * Thuban/version.py: SQLite/PySQLite version dependencies
6779 were too high.
6780
6781 2003-06-30 Jonathan Coles <[email protected]>
6782
6783 * Thuban/version.py: Update version to 0.8.1
6784
6785 * MANIFEST.in: Added Projections so that default.proj is
6786 included.
6787
6788 2003-06-26 Jonathan Coles <[email protected]>
6789
6790 New About box with lots more information including library
6791 versions and credits. More/better version checking before
6792 Thuban starts.
6793
6794 * Thuban/UI/about.py: New. New About box that displays
6795 library version information and credits.
6796
6797 * Thuban/version.py: Added new 'versions' dictionary which
6798 contains the verions of various libraries which are checked
6799 when the module loads.
6800 (verify_versions): Check all version numbers and returns
6801 a list of errors.
6802
6803 * Thuban/UI/classifier.py (Classifier.__EnableButtons):
6804 Reset the status of the buttons as the situation warrants,
6805 but in a better more reliable way by not relying on the
6806 current status to determine what needs to change.
6807
6808 * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
6809 (verify_versions): Remove most of the code since it is
6810 now in Thuban.version.verify_versions.o
6811
6812 * Thuban/UI/mainwindow.py (MainWindow.About): Call new
6813 About box in Thuban.UI.about.
6814
6815 * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
6816 Returns the version of gdal library being used as a string.
6817
6818 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
6819 Removed.
6820 (get_proj_version): Return the version of PROJ that the file
6821 was compiled with.
6822 (get_gtk_version): Return th version of GTK that the file
6823 was compiled with.
6824
6825 2003-06-25 Jonathan Coles <[email protected]>
6826
6827 * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
6828 of the SelectPropertiesDialog should be self so the window
6829 appears on top.
6830 (ClassGroupPropertiesCtrl.DoEdit): The parent
6831 of the SelectPropertiesDialog should be self so the window
6832 appears on top.
6833
6834 * Thuban/UI/resource.py: Cleaned up how we determine file
6835 extensions.
6836 (GetImageResource): Return an wxImage from our Resources.
6837
6838 2003-06-24 Jonathan Coles <[email protected]>
6839
6840 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6841 Check that a layer has a classification before trying
6842 to get it. Raster layers don't have classifications.
6843
6844 2003-06-23 Jonathan Coles <[email protected]>
6845
6846 * setup.py: Add Resources/XML to resource list.
6847
6848 2003-06-23 Jonathan Coles <[email protected]>
6849
6850 * setup.cfg: Fix copyright dates
6851
6852 2003-06-23 Jonathan Coles <[email protected]>
6853
6854 * MANIFEST.in: Update with Resources/XML
6855
6856 * setup.py: Don't include Locale resources yet as we don't
6857 have any and it causes problems building the distribution
6858 for Windows. Update version to 0.8.0.
6859
6860 * Doc/thuban.dtd: Removed since it is now in Resources/XML.
6861
6862 * Thuban/UI/mainwindow.py: Add blank line at the end because
6863 file was not being read correctly building the Windows
6864 distribution.
6865
6866 2003-06-23 Jonathan Coles <[email protected]>
6867
6868 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
6869
6870 * Thuban/version.py: Temporarily update longversion for
6871 the 0.8 release so that it doesn't have the cvs revision.
6872
6873 2003-06-23 Jonathan Coles <[email protected]>
6874
6875 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
6876 to make sure that we don't create reentrant possibilities with
6877 wxYield.
6878
6879 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
6880 directly to avoid the wxSafeYield() call which generates an
6881 OnPaint event causing infinite recursion. Don't try to catch
6882 exception anymore. This was for before there were limits on map
6883 scaling.
6884
6885 2003-06-23 Bernhard Herzog <[email protected]>
6886
6887 Bug fix for RT #1961:
6888
6889 * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
6890 Register DerivedShapestores with the session
6891
6892 * Thuban/Model/session.py (Session.Tables): Make sure each table
6893 is only listed once.
6894
6895 * test/test_load.py (TestJoinedTable.test): Add check_format call.
6896 Update file contents to match the one written out.
6897
6898 2003-06-20 Bernhard Herzog <[email protected]>
6899
6900 * test/xmlsupport.py (SaxEventLister.startElementNS)
6901 (SaxEventLister.endElementNS): Do not include the qname. Python
6902 2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
6903 is (presumably incorrectly) None, whereas it's a string with the
6904 element name in the later versions.
6905
6906 * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
6907 (TestEventList.test_even_list_namespace): Update tests to reflect
6908 the new behaviour
6909 (TestEventList.test_even_list_id_normalization): Fix doc-string
6910
6911 2003-06-20 Jonathan Coles <[email protected]>
6912
6913 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
6914 by deriving classes to determine if that layer supports shapes.
6915 (Layer): Override HasShapes and return true.
6916
6917 * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
6918 instead of a direct call to wx[Begin|End]CusyCursor().
6919 (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
6920 table data.
6921
6922 * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
6923 New. Wrappers around the wxWindows functions that allow us to
6924 make additional calls such as wxYield which gives the native
6925 system a chance to update the cursor correctly.
6926
6927 * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
6928 instead of a direct call to wx[Begin|End]CusyCursor().
6929
6930 * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
6931 instead of a direct call to wx[Begin|End]CusyCursor().
6932 (MapCanvas.find_shape_at): Check if the current search layer
6933 support shapes, otherwise go on to the next layer.
6934
6935 * test/test_layer.py: Add tests in each type of layer for
6936 HasClassification() and HasShapes()
6937
6938 2003-06-20 Jonathan Coles <[email protected]>
6939
6940 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
6941 turning on the busy cursor to allow the system to change the
6942 cursor before we begin painting. This fixes a problem that
6943 was occuring only under GTK. Fixes RTbug #1840.
6944
6945 2003-06-20 Bernhard Herzog <[email protected]>
6946
6947 * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
6948 version.
6949
6950 * Thuban/Model/save.py (sort_data_stores): New. Make topological
6951 sort of the data sources so they can be written with sources that
6952 data sources that depend on other data sources come after the
6953 sources they depend on.
6954 (SessionSaver.__init__): Add idmap instance variable to map from
6955 objects to the ids used in the file.
6956 (SessionSaver.get_id, SessionSaver.define_id)
6957 (SessionSaver.has_id): New. Methods to manage the idmap
6958 (SessionSaver.write): Use thuban-0.8.dtd
6959 (SessionSaver.write_session): Add a namespace on the session and
6960 write out the data sources before the maps.
6961 (SessionSaver.write_data_containers): New. Write the data
6962 containers.
6963 (SessionSaver.write_layer): Layer elements now refer to a
6964 shapestore and don't contain filenames anymore.
6965
6966 * Thuban/Model/load.py (LoadError): Exception class to raise when
6967 errors in the files are discovered
6968 (SessionLoader.__init__): Define dispatchers for elements with a
6969 thuban-0.8 namespace too.
6970 (SessionLoader.check_attrs): New helper method to check and
6971 convert attributes
6972 (AttrDesc): New. Helper class for SessionLoader.check_attrs
6973 (SessionLoader.start_fileshapesource)
6974 (SessionLoader.start_derivedshapesource)
6975 (SessionLoader.start_filetable, SessionLoader.start_jointable):
6976 Handlers for the new elements in the new fileformat
6977 (SessionLoader.start_layer): Handle the shapestore attribute in
6978 addition to filename.
6979 (SessionLoader.start_table, SessionLoader.end_table): Removed.
6980 They were never used in the old formats and aren't needed for the
6981 new.
6982
6983 * Thuban/Model/session.py (Session.DataContainers): New method to
6984 return all "data containers", i.e. shapestores and tables
6985
6986 * test/xmlsupport.py (SaxEventLister.__init__)
6987 (SaxEventLister.startElementNS, sax_eventlist): Add support to
6988 normalize IDs.
6989
6990 * test/test_xmlsupport.py
6991 (TestEventList.test_even_list_id_normalization): New test case for
6992 id normalization
6993
6994 * test/test_load.py (LoadSessionTest.check_format): Use ID
6995 normalization
6996 (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
6997 class atrributes used for ID normalization
6998 (TestSingleLayer, TestLayerVisibility, TestLabels.test)
6999 (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
7000 file format
7001 (TestJoinedTable): New test for loading sessions with joined
7002 tables.
7003 (TestLoadError): New. Test whether missing required attributes
7004 cause a LoadError.
7005
7006 * test/test_save.py (SaveSessionTest.thubanids)
7007 (SaveSessionTest.thubanidrefs): New class attributes for ID
7008 normalization in .thuban files.
7009 (SaveSessionTest.compare_xml): Use id-normalization.
7010 (SaveSessionTest.testEmptySession)
7011 (SaveSessionTest.testLayerProjection)
7012 (SaveSessionTest.testRasterLayer)
7013 (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
7014 (SaveSessionTest.testLayerProjection): The filename used was the
7015 same as for testSingleLayer. Use a different one.
7016 (SaveSessionTest.test_dbf_table)
7017 (SaveSessionTest.test_joined_table): New test cases for saving the
7018 new data sources structures.
7019 (TestStoreSort, MockDataStore): Classes to test the sorting of the
7020 data stores for writing.
7021
7022 * test/runtests.py: Add CVS keywords
7023
7024 2003-06-20 Jonathan Coles <[email protected]>
7025
7026 * test/test_session.py
7027 (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
7028 Use the cultural_landmark-point.dbf file for the store so that
7029 the table rows and shape count match.
7030
7031 2003-06-20 Jonathan Coles <[email protected]>
7032
7033 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
7034 an exception if the number of shapes is different from the
7035 number of rows in the table. Address RTbug #1933.
7036
7037 * test/test_layer.py (TestLayer.test_derived_store): Add
7038 a test for the new exception in DerivedShapeStore.__init__.
7039
7040 * test/support.py (FloatTestCase): Removed since there is
7041 already FloatComparisonMixin. Fixes RTbug #1954.
7042 (FloatComparisonMixin.assertFloatEqual): Include test for
7043 infinity that was part of FloatTestCase.
7044
7045 * test/test_range.py (RangeTest): Inherit from
7046 support.FloatComparisonMixin now that we don't have
7047 support.FloatTestCase.
7048
7049 2003-06-20 Bernhard Herzog <[email protected]>
7050
7051 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
7052 the implementation in xmlsupport instead.
7053 (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
7054
7055 * test/test_proj.py: Import sax_eventlist from xmlsupport instead
7056 of test_save
7057
7058 2003-06-20 Bernhard Herzog <[email protected]>
7059
7060 * test/test_load.py (LoadSessionTest.check_format): New helper
7061 method to make sure the test files we load might have been written
7062 by the current thuban version.
7063 (ClassificationTest.TestLayers, TestSingleLayer.test)
7064 (TestLayerVisibility.test, TestClassification.test)
7065 (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
7066 Add check_format() calls and fix the thuban data to match the data
7067 that would be written by saving the session loaded from it.
7068
7069 * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
7070 the same class and function in test_save.
7071
7072 * test/test_xmlsupport.py (TestEventList): New. test cases for
7073 sax_eventlist
7074
7075 2003-06-20 Bernhard Herzog <[email protected]>
7076
7077 * Resources/XML/thuban.dtd: Add comment about which versions of
7078 Thuban are covered by this DTD
7079 (map): Fix content model for layers and raster layers. There can
7080 be any number or layers and raster layers in any order.
7081
7082 2003-06-20 Jonathan Coles <[email protected]>
7083
7084 This is mainly about fixing RTbug #1949.
7085
7086 * Thuban/Model/classification.py: Remove "from __future__"
7087 import statement since python 2.2 is the earliest supported
7088 version.
7089
7090 * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
7091 Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
7092 depending on the units this projection *forwards* into.
7093
7094 * Thuban/Model/save.py (SessionSaver.write_classification):
7095 Remove unnecessary use of lambdas and nested functions.
7096
7097 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
7098 adjustment here if the map projection uses degrees.
7099
7100 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
7101 scale adjust code since it is now done before calling
7102 this method. Don't do anything if the map projection
7103 is None.
7104
7105 2003-06-19 Bernhard Herzog <[email protected]>
7106
7107 Move version specific load tests to their own file.
7108
7109 * test/test_load.py: Expand the doc-string to explain a bit how to
7110 handle file format changes.
7111 (TestClassification.test): Update the docstring as this test is
7112 not about Thuban 0.2 anymore.
7113
7114 * test/test_load_0_2.py: New file with the load tests for thuban
7115 files created with Thuban 0.2 and earlier.
7116
7117 2003-06-19 Bernhard Herzog <[email protected]>
7118
7119 Add XML validation to some of the tests. Validation will only be
7120 done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
7121 To make the DTD available to the test cases it's moved into
7122 Resources/XML
7123
7124 * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
7125 for versions up to and including 0.2. Two slight changes: added an
7126 encoding specification and fixed the comment which refered to
7127 GRASS, not Thuban
7128
7129 * test/xmlsupport.py: New support module for tests involving XML.
7130 Currently there's a mix-in class for XML validation.
7131
7132 * test/test_xmlsupport.py: New. Tests for the xmlsupport module
7133
7134 * test/test_save.py (SaveSessionTest): Derive from ValidationTest
7135 so that we can validate the
7136 (SaveSessionTest.testEmptySession)
7137 (SaveSessionTest.testSingleLayer)
7138 (SaveSessionTest.testSingleLayer)
7139 (SaveSessionTest.testLayerProjection)
7140 (SaveSessionTest.testRasterLayer)
7141 (SaveSessionTest.testClassifiedLayer): Validate the generated XML
7142
7143 * test/runtests.py (main): Call print_additional_summary instead
7144 of print_garbage_information
7145
7146 * test/support.py (resource_dir): New function to return the
7147 "Resource" subdirectory
7148 (print_additional_summary): New function to combine several
7149 summary functions
7150 (run_tests): Use print_additional_summary instead of calling
7151 print_garbage_information directly
7152
7153 2003-06-19 Bernhard Herzog <[email protected]>
7154
7155 * Doc/thuban.dtd (classification): Correct the content model of
7156 the classification element.
7157 (projection): Add the "name" attribute
7158
7159 2003-06-19 Frank Koormann <[email protected]>
7160
7161 MERGE from the greater-ms3 branch.
7162
7163 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
7164 scale if projection is latlong to get better estimate.
7165
7166 Fix problem of hidden properties dialog under windows after double
7167 click on layer tree:
7168 The tree control always gets an Expanded / Collapsed event after
7169 the ItemActivated on double click, which raises the main window again.
7170 We add a second ItemActivated event to the queue, which simply
7171 raises the already displayed window.
7172
7173 * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
7174 raiseProperties initialized to prevent endless loops
7175 (LegendTree._OnItemActivated): Depending on self.raiseProperties
7176 simply raise the properties or open the dialog and issue a second
7177 event.
7178
7179 2003-06-18 Jonathan Coles <[email protected]>
7180
7181 * setup.py: Fix a few problems that occured under Windows.
7182
7183 2003-06-18 Jonathan Coles <[email protected]>
7184
7185 When Thuban loaded the map was redrawn twice because the
7186 legend was being opened after the mainwindow was created
7187 and not during its creation. This meant the map was drawn
7188 initially and then had to be redrawn when the legend
7189 caused the display to change. Now the legend is opened
7190 in the mainwindow constructor which resolves this issue.
7191
7192 Also, although we were checking for the existence of
7193 gdal and gdalwarp modules, the gdalwarp extension was
7194 still being compiled (which may fail if the system doesn't
7195 have gdal installed). the build_ext command to setup.py
7196 now accepts the flags --with-gdal and --without-gdal.
7197 If --without-gdal is specified setup.py will try to
7198 use the gdal parameters specified by gdal-config. Under
7199 windows, those parameters have to be set in setup.py
7200 as with proj4 an wxWindows.
7201
7202 * setup.py: Use a list instead of seperate variables for
7203 extension parameters so we can create a generic function
7204 that runs an appropriate *-config script.
7205 (run_cs_script): Renamed from run_wx_script and modified
7206 to accept a second argument which is a list of lists to
7207 be filled in by the values returned from running the command.
7208 (thuban_build_ext): New. Extends the build_ext command and
7209 provides the options --with-gdal/--without-gdal which then
7210 optionally includes the gdalwarp extension.
7211
7212 * Thuban/Model/resource.py: First check if we can import
7213 the gdalwarp Thuban extension before checking for gdal.
7214 Also added some comments.
7215
7216 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7217 the map is None which may be the case if none has been loaded
7218 yet.
7219
7220 * Thuban/UI/main.py (main): Remove call to ShowLegend.
7221
7222 * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7223
7224 * Thuban/UI/renderer.py: Check for gdal support before importing
7225 gdalwarp.
7226 (MapRenderer.render_map): Only try to optimize if we have gdal
7227 support otherwise nothing will get drawn.
7228
7229 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7230 during startup before a map has been created. Check if map is None
7231 before using it and do nothing if it is.
7232
7233 2003-06-17 Jonathan Coles <[email protected]>
7234
7235 Fix the problem with raster layers under Windows that caused
7236 Thuban to crash. The view should respond to layer projection
7237 changed events to update the display. Changes to a projection
7238 should not cause the map to be set to full extent.
7239
7240 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7241 current_map_proj to remember the current map projection so that
7242 when the projection changes we know what the previous projection
7243 was.
7244 (MapCanvas.SetMap): Unsubscribe and subscribe to
7245 LAYER_PROJECTION_CHANGED events.
7246 (MapCanvas.projection_changed): Split into two methods that respond
7247 to map and layer projection changes.
7248 (MapCanvas.map_projection_changed): New. Takes the current view and
7249 projects it using the new projection. This does not cause the
7250 map to be redrawn at full extent.
7251 (MapCanvas.layer_projection_changed): New. Cause a redraw which
7252 will draw each layer in its new projection.
7253
7254 * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7255 VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7256 under Windows.
7257
7258 * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7259 to twice sizeof(void*) because there are two digits for each
7260 hex byte.
7261
7262 2003-06-16 Bernhard Herzog <[email protected]>
7263
7264 Update to the layer interface: Direct access to the table,
7265 shapetable, shapefile and filename attributes is now actively
7266 deprecated by issuing deprecation warnings for all places where
7267 this happens.
7268
7269 * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7270 to the instance variables table, shapetable, shapefile and
7271 filename via __getattr__ so that we can issue a deprecation
7272 warning.
7273 (Layer.SetShapeStore): Don't set the deprecated instance variables
7274 any more
7275 (Layer.SetShapeStore): Don't use deprecated layer instance
7276 variables
7277 (Layer.Destroy): No need to explicitly remove the instance
7278 variables any more
7279 (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7280 instance variables
7281
7282 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7283 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7284 (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7285 use deprecated layer instance variables
7286
7287 * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7288 deprecated layer instance variables
7289
7290 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7291 (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7292 instance variables
7293
7294 * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7295 deprecated layer instance variables
7296
7297 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7298 deprecated layer instance variables
7299
7300 * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7301 deprecated layer instance variables
7302
7303 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7304 (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7305 variables
7306
7307 * test/runtests.py (main): Turn Thuban's deprecation warnings into
7308 errors so that they're cought by the tests
7309
7310 * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7311 layer instance variables
7312
7313 2003-06-16 Jonathan Coles <[email protected]>
7314
7315 Fix a problem under Windows whereby if the user double-clicks on a
7316 layer in the legend that tree item will expand or collapse as well
7317 as open the layer properties dialog. The state of the tree item
7318 should not be affected.
7319
7320 * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7321 preventExpandCollapse and subscribe to expanding and collapsing
7322 events.
7323 (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7324 collapsing events and will veto the event if it has been triggered
7325 by the user double clicking on a layer.
7326 (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7327 that an expanding/collapsing event should be vetoed.
7328
7329 2003-06-13 Bernhard Herzog <[email protected]>
7330
7331 * Thuban/UI/classifier.py (Classifier.OnClose)
7332 (Classifier.map_layers_removed)
7333 (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7334 in OnClose and not in map_layers_removed or
7335 layer_shapestore_replaced to make sure it always happens when the
7336 dialog is closed
7337
7338 2003-06-13 Jonathan Coles <[email protected]>
7339
7340 This puts back a fix for Windows where a panel is needed so that
7341 the background of the table view appears correctly.
7342
7343 * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7344 object that can be used by derived classes to place any
7345 controls (including the grid) onto.
7346 (QueryTableFrame.__init__): Use the panel as the parent window
7347 for all the controls. Reparent the grid so that the panel is
7348 the parent. Call UpdateStatusText() to correctly initialize
7349 the status bar.
7350
7351 2003-06-13 Jonathan Coles <[email protected]>
7352
7353 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7354 from wxFrame (as opposed to wxDialog like the other classes)
7355 but otherwise behaves like the other classes. This is needed
7356 for the TableView which isn't really a dialog and needs to
7357 have a status bar and control buttons.
7358
7359 * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7360 instance variable to keep track of how many rows are selected.
7361 Subscribe once to the the events we are interested in.
7362 (ThubanGrid.OnRangeSelect): Only handle event if event handling
7363 hasn't been turned off.
7364 (ThubanGrid.OnSelectCell): Only handle event if event handling
7365 hasn't been turned off.
7366 (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7367 as an event listener (which changes the event handler stack)
7368 simply set an instance variable to False. This is checked in
7369 the event handlers.
7370 (ThubanGrid.GetNumberSelected): Return the number of currently
7371 selected rows.
7372 (TableFrame): Inherit from ThubanFrame so we can have a
7373 status bar and control buttons.
7374 (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7375 Explicitly set which items are selected in the operator choice and
7376 action choice so there is always a valid selection. Fixes RTbug #1941.
7377 Subscribe to grid cell selection events so we can update the
7378 status bar.
7379 (QueryTableFrame.UpdateStatusText): Update the status bar with
7380 how many rows are in the grid, how many columns, and how many
7381 rows are selected.
7382 (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7383 Call UpdateStatusText when cells are (de)selected.
7384 (QueryTableFrame.OnQuery): Use the string value in the value
7385 combo if either the selected item index is 0 or if the string
7386 cannot be found in the predefined list (this happens if the
7387 user changes the text). Fixes RTbug #1940.
7388 Only turn off the grid event listeners if there a query comes
7389 back with a none empty list of ids. in the case that the list
7390 is empty this causes a grid.ClearSelection() call to actually
7391 clear the grid selection which causes the selected items in
7392 the map to be deselected. Fixes RTbug #1939.
7393
7394 * test/test_save.py (XMLWriterTest.Encode): Check return values.
7395 Fixes RTbug #1851.
7396
7397 2003-06-13 Bernhard Herzog <[email protected]>
7398
7399 * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7400 self.selected_shape with the current selection to make sure the
7401 contents of the dialog are up to date when it's shown for the
7402 first time.
7403 The dialog used to work without this by luck. The recent fix to
7404 the connector module 'broke' a 'feature' the identify view was
7405 relying on, i.e that subscribing to a message in response to
7406 receiving a message of that type would mean that the new
7407 subscriber would also be called for the same message.
7408
7409 2003-06-12 Jonathan Coles <[email protected]>
7410
7411 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7412 the image is rendered. Fixes RTbug #1937.
7413
7414 2003-06-12 Jonathan Coles <[email protected]>
7415
7416 * Thuban/Lib/fileutil.py: As is done under Windows, create the
7417 user directory if it doesn't exist on a posix system.
7418 Fixes RTbug #1815.
7419
7420 * Thuban/Model/resource.py (get_user_proj_files): Moved the
7421 called to get_application_dir here, so that the directory
7422 will only be called if this method is invoked.
7423
7424 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7425 the projfilepath if no projection is selected.
7426
7427 2003-06-12 Jonathan Coles <[email protected]>
7428
7429 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7430 the scalebar if the current map has no projection set.
7431
7432 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7433 projfilepath label to just the basename of the projection file
7434 rather than include the entire path.
7435
7436 * Thuban/Model/resource.py: Fix missed proj functions that
7437 needed to be renamed.
7438
7439 2003-06-12 Jonathan Coles <[email protected]>
7440
7441 * Thuban/Model/classification.py: Removed assert statements that
7442 tested if the variable was an instance of Color.
7443
7444 * Thuban/Model/color.py (Color): Remove commented code that isn't
7445 used.
7446 (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7447 Fixes RTbug #1835.
7448 (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7449 Needed now that the class doesn't inherit from Color.
7450
7451 2003-06-12 Jonathan Coles <[email protected]>
7452
7453 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7454 check unicode strings.
7455
7456 * test/test_layer.py: Check for existence of gdal.
7457
7458 2003-06-12 Jonathan Coles <[email protected]>
7459
7460 * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7461 that was in load.py
7462
7463 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7464 that was in save.py
7465
7466 2003-06-12 Jonathan Coles <[email protected]>
7467
7468 This is largely a collection of bug fixes. We also handle the
7469 case where gdal is not on the system. The XMLReader and XMLWriter
7470 classes were moved into there own files to resolve some circular
7471 import references and because they shouldn't really be in the
7472 file that is dediciated to reading/writing session files since
7473 they are also used elsewhere.
7474
7475 * Thuban/Model/classgen.py: Renamed functions to follow the
7476 function_names_with_underscores style. Fixes RTbug #1903.
7477 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7478
7479 * Thuban/Model/layer.py: Import gdal only if it available.
7480 (RasterLayer): Handle the case where the gdal library is unavailable.
7481 Addresses RTbug #1877.
7482
7483 * Thuban/Model/load.py (XMLReader): Moved into seperate file
7484 xmlreader.py.
7485
7486 2003-06-12 Jonathan Coles <[email protected]>
7487
7488 This is largely a collection of bug fixes. We also handle the
7489 case where gdal is not on the system. The XMLReader and XMLWriter
7490 classes were moved into there own files to resolve some circular
7491 import references and because they shouldn't really be in the
7492 file that is dediciated to reading/writing session files since
7493 they are also used elsewhere.
7494
7495 * Thuban/Model/classgen.py: Renamed functions to follow the
7496 function_names_with_underscores style. Fixes RTbug #1903.
7497 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7498
7499 * Thuban/Model/layer.py: Import gdal only if it available.
7500 (RasterLayer): Handle the case where the gdal library is unavailable.
7501 Addresses RTbug #1877.
7502
7503 * Thuban/Model/load.py (XMLReader): Moved into seperate file
7504 xmlreader.py.
7505
7506 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7507 file xmlwriter.py.
7508
7509 * Thuban/Model/resource.py: Renamed functions to following the
7510 function_names_with_underscores style.
7511 (has_gdal_support): New function that returns true if the gdal
7512 library is available. Addresses RTbug #1877.
7513
7514 * Thuban/UI/application.py (ThubanApplication.OpenSession):
7515 Display a message box if the gdal library is not available, but
7516 only if there are any layers that would use it. Addresses RTbug #1877.
7517
7518 * Thuban/UI/classgen.py: Use renamed projection resource functions.
7519 (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7520 when using integers versus floats.
7521
7522 * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7523 determine if the "Add Image Layer" menu option should be
7524 greyed out or not. Addresses RTbug #1877.
7525
7526 * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7527
7528 * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7529 optimize if a raster layer is visible. Fixes RTbug #1931.
7530 Only draw the raster layer if the gdal library is available.
7531 Addresses RTbug #1877.
7532
7533 * test/test_classgen.py: Add tests for generate_singletons,
7534 generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7535 (test_calculate_quantiles): Fix some tests to catch the new
7536 ValueError that is raised.
7537
7538 * test/test_proj.py: Use renamed projection resource functions.
7539
7540 * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7541 test for saving classified layers. Fixes RTbug #1902.
7542 (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7543
7544 2003-06-12 Jan-Oliver Wagner <[email protected]>
7545
7546 Fix for http://intevation.de/rt/webrt?serial_num=1900.
7547
7548 * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7549
7550 * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7551 multiplechoicedialog.py rather than from the wxPython library.
7552
7553 2003-06-11 Frank Koormann <[email protected]>
7554
7555 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7556 update.
7557
7558 2003-06-11 Frank Koormann <[email protected]>
7559
7560 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7561 determine the absolute .thuban/thuban directory under
7562 "posix" (os.expanduser) and "nt" (read AppData registry key).
7563
7564 * Thuban/Model/resource.py: Use get_application_dir
7565
7566 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7567 Use get_application_dir.
7568
7569 2003-06-10 Bernhard Herzog <[email protected]>
7570
7571 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7572 the messages MAP_LAYERS_REMOVED messages
7573 (LayerTableFrame.OnClose): Unsubscribe from it.
7574 (LayerTableFrame.map_layers_removed): New. Receiver for
7575 MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7576 dialog is showing is removed.
7577
7578 2003-06-10 Bernhard Herzog <[email protected]>
7579
7580 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7581 of the receivers list so that unsubscribing in a receiver doesn't
7582 modify it while iterating over it.
7583
7584 * test/test_connector.py
7585 (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7586 unsubscribing in a receiver works correctly. See docstring for
7587 details
7588
7589 2003-06-10 Bernhard Herzog <[email protected]>
7590
7591 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7592 message.
7593
7594 * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7595 LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7596 LAYER_CHANGED will still be sent if the classification changes.
7597
7598 * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7599 parameter so we can subscribe to some of its messages
7600 (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7601 and the layer's LAYER_SHAPESTORE_REPLACED
7602 (Classifier.unsubscribe_messages): New. Unsubscribe from message
7603 subscribed to in __init__
7604 (Classifier.map_layers_removed)
7605 (Classifier.layer_shapestore_replaced): receivers for the messages
7606 subscribed to in __init__. Unsubscribe and close the dialog
7607
7608 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7609 the map to the Classifier dialog
7610
7611 * test/test_layer.py (SetShapeStoreTests): Derive from
7612 SubscriberMixin as well so we can test messages
7613 (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7614 messages
7615 (SetShapeStoreTests.tearDown): Clear the messages again
7616 (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7617 for the modified flag too
7618 (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7619 to check whether SetShapeStore sets the modified flag
7620 (SetShapeStoreTests.test_set_shape_store_different_field_name)
7621 (SetShapeStoreTests.test_set_shape_store_same_field)
7622 (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7623 Add tests for the messages. This checks both the new
7624 LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7625
7626 2003-06-06 Jan-Oliver Wagner <[email protected]>
7627
7628 * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7629 the menu items.
7630
7631 2003-06-05 Frank Koormann <[email protected]>
7632
7633 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7634 Layout reimplemented without panel. Make life easier to fit the list
7635 in the dialog.
7636
7637 2003-06-05 Frank Koormann <[email protected]>
7638
7639 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7640 once on initialisation (Former implementation resulted in multiple
7641 entries for each projection).
7642 (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7643 if set, select the projection found under the specified name. This
7644 overwrites any other selection estimate.
7645 Removed projchoice filling from this method.
7646 (ProjFrame._OnSave, ProjFrame._OnAddToList):
7647 Updated call of ProjFrame.__FillAvailList
7648 (LCCPanel._DoLayout): Moved parameter controls in more common order.
7649
7650 * Resources/Projections/defaults.proj: Extended defaults representing
7651 various common European projections.
7652
7653 2003-06-05 Frank Koormann <[email protected]>
7654
7655 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7656 Use ListCtrl instead of GridCtrl
7657
7658 * Thuban/Model/resource.py:
7659 Guess location of .thuban directory from tempdir parent directory.
7660
7661 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7662 Guess location of .thuban directory from tempdir parent directory.
7663
7664 2003-06-04 Bernhard Herzog <[email protected]>
7665
7666 Do not cache the values returned by the tree widget's
7667 GetFirstChild and GetNextChild methods because it led to lots of
7668 segfaults. The new way requires more brute force but is more
7669 reliable.
7670
7671 * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7672 variable layer2id
7673 (LegendTree.find_layer): New method to do with brute force what
7674 layer2id tried to accomplish
7675 (LegendTree._OnMsgLayerChanged)
7676 (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7677 Use find_layer instead of layer2id
7678 (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7679 update layer2id anymore
7680 (LegendTree._OnMsgMapLayersRemoved)
7681 (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7682
7683 2003-06-03 Thomas Koester <[email protected]>
7684
7685 * Thuban/Model/classgen.py (GenQuantiles0): New function.
7686
7687 2003-06-02 Bernhard Herzog <[email protected]>
7688
7689 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7690 New commands.
7691 (main_menu): Add the new commands.
7692 (MainWindow.TableRename): New. Implementation of the table_rename
7693 command.
7694 (MainWindow.RenameLayer): New. Implementation of the layer_rename
7695 command.
7696
7697 * Thuban/Model/session.py (Session.AddTable): call self.changed to
7698 set the modified flag
7699
7700 * test/test_session.py (TestSessionSimple.test_add_table): Test
7701 whether the modified flag is set properly
7702
7703 * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7704 instead of issue so that the modified flags get updated.
7705
7706 * test/test_base.py (SomeTitledObject): Derive from Modifiable
7707 instead of Publisher to reflect reality better and to accomodate
7708 the fact that SetTitle now calls changed instead of issue
7709
7710 2003-06-02 Bernhard Herzog <[email protected]>
7711
7712 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7713 acquisition has to happen before the try in a try-finally.
7714
7715 2003-06-02 Bernhard Herzog <[email protected]>
7716
7717 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7718 possible that a layer is removed that is not currently selected in
7719 the legend so don't check for this.
7720
7721 2003-05-30 Bernhard Herzog <[email protected]>
7722
7723 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7724 variables to None that have direct or indirect references to
7725 shapefiles or dbf files to make sure that they do go away and the
7726 files are closed.
7727
7728 2003-05-30 Bernhard Herzog <[email protected]>
7729
7730 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7731 availImgListIndices when a new image list is created
7732
7733 2003-05-30 Bernhard Herzog <[email protected]>
7734
7735 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7736 changing_selection to indicate whether the LegendTree code itself
7737 is currently changing the selection
7738 (LegendTree.normalize_selection): New method to normalize the
7739 selection by selecting the layer item even if the user clicked on
7740 the classification.
7741 (LegendTree._OnSelChanged): normalize the selection. This works
7742 around a bug in wx which doesn't keep track of the selection
7743 properly when subtrees are deleted.
7744
7745 2003-05-30 Bernhard Herzog <[email protected]>
7746
7747 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
7748 maximum and minimum scale factors.
7749
7750 * test/test_classgen.py (ClassGenTest.test): Update to reflect the
7751 changes in classgen.py
7752
7753 2003-05-30 Jonathan Coles <[email protected]>
7754
7755 * Thuban/Model/classgen.py: Remove ClassGenerator class but make
7756 all the methods functions. Fixes RTBug #1903.
7757
7758 * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
7759 to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
7760 RTBug #1907.
7761
7762 * Thuban/UI/classgen.py: Use classgen functions that were part
7763 of the ClassGenerator class. Put try/finally blocks around
7764 code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
7765 RTBug #1904.
7766
7767 * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
7768
7769 * Thuban/UI/legend.py: The legend was cleared and repopulated any
7770 time something changed which caused some state to be lost such
7771 as which children were expanded or collapsed. Fixes RTBug #1901.
7772 (LegendTree._OnMsgMapLayersAdded): Add only new layers.
7773 (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
7774 the legend but not in the map.
7775 (LegendTree.__FillTree): Move main functionality out into smaller
7776 methods that can be used by other methods.
7777 (LegendTree.__FillTreeLayer): Reuse old slots in the image list
7778 if they are available.
7779 (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
7780 that we override the wxTreeCtrl method. Iterate over children
7781 and call __RemoveLayer.
7782 (LegendTree.__AddLayer): New. Add a new layer to the legend.
7783 (LegendTree.__RemoveLayer): Remove a layer from the legend.
7784 (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
7785 Should only be called with the id of a layer branch.
7786 (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
7787 Returns the root item or creates one if necessary.
7788
7789 * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
7790 ProjectRasterFile with tuple arguments instead of strings.
7791
7792 * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
7793 with try/finally. Fixes RTBug #1904.
7794
7795 * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
7796 with try/finally. Fixes RTBug #1904.
7797 (MapCanvas.FitSelectedToWindow): If a single point is selected
7798 simply center it on the display. Fixes RTBug #1849.
7799
7800 * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
7801 to be compiled as a standalone app. Now the code can only be
7802 called from Python which simplifies the parameter passing.
7803 (ProjectRasterFile): Handle Python arguments. Remove code that
7804 checks for a destination dataset. Add more clean up code.
7805
7806 * test/test_map.py (TestMapWithContents.test_raise_layer_top,
7807 TestMapWithContents.test_lower_layer_bottom):
7808 Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
7809 Fixes RTBug #1907.
7810
7811 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
7812 extent to the map when the legend is toggled. Fixes RTBug #1881.
7813
7814 2003-05-29 Jan-Oliver Wagner <[email protected]>
7815
7816 * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
7817 unsubscribes all that is subcribed in __init__.
7818
7819 2003-05-28 Bernhard Herzog <[email protected]>
7820
7821 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
7822 (MainWindow.CanDuplicateLayer): New methods to implement the
7823 Layer/Duplicate command.
7824 (layer_duplicate command): New.
7825 (main_menu): Add layer_duplicate to the Layer menu.
7826
7827 2003-05-28 Bernhard Herzog <[email protected]>
7828
7829 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
7830 renderer so that NULL/None values get displayed differently (by a
7831 gray rectangle).
7832 (TableGrid.__init__): Override the default renderers
7833
7834 2003-05-28 Bernhard Herzog <[email protected]>
7835
7836 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
7837 classification to "None" if the type of the field has changed.
7838
7839 * test/test_layer.py (SetShapeStoreTests): New. Class with a few
7840 test for the Layer.SetShapeStore method
7841
7842 2003-05-28 Jan-Oliver Wagner <[email protected]>
7843
7844 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
7845 does not necessarily have a filename).
7846
7847 2003-05-28 Jan-Oliver Wagner <[email protected]>
7848
7849 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
7850 sort the selection list for the dialog.
7851
7852 2003-05-28 Frank Koormann <[email protected]>
7853
7854 * extensions/thuban/wxproj.cpp
7855 (project_point): Removed cast to int for projected point coordinates.
7856 (shape_centroid): Return last point if all polygon vertices fall
7857 to one point.
7858
7859 2003-05-28 Bernhard Herzog <[email protected]>
7860
7861 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
7862 with layers that don't have shapestores, i.e. raster layers.
7863
7864 2003-05-28 Bernhard Herzog <[email protected]>
7865
7866 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
7867 when determining the title from the filename.
7868
7869 * test/test_dbf_table.py (TestDBFTable.test_title): Update to
7870 reflect changes in the way the title is derived from the filename
7871
7872 2003-05-28 Frank Koormann <[email protected]>
7873
7874 * Thuban/UI/mainwindow.py (MainWindow.TableShow):
7875 Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
7876
7877 2003-05-27 Bernhard Herzog <[email protected]>
7878
7879 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
7880 delegate SelectedLayer.
7881 (MainWindow.LayerUnjoinTable): Implement.
7882 (_can_unjoin): New. Helper function for the sensitivity of the
7883 layer/unjoin command.
7884
7885 * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
7886 (DerivedShapeStore.OrigShapeStore): New. Return the original
7887 shapestore. Used to figure out how to unjoin.
7888 (DerivedShapeStore.Shapefile): Fix a typo.
7889
7890 2003-05-27 Bernhard Herzog <[email protected]>
7891
7892 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
7893 well
7894 (JoinDialog.__init__): Use the layer parameter and only build the
7895 left choice when a layer is given
7896 (JoinDialog.OnJoin): Handle layer joins as well
7897 (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
7898 that the user selects the "Select..." item. The sensitivitly
7899 updating is now in update_sensitivity
7900 (JoinDialog.y): New method to refactor the sensitivity update of
7901 the join button into its own method.
7902
7903 * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
7904
7905 2003-05-27 Bernhard Herzog <[email protected]>
7906
7907 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
7908 iff there are unreferenced tables in the session
7909
7910 2003-05-27 Bernhard Herzog <[email protected]>
7911
7912 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
7913
7914 * Thuban/Model/session.py (Session.UnreferencedTables): New method
7915 to return tables that are not referenced by other tables or shape
7916 stores and can be removed.
7917 (Session.RemoveTable): Issue a TABLE_REMOVED message after
7918 removing the table
7919
7920 * Thuban/UI/mainwindow.py: Remove unused imports
7921 (MainWindow.TableClose): Implement.
7922
7923 * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
7924 messages so that the frame will be automatically closed when a new
7925 session is opened or the table is removed.
7926 (TableFrame.OnClose): Unsubscribe the Subscriptions made in
7927 __init__
7928 (TableFrame.close_on_session_replaced)
7929 (TableFrame.close_on_table_removed): New. Subscribers that close
7930 the window
7931
7932 * test/test_session.py (TestSessionMessages.test_remove_table)
7933 (TestSessionSimple.test_remove_table): Move the test to
7934 TestSessionSimple and add test for the TABLE_REMOVED message
7935 (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
7936 (TestSessionSimple.test_unreferenced_tables) New. Test for the
7937 UnreferencedTables method.
7938 (UnreferencedTablesTests): New. Class with some more sophisticated
7939 tests for UnreferencedTables.
7940
7941 2003-05-27 Frank Koormann <[email protected]>
7942
7943 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
7944 display has some unwanted side effects. Removed again.
7945
7946 2003-05-27 Frank Koormann <[email protected]>
7947
7948 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
7949
7950 * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
7951
7952 2003-05-27 Jan-Oliver Wagner <[email protected]>
7953
7954 * test/test_menu.py (MenuTest.test): Added test for
7955 Menu.RemoveItem().
7956
7957 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
7958 the menu.
7959
7960 2003-05-27 Frank Koormann <[email protected]>
7961
7962 Nonmodal dialogs without parent (i.e. they can fall behind the main
7963 window)
7964
7965 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
7966 all dialogs in the dialogs dictionary and the canvas.
7967
7968 * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
7969 parent, i.e. can fall behind other windows.
7970 (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
7971 dictionary before removing it.
7972
7973 * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
7974
7975 * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
7976 * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
7977 * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
7978
7979 2003-05-27 Bernhard Herzog <[email protected]>
7980
7981 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
7982 tableview dialog
7983 (MainWindow.TableShow): Use ShowTableView to open the dialogs.
7984 Also, don't use the table's titles as the dialog names. The titles
7985 aren't guaranteed to be unique.
7986 (MainWindow.TableOpen): Open a table view dialog after opening the
7987 table
7988
7989 2003-05-27 Bernhard Herzog <[email protected]>
7990
7991 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
7992 effect can be achieved by simply closing the window showing the
7993 table.
7994 (MainWindow.TableHide): Removed.
7995 (main_menu): Removed "table_hide"
7996
7997 2003-05-27 Frank Koormann <[email protected]>
7998
7999 Fix legend tree display problems under Win32
8000
8001 * Thuban/UI/legend.py: BMP_SIZE_W = 15
8002 (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
8003 (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
8004
8005 * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
8006
8007 2003-05-27 Jan-Oliver Wagner <[email protected]>
8008
8009 * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
8010 'after' now allows to insert separators almost anywhere in the menu.
8011
8012 2003-05-27 Frank Koormann <[email protected]>
8013
8014 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
8015 "S" of selection box label to hint on hot key (Alt-S). Works under
8016 Win32 but is ignored under GTK.
8017
8018 2003-05-26 Frank Koormann <[email protected]>
8019
8020 * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
8021 Center Choices.
8022
8023 2003-05-26 Bernhard Herzog <[email protected]>
8024
8025 Remove the Precision methods again. They're too DBF specific to be
8026 part of the table interface and they're only used in table_to_dbf
8027 anyway.
8028
8029 * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
8030 fixed precision of 12 for doubles.
8031 (TransientTableBase.Precision): Removed
8032 (AutoTransientTable.Width): Delegate to self.table.
8033
8034 * Thuban/Model/table.py (DBFTable.Precision)
8035 (MemoryTable.Precision): Removed.
8036 (MemoryTable.Width): Use a fixed precision of 12 for doubles.
8037 (table_to_dbf): Use a fixed precision of 12 for floats unless the
8038 column object specifies something else.
8039
8040 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
8041 test for table_to_dbf
8042
8043 2003-05-26 Bernhard Herzog <[email protected]>
8044
8045 * test/test_transientdb.py
8046 (TestTransientTable.run_iceland_political_tests): Fix a comment.
8047
8048 2003-05-26 Bernhard Herzog <[email protected]>
8049
8050 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
8051 implementation. Mark parts of the file format strings for
8052 localization.
8053
8054 * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8055 file and add the table to the tables managed by the session
8056
8057 * test/test_session.py (TestSessionSimple.test_open_table_file):
8058 New. test case for OpenTableFile
8059
8060 2003-05-26 Jan-Oliver Wagner <[email protected]>
8061
8062 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
8063 Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
8064 Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
8065 Replace the true/false of wxWindows by True/False of Python 2.2.1.
8066
8067 2003-05-26 Jan-Oliver Wagner <[email protected]>
8068
8069 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
8070 already a selection present, update the grid accordingly.
8071
8072 * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
8073 resizeable and increase its initial size.
8074
8075 2003-05-26 Frank Koormann <[email protected]>
8076
8077 Table export functionality
8078
8079 * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
8080 Return width (in characters) for a column.
8081 (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
8082 (table_to_dbf): Write table to dbf file.
8083 (table_to_csv): Write table to csv file.
8084
8085 * Thuban/Model/transientdb.py (TransientTableBase.Width,
8086 TransientTableBase.Precision): Return column width and precision.
8087
8088 * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
8089 or table_to_csv depending on file selection.
8090
8091 * test/test_dbf_table.py:
8092 Test table_to_dbf (extension of former part of test).
8093
8094 * test/test_csv_table.py:
8095 Test table_to_csv.
8096
8097 2003-05-23 Jan-Oliver Wagner <[email protected]>
8098
8099 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
8100 Use QueryTableFrame instead of TableFrame.
8101
8102 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
8103 table window with 'Layer Table:' instead of 'Table:'.
8104
8105 2003-05-23 Jan-Oliver Wagner <[email protected]>
8106
8107 Give all tables a title via mix-in TitledObject.LayerShowTable
8108
8109 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
8110 only if it exists.
8111
8112 * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
8113 and call its init-method with a default title. Remove Title() method.
8114
8115 * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
8116 AutoTransientTable): mix-in TitledObject and call its init-method with
8117 a default title. Remove Title() method.
8118
8119 2003-05-23 Bernhard Herzog <[email protected]>
8120
8121 * Thuban/Model/session.py (Session.AddShapeStore): Define
8122 AddShapeStore analogously to AddTable.
8123
8124 * test/test_session.py (TestSessionSimple.test_add_shapestore):
8125 New. Test for AddShapeStore
8126
8127 2003-05-23 Jan-Oliver Wagner <[email protected]>
8128
8129 Introducing QueryTableFrame and a very coarse ShowTable implementation.
8130
8131 * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
8132 class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
8133 The latter implements the selection GUI without dependency on a layer.
8134 LayerTableFrame now is derived from QueryTableFrame and connects
8135 to a layer.
8136
8137 * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
8138 implementation that still needs work.
8139
8140 * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
8141
8142 2003-05-22 Frank Koormann <[email protected]>
8143
8144 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
8145 Added "outer_join = False" as optional parameter.
8146 (TransientJoinedTable.create): If outer join is true, perform a
8147 "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
8148 the left table. Records not matching are filled with 0 / None.
8149
8150 * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
8151 (JoinDialog.OnJoin): Consider outer join check box.
8152
8153 2003-05-22 Bernhard Herzog <[email protected]>
8154
8155 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
8156 somewhat safer way. Storing the traceback in a local variable can
8157 lead to memory leaks
8158
8159 2003-05-22 Bernhard Herzog <[email protected]>
8160
8161 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
8162 the wxMessageDialog's Destroy() method.
8163
8164 2003-05-22 Frank Koormann <[email protected]>
8165
8166 * Thuban/UI/join.py (JoinDialog.__init__): Make use of
8167 TransientTable.Title()
8168
8169 2003-05-22 Frank Koormann <[email protected]>
8170
8171 Join Dialog, initial version.
8172
8173 * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
8174
8175 * Thuban/UI/join.py (JoinDialog): Functional implementation of
8176 former framework. Renamed Table1/Table2 to LeftTable/RightTable
8177 in all occurences.
8178
8179 * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
8180 Typo fixed.
8181
8182 2003-05-22 Bernhard Herzog <[email protected]>
8183
8184 Give the tables titles so that the GUI can display more meaningful
8185 names. For now the titles are fixed but depend on e.g. filenames
8186 or the titles of the joined tables.
8187
8188 * Thuban/Model/transientdb.py (TransientTable.Title)
8189 (TransientJoinedTable.Title, AutoTransientTable.Title): New.
8190
8191 * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
8192
8193 * test/test_transientdb.py
8194 (TestTransientTable.test_auto_transient_table_title): New. Test
8195 for the Title method
8196 (TestTransientTable.test_transient_joined_table)
8197 (TestTransientTable.test_transient_table): Add test for the Title
8198 methods
8199
8200 * test/test_memory_table.py (TestMemoryTable.test_title): New.
8201 Test for the Title method
8202
8203 * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8204 the Title method
8205
8206 2003-05-22 Bernhard Herzog <[email protected]>
8207
8208 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8209 Provide a better way to destroy the layers
8210 (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8211 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8212 (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8213 the new way to destroy the layers.
8214 (TestLayer.test_derived_store): New. Test for using a layer with a
8215 DerivedShapeStore
8216
8217 * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8218 filename if the shape store actually has one.
8219
8220 2003-05-22 Bernhard Herzog <[email protected]>
8221
8222 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8223 for the filename
8224
8225 * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8226 for the FileName method
8227 (TestDBFTableWriting.test_write): Fix spelling of filename
8228
8229 2003-05-22 Thomas Koester <[email protected]>
8230
8231 * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8232 from SciParam that now really is immutable.
8233
8234 2003-05-22 Frank Koormann <[email protected]>
8235
8236 Layer Top/Bottom placement added to legend.
8237
8238 * Thuban/UI/legend.py
8239 (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8240 bound to tool events.
8241 (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8242 New, methods binding the event methods with the map methods.
8243
8244 * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8245 layer at top/bottom of layer stack.
8246
8247 * Resources/Bitmaps/top_layer.xpm: New button icon.
8248
8249 * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8250
8251 2003-05-22 Bernhard Herzog <[email protected]>
8252
8253 * Thuban/Model/session.py (Session.RemoveTable): New method to
8254 remove tables
8255
8256 * test/test_session.py (TestSessionSimple.test_remove_table): New.
8257 Test for RemoveTable
8258
8259 2003-05-22 Thomas Koester <[email protected]>
8260
8261 * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8262 (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8263
8264 2003-05-22 Bernhard Herzog <[email protected]>
8265
8266 Implement a way to discover dependencies between tables and
8267 shapestores.
8268
8269 * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8270 (TransientJoinedTable.Dependencies)
8271 (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8272 interface
8273 (TransientJoinedTable.__init__): Keep tack of the original table
8274 objects in addition to the corresponding transient tables.
8275
8276 * Thuban/Model/table.py (DBFTable.Dependencies)
8277 (MemoryTable.Dependencies): New. Implement the dependencies
8278 interface
8279
8280 * Thuban/Model/data.py (ShapeTable): New. Helper class for
8281 ShapefileStore
8282 (ShapefileStore.__init__): Use ShapeTable instead of
8283 AutoTransientTable
8284 (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8285 (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8286 methods for filename and type
8287 (ShapefileStore.Dependencies): New. Implement the dependencies
8288 interface
8289 (DerivedShapeStore): New class to replace SimpleStore. The main
8290 difference to SimpleStore is that it depends not on a shapefile
8291 but another shapestore which expresses the dependencies a bit
8292 better
8293 (SimpleStore.__init__): Add deprecation warning.
8294
8295 * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8296 Test for the Dependencies method.
8297
8298 * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8299 New. Test for the Dependencies method.
8300
8301 * test/test_transientdb.py
8302 (TestTransientTable.test_auto_transient_table_dependencies): New.
8303 Test for the Dependencies method.
8304 (TestTransientTable.test_transient_joined_table): Add test for the
8305 Dependencies method.
8306
8307 * test/test_session.py (TestSessionSimple.setUp)
8308 (TestSessionSimple.tearDown): New. Implement a better way to
8309 destroy the sessions.
8310 (TestSessionSimple.test_initial_state)
8311 (TestSessionSimple.test_add_table): Bind session to self.session
8312 so that it's destroyed by tearDown
8313 (TestSessionSimple.test_open_shapefile): New. Test for
8314 OpenShapefile and the object it returns
8315
8316 2003-05-22 Bernhard Herzog <[email protected]>
8317
8318 * Thuban/Model/session.py (Session.AddTable): New method to
8319 register tables with the session.
8320 (Session.Tables): Return the tables registered with AddTable too.
8321
8322 * test/test_session.py (TestSessionSimple.test_add_table): New.
8323 Test case for the AddTable method
8324
8325 2003-05-22 Frank Koormann <[email protected]>
8326
8327 UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8328 lower right corner, center labels for selections, initialize controls
8329 in reasonable order for keyboard navigation.
8330
8331 * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8332 (ProjFrame.__DoOnProjAvail): Determine position of current projection
8333 using the wxListBox.FindString() method. Still a problem (#1886)
8334
8335 * Thuban/UI/classifier.py
8336 (Classifier.__init__, SelectPropertiesDialog.__init__)
8337
8338 * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8339 (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8340 different classification types from here to __init__.
8341 (GenUniquePanel.__init__): Set the column width of the first field
8342 in the Field ListCtrl to the full width.
8343
8344 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8345 Button to 'Export'. Center Buttons in Selection Box, set Focus to
8346 Grid.
8347 (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8348 changes focus to the Selection when pressing "Alt-S".
8349
8350 * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8351 the text if not visible. The italic font sometimes exceeds the
8352 rendering area.
8353
8354 2003-05-21 Jonathan Coles <[email protected]>
8355
8356 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8357 to OnClose so that Thuban closes correctly.
8358
8359 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8360 DockFrame.OnClose, not DockFrame._OnClose.
8361
8362 2003-05-21 Jonathan Coles <[email protected]>
8363
8364 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8365 references to 'inf' and use new Range __init__ to pass floats
8366 directly rather than converting them to strings first.
8367 Fixes RTBug #1876.
8368
8369 * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8370 Use new Range ___init__ to pass floats.
8371
8372 * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8373 filename is a valid image file. Throw IOError otherwise.
8374
8375 * Thuban/Model/range.py: Brought over new Range from SciParam that
8376 is immutable and has an __init__ which can accept floats.
8377
8378 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8379 into try block. AddLayer doesn't throw any exceptions anymore.
8380 (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8381 try block.
8382
8383 * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8384 the first item in choices. Fixes RTBug #1882.
8385
8386 * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8387 has gone to 0 which is a serious problem. abort.
8388 (MapRenderer.draw_raster_layer): Catch IOError seperately and
8389 print the error from GDAL.
8390
8391 * Thuban/UI/tableview.py (TableGrid.__init__): Call
8392 ToggleEventListeners to turn on listening.
8393 (TableGrid.ToggleEventListeners): New. Turns event listening on
8394 and off so as to prevent excessive messages.
8395 (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8396 to suppress excessive messages when selecting many rows.
8397 Fixes RTBug #1880.
8398
8399 * Thuban/UI/view.py: Added checks against if scale == 0. This
8400 is a serious problem that can occur when an image without
8401 geo data is loading and causes the map projection bounds to
8402 go to infinity. Right now, the solution is to simply try
8403 to recover.
8404
8405 * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8406 to set the MFILEReceiver attributes even if the data is NULL.
8407
8408 * extensions/thuban/gdalwarp.cpp: Improved the error handling
8409 and passed GDAL messages back up to the Python layer. Also
8410 tried to fix some memory leaks that were present in the original
8411 utility but didn't matter because the program aborted.
8412
8413 * test/test_range.py: Copied over tests from SciParam. Removed
8414 tests against importing. Fixes RTBug #1867.
8415
8416 2003-05-21 Bernhard Herzog <[email protected]>
8417
8418 * test/test_load.py: Remove unused imports and restructure the
8419 test code
8420 (LoadSessionTest): Split into one class for each test and turn
8421 LoadSessionTest itself into the base class for all such session
8422 tests.
8423 (ClassificationTest): New base class for load tests that test
8424 classifications
8425 (TestSingleLayer, TestLayerVisibility, TestClassification)
8426 (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8427 for the individual tests
8428
8429 * test/support.py (FileLoadTestCase.filename): New base class for
8430 file loading tests
8431
8432 2003-05-21 Jan-Oliver Wagner <[email protected]>
8433
8434 * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8435 Mercator' to 'UTM Zone 32' as a more convenient example.
8436 Added 'Gauss Krueger Zone 6'.
8437
8438 * Data/iceland_sample_raster.thuban: political polygon now
8439 filled transparent to have the raster image visible at once.
8440
8441 2003-05-21 Frank Koormann <[email protected]>
8442
8443 * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8444 OnClose() to keep in sync with extensions. Internally Thuban
8445 still uses "underscored" names.
8446
8447 2003-05-20 Jonathan Coles <[email protected]>
8448
8449 This puts back Raster layer support. These layers support projections
8450 through the GDAL library. Currently, the CVS version is being used.
8451 There are no Debian packages available although this may change soon.
8452 A GDAL driver was extended to support writing to memory rather to
8453 files.
8454
8455 There is still some work that needs to be done, such as some error
8456 handling when loading invalid images or when there is a problem
8457 projecting the image. This putback simply checks in the majority
8458 of the work.
8459
8460 * setup.py: Add gdalwarp library extension.
8461
8462 * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8463 Defaults to False, but can be overridden by subclasses if they
8464 support classification.
8465 (RasterLayer): New. Defines a new layer that represents an
8466 image.
8467
8468 * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8469 tag handler.
8470 (SessionLoader.start_layer): Encode the filename.
8471 (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8472 New. Supports reading a rasterlayer tag.
8473
8474 * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8475
8476 * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8477 get a string in Latin1. If we get such as string convert it to
8478 unicode first, otherwise leave if alone before encoding.
8479 (SessionSaver.write_layer): Add support for writing both Layers
8480 and RasterLayers.
8481
8482 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8483 The right argument may not be a string, it could also be a Column.
8484
8485 * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8486 Make initial window size 600x400. Fixes RTBug #1872.
8487
8488 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8489 the dialog is constructed so that we can support layers that
8490 do not have classifications.
8491 (Classifier._OnTry): Only build a classification if the layer
8492 supports one.
8493
8494 * Thuban/UI/legend.py: Change all checks that a layer is an
8495 instance of Layer into checks against BaseLayer.
8496 (LegendTree.__FillTreeLayer): Only add children to a branch if
8497 the layer supports classification.
8498
8499 * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8500 MainWindow.OpenSession): Don't proceed with an action if the
8501 user chooses Cancel when they are asked to save changes.
8502 (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8503 user to select an image file. Create a new RasterLayer and add
8504 it to the map.
8505
8506 * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8507 for rendering RasterLayer layers.
8508 (MapRenderer.draw_raster_layer): Actually method that calls
8509 the GDALWarp python wrapper and constructs an image from the
8510 data returned.
8511
8512 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8513 Choices symbols to match those used in the table query method.
8514 Replace deprecated method calls on table with new method names.
8515
8516 * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8517 how small the scale can get. This still needs more testing.
8518
8519 * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8520 Provides a driver to output in .bmp format.
8521
8522 * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8523 New. Provides IO routines which write to memory, rather than a file.
8524
8525 * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8526 of the gdalwarp utility provided in GDAL. Added function calls
8527 that can be accessed from python.
8528
8529 * Data/iceland_sample_raster.thuban: New. Sample file that uses
8530 a raster layer.
8531
8532 * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8533 layer image data.
8534
8535 * Doc/thuban.dtd: Added rasterlayer attribute definition.
8536
8537 * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8538 tests associated with the raster layer code.
8539
8540 * test/test_transientdb.py
8541 (TestTransientTable.test_auto_transient_table_query): Added a test
8542 for using a Column object as the "right" parameter to a query.
8543
8544 2003-05-19 Frank Koormann <[email protected]>
8545
8546 * Thuban/version.py (get_changelog_date):
8547 Catch exceptions if ChangeLog does not exist.
8548
8549 * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8550
8551 2003-05-19 Frank Koormann <[email protected]>
8552
8553 Extended version information for Thuban
8554
8555 * Thuban/version.py: New, version information for Thuban: Last
8556 modification date and last ChangeLog entry date.
8557
8558 * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8559 information: Display Thuban, wxPython and Python version.
8560
8561 2003-05-16 Bernhard Herzog <[email protected]>
8562
8563 * Thuban/Model/save.py: Remove some unused imports including the
8564 __future__ import for nested_scopes as Thuban relies on Python 2.2
8565 now.
8566 (XMLWriter.encode): Remove the special case for a None argument.
8567 In the saver encode is always called with a string argument.
8568
8569 2003-05-16 Bernhard Herzog <[email protected]>
8570
8571 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8572 in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8573 of the bug was that e.g. float("1.2") would fail. Thuban now
8574 requires 2.4.x.
8575
8576 2003-05-16 Frank Koormann <[email protected]>
8577
8578 Printing enhancement and WMF export (under Win32)
8579
8580 * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8581 ScreenRenderer. Renders Map, Legend and Scalebar for export.
8582 (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8583 PrintRender.
8584
8585 * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8586 to fullfil information needed for PrinterRenderer.
8587 (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8588 (MapCanvas.Print): Adapted to new MapPrintout.
8589 (OutputTransform): General calculations to transform from canvas
8590 coordinates to export/printing devices.
8591
8592 * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8593 new method_command to call ExportMap, with platform dependency (only
8594 __WXMSW__)
8595
8596 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8597 of scalebar drawing area as new parameters.
8598
8599 * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8600
8601 * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8602 Update to extended scalebar.DrawScalebar header.
8603
8604 * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8605
8606 * test/test_scalebar.py: Made test executable as standalone.
8607
8608 2003-05-16 Bernhard Herzog <[email protected]>
8609
8610 * Thuban/Model/table.py (Table): Remove this compatibility alias
8611 for DBFTable.
8612
8613 * test/test_table.py: Import DBFTable as Table because that alias
8614 doesn't exist anymore.
8615
8616 * Thuban/UI/classgen.py: Remove some unused imports
8617
8618 2003-05-14 Jonathan Coles <[email protected]>
8619
8620 * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8621 Fix docstring.
8622 (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8623 (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8624 values of the supplied range to determine the beginning and end
8625 bounds of the generated classes.
8626
8627 * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8628 do not have a leading 0 (.5 is now accepted as well as 0.5).
8629
8630 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8631 call to ClassGenerator.GenUniformDistribution.
8632
8633 * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8634 layout bug with the 'Projection' label.
8635
8636 * test/support.py (FloatTestCase): New. Needed for the Range tests.
8637
8638 * test/test_range.py: New. Imported from SciParam.
8639
8640 2003-05-12 Jonathan Coles <[email protected]>
8641
8642 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8643 to table.UniqueValues() with calls that retrieve all the values
8644 from the table. This will need to be replaced by a method on table
8645 which can simply return the list (perhaps more efficiently).
8646
8647 2003-05-12 Jonathan Coles <[email protected]>
8648
8649 The return value of ClassGenerator.CalculateQuantiles has changed.
8650 Refer to the documentation for details.
8651
8652 * test/test_classgen.py: Modified Quantile tests to use the
8653 new return values.
8654
8655 * Thuban/Model/classgen.py
8656 (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8657 use new return values from CalculateQuantiles to produce the correct
8658 range bounds in the Classification.
8659 (ClassGenerator.CalculateQuantiles): Add more comments describing
8660 the return values and parameters. Make minor adjustments to improve
8661 the legibility of the code. Fix problem with adjusted not being set
8662 in most cases.
8663
8664 2003-05-12 Frank Koormann <[email protected]>
8665
8666 * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8667 and latin1. Fixes #1851 finally.
8668
8669 2003-05-09 Jonathan Coles <[email protected]>
8670
8671 * test/test_classgen.py: New. Tests the Quantile algorithm.
8672
8673 * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8674 Clean up debugging statement, add comments, fix a small bug in the
8675 returned adjusted percentiles.
8676
8677 2003-05-09 Jonathan Coles <[email protected]>
8678
8679 Introduces Range class from SciParam into the ClassGroupRange class,
8680 and such ranges can now be saved and loaded from disk.
8681
8682 Quantiles are now available in the Classification Generator.
8683
8684 Initial support for building Queries on a table. Doesn't do anything
8685 but run some tests.
8686
8687 * Thuban/Model/classification.py: Explicit imports.
8688 (ClassGroupRange): Use the Range class to store the underlying
8689 range information. The interface remains the same, except for
8690 GetRange(), and you can also supply a Range object as the min
8691 parameter to SetRange or __init__.
8692
8693 * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8694 string appropriately for use in Thuban. Fixes RTbug #1851.
8695 (SessionLoader.end_projection): Handle the context of the
8696 projection tag a bit better by looking at what objects are not
8697 None. There was an assumption that a projection tag for a map
8698 could occur before any layers.
8699 (SessionLoader.start_clrange): Provide backward compatibility for
8700 reading min/max values as well as the new range parameter.
8701
8702 * Thuban/Model/map.py: Explicit imports.
8703
8704 * Thuban/Model/resource.py: Import _.
8705 (ProjFileSaver.write): write header using projfile.dtd.
8706
8707 * Thuban/Model/save.py: Explicit imports.
8708 (XMLWriter.encode): New. Encode the given string from a format
8709 used by Thuban into UTF-8. Fixes RTbug #1851.
8710
8711 * Thuban/UI/classgen.py: Explicit imports.
8712 (ClassGenDialog.__init__): Clean up the code and add support
8713 for Quantiles.
8714 (ClassGenDialog.OnOK): Add support for Quantiles.
8715 (GenQuantilesPanel): New. Input panel for Quantiles.
8716 (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8717 GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8718
8719 * Thuban/Model/classgen.py: New. Contains all the classes named above.
8720
8721 * Thuban/UI/classifier.py: Explicit imports.
8722 (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8723 ClassTable.SetValueAsCustom): Reworked to use new Range class.
8724
8725 * Thuban/UI/legend.py: Explicit imports.
8726
8727 * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8728 a Table menu and associated method calls.
8729 (MainWindow.choose_color): Removed. No longer needed.
8730
8731 * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8732 should be disabled if no projection is selected in the available
8733 list.
8734
8735 * Thuban/UI/renderer.py: Explicit imports.
8736
8737 * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
8738 with correctly selecting the rows and issuing the right events.
8739 Be sure to call Skip() to allow the grid to do some of its own
8740 handling which allows the rows to actually be selected.
8741 (LayerTableGrid.select_shapes): Rename from select_shape. Supports
8742 selecting multiple shapes.
8743 (LayerTableFrame): Support for building Queries.
8744 (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
8745
8746 * Thuban/UI/tree.py: Explicit imports.
8747
8748 * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
8749 table view can call it.
8750
8751 * test/test_classification.py: Explicit imports.
8752 (TestClassification.test_ClassGroupRange): Fix test for new
8753 Range class.
8754
8755 * Doc/thuban.dtd: Add range parameter for clrange.
8756
8757 * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
8758 object in ClassGroupRange, and also uesd for inputting ranges in
8759 the classifer table and elsewhere.
8760
8761 * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
8762 yet.
8763
8764 2003-05-09 Frank Koormann <[email protected]>
8765
8766 * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
8767
8768 2003-05-08 Frank Koormann <[email protected]>
8769
8770 Coding style updates
8771
8772 * test/test_scalebar.py: Replaced tab indentation by spaces.
8773
8774 * Thuban/UI/scalebar.py: Explicit imports.
8775
8776 2003-05-08 Frank Koormann <[email protected]>
8777
8778 * Thuban/UI/scalebar.py
8779 (ScaleBar.DrawScalebar): Format string bug fixed.
8780
8781 2003-05-08 Frank Koormann <[email protected]>
8782
8783 Reorganization of scalebar component (no wx in Thuban/Model)
8784
8785 * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
8786 (deriveInterval):
8787 Calculate scalebar interval and unit which fits in width for scale.
8788 (roundInterval): Round float.
8789
8790 * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
8791
8792 * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
8793
8794 * Thuban/UI/legend.py: Import Thuban.UI.scalebar
8795
8796 2003-05-08 Frank Koormann <[email protected]>
8797
8798 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
8799 Initialize ScaleBar with canvas.map
8800
8801 * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
8802 round intervals to display smarter lengths
8803 (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
8804 layer. If the maps has no projection applied grey the scalebar.
8805
8806 2003-05-07 Frank Koormann <[email protected]>
8807
8808 Basic Scalebar features added.
8809
8810 * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
8811
8812 * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
8813 (ScaleBarBitmap): New, links the scalebar bitmap with view messages
8814 and the renderer.
8815
8816 * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
8817
8818 * Thuban/UI/messages.py: SCALE_CHANGED added.
8819
8820 2003-05-07 Bernhard Herzog <[email protected]>
8821
8822 * Thuban/Model/session.py (Session.__init__): New instance
8823 variable shapestores to hold a list of all open shapestore objects
8824 (Session.ShapeStores): New. Accessor method for the shapestores
8825 list.
8826 (Session._add_shapestore, Session._clean_weak_store_refs): New.
8827 Internal methods to maintain the shapestores list.
8828 (Session.Tables): New. Return all tables open in the session.
8829 (Session.OpenShapefile): Insert the new ShapeStore into the
8830 shapestores list.
8831
8832 * test/test_session.py (TestSessionSimple.test_initial_state): Add
8833 tests for ShapeStores and Tables
8834 (TestSessionWithContent.test_shape_stores)
8835 (TestSessionWithContent.test_tables): New. Test cases for
8836 ShapeStores and Tables
8837
8838 2003-05-07 Bernhard Herzog <[email protected]>
8839
8840 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
8841 Add comments about the optimizations used.
8842 (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
8843 Implement the ReadValue table interface method.
8844
8845 * test/test_transientdb.py
8846 (TestTransientTable.run_iceland_political_tests)
8847 (TestTransientTable.test_transient_joined_table): Add tests for
8848 ReadValue
8849
8850 2003-05-07 Frank Koormann <[email protected]>
8851
8852 * Resources/Bitmaps/fulllayerextent.xpm,
8853 Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
8854 new icons.
8855
8856 2003-05-06 Bernhard Herzog <[email protected]>
8857
8858 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8859 New. Simply delegate to the transient table's version.
8860
8861 * test/test_transientdb.py
8862 (TestTransientTable.test_auto_transient_table_query): New. Test
8863 case for AutoTransientTable's SimpleQuery
8864
8865 2003-05-06 Bernhard Herzog <[email protected]>
8866
8867 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
8868 Implement a simple query method for the query dialog
8869 (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
8870 the row index or shapeid.
8871 (TransientTable.create): Insert the right value of the row index
8872 (TransientJoinedTable.create): Copy the row index of the left
8873 table to the joined result table
8874
8875 * test/test_transientdb.py
8876 (TestTransientTable.test_transient_table_read_twice): Fix
8877 doc-string
8878 (TestTransientTable.test_transient_table_query): New. Test for the
8879 SimpleQuery method
8880
8881 2003-05-06 Bernhard Herzog <[email protected]>
8882
8883 Convert all table users to use the new table interface. This only
8884 covers Thuban itself, not GREAT-ER or other applications built on
8885 Thuban yet, so the compatibility interface stays in place for the
8886 time being but it now issues DeprecationWarnings.
8887
8888 Finally, the new Table interface has a new method, HasColumn.
8889
8890 * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
8891 issue deprecation warnings when they're. The warnings refer to the
8892 caller of the method.
8893 (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
8894 for the deprecation warnings
8895
8896 * test/test_table.py: Ignore the deprecation warnings for the old
8897 table in the tests in this module. The purpose of the tests is to
8898 test the old interface, after all.
8899
8900 * test/test_transientdb.py
8901 (TestTransientTable.run_iceland_political_tests): Use the
8902 constants for the types. Add a test for HasColumn
8903 (TestTransientTable.test_transient_joined_table): Adapt to new
8904 table interface. Add a test for HasColumn
8905 (TestTransientTable.test_transient_table_read_twice): Adapt to new
8906 table interface
8907
8908 * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
8909 Adapt to new table interface
8910
8911 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
8912 new table interface
8913
8914 * Thuban/UI/controls.py (RecordListCtrl.fill_list)
8915 (RecordTable.SetTable): Adapt to new table interface
8916
8917 * Thuban/UI/classifier.py (Classifier.__init__)
8918 (Classifier.__init__): Adapt to new table interface
8919
8920 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
8921 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
8922 to new table interface
8923
8924 * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
8925 (AutoTransientTable.HasColumn): Implement the new table interface
8926 method
8927 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
8928 (AutoTransientTable.UniqueValues): Adapt to new table interface
8929
8930 * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
8931 Adapt to new table interface
8932
8933 * test/test_layer.py (TestLayer.open_shapefile): Helper method to
8934 simplify opening shapefiles a bit easier.
8935 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
8936 (TestLayer.test_point_layer): Use the new helper method
8937 (TestLayer.test_get_field_type): New. Test for the GetFieldType
8938 method
8939
8940 * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
8941 the new table method
8942
8943 * test/test_memory_table.py (TestMemoryTable.test_has_column):
8944 Test for the new table method HasColumn
8945
8946 2003-05-06 Jonathan Coles <[email protected]>
8947
8948 Addresses the "Selection Extent" wish of RTbug #1787.
8949
8950 * Resources/Bitmaps/fulllayerextent.xpm,
8951 Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
8952 extent. These are just place holders for the real bitmaps.
8953
8954 * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
8955 calculate the bounding box once (the first time compute_bbox() is
8956 called).
8957 (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
8958 the bounding box for the shapes in lat/long coordinates.
8959
8960 * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
8961 option.
8962 (MainWindow.has_selected_shapes): New. Returns true if there are
8963 any selected shapes.
8964 (MainWindow.FullSelectionExtent): New. Calls
8965 MapCanvas.FitSelectedToWindow() when the user selects the menu option.
8966 (_has_selected_shapes): New. Returns true if there are any
8967 selected shapes.
8968
8969 * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
8970 true if there are any selected shapes.
8971
8972 * Thuban/UI/view.py (MapCanvas): Added delegated method
8973 HasSelectedShapes.
8974 (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
8975 shapes on the canvas using the map projection (if any).
8976
8977 * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
8978 for Layer.ShapesBoundingBox().
8979
8980 2003-05-06 Bernhard Herzog <[email protected]>
8981
8982 * Resources/Projections/defaults.proj: Fix spelling of Mercator
8983
8984 2003-05-05 Jonathan Coles <[email protected]>
8985
8986 Addresses the "Full Layer Extent" wish of RTbug #1787.
8987
8988 * Resources/Projections/defaults.proj: Added UK National Grid.
8989
8990 * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
8991 (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
8992 when the user selects the menu option.
8993
8994 * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
8995 scales the given layer on the canvas using the map projection.
8996
8997 2003-05-05 Bernhard Herzog <[email protected]>
8998
8999 Convert the table implementations to a new table interface. All
9000 tables use a common mixin class to provide backwards compatibility
9001 until all table users have been updated.
9002
9003 * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
9004 provide backwards compatibility for table classes implementing the
9005 new interface
9006 (DBFTable, MemoryTable): Implement the new table interface. Use
9007 OldTableInterfaceMixin as base for compatibility
9008 (DBFColumn, MemoryColumn): New. Column description for DBFTable
9009 and MemoryTable resp.
9010
9011 * test/test_dbf_table.py: New. Test cases for the DBFTable with
9012 the new table interface.
9013
9014 * test/test_memory_table.py: New. Test cases for the MemoryTable
9015 with the new table interface.
9016
9017 * test/test_table.py: Document the all tests in this file as only
9018 for backwards compatibility. The equivalent tests for the new
9019 interface are in test_memory_table.py and test_dbf_table.py
9020 (MemoryTableTest.test_read): field_info should be returning tuples
9021 with four items
9022 (MemoryTableTest.test_write): Make doc-string a more precise.
9023
9024 * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
9025 table interface. Derive from from OldTableInterfaceMixin for
9026 compatibility.
9027 (TransientTableBase.create): New intance variable column_map to
9028 map from names and indices to column objects
9029 (TransientTable.create): Use the new table interface of the input
9030 table
9031 (AutoTransientTable): Convert to new table interface. Derive from
9032 from OldTableInterfaceMixin for compatibility.
9033 (AutoTransientTable.write_record): Removed. It's not implemented
9034 yet and we still have to decide how to handle writing with the new
9035 table and data framework.
9036
9037 * test/test_transientdb.py
9038 (TestTransientTable.run_iceland_political_tests)
9039 (TestTransientTable.test_transient_joined_table): Use the new
9040 table interface
9041
9042 2003-05-05 Jonathan Coles <[email protected]>
9043
9044 This is namely a collection of UI updates to improve user interactivity.
9045 Tabbing between controls now exists and you can use ESC to close dialog
9046 boxes; ENTER will active the default button.
9047
9048 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
9049 order that the controls are created so that tabbing works correctly.
9050 (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
9051 wxDialog can handle the default button correctly.
9052 (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
9053 same reasons as for OnOK.
9054 (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
9055 when we ask the table for the maximum/minimum values of a field
9056 which could take a very long time.
9057
9058 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
9059 order that the controls are created so that tabbing works correctly.
9060 (SelectPropertiesDialog.__init__): Rearrange the order that the
9061 controls are created so that tabbing works correctly.
9062
9063 * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
9064 to derive from a wxDialog but behave like the original implementation
9065 which was derived from a wxFrame. wxDialog provides useful key
9066 handling functionality like ESC calling OnCancel and ENTER calling
9067 OnOK which is lost with wxFrame.
9068
9069 * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
9070 new dialogs.
9071
9072 * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
9073 order that the controls are created so that tabbing works correctly.
9074 (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
9075 (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
9076 (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
9077 (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
9078 can provide the "UK National Grid" as a default projection.
9079 (UTMPanel.__init__): Rearrange the order that the controls are
9080 created so that tabbing works correctly.
9081
9082 2003-05-05 Bernhard Herzog <[email protected]>
9083
9084 * extensions/thuban/wxproj.cpp: Fix some of the comments.
9085 (project_point): If a map projection but no layer projection is
9086 given, convert degrees to radians before applying the map
9087 projection.
9088
9089 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9090 (TableGrid.allow_messages): New methods to make it possible to
9091 inhibit message sending.
9092 (TableGrid.issue): Only send the message if not inhibited.
9093 (LayerTableGrid.select_shape): Use the new methods to make sure
9094 that no ROW_SELECTED message is sent while we're updating the
9095 selected rows to match the selected shapes.
9096
9097 2003-05-02 Jan-Oliver Wagner <[email protected]>
9098
9099 Implementation of MemoryTable.
9100
9101 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
9102 implementation that operates on a list of tuples. All of the data
9103 are kept in the memory.
9104
9105 * test/test_table.py (MemoryTableTest): New.
9106
9107 * test/test_transientdb.py (SimpleTable): Removed.
9108 (TestTransientTable.test_transient_joined_table,
9109 (TestTransientTable.test_transient_table_read_twice): Replaced
9110 SimpleTable by MemoryTable.
9111
9112 2003-04-30 Jonathan Coles <[email protected]>
9113
9114 * Data/iceland_sample.thuban: Now contains correct projections
9115 for each of the layers.
9116
9117 * Resources/Projections/defaults.proj: Geographic projection
9118 contains unit conversion parameter.
9119
9120 2003-04-30 Jonathan Coles <[email protected]>
9121
9122 The most important part of this putback is the projection changes.
9123 It should now be possible to specify the projection that a layer
9124 is in and then specify a different projection for the map. The
9125 projection dialog has an extra parameter for a geographic projection
9126 which lets the user select if the input is in degrees or radians.
9127
9128 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
9129 to say that the parameter is a tuple of unprojected
9130 points (which is what the callers to this method were assuming).
9131 Also, since the points are unprojected we need to projected them.
9132
9133 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
9134 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
9135 groups are selected, move the layer up/down. Fixes RTbug #1833.
9136
9137 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
9138
9139 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
9140 parameter in call to SetClientData.
9141 (GeoPanel): Add support for selecting the units that the
9142 source data is in (Radians or Degrees).
9143
9144 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
9145 the rendering loop by reducing the number of if's, removing the
9146 unnecessary try/except block, and checking if the old group
9147 is the same as the new one (which happens a lot if there is
9148 no classification, or lots of shapes are in the same group).
9149
9150 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
9151 around the redraw routine to try to catch problems that the user
9152 may create by selecting invalid projections for the data set and
9153 map. Clears the display if there are any problems and prints the
9154 error.
9155 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
9156 rectangle.
9157
9158 * extensions/thuban/wxproj.cpp (project_point): First invert the
9159 supplied point (which should be in projected coordinates) using
9160 the layer's projection and then project the point using the
9161 map's projection.
9162 (project_points): Use project_point() to project each point.
9163
9164 2003-04-30 Jan-Oliver Wagner <[email protected]>
9165
9166 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
9167 don't set the Classification to None if the classfication field
9168 is None (ie only a DEFAULT).
9169
9170 2003-04-30 Bernhard Herzog <[email protected]>
9171
9172 * Thuban/UI/view.py: Fix some typos.
9173
9174 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
9175 not pop up the dialog if the selection becomes empty (this could
9176 happen if e.g. a new selection is opened while the identify tool
9177 is active and dialog had been closed)
9178
9179 2003-04-30 Bernhard Herzog <[email protected]>
9180
9181 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
9182 instance variable read_record_last_result
9183 (TransientTableBase.read_record): Make sure reading the same
9184 record twice works. The implementation uses the new instance
9185 variable read_record_last_result
9186
9187 * test/test_transientdb.py
9188 (TestTransientTable.test_transient_table_read_twice): New test
9189 case for the above bug-fix.
9190
9191 2003-04-29 Jonathan Coles <[email protected]>
9192
9193 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
9194
9195 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
9196
9197 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
9198 (ClassTable.SetValueAsCustom): Rename keyword argument in
9199 ClassGroup* constructors to match argument name.
9200
9201 2003-04-29 Bernhard Herzog <[email protected]>
9202
9203 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9204 transient DB if it exists to make sure it doesn't leave a journal
9205 file in the temp directory.
9206
9207 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9208 self.conn to None after closing the connection to make sure it's
9209 not closed twice
9210
9211 2003-04-29 Jonathan Coles <[email protected]>
9212
9213 Add a visible parameter in the layer XML tag. The default value is
9214 "true". If anything other than "false" is specified we also assume
9215 "true". Addresses RTbug #1025.
9216
9217 * Doc/thuban.dtd: Add visible parameter to a layer.
9218
9219 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9220 of visible from 1 to True.
9221 (Layer.__init__): Change default value of visible from 1 to True.
9222
9223 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9224 parameter.
9225
9226 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9227 parameter.
9228
9229 * test/test_load.py: Add new test data contents_test_visible.
9230 (LoadSessionTest.setUp): save test data.
9231 (LoadSessionTest.testLayerVisibility): Test if the visible flag
9232 is loaded correctly.
9233
9234 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9235 for saving an invisible layer.
9236
9237 2003-04-29 Jonathan Coles <[email protected]>
9238
9239 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9240 legend dialog box and tell it to change its map to the one
9241 supplied to SetMap(). Fixes RTbug #1770.
9242
9243 2003-04-29 Bernhard Herzog <[email protected]>
9244
9245 Next step of table implementation. Introduce a transient database
9246 using SQLite that some of the data is copied to on demand. This
9247 allows us to do joins and other operations that require an index
9248 for good performance with reasonable efficiency. Thuban now needs
9249 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9250 haven't tested that.
9251
9252 * Thuban/Model/transientdb.py: New. Transient database
9253 implementation.
9254
9255 * test/test_transientdb.py: New. Tests for the transient DB
9256 classes.
9257
9258 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9259 classes to help automatically remove temporary files and
9260 directories.
9261 (Session.__init__): New instance variables temp_dir for the
9262 temporary directory and transient_db for the SQLite database
9263 (Session.temp_directory): New. Create a temporary directory if not
9264 yet done and return its name. Use AutoRemoveDir to have it
9265 automatically deleted
9266 (Session.TransientDB): Instantiate the transient database if not
9267 done yet and return it.
9268
9269 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9270 AutoTransientTable so that data is copied to the transient DB on
9271 demand.
9272 (SimpleStore): New class that simply combines a table and a
9273 shapefile
9274
9275 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9276 DBFTable and update its doc-string to reflect the fact that this
9277 is only the table interface to a DBF file. Table is now an alias
9278 for DBFTable for temporary backwards compatibility.
9279
9280 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9281 the last reference to the session goes away so that the temporary
9282 files are removed properly.
9283
9284 * test/test_load.py (LoadSessionTest.tearDown): Remove the
9285 reference to the session to make sure the temporary files are
9286 removed.
9287
9288 2003-04-29 Bernhard Herzog <[email protected]>
9289
9290 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9291 the __parser instance variable into a normal local variable in
9292 read. It's only used there and read will never be called more than
9293 once. Plus it introduces a reference cycle that keeps can keep the
9294 session object alive for a long time.
9295
9296 2003-04-29 Jonathan Coles <[email protected]>
9297
9298 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9299 Projection an immutable item. Fixes RTbug #1825.
9300 (Projection.__init__): Initialize instance variables here.
9301 (ProjFile.Replace): New. Replace the given projection object with
9302 the new projection object. This solves the problem of needing the
9303 mutator Projection.SetProjection() in the ProjFrame class and
9304 allows a projection to change parameters without changing its
9305 location in the file.
9306
9307 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9308 be of type wxSAVE and should verify overwriting a file.
9309
9310 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9311 ProjFile.Replace() method instead of the mutator
9312 Projection.SetProjection(). Also requires that we reassign the
9313 client data to the new projection.
9314
9315 * test/test_proj.py (TestProjection.test): Test GetName() and
9316 GetAllParameters()
9317 (TestProjFile.test): Remove tests for Set*() methods. Add tests
9318 for Replace().
9319
9320 2003-04-25 Jonathan Coles <[email protected]>
9321
9322 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9323 to save the name of the projection.
9324
9325 * test/test_save.py (SaveSessionTest.testLayerProjection): New
9326 test to verify layer projections are saved correctly.
9327
9328 2003-04-25 Jonathan Coles <[email protected]>
9329
9330 * Thuban/Model/proj.py (Projection.SetName): Set the name
9331 to "Unknown" if name is None.
9332 (Projection.SetAllParameters): New. Set the projection's
9333 parameter list to the one supplied.
9334 (Projection.SetProjection): New. Set the projection's
9335 properties to those of the supplied Projection.
9336
9337 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9338 the dialog title to include the map's title.
9339 (MainWindow.LayerProjection): Set the dialog title to include
9340 the layer's title.
9341
9342 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9343 error dialogs into a single method call.
9344 (ProjFrame.__VerifyButtons): Add more states to check.
9345 (ProjFrame.__GetProjection): Return the current state of an
9346 edited projection or None.
9347 (ProjFrame.__FillAvailList): Remove checks for states that
9348 shouldn't exist.
9349 (ProjFrame._OnNew): Clear all selected items and supply
9350 a projection panel if necessary.
9351
9352 * test/test_proj.py (TestProjFile.test): Add tests for
9353 ProjFile.SetAllParameters, ProjFile.SetProjection,
9354 ProjFile.SetName.
9355
9356 2003-04-25 Jonathan Coles <[email protected]>
9357
9358 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9359 takes an optional argument to select the current projection.
9360 This does not guarantee that the item is visible due to
9361 limited wxWindows functionality. Fixes RTBug #1821.
9362
9363 2003-04-25 Jonathan Coles <[email protected]>
9364
9365 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9366 the projection name and use it when constructing the Projection
9367 object.
9368
9369 * Thuban/Model/proj.py (Projection.__init__): Change the default
9370 value for 'name' to None and then test if name is equal to None
9371 in the body of the constructor. This way the caller doesn't have to
9372 know what the default value should be. Namely, useful in load.py
9373 where we have to pick a default value if the 'name' parameter
9374 doesn't exist in the XML file.
9375
9376 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9377 Tests a file where a layer has a projection.
9378
9379 2003-04-25 Jonathan Coles <[email protected]>
9380
9381 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9382 tree for projection information.
9383
9384 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9385 XMLReader.GetFileName.
9386 (SessionLoader): Added support for loading projection tags that
9387 appear inside a layer.
9388
9389 * Thuban/Model/proj.py (ProjFile): Document the class. Move
9390 back to using a list because the order of the projections in
9391 the file is important to maintain. Fixes RTbug #1817.
9392
9393 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9394 to ProjFile.GetFilename.
9395
9396 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9397 information.
9398
9399 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9400 ProjFrame._OnSaveAs. Removed old dead code from previous
9401 implementation.
9402 (ProjFrame._OnExport): Add support for exporting more than one
9403 projection to a single file.
9404 (ProjFrame.__FillAvailList): use string formatting (% operator)
9405 to build strings that are (partly) translated. Fixes RTbug #1818.
9406
9407 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9408 class.
9409
9410 2003-04-24 Bernhard Herzog <[email protected]>
9411
9412 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9413
9414 * po/fr.po: New. French translation by Daniel Calvelo Aros
9415
9416 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9417 empty strings.
9418
9419 2003-04-24 Jonathan Coles <[email protected]>
9420
9421 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9422 implement the interface that the ProjFrame dialog expects.
9423
9424 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9425 name of the projection to be changed.
9426 (ProjFile): Use a dictionary instead of a list so that removing
9427 projections is easier and we are sure about uniqueness.
9428 (ProjFile.Remove): Remove the given projection object.
9429
9430 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9431 Return a list with only one projection file instead of searching for
9432 any projection file. This simplifies many things if the user can
9433 only have one system file and one user file.
9434
9435 * Thuban/UI/classgen.py: Change all references to
9436 genCombo to genChoice.
9437
9438 * Thuban/UI/mainwindow.py: Add a Projection option under the
9439 layer menu.
9440 (MainWindow.LayerProjection): New. Open up a projection window
9441 for a layer.
9442
9443 * Thuban/UI/projdialog.py: Large changes to how the dialog is
9444 laid out. Use three panels instead of one. One for the list of
9445 projections, one for the edit controls, and one for the buttons.
9446 Fixed resizing problems so that the dialog resizes correctly
9447 when the projection panel changes. Added import/export, save, and
9448 new buttons/functionality.
9449
9450 2003-04-24 Bernhard Herzog <[email protected]>
9451
9452 First step towards table management. Introduce a simple data
9453 abstraction so that we replace the data a layer uses more easily
9454 in the next step.
9455
9456 * Thuban/Model/data.py: New file with a simple data abstraction
9457 that bundles shapefile and dbffile into one object.
9458
9459 * Thuban/Model/session.py (Session.OpenShapefile): New method to
9460 open shapefiles and return a shape store object
9461
9462 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9463 object instead of a shapefile filename. This introduces a new
9464 instance variable store holding the datastore. For intermediate
9465 backwards compatibility keep the old instance variables.
9466 (open_shapefile): Removed. No longer needed with the shape store.
9467 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9468 get the shape store used by a layer.
9469 (Layer.Destroy): No need to explicitly destroy the shapefile or
9470 table anymore.
9471
9472 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9473 (MainWindow.AddLayer): Use the session's OpenShapefile method to
9474 open shapefiles
9475
9476 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9477 session's OpenShapefile method to open shapefiles
9478
9479 * test/test_classification.py
9480 (TestClassification.test_classification): Use the session's
9481 OpenShapefile method to open shapefiles and build the filename in
9482 a more platform independed way
9483
9484 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9485 Implement to have a session to use in the tests
9486 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9487 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9488 session's OpenShapefile method to open shapefiles
9489 (TestLayerLegend.setUp): Instantiate a session so that we can use
9490 it to open shapefiles.
9491 (TestLayerLegend.tearDown): Make sure that all references to
9492 layers and session are removed otherwise we may get a resource
9493 leak
9494
9495 * test/test_map.py (TestMapAddLayer.test_add_layer)
9496 (TestMapWithContents.setUp): Instantiate a session so that we can
9497 use it to open shapefiles.
9498 (TestMapWithContents.tearDown): Make sure that all references to
9499 layers, maps and sessions are removed otherwise we may get a
9500 resource leak
9501 ("__main__"): use support.run_tests() so that more info about
9502 uncollected garbage is printed
9503
9504 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9505 session's OpenShapefile method to open shapefiles
9506 ("__main__"): use support.run_tests() so that more info about
9507 uncollected garbage is printed
9508
9509 * test/test_selection.py (TestSelection.tearDown): Make sure that
9510 all references to the session and the selection are removed
9511 otherwise we may get a resource leak
9512 (TestSelection.get_layer): Instantiate a session so that we can
9513 use it to open shapefiles.
9514 ("__main__"): use support.run_tests() so that more info about
9515 uncollected garbage is printed
9516
9517 * test/test_session.py (TestSessionBase.tearDown)
9518 (TestSessionWithContent.tearDown): Make sure that all references
9519 to the session and layers are removed otherwise we may get a
9520 resource leak
9521 (TestSessionWithContent.setUp): Use the session's OpenShapefile
9522 method to open shapefiles
9523
9524 2003-04-24 Jonathan Coles <[email protected]>
9525
9526 * Thuban/Model/load.py (XMLReader.read): Should have been checking
9527 if the file_or_filename object had the 'read' attribute.
9528
9529 2003-04-23 Jonathan Coles <[email protected]>
9530
9531 * Thuban/Model/resource.py: Fixes RTbug #1813.
9532 (ReadProjFile): Add documentation about which exceptions are raised.
9533 Always pass the exceptions up to the caller.
9534 (GetProjFiles): If the directory can't be read return an empty list.
9535 If any of the proj files can't be read skip that file and go
9536 on to the next one.
9537
9538 * test/test_proj.py: Added test cases to handle nonexistent files,
9539 unreadable files, and files that don't parse correctly.
9540
9541 2003-04-23 Jonathan Coles <[email protected]>
9542
9543 Projection dialog. Allows the user to select from a list
9544 of projection templates and optionally edit them and save new ones.
9545
9546 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9547 (ProjPanel): Base class for projection specific panels.
9548 (TMPanel): Projection panel for Transverse Mercartor.
9549 (UTMPanel): Projection panel for Universal Transverse Mercartor.
9550 (LCCPanel): Projection panel for Lambert Conic Conformal.
9551 (GeoPanel): Projetion panel for Geographic Projection.
9552
9553 2003-04-23 Jonathan Coles <[email protected]>
9554
9555 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9556 promote symmetry. There now exists XMLReader and XMLWriter.
9557 (XMLReader.read): New. Call to read the given file descriptor or
9558 filename.
9559 (XMLReader.close): New. Make sure the file is closed.
9560 (XMLReader.GetFileName): New. Return just the file name that is being
9561 read from.
9562 (XMLReader.GetDirectory): New. Return just the directory of the file
9563 that is being read.
9564 (XMLReader.AddDispatchers): New. Take a dictionary which contains
9565 the names of functions to call as the XML tree is parsed.
9566 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9567 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9568 (SessionLoader): Removed class variables start_dispatcher and
9569 end_dispatcher since this functionality is now part of a class
9570 instance. Fixes RTbug #1808.
9571 (SessionLoader.__init__): Add dispatcher functions.
9572 (load_xmlfile): Code was moved into the XMLReader.read().
9573 (load_session): Use modified SessionLoader.
9574
9575 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9576 map's projection.
9577
9578 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9579 GetAllParameters.
9580 (Projection.GetParameter): Returns the value for the given parameter.
9581
9582 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9583 (GetProjFiles): Renamed from GetProjections. Now returns a list
9584 of ProjFile objects.
9585 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9586 a list of ProjFile objects whose files are not user defined.
9587 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9588 list of ProjFile objects whose files are user defined.
9589 (ProjFileReader): Extend new XMLReader.
9590
9591 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9592 promote symmetry.
9593
9594 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9595 control instead of a wxComboBox. wxChoice controls do not generate
9596 events as the uses highlights possible choices which fixes problems
9597 with resizing the dialog when the use selects an option.
9598
9599 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9600 control instead of a wxComboBox.
9601
9602 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9603 dialog.
9604
9605 * test/test_proj.py (TestProjection.test): New tests for GetParameter
9606 method.
9607
9608 2003-04-22 Bernhard Herzog <[email protected]>
9609
9610 * Thuban/UI/mainwindow.py: Remove some unused imports and global
9611 constants
9612
9613 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9614 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9615
9616 2003-04-17 Bernhard Herzog <[email protected]>
9617
9618 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9619 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9620 anymore.
9621 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9622 (Layer.ShapeType, Layer.Shape): No need to call
9623 self.open_shapefile since it's always called in __init__
9624
9625 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9626 In wxPython 2.4 there's no need to extend MainLoop anymore since
9627 wxPython itself makes sure OnExit is called.
9628
9629 2003-04-16 Jonathan Coles <[email protected]>
9630
9631 Initial putback of projection management code. Includes new
9632 classes to read and write projection files. The current load
9633 and save classes were abstracted a bit so they could be reused.
9634 The Projection class was extended to provide new methods and
9635 have a name.
9636
9637 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9638 general XML reading methods that were part of ProcessSession.
9639
9640 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9641 name.
9642 (ProjFile): New. Represents a file that contains projection
9643 information.
9644
9645 * Thuban/Model/resource.py: New. Contains general utilities
9646 for read and writing projection files.
9647
9648 * Thuban/Model/save.py (XMLSaver): New. Contains all the
9649 general XML writing methods that were part of SessionSaver.
9650 (SessionSaver): Renamed from Saver.
9651
9652 * test/test_proj.py: New test cases for the projection
9653 file read and write functions.
9654
9655 2003-04-16 Jonathan Coles <[email protected]>
9656
9657 * Thuban/Model/classification.py: Use repr() around values
9658 in the ClassGroup*.__repr__() methods so it is clearer when
9659 a value is a string and when it is a number.
9660
9661 * test/test_load.py: Rework the classification test to test
9662 that we can load old files.
9663 (testLabels): Test a file where the groups have labels.
9664
9665 2003-04-16 Bernhard Herzog <[email protected]>
9666
9667 Safer implementation of the performance enhancements of the
9668 low-level renderer:
9669
9670 * extensions/thuban/wxproj.cpp (extract_projection)
9671 (extract_pointer): Rename extract_projection to extract_pointer
9672 and redefine its purpose to return the pointer stored in a CObject
9673 returned by the object's cobject method. Update all callers.
9674 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9675 handling of these low-level parameters so that each s_draw_info
9676 instance is handled as a CObject at python level that also
9677 contains real references to the actual python objects which
9678 contain the values in the struct. Add free_draw_info as the
9679 destructor.
9680 (draw_polygon_shape): Add the py_draw_info parameter which must a
9681 cobject containing an s_draw_info pointer.
9682
9683 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9684 method to instantiat the low-level render parameter
9685 (MapRenderer.draw_shape_layer): Use the new method. Remove some
9686 commented out code.
9687 (MapRenderer.draw_polygon_shape): Make the first parameter not the
9688 layer but the low-level render parameter
9689 (ScreenRenderer.draw_shape_layer): Use the low-level render
9690 parameter.
9691
9692 2003-04-15 Jonathan Coles <[email protected]>
9693
9694 * Thuban/Model/classification.py: Implemented __repr__ for
9695 the ClassGroup* classes to make debugging a bit easier.
9696 (ClassGroup.SetLabel): Check that the string is an instance
9697 of StringTypes not StringType. Accounts for Unicode strings.
9698
9699 * Thuban/Model/color.py: Implemented __repr__ to make
9700 debugging a bit easier.
9701
9702 * Thuban/Model/save.py (Saver.write_classification): Need to
9703 save the group label.
9704
9705 * test/test_load.py (testClassification): New. Loads the
9706 iceland_sample_test.thuban file and checks if it was loaded
9707 correctly.
9708
9709 2003-04-15 Jonathan Coles <[email protected]>
9710
9711 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9712 to improve rendering performance by initializing the variables
9713 that are not change each time draw_polygon_shape() is called.
9714 The values are stored in a global struct draw_info.
9715 (draw_polygon_shape): Removed initialization code that is
9716 now in draw_polygon_init().
9717
9718 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9719 drawing initialization call to draw_polygon_init()
9720 (MapRenderer.draw_polygon_shape): Use new signature of
9721 draw_polygon_shape.
9722
9723 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9724 weirdness by setting the range to (1, maxint).
9725
9726 * Thuban/Model/classification.py (ClassGroupProperties): Make
9727 instance variables private and optimize comparison operator
9728 by first checking if the color references are the same.
9729 (ClassGroupSingleton): Make instance variables private.
9730 (ClassGroupRange): Make instance variables private.
9731
9732 * HOWTO-Release: Filled in missing steps for releasing packages.
9733
9734 2003-04-15 Bernhard Herzog <[email protected]>
9735
9736 First stab at internationalized messages:
9737
9738 * Thuban/__init__.py (_): Implement the translation function for
9739 real using the python gettext module.
9740
9741 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
9742 translate empty strings.
9743
9744 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
9745 Add a missing space to a warning message
9746
9747 * po/README: New. Notes about the management of the translation
9748 files.
9749
9750 * po/Makefile: New. Makefile to help manage the translation files.
9751
9752 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
9753
9754 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
9755 translations and support files in po/
9756
9757 * setup.py (data_files): Add the *.mo files to the data_files too
9758
9759 * README: Add note about the translations when building from CVS
9760
9761 2003-04-14 Jonathan Coles <[email protected]>
9762
9763 * Thuban/UI/dock.py: Fixes some window resizing problems most
9764 noticable under windows. Always assume the button bitmaps will
9765 be there. Code clean up.
9766 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
9767 images for the dock/undock button to the same images.
9768 Work around for RTbug #1801.
9769
9770 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
9771 be allowed to grow within the sizer. Fixes a bug under Windows
9772 where the toolbar wasn't being drawn.
9773
9774 2003-04-14 Frank Koormann <[email protected]>
9775
9776 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
9777 Updated design to try to make the button functionality more
9778 transparent.
9779
9780 2003-04-14 Jonathan Coles <[email protected]>
9781
9782 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
9783 finalize the intialization of the panel.
9784
9785 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
9786 creation of the panel. Should be the last thing called in the
9787 initializer of a subclass.
9788
9789 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
9790 set the current selections in the combo boxes. This is needed
9791 under Windows.
9792
9793 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
9794 level panel to the dialog so that the background colors are
9795 consistent under Windows.
9796
9797 2003-04-11 Jonathan Coles <[email protected]>
9798
9799 * Thuban/UI/classgen.py: Change color ramps to start at white
9800 not black.
9801
9802 * Thuban/UI/legend.py: Enable/disable the legend buttons when
9803 the legend changes. Fixes RTbug #1793.
9804
9805 * test/test_classification.py: Added test for copying of
9806 classifications.
9807
9808 2003-04-11 Jonathan Coles <[email protected]>
9809
9810 * Thuban/UI/resource.py: New. Centralize the loading of resources
9811 such as bitmaps.
9812
9813 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
9814 added images to the move buttons, added 'reverse' button.
9815 (CustomRampPanel.__init__): Added images to the move buttons.
9816 (GreyRamp): New. Generates a ramp from white to black.
9817 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
9818
9819 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
9820 ID_PROPERTY_*.
9821 (Classifier.__init__): Minor changes to the layout.
9822 (Classifier._OnTitleChanged): Listen for when the user edits the
9823 title and update the dialog's title and the layer's title.
9824
9825 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
9826
9827 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
9828 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
9829 if the layer's title changes.
9830
9831 * Thuban/UI/mainwindow.py: Added new menu item and associated code
9832 to open a dialog to rename the map.
9833 (MainWindow): Use new resource class to import bitmaps.
9834
9835 2003-04-11 Jonathan Coles <[email protected]>
9836
9837 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
9838 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
9839 Resources/Bitmaps/group_use_none.xpm,
9840 Resources/Bitmaps/group_use_not.xpm,
9841 Resources/Bitmaps/hide_layer.xpm,
9842 Resources/Bitmaps/layer_properties.xpm,
9843 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
9844 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
9845 New.
9846
9847 2003-04-10 Jonathan Coles <[email protected]>
9848
9849 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
9850 Should pass group to ClassGroup constructor.
9851
9852 2003-04-10 Jonathan Coles <[email protected]>
9853
9854 * Thuban/Model/classification.py: (ClassGroup): Move all the common
9855 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
9856 here. Implement SetVisible(), IsVisible().
9857 (ClassGroup.__init__): Add group parameter which acts as a copy
9858 constructor.
9859
9860 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
9861 "Visible" check boxes.
9862 (Classifier): Rename the buttons and refactor the code to match
9863 the new labels.
9864
9865 * Thuban/UI/legend.py: Classify button is now called "Properties".
9866 Refactored the code to change variable names.
9867 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
9868
9869 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
9870 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
9871 renamed to MainWindow.LayerEditProperties.
9872 (MainWindow.ToggleLegend): Don't include map name in legend title.
9873 (MainWindow.SetMap): Added the map name to the window title.
9874 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
9875 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
9876 Functionality is found in the layer properties dialog.
9877
9878 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
9879 draw visible groups.
9880
9881 2003-04-09 Jonathan Coles <[email protected]>
9882
9883 * Thuban/UI/classgen.py: Modifications to allow simple
9884 addition and selection of new color schemes.
9885 (MonochromaticRamp): New. Generates a ramp between two colors.
9886 (RedRamp): New. Generates a ramp of all red.
9887 (GreenRamp): New. Generates a ramp of all green.
9888 (BlueRamp): New. Generates a ramp of all blue.
9889
9890 2003-04-09 Jonathan Coles <[email protected]>
9891
9892 * Thuban/Model/classification.py (Classification.__deepcopy__):
9893 Need to copy over field and fieldType attributes.
9894
9895 * Thuban/Model/table.py (Table.field_range): New. Retrive the
9896 maximum and minimum values over the entire table for a given
9897 field.
9898 (Table.GetUniqueValues): New. Retrieve all the unique values
9899 in the table for a given field.
9900
9901 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
9902 (GenUniquePanel): New. Controls to allow the user to select
9903 which unique field values they would like in the classification.
9904 (CustomRampPanel): Code that was in ClassGenDialog that allows
9905 the user to select the properties for a custom ramp.
9906 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
9907
9908 * Thuban/UI/classifier.py: Removed a lot of debugging code.
9909 (Classifier._SetClassification): Callback method so that the
9910 class generator can set the classification in the grid.
9911 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
9912 editing of a group properties class into a wxWindows control.
9913
9914 * Thuban/UI/dock.py: It was decided that if the user closes
9915 a dockable window the window should simply hide itself. That
9916 way if the user wants to show the dock again it appears in the
9917 same place as it was when it was closed.
9918 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
9919 (DockableWindow._OnButtonClose): Hide the window instead of
9920 destroying it.
9921 (DockableWindow._OnClose): Hide the window instead of
9922 destroying it.
9923
9924 * Thuban/UI/legend.py (LegendTree): Use a private method to
9925 consistently set the font and style of the text. Fixes RTbug #1786.
9926
9927 * Thuban/UI/mainwindow.py: Import just the Classifier class.
9928
9929 2003-04-07 Bernhard Herzog <[email protected]>
9930
9931 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
9932 to the map module
9933
9934 2003-04-07 Bernhard Herzog <[email protected]>
9935
9936 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
9937 favor of ToggleSessionTree
9938 (MainWindow.ToggleSessionTree): New method to toggle visibility of
9939 the session tree.
9940 (MainWindow.SessionTreeShown): New method to return whether the
9941 session tree is currently shown.
9942 (MainWindow.ToggleLegend): New method to toggle visibility of the
9943 legend
9944 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
9945 LegendShown
9946 (MainWindow.LegendShown): New method to return whether the legend
9947 is currently shown.
9948 (_method_command): Add checked parameter so we can define check
9949 menu items
9950 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
9951 mainwindow methods.
9952 (show_session_tree, show_legend commands): Removed.
9953 (toggle_session_tree, toggle_legend commands): New commands to
9954 toggle the visibility of the dialogs
9955
9956 2003-04-07 Jonathan Coles <[email protected]>
9957
9958 * Thuban/UI/classgen.py: Fix Windows problem.
9959
9960 * Thuban/UI/dock.py: Fix Windows problem.
9961
9962 * Thuban/UI/mainwindow.py: Use False instead of false.
9963 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
9964
9965 2003-04-07 Jonathan Coles <[email protected]>
9966
9967 Since we now say that the order of the groups in a classification
9968 matters, it makes sense to be able to manipulate that order. Most
9969 of the changes to Thuban/Model/classification.py are to that end.
9970
9971 * Thuban/Model/classification.py (Classification.AppendGroup,
9972 Classification.InsertGroup, Classification.ReplaceGroup,
9973 Classification.RemoveGroup, Classification.GetGroup): Do as the
9974 names imply.
9975 (Classification.FindGroup): This was called GetGroup, but GetGroup
9976 takes an index, while FindGroup takes a value.
9977 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
9978 REFERENCE. Currently there is a cyclic reference between the layer
9979 and its classification. If the classification doesn't need to know
9980 its owning layer we can change this, since it may make sense to be
9981 able to use the same classification with different layers.
9982
9983 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
9984
9985 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
9986 not AddGroup()
9987
9988 * Thuban/UI/classifier.py: Now that we can depend on the order in
9989 a Classification and have methods to manipulate that order we don't
9990 need to use our own data structures in the grid. We can simply make
9991 the grid/table access the information they need from a copy of
9992 the classification object.
9993 (Classifier._OnCloseBtn): Event handler for when the user clicks
9994 'Close'. This is needed so if the user applies changes and then
9995 continues to change the table the user has the option of discarding
9996 the most recent changes and keeping what they applied.
9997
9998 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
9999 into the same group.
10000
10001 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
10002 with a really old version of proj, PJ_VERSION won't even be defined.
10003 If it isn't defined then just compile so that the function always
10004 returns Py_False.
10005
10006 * test/test_classification.py: Fix tests to use the renamed methods.
10007 Still need to write tests for the new methods.
10008
10009 2003-04-04 Jonathan Coles <[email protected]>
10010
10011 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
10012 call to SetSelection out of the method and before the call
10013 to __SelectField in __init__. This prevents a recursion of events
10014 when _OnFieldSelect is triggered by the user.
10015
10016 2003-04-04 Jonathan Coles <[email protected]>
10017
10018 * Thuban/Model/classification.py: Rename Color.None to
10019 Color.Transparent.
10020 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
10021 Don't bother copying the color, since Colors are immutable.
10022
10023 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
10024 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
10025 Thuban/UI/renderer.py, Thuban/UI/view.py:
10026 Rename Color.None to Color.Transparent.
10027
10028 * test/test_classification.py, test/test_load.py: Rename Color.None
10029 to Color.Transparent.
10030
10031 2003-04-04 Jonathan Coles <[email protected]>
10032
10033 * Thuban/Model/classification.py: Fix assert calls.
10034 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
10035 Copy the color parameter rather than hold onto a reference.
10036
10037 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
10038 the color object.
10039 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
10040 are sure there exists only one refernce to Color.None in the system.
10041 This allows us to use 'is' rather than the comparision functions.
10042
10043 * Thuban/Model/save.py: Fix assert calls.
10044
10045 * Thuban/UI/classifier.py: Fix assert calls.
10046 (ClassGrid._OnCellDClick): Call up to the classifier to open the
10047 dialog to edit the groups properties.
10048 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
10049 correctly if a cell is resized.
10050 (ClassTable.SetClassification): New. Changes the classification
10051 that is in the table.
10052 (ClassTable.__SetRow): Allow groups to be prepended.
10053 (Classifier): New code for opening the EditProperties and
10054 GenerateRanges dialogs.
10055 (SelectPropertiesDialog.__GetColor): Only set the color in the
10056 color dialog if the current color is not None.
10057
10058 * Thuban/UI/dock.py: Fix assert calls.
10059
10060 * Thuban/UI/legend.py: Fix assert calls.
10061
10062 * Thuban/UI/renderer.py: Fix assert calls.
10063
10064 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
10065 classifications.
10066 (GenRangePanel): Panel specific to range generation.
10067 (GenSingletonPanel): Panel specific to singleton generation.
10068 (ClassGenerator): Class responsible for actually generating
10069 the classification from the data gathered in the dialog box.
10070 (PropertyRamp): Generates properties whose values range from
10071 a starting property to an ending property.
10072
10073 2003-04-03 Bernhard Herzog <[email protected]>
10074
10075 * test/support.py (print_garbage_information): New function that
10076 prints information about still connected messages and memory
10077 leaks.
10078 (run_suite): Removed.
10079 (run_tests): New function for use as a replacement of
10080 unittest.main in the test_* files. This one calls
10081 print_garbage_information at the end.
10082
10083 * test/runtests.py (main): Use support.print_garbage_information
10084
10085 * test/test_layer.py: Use support.run_tests instead of
10086 unittest.main so we get memory leak information
10087 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
10088 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
10089 (TestLayerLegend.test_visibility): Call the layer's Destroy method
10090 to fix a memory leak.
10091
10092 * test/test_classification.py: Use support.run_tests instead of
10093 unittest.main so we get memory leak information
10094 (TestClassification.test_classification): Call the layer's Destroy
10095 method to fix a memory leak.
10096
10097 2003-04-02 Bernhard Herzog <[email protected]>
10098
10099 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
10100 Handle the reference counts of the return value and errors in
10101 PyArg_ParseTuple correctly.
10102
10103 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
10104 sure the filename is absolute to avoid problems when saving the
10105 session again
10106
10107 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
10108
10109 2003-04-01 Jonathan Coles <[email protected]>
10110
10111 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
10112 that there actually are points in the returned list of points
10113 before trying to index into the list. The list may be empty if
10114 the shape is a Null Shape.
10115
10116 2003-04-01 Bernhard Herzog <[email protected]>
10117
10118 * test/test_map.py: Don't use from <module> import *
10119
10120 2003-04-01 Jonathan Coles <[email protected]>
10121
10122 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
10123 LAYER_LEGEND_CHANGED
10124
10125 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
10126 self.Destroy() to close the window after yesterday's changes.
10127
10128 * test/test_map.py, test/test_session.py: Fix messages that
10129 are sent from maps and layers.
10130
10131 2003-03-31 Jonathan Coles <[email protected]>
10132
10133 * Thuban/UI/classifier.py: Commented out some debugging statements.
10134 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
10135 RTbug #1769.
10136
10137 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
10138 position (although position doesn't work yet under GTK).
10139 (DockableWindow.Destroy): New. Called when the window must be
10140 closed. Namely needed when the DockFrame closes and must close
10141 its children.
10142 (DockFrame): Listen for EVT_CLOSE and destroy all children.
10143
10144 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
10145 when then window is told to close.
10146 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
10147 comment in source for more info.
10148
10149 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
10150
10151 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
10152 symmetry with other such methods.
10153 (MainWindow.ShowLegend): Show the legend docked by default.
10154
10155 2003-03-28 Jonathan Coles <[email protected]>
10156
10157 * Thuban/UI/classifier.py: Support for highlighting a specific
10158 group within the grid when the classification dialog is opened.
10159 Also contains a lot of debugging printouts which will later
10160 be removed.
10161
10162 * Thuban/UI/dock.py: Complete rework on the dock code so that
10163 that it is fairly removed from the rest of the Thuban application.
10164 It is easy to add new docks which the rest of the program having
10165 to be aware of them.
10166
10167 * Thuban/UI/legend.py: Modifications to support selecting a
10168 specific group in the classification dialog. Changed how layers
10169 are drawn when the layer is visible/invisible.
10170
10171 * Thuban/UI/mainwindow.py: Removed legend specific code and
10172 replaced it with calls to the new dock code.
10173
10174 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
10175 to check if scale > 0. Trying to track down a divide by zero.
10176
10177 2003-03-26 Jonathan Coles <[email protected]>
10178
10179 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
10180 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
10181 now part of DockableWindow.
10182 (LegendPanel.DoOnSelChanged): Select the current layer in the
10183 map.
10184 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
10185 with the selected layer and/or group.
10186
10187 2003-03-26 Jonathan Coles <[email protected]>
10188
10189 This putback contains the code for dockable windows. There is
10190 no support in wxWindows as of this date for windows that can
10191 attach themselves to other windows.
10192
10193 The current model contains a DockableWindow which has a parent
10194 window for when it is detached and a dock window that it puts
10195 its contents in when it is docked. The contents of a DockableWindow
10196 must be a DockPanel. DockPanel itself derives from wxPanel.
10197
10198 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
10199 message, not a LAYER_LEGEND_CHANGED message.
10200
10201 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
10202
10203 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10204 as one of the style properties for the fieldTypeText item to
10205 be sure that its size is correct when the text changes.
10206
10207 * Thuban/UI/dock.py: New. Classes for the DockPanel and
10208 DockableWindow.
10209
10210 * Thuban/UI/legend.py: Added some more buttons and made the
10211 LegendPanel a DockPanel.
10212
10213 * Thuban/UI/mainwindow.py: Added sash windows to the main window
10214 and supporting functions for manipulating the sashes.
10215 (MainWindow.ShowLegend): Create a DockableWindow with the
10216 LegendPanel as the contents.
10217
10218 * Thuban/UI/messages.py: Added DOCKABLE_* messages
10219
10220 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10221 not LAYER_LEGEND_CHANGED, messages.
10222
10223 2003-03-25 Jonathan Coles <[email protected]>
10224
10225 * setup.py: Added custom script bdist_rpm_build_script so that
10226 when the rpm is built the path to wx-config is correct.
10227
10228 * setup.cfg: Added line saying to use the custom build script
10229
10230 2003-03-20 Jonathan Coles <[email protected]>
10231
10232 Initial implementation of the Legend.
10233
10234 * Thuban/UI/legend.py: New. Creates a window that shows the map's
10235 Legend information and allows the user to add/modify classifications
10236 and how the layers are drawn on the map.
10237
10238 * setup.py: New command 'build_docs' which currently uses
10239 happydoc to generate html documentation for Thuban.
10240
10241 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10242 Returns a string which is appropriately describes the group.
10243
10244 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10245 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10246
10247 * Thuban/Model/map.py (Map): Rename messages and use new, more
10248 specific, messages.
10249
10250 * Thuban/Model/messages.py: New message to indicate that a layer's
10251 data has changed (LAYER_CHANGED). New map messages to indicate
10252 when layers have been added/removed/changed or if the stacking order
10253 of the layers has changed.
10254
10255 * Thuban/Model/session.py: Rename and use new messages.
10256
10257 * Thuban/UI/classifier.py: Remember if any changes have actually
10258 been applied so that if the dialog is cancelled without an application
10259 of changes we don't have to set a new classification.
10260 (ClassDataPreviewer): Pulled out the window specific code and put it
10261 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10262 symbols on any DC.
10263
10264 * Thuban/UI/mainwindow.py: New code to open the legend.
10265
10266 * Thuban/UI/view.py: Use new message names.
10267
10268 2003-03-19 Jonathan Coles <[email protected]>
10269
10270 * Thuban/UI/main.py (verify_versions): New. Checks the versions
10271 of Python, wxPython, and some other libraries.
10272
10273 * extensions/thuban/wxproj.cpp (check_version): Checks the given
10274 version against what wxproj was compiled with.
10275 (check_version_gtk): If wxproj was compiled with gtk then check
10276 the given version against the version of the gtk library
10277 currently being used.
10278
10279 2003-03-14 Bernhard Herzog <[email protected]>
10280
10281 * test/test_command.py: Run the tests when the module is run as a
10282 script
10283
10284 2003-03-14 Bernhard Herzog <[email protected]>
10285
10286 Implement selection of multiple selected shapes in the same layer:
10287
10288 - Introduce a new class to hold the selection. This basically
10289 replaces the interactor which was nothing more than the
10290 selection anyway. A major difference is of course that the new
10291 selection class supports multiple selected shapes in one layer
10292
10293 - Move the object that represents the selection from the
10294 application to the canvas. The canvas is a better place than the
10295 application because the selection represents which shapes and
10296 layer of the map displayed by the canvas are selected and
10297 affects how the map is drawn.
10298
10299 - Make the selection and its messages publicly available through
10300 the mainwindow.
10301
10302 - The non-modal dialogs do not get a reference to the interactor
10303 anymore as they can simply refer to their parent, the
10304 mainwindow, for the what the interactor had to offer.
10305
10306 * Thuban/UI/selection.py: New module with a class to represent the
10307 selection.
10308
10309 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10310 these unused messages
10311
10312 * Thuban/UI/application.py (ThubanApplication.OnInit)
10313 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10314 interactor is gone now.
10315 (ThubanApplication.CreateMainWindow): There is no interactor
10316 anymore so we pass None as the interactor argument for now for
10317 compatibility.
10318
10319 * Thuban/UI/view.py (MapCanvas.delegated_messages)
10320 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10321 Unsubscribe, delegate messages according to the delegated_messages
10322 class variable.
10323 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10324 attributes from instance variables as described with the
10325 delegated_methods class variable.
10326 (MapCanvas.__init__): New instance variable selection holding the
10327 current selection
10328 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10329 pass them on to the renderer
10330 (MapCanvas.SetMap): Clear the selection when a different map is
10331 selected.
10332 (MapCanvas.shape_selected): Simple force a complete redraw. The
10333 selection class now takes care of only issueing SHAPES_SELECTED
10334 messages when the set of selected shapes actually does change.
10335 (MapCanvas.SelectShapeAt): The selection is now managed in
10336 self.selection
10337
10338 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10339 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10340 Unsubscribe, delegate messages according to the delegated_messages
10341 class variable.
10342 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10343 attributes from instance variables as described with the
10344 delegated_methods class variable.
10345 (MainWindow.__init__): The interactor as ivar is gone. The
10346 parameter is still there for compatibility. The selection messages
10347 now come from the canvas.
10348 (MainWindow.current_layer, MainWindow.has_selected_layer):
10349 Delegate to the the canvas.
10350 (MainWindow.LayerShowTable, MainWindow.Classify)
10351 (MainWindow.identify_view_on_demand): The dialogs don't need the
10352 interactor parameter anymore.
10353
10354 * Thuban/UI/tableview.py (TableFrame.__init__)
10355 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10356 (LayerTableFrame.row_selected): The interactor is gone. It's job
10357 from the dialog's point of view is now done by the mainwindow,
10358 i.e. the parent. Subscribe to SHAPES_SELECTED instead
10359 of SELECTED_SHAPE
10360
10361 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10362 is gone. It's job from the dialog's point of view is now done by
10363 the mainwindow, i.e. the parent.
10364
10365 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10366 gone. It's job from the dialog's point of view is now done by the
10367 mainwindow, i.e. the parent.
10368
10369 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10370 gone. It's job from the dialog's point of view is now done by the
10371 mainwindow, i.e. the parent.
10372 (SessionTreeCtrl.__init__): New parameter mainwindow which is
10373 stored as self.mainwindow. The mainwindow is need so that the tree
10374 can still subscribe to the selection messages.
10375 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10376 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10377 selection is now accessible through the mainwindow. Subscribe to
10378 SHAPES_SELECTED instead of SELECTED_SHAPE
10379
10380 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10381 SHAPES_SELECTED message now.
10382 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10383 so deal with multiple shapes
10384 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10385 gone. It's job from the dialog's point of view is now done by the
10386 mainwindow, i.e. the parent.
10387
10388 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10389 parameter is now a list of shape ids.
10390 (RecordTable.SetTable): The second parameter is now a list of
10391 indices.
10392
10393 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10394 selected_shape parameter and ivar to selected_shapes. It's now a
10395 list of shape ids.
10396 (MapRenderer.draw_label_layer): Deal with multiple selected
10397 shapes. Rearrange the code a bit so that the setup and shape type
10398 distinctions are only executed once.
10399
10400 * test/test_selection.py: Test cases for the selection class
10401
10402 2003-03-11 Jonathan Coles <[email protected]>
10403
10404 * Thuban/Model/load.py: Temporary fix so that the xml reader
10405 doesn't cause Thuban to crash.
10406
10407 * Thuban/Model/layer.py: Handle the cyclic references between
10408 a layer and its classification better, and be sure to disconnect
10409 the classification from the layer when the layer is destroyed
10410 so that we don't maintain a cyclic reference that may not be
10411 garbage collected.
10412
10413 * Thuban/Model/classification.py: See comment for layer.py.
10414
10415 2003-03-12 Jan-Oliver Wagner <[email protected]>
10416
10417 * HOWTO-Release: New. Information on the steps for releasing
10418 a new version of Thuban.
10419
10420 2003-03-11 Jonathan Coles <[email protected]>
10421
10422 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10423 Use True instead of true.
10424 (Classifier): Should have a single panel in which all the controls lie.
10425
10426 * Thuban/UI/proj4dialog.py: Add normal border.
10427
10428 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10429
10430 * Thuban/UI/mainwindow.py: Use True instead of true.
10431
10432 * setup.py: Update some definitions to use wxWindows2.4 files
10433
10434 * Data/iceland_sample_class.thuban: Fixed file so that the
10435 field_type information is present.
10436
10437 2003-03-10 Jonathan Coles <[email protected]>
10438
10439 * Thuban/UI/classifier.py (Classifier.__init__): Make the
10440 field type label grow so that when the text changes the
10441 size is updated correctly. This may be a wxWindows bug.
10442
10443 2003-03-10 Jonathan Coles <[email protected]>
10444
10445 * Thuban/UI/application.py: Changed SESSION_CHANGED to
10446 SESSION_REPLACED.
10447
10448 * Thuban/UI/classifier.py: Wrap text with _().
10449 (ClassGrid.CreateTable): Set dimensions and size hints here,
10450 instead of in Reset, so we only set the size once.
10451
10452 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10453
10454 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10455 Call Close() instead of Shutdown().
10456
10457 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10458
10459 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10460 Go back to using OnClose() instead of Shutdown().
10461
10462 2003-03-10 Jonathan Coles <[email protected]>
10463
10464 * Thuban/UI/classifier.py (Classifier): SelectField() needed
10465 to know the old field index as well as the new one.
10466
10467 2003-03-10 Jonathan Coles <[email protected]>
10468
10469 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10470 to correctly set the table information and call this from
10471 __init__ and from _OnFieldSelect so that all the information
10472 is up to date when the dialog opens and when a field is changed.
10473
10474 2003-03-10 Jonathan Coles <[email protected]>
10475
10476 * Thuban/Model/classification.py (Classification): Don't use
10477 layer's message function directly, use the ClassChanged() method
10478 when then classification changes. SetField/SetFieldType/SetLayer
10479 must keep the information about field name and field type in
10480 sync when an owning layer is set or removed.
10481
10482 * Thuban/Model/layer.py: Added ClassChanged() so that the
10483 classification can tell the layer when its data has changed.
10484 (Layer.SetClassification): Accepts None as an arguement to
10485 remove the current classification and correctly handles
10486 adding a new classification.
10487
10488 * Thuban/Model/load.py: Comment out print statement
10489
10490 * test/test_classification.py, test/test_save.py: New and
10491 improved tests.
10492
10493 2003-03-07 Jonathan Coles <[email protected]>
10494
10495 * Thuban/Model/classification.py: Implemented __copy__ and
10496 __deepcopy__ for ClassGroup* and ClassGroupProperites so
10497 they can easily be copied by the classifier dialog.
10498 (ClassGroupProperites.__init__): The default line color should
10499 have been Color.Black.
10500
10501 * Thuban/UI/classifier.py: Setting and Getting table values now
10502 uses a consistent set of functions.
10503 (Classifier): Now non-modal. Has field type label which changes
10504 as the field changes. Keep track of buttons in a list so that
10505 we can enable/disable the buttons when the None field is selected.
10506 (SelectPropertiesDialog): Add buttons to make the colors transparent.
10507
10508 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10509 does what OnClose did, but can be called by the application to
10510 close a window. Needed when a session changes, and we have to
10511 close the classifier windows.
10512
10513 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10514 Shuts down open dialogs. Used when a new session is created
10515 or a session is opened.
10516 (MainWindow.SaveSession): Should only call application.SaveSession()
10517 if we don't call SaveSessionAs first.
10518 (MainWindow.Classify): Allow different classifier dialogs for
10519 different layers.
10520
10521 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10522 the parent class handle it. Add Shutdown() to unsubscibe from
10523 event notification and call the parent Shutdown(). This was
10524 necessary so the application can close the tree window.
10525
10526 2003-03-06 Jonathan Coles <[email protected]>
10527
10528 * Thuban/Model/classification.py: Minor documentation changes,
10529 Addition of __eq__ and __ne__ methods.
10530 (Classification.SetLayer): prevent recursion between this method
10531 and Layer.SetClassification().
10532
10533 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10534
10535 * Thuban/Model/layer.py (SetClassification): prevent recursion
10536 between this method and Classification.SetLayer().
10537
10538 * test/test_classification.py, test/test_load.py,
10539 test/test_session.py: Fixed and added tests for the classification
10540 classes.
10541
10542 2003-03-06 Bernhard Herzog <[email protected]>
10543
10544 * Thuban/UI/classifier.py (ClassGrid.__init__)
10545 (ClassGrid.CreateTable): Move the SetSelectionMode call to
10546 CreateTable because otherwise it triggers an assertion in
10547 wxPython/wxGTK 2.4.
10548
10549 2003-03-05 Jonathan Coles <[email protected]>
10550
10551 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10552
10553 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10554
10555 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10556
10557 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10558
10559 2003-03-05 Jonathan Coles <[email protected]>
10560
10561 * Thuban/UI/classifier.py: Added class documentation.
10562 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10563 Store just the groups in the table and generate the other
10564 column information when it is requested. Add "None" field
10565 to pull-down to select no classification.
10566
10567 * Thuban/common.py: Moved FIELDTYPE constants from table.py
10568 (Str2Num): Only catch ValueError exceptions.
10569
10570 * Thuban/Model/classification.py: Class documentation. Renaming
10571 of methods with Stroke to Line. Groups are stored in a single
10572 list with the default as the first element. Groups are searched
10573 in the order they appear in the list.
10574
10575 * Thuban/Model/color.py: Documentation.
10576
10577 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10578 the kind of data represented by a field.
10579
10580 * Thuban/Model/load.py (ProcessSession): Use proper string
10581 conversion function; fixes RTbug #1713.
10582
10583 * Thuban/Model/save.py (Saver): Store field type information.
10584
10585 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10586 (Table): Add field_info_by_name() to retrieve field information
10587 by specifying the field name, not the number.
10588
10589 * Thuban/UI/mainwindow.py: Function name changes.
10590
10591 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10592 get the layer classification once. Don't try to classify
10593 values when the field is None: just use the default properties.
10594
10595 * Thuban/UI/view.py: Function name changes.
10596
10597 * Doc/thuban.dtd: Add field_type attribute to a classification.
10598
10599 2003-03-04 Bernhard Herzog <[email protected]>
10600
10601 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10602 the fill and stroke layer attributes optional with suitable
10603 default values. Add the stroke_width layer attribute. Use correct
10604 syntax for empty elements. Make the attribute list for labels
10605 refer to the label element.
10606
10607 2003-03-04 Bernhard Herzog <[email protected]>
10608
10609 * setup.py (thuban_build_py.build): Add a comment about distutils in
10610 Python 2.3 containing some of the functionality we implement in
10611 setup.py ourselves.
10612
10613 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10614 before the selection mode. Doing it the other way round triggers
10615 an assertion in wxWindows.
10616
10617 * Thuban/Model/save.py (escape): Fix typo in doc-string
10618
10619 * Thuban/Model/classification.py: Remove unnecessary wxPython
10620 import
10621
10622 2003-03-04 Jonathan Coles <[email protected]>
10623
10624 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10625 Parameter 'value' should default to None.
10626
10627 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10628 the class attribute __classification is now private.
10629
10630 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10631 Classifier to ClassGrid. Added support for removing selected rows,
10632 which including code for keeping track of when cells are selected,
10633 and deselected.
10634 (ClassTable): Support for added/removing rows. Fixed a problem
10635 with __ParseInput whereby it would not allow strings (only numbers)
10636 to be entered.
10637 (Classifier): Added button and supporting code for removing
10638 selected rows.
10639
10640 2003-02-27 Jonathan Coles <[email protected]>
10641
10642 * Thuban/common.py: Moved color conversion functions into
10643 Thuban/UI/common.py.
10644 (Str2Num): Now converts the float (not the string) to a long/int
10645 so that an exception isn't thrown.
10646
10647 * Thuban/UI/common.py: Common functions used in several UI modules
10648
10649 * Thuban/Model/classification.py: Changed the class hierarchy
10650 so that a Classification consists of Groups which return
10651 Properties when a value matches a Group.
10652
10653 * Thuban/Model/layer.py: Fixed name resolution problem.
10654
10655 * Thuban/Model/load.py: Use new Classification and Group functions.
10656
10657 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10658 failure.
10659 (Saver.write_classification): Use new Classification and Group
10660 functions.
10661
10662 * Thuban/UI/classifier.py: Changes to use new Classification and Group
10663 functions. Fix to create a tuple with a single value instead of
10664 simply returning the value.
10665
10666 * Thuban/UI/renderer.py: Use new Classification and Group functions.
10667 Use common.py functions.
10668
10669 * Thuban/UI/tree.py: Use common.py functions.
10670
10671 * test/test_classification.py: Use new Classification and Group
10672 classes.
10673
10674 2003-02-24 Jonathan Coles <[email protected]>
10675
10676 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10677 functions from Thuban color objects to wxWindow colour objects.
10678
10679 * Thuban/Model/classification.py (Classification): Renamed
10680 GetProperties() to GetClassData(). Used the new iterator
10681 in TreeInfo().
10682 (ClassIterator): Iterator implementation to iterate over the
10683 ClassData objects in a classification object.
10684
10685 * Thuban/Model/save.py (Saver.write_classificaton): Uses
10686 the new iterator to save the classification information.
10687
10688 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10689 for changing the stroke and fill colors and previewing the
10690 changes.
10691
10692 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10693 MainWindow.SaveSessionAs): Text string changes so the dialogs
10694 have more meaningful titles.
10695
10696 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10697 Classification method name from GetProperties to GetClassData.
10698
10699 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10700 instead of accessing now non-existent class variables.
10701
10702 2003-02-24 Bernhard Herzog <[email protected]>
10703
10704 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10705 unneeded Shape() call. Rendering is substantially faster without
10706 it and it avoids some problems with broken shape files.
10707
10708 2003-02-20 Frank Koormann <[email protected]>
10709
10710 Force minimal size of identify and label dialogs. The autosizing
10711 looked too ugly.
10712
10713 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10714 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10715 Set size of listctrl.
10716 * Thuban/UI/identifyview.py (IdentifyView.__init__):
10717 Set size of dialog.
10718
10719 2003-02-19 Jonathan Coles <[email protected]>
10720
10721 * test/test_classification.py, test/test_layer.py,
10722 test/test_load.py, test/test_map.py, test/test_session.py:
10723 Updated the tests to use the new functions that are in the
10724 respective classes.
10725
10726 * Thuban/Model/classification.py (Classification):
10727 Uses the new ClassData* classes. Modification messages are
10728 passed up to the parent layer (if it exists).
10729 (ClassData): New class to encapsulate the common data in each
10730 classification property.
10731 (ClassDataDefault): Represents the Default class. data.
10732 (ClassDataPoint): Represents a single class. data point
10733 (ClassDataRange): Represents a class. range
10734 (ClassDataMap): Represents a class. map (unused).
10735
10736 * Thuban/Model/color.py: Added Color.None to represent something
10737 with no color. Color.Black represents the color black.
10738 (NoColor): Helper class derived from Color to represent something
10739 with no color.
10740
10741 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
10742 stroke_width attributes. Made the 'classification' attribute private.
10743 New methods for setting/getting the classification.
10744
10745 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
10746 to get the classifcation and use the new ClassData* classes to
10747 hold the classification data. Use Str2Num to convert numbers
10748 properly.
10749
10750 * Thuban/Model/save.py (Saver): Use new Color and Classification
10751 methods
10752
10753 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
10754 custom grid.
10755 (ClassTable): Support for editing Values and Labels and for
10756 changing what type (point or range) of data is stored in each
10757 property based on how the user enters the data.
10758 (Classifier): Support for saving the new classifications and
10759 launching the dialog to edit a property.
10760 (SelectPropertiesDialog): New class for editing the visual
10761 properties of a classification (stroke color, width, and fill color)
10762 (ClassPreviewer): Took the Draw method from ClassRenderer and
10763 made most of it into this new class. Intend to use this class in
10764 the SelectPropertiesDialog for previewing changes.
10765
10766 * Thuban/UI/renderer.py: Use new Color and Classification methods.
10767
10768 * Thuban/UI/tree.py: Formatting changes.
10769
10770 * Doc/thuban.dtd: Add 'label' element
10771
10772 * Thuban/common.py: New. Contains common routines used throughout
10773 the code.
10774 (Str2Num): Takes a string and converts it to the "best" type of
10775 number.
10776
10777 2003-02-14 Bernhard Herzog <[email protected]>
10778
10779 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
10780 dragging flag is always set to 0 even when the tool implementation
10781 raises an exception
10782
10783 2003-02-11 Bernhard Herzog <[email protected]>
10784
10785 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
10786 method to create a splash screen.
10787 (ThubanApplication.ShowMainWindow): New. Show the main window.
10788 Needed so the splash screen can display the mainwindow
10789 (ThubanApplication.OnInit): Call the
10790 new splash_screen method to determine whether the application
10791 should display a splash screen. If it displays a splash screen do
10792 not immediately show the main window.
10793
10794 2003-02-11 Jonathan Coles <[email protected]>
10795
10796 * Thuban/Model/classification.py: Added import line to fix
10797 feature conflicts between running on python2.2 and python2.1.
10798
10799 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
10800 onto the clinfo parameter, so removed the deepcopy().
10801
10802 2003-02-10 Jonathan Coles <[email protected]>
10803
10804 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
10805 Added element_open variable to track opening and closing of tags
10806 so that tags that don't span more than one line are closed with
10807 /> instead of </tag_name>. Use the GetDefault*() methods of
10808 the Classification class.
10809
10810 * Thuban/Model/classification.py (Classificaton): Added set and
10811 get methods for the default data. The class also takes a layer
10812 reference so that modification messages can be sent. Fixed the
10813 methods to use the new ClassData class.
10814 (ClassData): New class to encapsulate the classification data
10815
10816 * Thuban/Model/layer.py (Layer): Remove the
10817 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
10818 SetDefault*() methods on the layer's classification object.
10819 (Layer.__init__): Use the new SetDefault*() methods in the
10820 Classification class.
10821
10822 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
10823 object instead of a dictionary.
10824
10825 * Thuban/UI/classifier.py (ClassRenderer): New class to
10826 draw the classifications in the dialog box's table.
10827 (Classifier): Modified to use the ClassRenderer class.
10828
10829 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
10830 methods of the Classification class.
10831
10832 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
10833 of the ClassData class.
10834
10835 * test/test_classification.py, test/test_layer.py,
10836 test/test_map.py, test/test_session.py: Fix the tests to work
10837 with the above code changes.
10838
10839 2003-02-03 Jonathan Coles <[email protected]>
10840
10841 * Thuban/Model/classification.py (Classification): Added getNull()
10842 to return the NullData reference
10843
10844 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
10845 Layer.SetStrokeWidth): Modified these functions to change the
10846 null data in the classification rather than keep these values
10847 directly in the Layer class. Menu options to change these values
10848 work again.
10849
10850 2003-01-28 Jonathan Coles <[email protected]>
10851
10852 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
10853 Fixed crashing problem on some systems. Dialog box shows
10854 classification data.
10855
10856 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
10857 Colors in the tree view.
10858
10859 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
10860 the tree info for classifications. Commented out unnecessary lines.
10861
10862 * Thuban/Model/classification.py (Classification.TreeInfo): New
10863 function to add information about the classification into the
10864 tree view.
10865
10866 2003-01-27 Jan-Oliver Wagner <[email protected]>
10867
10868 * Thuban/__init__.py (_): New.
10869
10870 * Thuban/Model/classification.py, Thuban/Model/extension.py,
10871 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
10872 Thuban/Model/session.py, Thuban/UI/application.py,
10873 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
10874 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
10875 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
10876 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
10877 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
10878
10879 2003-01-27 Jonathan Coles <[email protected]>
10880
10881 * Thuban/Model/layer.py: Classification initialization calls.
10882
10883 * Thuban/Model/classification.py: Created class to encapsulate
10884 a layer classification. Supports specific data points and
10885 ranges.
10886
10887 * Thuban/Model/load.py: Added support for loading classification
10888 information.
10889
10890 * Thuban/Model/save.py: Added support for saving classification
10891 information.
10892
10893 * Thuban/UI/classifier.py: Initial class for a dialog box for
10894 specifying classification information.
10895
10896 * Thuban/UI/mainwindows.py: Support for opening the classifier
10897 dialog.
10898
10899 * Thuban/UI/renderer.py: Support for drawing a layer with the
10900 classification information.
10901
10902 * Data/iceland_sample_class.thuban: iceland_sample with
10903 classification data.
10904
10905 * test/test_classification: Tests for the Classification class.
10906
10907 2002-12-09 Bernhard Herzog <[email protected]>
10908
10909 * test/test_command.py: New. Tests for the command classes.
10910
10911 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
10912 (Command.IsTool): New method to distinguish between command
10913 switching tools and other commands.
10914
10915 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
10916 the tool to avoid direct assignments to instance variables
10917 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
10918 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
10919 change the tool
10920
10921 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
10922 active tool's command turns insensitive, disable the tool.
10923 (_tool_command): Use the new ToolCommand class
10924
10925 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
10926 SelectTool method to change the tool
10927 (iconfile): Use the ToolCommand class
10928
10929 2002-12-03 Bernhard Herzog <[email protected]>
10930
10931 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
10932 the case of selected items that are not children of Layers or Maps
10933 properly. Previously this bug would trigger an assertion in
10934 wxWindows.
10935
10936 2002-11-06 Frank Koormann <[email protected]>
10937
10938 * Thuban/UI/mainwindow.py: Altered the order of tools in the
10939 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
10940 Full Extent).
10941
10942 2002-10-23 Bernhard Herzog <[email protected]>
10943
10944 * setup.py (setup call): version now 0.1.3
10945
10946 * MANIFEST.in: Add the files in test/
10947
10948 * test/README: Add note about tests requiring the iceland data
10949
10950 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
10951 copyright notice.
10952
10953 2002-10-18 Bernhard Herzog <[email protected]>
10954
10955 * test/test_map.py
10956 (TestMapWithContents.test_projected_bounding_box): Use an explicit
10957 epsilon.
10958
10959 * test/support.py (FloatComparisonMixin.assertFloatEqual)
10960 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
10961 message if the assertion fails and don't return the return value
10962 of self.assert_. In assertFloatSeqEqual the return meant that not
10963 all items of the sequence were compared.
10964
10965 2002-09-20 Bernhard Herzog <[email protected]>
10966
10967 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
10968
10969 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
10970
10971 * test/test_map.py (TestMapWithContents.test_tree_info): Create
10972 the string with the bounding box on the fly because of platform
10973 differences in the way %g is handled.
10974
10975 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
10976 DBFfile too because Thuban layers can't yet cope missing DBF
10977 files.
10978
10979 2002-09-20 Bernhard Herzog <[email protected]>
10980
10981 * test/test_menu.py: Use initthuban instead of
10982 add_thuban_dir_to_path to initialize Thuban.
10983
10984 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
10985 Mixin class for float comparisons
10986 (SubscriberMixin): New. Mixin class to test messages sent through
10987 the Connector class
10988
10989 * test/README: Fix a typo and add the -v flag to the command for
10990 individual tests
10991
10992 * test/test_session.py: New. Test cases for Thuban.Model.session
10993
10994 * test/test_proj.py: New. Test cases for Thuban.Model.proj
10995
10996 * test/test_map.py: New. Test cases for Thuban.Model.map
10997
10998 * test/test_layer.py: New. Test cases for Thuban.Model.layer
10999
11000 * test/test_label.py: New. Test cases for Thuban.Model.label
11001
11002 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
11003
11004 * test/test_color.py: New. Test cases for Thuban.Model.color
11005
11006 * test/test_base.py: New. Test cases for Thuban.Model.base
11007
11008 2002-09-13 Bernhard Herzog <[email protected]>
11009
11010 * Thuban/Model/session.py (Session.forwarded_channels): Forward
11011 the CHANGED channel too.
11012
11013 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
11014 CHANGED channel too.
11015 (Map.__init__): Call the Modifiable constructor as well.
11016
11017 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
11018 event if the modified flag changes.
11019 (Modifiable.changed): Tweak the doc-string.
11020
11021 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
11022 (MainWindow.set_position_text): Put the code that puts the text
11023 with the mouse position into the status bar into the new method
11024 set_position_text so that it can overwritten in derived classes.
11025
11026 2002-09-12 Bernhard Herzog <[email protected]>
11027
11028 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
11029 message box on the main window.
11030
11031 2002-09-11 Bernhard Herzog <[email protected]>
11032
11033 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
11034 the 'E' because it's less likely to interfere with other menu
11035 entries.
11036 (MainWindow.build_menu): remove an incorrect comment.
11037
11038 2002-09-10 Bernhard Herzog <[email protected]>
11039
11040 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
11041 (_tool_command): Add sensitive parameter
11042 (_has_visible_map): Sensitivity callback to tools and other
11043 commands that require a visible map. Use it in map_zoom_in_tool,
11044 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
11045 and map_full_extent
11046
11047 2002-09-06 Bernhard Herzog <[email protected]>
11048
11049 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
11050 VIEW_POSITION
11051
11052 2002-09-04 Frank Koormann <[email protected]>
11053
11054 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
11055
11056 2002-09-02 Bernhard Herzog <[email protected]>
11057
11058 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
11059 wxWindows already and our implementation doesn't work correctly
11060 with wxGTK 2.3:
11061 (MapCanvas.__init__): Remove the instance variable
11062 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
11063 be drawin
11064 (MapCanvas.OnIdle): Removed.
11065
11066 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
11067 a parameter to determine the size of the rectangle.
11068 (MapCanvas.find_shape_at): Create the box around the point on a
11069 layer by layer basis and make the size depend on the shape type.
11070 This solves a problem with the selection of point shapes at the
11071 border of the layer's bounding box
11072
11073 2002-08-30 Bernhard Herzog <[email protected]>
11074
11075 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
11076 for the sensitivity of remove layer.
11077 (_can_remove_layer): New. Sensitivity callback for remove layer
11078 (Command layer_remove): Use _can_remove_layer
11079
11080 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
11081 determine whether a given layer can be deleted.
11082
11083 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
11084 (MapCanvas.do_redraw): Get rid of the unused update_region
11085 instance variable
11086
11087 * Thuban/UI/view.py: Add/update some doc-strings.
11088
11089 * test/: new subdirectory with a bunch of unit tests.
11090
11091 * test/README, test/test_table.py, test/test_save.py,
11092 test/test_menu.py, test/test_load.py: Initial set of tests and
11093 brief instructions on how to run them
11094
11095 2002-08-29 Bernhard Herzog <[email protected]>
11096
11097 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
11098 arcs with multiple parts.
11099
11100 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
11101 Handle degenrate rectangles.
11102
11103 * Thuban/Model/table.py: Make writing records work correctly:
11104 (Table.__init__): Keep track of whether the DBF is open for
11105 writing
11106 (Table.write_record): Open the DBF file for writing when necessary
11107
11108 2002-08-27 Bernhard Herzog <[email protected]>
11109
11110 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
11111 dbf files only for reading by default. Use a new writable dbf
11112 object for writing.
11113
11114 2002-08-26 Bernhard Herzog <[email protected]>
11115
11116 * Thuban/UI/mainwindow.py: Refactor the context creation:
11117 (MainWindow.Context): New method to return a context
11118 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
11119 new method
11120
11121 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
11122 layer table specific code from TableGrid into LayerTableGrid
11123 (TableFrame, LayerTableFrame): Split the layer table specific code
11124 from TableFrame into LayerTableFrame
11125 (LayerTableGrid.select_shape): Remove a debug print
11126
11127 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
11128 LayerTableFrame
11129
11130 2002-08-23 Bernhard Herzog <[email protected]>
11131
11132 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
11133 absolute filename.
11134
11135 2002-08-22 Bernhard Herzog <[email protected]>
11136
11137 * Thuban/Model/table.py (Table.write_record): New method to write
11138 records.
11139 (Table.__init__): Open the DBF file for writing too.
11140
11141 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
11142 into the underlying table.
11143
11144 * extensions/shapelib/shapefil.h (DBFCommit),
11145 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
11146 commit any changes made to the DBF file.
11147
11148 * Thuban/UI/mainwindow.py (make_check_current_tool)
11149 (_tool_command): Put the code that generates the "checked"
11150 callback into a separate function so that we can reuse it
11151 elsewhere
11152
11153 * Thuban/Model/save.py (Saver): New class to handle serializing a
11154 session into an XML file. The main reason to introduce a class is
11155 that applications built on Thuban can derive from it so that they
11156 can save additional information in a session file.
11157 (save_session): Delegate almost all the work to the Saver class.
11158 Rename the filename argument to file because it may be a file like
11159 object now.
11160
11161 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
11162 code. Remove the little test code which would be executed when the
11163 module is run as a script which didn't work anymore since it can't
11164 import the other Thuban modules.
11165 (ProcessSession, load_session): Refactor the ProcessSession to
11166 have one method for each element start and end tag so that derived
11167 classes can easily override the processing of individual tags.
11168 Also, always parse with namespaces enabled because applications
11169 built on top of Thuban will likely use namespaces if they extend
11170 the session file format.
11171
11172 2002-08-21 Bernhard Herzog <[email protected]>
11173
11174 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
11175 because thubaninit_contents will do it for us.
11176
11177 2002-08-16 Jan-Oliver Wagner <[email protected]>
11178
11179 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
11180 tree window already open
11181
11182 2002-08-15 Bernhard Herzog <[email protected]>
11183
11184 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
11185 with self.
11186
11187 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
11188 when we have actually captured it.
11189
11190 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
11191 shapefile and destroy the table.
11192
11193 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
11194
11195 2002-08-14 Bernhard Herzog <[email protected]>
11196
11197 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
11198 instance variable columns
11199 (RecordTable.GetTypeName): row and col may be negative in some
11200 cases.
11201
11202 * setup.py (InstallLocal.initialize_options)
11203 (InstallLocal.finalize_options, InstallLocal.user_options): New
11204 option create-init-file to build a thubaninit.py when running
11205 install_local
11206 (InstallLocal.run): Create the thubaninit.py module when requested
11207 (thubaninit_contents): Split the template into several parts and
11208 create a new function thubaninit_contents that creates the
11209 contents of a thubaninit module.
11210 (ThubanInstall.run): Use the new function to create the thubaninit
11211 module.
11212
11213 2002-07-30 Bernhard Herzog <[email protected]>
11214
11215 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
11216 cleanup.
11217 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
11218
11219 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
11220 direct base class' Destroy method.
11221
11222 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
11223 layers.
11224 (Map.Destroy): Destroy the label_layer as well and call the
11225 inherited Desatroymethod first so that no more messages are
11226 issued.
11227 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
11228 message if the stacking order actually has changed. Add
11229 doc-strings.
11230 (Map.BoundingBox): Correct the doc-string.
11231 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
11232 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
11233
11234 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
11235 all labels.
11236
11237 2002-07-29 Bernhard Herzog <[email protected]>
11238
11239 * Thuban/Model/map.py (Map.subscribe_layer_channels)
11240 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
11241 to a layer's channels into separate methods.
11242 (Map.RemoveLayer, Map.AddLayer): Call the new methods
11243 (Map.Destroy): Unsubscribe from a layer's channels before
11244 destroying it.
11245
11246 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
11247 selected_layer parameter to searched_layer which is the layer to
11248 search in.
11249 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
11250 search to that layer. Return the selected layer and shape.
11251
11252 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
11253 typo
11254
11255 2002-07-24 Bernhard Herzog <[email protected]>
11256
11257 * Thuban/UI/application.py (ThubanApplication.create_session):
11258 Extend the doc string.
11259 (ThubanApplication.subscribe_session)
11260 (ThubanApplication.unsubscribe_session): New methods to
11261 subscribe/unsubscribe to/from session channels.
11262 (ThubanApplication.SetSession): Call the new methods here.
11263 (ThubanApplication.maps_changed, ThubanApplication.set_map):
11264 Renamed set_map to maps_changed. Its now a subscriber for
11265 MAPS_CHANGED.
11266
11267 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
11268 x-coordinate in case of simple clicks
11269
11270 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
11271 don't pass it as a parameter
11272
11273 * Thuban/Model/session.py (Session.RemoveMap): New
11274
11275 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
11276 window size into a parameter.
11277
11278 2002-07-23 Bernhard Herzog <[email protected]>
11279
11280 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
11281 just commands.
11282
11283 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
11284 parameter list a bit to allow setting the window title and the
11285 initial message in the status bar. Update the callers.
11286
11287 * Thuban/UI/application.py (ThubanApplication.OnInit)
11288 (ThubanApplication.CreateMainWindow): Put the mainwindow
11289 instantiation into a separate method so that it can be overridden
11290 by a subclass.
11291
11292 2002-07-19 Bernhard Herzog <[email protected]>
11293
11294 * Thuban/Model/session.py: Issue a CHANGED message every time
11295 another changed message is issued to make it easier to get
11296 notified of changes.
11297 (Session): Update the doc string
11298 (Session.forward): Issue changed-events as CHANGED as well.
11299 (Session.changed): Overwrite the inherited version to issue
11300 CHANGED events as well.
11301
11302 * Thuban/UI/tree.py: We can now simply subscribe to the session's
11303 CHANGED channel to be informed of changes.
11304 (SessionTreeCtrl.session_channels): Not needed any longer.
11305 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11306 Only have to (un)subscribe CHANGED
11307
11308 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
11309
11310 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
11311 for the wxPython locale bug to __init__.py so that it's
11312 automatically executed by anybody using UI code from Thuban.
11313
11314 2002-07-18 Bernhard Herzog <[email protected]>
11315
11316 * Thuban/UI/main.py (main): app no longer needs to be global
11317
11318 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
11319 as parameter and store it in an instance variable
11320 (MainWindow.invoke_command, MainWindow.update_command_ui)
11321 (MainWindow.save_modified_session, MainWindow.NewSession)
11322 (MainWindow.OpenSession, MainWindow.SaveSession)
11323 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
11324 application object.
11325
11326 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
11327 the main window with self.
11328
11329 * Thuban/UI/context.py: New module with the context class
11330
11331 * Thuban/UI/command.py (Command): Update doc string.
11332
11333 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
11334 MainWindow.update_command_ui): Pass an instance of the context
11335 class to the command's methods
11336 (check_current_tool, call_method): Handle the new context
11337 implementation
11338
11339 * Examples/simple_extensions/simple_tool.py (simple_tool,
11340 check_simple_tool): Handle the new context implementation
11341
11342 * Examples/simple_extensions/simple_command.py (simple_command):
11343 Handle the new context implementation. Update the comments about
11344 the context.
11345
11346 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
11347 doc-string
11348 (ThubanApplication.Session): New method to return the session
11349 object
11350
11351 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
11352 interactor's selected_layer may not be a layer of the current
11353 session when the tree is updated while a new session is being set.
11354
11355 2002-07-17 Bernhard Herzog <[email protected]>
11356
11357 * Thuban/UI/tree.py (color_string): Removed. No longer used.
11358 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
11359 update_tree into update_tree and add_items. The tree now uses a
11360 more generic way to display the contents of the tree.
11361 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
11362
11363 * Thuban/Model/layer.py (Layer.TreeInfo),
11364 Thuban/Model/extension.py (Extension.TreeInfo),
11365 Thuban/Model/map.py (Map.TreeInfo),
11366 Thuban/Model/session.py (Session.TreeInfo):
11367 Add TreeInfo methods to implement the new tree view update scheme
11368
11369 2002-07-16 Bernhard Herzog <[email protected]>
11370
11371 * Thuban/UI/application.py: Don't use "import from" for the
11372 MainWindow. It can't always be resolved.
11373 (ThubanApplication.OnInit): change reference to MainWindow
11374 accordingly.
11375
11376 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
11377 completely
11378
11379 2002-07-10 Bernhard Herzog <[email protected]>
11380
11381 * setup.py (create_init_module): New configurable variable whose
11382 default depends on the platform we're running on.
11383 (ThubanInstall.initialize_options): Initialize
11384 self.create_init_module from the global create_init_module
11385 (ThubanInstall.user_options): indictate that the options
11386 create-init-module and init-module-dir have arguments.
11387
11388 * setup.py: In the setup call change the version number to include
11389 cvs.
11390
11391 * MANIFEST.in: Add the files in Examples
11392
11393 2002-07-09 Bernhard Herzog <[email protected]>
11394
11395 * setup.py: In the setup call, use the thuban homepage as the
11396 value of the url parameter.
11397
11398 * Examples: New subdirectory for examples.
11399
11400 * Examples/simple_extensions/simple_tool.xpm,
11401 Examples/simple_extensions/simple_tool.py,
11402 Examples/simple_extensions/simple_command.py,
11403 Examples/simple_extensions/README: Simple examples showing how to
11404 add new commands and tools.
11405
11406 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
11407 bdist_rpm that we also have an install script.
11408 (bdist_inno): Add 2002 to the copyright notice.
11409
11410 * setup.py: Create a file in python's site-packages directory to
11411 make installation of Thuban as a library easier.
11412 (ThubanInstall.user_options): Add two new options,
11413 create-init-module and init-module-dir
11414 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
11415 filenames for installation in the default directories.
11416 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
11417 the inherited methods to capture some filenames before they're
11418 transformed too much by distutils.
11419 (ThubanInstall.run): Create the init module if requested.
11420 (ThubanInstall.thuban_init_filename): New method to return the
11421 full name of the init module.
11422 (ThubanInstall.get_outputs): Append the filename of the init
11423 module.
11424
11425 2002-07-08 Bernhard Herzog <[email protected]>
11426
11427 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
11428 handle the prefix properly which means that the default for the
11429 installation prefix should be /usr for RPMs and /usr/local when
11430 doing a normal source install.
11431 (bdist_rpm_install_script): Script to override the default install
11432 commands in the specfile generated by the bdist_rpm command.
11433 (thuban_bdist_rpm.user_options): Add a prefix option
11434 (thuban_bdist_rpm.initialize_options): Init the prefix option.
11435 Create the script files for the spec files as empty files here
11436 (thuban_bdist_rpm._make_spec_file): Override the inherited method
11437 to fill the script files with content.
11438
11439 * Thuban/Model/save.py (relative_filename): Wrapper around
11440 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
11441 argument. save_session now automatically uses this version,
11442 solving a problem when saving to a relative filename.
11443
11444 * setup.py: In the setup call, make sure that the library
11445 directories are under $prefix/lib not directly under $prefix.
11446
11447 2002-06-20 Jan-Oliver Wagner <[email protected]>
11448
11449 * Thuban/Model/extension.py: new module to handle extension objects.
11450 * Thuban/Model/messages.py: new messages for extensions.
11451 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
11452 Session.AddExtension): new for handling extensions.
11453 Also some other minor changes to round up extension handling.
11454 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
11455 of Extension titles and title and names of its objects.
11456
11457 2002-05-29 Bernhard Herzog <[email protected]>
11458
11459 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
11460 the events for a command.
11461 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
11462 Call bind_command_events to bind the events. add_toolbar_command
11463 can now bind events too so that it's possible to have commands
11464 that are only available through the toolbar.
11465 (MainWindow.init_ids): New instance variable events_bound to keep
11466 track of for which commands events have been bound.
11467
11468 2002-05-28 Bernhard Herzog <[email protected]>
11469
11470 * Thuban/UI/menu.py: New module to build and manage menus.
11471
11472 * Thuban/UI/mainwindow.py: Remove some unused imports.
11473 (MainWindow.__init__, main_menu): move the definition of the main
11474 menu from __init__ to the Menu instance main_menu.
11475 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
11476 build the menu bar and sub-menus from a menu description.
11477
11478 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
11479 startup file
11480 (ThubanApplication.read_startup_files): New method to run
11481 ~/.thuban/thubanstart.py
11482
11483 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
11484 Move the toolbar definition to the Menu instance main_toolbar.
11485 (MainWindow.build_toolbar): New method to build the toolbar
11486 similar to the build_menu methods
11487
11488 2002-05-23 Bernhard Herzog <[email protected]>
11489
11490 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
11491 layer_outline_color. Fix it in the definition of the command too.
11492
11493 * Thuban/UI/command.py (Command): Fix typo in doc string
11494
11495 2002-05-22 Bernhard Herzog <[email protected]>
11496
11497 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
11498 in the docstring
11499
11500 2002-05-15 Bernhard Herzog <[email protected]>
11501
11502 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
11503 when the shapefile is empty.
11504 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
11505 now return None for empty shapefiles. Update doc-strings.
11506
11507 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
11508 the layer's bbox being None.
11509
11510 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
11511 layer's bbox being None.
11512
11513 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
11514 necessary.
11515 (MapCanvas.__init__): New instance variables, last_selected_layer
11516 and last_selected_shape to determine how the selection has
11517 changed.
11518
11519 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
11520 AutoSizeColumns because it will cause a traversal of the entire
11521 table which for large .dbf files will take a very long time.
11522
11523 2002-05-14 Bernhard Herzog <[email protected]>
11524
11525 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11526 maximum depth for the tree than shapelib does by default.
11527
11528 2002-05-10 Bernhard Herzog <[email protected]>
11529
11530 * setup.py (py_modules): The shptree modules doesn't have a
11531 wrapper, so don't include it in the py_modules
11532
11533 2002-05-08 Bernhard Herzog <[email protected]>
11534
11535 * extensions/shapelib/shptree.c (compare_ints): Make arguments
11536 const void * as in the qsort prototype
11537 (SHPTreeFindLikelyShapes): Remove some unused variables.
11538
11539 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11540 maintains to redraw the window during a drag.
11541 (MapCanvas.unprojected_rect_around_point): New method to determine
11542 a small region around a point for hit-testing.
11543 (MapCanvas.find_shape_at): Only test the shapes in a small region
11544 around the point.
11545
11546 * setup.py: Increment the version to 0.1.2
11547
11548 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11549 debug print and set session to None after unsubscribing
11550
11551 2002-05-07 Bernhard Herzog <[email protected]>
11552
11553 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11554 the file to have a .thuban extension.
11555
11556 * Thuban/UI/tree.py (session_channels): New class constant with
11557 all the session channels to subscribe to to update the tree
11558 (SessionTreeCtrl.session_changed): Remember the session so that we
11559 can unsubscribe properly. Use the new class constant to
11560 unsubscribe from the old session and subscribe to the new one.
11561 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11562 subscriptions of the SessionTreeCtrl.
11563 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11564
11565 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11566 Session Tree" command to the file menu.
11567
11568 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11569 as update_region to the renderer.
11570
11571 * Thuban/UI/renderer.py
11572 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11573 update box is now directly a tuple, not a wxRect anymore.
11574
11575 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11576 prints.
11577
11578 2002-05-07 Bernhard Herzog <[email protected]>
11579
11580 * setup.py: Add the shptree extension module. See
11581 extensions/pyshapelib/ChangeLog for more details.
11582
11583 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11584 extensions/shapelib/dbfopen.c: Really update to the versions of
11585 shapelib 1.2.9. For some reason it wasn't really done on
11586 2002-04-11.
11587
11588 * extensions/shapelib/shptree.c: Modified version of shptree.c of
11589 shapelib 1.2.9. The only real difference is the use of qsort
11590 instead of a bubble sort implementation
11591
11592 * Thuban/Model/layer.py (Layer.__init__): New instance variable
11593 shapetree to hold the shapelib quadtree for the shapefile
11594 (Layer.open_shapefile): Create the quad tree.
11595 (Layer.ShapesInRegion): New method to return the ids of shapes in
11596 a given region using the quad tree.
11597
11598 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11599 comment
11600 (draw_polygon_shape): Accept both arcs and polygons.
11601 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11602 the api.
11603
11604 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11605 return the shape ids to be rendered in a given layer.
11606 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
11607 ids. Use draw_polygon_shape to draw arc shapes as well.
11608 (ScreenRenderer.RenderMap): New parameter for the rectangle that
11609 has to be updated
11610 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
11611 calling it's ShapesInRegion method.
11612
11613 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
11614 update_region for the update region.
11615 (MapCanvas.OnPaint): Maintain the update region
11616 (MapCanvas.do_redraw): Pass the bounding box of the update_region
11617 to the renderer when drawing the bitmap. Reset the update_region.
11618
11619 2002-05-03 Bernhard Herzog <[email protected]>
11620
11621 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
11622 MainWindow.OpenSession): Change the file extension of the session
11623 files to .thuban
11624
11625 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
11626 Move the map channels to be forwarded by the session into the
11627 class constant with forwarded_channels. Also add
11628 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
11629 forwarded_channels
11630
11631 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
11632 typo and some rewording).
11633
11634 2002-05-02 Bernhard Herzog <[email protected]>
11635
11636 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
11637 around to speed up most redraws:
11638 (MapCanvas.__init__): New instance variable bitmap which holds the
11639 bitmap
11640 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
11641 self.bitmap to draw.
11642 (MapCanvas.full_redraw): New method to force a full redraw
11643 including the bitmap
11644 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
11645 make sure the bitmap is redrawn.
11646 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
11647 MapCanvas.shape_selected): Call full_redraw instead of readraw to
11648 make sure the bitmap is redrawn.
11649 (MapCanvas.OnSize): New method to handle size events so that the
11650 bitmap can be redrawn.
11651
11652 2002-04-29 Bernhard Herzog <[email protected]>
11653
11654 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
11655 canvas' VIEW_POSITION event
11656 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
11657 Update the text in the status-bar accordingly.
11658
11659 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
11660 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
11661 called.
11662 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
11663 current_position
11664 (MapCanvas.set_current_position): New method to set
11665 current_position. Issue a VIEW_POSITION event
11666 (MapCanvas.CurrentPosition): New public method to return the value
11667 of current_position. Should be called when the VIEW_POSITION event
11668 is processed.
11669 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
11670 Update the position.
11671 (MapCanvas.OnLeaveWindow): Set the position to None.
11672
11673 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11674 position in the statusbar
11675
11676 2002-04-26 Frank Koormann <[email protected]>
11677
11678 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11679
11680 2002-04-24 Frank Koormann <[email protected]>
11681
11682 * Resources/Bitmaps/identify.xpm: shadow added
11683
11684 * Resources/Bitmaps/fullextent.xpm: new
11685
11686 2002-04-22 Jan-Oliver Wagner <[email protected]>
11687
11688 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11689 box
11690
11691 2002-04-21 Jan-Oliver Wagner <[email protected]>
11692
11693 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11694
11695 * Thuban/UI/tree.py (update_tree): added added map extent
11696
11697 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11698 icon; added map_full_extend as tool
11699
11700 2002-04-19 Jan-Oliver Wagner <[email protected]>
11701
11702 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11703 saving _new_ sessions
11704
11705 * Thuban/Model/session.py (create_empty_session): new session
11706 don't have a filename (set to None)
11707
11708 * Thuban/UI/tree.py (update_tree): added filename and modified flag
11709
11710 * Thuban/Model/load.py (ProcessSession): convert projection
11711 parameters from unicode to regular string
11712
11713 * Data/iceland_sample.session: Added UTM Zone 26 projection.
11714
11715 2002-04-11 Bernhard Herzog <[email protected]>
11716
11717 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
11718 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
11719 1.2.9
11720
11721 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
11722 the pyshapelib directoy into the list of include dirs, so that
11723 pyshapelib_api.h can be found.
11724
11725 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
11726 holds the pyshapelib C-API
11727 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
11728 pyshapelib_api to access the shapelib functions.
11729 (initwxproj): Import the c_api from the shapelib module and
11730 initialize pyshapelib_api.
11731
11732 2002-04-04 Bernhard Herzog <[email protected]>
11733
11734 * setup.py (thuban_bdist_rpm.initialize_options): Use
11735 initialize_options to create the scripts for the rpm.
11736
11737 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
11738
11739 2002-04-03 Bernhard Herzog <[email protected]>
11740
11741 * setup.py: Increment version to 0.1.1
11742
11743 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
11744 Layer" and "Remove Layer" commands from the layer menu to the map
11745 menu
11746
11747 2002-02-15 Bernhard Herzog <[email protected]>
11748
11749 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
11750 argument (python <= 1.5.2 erroneously accepted multiuple
11751 arguments)
11752
11753 2002-02-04 Bernhard Herzog <[email protected]>
11754
11755 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
11756 RecordGrid in the identifyview.
11757 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
11758 IdentifyListCtrl. The grid allows editing of the values.
11759
11760 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
11761 implementing a grid for a single row of a thuban table.
11762
11763 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
11764 layers by default. Easier to use than the previous default of only
11765 searching through the select layer which meant that if no layer
11766 was selected, you couldn't select a shape.
11767
11768 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
11769
11770 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
11771 stroke_width attribute
11772
11773 * Thuban/Model/save.py (save_session): Write the new stroke_width
11774 attribute
11775
11776 * Thuban/Model/load.py (ProcessSession.startElement): Read the
11777 stroke_width attribute
11778
11779 * Thuban/Model/layer.py (Layer.__init__): New parameter and
11780 instance variable stroke_width
11781 (Layer.SetStrokeWidth): Set the stroke_width.
11782
11783 2002-02-01 Bernhard Herzog <[email protected]>
11784
11785 * extensions/thuban/wxproj.cpp (project_points): Fix two
11786 off-by-one errors in the last loop that joins the various parts
11787 together.
11788
11789 2002-01-14 Bernhard Herzog <[email protected]>
11790
11791 * setup.py (data_dist.make_distribution): Fix some typos
11792
11793 2001-09-18 Bernhard Herzog <[email protected]>
11794
11795 * README: Slight tweaking in preparation for the 0.1 release
11796
11797 * setup.cfg: Add section for sdist to create both tgz and zip
11798 archives
11799
11800 * setup.py: increase version number to 0.1
11801 (data_dist): New command class for data distribution
11802
11803 2001-09-14 Bernhard Herzog <[email protected]>
11804
11805 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
11806 Handle the case of no layer (i.e. layer is None) properly.
11807
11808 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
11809 Set the initial selection of the combo boxes to reflect the
11810 projection we're starting with in a way that works on windows,
11811 too.
11812
11813 * Thuban/Lib/connector.py (Connector.print_connections): Print the
11814 puiblisher's ids in hex to make it easier to compare them to the
11815 standard repr of python methods
11816
11817 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
11818 messages
11819
11820 2001-09-13 Bernhard Herzog <[email protected]>
11821
11822 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
11823 deselect the layer if no layer is selected
11824
11825 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
11826 idle time when there actually is something to draw. If there's
11827 nothing to draw simply clear the window
11828 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
11829 (MapCanvas.SetMap): force a redraw in all cases because
11830 FitMapToWindow doesn't always do it.
11831 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
11832 specify the point to move into the center of the window
11833 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
11834 dragged, zoon in/out by a factor of 2
11835 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
11836 index, i.e. reversed drawing order) so that objects appearing to
11837 be in from of others are selected first. This is probably mostly
11838 relevant for point shapes where the symbols used may overlap
11839
11840 * Thuban/Model/session.py (create_empty_session): Unset the
11841 modified bit before returning it
11842
11843 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
11844 create_empty_session session to create the new, empty session.
11845
11846 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
11847 the tool bitmaps.
11848 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
11849 the code that asks whether the session should be saved into the
11850 new method save_modified_session.
11851 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
11852 method to save modified session here too.
11853
11854 2001-09-11 Bernhard Herzog <[email protected]>
11855
11856 * setup.py (InnoIconItem): fix typo
11857
11858 (thuban_bdist_inno.run):
11859 (bdist_inno.run): Move the decision not to create symlinks on
11860 non-nt platforms to thuban_bdist_inno and do it unconditinally
11861 since we never want to create the symlinks here
11862
11863 2001-09-10 Bernhard Herzog <[email protected]>
11864
11865 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
11866 identify view immediately
11867
11868 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
11869 and SelectableRecordListCtrl that implement the code shared by the
11870 identify view and the label dialog
11871
11872 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
11873 new class RecordListCtrl
11874
11875 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
11876 return value of GetValue is None instead of using it as a boolean
11877 directly so that Zero numbers are handled properly.
11878 (LabelListCtrl): Derive from the new class
11879 SelectableRecordListCtrl
11880
11881 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
11882 (Proj4Dialog.dialogLayout): Make the window resizable and set the
11883 size of the text control explicitly to make the sizers work on
11884 both Windows and X.
11885
11886 2001-09-07 Bernhard Herzog <[email protected]>
11887
11888 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
11889 that can limit the search to the currently selected layer.
11890 (MapCanvas.SelectShapeAt): Make sure that the currently selected
11891 layer stays selected even when no shape is found
11892 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
11893 height do nothing (avoids zero division errors)
11894
11895 2001-09-06 Bernhard Herzog <[email protected]>
11896
11897 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
11898 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
11899 convenient :-)
11900 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
11901 a new instvar layer_to_item to map layers to tree items
11902 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
11903 to match the current selection in the interactor
11904
11905 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
11906 (Interactor.HasSelectedLayer): New methods to query the current
11907 selection
11908
11909 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
11910 (MainWindow.has_selected_layer): Simply call the appropriate
11911 interactor method
11912
11913 * Thuban/UI/mainwindow.py (MainWindow.__init__):
11914 (MainWindow.LayerShowTable):
11915 (MainWindow.identify_view_on_demand): Store the interactor in an
11916 instvar and use that reference instead of going through main.app
11917
11918 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
11919 * Thuban/UI/application.py (ThubanApplication.OnInit):
11920 * Thuban/UI/main.py (main): Create the session tree view in main
11921 with the new mainwindow method ShowSessionTree and not directly
11922 the application's OnInit method
11923
11924 * Thuban/UI/tree.py (myTreeCtrlPanel):
11925 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
11926 TreeCtrl isntead of a panel. This affects most method since we now
11927 refer to self instead of self.tree
11928 (SessionTreeView): New class implementing a non-modal dialog
11929 showing the session tree.
11930
11931 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
11932 layer to the tableview dialog.
11933
11934 * Thuban/UI/tableview.py: Add some doc-strings
11935 (TableGrid):
11936 (TableGrid.OnRangeSelect):
11937 (TableGrid.OnSelectCell):
11938 (TableFrame.__init__):
11939 (TableFrame.row_selected):
11940 Selecting rows in the grid view now updates the selected shapes
11941 through the TableFrame. To achieve this we derive TableGrid from
11942 Publisher and introduce the message type ROW_SELECTED which the
11943 TableFrame subscribes to and which is issued by OnRangeSelect and
11944 OnSelectCell
11945
11946 (DataTable.SelectRow): Removed because it's no longer needed in
11947 the row/shape selection scheme
11948
11949 * Thuban/UI/dialogs.py: New file implementing common classes for
11950 dialogs
11951
11952 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
11953 the SELECTED_SHAPE message anymore. This is now handled by the
11954 parent.
11955 (TableGrid.select_shape): Only update the selection if the shape
11956 is not None.
11957 (TableFrame): Inherit from the new NonModalDialog class.
11958 (TableFrame.__init__, TableFrame.select_shape): Handle the
11959 SELECT_SHAPE message.
11960 (TableFrame.OnClose): Extend the inherited method to unsubscribe
11961 SELECT_SHAPE
11962
11963 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
11964 (MainWindow.add_dialog):
11965 (MainWindow.dialog_open):
11966 (MainWindow.remove_dialog):
11967 (MainWindow.get_open_dialog): New methods to maintain a dictionary
11968 of opened non-modal dialogs.
11969
11970 (MainWindow.__init__): Initialize the new non-modal dictionary
11971 management code
11972 (MainWindow.LayerShowTable): maintain separate dialogs for each
11973 table using the non-modal dialog management code to only open a
11974 view once for each table.
11975
11976 (MainWindow.IdentifyTool):
11977 (MainWindow.__init__):
11978 (MainWindow.identify_view_on_demand): Don't open the identify view
11979 in IdentifyTool anymore. This will be done automatically by the
11980 new method identify_view_on_demand which handles the
11981 SELECTED_SHAPE message so that the identify view will be opened on
11982 demand
11983
11984 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
11985 the interactor argument. The SELECTED_SHAPE message is now handled
11986 by the parent.
11987 (IdentifyView.__init__): Add the interactor argument so that we
11988 can handle the SELECTED_SHAPE message here
11989 (IdentifyView.selected_shape): New method to handle the
11990 SELECTED_SHAPE messages
11991
11992 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
11993 NonModalDialog class
11994 (IdentifyView.OnClose): Extend the inherited version to
11995 unsubscribe SELECT_SHAPE
11996
11997 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
11998
11999 2001-09-05 Bernhard Herzog <[email protected]>
12000
12001 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
12002
12003 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
12004 interactor to pass through to the MapCanvas
12005
12006 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
12007 argument to the MainWindow constructor to get rid of the ugly hack
12008 that made main.app available early just so that the mapcanvas
12009 could access the interactor object.
12010
12011 2001-09-04 Bernhard Herzog <[email protected]>
12012
12013 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
12014 that runs a modal message box
12015 (MainWindow.OnClose): Use the new method
12016 (MainWindow.RemoveLayer): Just do nothing in case no layer is
12017 selected. The command should be grayed out anyway, so there's no
12018 need to pop up a message box.
12019 (MainWindow.AddLayer): Pop up a message box with an error message
12020 if the shape file can't be opened
12021
12022 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
12023 immediately. This will cause an exception in case the file can't
12024 be opened and we can display an appropriate message.
12025
12026 * MANIFEST.in: Add extensions/pyprojection/LICENSE
12027
12028 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
12029 specific bdist_rpm command.
12030
12031 * Thuban/UI/main.py: Catch ImportError exceptions when importing
12032 the locale module because it may not be available on some
12033 installations.
12034
12035 * extensions/pyprojection/LICENSE: Copy of the license text in
12036 Projection.i. Having it in a separate file makes it easier to
12037 refer to license text in e.g. RPMs
12038
12039 2001-09-03 Bernhard Herzog <[email protected]>
12040
12041 * setup.py: use wx-config instead of wxgtk-config because it's
12042 more generic
12043
12044 * setup.py (ThubanInstall.get_outputs): Add the symlink in
12045 <prefix>/bin to the outputs
12046 (ThubanInstall.link_file): New method to link files. We need this
12047 because the standard copy_files refuses to link non-existing
12048 files.
12049 (ThubanInstall.run): Remove the leading install root from the
12050 script filename if an install root was specified and use the new
12051 link_file method
12052
12053 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
12054 the window when the first layer is added to the map.
12055
12056 * setup.py (ThubanInstall.run): Honor the build root (self.root)
12057 when linking thuban.py to <prefix>/bin
12058
12059 2001-08-31 Bernhard Herzog <[email protected]>
12060
12061 * setup.py: In the setup call, the install parameters shouldn't
12062 have trailing slashes because distutils on non-posix platforms
12063 doesn't like that. The same applies to other directories like
12064 "Resources/Bitmaps"
12065
12066 In the configuration section for nt, move the wxWindows directory
12067 optins into the part clearly marked as editable.
12068
12069 (InstallLocal.initialize_options):
12070 (InstallLocal.user_options): remove the currently unused debug
12071 flag
12072 (thuban_build_py.find_all_modules): Add this method so that it
12073 works for our case of having packages and modules in one
12074 distribution as well.
12075 (ThubanInstall.initialize_options):
12076 (ThubanInstall.finalize_options):
12077 (ThubanInstall.user_options):
12078 (ThubanInstall.boolean_options): Add new options, do-symlink and
12079 extra files. Since these are the first ThubanInstall specific
12080 options, override user_options and boolean_options
12081 (ThubanInstall.run): Honor the new do-symlink and extra-files
12082 options.
12083 (ThubanInstall.get_outputs): Add to override the base-class's
12084 version and add the extra-files to the outputs
12085 (bdist_inno): New class for windows distributions with Inno Setup
12086 (InnoIconItem): Helper class for bdist_inno
12087 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
12088 this together with the appropriate parameters, to the setup call.
12089
12090 * setup.cfg (bdist_inno): added new section for the inno setup
12091 installer
12092
12093 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
12094 changing_selection to avoid recursive selection events when
12095 modifying the selection in response to a selection event.
12096 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
12097 changing the tree's selection.
12098 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
12099 we're not being called indirectly from normalize_selection.
12100
12101 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
12102 event.Check only if the command is actuall checkable.
12103 (MainWindow.__init__): Call the toolbar's Realize method to make
12104 sure that the items are actually shown
12105
12106 2001-08-28 Bernhard Herzog <[email protected]>
12107
12108 * setup.py: Fix some doc strings
12109
12110 * ChangeLog: started
12111

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26