1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 8464 8465 8466 8467 8468 8469 8470 8471 8472 8473 8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484 8485 8486 8487 8488 8489 8490 8491 8492 8493 8494 8495 8496 8497 8498 8499 8500 8501 8502 8503 8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514 8515 8516 8517 8518 8519 8520 8521 8522 8523 8524 8525 8526 8527 8528 8529 8530 8531 8532 8533 8534 8535 8536 8537 8538 8539 8540 8541 8542 8543 8544 8545 8546 8547 8548 8549 8550 8551 8552 8553 8554 8555 8556 8557 8558 8559 8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618 8619 8620 8621 8622 8623 8624 8625 8626 8627 8628 8629 8630 8631 8632 8633 8634 8635 8636 8637 8638 8639 8640 8641 8642 8643 8644 8645 8646 8647 8648 8649 8650 8651 8652 8653 8654 8655 8656 8657 8658 8659 8660 8661 8662 8663 8664 8665 8666 8667 8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679 8680 8681 8682 8683 8684 8685 8686 8687 8688 8689 8690 8691 8692 8693 8694 8695 8696 8697 8698 8699 8700 8701 8702 8703 8704 8705 8706 8707 8708 8709 8710 8711 8712 8713 8714 8715 8716 8717 8718 8719 8720 8721 8722 8723 8724 8725 8726 8727 8728 8729 8730 8731 8732 8733 8734 8735 8736 8737 8738 8739 8740 8741 8742 8743 8744 8745 8746 8747 8748 8749 8750 8751 8752 8753 8754 8755 8756 8757 8758 8759 8760 8761 8762 8763 8764 8765 8766 8767 8768 8769 8770 8771 8772 8773 8774 8775 8776 8777 8778 8779 8780 8781 8782 8783 8784 8785 8786 8787 8788 8789 8790 8791 8792 8793 8794 8795 8796 8797 8798 8799 8800 8801 8802 8803 8804 8805 8806 8807 8808 8809 8810 8811 8812 8813 8814 8815 8816 8817 8818 8819 8820 8821 8822 8823 8824 8825 8826 8827 8828 8829 8830 8831 8832 8833 8834 8835 8836 8837 8838 8839 8840 8841 8842 8843 8844 8845 8846 8847 8848 8849 8850 8851 8852 8853 8854 8855 8856 8857 8858 8859 8860 8861 8862 8863 8864 8865 8866 8867 8868 8869 8870 8871 8872 8873 8874 8875 8876 8877 8878 8879 8880 8881 8882 8883 8884 8885 8886 8887 8888 8889 8890 8891 8892 8893 8894 8895 8896 8897 8898 8899 8900 8901 8902 8903 8904 8905 8906 8907 8908 8909 8910 8911 8912 8913 8914 8915 8916 8917 8918 8919 8920 8921 8922 8923 8924 8925 8926 8927 8928 8929 8930 8931 8932 8933 8934 8935 8936 8937 8938 8939 8940 8941 8942 8943 8944 8945 8946 8947 8948 8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963 8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977 8978 8979 8980 8981 8982 8983 8984 8985 8986 8987 8988 8989 8990 8991 8992 8993 8994 8995 8996 8997 8998 8999 9000 9001 9002 9003 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013 9014 9015 9016 9017 9018 9019 9020 9021 9022 9023 9024 9025 9026 9027 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040 9041 9042 9043 9044 9045 9046 9047 9048 9049 9050 9051 9052 9053 9054 9055 9056 9057 9058 9059 9060 9061 9062 9063 9064 9065 9066 9067 9068 9069 9070 9071 9072 9073 9074 9075 9076 9077 9078 9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089 9090 9091 9092 9093 9094 9095 9096 9097 9098 9099 9100 9101 9102 9103 9104 9105 9106 9107 9108 9109 9110 9111 9112 9113 9114 9115 9116 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 9133 9134 9135 9136 9137 9138 9139 9140 9141 9142 9143 9144 9145 9146 9147 9148 9149 9150 9151 9152 9153 9154 9155 9156 9157 9158 9159 9160 9161 9162 9163 9164 9165 9166 9167 9168 9169 9170 9171 9172 9173 9174 9175 9176 9177 9178 9179 9180 9181 9182 9183 9184 9185 9186 9187 9188 9189 9190 9191 9192 9193 9194 9195 9196 9197 9198 9199 9200 9201 9202 9203 9204 9205 9206 9207 9208 9209 9210 9211 9212 9213 9214 9215 9216 9217 9218 9219 9220 9221 9222 9223 9224 9225 9226 9227 9228 9229 9230 9231 9232 9233 9234 9235 9236 9237 9238 9239 9240 9241 9242 9243 9244 9245 9246 9247 9248 9249 9250 9251 9252 9253 9254 9255 9256 9257 9258 9259 9260 9261 9262 9263 9264 9265 9266 9267 9268 9269 9270 9271 9272 9273 9274 9275 9276 9277 9278 9279 9280 9281 9282 9283 9284 9285 9286 9287 9288 9289 9290 9291 9292 9293 9294 9295 9296 9297 9298 9299 9300 9301 9302 9303 9304 9305 9306 9307 9308 9309 9310 9311 9312 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 9323 9324 9325 9326 9327 9328 9329 9330 9331 9332 9333 9334 9335 9336 9337 9338 9339 9340 9341 9342 9343 9344 9345 9346 9347 9348 9349 9350 9351 9352 9353 9354 9355 9356 9357 9358 9359 9360 9361 9362 9363 9364 9365 9366 9367 9368 9369 9370 9371 9372 9373 9374 9375 9376 9377 9378 9379 9380 9381 9382 9383 9384 9385 9386 9387 9388 9389 9390 9391 9392 9393 9394 9395 9396 9397 9398 9399 9400 9401 9402 9403 9404 9405 9406 9407 9408 9409 9410 9411 9412 9413 9414 9415 9416 9417 9418 9419 9420 9421 9422 9423 9424 9425 9426 9427 9428 9429 9430 9431 9432 9433 9434 9435 9436 9437 9438 9439 9440 9441 9442 9443 9444 9445 9446 9447 9448 9449 9450 9451 9452 9453 9454 9455 9456 9457 9458 9459 9460 9461 9462 9463 9464 9465 9466 9467 9468 9469 9470 9471 9472 9473 9474 9475 9476 9477 9478 9479 9480 9481 9482 9483 9484 9485 9486 9487 9488 9489 9490 9491 9492 9493 9494 9495 9496 9497 9498 9499 9500 9501 9502 9503 9504 9505 9506 9507 9508 9509 9510 9511 9512 9513 9514 9515 9516 9517 9518 9519 9520 9521 9522 9523 9524 9525 9526 9527 9528 9529 9530 9531 9532 9533 9534 9535 9536 9537 9538 9539 9540 9541 9542 9543 9544 9545 9546 9547 9548 9549 9550 9551 9552 9553 9554 9555 9556 9557 9558 9559 9560 9561 9562 9563 9564 9565 9566 9567 9568 9569 9570 9571 9572 9573 9574 9575 9576 9577 9578 9579 9580 9581 9582 9583 9584 9585 9586 9587 9588 9589 9590 9591 9592 9593 9594 9595 9596 9597 9598 9599 9600 9601 9602 9603 9604 9605 9606 9607 9608 9609 9610 9611 9612 9613 9614 9615 9616 9617 9618 9619 9620 9621 9622 9623 9624 9625 9626 9627 9628 9629 9630 9631 9632 9633 9634 9635 9636 9637 9638 9639 9640 9641 9642 9643 9644 9645 9646 9647 9648 9649 9650 9651 9652 9653 9654 9655 9656 9657 9658 9659 9660 9661 9662 9663 9664 9665 9666 9667 9668 9669 9670 9671 9672 9673 9674 9675 9676 9677 9678 9679 9680 9681 9682 9683 9684 9685 9686 9687 9688 9689 9690 9691 9692 9693 9694 9695 9696 9697 9698 9699 9700 9701 9702 9703 9704 9705 9706 9707 9708 9709 9710 9711 9712 9713 9714 9715 9716 9717 9718 9719 9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9741 9742 9743 9744 9745 9746 9747 9748 9749 9750 9751 9752 9753 9754 9755 9756 9757 9758 9759 9760 9761 9762 9763 9764 9765 9766 9767 9768 9769 9770 9771 9772 9773 9774 9775 9776 9777 9778 9779 9780 9781 9782 9783 9784 9785 9786 9787 9788 9789 9790 9791 9792 9793 9794 9795 9796 9797 9798 9799 9800 9801 9802 9803 9804 9805 9806 9807 9808 9809 9810 9811 9812 9813 9814 9815 9816 9817 9818 9819 9820 9821 9822 9823 9824 9825 9826 9827 9828 9829 9830 9831 9832 9833 9834 9835 9836 9837 9838 9839 9840 9841 9842 9843 9844 9845 9846 9847 9848 9849 9850 9851 9852 9853 9854 9855 9856 9857 9858 9859 9860 9861 9862 9863 9864 9865 9866 9867 9868 9869 9870 9871 9872 9873 9874 9875 9876 9877 9878 9879 9880 9881 9882 9883 9884 9885 9886 9887 9888 9889 9890 9891 9892 9893 9894 9895 9896 9897 9898 9899 9900 9901 9902 9903 9904 9905 9906 9907 9908 9909 9910 9911 9912 9913 9914 9915 9916 9917 9918 9919 9920 9921 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9954 9955 9956 9957 9958 9959 9960 9961 9962 9963 9964 9965 9966 9967 9968 9969 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 10012 10013 10014 10015 10016 10017 10018 10019 10020 10021 10022 10023 10024 10025 10026 10027 10028 10029 10030 10031 10032 10033 10034 10035 10036 10037 10038 10039 10040 10041 10042 10043 10044 10045 10046 10047 10048 10049 10050 10051 10052 10053 10054 10055 10056 10057 10058 10059 10060 10061 10062 10063 10064 10065 10066 10067 10068 10069 10070 10071 10072 10073 10074 10075 10076 10077 10078 10079 10080 10081 10082 10083 10084 10085 10086 10087 10088 10089 10090 10091 10092 10093 10094 10095 10096 10097 10098 10099 10100 10101 10102 10103 10104 10105 10106 10107 10108 10109 10110 10111 10112 10113 10114 10115 10116 10117 10118 10119 10120 10121 10122 10123 10124 10125 10126 10127 10128 10129 10130 10131 10132 10133 10134 10135 10136 10137 10138 10139 10140 10141 10142 10143 10144 10145 10146 10147 10148 10149 10150 10151 10152 10153 10154 10155 10156 10157 10158 10159 10160 10161 10162 10163 10164 10165 10166 10167 10168 10169 10170 10171 10172 10173 10174 10175 10176 10177 10178 10179 10180 10181 10182 10183 10184 10185 10186 10187 10188 10189 10190 10191 10192 10193 10194 10195 10196 10197 10198 10199 10200 10201 10202 10203 10204 10205 10206 10207 10208 10209 10210 10211 10212 10213 10214 10215 10216 10217 10218 10219 10220 10221 10222 10223 10224 10225 10226 10227 10228 10229 10230 10231 10232 10233 10234 10235 10236 10237 10238 10239 10240 10241 10242 10243 10244 10245 10246 10247 10248 10249 10250 10251 10252 10253 10254 10255 10256 10257 10258 10259 10260 10261 10262 10263 10264 10265 10266 10267 10268 10269 10270 10271 10272 10273 10274 10275 10276 10277 10278 10279 10280 10281 10282 10283 10284 10285 10286 10287 10288 10289 10290 10291 10292 10293 10294 10295 10296 10297 10298 10299 10300 10301 10302 10303 10304 10305 10306 10307 10308 10309 10310 10311 10312 10313 10314 10315 10316 10317 10318 10319 10320 10321 10322 10323 10324 10325 10326 10327 10328 10329 10330 10331 10332 10333 10334 10335 10336 10337 10338 10339 10340 10341 10342 10343 10344 10345 10346 10347 10348 10349 10350 10351 10352 10353 10354 10355 10356 10357 10358 10359 10360 10361 10362 10363 10364 10365 10366 10367 10368 10369 10370 10371 10372 10373 10374 10375 10376 10377 10378 10379 10380 10381 10382 10383 10384 10385 10386 10387 10388 10389 10390 10391 10392 10393 10394 10395 10396 10397 10398 10399 10400 10401 10402 10403 10404 10405 10406 10407 10408 10409 10410 10411 10412 10413 10414 10415 10416 10417 10418 10419 10420 10421 10422 10423 10424 10425 10426 10427 10428 10429 10430 10431 10432 10433 10434 10435 10436 10437 10438 10439 10440 10441 10442 10443 10444 10445 10446 10447 10448 10449 10450 10451 10452 10453 10454 10455 10456 10457 10458 10459 10460 10461 10462 10463 10464 10465 10466 10467 10468 10469 10470 10471 10472 10473 10474 10475 10476 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 10487 10488 10489 10490 10491 10492 10493 10494 10495 10496 10497 10498 10499 10500 10501 10502 10503 10504 10505 10506 10507 10508 10509 10510 10511 10512 10513 10514 10515 10516 10517 10518 10519 10520 10521 10522 10523 10524 10525 10526 10527 10528 10529 10530 10531 10532 10533 10534 10535 10536 10537 10538 10539 10540 10541 10542 10543 10544 10545 10546 10547 10548 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 10559 10560 10561 10562 10563 10564 10565 10566 10567 10568 10569 10570 10571 10572 10573 10574 10575 10576 10577 10578 10579 10580 10581 10582 10583 10584 10585 10586 10587 10588 10589 10590 10591 10592 10593 10594 10595 10596 10597 10598 10599 10600 10601 10602 10603 10604 10605 10606 10607 10608 10609 10610 10611 10612 10613 10614 10615 10616 10617 10618 10619 10620 10621 10622 10623 10624 10625 10626 10627 10628 10629 10630 10631 10632 10633 10634 10635 10636 10637 10638 10639 10640 10641 10642 10643 10644 10645 10646 10647 10648 10649 10650 10651 10652 10653 10654 10655 10656 10657 10658 10659 10660 10661 10662 10663 10664 10665 10666 10667 10668 10669 10670 10671 10672 10673 10674 10675 10676 10677 10678 10679 10680 10681 10682 10683 10684 10685 10686 10687 10688 10689 10690 10691 10692 10693 10694 10695 10696 10697 10698 10699 10700 10701 10702 10703 10704 10705 10706 10707 10708 10709 10710 10711 10712 10713 10714 10715 10716 10717 10718 10719 10720 10721 10722 10723 10724 10725 10726 10727 10728 10729 10730 10731 10732 10733 10734 10735 10736 10737 10738 10739 10740 10741 10742 10743 10744 10745 10746 10747 10748 10749 10750 10751 10752 10753 10754 10755 10756 10757 10758 10759 10760 10761 10762 10763 10764 10765 10766 10767 10768 10769 10770 10771 10772 10773 10774 10775 10776 10777 10778 10779 10780 10781 10782 10783 10784 10785 10786 10787 10788 10789 10790 10791 10792 10793 10794 10795 10796 10797 10798 10799 10800 10801 10802 10803 10804 10805 10806 10807 10808 10809 10810 10811 10812 10813 10814 10815 10816 10817 10818 10819 10820 10821 10822 10823 10824 10825 10826 10827 10828 10829 10830 10831 10832 10833 10834 10835 10836 10837 10838 10839 10840 10841 10842 10843 10844 10845 10846 10847 10848 10849 10850 10851 10852 10853 10854 10855 10856 10857 10858 10859 10860 10861 10862 10863 10864 10865 10866 10867 10868 10869 10870 10871 10872 10873 10874 10875 10876 10877 10878 10879 10880 10881 10882 10883 10884 10885 10886 10887 10888 10889 10890 10891 10892 10893 10894 10895 10896 10897 10898 10899 10900 10901 10902 10903 10904 10905 10906 10907 10908 10909 10910 10911 10912 10913 10914 10915 10916 10917 10918 10919 10920 10921 10922 10923 10924 10925 10926 10927 10928 10929 10930 10931 10932 10933 10934 10935 10936 10937 10938 10939 10940 10941 10942 10943 10944 10945 10946 10947 10948 10949 10950 10951 10952 10953 10954 10955 10956 10957 10958 10959 10960 10961 10962 10963 10964 10965 10966 10967 10968 10969 10970 10971 10972 10973 10974 10975 10976 10977 10978 10979 10980 10981 10982 10983 10984 10985 10986 10987 10988 10989 10990 10991 10992 10993 10994 10995 10996 10997 10998 10999 11000 11001 11002 11003 11004 11005 11006 11007 11008 11009 11010 11011 11012 11013 11014 11015 11016 11017 11018 11019 11020 11021 11022 11023 11024 11025 11026 11027 11028 11029 11030 11031 11032 11033 11034 11035 11036 11037 11038 11039 11040 11041 11042 11043 11044 11045 11046 11047 11048 11049 11050 11051 11052 11053 11054 11055 11056 11057 11058 11059 11060 11061 11062 11063 11064 11065 11066 11067 11068 11069 11070 11071 11072 11073 11074 11075 11076 11077 11078 11079 11080 11081 11082 11083 11084 11085 11086 11087 11088 11089 11090 11091 11092 11093 11094 11095 11096 11097 11098 11099 11100 11101 11102 11103 11104 11105 11106 11107 11108 11109 11110 11111 11112 11113 11114 11115 11116 11117 11118 11119 11120 11121 11122 11123 11124 11125 11126 11127 11128 11129 11130 11131 11132 11133 11134 11135 11136 11137 11138 11139 11140 11141 11142 11143 11144 11145 11146 11147 11148 11149 11150 11151 11152 11153 11154 11155 11156 11157 11158 11159 11160 11161 11162 11163 11164 11165 11166 11167 11168 11169 11170 11171 11172 11173 11174 11175 11176 11177 11178 11179 11180 11181 11182 11183 11184 11185 11186 11187 11188 11189 11190 11191 11192 11193 11194 11195 11196 11197 11198 11199 11200 11201 11202 11203 11204 11205 11206 11207 11208 11209 11210 11211 11212 11213 11214 11215 11216 11217 11218 11219 11220 11221 11222 11223 11224 11225 11226 11227 11228 11229 11230 11231 11232 11233 11234 11235 11236 11237 11238 11239 11240 11241 11242 11243 11244 11245 11246 11247 11248 11249 11250 11251 11252 11253 11254 11255 11256 11257 11258 11259 11260 11261 11262 11263 11264 11265 11266 11267 11268 11269 11270 11271 11272 11273 11274 11275 11276 11277 11278 11279 11280 11281 11282 11283 11284 11285 11286 11287 11288 11289 11290 11291 11292 11293 11294 11295 11296 11297 11298 11299 11300 11301 11302 11303 11304 11305 11306 11307 11308 11309 11310 11311 11312 11313 11314 11315 11316 11317 11318 11319 11320 11321 11322 11323 11324 11325 11326 11327 11328 11329 11330 11331 11332 11333 11334 11335 11336 11337 11338 11339 11340 11341 11342 11343 11344 11345 11346 11347 11348 11349 11350 11351 11352 11353 11354 11355 11356 11357 11358 11359 11360 11361 11362 11363 11364 11365 11366 11367 11368 11369 11370 11371 11372 11373 11374 11375 11376 11377 11378 11379 11380 11381 11382 11383 11384 11385 11386 11387 11388 11389 11390 11391 11392 11393 11394 11395 11396 11397 11398 11399 11400 11401 11402 11403 11404 11405 11406 11407 11408 11409 11410 11411 11412 11413 11414 11415 11416 11417 11418 11419 11420 11421 11422 11423 11424 11425 11426 11427 11428 11429 11430 11431 11432 11433 11434 11435 11436 11437 11438 11439 11440 11441 11442 11443 11444 11445 11446 11447 11448 11449 11450 11451 11452 11453 11454 11455 11456 11457 11458 11459 11460 11461 11462 11463 11464 11465 11466 11467 11468 11469 11470 11471 11472 11473 11474 11475 11476 11477 11478 11479 11480 11481 11482 11483 11484 11485 11486 11487 11488 11489 11490 11491 11492 11493 11494 11495 11496 11497 11498 11499 11500 11501 11502 11503 11504 11505 11506 11507 11508 11509 11510 11511 11512 11513 11514 11515 11516 11517 11518 11519 11520 11521 11522 11523 11524 11525 11526 11527 11528 11529 11530 11531 11532 11533 11534 11535 11536 11537 11538 11539 11540 11541 11542 11543 11544 11545 11546 11547 11548 11549 11550 11551 11552 11553 11554 11555 11556 11557 11558 11559 11560 11561 11562 11563 11564 11565 11566 11567 11568 11569 11570 11571 11572 11573 11574 11575 11576 11577 11578 11579 11580 11581 11582 11583 11584 11585 11586 11587 11588 11589 11590 11591 11592 11593 11594 11595 11596 11597 11598 11599 11600 11601 11602 11603 11604 11605 11606 11607 11608 11609 11610 11611 11612 11613 11614 11615 11616 11617 11618 11619 11620 11621 11622 11623 11624 11625 11626 11627 11628 11629 11630 11631 11632 11633 11634 11635 11636 11637 11638 11639 11640 11641 11642 11643 11644 11645 11646 11647 11648 11649 11650 11651 11652 11653 11654 11655 11656 11657 11658 11659 11660 11661 11662 11663 11664 11665 11666 11667 11668 11669 11670 11671 11672 11673 11674 11675 11676 11677 11678 11679 11680 11681 11682 11683 11684 11685 11686 11687 11688 11689 11690 11691 11692 11693 11694 11695 11696 11697 11698 11699 11700 11701 11702 11703 11704 11705 11706 11707 11708 11709 11710 11711 11712 11713 11714 11715 11716 11717 11718 11719 11720 11721 11722 11723 11724 11725 11726 11727 11728 11729 11730 11731 11732 11733 11734 11735 11736 11737 11738 11739 11740 11741 11742 11743 11744 11745 11746 11747 11748 11749 11750 11751 11752 11753 11754 11755 11756 11757 11758 11759 11760 11761 11762 11763 11764 11765 11766 11767 11768 11769 11770 11771 11772 11773 11774 11775 11776 11777 11778 11779 11780 11781 11782 11783 11784 11785 11786 11787 11788 11789 11790 11791 11792 11793 11794 11795 11796 11797 11798 11799 11800 11801 11802 11803 11804 11805 11806 11807 11808 11809 11810 11811 11812 11813 11814 11815 11816 11817 11818 11819 11820 11821 11822 11823 11824 11825 11826 11827 11828 11829 11830 11831 11832 11833 11834 11835 11836 11837 11838 11839 11840 11841 11842 11843 11844 11845 11846 11847 11848 11849 11850 11851 11852 11853 11854 11855 11856 11857 11858 11859 11860 11861 11862 11863 11864 11865 11866 11867 11868 11869 11870 11871 11872 11873 11874 11875 11876 11877 11878 11879 11880 11881 11882 11883 11884 11885 11886 11887 11888 11889 11890 11891 11892 11893 11894 11895 11896 11897 11898 11899 11900 11901 11902 11903 11904 11905 11906 11907 11908 11909 11910 11911 11912 11913 11914 11915 11916 11917 11918 11919 11920 11921 11922 11923 11924 11925 11926 11927 11928 11929 11930 11931 11932 11933 11934 11935 11936 11937 11938 11939 11940 11941 11942 11943 11944 11945 11946 11947 11948 11949 11950 11951 11952 11953 11954 11955 11956 11957 11958 11959 11960 11961 11962 11963 11964 11965 11966 11967 11968 11969 11970 11971 11972 11973 11974 11975 11976 11977 11978 11979 11980 11981 11982 11983 11984 11985 11986 11987 11988 11989 11990 11991 11992 11993 11994 11995 11996 11997 11998 11999 12000 12001 12002 12003 12004 12005 12006 12007 12008 12009 12010 12011 12012 12013 12014 12015 12016 12017 12018 12019 12020 12021 12022 12023 12024 12025 12026 12027 12028 12029 12030 12031 12032 12033 12034 12035 12036 12037 12038 12039 12040 12041 12042 12043 12044 12045 12046 12047 12048 12049 12050 12051 12052 12053 12054 12055 12056 12057 12058 12059 12060 12061 12062 12063 12064 12065 12066 12067 12068 12069 12070 12071 12072 12073 12074 12075 12076 12077 12078 12079 12080 12081 12082 12083 12084 12085 12086 12087 12088 12089 12090 12091 12092 12093 12094 12095 12096 12097 12098 12099 12100 12101 12102 12103 12104 12105 12106 12107 12108 12109 12110 12111 12112 12113 12114 12115 12116 12117 12118 12119 12120 12121 12122 12123 12124 12125 12126 12127 12128 12129 12130 12131 12132 12133 12134 12135 12136 12137 12138 12139 12140 12141 12142 12143 12144 12145 12146 12147 12148 12149 12150 12151 12152 12153 12154 12155 12156 12157 12158 12159 12160 12161 12162 12163 12164 12165 12166 12167 12168 12169 12170 12171 12172 12173 12174 12175 12176 12177 12178 12179 12180 12181 12182 12183 12184 12185 12186 12187 12188 12189 12190 12191 12192 12193 12194 12195 12196 12197 12198 12199 12200 12201 12202 12203 12204 12205 12206 12207 12208 12209 12210 12211 12212 12213 12214 12215 12216 12217 12218 12219 12220 12221 12222 12223 12224 12225 12226 12227 12228 12229 12230 12231 12232 12233 12234 12235 12236 12237 12238 12239 12240 12241 12242 12243 12244 12245 12246 12247 12248 12249 12250 12251 12252 12253 12254 12255 12256 12257 12258 12259 12260 12261 12262 12263 12264 12265 12266 12267 12268 12269 12270 12271 12272 12273 12274 12275 12276 12277 12278 12279 12280 12281 12282 12283 12284 12285 12286 12287 12288 12289 12290 12291 12292 12293 12294 12295 12296 12297 12298 12299 12300 12301 12302 12303 12304 12305 12306 12307 12308 12309 12310 12311 12312 12313 12314 12315 12316 12317 12318 12319 12320 12321 12322 12323 12324 12325 12326 12327 12328 12329 12330 12331 12332 12333 12334 12335 12336 12337 12338 12339 12340 12341 12342 12343 12344 12345 12346 12347 12348 12349 12350 12351 12352 12353 12354 12355 12356 12357 12358 12359 12360 12361 12362 12363 12364 12365 12366 12367 12368 12369 12370 12371 12372 12373 12374 12375 12376 12377 12378 12379 12380 12381 12382 12383 12384 12385 12386 12387 12388 12389 12390 12391 12392 12393 12394 12395 12396 12397 12398 12399 12400 12401 12402 12403 12404 12405 12406 12407 12408 12409 12410 12411 12412 12413 12414 12415 12416 12417 12418 12419 12420 12421 12422 12423 12424 12425 12426 12427 12428 12429 12430 12431 12432 12433 12434 12435 12436 12437 12438 12439 12440 12441 12442 12443 12444 12445 12446 12447 12448 12449 12450 12451 12452 12453 12454 12455 12456 12457 12458 12459 12460 12461 12462 12463 12464 12465 12466 12467 12468 12469 12470 12471 12472 12473 12474 12475 12476 12477 12478 12479 12480 12481 12482 12483 12484 12485 12486 12487 12488 12489 12490 12491 12492 12493 12494 12495 12496 12497 12498 12499 12500 12501 12502 12503 12504 12505 12506 12507 12508 12509 12510 12511 12512 12513 12514 12515 12516 12517 12518 12519 12520 12521 12522 12523 12524 12525 12526 12527 12528 12529 12530 12531 12532 12533 12534 12535 12536 12537 12538 12539 12540 12541 12542 12543 12544 12545 12546 12547 12548 12549 12550 12551 12552 12553 12554 12555 12556 12557 12558 12559 12560 12561 12562 12563 12564 12565 12566 12567 12568 12569 12570 12571 12572 12573 12574 12575 12576 12577 12578 12579 12580 12581 12582 12583 12584 12585 12586 12587 12588 12589 12590 12591 12592 12593 12594 12595 12596 12597 12598 12599 12600 12601 12602 12603 12604 12605 12606 12607 12608 12609 12610 12611 12612 12613 12614 12615 12616 12617 12618 12619 12620 12621 12622 12623 12624 12625 12626 12627 12628 12629 12630 12631 12632 12633 12634 12635 12636 12637 12638 12639 12640 12641 12642 12643 12644 12645 12646 12647 12648 12649 12650 12651 12652 12653 12654 12655 12656 12657 12658 12659 12660 12661 12662 12663 12664 12665 12666 12667 12668 12669 12670 12671 12672 12673 12674 12675 12676 12677 12678 12679 12680 12681 12682 12683 12684 12685 12686 12687 12688 12689 12690 12691 12692 12693 12694 12695 12696 12697 12698 12699 12700 12701 12702 12703 12704 12705 12706 12707 12708 12709 12710 12711 12712 12713 12714 12715 12716 12717 12718 12719 12720 12721 12722 12723 12724 12725 12726 12727 12728 12729 12730 12731 12732 12733 12734 12735 12736 12737 12738 12739 12740 12741 12742 12743 12744 12745 12746 12747 12748 12749 12750 12751 12752 12753 12754 12755 12756 12757 12758 12759 12760 12761 12762 12763 12764 12765 12766 12767 12768 12769 12770 12771 12772 12773 12774 12775 12776 12777 12778 12779 12780 12781 12782 12783 12784 12785 12786 12787 12788 12789 12790 12791 12792 12793 12794 12795 12796 12797 12798 12799 12800 12801 12802 12803 12804 12805 12806 12807 12808 12809 12810 12811 12812 12813 12814 12815 12816 12817 12818 12819 12820 12821 12822 12823 12824 12825 12826 12827 12828 12829 12830 12831 12832 12833 12834 12835 12836 12837 12838 12839 12840 12841 12842 12843 12844 12845 12846 12847 12848 12849 12850 12851 12852 12853 12854 12855 12856 12857 12858 12859 12860 12861 12862 12863 12864 12865 12866 12867 12868 12869 12870 12871 12872 12873 12874 12875 12876 12877 12878 12879 12880 12881 12882 12883 12884 12885 12886 12887 12888 12889 12890 12891 12892 12893 12894 12895 12896 12897 12898 12899 12900 12901 12902 12903 12904 12905 12906 12907 12908 12909 12910 12911 12912 12913 12914 12915 12916 12917 12918 12919 12920 12921 12922 12923 12924 12925 12926 12927 12928 12929 12930 12931 12932 12933 12934 12935 12936 12937 12938 12939 12940 12941 12942 12943 12944 12945 12946 12947 12948 12949 12950 12951 12952 12953 12954 12955 12956 12957 12958 12959 12960 12961 12962 12963 12964 12965 12966 12967 12968 12969 12970 12971 12972 12973 12974 12975 12976 12977 12978 12979 12980 12981 12982 12983 12984 12985 12986 12987 12988 12989 12990 12991 12992 12993 12994 12995 12996 12997 12998 12999 13000 13001 13002 13003 13004 13005 13006 13007 13008 13009 13010 13011 13012 13013 13014 13015 13016 13017 13018 13019 13020 13021 13022 13023 13024 13025 13026 13027 13028 13029 13030 13031 13032 13033 13034 13035 13036 13037 13038 13039 13040 13041 13042 13043 13044 13045 13046 13047 13048 13049 13050 13051 13052 13053 13054 13055 13056 13057 13058 13059 13060 13061 13062 13063 13064 13065 13066 13067 13068 13069 13070 13071 13072 13073 13074 13075 13076 13077 13078 13079 13080 13081 13082 13083 13084 13085 13086 13087 13088 13089 13090 13091 13092 13093 13094 13095 13096 13097 13098 13099 13100 13101 13102 13103 13104 13105 13106 13107 13108 13109 13110 13111 13112 13113 13114 13115 13116 13117 13118 13119 13120 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130 13131 13132 13133 13134 13135 13136 13137 13138 13139 13140 13141 13142 13143 13144 13145 13146 13147 13148 13149 13150 13151 13152 13153 13154 13155 13156 13157 13158 13159 13160 13161 13162 13163 13164 13165 13166 13167 13168 13169 13170 13171 13172 13173 13174 13175 13176 13177 13178 13179 13180 13181 13182 13183 13184 13185 13186 13187 13188 13189 13190 13191 13192 13193 13194 13195 13196 13197 13198 13199
|
2009-08-18 Didrik Pinte <dpinte@dipole-consulting.com>
* NEWS : updated to 1.2.2 release
* Thuban/UI/view.py : improved mouse wheel zooming support
* Thuban/Model/resource.py : updated for latest GDAL support
* Thuban/UI/viewport.py : unconstrainted the scale bounds
* Thuban/version.py : updated to 1.2.2 (before setting it back to 1.2.svn)
2009-08-13 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/classgen.py : applying patch from Anthony Lenton solving a
problem generating class on 64bits system
2009-08-13 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/projdialog.py : removing inexistant ProjPanel.Clear() method calls
2009-07-09 Didrik Pinte <dpinte@dipole-consulting.com>
* libraries/thuban/gdalwarp.py : fixing bug loading files with GDAL thanks to
Evan Rouault
* test/test_baserenderer.py : added a test replicating the problem loading
files with GDAL
2009-06-29 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/resource.py : freezing support improved
2009-06-27 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/view.py : added mouse wheel zoom support
2009-06-02 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/projlist.py : removed called to inexistant __del__ method on
wx.ListCtrl
2009-05-18 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/colordialog.py : update wxpython lib to wx (will not work with 2.4)
* Thuban/UI/dock.py : removed deprecated call to SetSashBorder
* Thuban/UI/projdialog.py : fix a utf problem when calling pyprojection
2009-05-18 Didrik Pinte <dpinte@dipole-consultin.com>
* Thuban/UI/application.py : removed unneeded hardcoded load of extensions
2009-05-18 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/__init__.py, application.py : bugfix for wxpython 2.8
* setup.py : removed some unneeded dll's from wxproj compilation
* Thuban/Lib/fileutil.py : added get_thuban_dir() method managing freezed path's
* Thuban/__init__.py, Thuban/Model/resource.py : uses the new get_thuban_dir() method
2009-05-18 Didrik Pinte <dpinte@dipole-consulting.com>
* setup.py : updated to run with wxpython 2.8
2009-04-04 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/mainwindow.py : completed command methods by allowing to remove
from menu and toolbar
2009-03-30 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/version.py : resetted to svn release (thanks to Bernhard check)
2009-03-20 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/Model/transient.db.py, Thuban/version.py : added support for sqlite3 module
2009-03-18 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/view.py, viewport.py : support mouse double click events
* Thuban/UI/mainwindow.py : support tools providing a wx.Bitmap icon in
place of a path to Thuban resources
2009-02-19 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/dock.py : bugfix for docking/undocking events
2008-12-03 Didrik Pinte <dpinte@dipole-consulting.com>
* Extensions/wms/layer.py : added a very simple caching mechanism
2008-12-03 Didrik Pinte <dpinte@dipole-consulting.com>
* Extensions/wms/layer.py : bugfix in projection management
2008-11-18 Didrik Pinte <dpinte@dipole-consulting.com>
* libraries/thuban/gdalwarp.cpp : support the use of GDAL MEM driver for GDAL
versions >= 1.5
2008-007-24 Bernhard Reiter <bernhard@intevation.de>
* NEWS: Added summary of changes since the 1.2.1 release. Fixed some
typos.
2008-007-24 Bernhard Reiter <bernhard@intevation.de>
* Thuban/thuban_cfg.py: Enabled wms extension.
* Extensions/wms/__init__.py: Minor comment fix.
2008-06-23 Didrik Pinte <dpinte@dipole-consulting.com>
* Extension/wms/__init__.py, wms.py, layer.py : copyright left to
Intevation.
2008-06-19 Didrik Pinte <dpinte@dipole-consulting.com>
* Extension/wms/__init__.py, wms.py, layer.py : wms extension has been
update to use owslib 0.3. Extension is not stable but usable.
2008-06-03 Bernhard Reiter <bernhard@intevation.de>
* test/test_baserenderer.py, testtest_layer.py: Give the
gdal_support_status if there is no gdal support. Gives a better hint
about why this is missing (e.g. no gdalwarp.so). Thanks to
Anthony Lenton.
2008-06-02 Bernhard Herzog <bh@intevation.de>
* Resources/XML/thuban-1.2.1.dtd, Resources/XML/thuban-1.1.dtd:
Declare the attributes field and field_type of the element
classification as optional in the syntactically correct way.
2008-05-23 Bernhard Reiter <bernhard@intevation.de>
* README: Added a hint that the requirements need to be installed
for building. Also added a section for installing, renaming the
former section to building.
2008-04-18 Didrik Pinte <dpinte@dipole-consulting.com>
* Thuban/UI/legend.py : changed the use of wx.MemoryDC to
wx.ScreenDC in order to allow compilation under Mac and wx 2.8
* libraries/pyshapelib/shptreemodule.c : bugfix coming from Debian
see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=469007
2008-02-13 Bernhard Reiter <bernhard@intevation.de>
* test/test_save.py, Thuban/Model/load.py, setup.py:
Mixed tabs and spaces indentation is bad, thus removed the tabs
from these inconsistant files.
* Doc/technotes/release_process.txt: Better use thuban-announce@
to announce. ;)
2008-02-03 Bernhard Reiter <bernhard@intevation.de>
* Thuban/version.py, setup.py: Changing version number back to svn
now that 1.2.1 is released.
2008-02-03 Bernhard Reiter <bernhard@intevation.de>
* NEWS: Adding release date.
* Releasenotes.txt: Adding release date and hint about reported
gdal 1.5.0 problem.
2008-02-02 Bernhard Reiter <bernhard@intevation.de>
* MANIFEST.in: Added "MANIFEST".
* Doc/technotes/release_process.txt: Added option --force-manifest
and explanation to the source archive creation step.
* po/de.po: Fixed translation for the contact section in the
About dialog.
2008-02-02 Didrik Pinte <dpinte@dipole-consulting.com>
* po/fr.po : updated all the fuzzy translations.
2008-02-01 Didrik Pinte <dpinte@dipole-consulting.com>
* Extensions/umn_mapserver/mf_handle.py : bugfix due to the wx 2.6
update.
* po/fr.po : translation improved.
2008-01-31 Bernhard Reiter <bernhard@intevation.de>
File format dtd is now thuban-1.2.1.dtd. Fixed tests for this.
* Resources/XML: Renaming thuban-1.2.0.dtd to thuban-1.2.1.dtd
as Thuban 1.2.0 actually used 1.1-dev.dtd.
* Resources/XML/thuban-1.2.1.dtd: Enabled keyword expansion again
so that the header is clean now, bumped copyright to 2008.
* Thuban/Model/save.py: Using thuban-1.2.1.dtd now.
* Thuban/Model/load.py: Added thuban-1.2.1.dtd instead of
thuban-1.2.0.dtd as recognised file formats.
* test/test_save.py, test/test_load.py: Using thuban-1.2.1.dtd now.
2008-01-31 Bernhard Reiter <bernhard@intevation.de>
Adding new Czech translation by new translator Jachym Cepicky.
* Thuban/UI/about.py: Adding entry for Czech translation. Adding
Didrik Pinte to the French translation. Adding Bernhard Reiter to
the German translation.
* po/*.po, po/de.po: Updated with string changes in the about dialog.
* po/cs.po: New Czech translation contributed by Jachym Cepicky.
* News: Mentioned new Czech translation.
* MANIFEST.in: Also distribute the file Releasenotes.txt
* Releasenotes.txt: Added a hint about that notes
might be added after a source release. Thus looking for updates
is sensible.
2008-01-30 Bernhard Reiter <bernhard@intevation.de>
* Releasenotes.txt: Fixed a typo.
2008-01-30 Bernhard Reiter <bernhard@intevation.de>
* Thuban/Model/save.py: Using the new thuban-1.2.0.dtd.
* Thuban/Model/load.py: Add the thuban-1.2.0.dtd to the list.
* Resources/XML/thuban-1.2.0.dtd: New. Without the masktype attribute.
2008-01-30 Bernhard Reiter <bernhard@intevation.de>
Preparing for release.
* Thuban/version.py, setup.py: Moved version number to 1.2.1.
* Thuban/UI/about.py: Bumped copyright to 2008.
* README: Added hint that there are tests and a manual
to the installation section. Also a hint about the manual for the
packagers.
* Doc/manual/README: Mentioned the "Makefile" as prefered method.
* Releasenotes.txt: Drafted an announcement and notes for 1.2.1.
* po/*: Run the update (basically a date change)
2008-01-29 Bernhard Reiter <bernhard@intevation.de>
* NEWS: Updated changes up to upcoming release 1.2.1.
2008-01-28 Bernhard Reiter <bernhard@intevation.de>
Updated German translation.
* Extensions/svgexport/svgsaver.py,
Extensions/umn_mapserver/mf_handle.py, Extensions/wms/infodialog.py:
Fixed small typo.
* po/*.po: Updated (three small typos)
* po/de.po: Brought translation uptodate.
2008-01-27 Bernhard Reiter <bernhard@intevation.de>
Changed a few places in Thuban and Extensions to convert wx
strings to internal string encoding.
* Thuban/UI/classgen.py: Checked for return strings from wx problems.
Added one clarifing comment, removed two unused variables.
* Thuban/UI/mainwindow.py(OpenSession, SaveSessionAs, TableOpen): Using
internal_from_wxstring for the pathname.
* Thuban/UI/tableview.py(doExport): Using internal_from_wxstring
for the pathname.
* Thuban/UI/view.py(MapCanvas.Export): Using internal_from_wxstring
for the pathname.
* Extensions/bboxdump/bboxdump.py(OnSelectFilename),
Extensions/export_shapefile/export_shapefile.py,
Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
Extensions/svgexport/maplegend.py, Extensions/svgexport/svgsaver.py,
Extensions/umn_mapserver/mf_import.py: Using
internal_from_wxstring for the pathname.
2008-01-26 Bernhard Reiter <bernhard@intevation.de>
Fixed projection dialog so you can set [#586].
(Part of the problems that arise with wx returning unicode.)
* Thuban/UI/projdialog.py: translating filenames from dlg.GetPaths()
and dlg.GetPath() to internal encoding using internal_from_wxstring().
This fixes #586 (projection exception when changing projection).
Using variable "path" in ProjFrame:_OnImport() more consistently.
(__GetProjection): Using internal_from_wxstring() for the
project parameters.
2008-01-21 Didrik Pinte <dpinte@itae.be>
Updated fr.po to support Extensions localised strings
* po/fr.po: Some translations
2008-01-19 Bernhard Reiter <bernhard@intevation.de>
Strings in the Extensions are now also localised.
* Extensions/umn_mapserver/mf_import.py,
Extensions/umn_mapserver/mf_handle.py,
Extensions/umn_mapserver/__init__.py,
Extensions/umn_mapserver/mf_export.py, Extensions/ogr/__init__.py,
Extensions/ogr/ogrdialog.py: Changed encoding from latin-1 to
iso-8859-15 because the xgettext Debian Version: 0.16.1-2 does not
recognise "latin-1".
* po/Makefile: Added the toplevel files of the Extensions
to be considered as POT sources.
* po/*.po: Updated with a lot of strings from the Extensions.
* po/de.po: Some translations.
2008-01-19 Bernhard Reiter <bernhard@intevation.de>
New installation wide configuration file thuban_cfg.py which by
default tries to import all interesting Extensions coming with Thuban.
Extentions are now all under the menu entry with the same name,
their maturity will be indicated by leading string in the menu text.
* Thuban/versions.py(verify_versions): Updated reference revisions
for checking the loaded libraries according to the README.
* Thuban/UI/application.py: Started using the logging module for
error message and runtime information.
(read_startup_files): Trying to read new site wide startup file
Thuban/thuban_cfg.py.
* Thuban/thuban_cfg.py: New. Tries to import each interesting
Extension (in a non-elegant way).
* packaging/windows/thubanstart.py: Disabled import of default
extensions as this is done in thuban_cfg.py now.
* README: Mentioned thuban_cfg.py instead of the ugly method
of thubanstart.py for each user's home directory.
* Extensions/export_shapefile/export_shapefile.py,
Extensions/importAPR/importAPR.py: Moved them under "Extensions" menu,
but marked them "(experimental) " in the menu entry text. Bumped
copyright to include 2008.
* Extensions/ogr/ogrstart.py: Separated the "(testing) " marking
string from the rest of the menu entry.
* Doc/manual/thuban-manual.xml: Updated manual to include
thuban_cfg.py and different handling of Extensions. Bumped copyright
to include 2008.
2008-01-09 Bernhard Reiter <bernhard@intevation.de>
Making Thuban robust against shapefiles which contain empty shapes.
* libraries/thuban/wxproj.cpp(project_points): setting an exception
now if called with no points at all. This is necessary, because
the NULL pointer already indicates an error condition, thus it
cannot be used to indicate that there was no point in the result.
(draw_polygon_shape, (point_in_polygon_shape): stop if there
are no points in the shape.
Propagate an error condition on failure of (project_points()).
(point_in_polygon_shape): shifted some lines around to allow
a cleanup jump point.
* Thuban/Model/layer.py, Thuban/UI/viewport.py: removed unused import
of point_in_polygon_shape.
2008-01-08 Bernhard Reiter <bernhard@intevation.de>
* libraries/thuban/wxproj.cpp(project_points): made function robust
against being called with no points. (also fixes main defect related
to [#571] (MemoryError when adding a particular shp layer))
2007-12-09 Bernhard Reiter <bernhard@intevation.de>
WMS Extention improvements: Better logging for problem analysis.
Requirements: "logging" module is needed, included with Python 2.3.
* Extentions/wms/test/test_domutils.py: Used same trick as in
test_ogclib.py to support.initthuban() so the test now runs.
* Extensions/wms/capabilities.py: Added logging module and now
starts logging the capabilities downloaded. As the wms extention
is still experimental I have added the configuration so that
DEBUG is written to stderr.
* README: Requirements bumbed Python min to 2.3.5. because
of the use of the logging module.
2007-12-08 Bernhard Reiter <bernhard@intevation.de>
* po/es.po: Translation update by Daniel Calvelo.
* po/fr.po: Translation update by Daniel Calvelo.
* po/*: Updated the .po files. With many put thuban-devel@ in
as "Language-Team". Also updated the "Project-ID-Version" to say
Thuban 1.2.
2007-11-29 Bernhard Reiter <bernhard@intevation.de>
Wms-Extension: Nasa as second example URL added.
* Extensions/wms/wms.py: Activated Nasa as URL and deleted
the other lines which were commented out.
2007-11-28 Bernhard Reiter <bernhard@intevation.de>
Databaseconnections: some fixes.
* Thuban/Model/postgisdb.py(_fetch_table_information()): also
quote the tablename, which otherwise would not work when there is
a "_" in the table name. It probably is a good idea anyway.
* Thuban/UI/dbdialog.py(ChooseDBTableDialog.GetTable()): transform
some resulting strings into internal encoding.
* Thuban/UI/mainwindow.py(AddDBLayer()): print a traceback to stderr
if the dataconnection fails to help analysing when there is a problem.
* Extensions/ogr/ogrdialog.py: Fixed some wx calls building the dialog.
2007-11-28 Bernhard Reiter <bernhard@intevation.de>
Wms-Extension: some fixes in order to make it work again.
* Extensions/wms/test/test_parser.py: removed import of adjustpath,
but instead used the same method as other Extensions to call
the support.initthuban() function from the toplevel "test" directory.
* Extensions/wms/infodialog.py(calcText()): removed encode('latin1')
as the Title already should be in the internal Thuban encoding.
* Extensions/wms/properties.py: removed encode('latin1')
as the Title already should be in the internal Thuban encoding.
Added copyright year 2007. Fixed reference to wx.EVT_BUTTON.
* Extensions/wms/layer.py: Using internal_from_.unicode now to bring
the layer title in the right encoding.
* Extensions/wms/wms.py: adapting call to draw_raster_layer as
draw_raster_layer() got the calling parameters changed in rev2618.
Changed the preset selection choice towards demo.intevation.org, as
the frida wms does not seem to work anymore these days.
Fixed reference to EVT_BUTTON (was probably an oversight from the wx2.6
migration.)
2007-11-26 Bernhard Reiter <bernhard@intevation.de>
* README: Added remark that extension can have their own
additional requirements.
* Extensions/ogr/ogrstart.py: Re-added parameters for wx.FileDialog()
that had been accidently dropped in r2746. Transformed result from
GetPaths to internal encoding. Refactored map to mymap. Removed two
unused variables from select_file_format().
* Thuban/UI/altpathdialog.py: transformed result from GetPaths to
internal encoding. Made sure the translation is actually used as
the _() function will only match on a fixed string.
* po/*: updated all po files (minor for altpathdialog.py).
* po/de.po: improved translation for altpathdialog.py.
2007-11-25 Bernhard Reiter <bernhard@intevation.de>
* po/*: Updated all po files.
* po/de.po: Fixed two translations.
2007-11-23 Bernhard Reiter <bernhard@intevation.de>
* README: upgraded requirement for psycopg from 1.0.x to 2.0.x
which is necessary since rev. 2768, Wed May 9 2007.
2007-06-27 Didrik Pinte <dpinte@itae.be>
umn_mapserver extension bug fixing due to the wx 2.6 migration
* Extensions/umn_mapserver/mf_import.py: import corrections
2007-06-23 Bernhard Reiter <bernhard@intevation.de>
* thuban.py: Added the __name__="__main__" trick so you can
import thuban without starting the application directly.
This makes debugging possible.
* Thuban/UI/view.py (MapCanvas.Print): Creating a PrintDialogData
object first and setting a parameter, which reenables printing
at least on Debian Sarge with python-wxgtk2.6 2.6.3.2.0bpo1.
Bumped copyright line to include 2007.
2007-06-23 Bernhard Reiter <bernhard@intevation.de>
* Thuban/version.py: Enable to indicate branch names in the
thuban_release-svn-display.
* Thuban/UI/about.py: Mentioning the version number of the GNU GPL.
2007-06-22 Bernhard Reiter <bernhard@intevation.de>
INCOMPATIBLE CHANGE with Thuban 1.1 (development series) and 1.2.0:
Changing the raster layer attributes towards always
using an alpha channel. As we require wx2.6 there is no real use-case
for bitmap and this fixes a problem on the windows platform.
* NEWS: adding note about the major change using alpha always.
* Thuban/UI/renderer.py: Removed diversion for wx <2.5.3 as
we require >= 2.6 now. Bumping copyright, adding author Bernhard.
* Thuban/UI/rasterlayerproperties.py: Removed diversion for
wx <2.5.3 as we require >= 2.6 now, so we always can do alpha channel.
Added author Bernhard Reiter and copyright year 2007.
Removed two old code lines which were commented out.
Commented out the code for the mask type selection.
* Thuban/Model/layer.py: Made masktype = MASK_ALPHA default for new
raster images. Bumping copyright.
* test/test_layer.py: made test_raster_layer() expect MASK_ALPHA.
Bumping copyright.
* Thuban/Model/load.py: if there is no masktype set, use alpha.
This means the behaviour changes for files saved with Thuban-1.1,
but this has been a development version. As bitmap does not work
on some platforms (windows currently) it will even fix a problem
there. Bumping copyright
* test/test_load.py: Removed masktype from example file. Bumping
copyright.
* Thuban/Model/save.py: Do not save raster attribute "masktype"
anymore. Bumping copyright.
* test/test_save.py: Not expecting "masktype" to be saved anymore.
Bumping copyright.
2007-06-22 Bernhard Reiter <bernhard@intevation.de>
Minor documentation cleanups.
* NEWS: Corrected python version relation indicating which python
versions call modules with the locale set.
* README: (minor) better formatting: added a few more lines breaks.
Packagers: Added hints that enabling all extensions would be cool.
2007-05-22 Bernhard Reiter <bernhard@intevation.de>
* Thuban/UI/mainwindow.py: using a loop for several raster filenames.
Thanks to Jachym Cepicky and Bernhard Herzog. Closes [#403] "can not
add raster layer". And adds the ability to open more then one raster
file from one open dialog by multiple selection.
2007-05-22 Bernhard Herzog <bh@intevation.de>
* Extensions/ogr/ogrshapes.py: Move the __future__ import to the
top of the file. Otherwise Python will not recognize it and
Python 2.5 will even throw a SyntaxError
2007-05-10 Didrik Pinte <dpinte@itae.be>
* packaging/windows/Thuban-1.2.0_1.exe.readme.txt : installation
instruction for the windows InnoSetup version.
2007-05-10 Didrik Pinte <dpinte@itae.be>
Migration to psycopg2 to support UTF8 environments
* Thuban/Model/postgisdb.py : psycopg2 migration
* test/postgissupport.py, test_postgis_db.py : psycopg2 migration
2007-05-07 Bernhard Reiter <bernhard@intevation.de>
* Releasenotes.txt: Improved the language on the announcement,
which is now ready. Also improved windows hints where raster works,
but only with alpha. Put the Revision keyword on top.
2007-05-03 Didrik Pinte <dpinte@itae.be>
* Thuban/UI/dock.py, classifier.py : Little fixes with GetSize methods
2007-04-25 Didrik Pinte <dpinte@itae.be>
* Releasenotes.txt : win32 installer warning added
2007-04-25 Bernhard Reiter <bernhard@intevation.de>
Improvements (thanks to Samuel Mesa for reporting the problems):
o The class generator selector will work even in other languages.
o Layer titles from filenames are saved in the correct encoding, so
strings can be assembled from them,
e.g. for the Layer Projection dialog.
* Thuban/UI/mainwindow.py: translating filenames from dlg.GetPaths()
to internal encoding using internal_from_wxstring().
* Thuban/UI/mainwindow.py: Refactored, now the build-in function map()
can be used again:
a) renamed local variables map to mymap. It was covering up map().
b) removed calls filling map = self.Map() in
DatabaseManagement()and LayerProjection() as the result was not
used and MapCanvas.Map() does not have a side effect.
* Thuban/UI/classgen.py(ClassGenDialog): translating result from
genChoice.GetString() back to internal encoding.
* Thuban/UI/__init__.py: Added internal_from_wxstring() and
ugly code that actually sets this function. Using and internal
variable _wx_can_be_imported that install_wx_translation() will set.
* Doc/technotes/string_representation.txt: fixed a typo and
made the text less string about dbf files not providing encoding
information, but it might be that some of them do.
2007-04-12 Bernhard Reiter <bernhard@intevation.de>
* Releasenotes.txt: Added as a repository for the announcements
and noteworthy issues. Included draft announcement.
* NEWS: Moved over known issues of 1.2.0 to Releasenotest.txt because
that is a better place for it. Later issues get fixed and
NEWS should be an overview of the important changes over time.
2007-04-12 Bernhard Reiter <bernhard@intevation.de>
* test/localessupport.py: replaced getlocale with setlocale
because of a python problem that the output of getlocale cannot
be used as input of setlocale in all cases. python 2.3 2.4 2.5
had the problem, see
sf[ 1699853 ] locale.getlocale() output fails as setlocale() input
https://sourceforge.net/tracker/index.php?func=detail&aid=1699853&group_id=5470&atid=105470
Did some minor formatting. Added German_Germany.1252 encoding
from window XP experiments to try.
* Thuban/Model/proj.py: replaced getlocale with setlocale.
This avoids an exception on windows xp sp2 German. But it does
not fix the raster display problem. The second attempt of setlocale
can be removed.
2007-03-17 Didrik Pinte <dpinte@itae.be>
* Extensions/
drawshape/drawshape.py,
export_shapefile/export_shapefile.py,
ogr/ogrdialog.py, ogrstart.py,
svgexport/maplegend.py, svgsaver.py,
umn_mapserver/mf_export.py, mf_handle.py, mf_import.py,
wms/infodialog.py, properties.py, wms.py: final updates for the
wx 2.6 transition
* setup.py : updated the gdal path for win32, added a missing
ressource for the mouseposition extension
2007-03-14 Bernhard Reiter <bernhard@intevation.de>
* Doc/technotes/release_process.txt: Improved with SVN instructions,
uploading and setting back the version numbers again.
* Thuban/version.py, setup.py: Changing version to "svn" after
release.
2007-03-14 Didrik Pinte <dpinte@itae.be>
* Thuban/UI/classgen.py: bugfix - Close button now really closes the
dialog window (closes #309)
2007-03-13 Bernhard Reiter <bernhard@intevation.de>
More release preparations: Translation string updated. Release date
added.
* po/*: Updated .po files with new strings.
* po/de.po: Completed German translation (3 missing, one fuzzy).
* README: Bumped minium requirement of pysqlite to 1.0.1 (as I believe
Thuban was tested with on Debian.)
* NEWS: New phrasing for "changes up to". Added release date.
* Thuban/UI/about.py: Added fileencoding information, otherwise
xgettext from 0.16.1 did not want to run on this file.
* Thuban/UI/__init__.py: Calling wx.Locale() with with parameter
wx.LANGUAGE_DEFAULT now. Without this change no message catalog is
loaded in wxPython 2.6.3.2.1.5 and thus the translation would not work.
* setup.cfg: Change tarball compression from gzip to bzip2.
* packaging/debian: Moved the directory in here from toplevel,
because there could be several debian packaging dirs and this
is outdated.
* MANIFEST.in: Added toplevel ChangeLog to distribution.
Made sure that files under packaging are actually packaged.
2007-02-26 Bernhard Reiter <bernhard@intevation.de>
* MANIFEST.in: Added *.xmi to Doc so that ThubanModel.xmi is included.
* Extensions/svgexport/TODO: Added findings about how to write raster
in SVG.
* Extensions/svgexport/svgmapwriter.py: untabified two lines.
Fixed a typo.
* Doc/ThubanModel.xmi: Updated the format of the umbrello file.
Loaded and saved with umbrello 1.3.2, manually changed the
codegeneration tag to be empty again and change the XMI.model
to not contain a local path.
Now umbrello 1.5.5 also opens the file without crashing.
Thanks to Philippe LeGrand who discovered the problem and the
solution and filed report 141279 on bugs.kde.org for this umbrello
problem.
2007-02-21 Didrik Pinte <dpinte@itae.be>
* Extensions/umn_mapserver/__init__.py : UTF8 locales bugfix
2007-02-20 Bernhard Reiter <bernhard@intevation.de>
* Thuban/version.py, setup.py: Getting ready for release 1.2.0.
Using this version number.
* Doc/README: fixed a typo.
* Doc/technotes/release_process.txt: Updated. Reference platform
is Debian Etch now. If windows, it should be window XP.
Marked a few entries in the instructions as "Old:".
* README: Bumped requirements to wxWidgets 2.6.3.2 and gdal 1.3.2..
Added urls for homepage and infrastructure on wald. Fixed a typo.
* MANIFEST.in: Added subdir "packaging" which should be in the tarball.
* NEWS: Completed changes from 1.1.0 until today as gathered from
the Changelog entries. Added small section about OGR known problems
because we do not have a release-notes file so far.
* Doc/manual/thuban-manual.xml: Removed the installation instructions
as they are outdated and they should be only in one place.
Bumped version number of the document to 1.2.0. Marked it as Draft
in the title.
* Extensions/svgexport/: Get ready for release. Bump version
number to 1.0.1. Adjusted numbers in TODO.
* Thuban/UI/about.py: Reworked the about text. It shows now
when somebody was active on Thuban. Added a list of maintainers.
Bernhard Reiter is the current maintainer, following up on Bernhard
Herzog.
* Extensions/export_shapefile/export_shapefile.py: untabify.
* test/README: Added example how to set the PATH for postgis on
Debian Etch.
2007-01-13 Didrik Pinte <dpinte@itae.be>
bboxdump, gns2shp, importAPR, mouseposition, ogr, profiling, svgexport
extensions migrated to wxPython 2.6
* Extensions/bboxdump/bboxdump.py:
updated wx statements
* Extensions/gns2shp/gns2shp.py:
updated wx statements
* Extensions/importAPR/importAPR.py:
updated wx statements
* Extensions/mouseposition/mouseposition.py:
updated wx statements
* Extensions/ogr/
ogrdialog.py, ogrstart.py:
updated wx statements
* Extensions/profiling/profiling.py:
updated wx statements
* Extensions/svgexport/
maplegend.py, svgsaver.py:
updated wx statements
2007-01-08 Didrik Pinte <dpinte@itae.be>
export_shapefile extension migrated to wxPython 2.6
* Extensions/export_shapefile/export_shapefile.py:
updated wx statements, changed the FileDialog to wx.SAVE (was wx.OPEN)
2007-01-08 Didrik Pinte <dpinte@itae.be>
umn_mapserver extension migrated to wxPython 2.6
* Extensions/umn_maserver/
mf_handle.py, mf_import.py, mf_export.py:
update wx imports to 2.6 policy
2007-01-06 Didrik Pinte <dpinte@itae.be>
UTF-8 locales support reading non utf-8 files.
This is a workaround and not a real bugfix. See
http://wald.intevation.org/tracker/index.php?func=detail&aid=118
for more details
* Thuban/UI/tableview.py, controls.py, baserenderer.py, view.py:
decode text from iso-8859-1 encoding.
2007-01-01 Bernhard Reiter <bernhard@intevation.de>
* test/postgissupport.py, test/test_postgis_db.py: adding an
explicit WITH OIDS to the create table commands. This fixes tests
that rely on an oid column to be present for postgresql >=8.0.
Thanks for Frank Koormann for the hint.
2006-11-06 Didrik Pinte <dpinte@itae.be>
* libraries/thuban/wxproj.cpp: bugfix - allow compilation with
msvc++ toolkit 2003
2006-11-06 Bernhard Reiter <bernhard@intevation.de>
Made it easier to run PostGIS test on Debian Etch. Improving
https://wald.intevation.org/tracker/index.php?func=detail&aid=173 .
* test/postgissupport.py: Taking pg_ctl and initdb commands
from internal variables now. Adding deactivated example values
for Debian Etch.
find_postgis_sql(): Added special line for Debian Etch postgresql-8.1.
Added copyright year 2006.
2006-10-25 Bernhard Reiter <bernhard@intevation.de>
Moved ogr Extension to Extension menu.
* Extensions/ogr/
__init__.py, ogrstart.py, ogrshapes.py, ogrdialog.py
test/test_OGRShapestore.py, test/__init__.py:
adding encoding information and made sure Autor's names
with an umlaut are actually written with an umlaut.
* Extensions/ogr/ogrstrat.py: now registering in menu "Extensions",
having a "(testing)" string before the submenu to prepare for 1.2.0
release. Bumped copyright year to 2006.
2006-10-15 Bernhard Reiter <bernhard@intevation.de>
* Thuban/UI/renderer.py: Added module variable verbose and
added verbose output before doing a raster projection.
Minor: Added (c) year 2006.
* test/test_baserenderer.py: Added new function
test_projected_raster_decimalcommalocale()
Added new author Bernhard Reiter and new copyright year 2006.
* libraries/thuban/gdalwarp.cpp(ProjectRasterFile): Adding
switching to LC_NUMERIC "C" and back before calling GDAL functions -
only #if python >=2.4 .
2006-10-10 Didrik Pinte <dpinte@itae.be>
Win32 build updates
* setup.py :
- update to the latest libs for win32 setup tasks
- added gdal and Lib content to the inno setup build task
- added stable and experimental extensions to setup packages
* thuban.py :
- gdal support for win32 inno installation
2006-10-10 Didrik Pinte <dpinte@itae.be>
* Thuban/Model/layer.py (Layer.GetLabelPosFromShape): new method
extracted from Thuban/UI/viewport.py
* Thuban/UI/viewport.py (Viewport.LabelShapeAt): uses new method
2006-09-28 Didrik Pinte <dpinte@itae.be>
* Thuban/UI/classgen.py: bugfix due to wx2.6 update
* Thuban/UI/view.py: removed non needed declaration
* Thuban/UI/selection.py : typo correction
2006-09-24 Bernhard Reiter <bernhard@intevation.de>
* Thuban/Model/proj.py(_do_we_have_to_work_around_broken_proj):
Making the test more robust for observed python 2.3 problems
with setlocale().
* test/runtests.py: Added new option ---setdecimalcommalocale
to run all tests with an LC_NUMERIC that uses comma as decimal_point.
Minor: Added (c) year 2006. Fixed typo in a docstring.
* test/test_transientdb.py: Minor: Added (c) year 2006. Fixed typo in
a docstring.
2006-09-23 Bernhard Reiter <bernhard@intevation.de>
* Extensions/ogr/test/test_OGRShapestore.py: fixed skip_if_no_ogr()
and added it to TestOGRTable.setUp() so that all tests get skipped
if ogr cannot be imported. Added (c) year 2006.
2006-09-18 Didrik Pinte <dpinte@itae.be>
* wxPython 2.6 update : wx 2.4 syntax has been updated to 2.6
2006-09-18 Bernhard Reiter <bernhard@intevation.de>
Fixed proj behaviour with python >=2.4 when decimal_point != '.'.
* Thuban/UI/application.py: Fixed warning dialog when gdal is missing.
* test/test_proj.py: new test_lc_numeric_robustness(). Added author
Bernhard Reiter and new copyright year 2006.
* Thuban/Model/proj.py: New _do_we_have_to_work_around_broken_proj()
and Projection.assuregoodlocale(), Projection.assureinitlocale().
Added author Bernhard Reiter and (c) 2006.
2006-09-15 Bernhard Reiter <bernhard@intevation.de>
* README: added RXP and pyRXP as optional for tests.
* test/localessupport.py: New. Contains a helper function
to find a locale with comma used as decimal_point.
2006-08-31 Bernhard Reiter <bernhard@intevation.de>
* README: fixed URLs to sqlite and pysqlite.
* Thuban/UI/about.py: Added Didrik Pinte as contributor. Extended
copyright range to include 2006.
2006-06-29 Didrik Pinte <dpinte@itae.be>
* Thuban/UI/main.py: circular import fix.
2006-06-27 Frank Koormann <frank@intevation.de>
New Classification "Pattern": Classify text attributes by regexp.
* Thuban/Model/classification.py (class ClassGroupPattern):
New, group is associated with a regular expression.
(Classification._compile_classification): Store compiled regexp and
original group for pattern.
(Classification.FindGroup): Added pattern.
* Thuban/UI/classifier.py
(ClassGrid._OnLabelRightClicked, ClassGrid.labelPopup):
New, add popup to select singleton/pattern.
(ClassTable.GetRowLabelValue, ClassTable.GetValueAsCustom,
ClassTable.SetValueAsCustom): Added pattern.
(ClassTable.__ParseInput): Autodetect singleton/pattern.
* Thuban/Model/save.py (SessionSaver.write_classification):
Added pattern.
* Thuban/Model/load.py (SessionLoader.start_clpattern,
SessionLoader.end_clpattern): New, process pattern elements.
* test/test_classification.py (class TestClassGroupPattern): New.
(TestClassification.test_add_pattern,
TestClassification.test_multiple_groups_textual,
TestClassification.test_deepcopy_textual): New.
(TestClassification.test_multiple_groups_numerical):
Renamed test_multiple_groups.
(TestClassification.test_deepcopy_numerical): Renamed test_deepcopy.
* test/test_save.py (SaveSessionTest.testClassifiedLayer):
Added pattern.
* test/test_load.py (ClassificationTest.TestLayers, TestClassification):
Added pattern.
* test/test_layer.py
(TestLayerModification.test_set_classification_textual): New
(TestLayerModification.test_set_classification_numerical):
Renamed test_set_classification.
* Doc/manual/thuban-manual.xml: Added pattern to layer classification
description.
* Resources/XML/thuban-1.1.dtd: Added clpattern element and attribs.
2006-06-29 Didrik Pinte <dpinte@itae.be>
* Thuban/version.py: Bugfix determination of SQLite, the wright one !
2006-06-28 Didrik Pinte <dpinte@itae.be>
* packaging/windows/thubanstart.py: sample file loading all the stable
extensions
2006-06-28 Didrik Pinte <dpinte@itae.be>
* Thuban/version.py: Bugfix determination of SQLite on old and recent
systems (support pysqlite1 and pysqlite2)
2006-06-27 Frank Koormann <frank@intevation.de>
* Thuban/version.py: Bugfix determination of SQLite on old systems.
2006-05-17 Didrik Pinte <dpinte@itae.be>
* Extensions/ogr/__init__.py : updated test for win32 and correct
imports
2006-05-15 Didrik Pinte <dpinte@itae.be>
Ashamed ... still some tabs in the files
* Thuban/version.py : tabs removed
* Thuban/Model/transientdb.py : tabs removed
2006-05-15 Didrik Pinte <dpinte@itae.be>
* Thuban/version.py : coding style correction
* Thuban/Model/transientdb.py : coding style correction
2006-05-15 Didrik Pinte <dpinte@itae.be>
* Thuban/version.py : Updated imports to support pysqlite2
* Thuban/Model/transientdb.py : Updated imports to support pysqlite2
Patched the querying system to support the param style of pysqlite2
2006-04-24 Didrik Pinte <dpinte@itae.be>
* Extensions/svgexport/__init__.py: The extension now works on win32
architecture. Bug #87 corrected.
2006-04-20 Bernhard Reiter <bernhard@intevation.de>
* Doc/technotes/coding_guidelines.txt: Changed text from CVS to SVN.
Removed emacs specific hint and replaced it with a general hint
that editors might support writing changelogs.
2006-04-12 Bernhard Reiter <bernhard@intevation.de>
* Thuban/version.py: Changed thuban_release mechanism to use "svn"
instead of "cvs".
2006-03-31 Bernhard Reiter <bernhard@intevation.de>
* libraries/thuban/wxproj.cpp: including proj_api.h instead of
projects.h now. According the Frank Warmerdam and man pj_init
this is the public interface to proj. Thus I have changed PJ to projPJ.
And I could remove the hack to avoid clashes with typedef PVALUE
and #define LP in projects.h clashing with symbols when trying to
build on windows. The file is cleaner and nicer now.
2006-03-29 Bernhard Reiter <bernhard@intevation.de>
* libraries/thuban/wxproj.cpp: undef LP to avoid clash when
trying to build with mingw.
2005-10-18 Bernhard Reiter <bernhard@intevation.de>
* Thuban/UI/about.py: remove unused import of getdefaultlocale.
Added display of internal encoding to the about dialog text.
* Extensions/svgexport/__init__.py: changed version to "1.0.0+cvs".
2005-10-18 Bernhard Reiter <bernhard@intevation.de>
Startup improved: We fail right away if the internal encoding could
not be determined.
* Thuban/__init__.py (get_internal_encoding): new.
* test/test_stringrepresentation.py (class TestInternalEncoding):
Preserve the internal encoding for the tests in this class.
2005-10-17 Bernhard Reiter <bernhard@intevation.de>
* test/test_stringrepresentation.py: New file, for now testing
that set_internal_coding() is throwing an exception for bad exceptions.
* Thuban/__init__.py (set_internal_encoding): added a forwards
and backward translation, so that we fail early if the
internal_encoding is bad.
2005-10-17 Bernhard Reiter <bernhard@intevation.de>
svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
You could actually get polylines with filling in between,
when the classification for the lines had a fill color.
E.g. this happens when you generate a classification from a ramp.
* Extensions/svgexport/test/test_svgmapwriter.py:
New test_export_arc_no_fill(). Extend copyright notice to 2005.
* Extensions/svgexport/svgmapwriter.py
(SVGRenderer.draw_shape_layer_incrementally()):
Setting TRANSPARENT_BRUSH for shaptype ARC.
Extend copyright notice to 2005.
* Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
2005-09-08 Frank Koormann <frank@intevation.de>
* Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
by Erik (sigra.at.home.se)
2005-08-18 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
Call the right method for the default size.
2005-08-11 Jan-Oliver Wagner <jan@intevation.de>
* Extensions/export_shapefile: New.
* Extensions/export_shapefile/__init__.py: New. Initialize
the export_shapefile extension.
* Extensions/export_shapefile/export_shapefile.py: New.
Exports a layer as a Shapefile.
2005-08-08 Jan-Oliver Wagner <jan@intevation.de>
* po/de.po: String fixes. This fixes Debian bug #313843.
2005-07-27 Jan-Oliver Wagner <jan@intevation.de>
Remove the attributes from the layer element in
.thuban files for the save routine.
This also solves RT bug #3149,
https://intevation.de/rt/webrt?serial_num=3149
* test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
attributes from layer element to classification clnull element.
* test/test_save.py (SaveSessionTest.testSingleLayer,
SaveSessionTest.testLayerProjection,
SaveSessionTest.testClassifiedLayer,
SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
Removed attributes from layer element to classification clnull element.
(test_save_postgis.NonConnectionStore._fetch_table_information):
added pretending to have a shape_type.
* Resources/XML/thuban-1.1.dtd: Make the attributes field
and field_type of classification optional.
* Thuban/Model/classification.py (Classification.TreeItem.build_info):
Added output of size.
* Thuban/Model/load.py (SessionLoader.start_classification):
Change attribute 'field' and 'field_type' from obligatory to
optional to allow empty classes (ie. only with a default=clnull).
* Thuban/Model/save.py (SessionSaver.write_layer): Don't write
any attributes anymore for the layer element.
(SessionSaver.write_classification): Even if there is no
classification field, still write the classification because
the clnull (default) symbol will not be defined anymore as
part of the layer element.
2005-07-05 Bernhard Herzog <bh@intevation.de>
* setup.py (setup call): Version 1.1.0
* NEWS: Update for 1.1.0
* MANIFEST.in: Add *.txt to files taken from Doc. Otherwise the
technores won't be included
* Thuban/UI/about.py (About.__init__): Extend copyright notice to
2005
* po/de.po: Updated.
2005-07-05 Bernhard Herzog <bh@intevation.de>
* README: gdal 1.1.8 is too old. 1.2.5 works.
2005-07-05 Bernhard Herzog <bh@intevation.de>
* Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
masktype attributes.
2005-07-05 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.__mangle_bounding_box)
(Layer.ClipBoundingBox): Rename ClipBoundingBox to
__mangle_bounding_box. See the comments in the code and RT #2845
* test/test_layer.py (TestLayer.test_arc_layer_with_projection):
Remove the explicit test of ClipBoundingBox. The method isn't
public anymore and the direct call in the test wasn't necessary in
the first place. If ClipBoundingBox (now __mangle_bounding_box)
isn't called, the return value of ShapesInRegion will be
different.
2005-07-05 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
ZeroDivisionError exceptions. I don't know when they happen
exactly. It probably happens when the projections aren't set
properly.
2005-07-01 Bernhard Herzog <bh@intevation.de>
First step towards unicode. With this roughly we're at step 1
string_representation.txt
* Doc/technotes/string_representation.txt: New. Document how
strings are represented in Thuban and how to get to a Unicode
Thuban.
* Thuban/__init__.py (set_internal_encoding)
(unicode_from_internal, internal_from_unicode): New. The first few
functions for the internal string representation
* Thuban/UI/about.py (unicodeToLocale): Removed. Use
internal_from_unicode instead.
* Thuban/UI/__init__.py (install_wx_translation): Determine the
encoding to use for the internal string representation. Also,
change the translation function to return strings in internal
representation even on unicode builds of wxPython
* Thuban/Model/load.py (SessionLoader.check_attrs): Decode
filenames too.
(SessionLoader.start_clrange): Use check_attrs to decode and check
the attributes.
* Thuban/Model/xmlreader.py (XMLReader.encode): Use
internal_from_unicode to convert unicode strings.
* Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
unicode_from_internal when applicable
* test/runtests.py (main): New command line option:
internal-encoding to specify the internal string encoding to use
in the tests.
* test/support.py (initthuban): Set the internal encoding to
latin-1
* test/test_load.py (TestSingleLayer.test, TestClassification.test)
(TestLabelLayer.test): Use the internal string representation when
dealing with non-ascii characters
* test/test_load_1_0.py (TestSingleLayer.test)
(TestClassification.test, TestLabelLayer.test): Use the internal
string representation when dealing with non-ascii characters
* test/test_load_0_9.py (TestSingleLayer.test)
(TestClassification.test): Use the internal string representation
when dealing with non-ascii characters
* test/test_load_0_8.py (TestUnicodeStrings.test): Use the
internal string representation when dealing with non-ascii
characters
* test/test_save.py (XMLWriterTest.testEncode)
(SaveSessionTest.testClassifiedLayer): Use the internal string
representation when dealing with non-ascii characters where
applicable
2005-06-30 Bernhard Herzog <bh@intevation.de>
* test/runtests.py: Untabify.
2005-06-30 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
untabify.
2005-06-30 Bernhard Herzog <bh@intevation.de>
* Extensions/ogr/test/__init__.py: Add missing coding directive
2005-06-28 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
Use the default size for rendering selected items of default type.
Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
2005-06-28 Jan-Oliver Wagner <jan@intevation.de>
* Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
(APR_TClr.GetThubanColor): Fix bug in color interpretation.
Thanks to Frank Koormann who identified this problem.
* Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
another symbol identified.
2005-06-27 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual-de.xml: More translations.
2005-05-12 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/projdialog.py: Add missing import, which led to an
exception when opening a layer's projection.
2005-05-09 Bernhard Herzog <bh@intevation.de>
* test/support.py (FileLoadTestCase.filename): Fix doc-string.
2005-05-09 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
connection to autoconnect. Fixes RT#3148.
* test/test_postgis_db.py
(TestPostGISSpecialCases.test_simple_error_handling): New test
that attempts to reproduce RT#3148.
2005-05-06 Jonathan Coles <jonathan@intevation.de>
Add support for saving and loading the opacity and mask type
properties of RasterLayers. Also add support for proper use
of alpha information while drawing images not in 'RAW' format.
If transparency in an image format (e.g, PNG) is supported by
wxWidgets then the image would previously have been draw with
transparent regions, but the opaque regions would have been
unaffected by a change in the layer's opacity. This patch
corrects the problem.
* Thuban/Model/layer.py (RasterLayer): Added opacity and
masktype parameters to the constructor, and set the
appropriate variables to those values.
* Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
code to read the opacity and mask type of the layer and construct
a new layer with the additional parameters.
* Thuban/Model/save.py (SessionSaver.write_layer): Added code
to save the opacity and mask type of a layer.
* Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
the opacity of the layer to draw_raster_data rather than the layer.
(BaseRenderer.draw_raster_data): Remove the layer parameter because
the function doesn't need to know about the layer. Add the optional
opacity parameter whose default is 1.0. Add 'PNG' as a supported
graphics format.
* Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
signature to match that in BaseRenderer. Use the new opacity argument
in place of calling layer.Opacity(). In the case where the
format is not 'RAW', alpha_data is None and the loaded image has
alpha information, use the file's alpha information. This is
still subject to the layer's opacity setting.
* test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
Fixed signature to match that in BaseRenderer.
* test/test_load.py (TestRasterLayer): Change file_contents to
include opacity and masktype variables.
(TestRasterLayer.test): Include tests for opacity and masktype
changes.
* test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
test to cover a variety of combinations of masktype and opacity
settings.
2005-05-02 Jan-Oliver Wagner <jan@intevation.de>
* debian/rules: add --use-wx-python-swig-hack
to the build command.
Thanks to Moritz Lennert for pointing this out.
2005-04-28 Jan-Oliver Wagner <jan@intevation.de>
Introduce OGRFileShapeStore in ogr extension.
This allows at least that loaded shapefile shape stores
can be saved correctly in the thuban session file
and reloaded again (reload is via core shapefile
routine, not OGR). For other types, .thuban files
can not be reloaded for the time being.
* Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
class ist to be used for any file-based shape stores
accessed through OGR.
* Extensions/ogr/ogrstart.py (open_with_ogr): Added
forgotten _ for i18n. Adapted call OpenFileShapestore
regarding new parameter.
(OpenFileShapestore): Use OGRFileShapeStore instead of
OGRShapeStore. Fix return value (None instead of null).
Add new parameter "mainwindow" to avoid accessing global
context.
2005-04-27 Jan-Oliver Wagner <jan@intevation.de>
Introduce FileShapeStore as generalization for
file-based shape stores. In a first instance
this allows additional modules to handle shapefile
format as well, namely the OGR extension.
* Thuban/Model/data.py: Various small fixes in doc-strings.
(FileShapeStore): New class.
(ShapefileStore): Derive from FileShapeStore.
(ShapefileStore.__init__): Call __init__ of FileShapeStore,
rename self.table to self._table, initialize self._bbox
(ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
and self.FileName() instead of self.filename.
(ShapefileStore.Table): Use self._table instead of self.table.
(ShapefileStore.FileName): Removed (moved to FileShapeStore).
(ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
* Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
(SessionSaver.write_data_containers): Only use methods of the
base class FileShapeStore.
2005-04-26 Martin Schulze <joey@infodrom.org>
* Extensions/wms/wms.py (render_wms_layer): Adjusted the render
function to the modified render engine
2005-04-25 Martin Schulze <joey@infodrom.org>
* Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
Added a description according to the CVS log message
2005-04-23 Martin Schulze <joey@infodrom.org>
* Thuban/UI/renderer.py: Added a missing import
2005-04-23 Russell Nelson <nelson@crynwr.com>
* Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
way the previous tool is remembered, so that middle-button
panning works even if you haven't selected a tool.
2005-04-11 Bernhard Herzog <bh@intevation.de>
* libraries/thuban/wxproj.cpp: Move the compatibility code that
deals with the wxPython 2.4 version of wxPython.h into the #ifdef
branch that includes wxPython.h because it's only needed when
wxPython.h is used. Also, it won't compile when
USE_WX_PYTHON_SWIG_HACK is set otherwise.
2005-04-07 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
(ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
ClassGrid.__init__ and it's value is outside of the valid
range (must be < 32768). wxPython 2.5 complains about it with an
exception.
2005-04-05 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual-de.xml: More translations.
2005-04-05 Bernhard Herzog <bh@intevation.de>
* libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
wxPython 2.4 as well. Also, remove a now obsolete comment.
2005-04-05 Bernhard Herzog <bh@intevation.de>
Use wxPython.h by default but provide a workaround when it isn't
available.
* setup.py (wxproj_extension): New variable. Assign the Extension
instance for Lib.wxproj to this variable instead of putting it
directly into the listso that it can be accessed by other code
later.
(thuban_build_ext.user_options): Added boolean option
--use-wx-python-swig-hack.
(thuban_build_ext.initialize_options): Initialize the new option
to False.
(thuban_build_ext.finalize_options): If the new option was given,
define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
(thuban_build_ext): Update the doc-string
* libraries/thuban/wxproj.cpp: Normally we use
wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
defined, use swigPtrConvertHack.h instead.
* libraries/thuban/swigPtrConvertHack.h: Remove the code that was
copied over from wxPython.h.
(decode_pointer_new): New. Equivalent of decode_pointer for
wxPython 2.5.
(wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
* README: Add section on potential build problems which explains
how the work-around for a missing wxPython.h is activated.
2005-03-29 Bernhard Herzog <bh@intevation.de>
* test/postgissupport.py (find_postgis_sql): Added yet another
potential location for (lw)postgis.sql because the file has moved
again in postgis 1.0.0 rc4.
2005-03-29 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
match the site of the legend_icon_layer icon. Otherwise wxpython
2.5 complains when the legend is created with the error:
PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
in wxImageList: this might work on this platform but definitely
won't under Windows.
2005-03-23 Jonathan Coles <jonathan@intevation.de>
These changes add support for adjusting the opacity of a raster layer.
* Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
(RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
a LAYER_CHANGED event if the opacity actually changes.
* Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
layer parameter needed in the implementation of this method in
renderer.py.
* Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
typo 00 -> 0.
* Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
control to adjust opacity.
* Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
alpha data based on the opacity level of the layer.
* test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
accepts a layer parameter.
* test/test_layer.py (TestLayerModification.test_raster_layer):
Rename opacity method calls and add test for LAYER_CHANGED.
2005-03-16 Bernhard Herzog <bh@intevation.de>
* test/test_connector.py (DeletionTestMixin.check_deletions)
(DeletionTestMixin.check_deletetions): renamed to check_deletions.
update the callers.
2005-03-14 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual-de.xml: More translations.
2005-03-10 Jan-Oliver Wagner <jan@intevation.de>
Introducing initialization callbacks for extensions.
* Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
optional parameter init_callback.
(ExtensionDesc.init_ext): New. Executes the callback and sets
a status.
* Thuban/UI/application.py (ThubanApplication.OnInit): Add the
initialization of the extensions.
(ThubanApplication.init_extensions): Init all extensions.
* Thuban/UI/about.py (About.__init__): Added status of the extensions
to the about text.
* Extensions/gns2shp/__init__.py: Added init method for Extension
description.
(init): New. Contains the initialization of the module.
2005-03-04 Nina Hffmeyer <nhueffme@intevation.de>
* Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
OGRConnection to open a datasource. Removed dialog to display all
available drivers. Added some doc strings.
* Extensions/ogr/ogrstart.py: Added menu entry for opening an
OGRDatasource with a string. Added two opening methods which return an
OGRDatasource (either data from file or from DB).
* Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
represents a geometry reference of an OGRFeature. OGRShape now has a
list of referenced geometry objects (important for geometry
collections).
For OGRShapeStores loaded from a DB an ID column can be specified now.
2005-02-22 Jan-Oliver Wagner <jan@intevation.de>
* test/test_map.py (TestMapWithContents.test_tree_info):
Added label layer for comparison.
2005-02-18 Jonathan Coles <jonathan@intevation.de>
* libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
which builds a mask. Handle the majority of an image in a loop,
creating 8 bits at a time. Later, handle the edge case where less
than 8 bits are packed.
2005-02-18 Bernhard Herzog <bh@intevation.de>
* test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
doc-string
2005-02-18 Jonathan Coles <jonathan@intevation.de>
* setup.py: Remove wx_cs_params from gdal compile options.
2005-02-18 Jonathan Coles <jonathan@intevation.de>
Refactored baserenderer.py and renderer.py to remove baserenderer.py's
dependencies on wxPython. Added a new method projected_raster_layer()
that returns a raster layer image in projected space. This must be
implemented in classes derived from BaseRenderer. This also eliminates
the dependency on gdal in baserenderer.py.
* Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
new projected_raster_layer() to get projected raster image instead
of directly calling ProjectRasterFile().
(BaseRenderer.projected_raster_layer): New. This must be implemented
by derived classes. It takes almost the same arguments as ProjectRasterFile
did and returns a projected image with mask and alpha data (if requested).
(BaseRenderer.render_map_incrementally): Remove the check for gdal since
that check will be done in MapRenderer.projected_raster_layer(). This
also allows other implementations to use different projection code.
* Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
Implementation of BaseRenderer.projected_raster_layer. Checks for
gdal support and wxPython version. Also handles exceptions from
ProjectRasterFile.
* libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
and added a variable which can be set through the options argument
of ProjectRasterFile.
* test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
Calls ProjectRasterFile and returns the result.
(TestBaseRenderer.test_projected_raster_layer): New. Tests the results
of calling projected_raster_layer() with different options.
(TestBaseRenderer.test_raster_no_projection): Removed tests based on
wxPython version and all tests of masks and alpha channels. These are
now in test_projected_raster_layer().
2005-02-17 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/Model/map.py, Thuban/Model/label.py: Fixed
doc-strings to comply with coding_guidelines.
2005-02-17 Jan-Oliver Wagner <jan@intevation.de>
Docstring improvements and minor fixes for labellayer.
* Thuban/Model/map.py:
(Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
doc string.
(Map.BoundingBox): Removed superfluous test for label_layer
and improved doc string.
(Map.TreeInfo): Added label_layer and improved sdo string.
* Thuban/Model/label.py: Added import of _.
(Label, Label.__init__): Improved/added doc string.
(LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
Improved/added doc string.
(LabelLayer.AddLabel): Use already defined names for
align strings and improved doc string.
(LabelLayer.TreeInfo): New. Return the object data for
the tree view.
2005-02-16 Jonathan Coles <jonathan@intevation.de>
Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
so that that wxproj doesn't crash. Added GUI support for selecting
alpha channel (opacity can't be selected yet).
NOTE: If wxPython.h is including in future distribution packages
then it will not be necessary to have the files swigPtrConvertHack.h
and wxPython_int.h included with Thuban. This is hopefully
a temporary workaround.
* setup.py (thuban_build_ext.finalize_options): gdalwarp needs
access to the macro wxCHECK_VERSION so that it will properly
generate a bit mask. There was a problem between wx2.4 and wx2.5
that this works around.
* Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
of RasterLayer.MaskType.
(RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
(RasterLayer.MaskType): New. Returns the type of mask to use. Can
specify none, a bitmap, or an alpha channel.
(RasterLayer.SetMaskType): New. Set what kind of mask to use.
* Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
Set the raster warping options for the mask based on the value
of RasterLayer.MaskType.
* Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
deprecated calls to SetItemSelectedImage in favor of SetItemImage
with wxTreeItemIcon_Selected.
* Thuban/UI/rasterlayerproperties.py: Support selecting to use
an alpha channel for the mask.
* Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
data if it is available and an alpha channel is supported under
the current version of wxPython.
* libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
to select whether 1's or 0's select the desired portion of an image
in the bit mask. wx2.4 has a bug where the documentation is the opposite
from behavior.
(ProjectRasterFile): Only generate an alpha channel if the version
of wxPython is >= 2.5.3.
* libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
When wxPython >= 2.5.3 use the special swig functions to decode an
object's address.
* libraries/thuban/swigPtrConvertHack.h: Includes conditional code
based on the version of wxPython. If >= 2.5.3 use the special swig
functions from wxPython to decode wxPython objects, otherwise use
the old method of retrieving the address from the object __repr__ string.
* libraries/thuban/wxPython_int.h: Copied from wxPython source.
Unnecessary code was removed to make it smaller.
* test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
Add tests for returning an alpha channel.
* test/test_layer.py (TestLayerModification.test_raster_layer): Fix
tests that used removed functions UseMask and SetUseMask
2005-02-08 Bernhard Herzog <bh@intevation.de>
More wxPython 2.5 changes. This time taken from a patch from
Daniel Calvelo Aros.
* Thuban/UI/tableview.py (QueryTableFrame.__init__)
(QueryTableFrame.__init__): Pass the size of a spacer as a single
item.
* Thuban/UI/projdialog.py (ProjFrame.build_dialog)
(ProjFrame.build_dialog): Pass the size of a spacer as a single
item.
* Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
size of a spacer as a single item.
* Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
size of a spacer as a single item.
2005-02-08 Bernhard Herzog <bh@intevation.de>
Compatibility with wxPython 2.5. The changes should make it work
better with 2.5 while still keeping compatibility with 2.4. There
are still problems with 2.5, though.
* Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
of a spacer as a single item.
* Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
from wxControl
* Thuban/UI/legend.py (LegendTree): When running with wxPython <
2.5, add an implementation of the GetFirstChild method that does
not require the second parameter.
(LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
(LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
(LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
pass the second parameter to GetFirstChild
2005-02-08 Nina Hffmeyer <nhueffme@intevation.de>
* Extensions/ogr/ogrshapes.py: Removed some print commands.
* Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
additional menu but appears as a possibility in the menu Map.
2005-02-07 Jonathan Coles <jonathan@intevation.de>
* libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
and PYTHON_ERRF since they were no longer necessary.
2005-02-07 Bernhard Reiter <bernhard@intevation.de>
* Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
Enable translation for message string.
2005-02-06 Martin Schulze <joey@infodrom.org>
* Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
the arguments of the contstructor to fit the global scheme
2005-01-31 Nina Hffmeyer <nhueffme@intevation.de>
* Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
some dialogs needed to start ogr.
* Extensions/ogr/__init__.py: Changed comments to avoid encoding
warnings.
* Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
encoding warnings.
2005-01-28 Jonathan Coles <jonathan@intevation.de>
* libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
mask is packed into a bit array. It's now slightly faster.
2005-01-28 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
default to true.
* Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
code that loads the state of the layer's use_mask flag. Its
usefulness is still being debated.
* Thuban/Model/save.py (SessionSaver.write_layer): Remove
code that saves the state of the layer's use_mask flag. Its
usefulness is still being debated.
* Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
options to ProjectRasterFile based on the state of layer.UseMask().
Catch more exceptions from ProjectRasterFile so that Thuban doesn't
quit is there is a problem projecting.
(BaseRenderer.draw_raster_data): Change the documentation to
describe the new format (XBM) that the mask data will be in.
* Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
data is in XBM format when format='RAW' which means it doesn't
need to be converted to a wxImage before being used as a mask
for a wxBitmap. Assume that if format != 'RAW' that the image
data and mask data are in the same format.
* libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
and a mask is requested, convert the alpha band to a bit array in
XBM format. if an alpha channel is requested, simply return the
data in the alpha band. Provide better error handling by returning
python error messages (also fixes RT #2947).
(ProjectRasterFile): Support multiple mask options, rather than simply
a flag indicating that a mask should or should not be used. Provide
better error handling by returning python error messages.
* test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
Add mask data to test.
* test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
should use the mask by default.
(TestLayerModificaton.test_raster_layer): Test that a layer should use
the mask by default.
* test/test_load.py (TestRasterLayer.test): Remove testing for
use_mask flag in file.
* test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
for use_mask in file.
* test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
2005-01-26 Jonathan Coles <jonathan@intevation.de>
Add a new dialog box for raster layers. The dialog box allows
the user to toggle a mask that is generated by ProjectRasterFile
and is used to only draw the real parts of the projected image.
* Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
Instruct the warping code to generate a mask if the raster layer
requests one.
(BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
* Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
obsolete optional mask argument.
* Thuban/UI/classifier.py (Classifier): Change the parent class
to LayerProperties and rework the code to support layout calls
from the parent.
(Classifier.dialog_layout): New. Layout the dialog box.
(Classifier.map_layers_removed): Removed. Moved to parent class.
(Classifier.map_replaced): Removed. Moved to parent class.
(Classifier._OnTry): Renamed to OnTry to support parent class.
(Classifier.OnClose): Removed. Supplied in parent class.
(Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
(Classifier._OnOK): Renamed to OnOK to support parent class.
(Classifier._OnRevert): Renamed to OnRevert to support parent class.
* Thuban/UI/layerproperties.py: New. Base class for layer properties
dialog boxes.
* Thuban/UI/rasterlayerproperties.py: New. Class for displaying
raster layer properties.
* libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
with the non-simple version supplied with gdal. This allows added
features such as creating an alpha band.
(GetImageData): Generate a mask array from the alpha band that is
generated by gdal if the user has selected it. Try to support images
that have more than three bands, such as images with RGB plus an
alpha band.
(ProjectRasterFile): Convert python argument for mask and tell
gdal to enable or disable an alpha band.
* Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
describing what kind of layer the class is. Defaults to "Unknown",
but should be overridden by subclasses.
(Layer.Type): New. Override base class method.
(RasterLayer.__init__): Create a flag for using a mask. Record extra
data from gdal for display in the properties dialog.
(RasterLayer.Type): New. Override base class method.
(RasterLayer.UseMask): New. Returns True if the mask should be used.
(RasterLayer.SetUseMask): New. Set if the mask should be used.
(RasterLayer.ImageInfo): New. Return extra information about the image.
* Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
the mask information.
* Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
* Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
Classifier classes as dialogs to use with the proper layer types.
* test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
Fix test.
* test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
(TestLayerModification.build_path): New. Support function.
(TestLayerModification.test_raster_layer): New. Test new methods.
* test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
* test/test_load.py (TestRasterLayer): Add tests for mask.
* test/test_load_1_0_1.py: New. Copied from test_load.py.
* test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
obsolete optional mask argument.
2005-01-26 Nina Hffmeyer <nhueffme@intevation.de>
* Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
RowOrdinalToId() and ReadRowAsDict().
* Extensions/ogr/ogrstart.py: Added menu item which opens database
layers for existing database connections.
* Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
2005-01-26 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual-de.xml: More translations.
2005-01-24 Bernhard Herzog <bh@intevation.de>
Rework the status bar updates a bit to make sure the message about
the projections is produced at the right times.
* Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
New class variable with messages that may require a status bar
update.
(MainWindow.view_position_changed)
(MainWindow.update_status_bar): Rename from view_position_changed
to update_status_bar. It's meaning has changed now that it may
also generate messages about problems with projection settings.
(MainWindow.__init__): Use the new update_status_bar_messages
class variable to subscribe update_status_bar
(MainWindow.set_position_text): Update doc-string. This method
has to be renamed at some point. See doc-string and comments.
(MainWindow.OnClose): Unsubscribe update_status_bar from all
messages in update_status_bar_messages
* Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
class attribute. map messages to be forwarded by the viewport.
(ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
the messages in forwarded_map_messages
2005-01-21 Bernhard Herzog <bh@intevation.de>
* test/postgissupport.py (PostGISDatabase.__init__): Tweak
doc-string
(find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
different name for the initialization SQL file.
2005-01-21 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
a projection and returns a formatted string representing the
parameters to feed to gdalwarp. This function eliminates
redundancy in draw_raster_layer().
(BaseRenderer.render_map_incrementally): Removed the optimization which
drew the top most raster layer first and then only those vector-
based layers that are above it. With the support for transparency
this optimization breaks correct behaviour.
(BaseRenderer.draw_raster_layer): Reorganize code to support possible
future enhancements to raster layer bounding box. The old behaviour has
not changed. Also, change calling parameters to draw_raster_data()
to specify new RAW data format and mask.
(BaseRenderer.draw_raster_data): Change signature to include an optional
parameter for mask information. Change documentation to mention
support for new parameter and added option for RAW data format.
The data argument is now a list of [width, height, data].
* Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
mask parameter. Add new condition for RAW format, which
significantly reduces rendering time. Add condition for
mask parameter.
* libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
data array of RGB values from the projected image returned from
the gdal warping functions. In the case of palette based images, it
converts the NO_DATA index to the mask color.
(ProjectRasterFile): Removed all custom memory driver references
and replaced it with the standard in-memory dataset provided
by gdal. The return data is no longer a BMP file, but an array
of RGB values, one set triple per pixel.
* libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
* libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
* libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
* setup.py (thuban_build_ext.finalize_options): Removed mention
of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
files. These are obsolete with the new version of gdalwarp.cpp
* test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
Updated signature.
(TestBaseRenderer.test_raster_no_projection): Changed the test
data to be data in the uncompressed RAW format returned from
ProjectRasterFile.
2005-01-21 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
string available for i18n.
2005-01-20 Russell Nelson <nelson@crynwr.com>
* Resources/Projections/defaults.proj: Ruin the speling of the
Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
It's the wrong thing to do in the long run, but it's necessary for
those users until that bug is fixed. Otherwise the projection
dialog segfaults. Better to annoy some Lambert-93 users with a
spelling mistake than every Fedora Core 3 user of Thuban-CVS.
2005-01-20 Bernhard Reiter <bernhard@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
docstring and comment that the warning code here is a hack.
2005-01-20 Russell Nelson <nelson@crynwr.com>
* Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
user about misprojected layers when their lat/lon bounding
box exceeds rational lat/lon values.
2005-01-20 Bernhard Reiter <bernhard@intevation.de>
* Thuban/UI/about.py (unicodeToLocale): Improved:
Use 'ascii' and then 'replace' for other characters
when getdefaultlocale returns None. Thanks to Bernhard H. .
2005-01-20 Bernhard Reiter <bernhard@intevation.de>
* Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
that OnRangeText might be called twice and using None as argument.
2005-01-20 Bernhard Reiter <bernhard@intevation.de>
* Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
OnRangeText(0) to work around a different in wx Behaviour noticed
on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
2005-01-20 Bernhard Reiter <bernhard@intevation.de>
* Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
None. (Fixes rt#2910.)
2005-01-18 Frank Koormann <frank@intevation.de>
New Extension: mouseposition
Tool to collect mouse click positions (map coordinates) in a dialog.
* Extensions/mouseposition/__init__.py: New, extension registration
* Extensions/mouseposition/mouseposition.py: New, implements the
dialog and adds a tool to Thuban mainwindow.
* Extensions/mouseposition/position.xpm: New, icon for tool.
2005-01-14 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual-de.xml: More translations.
2005-01-11 Frank Koormann <frank@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
Fix indention bug.
2005-01-09 Frank Koormann <frank@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
BugFix 2901: Explicitly copy layers ClassificationColumn since it
is not part of the layers Classification.
2005-01-03 Frank Koormann <frank@intevation.de>
* Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
BugFix 2883: Former implementation only worked on classified point
layers: KeyError was raised, now use the default size if field is None.
2004-12-27 Bernhard Reiter <bernhard@intevation.de>
svgexport 1.0.0cvs: Fixed label export.
* Extensions/svgexport/test/test_svgmapwriter.py:
class TestSVGRenderer(): New class; new test test_label_font().
* Extensions/svgexport/svgmapwriter.py
(SVGRenderer.label_font()): initialised Font size with self.factor now,
makes test_label_font happy.
* Extensions/svgexport/TODO: crossed out fixed label export item.
Added item for options.
* Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
2004-12-27 Russell Nelson <nelson@crynwr.com>
Middle mouse button pans.
* Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
OnMiddleDown and OnMiddleUp events.
(MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
previously used tool.
(MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
pressing the middle mouse button.
2004-12-27 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual-de.xml: More translations.
2004-12-23 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
\n to stderr after the warnings. Thanks to Russell Nelson.
2004-12-20 Nina Hueffmeyer <nhueffme@intevation.de>
* Extensions/ogr/ogrshapes.py: Fixed some issues from
Bernhard (coding guidelines etc.). Additionally it is now possible to
display shapefiles containing feature collections (e.g.polygons
with holes). Works with gdal 1.2.1 now.
* Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
from Bernhard (coding guidelines etc.). If ogr can't be imported,
tests are skipped now.
* Extensions/ogr/ogrstart.py: Fixed some typings.
2004-12-20 Bernhard Reiter <bernhard@intevation.de>
* Extensions/svgexport/TODO: updated to add support for
raster layers and labels for 1.0.1.
* Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
Issue a warning now.
2004-12-19 Bernhard Reiter <bernhard@intevation.de>
* Extensions/svgexport/TODO: Added idea to support triggering
the application down the pipe.
2004-12-19 Bernhard Reiter <bernhard@intevation.de>
svgexport: Improved code quality, mainly by better naming.
* Extensions/svgexport/svgmapwriter.py:
DrawPath() renamed to DrawPolygonPath(),
added documentation, improved comments and variable names.
* Extensions/svgexport/svgmapwriter.py,
Extensions/svgexport/test/test_svgmapwriter.py:
All using DrawPolygonPath() now, the default parameter closed=True
omitted.
* Extensions/svgexport/test/test_svgmapwriter.py:
renamed test_polygon_opened() to test_polyline()
renamed test_transparent_polygon() to test_transparent_polyline()
2004-12-18 Jan-Oliver Wagner <jan@intevation.de>
Some fixes of gns2shp extension.
* Extensions/gns2shp/test/__init__.py: New. Make this directory a
package.
* Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
dynamically.
* Extensions/gns2shp/test/README: Simplified description how to test.
* Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
fixed some dimensions of fields according to the GNS documentation
which seems to change undocumented.
Now killing trailing \n and/or \r from MODIFY_DATE.
This fixes RT#2453.
2004-12-18 Bernhard Reiter <bernhard@intevation.de>
svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
* Extensions/svgexport/test/test_svgmapwriter.py:
Added new tests: test_export_polygon_with_hole()
and test_polygon_with_hole().
* Extensions/svgexport/svgmapwriter.py
(draw_polygon_shape()): Uses DrawPath correctly now.
* Doc/manual/thuban-manual.xml: Added documentation for stable
extention svgexport.
* Doc/manual/thuban-manual-de.xml: Copied English section about
svexport over.
* Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
* Extensions/svgexport/svgsaver.py,maplegend.py:
Moved from experimental to stable extension menu.
* Extensions/svgexport/TODO: updated.
2004-12-18 Bernhard Reiter <bernhard@intevation.de>
Added Extensions/svgexport/TODO
2004-12-18 Bernhard Reiter <bernhard@intevation.de>
Refactored in svgexport:
DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
* Extensions/svgexport/svgmapwriter.py
Added verbosity level 3 to print out polygon points.
(class Point): added __repr__
(class Brush, __str__()): Added space after ,.
(DrawPolygon): Renamed to DrawPath()
(DrawPath): Takes list of polygons as input now, adds \n before "M"s.
(DrawLines): Using DrawPath now.
* Extensions/svgexport/test/test_svgmapwriter.py:
Replaced DrawPolygon() calls with DrawPath() and put the first argument
inside another list. Adapted test data with a newline before "M".
2004-12-18 Bernhard Reiter <bernhard@intevation.de>
Refactored svgexport tests: 9 double tests runs eliminated;
code size reduced by 8 lines.
* Extensions/svgexport/test/test_svgmapwriter.py:
(class TestWithDC): Renamed to BaseTestWithDC, moved to top.
(class BaseWithDCtools): New, subclass from BaseTestWithDC.
(class TestDrawSplines): now subclass from BaseTestWithDCtools,
this fixed the double running of the nine tests of TestVirtualDC.
(class TestVirtualDC): Using self.dc and self.file from setUp().
2004-12-17 Bernhard Herzog <bh@intevation.de>
Two windows specific fixes ported from thuban-10-branch:
* Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
instead of getlocale because getlocale doesn't return a usable
encoding name on a german windows 2000
* setup.py: windows build: Removed the absolute path names and
made all prfixes relative to the directory containing setup.py.
Makes it a little easier to adapt to a different system.
2004-12-16 Bernhard Herzog <bh@intevation.de>
Add support for PostGIS tables with LINESTRING geometries.
Fixes RT#2299
* Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
* test/postgissupport.py
(PostgreSQLServer.get_default_static_data_db): Rename the "roads"
table to "roads-multi" because it now uses MULTILINESTRING
geometries and introduce a new "roads" table that uses LINESTRING
(coords_to_multilinestring): Make the doc string more precise
(coords_to_linestring): New. Create a LINESTRING WKT
representatin
(wkt_converter): Add coords_to_linestring
(upload_shapefile): Rephrase the doc-string a bit.
* test/test_postgis_db.py (TestPostGISShapestoreArc)
(LineStringTests)
(TestPostGISShapestoreLineString)
(TestPostGISShapestoreMultiLineString): Split
TestPostGISShapestoreArc into a base class LineStringTests and two
derived classes TestPostGISShapestoreLineString for LINESTRING
geometries and TestPostGISShapestoreMultiLineString for
MULTILINESTRING geometries. Most test methods are in the base
class with the exception of tests that explicitly check the raw
format.
2004-12-16 Bernhard Herzog <bh@intevation.de>
Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
* test/postgissupport.py (find_postgis_sql): Different postgis
versions put the postgis.sql file into slightly different places
so we have to look in both. The updated doc string describes this
is more detail.
* test/test_postgis_db.py
(TestPostGISSpecialCases.test_column_name_quoting): The return
value of UniqueValues is unsorted, so it has to be sorted for
comparison.
2004-12-16 Bernhard Herzog <bh@intevation.de>
Fix for RT#2237
* Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
panel to be shown is the UnknownProjPanel disable the OK and Try
buttons. Otherwise enable them.
(ProjFrame.__GetProjection): The UnknownProjPanel returns None for
the parameters. In that case __GetProjection also returns None
now.
2004-12-15 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
minimum number of classes to 2. The calculate_quantiles needs at
least two and raises an exception otherwise.
Fixes RT#2549
2004-12-15 Bernhard Herzog <bh@intevation.de>
* test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
so that it returns a result for select statements.
(PostgreSQLServer.server_version): New. Return the version of the
server software.
(PostgreSQLServer.require_authentication): The format of
pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
server version and generate the file in the correct format
2004-12-15 Bernhard Herzog <bh@intevation.de>
* test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
in the doc string and rephrase it a little.
2004-12-15 Frank Koormann <frank@intevation.de>
* test/test_load.py (TestAltPath.checkSession): New, extended checks if
session has been loaded successfully. The check is called by the relevant
tests after executing load_session().
2004-12-13 Bernhard Herzog <bh@intevation.de>
Make sure the region used to determine which shapes are visible
actually matches the region on the printed page. If this isn't
done properly some shapes might not be printed.
Fixes RT #2692
* Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
renderer has to be at the same position as the mapregion
* Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
has to be moved by (self.shiftx, self.shifty) too.
2004-12-13 Bernhard Herzog <bh@intevation.de>
* libraries/pyprojection/Projection.i: Work around a bug in the
generated python code which leads to exception in the __del__
method when the constructor fails. See the comments in the code
for more details.
* libraries/pyprojection/Projection.py: Updated from Projection.i
with SWIG.
2004-12-13 Bernhard Herzog <bh@intevation.de>
* test/test_load.py (TestAltPath.test_01_single_path_error_fix)
(TestAltPath.test_02_path_error_fix_from_list)
(TestAltPath.test_05_path_error_fix_from_list_changed)
(TestAltPath.test_06_path_error_fix_from_list_fails): self.session
is destroyed in tearDown, so there's no need to do it in a test
case.
* Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
debug print
2004-12-13 Bernhard Herzog <bh@intevation.de>
* Extensions/svgexport/test/test_svgmapwriter.py
(TestDrawSplines.setUp): Do not use super with the unittest
classes because in Python 2.2 they're still old-style classes.
2004-12-13 Frank Koormann <frank@intevation.de>
Alternative Path feature: When loading a (moved) session where
shapefiles cannot be found, ask the user. Use the specified path
if further shapefiles are missing. However, ask the usr for confirmation
in such cases.
* test/test_load.py (TestAltPath): New, tests for alternative path feature
in load_session()
(Shapefile_CallBack): Helper, implements controllable callback.
* Thuban/UI/application.py (ThubanApplication.OnInit):
Added "alt_path" to self.path
(ThubanApplication.OpenSession): Added shapefile_callback as second
callback similar to db_connection_callback.
(ThubanApplication.run_alt_path_dialog): New, implementaion of
shapefile_callback. In addition to raising the dialog the control of
self.path('alt_path') is implemented here.
* Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
(SessionLoader.open_shapefile): Open shapefile, eventually with
alternative path. This wrapps the "theSession.OpenShapefile(filename)"
formerly used in start_fileshapesource()/start_layer().
(SessionLoader.start_fileshapesource): Call open_shapefile().
(SessionLoader.start_layer): Call open_shapefile().
(load_session): Added shapefile_callback.
* Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
feature (search / check).
* Doc/manual/thuban-manual.xml: Added documentation of new feature.
2004-12-11 Bernhard Reiter <bernhard@intevation.de>
svgexport 0.9.2: Point size supports for maps.
* Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
(def draw_point_shape): new parameter size defaults to 2 as before.
(draw_shape_layer_incrementally): Moved draw_func log line higher.
Added draw_func call with size when dealing with a point layer.
* Extensions/svgexport/__init__.py: bumped version to 0.9.2.
2004-12-11 Bernhard Reiter <bernhard@intevation.de>
Made sure that newlines are inserted in the svg path d attributes
to raise the chance that the line length will be below 255 characters,
as recommended by REC SVG 1.1 in section 8.3.1.
* Extensions/svgexport/svgmapwriter.py(DrawPolygon):
Adding \n before L's and changed whitespace handling.
* Extensions/svgexport/test/test_svgmapwriter.py:
Adapted tests to new whitespace handling of DrawPolygon.
2004-12-11 Bernhard Reiter <bernhard@intevation.de>
* Doc/technotes/coding_guidelines.txt: easy typo fixed.
* Extensions/svgexport/test/test_svgmapwriter.py:
Removed test_drawbezier in favour of new test_drawspline3 and
test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
All only to test DrawSpline.
* Extensions/svgexport/svgmapwriter.py(DrawSpline):
New implementation now really using the strange algorithm of
xfig 3.1's approximated splines and its conversion to postscript
with one twist: SVG can do quadratic beziers, so skipped translation
to cubic beziers.
(TestWithDC): Typo in comment fixed.
2004-12-09 Martin Schulze <joey@infodrom.org>
* Thuban/Model/classgen.py: Added missing character encoding
* Extensions/wms/properties.py (OpenWMSProperties): removed
* Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
support for get_srs_discrepancies() since there are no
discrepancies anymore (was a thinko)
* Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
format priority now that more formats are supported globally by
the render engine.
2004-12-08 Silke Reimer <silke@intevation.de>
* Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
because it is not available in all versions of ogr
2004-12-08 Bernhard Reiter <bernhard@intevation.de>
* Extensions/ogr/__init__.py: Added empty __init__.py to heal
global tests until a real one is commited.
2004-12-07 Nina Hffmeyer <nhueffme@intevation.de>
* /Extensions/ogr/: Adding a new extension to read shapefiles with
ogr. It is planned to add other vector formats.
* /test/runtests.py: Adding tests from /Extensions/ogr/test/.
2004-12-07 Jan-Oliver Wagner <jan@intevation.de>
* /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
part of a (non-)fix to renable that the tests are always
executed.
2004-12-07 Bernhard Reiter <bernhard@intevation.de>
* Extensions/svgexport/test/test_svgmapwriter.py:
Added test_drawbezier() to test DrawSpline().
* Extensions/svgexport/svgmapwriter.py(DrawSpline):
Really implemented bezier drawing.
* Extensions/svgexport/__init__.py: Bumped version of svgexport
to 0.9.1 because now the legend examples lines styles
will be drawing with beziers.
2004-12-05 Martin Schulze <joey@infodrom.org>
* Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
GIF as supported bitmap image formats (helpful for the WMS extension)
2004-11-30 Martin Schulze <joey@infodrom.org>
* Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
Improved the test for the internal compare method
2004-11-27 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/about.py (About.__init__): Added
Norbert Solymosi for hungarian translation and Ole Rahn
as contributor. Moved Bernhard Reiter from Contributor
to Developer.
2004-11-27 Bernhard Reiter <bernhard@intevation.de>
* Extensions/svgexport/test/test_svgmapwriter.py:
Removed Jan from author list as he did not change enough significant
lines yet.
* Extensions/svgexport/__init__.py: Added Bernhard as author
of the Extension.
2004-11-27 Jan-Oliver Wagner <jan@intevation.de>
* po/hu.po: New. Hungarian translation. Contributed
by Norbert Solymosi.
2004-11-26 Bernhard Herzog <bh@intevation.de>
* Extensions/svgexport/test/test_svgmapwriter.py
(Testobjectexport.test_transparent_polygon): Commented out some
debug prints
2004-11-24 Jan-Oliver Wagner <jan@intevation.de>
Fix broken tests for svg extension and added svg legend
to Experimental menu.
* Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
the test run correctly even if the extension is a package.
Also removed the "import Thuban" which makes no sense.
* Extensions/svgexport/__init__.py: Fix to have the extensions'
test module also be executed from the global test routine.
This is done by looking for the absense of the DISPLAY variable.
* Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
to Experimental menu since this module has yet not reached a stable
status (ie. 1.0).
2004-11-22 Bernhard Reiter <bernhard@intevation.de>
* Extensions/svgexport/svgmapwriter.py:
Added verbose variable and some logging depending on it.
(class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
because counting i is not necessary.
(class Pen, class Brush): Added simple __str__ methods.
(SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
not exported to svg file) Note: holes still unhandled.
* Extensions/svgexport/test/test_svgmapwriter.py:
Made a baseclass TestWithDC for test needed a DC.
Added tests for bug #2698 (transparent polygons are not
exported to svg file):
Testobjectexport.test_transparent_polygon()
* Thuban/Model/base.py (UnsetModified):
Fixed some typos in docstring.
* Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
Added hints on the used algorithm for handling holes.
2004-11-20 Jan-Oliver Wagner <jan@intevation.de>
Some face lifting for the examples.
* Examples/__init__.py: Make this directory a package.
* Examples/simple_extensions/__init__.py: Make this directory a package.
* Examples/simple_extensions/hello_world.py: Moved entry from Extensions
menu to Examples menu.
* Examples/simple_extensions/simple_command.py: Some more comments,
minor changes.
* Examples/simple_extensions/simple_tool.py: Minor changes.
2004-11-20 Jan-Oliver Wagner <jan@intevation.de>
Changed way of extension registry for wms and added extension
registry for umn_mapserver extension.
* Extensions/wms/__init__.py: Added registry entry and the importing
of the actual wms module. Included a test for the required PyOGCLib.
* Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
* Extensions/umn_mapserver/__init__.py: Added registry entry and the
importing of the actual umn mapserver management modules.
Included a test for the required Python MapScript.
2004-11-20 Jan-Oliver Wagner <jan@intevation.de>
Changed way of extension registry for importAPR, bboxdump
and added extension registry for svgexport.extension registry for
svgexport.
* Extensions/importAPR/__init__.py: Added registry entry and the importing
of the actual importAPR module.
* Extensions/importAPR/importAPR.py: Removed registry entry (moved to
__init__.py).
* Extensions/bboxdump/__init__.py: Added registry entry and the importing
of the actual bboxdump module.
* Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
__init__.py).
* Extensions/svgexport/__init__.py: Added registry entry and the importing
of the svgsaver module.
* Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
to Experimental menu since this module has yet not reached a stable
status (ie. 1.0).
2004-11-18 Jan-Oliver Wagner <jan@intevation.de>
Now the hit test considers the size of point symbols.
* Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
'size' defaulting to the previously fixed value 5.
Extended doc-string.
(Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
for symbols.
Now the size of the largest point symbol is determined to find out
about whether the point has been hit.
This fixes the problem that only clicks inside a fixed distance of
5 where found.
2004-11-17 Jan-Oliver Wagner <jan@intevation.de>
Another open issue fixed regarding sizeable symbols: correct rendering of
selected symbols.
* Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
Added consideration of the specific size of point symbols.
The property for each point symbol is retrieved and the size applied
for the rendering method.
Added doc-string.
2004-11-16 Jan-Oliver Wagner <jan@intevation.de>
Changed way of Extension Registry for gns2shp and profiling.
* Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
__init__.py).
* Extensions/gns2shp/__init__.py: Added registry entry and the importing
of the actual gns2shp module.
* Extensions/profiling/profiling.py: Removed registry entry (moved to
__init__.py).
* Extensions/profiling/__init__.py: Added registry entry and the importing
of the actual profiling module.
2004-10-28 Bernhard Reiter <bernhard@intevation.de>
* Extensions/svgexport/: Minor improvements to doc strings.
2004-10-07 Jan-Oliver Wagner <jan@intevation.de>
Further elements for sizable point objects now
making this feature usable though not yet complete.
* Thuban/Model/save.py (SessionSaver.write_classification): Write
attribute 'size' for cldata when the shape layer is of point type.
This also now make the test_load.py tests happy.
* Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
gradient.
* Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
ID_SELPROP_SPINCTRL_LINEWIDTH.
(ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
(ID_SELPROP_SPINCTRL_SIZE): New Id.
(SelectPropertiesDialog.__init__): Added a second spin control
for the size in case the corresponding layer is of point type.
(SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
(SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
(SelectPropertiesDialog._OnSpinSize): New. Set size of property
and refresh preview.
2004-10-04 Martin Schulze <joey@infodrom.org>
* Extensions/wms/test/test_parser.py
(TestWMSCapabilitiesParser.test_compareLists): Added missing
self-test for compareLists()
(TestWMSCapabilitiesParser.test_compareDicts): Added missing
self-test for compareDicts()
(TestWMSCapabilitiesParser.test_compareLists): Adding more tests
to verify the test routine fails with non-equal arguments
(TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
to verify the test routine fails with non-equal arguments
2004-10-03 Jan-Oliver Wagner <jan@intevation.de>
First elements for sizeable point objects.
* Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
* Data/iceland_sample_size.thuban: New. Sample for sized point objects.
* test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
of a corresponding argument is given.
(TestSymbolSize): New. Test the size attribute of cldata.
* Thuban/Model/classification.py: Removed some trailing whitespaces.
(ClassGroupProperties.__init__): Set default size.
(ClassGroupProperties.SetProperties): Set the size.
(ClassGroupProperties.GetSize): New. Return the size.
(ClassGroupProperties.SetSize): New. Set the size.
(ClassGroupProperties__eq__): Compare also size.
(ClassGroupProperties__repr__): Print also size.
* Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
the size attribute.
* Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
Also, now there is a return value that indicates whether the drawing
size exceeded the given rect extent and if so the new extent.
Finally, point objects are drawn depending on the size. If either
the width or height is exceeded, the new extent is returned.
(ClassRenderer.Draw): Now when calling the previewer drawing function,
evaluate the return value and, if not None, adapt the grid widget size
accordingly and redraw again.
* Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
If the draw function is for points, call it with the size as additional
parameter.
(BaseRenderer.draw_point_shape): Added additional, optional parameter for
the size. Compute the radius using the size.
* Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
that Thuban supports size, apply this correctly.
* Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
2004-10-03 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual-de.xml: Started translation of
Map chapter.
2004-10-01 Martin Schulze <joey@infodrom.org>
* Extensions/wms/properties.py (wmsProperties.__init__): Extended
argument for general use through properties-dialog selector
* Thuban/UI/classifier.py: Register properties dialog classes for
both provided layer classes/types.
* Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
map can be retrieved through the parent which is passed to the
constructor anyway and doesn't require an argument of its own,
required for the unification of arguments for general use through
properties-dialog selector.
(MainWindow.OpenOrRaiseDialog): Move the logic for checking
whether a dialog is already opened (and raising it to the users
attention) and creating a new dialog into a function of its own
(MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
method
(MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
global registration of properties dialog classes (which are indeed
layer-specific).
* Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
for general use through properties-dialog selector, the map can be
retrieved through the parent and doesn't require an argument of
its own.
* Extensions/wms/wms.py: Register the properties dialog class for
the provided WMS layer
2004-09-28 Jan-Oliver Wagner <jan@intevation.de>
New feature: Registry for Extensions.
* Thuban/UI/extensionregistry.py: This module defines a registry for
Extensions.
* Thuban/UI/about.py (About.__init__): Added description
of the registered extensions with all of the information.
* Thuban/Model/extension.py (Extension): Improved doc-string.
* Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
Extensions/wms/wms.py: Added registration of the extension.
2004-09-27 Bernhard Reiter <bernhard@intevation.de>
More fixes to svgexport to make used ids unique and
conforming to XML's Name production.
* Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
test_xml_id_constraints(), test_make_ide_nosetbaseid() and
test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
Added Bernhard R. as author.
* Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
concatenation char now (makes test_make_ide_nosetbaseid() valid).
Also transform second id part with "%d" and catch the TypeError
to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
Corrected typo inBernhard's author line.
(SetBaseID): Return the transformed base id. Transform characters
which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
import binascii. If to be set string starts with "xml" or so, add "t".
(draw_shape_layer_incrementally): use the returned value of SetBaseID
for used_baseids checks.
2004-09-25 Bernhard Herzog <bh@intevation.de>
* test/test_layer.py (TestLayer.test_arc_layer_with_projection):
Remove a debug print and some tab characters.
2004-09-25 Bernhard Reiter <bernhard@intevation.de>
* Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
(SetBaseID, SetID, make_id): Improved docstring comments to explain
the interaction of the three functions and the XML id contrains.
2004-09-23 Jan-Oliver Wagner <jan@intevation.de>
* Doc/ThubanModel.xmi: New. UML file for Thuban Model
Module.
* Doc/README: Added info on ThubanModel.xmi.
2004-09-23 Jan-Oliver Wagner <jan@intevation.de>
* Doc/README: New. Some info about how to generate technical
documentation from the source code.
This text was send to the Thuban developer mailing list on
September 21st 2004 by Bernhard Reiter.
2004-09-21 Bernhard Reiter <bernhard@intevation.de>
Improved the svgexport to only use unique ids. Will issues
an error message dialoge when two layer names are the same.
ShapeIDs are now added with a dash within the svg ids.
* Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
* Extensions/svgexport/test/test_svgmapwriter.py: Added imports
(TestSVGRenderer): New test class with test_make_in() and
test_check_for_layer_name_clash()
* Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
and draw_shape_layer_incrementally() to not use a baseid twice,
satisfying test_check_for_layer_name_clash()
(VirtualDC.make_id): Use a dash between baseit and id, satisfies
test_make_in().
* Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
and wxICON_HAND.
(write_to_svg): Put dc and rendering in a try statement and on
catching SVGmapWriterError notify the user and delete the target file.
2004-09-20 Bernhard Reiter <bernhard@intevation.de>
* Model/base.by, Model/layer.py: Fixed typos in docstrings.
2004-09-03 Jan Schngel <jschuengel@intevation.de>
* Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
small bug with the line color. Now the line color will now only set
if it is set in Thuban an not Transparent.
* Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
deleting the layers from mapfile. Now all layers will delete backwards
from the last.
2004-08-20 Silke Reimer <silke@intevation.de>
* Thuban/Model/layer.py:
Fixes bug in projection handling: Otherwise very large region might not
have valid values in the layer's projection.
2004-08-20 Silke Reimer <silke@intevation.de>
* Thuban/UI/about.py:
small changes to be consistent with coding style.
2004-08-13 Martin Schulze <joey@infodrom.org>
* Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
Adjusted a comment
2004-08-11 Silke Reimer <silke@intevation.de>
* Thuban/UI/about.py: Small changes to encoding related stuff to avoid
too many and too enhanced imports of locale
2004-08-10 Silke Reimer <silke@intevation.de>
* Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
function unicodeToLocale() to convert special characters to users
locale encoding
2004-08-10 Jan-Oliver Wagner <jan@intevation.de>
* Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
lower case letter'
2004-08-09 Jan Schngel <jschuengel@intevation.de>
* ChangeLog: Rewrite the last ChangeLog entry to follow
the standard way.
* Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
the function where it is needed, because it don't works if it stands
at the beginning.
(MF_Layer.__init__): Removed the extra numclassed variable. Now
numclasses from the mapscript will be used.
(MF_Layer.get_index): New. Return the index of the layer in mapfile.
(MF_Layer.set_classes): New. A Classlist will be set to the layer.
(MF_Layer.set_metadata): New. A Metadata mapscript object will set.
(MF_Layer.remove_allclasses): New. All class of the layer will remove.
(MF_Map.create_new_layer): New. A new Layer is created and associated
with the mapscript object.
(MF_Map.set_layerorder): New. The Layer order like in thuban is set in
the mapscript.
(MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
linked to the layer in thuban, else the layerobject linked to the
thubanlayer will be used.
AnnotationLayer will now store the filename of the shapefile.
(MF_Map.remove_layer): If a layer is removed the associated object
must be set new.
* Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
layers which are exists in thuban to the mapobj. All removed Layers
will be removed from the mapobj.
Added comments to all functions.
(thuban_to_map): No layer will be removed here.
* Extensions/umn_mapserver/mf_handle.py
(_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
Layersettings for the mapserver kann be edited.
* Extensions/umn_mapserver/mf_import.py: Now all layers which are
imported, will be linked with the associated MF_Layer.
(import_mapfile): All layers, which are not selected, will be removed.
Disable the "import layer from mapfile" menu option.
* Extensions/umn_mapserver/sample/iceland.map: Set the status of the
Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
layer on permanently.
2004-08-03 Jan Schngel <jschuengel@intevation.de>
* Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
New. This function removes all metadata
(MF_Layer.set_group): New. Set the group setting.
(MF_Layer.get_group): New. Get the group setting.
(MF_Map): Removed the extra numlayers variable, used the mapscript
parameter instead.
(MF_Map.get_numlayers): New. This get numlayers.
(MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
(MF_Map.add_thubanlayer): Replaced the exception handling by a check
if the object is an instance. Also added the annotation layer here to
export, but only the layer is created in the mapfile.
* Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
the check if a mapobj exist, because its not needed anymore. The
export function is only available if a mapobj exist.
Use the new function to remove all layers.
* Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
option and the metadata button. The layer dialog is temporary disabled.
(Metadata_CustomDataTable): Added some functions to show the grid
correct.
* Extensions/umn_mapserver/mf_import.py: Moved the code for showing
the number of layer from import_mapfile to this function.
(AnnotationLayer): New. This Class shows the Annotation layer in
thuban. The layer don't do anything. It's only to show the layer
and to save the layer order.
(add_annotationlayer): New. Import an annotation layer to thuban.
(select_layer2import): New. Import only layers to thuban and not
the other settings like projection or scalebar.
(create_new_mapfile): Moved the _has_umn_mapobj function and the
create_new_mapfile functions from mf_handle.py to mf_import.py.
* Extensions/umn_mapserver/sample/iceland.map: Added the group
parameter to the roads and cultural layers. Also added a new
Annotation Layer for the cultural points.
* Extensions/umn_mapserver/sample/iceland.html: Added the select
option for the annotation layer.
* Extensions/umn_mapserver/sample/index.html: Added the start
parameter for the annotation layer.
2004-08-01 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual-de.xml (Chapter Session Management):
translation completed.
* Doc/manual/thuban-manual.xml (Chapter Session Management):
Fixed unprecise description for Save Session.
2004-07-31 Jan-Oliver Wagner <jan@intevation.de>
Started translation of Users Manual into german.
* Doc/manual/thuban-manual-de.xml: New. German Users Manual.
* Doc/manual/Makefile: Added build instructions for german
users manual.
* Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
2004-07-28 Jan Schngel <jschuengely@intevation.de>
* Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
functions. Now all metadata will handle by the function and its not
needed to initialize it from outside. Therefor the associated mapobj
will be stored in the Metadata Object. So we can use the special
functions from the associated mapobj to get the Metadata.
Therefor all initialization code for the metadata is removed from the
other classes.
(MF_Layer): Added a function to get the metadata object.
(MF_Map): Added a function to set the mappath, the path where
the mapfile ist stored.
* Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
to set the extent in the mapfile. Now the code is set by the displayed
data in the Thuban-view.
(export_mapfile): The shapepath is now set empty, until relative
pathnames are supported.
* Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
metadata. Yet only mapfile metadata are supported. Layer and class
supported are not implemented.
Added a dialog to handle layer informations. The dialog only shows the
selected layer at the moment.
* Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
code for setting the extent in thuban. Now the extent is set to the
given extent from the mapfile.
Fixed a logical mistake. Now the extent is set when realy a layer is
loaded, and not if one is selected to load.
* Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
move the shown map in the browser.
* Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
line to the mapobj and added metadata to the political layer.
* Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
for Metadata.
2004-07-26 Martin Schulze <joey@infodrom.org>
* Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
ClassMapper
* test/test_classmapper.py (TestMapping.test_mapper): Added a Test
case for the new ClassMapper
2004-07-22 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
visible extent of the map in projected coordinates
* test/test_viewport.py (SimpleViewPortTest.test_default_size)
(SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
tests.
(SimpleViewPortTest.test_visible_extent): New. The real test for
VisibleExtent()
2004-07-22 Bernhard Herzog <bh@intevation.de>
* test/test_viewport.py: Use support.run_tests as the main
function when running asa script.
2004-07-22 Jan Schngel <jschuengel@intevation.de>
* Extensions/umn_mapserver/mf_export.py: Added "import os"
Removed the old "import Thuban.UI.mainwindow" code.
(tbextent_to_map): Removed the extra function and at the code direct
to "thuban_to_map" function.
(write_creatorcomment): Added. Now a short comment is added to the
beginning of an generated mapfile.
(export_mapfile): Now the Path and filename are saved in to variables,
and not together in one variable. This is needed for the new
write_creatorcomment function.
* Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
import module "re". Also added Range and the ClassGroupRange import
from Thuban. Both are needed for the new range expression import.
(create_rangeexpression): Added. Creates a Range Expression in Thuban
style from a given mapfile expression.
(added_rasterlayer): Make some small code changes. The shapepath is
now stored in an extra variable and the clazz_name is set empty if no
class name set in the mapfile.
Changed the Error message for Range Expressions, becaus the new
function create a error string which will be shown in the dialog.
* Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
range expression import.
2004-07-21 Jan-Oliver Wagner <jan@intevation.de>
* Extensions/umn_mapserver/README: Added hint that
installation as root can be avoided. Removed all tabs.
2004-07-16 Bernhard Herzog <bh@intevation.de>
* test/test_viewport.py
(ViewPortTest.test_changing_map_projection): Check that changing
the projection of an empty map shown in a viewport doesn't lead to
exceptions in the viewport's handler for the
MAP_PROJECTION_CHANGED messages
* Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
try to keep the same region visible when the map actually contains
something
2004-07-15 Jan Schngel <jschuengel@intevation.de>
* Extensions/umn_mapserver/mapfile.py: Added a function to get the
mappath directly from the mapobj. Is needed because of the changes
in mf_import.py.
(MF_Layer.add_thubanclass): Added a new comment.
(MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
mapobj is empty there is no extent get from thuban an so no one can
set to th mapobj.
* Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
the discription.
Split the funktion in to three smaller ones. The new functions are
add_rasterlayer, add_polygonlayer and select_layer2import.
Removed the mapfilepath and filepath initialisation, because its know
include in the new functions.
Now nothing will be imported if cancel is pressed in the
layer choice dialog.
2004-07-14 Jan Schngel <jschuengel@intevation.de>
* Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
import.
(MF_Symbolset): Removed the extra variable for numsymbols.
(MF_Class.__init__): Added a comment to the exception clause.
Removed the extent init, because it was not needed anymore.
(MF_Layer.add_thubanclass): Added the code to set the class name to
the expression value from thuban if no label is defined.
Added the code to export Range expressions from thuban to the mapfile.
(MF_Map.set_extent): Removed the exception and replace it by some if
code. If the size of a map is not defined the size will be set to 1,1.
This is necessary because if the extent is set, mapscript checks if
the size is greater than zero.
(MF_Web): Added the get and set function for the template.
* Extensions/umn_mapserver/mf_export.py: Added the function to check
if a mapobject exists and used it to set the status of the menu items.
If no mapfile exists the settings could not be edditied.
Define after which menuitem the exportitem will include.
* Extensions/umn_mapserver/mf_handle.py: Removed the import
Thuban.UI.mainwindow clause, because it is not needed.
Added the command Refresh() to all "OnChangeColor()" functions,
because the color preview window was not updated on a color change.
Added the function to check if a mapobject exists and used it to set the
status of the menu items. If no mapobject exists the settings could not
be edditied.
(Map_Dialog): Moved the imagetype selector from the
Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
(Web_Dialog): Removed the name label and added the template textbox.
* Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
the exception handling on loading the layers by an if statement. It
is not necessary to us the exception there.
The Filepath creation now use os.path.join to build the path.
* Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
definition from global to the setUp function. Now the testMap will
initialize new on each test.
* Extensions/umn_mapserver/sample/iceland.map: Include three new
classes in the Line Layer, to test logical Expressions.
Set the status of the class "Point9" in the Point Layer to off
2004-07-13 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/baserenderer.py
(BaseRenderer.render_map_incrementally): Fix a logic bug in the
optimization that tries not to draw layers under a raster layer.
The bug was harmless. All it effectively did was to produce The a
strange messages about not being able to draw Layer instances for
all vector layers below a raster layer which would be invisible
anyway because the raster layer currently always covers the entire
window
2004-07-08 Jan Schngel <jschuengel@intevation.de>
* Extensions/umn_mapserver/mapfile.py: Added code to generade and get
a list of supported outputformats. This formats are not alle supported
because there is no possibility to get the outputformat without the
name known. Make some formal changes to the code.
(MF_Map.set_name()): Fixed a bug if the name is None.
* Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
statement, because its not needed anymore. The Outputformat is now
given as string from the object. Make some formal changes to the code.
* Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
most of the new setting which were added during the last changes.
Removed the MF_Size Test.
* Extensions/umn_mapserver/test/test.map: Added a new class to the
cultural Layer to test expressions and the the status of that layer
from on to default.
Changed the data path the the correct Thuban Data
Added the Outputformat Object and Symbol Object
2004-07-07 Jan Schngel <jschuengel@intevation.de>
* Extensions/umn_mapserver/mapfile.py: Added some new
settings to edit (outputformat, label, imagetype)
* Extensions/umn_mapserver/mf_handle.py: Added some setting to
the Label Dialog and add the OutputDialog.
Make some changes to the code order.
2004-07-06 Jan Schngel <jschuengel@intevation.de>
* Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
and line Obj and add the scalebar_status_type, scalebar_style_type and
scalebar_position_type.
Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
are only used to create a Symbol like the circle in Thuban.
Added the scalebarObject (MF_Scalebar)
(MF_Class): Added set_status and get_status.
(MF_Layer.add_thubanclass): Added code to set the class status
(MF_Map): Added code to handle the symbols and scalebar
(MF_Label): Added the set_partials and get_partials functions
* Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
from mapfile. Added a function to create a circle object like the one
from thuban if no one exists.
* Extensions/umn_mapserver/mf_handle.py: All colors are now set when
press ok in the assosiated dialog and not at the end of the
colordialog.
Added the Dialog for the Scalebar.
(Label_Dialog): Added the offset option
* Extensions/umn_mapserver/mf_import.py: Added code to import the
status of the Classes.
Fixed a bug with the projection. Now the to_meter parameter will be
added to the Projection only if it doesn't exists.
2004-07-01 Jan Schngel <jschuengel@intevation.de>
Added the functionality to handle the content thuban is not
able to handle directly.
* Extensions/umn_mapserver/mf_handle.py: New. This module extents
Thuban with the possibility to edit the mapfile content.
* Extensions/umn_mapserver/mf_import.py: Added the possibility
to import mapfiles without any layer selected. So it is possible
to edit the other settings in a mapfile.
(import_mapfile): Added code to use the editing functions.
Added the possibility to import the projection to a layer if one
is defined.
Status settings (On,Off) will now set in thuban (visible, invisible).
fixed a bug with with classnames. If no classname is set in mapfile
the value in Thuban will set to the expression.
* Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
possibility to save a new mapfile or use the old one which is
imported or new created.
Added code to use the editing functions.
Remove some not needed import statements
* Extensions/umn_mapserver/mapfile.py: Added new types which are
need for the editing functions.
Added needed set-functions for the editing functions.
Added the possibility to export rasterimages.
Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
moment.
(MF_Class.set_thubanstyle): Now point layers will set to a default
symbol to show a circle in mapserver and not only a 1px dot.
(MF_Style.__init__): Fixed a bug with the color. Color was not set
correct before.
(MF_Size): Removed, because it is not needed.
* Extensions/umn_mapserver/README: Added the hints to use the
export and editing functions, too.
* Extensions/umn_mapserver/sample/iceland.map: Added the
new parameter "UNITS METERS".
Change the political layer to status OFF.
* Extensions/umn_mapserver/sample/README: Added some
more details to setup the sample in the MapServer.
2004-06-26 Bernhard Reiter <bernhard@intevation.de>
* Extensions/svgexport/test/test_svgmapwriter.py:
Removed class VFile and used standard StringIO instead.
2004-06-23 Jan Schngel <jschuengel@intevation.de>
Add the export function to the umn_mapserver extension.
* Extension/umn_mapserver/mf_export.py: New. This module extents
Thuban with the possibility to export the Thuban content.
* Extensions/umn_mapserver/mapfile.py: Expand the classes to use
with the export module. Especially added the possibility to
add thuban objects directly to the map objects.
* Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
because of the hint from Bernhard Herzog.
Corrected the handling of absolute pathnames.
Changed the Text of the Menu-Item, now the beginning is upper case.
* Extensions/umn_mapserver/README: Added the --with-tiff statement.
2004-06-16 Jan Schngel <jschuengel@intevation.de>
Add a sample and make some changes.
* Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
import from * to explicit used statements. Changed the
Thuban.UI.mainwindow import phrase, too.
(import_mapfile):Corrected a clerical mistake.
Added wxCHANGE_DIR in OpenFile Dialog.
Added a MultipleChoiceDialog, to select the layers to load from
mapfile into thuban. Thereby the projection is only set if one layer
is selected.
Added the possibility to handle relative pathnames which uses
up-level references.
Removed some doubled code.
Corrected an error with integer values used as label in thuban
ClassGroup.
* Extensions/umn_mapserver/sample: New.
* Extensions/umn_mapserver/sample/README: New. Describes the
usage of the sample files.
* Extensions/umn_mapserver/sample/iceland.map: New. This is
a suitable .map-file for the iceland data.
* Extensions/umn_mapserver/sample/index.html: New. The template
for the mapfile.
* Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
file for the Iceland Application on web.
* Extensions/umn_mapserver/README: Corrected a inaccuracy and added
some details.
* Extensions/umn_mapserver/test/test_mapserver
(mapserver_import_Test_generalClasses.test_MF_Color):
Corrected the thubancolor test.
2004-06-15 Jan Schngel <jschuengel@intevation.de>
* Extensions/umn_mapserver/README: New. Install instruction.
2004-06-14 Bernhard Reiter <bernhard@intevation.de>
* libraries/thuban/cpl_mfile.h: Added copyright header.
* libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
Free Software License so that it is most useful with gdalwarp
and bmpdataset.
2004-06-14 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/multiplechoicedialog.py (__version__): Add missing
import of wxPython.wx itself (as opposed to the contents of
wxPython.wx). For some reason wxPython.wx is available as
wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
wrt. wxPython 2.4.
2004-06-10 Jan Schngel <jschuengel@intevation.de>
Initial version of new extension "umn_mapserver". This extension aims
to manage configuration for the UMN MapServer application. This
inital version just imports the .map-files and displays all, Thuban is
capable of.
* Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
* Extensions/umn_mapserver/test/README: New. Describes how to run the
tests.
* Extensions/umn_mapserver/test/test.map: New. This is a test
.map-file for automated tests of the umn_mapserver extension of
Thuban.
* Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
UMN Mapserver classes.
* Extensions/umn_mapserver/__init__.py: New. Init to make this
directory a package.
* Extensions/umn_mapserver/mapfile.py: New. Classes to represent
'.map'-file objects.
* Extensions/umn_mapserver/mf_import.py: New. This module extends
Thuban with the possibility to handle UMN MapServer mapfiles.
2004-06-03 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
to a tuple before using it as arguments to the % operator. This
fixes the formatting issue filed in RT#2239 on 2004-01-13 and
reported today on thuban-list by Jan Schngel
* test/test_layer.py (TestLayerModification.setUp): Save the
filename as an instance variable so we can refer to it in tests
(TestLayerModification.test_tree_info): Uncomment this method
again and make it work. This tests for the formatting issue
filed in RT#2239 on 2004-01-13
2004-05-28 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/baserenderer.py: Fix some typos.
2004-05-18 Jan-Oliver Wagner <jan@intevation.de>
* Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
by increasing a field size.
2004-05-17 Bernhard Herzog <bh@intevation.de>
Update to newest shapelib and get rid of Thuban specific
extensions, i.e. use the new DBFUpdateHeader instead of our
DBFCommit kludge
* libraries/shapelib/shpopen.c: Update to version from current
shapelib CVS.
* libraries/shapelib/shapefil.h: Update to version from current
shapelib CVS.
* libraries/shapelib/dbfopen.c: Update to version from current
shapelib CVS.
(DBFCommit): Effectively removed since shapelib itself has
DBFUpdateHeader now which is better for what DBFCommit wanted to
achieve.
We're now using an unmodified version of dbfopen.
* setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
value '1' to the Lib.dbflibc extension. This simply reflects the
shapelib and pyshapelib updates
2004-05-16 Jan-Oliver Wagner <jan@intevation.de>
Finished introduction of Menu.FindOrInsertMenu.
* Extensions/drawshape/drawshape.py: Add the command
to the experimental menu additionally to the toolbar.
* Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
finding menu on its own.
* Doc/manual/thuban-manual.xml: updated sample file
to use FindOrInsertMenu().
* Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
instead of finding menu on its own.
2004-05-11 Jan-Oliver Wagner <jan@intevation.de>
* test/test_menu.py (MenuTest.test): Added testing
of method Menu.FindOrInsertMenu.
2004-05-10 Jan-Oliver Wagner <jan@intevation.de>
Introduce and use Menu.FindOrInsertMenu.
* Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
given menu or, if not found, insert it.
* Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
/Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
/Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
menu on its own.
2004-05-06 Jan-Oliver Wagner <jan@intevation.de>
Introduce a abstract ColorDialog class and remove
and outdated file.
* Thuban/UI/proj4dialog.py: Removed. It is has been
replaced by projdialog for quite a while and is not used
anymore.
* Thuban/UI/colordialog.py: New. Abstraction for color selection
dialog(s).
* Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
Now calls the abstract ColorDialog instead of wxColourDialog.
This also removed the dependency to Color class conversion
from this function.
2004-05-04 Frank Koormann <frank@intevation.de>
* Extensions/bboxdump/__init__.py: Fixed string left over from
copying.
* Extensions/bboxdump/bboxdump.py (bboxdump):
Use layer.ShapeStore().AllShapes() to loop over shapes instead of
xrange(layer.NumShapes()). Compile the bboxmessage from a list
of formatted outputs (string.join) instead of appending to the
message. Two progress bar dialogs to report progress on the sometimes
lenghty processing.
2004-04-22 Frank Koormann <frank@intevation.de>
New Extension to dump bounding boxes of all shapes of the selected
layer. An optional column can be specified to group the objects,
in this case the bounding box is a union of the separate boxes.
Dump can be displayed in a ScrolledMessageDialog or written to file.
The Extension is simply a combination of available and well tested
Thuban functionality.
* Extensions/bboxdump/__init__.py: New: Init to make this
directory a package.
* Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
all shapes of the selected layer.
2004-04-22 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
strings to be i18n now.
2004-04-18 Jan-Oliver Wagner <jan@intevation.de>
Changing popup menu of legend from direct building
to using the Menu construction as used for the mainwindow.
* Thuban/UI/mainwindow.py: New method commands: layer_to_top,
layer_to_bottom, layer_visibility
(MainWindow.LayerToTop): New. Put current layer to the top.
(MainWindow.LayerToBottom): New. Put current layer to bottom.
(MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
Replace 1,0 by True, False.
(MainWindow.ToggleLayerVisibility): New. Toggle visibility of
current layer.
(MainWindow.LayerShowTable): Removed raising of dialog.
(_has_selected_layer_visible): New. Support function.
* Thuban/UI/legend.py: ID_POP_xxx: removed.
(LegendPanel.__init__): Removed EVT_MENU bindings.
(LegendTree._OnRightClick): Replace direct creation of
menu via wx Classes by applying the menu definition
as of Menu class of menu.py.
2004-04-16 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
button string to stronger clearify that Thuban will be closed when hitting
the button.
* Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
Now for layers without a ShapeStore a corresponding message is given
to the user, that this layer has no table to show.
2004-04-15 Martin Schulze <joey@infodrom.org>
* Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
recalculate the format for the internal render engine as well.
* Extensions/wms/properties.py (wmsProperties): First start for a
properties dialog. It's functional for a first selection of
layers, but still has some weired wxWidgets/GTK problems but
beautification can be done later.
* Extensions/wms/layer.py: Added more documentation
(WMSLayer.getFormats): New: Return list of supported image formats
by the WMS server
(WMSLayer.getLayers): New: Return the list of layer names
supported by the WMS server
(WMSLayer.getLayerTitle): New: Return the title of the named layer
(WMSLayer.getWMSFormat): New: Return the image format that is used
for WMS GetMap requests
(WMSLayer.setWMSFormat): New: Set the image format that is used
for WMS GetMap requests
(WMSLayer.__init__): Move away from using only one layer to using
a list of layers (unsorted at the moment, though).
(WMSLayer.getVisibleLayers): New: Return the list of names for all
visible layers
(WMSLayer.setVisibleLayers): New: Set the list of names for all
visible layers
* Extensions/wms/wms.py: Moved the WMS layer into layer.py in
order to establish a clean structure.
* Extensions/wms/layer.py: Moved the WMS layer into a file on its
own in order to establish a clean structure.
2004-04-13 Martin Schulze <joey@infodrom.org>
* Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
support for oldstyle (WMS 1.0 apparently) image format
specification.
* Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
supported graphic formats back to JPEG and BMP, PNG and others are
too *cough* experimental... Sorry, I meant to filter this out
before I committed this part. This should make the WMS extension
run from CVS again.
(wms_dialog): Reset an empty URL to None so that the subsequent
program can depend on this, since the dialog will indeed return an
empty URL, causing another declaration of love by Python.
* Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
Whenever a native BoundingBox request cannot be fulfilled, check
whether the requested SRS is EPSG:3426, in which case return the
LatLonBoundingBox values.
* Extensions/wms/test/test_parser.py
(TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
ignoring AUTO:* SRS.
(TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
Added another test method to test whether the LatLonBoundingBox
values will be returned if BoundingBox values are requested with
SRS set to EPSG:3426.
* Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
Added rudimentary support for non-EPSG SRS, i.e. ignore them for
the moment by placing them into a variable which is currently
unused. Also test whether the EPSG SRS is numerical as it should
be and add an error message if it is not.
* Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
appear in the real world as well. Since we cannot handle them yet
(OGCLib can't either), we will ignore them for the moment.
* Extensions/wms/parser.py: Use a variable for denoting the sample
filename
(WMSCapabilitiesParser.peekLayers): Added support for error
messages during grok(). They will be aggregated in an array and
may be displayed later. We may have to add a classification
"Warning" and "Error" to this. That requires more experience,
though, since not every error may be lethal.
* Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
ShowTable() dialog/frame when the user attempts to display it
while it has been opened before already and not closed again.
2004-04-11 Martin Schulze <joey@infodrom.org>
* Extensions/wms/infodialog.py: Adjusted the class documentation
* Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
Switch to using Thuban{Begin,End}BusyCursor instead of the pure
wxWidgets variants.
(WMSLayer.__init__): The epsg_id variable is named top_srs now.
* Extensions/wms/infodialog.py: Added an information dialog that
will display various information about the WMS current resource,
so that additional information such as the title, the abstract,
fees and access constraints can be displayed for the user if they
are documented in the WMS XML.
2004-04-10 Martin Schulze <joey@infodrom.org>
* Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
string handling. It's "foo".lower() and not lower(foo) without
lower imported from strings or something.
* Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
from capabilities.py and parser.py. Implement priority list for
supported graphics formats, take care of wbmp != bmp. PNG, TIFF
and GIF are supported here, but not yet by main Thuban. Hence,
support for them may be removed later. Special contribution to
usability: get wxWidgets to change the cursor when we're waiting
for data from the network so the user won't start to worry. This
causes a redrawing error/warning, though.
* Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
the DOM object.
2004-04-01 Martin Schulze <joey@infodrom.org>
* Extensions/wms/capabilities.py: Adjusted documentation
(WMSCapabilities.__init__): Improved documentation, fixed syntax
(WMSCapabilities.saveCapabilities): Only catch IOError when
handling files
(WMSCapabilities.loadCapabilities): Only catch IOError when
handling files
__main__: corrected variable naming
(WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
class a specialisation of WMSCapabilitiesParser as well. Also
execute grok() after loading or fetching capabilities, if that
went well, so that subsequent calls can already access the data.
(WMSCapabilities.getVersion): Export the used version of the
GetCapabilities request, so we can use it for subsequent calls,
i.e. for GetMap requests.
(WMSCapabilities.fetchCapabilities): Added proper error handling
when the GetCapabilities request failed, so that the surrounding
program can act accordingly.
2004-03-30 Martin Schulze <joey@infodrom.org>
* Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
Adjusted the getLayerSRS method to return the list of SRSes
extracted from <SRS> elements instead of <BoundingBox> elements.
Added a bit of documentation as well.
(WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
since it was only implemented due to a misunderstanding.
* Extensions/wms/test/test_parser.py
(TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
reflect the corrected interpretation of the standard: i.e. a layer
does not have to define a BoundingBox for all SRSes it supports.
Hence the <SRS></SRS> specification is authoritative, not the list
of BoundingBoxes.
(TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
to ensure None is returned for a non-existing SRS.
(TestWMSCapabilitiesParser.test_grok): Removed test_grok method
since it is not applicable anymore. Listing more SRSes in <SRS>
elements is valid according to the specs.
2004-03-26 Bernhard Reiter <bernhard@intevation.de>
* README: Nicer formatting of text. Improved descriptions.
Reflected wxWidgets name change.
* Thuban/UI/about.py: Extended copyright to 2004 and added
information about the thuban-devel mailinglist.
2004-03-24 Martin Schulze <joey@infodrom.org>
* Extensions/wms/capabilities.py: Renamed the class to contain
'WMS', also added a linebreak where required
* Extensions/wms/parser.py: Finally added the XML parser for the
GetCapabilities response.
* Extensions/wms/test/sample.xml: Adjusted the sample file so that
<SRS> elements match the <BoundingBox> elements, except for the
layer 'beschriftung'.
* Extensions/wms/test/test_parser.py: Encode non-ascii strings
since Python uses unicode strings internally, otherwise
comparisons will fail. Removed tests for getLayerBBoxSRS() since
the SRS will be calculated anyway and this method is obsoleted by
getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
Move loading the sample file into the setUp method. Added a test
for finding the integrity problem in the sample response.
Improved formatting.
* Extensions/wms/domutils.py: Added convenience routines for
handling of Document Object Model (DOM) nodes.
* Extensions/wms/test/test_domutils.py: Added a test for the
domutils module
2004-03-19 Martin Schulze <joey@infodrom.org>
* Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
Moved path detection and adding into a module of its own,
adjustpath, which exports thubandir as main Thuban directory.
* Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
detection and adding into a module of its own, adjustpath, which
exports thubandir as main Thuban directory. Reorganised the
module in order to support the SkipTest feature for Thuban test
cases.
* Extensions/wms/test/adjustpath.py: Moved path detection and
adding into a module of its own.
2004-03-18 Martin Schulze <joey@infodrom.org>
* Extensions/wms/test/test_parser.py: Added another test for
checking whether the WMS XML parser (to be implemented) returns
the information we expect. This requires a sample WMS WML file
(sample.xml) which has been extracted from the frida server and
"improved" manually.
* Extensions/wms/test/test_ogclib.py: Added legacy code to add the
main Thuban directory to the path in order to be able to import
random modules. Adjusted the PyOGCLib detection to reuse the
information gathered. Also added a note about the PYTHONPATH
environment variable.
* Extensions/wms/test/test_ogclib.py: The format specification is
a mime-type, not a graphic format, hence image/jpeg wou ld be the
proper format and not JPEG. We'll also have to take care of the
encoding of / as %2F.
2004-03-16 Martin Schulze <joey@infodrom.org>
* Extensions/wms/test/test_ogclib.py: Added a (hopefully)
comprehensive test for the getMapURL method, built compare URLs
according to the documentation in OGC 01-068r3
* Extensions/wms/capabilities.py (WMSCapabilities): Added the
class WMSCapabilities to manage capabilites, will incorporate
parsing the capabilities response and provide details for other
classes.
2004-03-12 Bernhard Herzog <bh@intevation.de>
Support views in addition to normal tables in the postgis
shapestore
* Thuban/Model/postgisdb.py
(PostGISShapeStore._fetch_table_information): Add a fallback for
the case where the table name is not in the geometry_columns
table. This is usually the case for views. Also, set
self.shapestore here.
(PostGISShapeStore.ShapeType): No need to query the database all
the time. The shape type is now determined in
_fetch_table_information
* test/postgissupport.py (PostgreSQLServer.new_postgis_db)
(PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
New parameter to specify views.
(PostGISDatabase.has_data): Also compare the views. New views
parameter
(PostGISDatabase.initdb): Create the views.
(PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
view
* test/test_postgis_db.py
(TestPostGISShapestorePointFromViews): New. Test a
PostGISShapeStore with a view
(TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
the geometry_column explicitly to test whether that works
2004-03-12 Bernhard Herzog <bh@intevation.de>
Final step for explicit id/geometry columns: Loading and saving
* Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
with the following changes:
(dbshapesource): Two new attributes id_column and geometry_column
* Thuban/Model/save.py (SessionSaver.write): Use the new dtd
(SessionSaver.write_session): Use the new namespace
(SessionSaver.write_data_containers): Write the new dbshapesource
parameters
* Thuban/Model/load.py (SessionLoader.__init__): New namespace for
the new file format version
(SessionLoader.start_dbshapesource): Handle the new db parameters
* test/test_save.py: Update to the new dtd and namespace
(SaveSessionTest.test_save_postgis): Update the NonConnectionStore
mock object to provide a working IDColumn method.
* test/test_load_1_0.py: New. Copy of the test_load.py before
today's changes but with the round-trip tests removed.
* test/test_load_0_9.py: Update doc-string.
* test/test_load.py: Update all .thuban files to the new dtd and
namespace.
(TestPostGISLayer.file_contents): Add the new dbshapesource
paramters
2004-03-11 Bernhard Herzog <bh@intevation.de>
Next step for explicit id/geometry columns: User interaction
* Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
the dialog is constructed. Add combo boxes to select id and
geometry column. Rename some instance variables.
(ChooseDBTableDialog.GetTable): Return id and geometry column
names
(ChooseDBTableDialog.OnTableSelect): New. Event handler for
selections in the table list
* Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
and geometry_column
* Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
parameters for id_column and geometry column of PostGISShapeStore
here as well.
* Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
(_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
(PostGISConnection.GeometryTables): Use a better query to
determine which relations in the database might be usable for
shapestores. Now supports views as well but is more PostgreSQL
specific
(PostGISConnection.table_columns): New. Somewhat experimental
method to let the db dialogs provide lists of columns to users so
that they can select id and geometry columns.
(PostGISTable.__init__): The default value of the id_column
parameter is now None it still means "gid" effectively, though.
(PostGISTable.IDColumn): New introspection method to return a
column object for the id column
(PostGISShapeStore.GeometryColumn): New introspection method to
return a column object for the geometry column
* test/test_postgis_db.py
(TestPostGISConnection.test_gis_tables_non_empty):
Removed. Subsumed by the new:
(TestPostGISConnection.test_gis_tables_with_views_and_tables):
New. Tes the GeometryTables and table_columns methods with actual
tables and views.
(PointTests.test_id_column, PointTests.test_geometry_column):
New. tests for the new methods.
(TestPostGISShapestorePoint.setUp)
(TestPostGISShapestorePointSRID.setUp)
(TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
instance variables needed by the new tests
2004-03-11 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
numbers given to ReadValue are ordinals.
2004-03-11 Bernhard Herzog <bh@intevation.de>
Elimiate the requirement for PostGIS tables to have a column
called "gid".
* Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
id_column to specify which column to use to identify rows. Also
new instance variables id_column and quoted_id_column
(PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
(PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
(PostGISTable.SimpleQuery): Use the id column name provided to the
constructor instead of "gid"
(PostGISShapeStore.__init__): New parameter id_column analogously
to PostGISTable.__init__. This parameter is simply passed through
to the base class constructor
(PostGISShapeStore._create_col_from_description): Fix typo in
doc-string
(PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
(PostGISShapeStore.ShapesInRegion): Use the id column name
provided to the constructor instead of "gid"
* test/postgissupport.py
(PostgreSQLServer.get_default_static_data_db): New static table
landmarks_point_id with an id column != "gid. Update the comments
a bit.
(skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
doc-
(upload_shapefile): New parameter gid_column to use a name other
than "gid" for the column to store the shape ids
* test/test_postgis_db.py (TableTests): New. Mixin-class
containing all tests previously in TestPostGISTable. The actual
tests are the same but the code is a bit more configurable to
allow for different id columns etc.
(TestPostGISTable): Derive from TableTests now for the actual
tests.
(TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
except that it the landmarks_point_id table to test the id_column
parameter
(PointTests): Extend the doc-string
(TestPostGISShapestorePointExplicitGIDColumn)
(TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
from PointTests to test the explicit id_column parameter. One
tests with the name of the column holding the shape ids, the other
uses PostgreSQL's OID column. For the latter a number of methods
have to be overwritten to make them independent of the actual id
values.
2004-03-08 Silke Reimer <silke@intevation.de>
Update debian directory:
* debian/changelog: Added new version.
* deiban/rules: Updated management of patches (with cbds)
* debian/control: Added cbds to dependencies
* debian/patches/*: New. Adds better support for patches of thuban in
debian
* debian/menu: Syntax of menu changed slightly
* debian/setup.py.patch: removed because it has been moved to
debian/patechs/setup.py.patch
2004-02-26 Bernhard Herzog <bh@intevation.de>
Create the Doc/technotes directory for text files with information
for developers
* Doc/technotes/README: New. README for the technotes
* Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
Thuban
* Doc/technotes/release_process.txt: New. Used to be
HOWTO-Release. Now slightly adapted to technote formatting style.
* HOWTO-Release: Removed. It's contents are now in
Doc/technotes/release_process.txt
2004-02-25 Bernhard Herzog <bh@intevation.de>
* libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
version of wxWindows the module was compiled with so we can check
that against the wxPython version.
* Thuban/version.py (thuban_branch, thuban_release): New variables
controlling which and how Thuban versions are shown. See the
comments for details.
(verify_versions): Also check that the wx version that wxproj is
compiled against matches that of the wxPython we use at runtime
2004-02-20 Bernhard Herzog <bh@intevation.de>
* Extensions/wms/wms.py (epsg_code_to_projection): Use
get_system_proj_file to read the epsg projections. The old way
depended on the current directory being the top Thuban directory.
2004-02-20 Bernhard Herzog <bh@intevation.de>
* Extensions/svgexport/test/test_svgmapwriter.py
(TestVirtualDC.test_clippath): Remove a debug print
2004-02-20 Bernhard Herzog <bh@intevation.de>
* Extensions/svgexport/__init__.py: New. Turn
Extensions/svgexport into a package.
* Extensions/svgexport/svgmapwriter.py: Reorder the imports and
doc-string a bit. The doc-string must come first, otherwise it's
not a doc-string. The __future__ import must be the first thing
after the doc-string. Use only double quotes in doc-strings.
Single quotes trip up emacs syntax highlighting if the text
contains apostrophes.
2004-02-20 Bernhard Herzog <bh@intevation.de>
* Extensions/svgexport/test/__init__.py,
Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
suite for svgexport
* test/runtests.py (find_test_modules): New. Function with the
module finding code from main.
(main): Use find_test_modules to figure out the default test
modules and take modules from Extensions.svgexport.test too.
2004-02-19 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
the mainwindow has a reference to the map of the initial session.
This fixes a bug introduced with the fix for RT#2245
2004-02-19 Bernhard Herzog <bh@intevation.de>
* Extensions/svgexport/svgsaver.py,
Extensions/svgexport/svgmapwriter.py,
Extensions/svgexport/maplegend.py: Added again. This time in the
correct place.
2004-02-17 Bernhard Herzog <bh@intevation.de>
Fix for RT#2245
* Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
instance variables before trying to create any windows. Creating
windows can start an event loop if e.g. message boxes are popped
up for some reason, and event handlers, especially EVT_UPDATE_UI
may want to access things from the application.
(ThubanApplication.maps_changed): The mainwindow may not have been
created yet, so check whether it has been created before calling
its methods
* Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
have a map
2004-02-17 Bernhard Herzog <bh@intevation.de>
* test/test_svgmapwriter.py, Extensions/svgsaver.py,
Extensions/svgmapwriter.py, Extensions/maplegend.py,
extensions/svgexport/svgsaver.py,
extensions/svgexport/svgmapwriter.py,
extensions/svgexport/maplegend.py: Removed. These files were in
the wrong places or didn't work at all.
2004-02-16 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
line
2004-02-16 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
2004-02-15 Markus Rechtien <markus@intevation.de>
* Extensions/svgexport/svgmapwriter.py: New. Adds the capability
to write a session to a file in SVG format.
* Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
to write a SVG map of a session.
* Extensions/svgexport/maplegend: New. Writes a basic maplegend
in SVG format for the current session.
2004-02-13 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
can't be created, return immediately after displaying the error
message.
2004-02-11 Bernhard Herzog <bh@intevation.de>
Handle postgis tables with more than one geometry column.
* Thuban/Model/postgisdb.py
(PostGISTable._fetch_table_information): Delegate the creation of
column objects to a different method so that we can extend that in
derived classes
(PostGISTable._create_col_from_description): New. Column object
creation part of _fetch_table_information
(PostGISShapeStore._create_col_from_description): New. Extend
inherited method to handle geometry columns
(PostGISShapeStore.__init__): New parameter geometry_column to
specify which geometry column to use. Optional but mandatory for
tables with more than one geometry column
(PostGISShapeStore._fetch_table_information): Also use the name of
the geometry column when looking for the srid
(PostGISShapeStore.ShapeType): Also use the name of the geometry
column when looking for the shape type
* test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
NonConnectionStore to changes in the PostGISShapeStore
* test/test_postgis_db.py
(TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
PostGISShapeStore with tables having two geometry columns.
2004-02-10 Bernhard Herzog <bh@intevation.de>
Fix some postgis problems. What remains to be done is real
handling of SRIDs as they affect how reprojection is done
* Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
doc-string
(PostGISShapeStore._fetch_table_information): New. Extend
inherited method to retrieve srid
(PostGISShapeStore.BoundingBox): Handle tables without data.
extent yields NULL for those
(PostGISShapeStore.ShapesInRegion): Use the srid of the table.
* test/test_postgis_db.py
(TestPostGISSpecialCases.test_shapestore_empty_table): New test
for the special case of a table without any data
(TestPostGISShapestorePointSRID): New class with tests for a table
that uses srids
(PolygonTests): Fix a doc-string typo
* test/postgissupport.py (PostGISDatabase.__init__): New parameter
reference_systems with a specification of spacial reference
systems to create in the new db.
(PostgreSQLServer.new_postgis_db)
(PostgreSQLServer.get_static_data_db): New parameter
reference_systems to be passed through ultimately to
PostGISDatabase. In new_postgis_db also check whether an existing
db already has the right srids
(PostgreSQLServer.get_default_static_data_db): Add srids and a
table that uses srids
(PostGISDatabase.initdb): Create the entries for the reference
systems
(PostGISDatabase.has_data): Add reference_systems parameter to
check for those too
(upload_shapefile): New parameter srid to create tables with a
specific srid
2004-02-06 Frank Koormann <frank@intevation.de>
* po/pt_BR.po: Fixed charset
2004-02-05 Frank Koormann <frank@intevation.de>
* po/pt_BR.po: Fixed format string for error message, missing %s
added (Thuban/UI/application.py:273)
2004-02-03 Frank Koormann <frank@intevation.de>
First version of Portuguese (Brazilian) translation
* po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
Brazilian Portuguese by Eduardo Patto Kanegae.
* Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
translators.
2004-01-22 Frank Koormann <frank@intevation.de>
* Doc/manual/thuban-manual.xml: Added section on installation of
Thuban under Win32 systems. Fixed image path references in the postgis
section. Some minor source formattings.
2004-01-21 Frank Koormann <frank@intevation.de>
Make Thuban remember path selections (at least for one application run).
* Thuban/UI/application.py (Application.OnInit): Initialize path as a
attribute of application object. Path is a dictionary of
strings, currently with the items "data" and "projection".
(Application.SetPath): New, stores path for the specified item.
(Application.Path): New, return path for the specified item.
* Thuban/UI/mainwindow.py
(MainWindow.OpenSession, MainWindow.SaveSessionAs,
MainWindow.AddLayer, MainWindow.AddRasterLayer,
MainWindow.TableOpen): Access "data" path information of the
application.
* Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
Access "projection" path information of the application.
2004-01-05 Bernhard Herzog <bh@intevation.de>
* po/ru.po: Updated translations from Alex Shevlakov
2004-01-05 Bernhard Herzog <bh@intevation.de>
* po/Makefile, po/README: Move the description of how to generate
the translation statistics to the README.
2003-12-23 Bernhard Herzog <bh@intevation.de>
* NEWS: Update for 1.0.0
* po/it.po: Another update from Maurizio Napolitano
2003-12-23 Bernhard Herzog <bh@intevation.de>
* po/it.po: Updated translation from Maurizio Napolitano
2003-12-23 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
for translation
* Thuban/UI/mainwindow.py (MainWindow.TableRename)
(MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
strings for translation
* po/de.po: Update with the newly marked strings.
2003-12-22 Bernhard Herzog <bh@intevation.de>
* HOWTO-Release: Fix the places where version numbers have to be
updated
2003-12-22 Bernhard Herzog <bh@intevation.de>
* setup.py (setup call): 1.0.0, yeah!
* Thuban/version.py (longversion): 1.0.0, yeah!
* Thuban/Model/load.py (SessionLoader.__init__): Accept the
1.0.0 namespace too
* Thuban/Model/save.py (SessionSaver.write_session): Save with
1.0.0 namespace
* test/test_load.py (LoadSessionTest.dtd)
(TestSingleLayer.file_contents)
(TestNonAsciiColumnName.file_contents)
(TestLayerVisibility.file_contents)
(TestClassification.file_contents, TestLabels.file_contents)
(TestLayerProjection.file_contents)
(TestRasterLayer.file_contents, TestJoinedTable.file_contents)
(TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
(TestPostGISLayerPassword.file_contents)
(TestLoadError.file_contents, TestLoadError.test): Update for
1.0.0 namespace
* test/test_save.py (SaveSessionTest.dtd)
(SaveSessionTest.testEmptySession)
(SaveSessionTest.testSingleLayer)
(SaveSessionTest.testLayerProjection)
(SaveSessionTest.testRasterLayer)
(SaveSessionTest.testClassifiedLayer)
(SaveSessionTest.test_dbf_table)
(SaveSessionTest.test_joined_table)
(SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
2003-12-22 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/load.py (SessionLoader.start_label): Make sure the
alignment flags are byte strings not unicode and that they have
valid values
* test/test_load.py (TestLabelLayer): New. Test loading (and
indirectly saving) of maps with labels.
2003-12-22 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/tableview.py (TableGrid.OnDestroy)
(TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
unsubscribe all subscribers.
(LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
self.grid since it may already have been destroyed.
Fixes RT #2256
2003-12-19 Bernhard Herzog <bh@intevation.de>
* po/fr.po, po/es.po: Updated translations from Daniel Calvelo
2003-12-16 Bernhard Herzog <bh@intevation.de>
* debian/bitmappath.patch, debian/setup.py.patch:
added to ensure compliance with FHS for debian
* debian/rules, debian/changelog:
added patches in rules to ensure compliance with FHS for debian
2003-12-16 Bernhard Herzog <bh@intevation.de>
* po/Makefile (mo): Make the output a bit nicer so that it prints
statistics about the translations. Add a comment how produce even
nicer statistics with sed.
2003-12-09 Frank Koormann <frank@intevation.de>
* Resources/Projections/defaults.proj:
French projection sample with correct accents (UNICODE).
2003-12-05 Bernhard Herzog <bh@intevation.de>
* MANIFEST.in: Add the devtools directory
* setup.py (setup call): Use license instead of licence. This
silences a deprecation warning on Python 2.3
2003-12-05 Frank Koormann <frank@intevation.de>
Documentation synced with 1.0rc1
* Doc/manual/thuban-manual.xml:
Minor formatting changes and references to database layers .
Introduction.Internationalization: New section on i18n.
MapManagement.AddingandRemovingLayers: Added item on database layers.
MapManagement.TheLegend: Added section and screenshot on popup menu.
ProjectionManagement: Updated screenshot and sentence on EPSG.
Appendix.SupportedDataSources: Added PostGIS.
Appendix.WorkingwithPostGIS: New section.
* Doc/manual/images/6_projection.png: Updated screenshot including
EPSG checkboxes.
* Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
* Doc/manual/images/app_postgis_add_layer.png,
Doc/manual/images/app_postgis_db_add.png,
Doc/manual/images/app_postgis_db_management.png:
New screenshots focussing on database layers
2003-12-05 Frank Koormann <frank@intevation.de>
* Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
write warning to stderr instead of rising a warning dialog
2003-12-03 Bernhard Herzog <bh@intevation.de>
Fix for RT #2243
* Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
New. Like has_selected_layer but for shape layers only
(_has_selected_shape_layer): New. Like _has_selected_layer but for
shape layers only
(layer_show_table command, layer_jointable command): Use these
commands should only be available for shape layers
2003-12-03 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
publishers that are wx objects and may have been destroyed by wx
already. Fixes RT #2242.
2003-12-03 Bernhard Herzog <bh@intevation.de>
* po/ru.po: Updates from Alex Shevlakov
2003-12-03 Silke Reimer <silkeintevation.de>
* debian/control, debian/changelog: Added gdal-support to
debian package, updated to new thuban version
2003-12-03 Bernhard Herzog <bh@intevation.de>
* Thuban/Lib/version.py: New. Module for version number
manipulations. The version of make_tuple here also deals better
with more unusual version number strings, such as e.g.
"1.2+cvs20031111"
* Thuban/version.py (make_tuple): Removed. It's now in
Thuban.Lib.version. Use that implementation instead.
* test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
2003-12-02 Bernhard Herzog <bh@intevation.de>
* MANIFEST.in: Add debian files
* setup.py (setup call): Add packages for the Extensions so that
they're installed too
(data_files): Add READMEs and sample data from some Extensions
* NEWS: Add note about the extensions in binary packages
2003-12-02 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/save.py (SessionSaver.write_session): Save files
with the thuban-1.0rc1
* Thuban/Model/load.py (SessionLoader.__init__): Recognize the
thuban-1.0rc1 namespace too
* test/test_save.py (SaveSessionTest.dtd)
(SaveSessionTest.testEmptySession)
(SaveSessionTest.testSingleLayer)
(SaveSessionTest.testLayerProjection)
(SaveSessionTest.testRasterLayer)
(SaveSessionTest.testClassifiedLayer)
(SaveSessionTest.test_dbf_table)
(SaveSessionTest.test_joined_table)
(SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
namespace
* test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
namespace
(TestSingleLayer.file_contents)
(TestNonAsciiColumnName.file_contents)
(TestLayerVisibility.file_contents)
(TestClassification.file_contents, TestLabels.file_contents)
(TestLayerProjection.file_contents)
(TestRasterLayer.file_contents, TestJoinedTable.file_contents)
(TestPostGISLayer.file_contents)
(TestPostGISLayerPassword.file_contents)
(TestLoadError.file_contents, TestLoadError.test): Update to
thuban-1.0rc1 namespace
2003-12-01 Bernhard Herzog <bh@intevation.de>
* setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
nt to better match Intevation's current w32 setup
* HOWTO-Release: Add note about updating MANIFEST.in
* MANIFEST.in: Add the Extensions
* NEWS: Update for 1.0rc1
2003-12-01 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
cards for the dialog so that shapefiles ending in all uppercase
SHP are listed too
2003-11-28 Bernhard Herzog <bh@intevation.de>
* Thuban/version.py (longversion): Update to 1.0rc1
* setup.py (setup call): Update version to 1.0rc1. Use the
thuban@intevation.de email address as author email instead of my
personal one.
2003-11-28 Bernhard Herzog <bh@intevation.de>
* po/de.po: Update german translation.
2003-11-28 Bernhard Herzog <bh@intevation.de>
Unify the filenames stored in .thuban files so that the .thuban
files are more platform independend
* Thuban/Model/save.py (unify_filename): New. Unify filenames so
that they can be used on both windows and unix
(SessionSaver.prepare_filename): New. Handle all filename
transformations for filenames stored in the thuban file
(SessionSaver.write_data_containers, SessionSaver.write_layer):
Use prepare_filename
* test/test_save.py (SaveSessionTest.testSingleLayer)
(SaveSessionTest.testLayerProjection)
(SaveSessionTest.testRasterLayer)
(SaveSessionTest.testClassifiedLayer)
(SaveSessionTest.test_dbf_table)
(SaveSessionTest.test_joined_table): Filenames are always stored
with slashes on all currently supported platforms so adapt all
tests to this
* test/test_load.py (LoadSessionTest.filenames): With the new
filename scheme the filenames in the tests should be
understandable on all currently supported platforms so we turn
this into an empty list because we don't have to normalize them
anymore
2003-11-28 Bernhard Herzog <bh@intevation.de>
* test/test_layer.py (TestLayer.test_arc_layer_with_projection):
Add the ellipsoid to the projection since some Proj versions
complain if it's missing.
2003-11-27 Bernhard Herzog <bh@intevation.de>
Corect some bounding box projection problems
* Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
version of ForwardBBox
(Projection._transform_bbox): New. common implementation of
ForwardBBox and InverseBBox
(Projection.ForwardBBox): Use _transform_bbox.
* test/test_proj.py (TestProjection.test): Add test for
InverseBBox
* Thuban/Model/layer.py (Layer.LatLongBoundingBox)
(Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
new InverseBBox method to determine the unprojected bounding box
(Layer.ShapesInRegion): Use the ForwardBBox method to project the
bbox.
* test/test_layer.py (TestLayer.test_point_layer_with_projection):
Removed.
(TestLayer.test_arc_layer_with_projection): New. This test is
better able to test whether bounding boxes are projected correctly
than test_point_layer_with_projection
* Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
InverseBBox to unproject bboxes
2003-11-25 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/about.py (About.__init__): Make sure we have ASCII
source code.
2003-11-25 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
there for backwards compatibility and all code relying on that
should have been updated by now.
2003-11-25 Bernhard Herzog <bh@intevation.de>
* test/test_load.py (TestClassification.test): Add the missing
round trip test.
(TestClassification.file_contents): Update to the newest file
format
2003-11-25 Bernhard Herzog <bh@intevation.de>
Add very experimental (and possibly dangerous) extension to draw
polygons:
* Extensions/drawshape/README: New. Brief installation
instructions
* Extensions/drawshape/drawshape.py: New. Implementation of the
drawshape extensions
* Extensions/drawshape/patch.diff: Patch to apply before the
extension can be used.
2003-11-24 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/data.py (ShapefileStore._open_shapefile)
(ShapefileStore.__init__): Factor opening the shapefile into a
separate method (the new _open_shapefile). This makes the code a
bit more readable but the real reason is that it makes some evil
hacks easier. :-)
2003-11-24 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/load.py (SessionLoader.check_attrs): If no
converter is specified for an attribute assume it's a string
containing only Latin1 characters. Update doc-string accordingly.
This change should fix many places where unicode objects might
accidentally enter Thuban.
* test/test_load.py (TestNonAsciiColumnName): New test to check
what happens with column names in DBF files that contain non-ascii
characters
2003-11-21 Bernhard Herzog <bh@intevation.de>
Enable the experimental attribute editing again and introduce a
command line switch to actually activate it
* Thuban/UI/main.py (options): New. Container for options set on
the commmand line
(main): Add the --enable-attribute-editing flag.
* Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
editing is enabled use the grid ctrl which allows editing of the
values
* Thuban/Model/transientdb.py (AutoTransientTable.write_record):
New. Just delegate this to the underlying table.
2003-11-20 Bernhard Herzog <bh@intevation.de>
* test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
Skip this test if run under non-posix systems since it only works
there
2003-11-19 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/resource.py: Rework the way gdal support is
determined so that we can give a reason in the about why gdal is
not supported.
(gdal_support_status): New. Variable holding a string with the
reason for no gdal support
* Thuban/UI/about.py (About.__init__): Add the reason why gdal is
not supported to the message
2003-11-19 Bernhard Herzog <bh@intevation.de>
Remove the old table interface and its test cases
* Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
(DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
anymore
* Thuban/Model/transientdb.py (TransientTableBase)
(AutoTransientTable): Do not derive from OldTableInterfaceMixin
anymore
* test/test_table.py: Removed since the old interface it tests is
gone.
* test/runtests.py (main): The old table interface is gone and
with it the deprecation warnings so remove the code that turns
these warnings into errors
2003-11-19 Bernhard Herzog <bh@intevation.de>
* test/test_table.py: Revert to revision 1.5 again. Changing the
tests to use the new table interface is completely wrong since the
whole purpose of the tests in this module is to test the old
interface.
2003-11-18 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
New. Test whether the connection matches a set of connection
parameters
* Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
(DBFrame.OnAdd): Use the new MatchesParameters method when looking
for existing connections with the same parameters and break out of
the loop correctly.
* test/test_postgis_db.py (TestBriefDescription)
(TestPostGISSimple.test_brief_description): Rename
TestBriefDescription to TestPostGISSimple and the test method to
test_brief_description so that we can add more test methods.
(TestPostGISSimple.test_matches_parameters): New. Test the new
MatchesParameters method
2003-11-18 Bernhard Herzog <bh@intevation.de>
* Thuban/Lib/connector.py (Publisher): Introduce a new flag,
_was_destroyed, to indicate whether an publisher instance has
already been destroyed.
(Publisher.Unsubscribe): Only disconnect if the publisher has not
been destroyed yet.
(Publisher.Destroy): Set the _was_destroyed flag to true.
* test/test_connector.py
(TestPublisher.test_unsubscribe_after_destroy): New. Test that
calling Unsubscribe after Destroy doesn't raise an exception
2003-11-14 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
typo in doc-string
2003-11-13 Bernhard Herzog <bh@intevation.de>
Quote table and column names properly for postgis.
* Thuban/Model/postgisdb.py (quote_identifier): New. Function to
quote an identifier for use in an sql statement
(PostGISColumn.__init__): Add the quoted_name attribute
(PostGISTable.__init__): New instance variable quoted_tablename
(PostGISTable._fetch_table_information): Use the quoted table
name. New isntance variable quoted_geo_col with a quoted version
of geometry_column
(PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
(PostGISTable.RowOrdinalToId): Use the quoted table name
(PostGISTable.ReadValue, PostGISTable.ValueRange)
(PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
(PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
(PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
Use quoted table and column names
* test/test_postgis_db.py (TestPostGISSpecialCases)
(TestPostGISIgnoredColumns): Rename the class to
TestPostGISSpecialCases because that better describes the new
cases
(TestPostGISSpecialCases.test_unsupported_types)
(TestPostGISSpecialCases.test): Rename the method to
test_unsupported_types because we need a more descriptive name now
that there are more methods
(TestPostGISSpecialCases.test_table_name_quoting)
(TestPostGISSpecialCases.test_column_name_quoting)
(TestPostGISSpecialCases.test_shapestore_name_quoting): New test
cases to test quoting of table and column names in PostGISTable
and PostGISShapeStore
* test/postgissupport.py
(skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
AddGeometryColumn desn't support table or column names with sapces
or double quotes
2003-11-12 Jan-Oliver Wagner <jan@intevation.de>
* Extensions/wms/__init__.py: New: Init to make this
directory a package.
* Extensions/wms/wms.py: New: Provide layers via OGC WMS.
2003-11-11 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
Constant for the file woth deprecated epsg projections
(get_system_proj_file): Update doc-string
* Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
above the EPS widgets, introduce a check box for the deprecated
eps projections and a label for the epsg widgets
(ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
too
2003-11-11 Bernhard Herzog <bh@intevation.de>
Avoid warnings when run under Python 2.3
* Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
(BaseRenderer.draw_label_layer): Coordinates must be ints.
* Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
real method so that we can convert to int.
(MapRenderer.label_font): The font size mist be an int.
* Thuban/UI/common.py (Color2wxColour): The color values must be
ints. Also, remove the unnecessary asserts.
* test/test_load_0_8.py (TestUnicodeStrings.file_contents)
(TestUnicodeStrings.test): Python source code should not contain
non-ascii characters unless an encoding is specified in the file.
Therefore use \x escapes in the string literals for non-ascii
characters.
2003-11-11 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/resource.py (get_system_proj_file): Add a filename
parameter so that this function can be used for all proj files in
Resource/Projections
(DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
get_system_proj_file
* Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
ProjFile self.__sysProjFile use a dictionary of system ProjFile
objects self._sys_proj_files
(ProjFrame.build_dialog): Adapt to the new changes in the
ProjectionList constructor. Add a check button to toggle whether
EPSG projections are shown
(ProjFrame._OnShowEPSG): New. Handler for the epsg check button
events.
(ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
the busy cursor if the files have not yet been loaded by the
dialog.
(ProjFrame.load_system_proj): Add a parameter for the name of the
proj file. Maintain the dictionary of system projections
self._sys_proj_files
* Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
user_projs parameters into one parameter proj_files which is a
list of proj files.
(ProjectionList._subscribe_proj_files)
(ProjectionList._unsubscribe_proj_files): New. Move
subscription/unsubscription of projfile messages to separate
methods
(ProjectionList.Destroy): The unsubscribe is now done in
_unsubscribe_proj_files
(ProjectionList.update_projections): We now have a list of proj
file objects
(ProjectionList.SetProjFiles): New method to set a new list of
proj file objects
* test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
Specify explicitly which system proj file to load.
2003-11-11 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
instance variables to cut cyclic references. The GC would have
collected the loader eventually but it can happen that it doesn't
run at all until thuban is closed (2.3 but not 2.2 tries a bit
harder and forces a collection when the interpreter terminates)
(load_session): Call the handler's Destroy method to make sure
that it gets garbage collected early. Otherwise it will be
collected very late if at all and it holds some references to e.g.
shapestores and the session which can lead to leaks (of e.g. the
temporary files)
* test/test_load.py (TestSingleLayer.test_leak): New. test for the
resource leak in load_session
2003-11-10 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/baserenderer.py: Add a way to specify how layers in
extensions are to be rendered.
(_renderer_extensions): New. List with renderer for layers in
extensions
(add_renderer_extension): New. Add a renderer extension
(init_renderer_extensions): New. Init the renderer extensions
(BaseRenderer.render_map_incrementally): Search
_renderer_extensions for how to draw unknown layer types
(BaseRenderer.draw_raster_data): Add format parameter so that
formats other than BMP can be drawn
(BaseRenderer.draw_raster_layer): Pass an explicit format to
draw_raster_data
* Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
strings of the format parameter of draw_raster_data method to wx
constants
(MapRenderer.draw_raster_data): Add the format parameter and use
raster_format_map to map it to the right wxwindows constant for
wxImageFromStream
* test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
the format parameter and record it
(TestBaseRenderer.test_raster_no_projection): check the format
paramter of the draw_raster_data method
(TestBaseRenderer.test_renderer_extension): New. Test the renderer
extension facility
2003-11-07 Bernhard Herzog <bh@intevation.de>
Tweak the usage of the sqlite database to make common use cases
more responsive. In most cases copying the data to the sqlite
database takes so long that using sqlite doesn't have enough
advantages.
* Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
comments about performance and query the min and max in separate
statements because only that way will indexes be used.
(TransientTableBase.UniqueValues): Add some comments about
performance.
(AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
Do not copy the data to the transient DB but use the transient
copy if it exists. See the new comments for the performance trade
offs
* test/test_transientdb.py
(TestTransientTable.test_auto_transient_table): Make sure that the
data is copied to the transient database at some point.
2003-11-03 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
globals to locals so that it's a bit faster
2003-11-03 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/baserenderer.py
(BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
method. ReadValue is faster than ReadRowAsDict since it only reads
one cell especially now that the dbf file objects actually
implement it.
* Thuban/Model/table.py (DBFTable.ReadValue): Use the new
read_attribute method of the dbf objects
2003-11-03 Bernhard Herzog <bh@intevation.de>
* Extensions/profiling/profiling.py (popup_dialog_box): New config
variable to indicate whether the result should be shown in a
dialog box
(profile_screen_renderer, time_screen_renderer): Only show a
dialog box if popup_dialog_box is true.
(profile_screen_renderer): Flush stdout after the printing the
first part of the "profiling..." message
* Thuban/UI/baserenderer.py
(BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
brushes for the groups so that they're not created over and over
again
* Thuban/Model/classification.py (Classification.__getattr__)
(Classification._compile_classification)
(Classification._clear_compiled_classification): New. Methods to
manage a 'compiled' representation of the classification groups
which is created on demand
(Classification.InsertGroup, Classification.RemoveGroup)
(Classification.ReplaceGroup): reset the compiled representation
(Classification.FindGroup): Use the compiled representation to
find the matching group
(ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
2003-10-31 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/classification.py (Classification.SetDefaultGroup):
Send a CLASS_CHANGED message
(Classification.RemoveGroup): Send a CLASS_CHANGED message and do
not return the removed group since it wasn't used.
* test/test_classification.py
(TestClassification.test_set_default_group): New. Test the
SetDefaultGroup method
(TestClassification.test_insert_group): New. Test the InsertGroup
method
(TestClassification.test_remove_group): New. Test the RemoveGroup
method
(TestClassification.test_replace_group): New. Test the
ReplaceGroup method
2003-10-31 Bernhard Herzog <bh@intevation.de>
* test/test_classification.py (TestClassification.setUp):
Subscribe to the CLASS_CHANGED messages
(TestClassification.tearDown): New. Destroy the classification
properly
(TestClassification.test_defaults): Add tests for the default line
width and whether no messages were sent yet
(TestClassification.test_set_default_properties): Add tests for
messages and setting the default line width
(TestClassification.test_add_singleton)
(TestClassification.test_add_range)
(TestClassification.test_multiple_groups): Add tests for messages
2003-10-31 Bernhard Herzog <bh@intevation.de>
Some more refactoring in preparation for new tests:
* test/test_classification.py (TestClassification.setUp): New.
Instantiate the classification here. Update the test methods
accordingly.
(TestClassification.test_multiple_groups): Make sure that the two
singletons matching 1 are considered different.
2003-10-31 Bernhard Herzog <bh@intevation.de>
* test/test_classification.py (red, green, blue): New. These
constants were used in several cases. Update the relevant methods.
(TestClassification.test_defaults)
(TestClassification.test_set_default_properties)
(TestClassification.test_add_singleton)
(TestClassification.test_add_range)
(TestClassification.test_multiple_groups)
(TestClassification.test_deepcopy): New. These were formerly all
part of the single method test.
(TestClassification.test_deepcopy): Removed.
(TestClassIterator): Removed. The test case is now a method of
TestClassification since it tests part of the public interface of
Classification
(TestClassification.test_iterator): New. Used to be
TestClassIterator effectively
2003-10-31 Jan-Oliver Wagner <jan@intevation.de>
GUIfied the functions of the profiling extension.
* /Extensions/profiling/__init__.py: New: Init to make this
directory a package.
* Extensions/profiling/profiling.py: Moved menu entries to
the Extensions menu. Applied _() for strings.
(profile_screen_renderer): Catch the detailed printout and present
it in a dialog.
(time_screen_renderer): Raise a dialog to present the result instead
of printing it to stdout.
2003-10-31 Bernhard Herzog <bh@intevation.de>
* test/test_classification.py (TestClassGroupProperties)
(TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
(TestClassGroupSingleton, TestClassIterator, TestClassification):
Split TestClassification into several classes, one for each class
being tested. TestClassification itself now only tests
Classification. This split makes changes to the tests a bit easier
2003-10-31 Bernhard Herzog <bh@intevation.de>
* Extensions/profiling/profiling.py: New. Extension to measure
Thuban performance
2003-10-31 Frank Koormann <frank@intevation.de>
Added two items to legend popup menu: Remove Layer and Show Layer Table
* Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
LegendPanel._OnShowTable): New event handlers, call the corresponding
mainwindow methods.
(LegendTree._OnRightClick): Added items to popup menu.
2003-10-30 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
EVT_WINDOW_DESTROY
(ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
nothing but is convenient for the derived classes.
* Thuban/UI/tableview.py
(TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
Unsubscribe the messages here not in OnClose because that might
get called multiple times. Fixes RT #2196
(TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
anymore.
* README: Update the minimum requirement for wxPython. Since we
now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
the version in which that was introduced for all platforms
2003-10-30 Frank Koormann <frank@intevation.de>
* Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
frame.
2003-10-30 Jan-Oliver Wagner <jan@intevation.de>
Improved APR import extension, added further EPSG definitions
and some cleanup regarding string class.
* test/test_proj.py (TestProjection.test_get_projection_units_geo):
Added test for alias 'longlat'.
* Resources/Projections/epsg-deprecated.proj: New. Contains
deprecated EPSG definitions.
* Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
the variable names for objects.
* Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
Copied from importAPR and provided with documentation.
* Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
Moved to apr.py.
(APR_View): Added object ref 'ITheme'.
* Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
split function by corresponding use of the string class method.
* Thuban/Model/xmlwriter.py: Replaced string replace function by
corresponding string method.
2003-10-29 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/baserenderer.py
(BaseRenderer.draw_shape_layer_incrementally): Speed up the
special case of a classification that only has the default group
2003-10-27 Bernhard Herzog <bh@intevation.de>
* po/fr.po, po/es.po: Updated translations from Daniel Calvelo
* po/de.po: Update.
* Thuban/UI/application.py
(ThubanApplication.ShowExceptionDialog): Handle translation of the
dialog message properly
2003-10-27 Bernhard Herzog <bh@intevation.de>
Rework how localization works so that we use wx's translation
functions when running Thuban as a normal application but not when
we don't need any UI, such as in the test suite. See the comment
in Thuban/__init__.py for details
* Thuban/__init__.py (_): Add one level of indirection to make the
translation handling more flexible and to make it possible to use
either wx's translation services or not.
(gettext_identity, translation_function_installed)
(install_translation_function): New function to help with this
* Thuban/UI/__init__.py: Install the wx specific translation
function if it's OK to do that
* test/support.py (initthuban): Install a dummy translation
function so that importing Thuban.UI doesn't install a wx specific
one for which would need to import wxPython
2003-10-27 Bernhard Herzog <bh@intevation.de>
* HOWTO-Release: Source archives should be created first and the
binary packages should be created from the source archives.
There's an official debian package now so there's no need to test
the rpm on debian anymore
2003-10-27 Bernhard Herzog <bh@intevation.de>
Several rendering changes:
- Render the selection into a separate bitmap so that only that
bitmap needs to be redrawn when the selection changes
- Render incrementally showing previews and allowing interaction
before rendering is complete
- Update the renderer interface a bit. Most parameters of
RenderMap are now parameters of the constructor
* Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
and the update region as parameters. Update the doc-string
(BaseRenderer.render_map_incrementally): New. Generator function
to renders the map incrementally
(BaseRenderer.render_map): Remove the map argument (it's now in
the constructor) and simply iterate over the
render_map_incrementally generator to draw the map.
(BaseRenderer.draw_shape_layer_incrementally)
(BaseRenderer.draw_shape_layer): Renamed to
draw_shape_layer_incrementally and changed into a generator that
yields True every 500 shapes. Used by render_map_incrementally to
render shape layers incrementally
* Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
map and region parameters which are now in the constructor
(ScreenRenderer.RenderMapIncrementally): New. Public frontend for
the inherited render_map_incrementally.
(BaseRenderer.draw_shape_layer): Removed.
(ScreenRenderer.draw_selection_incrementally): New. The selection
drawing part of the removed draw_shape_layer as a generator
(ScreenRenderer.layer_shapes): Update because of the region
parameter change
(ExportRenderer.__init__): New. Extend the inherited constructor
with the destination region for the drawing
(ExportRenderer.RenderMap): Removed the map and region parameters
which are now in the constructor
* Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
bitmap suitable for a preview in a tool
(CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
bitmap
(MapPrintout.draw_on_dc): Adapt to new renderer interface
(MapCanvas.OnPaint): Handle drawing the selection bitmap if it
exists
(MapCanvas.OnIdle): Update the logic to deal with incremental
rendering and the selection bitmap
(MapCanvas._do_redraw): Handle the instantiation of the render
iterator and the redraws during rendering
(MapCanvas._render_iterator): New. Generator to incrementally
redraw both bitmaps
(MapCanvas.Export): Adapt to new renderer interface.
(MapCanvas.full_redraw): Reset the selection bitmap and the
renderer iterator too
(MapCanvas.redraw_selection): New. Force a redraw of the selection
bitmap
(MapCanvas.shape_selected): Only redraw the selection bitmap
* test/test_baserenderer.py
(TestBaseRenderer.test_polygon_no_projection)
(TestBaseRenderer.test_raster_no_projection)
(TestBaseRenderer.test_point_map_projection)
(TestBaseRenderer.test_point_layer_and_map_projection)
(TestBaseRenderer.test_point_layer_projection)
(TestBaseRenderer.test_point_with_classification): Adapt to new
renderer interface
2003-10-24 Bernhard Herzog <bh@intevation.de>
* libraries/thuban/wxproj.cpp (draw_polygon_shape)
(point_in_polygon_shape, shape_centroid): Raise an exception if
the shape can't be read. Previously invalid shape ids would lead
to a segfault.
* test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
New. test whether an exception is raised for invalid shape ids
2003-10-24 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
as alias for 'latlong'.
* Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
as alias for 'latlong'.
2003-10-24 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
the projection even for the UnknownPanel.
(UnknownProjPanel.__init__): Define the text and create the textctrl
widget.
(UnknownProjPanel._DoLayout): Replaced static text widget by the
textctrl created in __init__.
(UnknownProjPanel.SetProjection): Set the text for the text ctrl
including the parameters of the projection.
2003-10-24 Jan-Oliver Wagner <jan@intevation.de>
* Resources/Projections/epsg.proj: New. This is a list of
EPSG codes with parameters for proj. The list has been
generated using devtools/create_epsg.py based on the
file nad/epsg of the proj 4.4.7 package. Four projection
definitions have been deleted as they are not accepted by proj:
"CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
and "HD72 / EOV".
2003-10-22 Bernhard Herzog <bh@intevation.de>
Some more tweaks to the projection dialog which should fix RT
#1886.
* Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
the ProjFile's messages and call the base class methods correctly
(ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
flag on the newly selected item too. Otherwise some other item is
focused and the first time the focus is moved with the keyboard
the selection moves in unexpected ways.
* Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
focus on the OK button, only on the projection list. That way the
list really has the focus initially
(ProjFrame.OnClose): Call the projection list's Destroy method to
make it unsubscribe all messages
2003-10-21 Bernhard Herzog <bh@intevation.de>
Rework the projection dialog to fix a few bugs, including RT 2166
and most of 2168
* Thuban/UI/projlist.py: New. The class ProjectionList is a
special wxListCtrl to show a list of projections in a more MVC
fashion
* Thuban/UI/projdialog.py (ProjFrame): Substantial changes
throughout the class. The main change is to use the ProjectionList
class instead of a normal wxListBox. Also, add an explicit
"Unknown" projection to the projection choice control.
(ProjPanel.__init__): Add an "unknown" ellipsoid
(TMPanel.__init__, LCCPanel.__init__): Tweak the order of
instantiation of the panel's controls to make the tab-order more
natural
2003-10-21 Bernhard Herzog <bh@intevation.de>
* test/test_load.py (TestSingleLayer.file_contents)
(TestSingleLayer.test): Add non-ascii characters to the titles of
session, map and layer. This is effectively a port of the
TestUnicodeStrings test in test_load_0_8.py which for some reason
was only added there.
* test/test_load_0_9.py (TestSingleLayer.file_contents)
(TestSingleLayer.test): Same as in test_load.py: add non-ascii
characters to the titles of session, map and layer,.
2003-10-21 Bernhard Herzog <bh@intevation.de>
Add EPSG projection handling to .thuban files
* test/test_save.py (SaveSessionTest.dtd)
(SaveSessionTest.testEmptySession)
(SaveSessionTest.testLayerProjection)
(SaveSessionTest.testRasterLayer)
(SaveSessionTest.testClassifiedLayer)
(SaveSessionTest.test_dbf_table)
(SaveSessionTest.test_joined_table)
(SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
(SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
use a and epsg projection to test saving them
* test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
namespace
(TestLayerVisibility.file_contents, TestLabels.file_contents)
(TestLayerProjection.file_contents)
(TestRasterLayer.file_contents, TestJoinedTable.file_contents)
(TestPostGISLayer.file_contents)
(TestPostGISLayerPassword.file_contents)
(TestLoadError.file_contents, TestLoadError.test): Update to use
1.0-dev namespace
(TestSingleLayer.file_contents, TestSingleLayer.test): Update to
use 1.0-dev namespace and use an EPSG projection to test whether
loading it works
* test/test_load_0_9.py: New. Effectively a copy of test_load.py
as of Thuban 0.9. These are now tests to determine whether Thuban
can still read files generated by Thuban 0.9
* Thuban/Model/save.py (SessionSaver.write)
(SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
namespace
(SessionSaver.write_projection): Write the projection's epsg
attribute
* Thuban/Model/load.py (SessionLoader.__init__): Also accept the
thuban-1.0-dev.dtd namespace
(SessionLoader.check_attrs): Allow a callable object as conversion
too
(SessionLoader.start_projection, SessionLoader.end_projection)
(SessionLoader.start_parameter): Handle the epsg attribute and
rename a few instance variables to lower case
* Resources/XML/thuban-1.0.dtd: New. Only difference to
thuban-0.9.dtd is the epsg attribute for projections.
2003-10-21 Bernhard Herzog <bh@intevation.de>
* test/runtests.py (main): Let the user specify which tests to run
on the command line
* test/support.py (ThubanTestResult.getDescription): Override to
give a better short description. The description can be used as a
parameter to run_tests to run that particular test in isolation.
2003-10-21 Frank Koormann <frank@intevation.de>
Popup menu for legend. Scheduled for the 1.2 release this was too
simple to implement: The popup menu is bound to the legend tree, while
the events are hanlded by its anchestor, the legend panel. This
allows reuse of all the event handlers already implemented for the
legend toolbar buttons.
* Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
to add handlers for the events issued by the popup menu.
(LegendPanel._OnToggleVisibility): Handler for toggling layer
visibility event
(LegendPanel._OnProjection): Handler for layer projection event.
(LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
(LegendTree._OnRightClick): Event handler for right click, select item
and pop up menu.
(LegendTree.ToggleVisibility): Toggle layer visibility
(LegendTree.LayerProjection): Raise layer projection dialog for
current layer.
2003-10-21 Bernhard Herzog <bh@intevation.de>
* Resources/Projections/defaults.proj: Use correct DOCTYPE
declaration. The top-level element is projectionlist not projfile
2003-10-20 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
method to write a projfile and display a busy cursor and error
dialogs.
(ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
(ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
(ProjFrame.__FillAvailList): Translate "<None>" too and display a
busy cursor while loading the user and system prj files.
2003-10-16 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/resource.py (projfile_cache): Introduce a cache for
ProjFile objects
(clear_proj_file_cache): New function to clear the cache. Mainly
useful for use by the test suite
(read_proj_file): Use the cache.
* test/test_proj.py (TestProjFile): Clarify the doc-string
(ProjFileReadTests): Update doc-string
(ProjFileReadTests.test_get_system_proj_file): Check whether the
system proj files is cached.
(ProjFileLoadTestCase): New base class for the proj file tests
derived from support.FileLoadTestCase to provide some common
behavior.
(TestLoadingProjFile)
(TestLoadingProjFileWithEmptyProjectionlist.file_contents)
(TestProjFileWithInvalidParameters.file_contents): Derive from
ProjFileLoadTestCase
(TestLoadingProjFile.test_caching): New. Test whether the cache
works
2003-10-16 Silke Reimer <silke@intevation.de>
* debian/*: New directory with configuration files for building a thuban
deb-package.
2003-10-14 Bernhard Herzog <bh@intevation.de>
* test/test_proj.py: Execute support.run_tests when run as
__main__ so that missing unsubscribes are detected
(TestProjFile.tearDown): Destroy the proj_file properly
2003-10-14 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/messages.py (PROJECTION_ADDED)
(PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
the ProjFile objects
* Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
easily send messages when the projections change
(ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
when the change was successful
* test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
proj file messages
(TestProjFile.test_add_remove)
(TestProjFile.test_remove_non_existing)
(TestProjFile.test_replace)
(TestProjFile.test_replace_non_existing): Test whether the right
messages are sent
2003-10-14 Bernhard Herzog <bh@intevation.de>
* test/test_proj.py (TestProjFile.test): Refactor into several
tests
(TestProjFile.test_add_remove)
(TestProjFile.test_remove_non_existing)
(TestProjFile.test_replace)
(TestProjFile.test_replace_non_existing): Some of the new
individual test cases
(TestProjFileSimple): New class for the rest of the test cases
that came out of the refactoring
(ProjFileTest): Derive from xmlsupport.ValidationTest so that the
derived classes don't have to
2003-10-13 Bernhard Herzog <bh@intevation.de>
Add an optional EPSG code to the projection objects and extend the
.proj file format accordingly.
* Resources/XML/projfile.dtd (element projection): Add epsg
attribute
* Thuban/Model/proj.py (Projection.__init__): New parameter and
instance variable epsg. Update doc-string
(Projection.EPSGCode, Projection.Label): New methods to provide
access to EPSG code and a label for use in dialogs
* Thuban/Model/resource.py (ProjFileReader.start_projection)
(ProjFileReader.end_projection, ProjFileSaver.write_projfile):
Handle the epsg code attribute when reading or writing proj files
* Thuban/UI/projdialog.py (ProjFrame._OnSave)
(ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
(ProjFrame.__FillAvailList): Use the projection's Label method to
get the string for the list box
* test/test_proj.py (TestProjection.test_label)
(TestProjection.test_label_epsg)
(TestProjection.test_epsgcode_for_non_epsg_projection)
(TestProjection.test_epsgcode_for_real_epsg_projection): New tests
for the label and EPSGCode methods
(WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
(WriteProjFileTests.test_write_empty_file): Create the ProjFile
objects in the test cases and put the expected contents into the
test case methods too. Update doTestWrite accordingly
(TestLoadingProjFile)
(TestLoadingProjFileWithEmptyProjectionlist): New classes with the
read tests from TestProjFile.
(TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
tests are now in the new classes.
(sample_projfile, sample_projfile_data)
(sample_projfile2, sample_projfile_data2): Removed. Not used
anymore.
(TestProjFile.test_read_unreadable_file): No need to reset the
permissions at the end anymore since we use a unique filename
2003-10-13 Bernhard Herzog <bh@intevation.de>
* test/test_proj.py: Some more refactoring of the test cases
(ProjFileTest): New base class for the proj file tests.
(TestProjFile): Derive from ProjFileTest
(TestProjFile.test_read_unreadable_file)
(TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
the new filename method to get a unique filename
(TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
(WriteProjFileTests): New class for proj file write tests.
Contains the write test that were in TestProjFile originally.
2003-10-13 Bernhard Herzog <bh@intevation.de>
* test/test_proj.py (TestProjFile.testRead)
(TestProjFile.test_read_non_existing_file)
(TestProjFile.test_read_unreadable_file)
(TestProjFile.test_read_empty_file): Split into several methods.
2003-10-10 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/sizers.py: New file with custom sizers.
* Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
all projection type specific panels and put them into a
NotebookLikeSizer. This way the dialog doesn't change its size
when a different projection is selected
(ProjFrame.__init__): Rename projection_panels
projection_panel_defs and reuse projection_panels for a list of
the instantiated panels.
(ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
(ProjFrame.__DoOnProjChoice): Changes due to the new handling of
the panels
(UnknownProjPanel._DoLayout): Place the newlines in the message
differently to make the panel narrower.
(TMPanel._DoLayout): Layout the parameters in one column.
2003-10-10 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
that contains all the setup for the dialog's widgets, layout and
event handling.
(__): Call build_dialog to build the dialog.
(ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
Their functionality is now in build_dialog
(ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
(ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
(ProjFrame.__DoOnProjChoice): Small updates due to slightly
different widget names and hierarchy introduced with build_dialog.
2003-10-10 Bernhard Herzog <bh@intevation.de>
* README: Fix typo.
2003-10-09 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
projection is already in the list. This is *a lot* faster when
loading files with hundreds of projections since it saves a linear
search. OTOH this will allow adding the same projection to the
user.proj file multiple times in the projection dialog but we'll
deal with that later
2003-10-09 Jan-Oliver Wagner <jan@intevation.de>
* devtools: New. Directory for developer tools that are not intended
for the regular user.
* devtools/create_epsg.py: New. Convert the epsg file of proj into
a python .proj file.
2003-10-09 Bernhard Herzog <bh@intevation.de>
* test/test_proj.py
(TestProjection.test_get_parameter_without_equals_sign): New. Test
whether GetParameter handles parameters without "=" sign correctly
* Thuban/Model/proj.py (Projection.GetParameter): Handle
parameters that do not contain a "=". Update the doc-string
2003-10-08 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
length limit on the projname text control
2003-10-08 Bernhard Herzog <bh@intevation.de>
* test/test_proj.py (TestProjection.test_get_projection_units_geo)
(TestProjection.test_get_projection_units_normal): New. Tests for
the Projection.GetProjectedUnits method
2003-10-08 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
Added missing 'val' parameter.
2003-10-08 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
projection type of the currently selected projection is not known,
i.e. there's no panel for it, use the UnknownProjPanel
(ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
the actual replacing of the proj panel into the new method
_show_proj_panel.
(UnknownProjPanel): Add doc-string.
(UnknownProjPanel._DoLayout): Insert a newline into the text so
that the panel is not so wide.
2003-10-08 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/resource.py (read_proj_file): Return the warnings
too. Update the doc-string
(get_proj_files): Removed. It wasn't used anywhere
(get_system_proj_files, get_system_proj_file): Rename to
get_system_proj_file and return the ProjFile object and not a list
of ProjFile objects. Update the callers.
(get_user_proj_files, get_user_proj_file): Rename to
get_user_proj_file return the ProjFile object and not a list of
ProjFile objects. Update the callers.
(ProjFileReader.__init__): New instance variable for the warnings.
Rename the __pf ivar to projfile. Update the methods referring to
__pf
(ProjFileReader.end_projection): Catch any errors raised when
instantiating the projection and record that as an error. The
projection will not be in the final ProjFile object.
(ProjFileReader.GetWarnings): New method to return the warnings.
* Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
show the warnings from the projfile reader
(ProjFrame._OnImport): Deal with any warnings returned by
read_proj_file
(ProjFrame.__FillAvailList): Deal with any warnings returned by
get_system_proj_file or get_user_proj_file.
* test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
(TestProjFileWithInvalidParameters.file_contents): New test cases
to test whether read_proj_file handles invalid projection
parameters correctly
(TestProjFile.test_get_system_proj_file): New. Simple test for
resource.get_system_proj_file
2003-10-07 Bernhard Herzog <bh@intevation.de>
* test/test_derivedshapestore.py
(TestDerivedShapeStoreExceptions.tearDown): Clear the session
properly so that the temporary directories get deleted correctly
2003-10-06 Bernhard Herzog <bh@intevation.de>
Handle the title changes in a proper MVC way.
* Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
canvas' TITLE_CHANGED messages
(MainWindow.update_title): New. Update the main window's title
(MainWindow.__SetTitle): Removed. Use update_title instead.
(MainWindow.SetMap): Use update_title instead of __SetTitle
(MainWindow.RenameMap): Do change the window title explicitly
here. That's handled in a proper MVC way now.
(MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
messages
* Thuban/Lib/connector.py (Conduit): New class to help classes
that forward messages
* Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
(ViewPort): Derive from Conduit instead of Publisher
(ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
when calling the inherited versions
(ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
methods to subscribe and unsubscribe map messages
(ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
handle the map subscriptions
(ViewPort.Map, ViewPort.map_projection_changed)
(ViewPort.layer_projection_changed): Add or update doc-strings
* test/test_connector.py (TestPublisher.test_issue_simple): Fix
typo
(MyConduit): Helper class for the Conduit test.
(TestConduit): Test cases for Conduit
* test/test_connector.py: Use support.run_tests as main.
* test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
the TITLE_CHANGED messages
(ViewPortTest.test_forwarding_title_changed): New test to check
whether the viewport forwards the map's TITLE_CHANGED messages
(TestViewportWithPostGIS.tearDown): Call the map's Destroy method
after the port's because the latter may require a still functional
map.
2003-10-06 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/application.py (ThubanApplication.maps_changed): Add
doc-string
2003-10-06 Bernhard Herzog <bh@intevation.de>
* test/test_viewport.py (ViewPortTest.setUp)
(SimpleViewPortTest.test_init_with_size): Move the test for the
initial size as a constructor parameter from ViewPortTest.setUp
method to a new separate test in SimpleViewPortTest.
2003-10-06 Bernhard Herzog <bh@intevation.de>
* test/test_viewport.py (MockView): New class derived from
ViewPort with a mock implementation of GetTextExtent to be used in
the test cases
(ViewPortTest.setUp): Use MockView instead of ViewPort
* Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
into what would be a "pure virtual function" in C++: always raise
NotImplementedError. Mock implementations for test cases don't
belong into the real code
2003-10-02 Bernhard Herzog <bh@intevation.de>
* test/test_layer.py (TestLayer.test_empty_layer): Explicitly
close the dbf file we create so that it's contents have been
written properly.
* libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
Update to shapelib 1.2.10
2003-10-01 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
it annoys lintian which warns about these files not being
executable. The #! isn't necessary here since if you absolutely
must execute them you can always say "python <filename>".
2003-09-26 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
is ported to a newer the import will fail, so it should be noticed
immediately that this function is gone.
Fixes RT#1919
2003-09-26 Bernhard Herzog <bh@intevation.de>
Add a DTD for the projection files and make thuban write valid
projection files
* Resources/XML/projfile.dtd: New. DTD for thuban's projection
files
* Thuban/Model/resource.py (ProjFileSaver.write): Use
'projectionlist' as the name in the document type declaration so
that it matches the element type of the root element.
* test/test_proj.py (sample_projfile, sample_projfile2): Use
'projectionlist' as the name in the document type declaration just
as it is done now in the files thuban would write
(sample_projfile, sample_projfile_data): Fix spelling of
"Mercator"
(TestProjFile.doTestWrite): Validate the written and the expected
XML data
(TestProjFile): Derive from ValidationTest so that we can run xml
validation tests
2003-09-24 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
modify the list returned by map.Layers() in place since it is the
actual list of layers used by the map.
2003-09-23 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual.xml: Added subsection to chapter
Extensions to describe the extensions coming with the Thuban
standard package (gns2shp and importAPR).
2003-09-23 Bernhard Herzog <bh@intevation.de>
* libraries/thuban/wxproj.cpp (project_point): if there's an
inverse but no forward projection, convert to degrees after
applying the inverse projection. Fixes RT#2096
* test/test_wxproj.py: New. Test cases for wxproj.so. One test
implicitly tests for the fix to RT#2096
* test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
Check that the sequences have the same lengths
* Resources/Projections/defaults.proj (Geographic projection): Use
a much more precise value for the to_meter attribute.
2003-09-22 Bernhard Herzog <bh@intevation.de>
* test/support.py (initthuban): Make sure to unset the LANG env.
var. so that tests that compare translated strings work. Solves RT
#2094
2003-09-22 Jan-Oliver Wagner <jan@intevation.de>
Small improvement of APR import.
* Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
Added tests for text-ranges.
* Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
returns a string object if the range is based on text.
* Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
range retrieval.
2003-09-22 Jan-Oliver Wagner <jan@intevation.de>
Initial version of the importAPR extension which is in
experimental state.
* /Extensions/importAPR/, /Extensions/importAPR/samples/,
/Extensions/importAPR/test/: New directories.
* /Extensions/importAPR/samples/README: New: Howto load the samples.
* /Extensions/importAPR/samples/iceland.apr: New: A sample APR
file which refers to the Thuban Iceland demo data.
* /Extensions/importAPR/test/README: New: Howto execute the tests.
* /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
* /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
as in '.apr'-files.
* /Extensions/importAPR/odb.py: New: Classes for generic ArcView
ODB Objects as in '.apr', '.avl' and other files.
* /Extensions/importAPR/__init__.py: New: Init to make this
directory a package.
* /Extensions/importAPR/importAPR.py: New: Import a ArcView
project file (.apr) and convert it to Thuban.
2003-09-22 Jan-Oliver Wagner <jan@intevation.de>
* Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
2003-09-19 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual.xml: Extended section 'Installation'
with description on RPM installation and RPM binary package
creation.
2003-09-18 Bernhard Herzog <bh@intevation.de>
* setup.py (data_files): Only add the mo files if the Locales
directory actually exists, so that setup.py works with a fresh CVS
checkout
2003-09-12 Jan-Oliver Wagner <jan@intevation.de>
* Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
in viewport, not anymore in view
2003-09-04 Jan-Oliver Wagner <jan@intevation.de>
Introducing first Extension (gns2shp).
* Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
* Extensions/__init__.py: New. init to make this dir a package.
* Extensions/gns2shp/__init__.py: New. init to make this dir a package.
* Extensions/gns2shp/test/README: New. some info on this test directory.
* Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
* Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
of Shapefile from GNS text file format
2003-09-03 Jan-Oliver Wagner <jan@intevation.de>
Fix/workaround for bug #2019:
https://intevation.de/rt/webrt?serial_num=2019
* Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
(IdentifyView.__init__): Added another button that allows to
stop the identify mode.
(IdentifyView.OnStop): New. Stops the identify mode.
2003-09-03 Jan-Oliver Wagner <jan@intevation.de>
Introducing a new exception dialog that allows to exit the
application immediately.
This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
* Thuban/UI/exceptiondialog.py: New. A special exception dialog.
* Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
Made strings available to translations. Exchanged the simple
ScrolledMessageDialog by the new ExceptionDialog.
2003-09-01 Bernhard Herzog <bh@intevation.de>
* NEWS: New. Summary of changes and release notes.
* MANIFEST.in: Add NEWS
2003-09-01 Bernhard Herzog <bh@intevation.de>
* MANIFEST.in: Correct the include statement for the mo-files and
include the documentation too.
* setup.py (data_files): Add the .mo files
(setup call): Up to version 0.9.0
2003-09-01 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
parameter list to just parent and session
(ChooseDBTableDialog.__set_properties): Removed. Setting the
selection of empty list boxes is not allowed (and produces C++
assertion errors) and the rest of the setup is better done in
__init__ anyway.
(ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
(ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
builtins True/False for booleans to avoid warnings from wxPython
* Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
ChooseDBTableDialog constructor parameters.
2003-09-01 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/postgisdb.py
(PostGISTable): Extend doc-string
(PostGISTable._fetch_table_information): Set the column index
correctly, pretending ignored columns don't exist.
* test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
for postgis tables with data types not yet supported by thuban.
2003-08-29 Bernhard Herzog <bh@intevation.de>
* HOWTO-Release: Tweak item about running the tests.
2003-08-29 Jan-Oliver Wagner <jan@intevation.de>
* /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
2003-08-29 Bernhard Herzog <bh@intevation.de>
Add some missing parameters to projections. Proj complains about
them on windows but for some reason not on Linux.
* test/test_save.py (SaveSessionTest.testLayerProjection): Add
missing required projection parameters
* test/test_proj.py (TestProjFile.test): Add missing required
projection parameters
* test/test_load_0_8.py (TestLayerProjection.file_contents)
(TestLayerProjection.test): Add missing required projection
parameters and tests for them
* test/test_load.py (TestLayerProjection.file_contents)
(TestLayerProjection.test): Add missing required projection
parameters and tests for them
* test/test_layer.py (TestLayer.test_base_layer): Add missing
required projection parameters
2003-08-29 Bernhard Herzog <bh@intevation.de>
* libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
access the pj_errno because directly accessing pj_errno doesn't
work on windows if the proj library is in a DLL
* libraries/pyprojection/Projection_wrap.c: Update from Projection.i
2003-08-28 Bernhard Herzog <bh@intevation.de>
* test/test_proj.py: Import things from Thuban after calling
initthuban
* test/test_load.py (LoadSessionTest.filenames): New class
variable with the filename attributes to normalize
(LoadSessionTest.check_format): Pass self.filenames to
sax_eventlist to normalize the filename attributes
* test/xmlsupport.py: Add cvs keywords
(SaxEventLister.__init__): New parameter filenames which indicates
attributes that contain filenames
(SaxEventLister.startElementNS): Normalize the filename attributes
with os.path.normpath
(sax_eventlist): New parameter filenames to pass through to
SaxEventLister
* test/test_derivedshapestore.py: Make this file callable as a
program to execute the tests
(TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
the session to self.session so that it gets destroyed properly
* test/test_layer.py (TestLayer.tearDown): Call the session's
Destroy method
* test/test_map.py (TestMapBase.tearDown): Destroy self.session
too if it exists
(TestMapAddLayer.test_add_layer): Bind the session to self.session
so that it gets destroyed properly
* test/postgissupport.py (reason_for_not_running_tests): Add a
test for the existence of popen2.Popen4.
* test/test_save.py (SaveSessionTest.tearDown): New. Provide a
reliable way to destroy the sessions created in the test cases
(SaveSessionTest.test_dbf_table): Bind the session to self.session
so that it gets destroyed properly
(SaveSessionTest.testLayerProjection): Bind the session to
self.session so that it gets destroyed properly
* test/test_session.py (UnreferencedTablesTests.tearDown): Make
sure that the session is destroyed properly
* test/test_shapefilestore.py: Make this callable as a program to
execute the tests
* test/test_scalebar.py: Remove unnecessary import of _ from
Thuban
* test/support.py (print_garbage_information): Call initthuban
here because it may be called indirectly from test cases that test
test support modules which do not use anything from thuban itself
(ThubanTestProgram.runTests): Remove unnecessary debug print
2003-08-28 Bernhard Herzog <bh@intevation.de>
* Thuban/version.py (longversion): Update to 0.9
* Thuban/UI/mainwindow.py: Remove some unused imports
* README: Add section about required additional software. Add date
and revision CVS keywords
* HOWTO-Release: Add item about the translations. Add date and
revision CVs keywords and change formatting to match README a bit
better
* po/de.po: Update for 0.9
* test/README: Tweak the wording a little because many tests are
not really unittest.
2003-08-27 Bernhard Herzog <bh@intevation.de>
As preparation for the 0.9 release, switch thuban files to a
non-dev namespace
* Thuban/Model/save.py (SessionSaver.write_session): Write files
with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
namespace
* Thuban/Model/load.py (SessionLoader.__init__): Accept the
http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
* test/test_save.py (SaveSessionTest.dtd)
(SaveSessionTest.testEmptySession)
(SaveSessionTest.testSingleLayer)
(SaveSessionTest.testLayerProjection)
(SaveSessionTest.testRasterLayer)
(SaveSessionTest.testClassifiedLayer)
(SaveSessionTest.test_dbf_table)
(SaveSessionTest.test_joined_table)
(SaveSessionTest.test_save_postgis): Update for new namespace
* test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
(TestLayerVisibility.file_contents, TestLabels.file_contents)
(TestLayerProjection.file_contents)
(TestRasterLayer.file_contents, TestJoinedTable.file_contents)
(TestPostGISLayer.file_contents)
(TestPostGISLayerPassword.file_contents)
(TestLoadError.file_contents, TestLoadError.test): Update for new
namespace
2003-08-27 Bernhard Herzog <bh@intevation.de>
Make the table interface distinguish between row ids (an integer
that uniquely identifies a row) and row ordinals (a simple row
count from 0 to NumRows() - 1)
* Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
(PostGISTable.RowOrdinalToId): New methods to conver between row
ids and row ordinals
(PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
parameter row_is_ordinal to indicate whether the row parameter is
the row id or the ordinal
* Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
(TransientTableBase.RowOrdinalToId)
(AutoTransientTable.RowIdToOrdinal)
(AutoTransientTable.RowOrdinalToId): Same new methods as in
PostGISTable.
(TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
(AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
Same new parameter as in PostGISTable.
* Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
(DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
(MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
(DBFTable.ReadValue, DBFTable.ReadRowAsDict)
(MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
parameter as in PostGISTable.
* Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
(DataTable.RowOrdinalToId): New methods to convert between row ids
and row ordinals.
(TableGrid.SelectRowById): New method to select a row based on its
ID as opposed to its ordinal
(DataTable.GetValue, TableGrid.OnRangeSelect)
(TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
(QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
(LayerTableFrame.__init__): Convert between row ids and row
ordinals as appropriate
* test/postgissupport.py (PostGISDatabase.__init__): Add
doc-string.
(PostGISDatabase.initdb): The optional third item in a tuple in
tables is now a (key, value) list with additional arguments to
pass to upload_shapefile
(upload_shapefile): New parameter gid_offset to allow gids that
are not the same as the shapeids in the shapefile
(PostgreSQLServer.get_default_static_data_db): Use the new
gid_offset to make the gids in landmarks 1000 higher than the
shapeids in the shapefile
* test/test_viewport.py
(TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
new shapeids in the landmarks table
* test/test_transientdb.py
(TestTransientTable.run_iceland_political_tests)
(TestTransientTable.test_transient_joined_table): Add tests for
the new table methods and new keywords arguments.
* test/test_postgis_db.py
(TestPostGISTable.test_read_row_as_dict_row_count_mode)
(TestPostGISTable.test_read_value_row_count_mode)
(TestPostGISTable.test_row_id_to_ordinal)
(TestPostGISTable.test_row_oridnal_to_id): New test for the new
table methods and the new arguments
(TestPostGISShapestorePoint.test_shapes_in_region)
(TestPostGISShapestorePoint.test_shape_raw_data)
(TestPostGISShapestorePoint.test_shape_points)
(TestPostGISShapestorePoint.test_shape_shapeid)
(TestPostGISShapestorePoint.test_all_shapes)
(TestPostGISTable.test_simple_query)
(TestPostGISTable.test_simple_query)
(TestPostGISTable.test_simple_query)
(TestPostGISTable.test_read_value)
(TestPostGISTable.test_read_row_as_dict): Adapt to the new
shapeids in the landmarks table
* test/test_memory_table.py
(TestMemoryTable.test_read_row_as_dict_row_count_mode)
(TestMemoryTable.test_read_value_row_count_mode)
(TestMemoryTable.test_row_id_to_ordinal)
(TestMemoryTable.test_row_oridnal_to_id): New test for the new
table methods and the new arguments
* test/test_dbf_table.py
(TestDBFTable.test_read_row_as_dict_row_count_mode)
(TestDBFTable.test_read_value_row_count_mode)
(TestDBFTable.test_row_id_to_ordinal)
(TestDBFTable.test_row_oridnal_to_id): New test for the new table
methods and the new arguments
2003-08-26 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
more postgis specific but much faster method to get the bounding
box
2003-08-26 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/postgisdb.py (PostGISTable.Title)
(PostGISShapeStore.AllShapes): Add these missing methods.
(PostGISShapeStore.ShapesInRegion): No need to raise
StopIteration. We can simply return
* test/test_postgis_db.py (TestPostGISTable.test_title)
(TestPostGISShapestorePoint.test_all_shapes): New tests for the
new methods
2003-08-25 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
* test/test_postgis_db.py (PolygonTests): New class containing
those tests from TestPostGISShapestorePolygon that can also be
used to test MUTLIPOLYGON tables
(TestPostGISShapestorePolygon): Most tests are now in PolygonTests
so derive from that
(TestPostGISShapestoreMultiPolygon): New class with tests for
MUTLIPOLYGON tables
* test/postgissupport.py (PostGISDatabase.initdb): Allow the
tables argument to have tuples with three items to override the
WKT type used.
(PostgreSQLServer.get_default_static_data_db): Use the above to
create a polygon table with MUTLIPOLYGONs
(point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
(arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
coords_to*
(coords_to_multipolygon): New. Convert to MUTLIPOLYGON
(wkt_converter): New. Map WKT types to converters
(upload_shapefile): New parameter force_wkt_type to use a
different WKT type than the default
2003-08-25 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/application.py
(ThubanApplication.run_db_param_dialog): New. Suitable as a
db_connection_callback. Main difference is that the dialog run
from this method doesn't have a parent so it can be used even when
there is no main window
(ThubanApplication.OpenSession): Use self.run_db_param_dialog if
no db_connection_callback was given. This way the dialog pops up
even when the .thuban file was given as a command line parameter.
2003-08-25 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
which leads to an effectively frozen X session because the user
can only interact with the dialog but the mouse is still grabbed
by the canvas.
Also, call the tool's Hide method before MouseLeftUp because
MouseLeftUp may change the tool's coordinates.
2003-08-25 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
LoadCancelled exceptions and handle them by returning immediately.
2003-08-25 Bernhard Herzog <bh@intevation.de>
GUI part of loading sessions with postgis connections which may
require user interaction to get passwords or updated parameters
* Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
bit nucer and be more generic.
(DBFrame.OnAdd): Adapt to new DBDialog interface
* Thuban/UI/application.py (ThubanApplication.OpenSession): New
optional parameter db_connection_callback which is passed to
load_session.
* Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
Suitable as a db_connection_callback
(MainWindow.OpenSession): Use self.run_db_param_dialog as the
db_connection_callback of the application's OpenSession method
2003-08-25 Bernhard Herzog <bh@intevation.de>
Basic loading of sessions containing postgis connections:
* Thuban/Model/load.py (LoadError): Add doc-string
(LoadCancelled): New exception class to indicate a cancelled load
(SessionLoader.__init__): Add the db_connection_callback parameter
which will be used by the loader to get updated parameters and a
password for a database connection
(SessionLoader.__init__): Add the new XML elements to the
dispatchers dictionary
(SessionLoader.check_attrs): Two new conversions, ascii to convert
to a byte-string object and idref as a generic id reference
(SessionLoader.start_dbconnection)
(SessionLoader.start_dbshapesource): New. Handlers for the new XML
elements
(load_session): Add the db_connection_callback to pass through the
SessionLoader
* test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
New classes to test loading of sessions with postgis database
connections.
2003-08-25 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
replace it and the comment with __BuildDate__ by the Source: and
Id: cvs keywords as used in the other files.
2003-08-25 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
LoadError when a required attribute is missing. The code used to
be commented out for some reason, but probably should have been
active.
* test/test_load.py (TestLoadError.test): Test the message in the
LoadError too to make sure it really is about the missing
attribute
2003-08-22 Bernhard Herzog <bh@intevation.de>
* test/test_save.py (SaveSessionTest.test_dbf_table)
(SaveSessionTest.test_joined_table): Add XML validation tests.
2003-08-22 Bernhard Herzog <bh@intevation.de>
Implement saving a session with a postgis connection
* Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
elements for database connections and shapestores using db
connections
(session): Add the dbconnections to the content model
* Thuban/Model/save.py (SessionSaver.write_db_connections): New.
Write the db connections
(SessionSaver.write_session): Call write_db_connections to write
the connection before the data sources
(SessionSaver.write_data_containers): Handle postgis shapestores
* test/test_save.py (SaveSessionTest.thubanids)
(SaveSessionTest.thubanidrefs): Update for new DTD
(SaveSessionTest.test_save_postgis): New. Test saving a session
with postgis connections
* Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
(PostGISTable.TableName): New accessor methods for the connection
and table name
* test/test_postgis_db.py (TestPostGISTable.test_dbconn)
(TestPostGISTable.test_dbname): New methods to test the new
PostGISConnection methods
2003-08-22 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/postgisdb.py (ConnectionError): New exception class
for exceptions occurring when establishing a Database connection
(PostGISConnection.connect): Catch psycopg.OperationalError during
connects and raise ConnectionError.
* test/test_postgis_db.py (TestPostgisDBExceptions): New class for
tests for database exceptions
2003-08-22 Bernhard Herzog <bh@intevation.de>
Prepare the test suite for tests with required authentication
* test/postgissupport.py (PostgreSQLServer.__init__): Add instance
variables with two predefined users/passwords, one for the admin
and one for a non-privileged user.
(PostgreSQLServer.createdb): Pass the admin name to initdb and add
the non-privileged user to the database and set the admin password
(PostgreSQLServer.wait_for_postmaster): Use the admin user name.
Better error reporting
(PostgreSQLServer.connection_params)
(PostgreSQLServer.connection_string): New methods to return
information about how to connect to the server
(PostgreSQLServer.execute_sql): New. Convenience method to execute
SQL statements
(PostgreSQLServer.require_authentication): Toggle whether the
server requires authentication
(PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
Add or alter users
(PostGISDatabase.initdb): Pass the admin name one the
subprocesses' command lines. Grant select rights on
geometry_columns to everybody.
(upload_shapefile): Use the admin name and password when
connecting. Grant select rights on the new table to everybody.
* test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
server's new methods to get the connection parameters.
* test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
(TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
server's new methods to get the connection parameters.
* test/test_postgis_db.py
(TestPostGISConnection.test_gis_tables_empty)
(TestPostGISConnection.test_gis_tables_non_empty)
(PostGISStaticTests.setUp): Use the server's new methods to get
the connection parameters.
2003-08-22 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/about.py (About.__init__): Add the psycopg version.
* Thuban/version.py: Add psycopg version
* Thuban/Model/postgisdb.py (psycopg_version): New. Return the
version of the psycopg module
2003-08-22 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
(DBFrame.OnEdit): Removed because it's not used and wouldn't work
at the moment. The functionality should probably be implemented
some time, though.
(DBFrame.OnRemove): Display a message if the connection can't be
removed because it's still in use.
2003-08-22 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/about.py (About.__init__): split up the huge about
text into elements/lists for easier translation. This fixes bug
https://intevation.de/rt/webrt?serial_num=2058
Also, made some forgotten string available for the i18n.
2003-08-21 Bernhard Herzog <bh@intevation.de>
Make postgis support really optional including insensitive menu
items.
* Thuban/Model/postgisdb.py (has_postgis_support): New. Return
whether the postgis is supported.
* Thuban/UI/dbdialog.py: Put the psycopg import into try..except
to make postgis support optional
* Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
version of Thuban.Model.postgisdb.has_postgis_support
(database_management command): Make it only sensitive if postgis
is supported.
2003-08-21 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
(section Adding and Removing Layers): Added text and described
multi-selection.
(chapter Extensions): New.
2003-08-21 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
settings to allow multiple files to load into the map.
Also reduced selection to *.shp as a default.
2003-08-20 Bernhard Herzog <bh@intevation.de>
Add dialogs and commands to open database connections and add
database layers.
* Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
method to open the database connection management dialog
(MainWindow.AddDBLayer): New method to add a layer from a database
(_has_dbconnections): New helper function to use for sensitivity
(database_management command, layer_add_db command): New commands
that call the above new methods.
(main_menu): Add the new commands to the menu.
* Thuban/Model/postgisdb.py (PostGISConnection.__init__)
(PostGISConnection.connect): Establish the actual connection in a
separate method and call it in __init__. This makes it easier to
override the behavior in test cases
(PostGISConnection.BriefDescription): New method to return a brief
description for use in dialogs.
* test/test_postgis_db.py (NonConnection): DB connection that
doesn't actually connect
(TestBriefDescription): New class with tests for the new
BriefDescription method
2003-08-19 Jan-Oliver Wagner <jan@intevation.de>
Moved anything from extensions to libraries.
* libraries: New.
* libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
* libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
been moved here from thuban/extensions/pyprojection/
See there in the Attic for the older history.
* libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
have been moved here from thuban/extensions/pyshapelib/
See there in the Attic for the older history.
* libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
files have been moved here from thuban/extensions/shapelib/
See there in the Attic for the older history.
* libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
gdalwarp.cpp, wxproj.cpp: These files have been moved here from
thuban/extensions/thuban/
See there in the Attic for the older history.
* MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
* extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
* extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
Moved to libraries/shapelib.
* extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
Moved to libraries/pyshapelib.
* extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
Moved to libraries/pyprojection.
* extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
* extensions: Removed.
2003-08-19 Bernhard Herzog <bh@intevation.de>
* test/test_viewport.py (ViewPortTest): We don't use the
facilities of FileTestMixin so don't derive from it.
(TestViewportWithPostGIS): New class with tests for using a
viewport on a map with postgis layers.
2003-08-19 Bernhard Herzog <bh@intevation.de>
Add the db connection management to the session.
* Thuban/Model/session.py (Session.__init__): New instance
variable db_connections
(Session.AddDBConnection, Session.DBConnections)
(Session.HasDBConnections, Session.CanRemoveDBConnection)
(Session.RemoveDBConnection): New methods to manage and query the
db connections managed by the session
(Session.OpenDBShapeStore): New method to open a shapestore from a
db connection
* Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
messages for the db connection handling in the session
* test/test_postgis_session.py: New. test cases for the session's
db connection handling with postgis connections
2003-08-19 Bernhard Herzog <bh@intevation.de>
Add very basic postgis database support and the corresponding test
cases. The test cases require a PostgreSQL + postgis installation
but no existing database. The database will be created
automatically by the test cases
* test/README: Add note about skipped tests and the requirements
of the postgis tests.
* Thuban/Model/postgisdb.py: New. Basic postgis database support.
* test/test_postgis_db.py: New. Test cases for the postgis
support.
* Thuban/Model/wellknowntext.py: New. Parser for well-known-text
format
* test/test_wellknowntext.py: New. Test cases for the
wellknowntext parser
* test/postgissupport.py: New. Support module for tests involving
a postgis database.
* test/support.py (execute_as_testsuite): Shut down the postmaster
if it's still running after the tests
* Thuban/Model/data.py (RAW_WKT): New constant for raw data in
well known text format
2003-08-19 Jan-Oliver Wagner <jan@intevation.de>
* Examples/simple_extensions/hello_world.py: New. Raises a Hello World
message dialog.
2003-08-18 Bernhard Herzog <bh@intevation.de>
* test/support.py (ThubanTestResult.printErrors): Indent the
reason for the skips in the output to make it a bit more readable.
(execute_as_testsuite): New helper function to run a test suite
and print some more information.
(run_tests): Use execute_as_testsuite to run the tests
* test/runtests.py (main): Use execute_as_testsuite to run the
tests
2003-08-18 Bernhard Herzog <bh@intevation.de>
Fix some bugs in Thuban and the test suite that were uncovered by
changes introduced in Python 2.3:
* Thuban/Model/table.py (DBFTable.__init__): Make sure the
filename is an absolute name
* Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
filename is an absolute name
* test/test_save.py (SaveSessionTest.testRasterLayer): Use a
unique filename to save to and use the correct relative filename
in the expected output.
(SaveSessionTest.test_dbf_table): Use the correct relative
filename in the expected output.
* test/test_layer.py (TestLayer.test_raster_layer): Update the
test to check whether the filename is absolute.
2003-08-18 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/about.py (About.__init__): Added Silke Reimer.
2003-08-15 Bernhard Herzog <bh@intevation.de>
Change the way shapes are returned by a shape store. The
ShapesInRegion method returns an iterator over actual shape
objects instead of a list of shape ids.
* Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
id.
(ShapefileStore.ShapesInRegion): Return an iterator over the
shapes which yields shape objects instead of returning a list of
shape ids
(ShapefileStore.AllShapes): New. Return an iterator over all
shapes in the shape store
(DerivedShapeStore.AllShapes): New. Like in ShapefileStore
* Thuban/Model/layer.py (Layer.ShapesInRegion): Update
doc-string.
* Thuban/UI/baserenderer.py
(BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
layer_shapes and make it return an iterator containg shapes
instead of a list of ids.
(BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
layer_shapes() change
* Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
(ScreenRenderer.layer_shapes): Rename as in BaseRenderer
* Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
changes in the ShapesInRegion return value.
(ViewPort._get_hit_tester): Remove commented out code
* test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
new return value.
(SimpleShapeStore.AllShapes): New. Implement this method too.
* test/test_layer.py (TestLayer.test_arc_layer)
(TestLayer.test_polygon_layer, TestLayer.test_point_layer)
(TestLayer.test_point_layer_with_projection)
(TestLayer.test_derived_store): Adapt to changes in the
ShapesInRegion return value.
* test/test_shapefilestore.py
(TestShapefileStoreArc.test_shapes_in_region)
(TestShapefileStorePolygon.test_shapes_in_region)
(TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
in the ShapesInRegion return value.
(TestShapefileStorePoint.test_all_shapes)
(TestShapefileStoreArc.test_shape_shapeid): New tests for the new
methods
* test/test_derivedshapestore.py
(TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
the ShapesInRegion return value.
(TestDerivedShapeStore.test_all_shapes)
(TestDerivedShapeStore.test_shape_shapeid): New tests for the new
methods
2003-08-15 Bernhard Herzog <bh@intevation.de>
Make the renderers deal correctly with raw vs. python level
representation of shape geometries
* Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
Return a flag useraw in addition to the callable and the parameter
to indicate whether the callable can deal with the raw shape data
or uses the higher level python lists of coordinates. The callable
now should accept either the raw data or the return value of the
shape's Points() method.
(BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
change
(BaseRenderer.projected_points): Instead of the shape id use the
points list as parameter.
(BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
(BaseRenderer.draw_point_shape): Adapt to projected_points()
change and accept the points list as parameter instead of the
shape id.
* Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
the useraw flag as required by the BaseRenderer
(ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
changes.
* test/test_baserenderer.py
(TestBaseRenderer.test_point_with_classification): New test for
rendering a map with classifications.
2003-08-15 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/viewport.py (ViewPort.find_shape_at)
(ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
(ViewPort._get_hit_tester, ViewPort.projected_points)
(ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
(ViewPort._find_label_at): Split the find_shape_at method into
several new methods and use the functions in the hit-test module.
* Thuban/UI/hittest.py: New module with Python-level hit-testing
functions
* test/test_hittest.py: New. Test for the new hittest module
2003-08-15 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
projection to all corners of the bounding box to get a better
approximation of the projected bounding box
* test/test_layer.py (TestLayer.test_point_layer_with_projection):
New. Test coordinate handling of a layer with a projection.
Catches the bug fixed in Layer.ShapesInRegion
2003-08-15 Bernhard Herzog <bh@intevation.de>
Move some of the mock objects in test_baserenderer into their own
module so they can easily be used from other tests
* test/mockgeo.py: New test helper module with some mock objects
for geometry related things like shapes, shapestores and
projections.
* test/test_mockgeo.py: New. Tests for the new helper module
* test/test_baserenderer.py: Some of the mock-objects are in
mockgeo now.
2003-08-12 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/about.py (About.__init__): Added Bjrn Broscheit.
2003-08-12 Bernhard Herzog <bh@intevation.de>
* po/de.po: New. German translations by Bjoern Broscheit
2003-08-12 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
strings have to be one string literal.
2003-08-11 Bernhard Herzog <bh@intevation.de>
* test/support.py (FloatComparisonMixin.assertPointListEquals):
New. This method was used in various derived classes, but it's
better to have it here.
* test/test_shapefilestore.py
(ShapefileStoreTests.assertPointListEquals): Removed. It's now in
FloatComparisonMixin
* test/test_layer.py (TestLayer.assertPointListEquals): Removed.
It's now in FloatComparisonMixin
* test/test_derivedshapestore.py
(TestDerivedShapeStore.assertPointListEquals): Removed. It's now
in FloatComparisonMixin
2003-08-11 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
error message
2003-08-08 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
with version number.
Changed title to reflect version number of Thuban.
2003-08-08 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
the list corresponds to the "About" web page.
2003-08-08 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
Make sure translated strings are recognized as one string literal.
* Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
Make sure translated strings are recognized as one string literal.
* Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
translated strings are recognized as one string literal.
* Thuban/UI/application.py (ThubanApplication.OpenSession): Make
sure translated strings are recognized as one string literal.
2003-08-07 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
Simply delegates to the original shapestore.
* test/test_derivedshapestore.py
(TestDerivedShapeStore.test_raw_format): New. Test case for
DerivedShapeStore.RawShapeFormat
2003-08-07 Bernhard Herzog <bh@intevation.de>
Add raw data interface to shape objects.
* Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
class to ShapefileShape which now holds shapefile specific
information.
(ShapefileShape.compute_bbox): Simplified to not cache any
information. The way this method is used that shouldn't matter
performance wise.
(ShapefileShape.RawData): New. Return the shapeid which is the raw
data format for shapes from shapefiles.
(ShapefileStore.RawShapeFormat): New. Return the raw datatype used
in the shape objects returned by a shapestore. For a
ShapefileStore this is always RAW_SHAPEFILE.
(RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
method.
* test/test_shapefilestore.py
(TestShapefileStore.test_raw_format): New test to test the raw
format feature of shapes.
* Thuban/Model/layer.py: Remove the unused import of Shape from
data. It was only there for interface compatibility but it's not
used inside of Thuban and the generic Shape class has gone away.
* Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
the raw data format and only use an optimized version of its a
shapefile.
2003-08-07 Bernhard Herzog <bh@intevation.de>
* test/test_baserenderer.py (SimpleShape): Shape class for the
tests.
(SimpleShapeStore.Shape): Use SimpleShape instead of
Thuban.Model.data.Shape to make the tests independed of the coming
changes.
2003-08-07 Bernhard Herzog <bh@intevation.de>
* test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
(ThubanTestProgram): New classes that extend the respective
classes from unittest. These new version support skipping tests
under certain expected conditions. In the Thuban test suite we
uses this for tests that require the optional gdal support.
(run_tests): Use ThubanTestProgram instead of the unittest.main()
* test/runtests.py (main): Use the new ThubanTestRunner instead of
the normal one from unittest
* test/test_layer.py (TestLayer.test_raster_layer): If this test
is not run because gdal support isn't available report this to the
runner.
* test/test_baserenderer.py
(TestBaseRenderer.test_raster_no_projection): Do not run this test
if gdal support isn't available and report this to the runner.
2003-08-06 Bernhard Herzog <bh@intevation.de>
Rearrange the renderers a bit, partly in preparation for changes
required for the postgis merge, partly to make it more testable.
Also make the representation of coordinates in Shapes more
consistent.
* Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
this class is now in BaseRenderer. This class is now practically
only a specialization of BaseRenderer for rendering to an actual
wx DC.
(ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
to get the shapetype specific rendering functions.
* Thuban/UI/baserenderer.py: New file with the basic rendering
logic. The code in this file is completely independend of wx.
(BaseRenderer): Class with the basic rendering logic
* test/test_baserenderer.py: New. Test cases for BaseRenderer
* Thuban/UI/view.py (MapCanvas.__init__): New instance variable
error_on_redraw to guard agains endless loops and stack overflows
when there's a bug in the rendering code that raises exceptions.
(MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
rendering into a separate method _do_redraw so that error handling
is a bit easier. When an exception occurs, set error_on_redraw to
true. When it's true on entry to OnIdle do nothing and return
immediately.
* Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
Shape object will always have the coordinates as a list of list of
coordinate pairs (tuples).
(Shape.compute_bbox): Adapt to new representation.
* Thuban/UI/viewport.py (ViewPort.find_shape_at)
(ViewPort.LabelShapeAt): Adapt to new coordinate representation in
Shape objects.
* test/test_shapefilestore.py
(ShapefileStoreTests.assertFloatTuplesEqual)
(ShapefileStoreTests.assertPointListEquals): Rename to
assertPointListEquals and change purpose to checking equality of
the lists returned by Shape.Points().
(TestShapefileStoreArc.test_shape)
(TestShapefileStorePolygon.test_shape)
(TestShapefileStorePoint.test_shape): Use the new
assertPointListEquals instead of assertFloatTuplesEqual
* test/test_layer.py (TestLayer.assertFloatTuplesEqual)
(TestLayer.assertPointListEquals): Rename to assertPointListEquals
and change purpose to checking equality of the lists returned by
Shape.Points().
(TestLayer.test_arc_layer, TestLayer.test_arc_layer)
(TestLayer.test_polygon_layer, TestLayer.test_point_layer)
(TestLayer.test_derived_store): Use the new assertPointListEquals
instead of assertFloatTuplesEqual
* test/test_derivedshapestore.py
(TestDerivedShapeStore.assertFloatTuplesEqual)
(TestDerivedShapeStore.assertPointListEquals): Rename to
assertPointListEquals and change purpose to checking equality of
the lists returned by Shape.Points().
(TestDerivedShapeStore.test_shape): Use the new
assertPointListEquals instead of assertFloatTuplesEqual
2003-08-06 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
a bounding box. A dialog is raised in case, no bounding box
is found. This fixes bug #2043:
https://intevation.de/rt/webrt?serial_num=2043
2003-08-05 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/color.py (Color.__repr__): Make the repr of a color
object look like a Color instantiation. Formerly it looked like a
tuple.
* test/test_color.py (TestColor.test_repr)
(TestColor.test_equality, TestColor.test_inequality): New. test
some more apects of the Color class
(TestTransparent.test_repr, TestTransparent.test_hex)
(TestTransparent.test_equality): New. Test cases for the
Transparent object.
2003-08-04 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual.xml: a number of small improvements.
The resulting file is the version submitted for GREAT-ER II.
2003-08-01 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/resource.py, Thuban/UI/projdialog.py,
Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
* Thuban/UI/common.py: Insert cvs keywords and doc-strings.
(Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
(ThubanEndBusyCursor): Add doc-strings
2003-08-01 Bernhard Herzog <bh@intevation.de>
First step towards PostGIS integration. More abstraction by movin
more code from the layer to the shapestore. More methods of the
layer are now simply delegated to the equivalent method of the
shapestore. The SHAPETYPE_* constants are now in data not in
layer.
* Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
(SHAPETYPE_POINT, Shape): Move these constants and classes from
layer.py to data.py
(ShapefileStore.__init__): More Initialization for the new methods
and functionality.
(ShapefileStore.ShapeType, ShapefileStore.NumShapes)
(ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
(ShapefileStore.Shape): New methods that were formerly implemented
in the layer.
(DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
(DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
(DerivedShapeStore.BoundingBox): New. DerivedShapeStore
equivalents of the new shape methods. These versions are simply
delegated to the original shapstore.
* Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
(SHAPETYPE_POINT, Shape): Removed. They're now in data.py
(Layer.SetShapeStore): Removed the initializatin of instance
variables that were needed for the stuff that's now in
ShapefileStore
(Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
(Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
shapestore.
* Thuban/UI/classifier.py, Thuban/UI/renderer.py,
Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
instead of layer.
* test/test_shapefilestore.py: New. Tests for ShapefileStore.
* test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
* test/test_layer.py: Import the SHAPETYPE_* constants from data
instead of layer.
(TestLayer.test_derived_store): Remove the test for the exception
when instantiating the DerivedShapeStore with an incompatible
table which is now in test_derivedshapestore.py. Add some more
tests of the layer methods to determine whether they work for a
DerivedShapeStore as well.
2003-07-31 Jonathan Coles <jonathan@intevation.de>
* Doc/manual/thuban-manual.xml: Fix the list of required packages
by just listing the name and where they can be found.
2003-07-31 Frank Koormann <frank.koormann@intevation.de>
* Doc/manual/thuban-manual.xml:
Changed the screenshot elements to figure.
Changed some variablelist elements to itemizedlist.
Added section on GDAL formats.
2003-07-31 Jonathan Coles <jonathan@intevation.de>
* Doc/manual/thuban-manual.xml: Added a few sentences about
the Fix Border Color option when generating classes.
2003-07-30 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classgen.py: Add docstrings. Rename specific
Ramp instances to use lower_case_style.
* Thuban/UI/classgen.py: Use renamed Ramp instances.
* Thuban/UI/classifier.py: Add docstrings.
* Thuban/UI/dock.py: Add docstrings.
* test/test_classgen.py: Use renamed Ramp instances.
2003-07-30 Bernhard Herzog <bh@intevation.de>
* Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
was never used in Thuban.
2003-07-30 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
method directly instead of going through the transient_table
method. This faster because transient_table may force the copy of
a DBF file into the transient database and setting a table's title
doesnm't affect the title of the associated transient table, so
this fixes RT #2042
* Thuban/UI/main.py (__version__): Don't import the already
removed show_exception_dialog.
2003-07-29 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
Put back this method and remove the equivalent function since we
are setting the exception hook from within this class (OnInit).
2003-07-29 Jonathan Coles <jonathan@intevation.de>
* Doc/manual/images/5_2_custom_ramp.png,
Doc/manual/images/5_2_quantiles.png,
Doc/manual/images/5_2_uniform_dist.png,
Doc/manual/images/5_2_unique_values.png,
Doc/manual/images/8_int_error.png: New screen shots.
* Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
some points, and added more screen shots.
2003-07-29 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/data.py: Remove the now unused import of warnings
2003-07-29 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/data.py (SimpleStore): Removed. This class has been
deprecated since before the 0.8 release and isn't used in Thuban
itself anymore.
* Thuban/Model/transientdb.py: Remove some unnecessary imports
2003-07-29 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/application.py (ThubanApplication.OnInit): set the
python exception hook here so that we are sure to catch any
Thuban exception that happen during initialization.
* Thuban/UI/main.py (main): Don't set the exception hook here,
it will get set in ThubanApplication.OnInit.
2003-07-29 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
Removed and called it show_exception_dialog() so that the exception
handler can be set before the class is created.
* Thuban/UI/main.py (main): Install the exception handler before
a ThubanApplication is created.
2003-07-29 Bernhard Herzog <bh@intevation.de>
* po/it.po: New. Italian translation by Maurizio Napolitano
* po/ru.po: New. Russian translation by Alex Shevlakov
2003-07-29 Frank Koormann <frank.koormann@intevation.de>
* Doc/manual/thuban-manual.xml: Extended section on supported
projections.
2003-07-29 Frank Koormann <frank.koormann@intevation.de>
* Doc/manual/thuban-manual.xml: gaspell-checked.
2003-07-29 Jonathan Coles <jonathan@intevation.de>
* Doc/manual/images/3_5_legend.png: Added border to improve look
on white background.
2003-07-29 Jonathan Coles <jonathan@intevation.de>
* Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
descriptions for the legend toolbar.
* Doc/manual/images/4_2_raster_layer_properties.png: Removed
cursor from dialog box.
2003-07-28 Jonathan Coles <jonathan@intevation.de>
* Doc/manual/thuban-manual.xml: More screenshots and more chapters.
* Doc/manual/images/2_4_session_tree.png,
Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
Doc/manual/images/4_2_layer_properties.png,
Doc/manual/images/4_2_raster_layer_properties.png,
Doc/manual/images/5_3_genclass.png,
Doc/manual/images/5_classification.png,
Doc/manual/images/6_projection.png,
Doc/manual/images/7_1_table_view.png,
Doc/manual/images/7_2_5_join.png: New screenshots.
2003-07-24 Jonathan Coles <jonathan@intevation.de>
* Doc/manual/thuban-manual.xml: Chapter on Projection Management.
2003-07-24 Jonathan Coles <jonathan@intevation.de>
* Doc/manual/thuban-manual.xml: Added EPS images and wrote
chapter on Layer Management.
* Doc/manual/Makefile: New. Makefile to generate all formats for the
manual and images.
2003-07-24 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
it annoys lintian which warns about these files not being
executable. The #! isn't necessary here since if you absolutely
must execute them you can always say "python <filename>".
* Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
superfluous code to set brush and pen for point shapes
* Thuban/UI/viewport.py: Remove commented out code that wouldn't
belong in viewport anyway
2003-07-24 Frank Koormann <frank.koormann@intevation.de>
* Doc/manual/thuban-manual.xml: Added section on table management.
2003-07-24 Bernhard Herzog <bh@intevation.de>
* test/runtests.py (main): Recognize the long "verbose" option
correctly.
2003-07-22 Jonathan Coles <jonathan@intevation.de>
* Doc/manual/thuban-manual.xml: Continue to write first revision
of the manual.
* Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
with Begin/EndDrawing() calls to ensure we aren't doing to
many updates to the dc during rendering.
(ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
a pen and brush argument so they need to be passed to the function.
* Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
Calculates the minimum and maximum scale values. Factored out
of set_view_transform so that it could be used to zoom all the
way into a single point.
(ViewPort.set_view_transform): Call calc_min_max_scales().
(ViewPort.FitSelectedToWindow): Zoom to the maximum scale
if only a single point is selected.
* Doc/manual/images/1_2_legend_close.png,
Doc/manual/images/1_2_legend_dock.png,
Doc/manual/images/1_2_mainwindow.png,
Doc/manual/images/1_2_mainwindow.ps,
Doc/manual/images/1_2_mainwindow.sk,
Doc/manual/images/3_2_fullextent.png,
Doc/manual/images/3_2_fulllayerextent.png,
Doc/manual/images/3_2_fullshapeextent.png,
Doc/manual/images/3_2_pan.png,
Doc/manual/images/3_2_zoomin.png,
Doc/manual/images/3_2_zoomout.png,
Doc/manual/images/3_3_identify.png,
Doc/manual/images/3_3_label.png,
Doc/manual/images/3_5_invisible.png,
Doc/manual/images/3_5_movedown.png,
Doc/manual/images/3_5_moveup.png,
Doc/manual/images/3_5_props.png,
Doc/manual/images/3_5_tobottom.png,
Doc/manual/images/3_5_totop.png,
Doc/manual/images/3_5_visible.png: New. Images for the documentation.
2003-07-18 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/messages.py (MAP_REPLACED): New message.
* Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
after the new map has been assigned
* Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
Delegate MAP_REPLACED to the canvas too
(MainWindow.prepare_new_session): Removed. Thanks to the new
MAP_REPLACED message it's no longer needed
(MainWindow.OpenSession, MainWindow.NewSession):
prepare_new_session has been removed.
* Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
MAP_REPLACED so that we can close the dialog if a new map is set.
(Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
(Classifier.map_replaced): Handle MAP_REPLACED by closing the
dialog
* test/test_viewport.py (SimpleViewPortTest)
(SimpleViewPortTest.test_default_size): Add doc-strings
(ViewPortTest.setUp): Bind map to self.map so we can use it in
tests. Subscribe to MAP_REPLACED messages too.
(ViewPortTest.tearDown): No need to explicitly unsubscribe
(ViewPortTest.test_set_map): New test for the SetMap method.
2003-07-18 Bernhard Herzog <bh@intevation.de>
* test/test_viewport.py (SimpleViewPortTest.test_default_size):
Move this test from ViewPortTest.setUp to this new separate test
case. setUp is not the place for the actual tests.
(ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
more of the test from setUp to the new test test_inital_settings.
(ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
(ViewPortTest.test_proj_conv): Split test_proj_conv into
test_win_to_proj and test_proj_to_win and make the tests easier to
understand
(ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
(ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
(ViewPortTest.test_unprojected_rect_around_point)
(ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
Reformat to increase readability.
2003-07-18 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
2003-07-18 Bernhard Herzog <bh@intevation.de>
* test/runtests.py: The test suite can now be run without an X
connection. To make sure this remains true, remove the DISPLAY
environment variable so that an error occurs if the wxGTK is
imported accidentally
2003-07-18 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/viewport.py: Remove unused imports
* Thuban/UI/view.py: Remove unused imports
2003-07-18 Bernhard Herzog <bh@intevation.de>
* test/test_export.py Remove unused imports. The OutputTransform
function is now in viewport.py and is called output_transform
(TestScalebar.test_output_transform)
(TestScalebar.test_OutputTransform): Renamed to
test_output_transform and updated to use output_transform instead
of OutputTransform
* Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
renamed.
(MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
renamed to output_transform
* Thuban/UI/viewport.py (OutputTransform, output_transform):
Rename to output_transform
2003-07-18 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.__init__): Rename
classificationField to classificatin_column and init it here so
that it can be used in SetClassificationColumn
(Layer.GetClassificationColumn, Layer.GetClassificationField):
Rename to GetClassificationColumn.
(Layer.SetClassificationColumn, Layer.SetClassificationField):
Rename to SetClassificationColumn and issue a LAYER_CHANGED
message if the column changes.
(Layer._classification_changed, Layer.ClassChanged): Rename to
_classification_changed. Update the callers.
(Layer.SetShapeStore): Further field->column renames.
* Thuban/Model/load.py (SessionLoader.start_classification)
(SessionLoader.start_clpoint): Updates because of
field->column method name changes in the Layer class
* Thuban/Model/save.py (SessionSaver.write_classification): Updates
because of field->column method name changes in the Layer class
* Thuban/UI/classifier.py (Classifier.__init__)
(Classifier._OnTry, Classifier._OnRevert): Updates because of
field->column method name changes in the Layer class
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
because of field->column method name changes in the Layer class
* Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
of field->column method name changes in the Layer class
* test/test_save.py (SaveSessionTest.testClassifiedLayer)
(SaveSessionTest.testClassifiedLayer): Update because of
field->column method name changes in the Layer class
* test/test_layer.py (SetShapeStoreTests.setUp)
(SetShapeStoreTests.test_sanity): Update because of field->column
method name changes in the Layer class
(TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
(TestLayerModification.test_sanity)
(TestLayerModification.test_initial_settings): remove unsued code
and rename to test_sanity.
(TestLayerModification.test_set_classification): New test for
SetClassification and SetClassificationField.
2003-07-18 Bernhard Herzog <bh@intevation.de>
* test/test_classgen.py (TestFixedRamp.test): Extend test to check
the non-fixed values as well. The old test would have accepted a
fixed ramp that only returnes the fixed properties
2003-07-17 Jonathan Coles <jonathan@intevation.de>
* Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
shots for the manual. The XCF file is the source image and
has additional layers to support changes.
* Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
* Thuban/UI/classifier.py (Classifier.__BuildClassification):
Return both the new class and the field name.
* Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
fit the map to the window as this changes any zoom level that
the user may have set.
2003-07-16 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classgen.py (generate_singletons,
generate_uniform_distribution, generate_quantiles): Remove
fixes parameter, but maintain the same functionality by having
the calling function pass a FixedRamp object for the ramp.
(FixedRamp): New. Adapts a ramp to have fixed property values.
* Thuban/Model/classification.py: Use new CLASS_CHANGED message.
(Classification): Inherit from Publisher.
(Classification.__init__): Remove the layer parameter.
Classifications no longer need to have a parent layer.
(Classification.GetField, Classification.GetFieldType,
Classification.SetFieldInfo): Removed. The field name is stored
in the layer, and the type can be retreived by calling
Layer.GetFieldType().
(Classification._set_layer, Classification.GetLayer): Removed.
Classifications no longer have a parent layer.
* Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
classification.
(Layer.SetShapeStore): Reset the classification first while
we still have the old shape store to work with.
(Layer.GetClassificationField, Layer.SetClassificationField):
New. Method for getting/setting the field to classify on.
(Layer.SetClassification): Simplified now that the layer
simply has to hold a reference to the classification and not
tell the classification who owns it.
Fixes RTbug #2023.
* Thuban/Model/load.py (SessionLoader.start_classification):
Set the field name on the layer, not the classification.
* Thuban/Model/messages.py: Add CLASS_CHANGED for when a
classification is modified.
* Thuban/Model/save.py (SessionSaver.write_classification):
Get the field name and type from the layer.
* Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
parameter records to rows and add docstring. Fixes RTbug #1997.
* Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
ramp when we need to fix certain values of a ramp rather than
using the old fixes parameter. Fixes RTbug #2024.
* Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
parameter.
(ClassTable.Reset): Add fieldType parameter and use it, rather
than asking the classification.
(Classifier.__init__): Remember the original class's field
and ask the layer for the field type, rather than the classification.
(Classifier.__SetGridTable): Retrieve the field and field type
for the table because they are not in the classification.
(Classifier._OnTry, Classifier._OnRevert): Set the classification
field on the layer in addition to the classification itself.
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
classification field from layer.
* Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
classification field from layer. Split up tests and remove
*-imports. Fixes RTbug #1992.
* test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
* test/test_classification.py
(TestClassification.test_classification): Remove tests for methods
that no longer exist.
* test/test_layer.py (SetShapeStoreTests.setUp): Classification
__init__ no longer has a field parameter, use SetClassificationField.
(SetShapeStoreTests.test_sanity): Use layer object to get class
field info.
* test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
SetClassificationField on layer to set class field info.
* test/test_viewport.py: Renamed from test/test_view.py.
2003-07-16 Jan-Oliver Wagner <jan@intevation.de>
* Doc/manual/thuban-manual.xml: Added authors and an initial
coarse structure.
2003-07-15 Bernhard Herzog <bh@intevation.de>
* test/support.py (FloatComparisonMixin): This is a mix-in class
and therefore should not be derived from any other class.
* test/test_range.py (RangeTest): FloatComparisonMixin is a
mix-in, so derive from TestCase as well.
2003-07-15 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
draw_func handling a bit to remove one layer of indirection. This
makes the renderer about 10% faster in the non-classifying case
and the code a bit cleaner
(MapRenderer.draw_point_shape): Add the pen and brush parameters
and set them in the dc. Now the draw_point_shape method and
wxproj's draw_polygon_shape function have basically the same
signature so that both can be directly used as draw_func
2003-07-15 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/save.py (SessionSaver.write_classification): Encode
string values (in addition to the labels) as UTF 8
* Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
values if the field type is string
* test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
saving a session with non-ascii string classification values.
* test/test_load.py (TestClassification.file_contents)
(TestClassification.test): Check for non-ascii values in string
classifications
2003-07-14 Jonathan Coles <jonathan@intevation.de>
* test/test_view.py: New. Tests for ViewPort.
2003-07-14 Frank Koormann <frank@intevation.de>
* Thuban/Model/load.py (SessionLoader.start_map): Encode map
title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
* test/test_load_0_8.py (TestUnicodeStrings): New, test load of
unicode strings from session file: session title, map title and
projection name.
2003-07-10 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/viewport.py (Tool.MouseUp): Should have called
drag_stop, not drag_move when the mouse is released.
2003-07-10 Jonathan Coles <jonathan@intevation.de>
The most important part of this is the seperation of view.py into
two pieces. viewport.py now has a class called ViewPort which
contains all the non-wx parts of view.py and can therefore be
tested. view.py contains only the wx-specific parts and is fairly
simple.
* Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
RTTbug #1992.
* Thuban/UI/viewport.py: New. Contains non-wx view functionality.
RTTbug #1992.
* Thuban/Model/classgen.py (generate_singletons,
generate_uniform_distribution, generate_quantiles):
Added 'fixes' parameter so that property attributes can
be held constant over the generated classification groups.
(CustomRamp.GetProperties): Remove unused variables.
* Thuban/Model/map.py (Map.SetProjection): Send the old
projection as an argument to listeners of the MAP_PROJECTION_CHANGED
event.
* Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
parameter which is a list of records that restricts which
records are saved. Fixes RTbug #1997.
* Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
Port exception dialog from GREAT-ER. Fixes RTbug #1993.
* Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
to allow the user to fix line color/width on generated groups.
(ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
functions to optionally fix group properties.
* Thuban/UI/main.py (main): Set exception hook to the
ShowExceptionDialog. Fixes RTbug #1993.
* Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
the table window when it is selectd to be shown.
* Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
Export Selection button and move the export buttons underneath
the table.
(QueryTableFrame.UpdateStatusText): Added event argument so
that it can respond to grid selection events. The status text
is now updated even when the table is not associated with a
layer as was previously assumed.
(QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
UpdateStatusText responds to these events.
(QueryTableFrame.OnSaveAs): Renamed to doExport.
(QueryTableFrame.doExport): Helper function that saves the
entire table, or selected rows, to a file.
(QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
Respond to export button events and call doExport.
* extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
the function doesn't return NULL without first setting a Python
Error.
* test/runtests.py (main): Only print "Unknown option" for
unsupported options.
* test/support.py (FloatComparisonMixin.assertFloatEqual): Take
optional epsilon argument to specify floating point accuracy.
(FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
for each item test.
* test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
tests for saving selected records.
* test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
tests for saving selected records.
* test/test_map.py (TestMapWithContents.test_set_projection):
MAP_PROJECTION_CHANGED events send the old projection.
* test/test_session.py
(TestSessionWithContent.test_forward_map_projection):
MAP_PROJECTION_CHANGED events send the old projection.
* test/test_table.py (TableTest): Update tests to use non-deprecated
functions.
2003-07-08 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/transientdb.py (TransientTableBase.Width): The type
constants in the column objects are the standard ones defined in
the table module.
* test/test_transientdb.py
(TestTransientTable.test_transienttable_to_dbf): New. Test whether
exporting transient tables as DBF works. This should catch the bug
just fixed in TransientTableBase.Width.
2003-07-08 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
interpolated colors correctly.
* test/test_classgen.py (TestCustomRamp.test_color_interpolation):
New. Test case for the fix in classgen.py
2003-07-08 Bernhard Herzog <bh@intevation.de>
* test/runtests.py (main): Make the default output less verbose
and add a verbosity option (-v) to get the old output
2003-07-08 Bernhard Herzog <bh@intevation.de>
* Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
0.9.
* Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
New. Return the join type
* Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
DTD
(SessionSaver.write_data_containers): Save the join type for
joined tables
* Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
namespace
(SessionLoader.start_jointable): Handle the jointype attribute
* test/test_load_0_8.py: New. Effectively a copy of test_load.py
as of Thuban 0.8. These are now tests to determine whether Thuban
can still read files generated by Thuban 0.8
* test/test_load.py (LoadSessionTest.dtd)
(TestSingleLayer.file_contents)
(TestLayerVisibility.file_contents, TestLabels.file_contents)
(TestLayerProjection.file_contents)
(TestRasterLayer.file_contents, TestJoinedTable.file_contents)
(TestJoinedTable.file_contents)
(TestLoadError.file_contents): Update for new DTD
(TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
for new join type attribute
* test/test_save.py (SaveSessionTest.dtd)
(SaveSessionTest.testEmptySession)
(SaveSessionTest.testSingleLayer)
(SaveSessionTest.testLayerProjection)
(SaveSessionTest.testRasterLayer)
(SaveSessionTest.testClassifiedLayer)
(SaveSessionTest.test_dbf_table)
(SaveSessionTest.test_joined_table): Update for new DTD
(SaveSessionTest.test_joined_table): Add test for new join type
attribute
2003-07-04 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/table.py (_find_dbf_column_names): New. Helper
function for table_to_dbf
(table_to_dbf): Deal with names longer than the 10 character limit
* test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
doc-string
(TestTableToDBF.test_table_to_dbf_long_col_names): New test for
long column names
2003-07-03 Bernhard Herzog <bh@intevation.de>
* Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
2003-07-03 Bernhard Herzog <bh@intevation.de>
* Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
for the Thuban manual and README with some basic information about
the manual
2003-07-03 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
Update doc-string
(TransientJoinedTable.create): Do not modify the column objects of
the input tables in place and copy all columns of the input tables
into the joined table after all.
* test/test_transientdb.py
(TestTransientTable.test_transient_joined_table_same_column_name):
Update to reflect the new behavior
(TestTransientTable.test_transient_joined_table_with_equal_column_names):
Update to reflect the new behavior
(TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
New test case for a bug which modified the column objects in place
2003-07-02 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classgen.py (generate_singletons,
generate_uniform_distribution, generate_quantiles,
GenQuantiles0): Make sure maxValue isn't less than
one, otherwise we could divide by zero.
* test/test_classgen.py (ClassGenTest.doClassRangeTest,
ClassGenTest.doClassSingleTest): Call doBoundsTest to
check the end classification groups against the
proper property values.
(ClassGenTest.doBoundsTest): New. Checks the first and
last classification groups to make sure their properties
are the correct upper and lower bounds for a color ramp.
2003-07-02 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classgen.py (generate_singletons,
generate_uniform_distribution, generate_quantiles,
GenQuantiles0): The denominator was one to high when
calculating the index for the ramp causing the index
to never to reach one.
2003-07-02 Jonathan Coles <jonathan@intevation.de>
Changed the singature of ClassGroupRange.__init__ and
ClassGroupRange.SetRange() so that the min/max values are
passed as a tuple. This makes a better calling scheme for
when a Range object is passed instead.
* Thuban/Model/classgen.py: Fixed parameters to
ClassGroupRange constructor.
* Thuban/Model/classification.py (ClassGroupRange.__init__):
Consolidate the min/max parameters into a single _range which
can either be a tuple or a Range object.
(ClassGroupRange.SetRange): Consolidate the min/max parameters
into a single _range which can either be a tuple or a Range object.
* Thuban/Model/load.py (SessionLoader.start_clrange): Fix
call to ClassGroupRange constructor to use a tuple.
* Thuban/Model/layer.py (Layer.SetClassification): Switch
the classification instance variable to the new class
before calling _set_layer otherwise subscribers to a
LAYER_CHANGED event will not see any difference.
* test/test_classification.py: Fix tests of ClassGroupRange
so that they use the new signature.
* test/test_load.py: Fix use of ClassGroupRange so that it
uses the new signature.
* test/test_load_0_2.py: Fix use of ClassGroupRange so that it
uses the new signature.
* test/test_save.py: Fix use of ClassGroupRange so that it
uses the new signature.
2003-07-01 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
Import used objects/class from color.
(generate_singletons): We don't
need the numGroups parameter anymore because we are using
the new ramps with GetProperties().
(generate_uniform_distribution): Use new ramp method
GetProperties().
(generate_quantiles, GenQuantiles0): Use new ramp method
GetProperties().
(CustomRamp.SetNumGroups): Removed. The ramps now map
a value from 0 to 1 to class properties so the number
of groups is not needed ahead of time.
(CustomRamp.next): Removed. CustomRamp does not support
interation anymore.
(CustomRamp.GetProperties): Returns a ClassGroupProperties
object based on the index value from 0 to 1 that is
passed to it.
(GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
Made into instances of Monochromatic class instread of
deriving from it.
(HotToCold.SetNumGroups): Removed. See CustomRamp.
(HotToCold.next): Removed. See CustomRamp.
* Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
(Classification.SetField, Classification.SetFieldType):
Replaced with SetFieldInfo.
(Classification.SetFieldInfo): New. Does a better job of
what SetField and SetFieldType used to do by combining
their function since they should really always be done
at the same time.
(Classification.SetLayer): Renamed to _set_layer.
(Classification._set_layer): Should only be called from
Layer's SetClassification. This does not cause a recursive
call as SetLayer did because we know that Layer knows about
the classification.
* Thuban/Model/color.py: Fixes RTbug #1971.
(_Transparent): Renamed from Transparent so it doesn't
conflict with the module variable.
(Transparent, Black): Renamed from Color.Transparent,
Color.Black so they are not class variables.
* Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
(Layer.Destroy): We don't need to call SetClassification
anymore to clear out the back reference in the classifcation
to the layer. It's better to set it to None using _set_layer,
and we won't be creating another clas object too.
(Layer.SetClassification): Classification._set_layer is not
recursive so remove all the locking variables. Also clean
up the code so that it remains unchanged if something fails.
* Thuban/Model/load.py: Fixes RTbug #1971.
(SessionLoader.start_classification): Call
Classification.SetFieldInfo().
* Thuban/Model/save.py: Removed import of Color which wasn't
being used.
* Thuban/UI/classgen.py: Fixes RTbug #1972.
(ClassGenDialog.__init__): Color ramps are now instances
already so we don't need to create any new objects.
(ClassGenDialog.OnOK): Check for numGroups is no longer
necessary because we never use it.
* Thuban/UI/classifier.py: Fixes RTbug #1971.
(Classifier.__BuildClassification, Classifier.__SetGridTable):
Call Classification.SetFieldInfo() instead of SetFieldType.
* Thuban/UI/renderer.py: Fixes RTbug #1971.
* Thuban/UI/view.py: Fixes RTbug #1974, 1971.
(MapCanvas.__init__): Subscribe to the idle time event. Set
background color to white.
(MapCanvas.OnPaint): Set a flag indicating that we should
render the map during idle time. If we already have a bitmap
just draw it now.
(MapCanvas.OnIdle): New. Render the map only during idle time.
This also fixes a problem with the busy cursor under gtk.
* test/test_classgen.py (ClassGenTest.test_generate_singletons):
Fix calls to generate_singletons because the signature changed.
* test/test_classification.py: Fix color references and
change calls to Classification.[SetField|SetFieldType] to
SetFieldInfo.
* test/test_load.py: Fix color references.
* test/test_load_0_2.py: Fix color references.
* test/test_save.py (SaveSessionTest.testClassifiedLayer):
Change calls to Classification.[SetField|SetFieldType] to
SetFieldInfo.
2003-07-01 Frank Koormann <frank.koormann@intevation.de>
MERGE from the greater-ms3 branch.
* test/test_transientdb.py
(TestTransientTable.test_transient_joined_table_with_equal_column_names):
New. Test join of two tables with partly equal column names.
* Thuban/Model/transientdb.py (TransientJoinedTable.create):
If duplicates in left and right tables column names are found,
append '_' (underscores) to the name until it is unique.
Create always new internal names for the resulting table and reference
columns in the join statement with <table>.<column>
2003-07-01 Bernhard Herzog <bh@intevation.de>
* test/test_transientdb.py
(TestTransientTable.test_transient_joined_table_same_column_name):
New. Test whether joining on columns with the same names in both
tables works.
* Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
sure to use the right internal names even when joining on field
with the same names in both tables. Also, detect duplicate names
in the joined table correctly.
2003-07-01 Frank Koormann <frank@intevation.de>
* Thuban/UI/renderer.py (ExportRenderer.render_legend):
Reverse List of layers to render in same order as in desktop legend.
2003-06-30 Jonathan Coles <jonathan@intevation.de>
* Thuban/version.py (make_tuple): Takes a version string
and splits it into a tuple of at most three integers.
Used make_tuple() to make tuple versions of the version
numbers.
* Thuban/UI/about.py: Add Thuban email addresses.
2003-06-30 Jonathan Coles <jonathan@intevation.de>
* Thuban/version.py: SQLite/PySQLite version dependencies
were too high.
2003-06-30 Jonathan Coles <jonathan@intevation.de>
* Thuban/version.py: Update version to 0.8.1
* MANIFEST.in: Added Projections so that default.proj is
included.
2003-06-26 Jonathan Coles <jonathan@intevation.de>
New About box with lots more information including library
versions and credits. More/better version checking before
Thuban starts.
* Thuban/UI/about.py: New. New About box that displays
library version information and credits.
* Thuban/version.py: Added new 'versions' dictionary which
contains the verions of various libraries which are checked
when the module loads.
(verify_versions): Check all version numbers and returns
a list of errors.
* Thuban/UI/classifier.py (Classifier.__EnableButtons):
Reset the status of the buttons as the situation warrants,
but in a better more reliable way by not relying on the
current status to determine what needs to change.
* Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
(verify_versions): Remove most of the code since it is
now in Thuban.version.verify_versions.o
* Thuban/UI/mainwindow.py (MainWindow.About): Call new
About box in Thuban.UI.about.
* extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
Returns the version of gdal library being used as a string.
* extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
Removed.
(get_proj_version): Return the version of PROJ that the file
was compiled with.
(get_gtk_version): Return th version of GTK that the file
was compiled with.
2003-06-25 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
of the SelectPropertiesDialog should be self so the window
appears on top.
(ClassGroupPropertiesCtrl.DoEdit): The parent
of the SelectPropertiesDialog should be self so the window
appears on top.
* Thuban/UI/resource.py: Cleaned up how we determine file
extensions.
(GetImageResource): Return an wxImage from our Resources.
2003-06-24 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/renderer.py (ExportRenderer.render_legend):
Check that a layer has a classification before trying
to get it. Raster layers don't have classifications.
2003-06-23 Jonathan Coles <jonathan@intevation.de>
* setup.py: Add Resources/XML to resource list.
2003-06-23 Jonathan Coles <jonathan@intevation.de>
* setup.cfg: Fix copyright dates
2003-06-23 Jonathan Coles <jonathan@intevation.de>
* MANIFEST.in: Update with Resources/XML
* setup.py: Don't include Locale resources yet as we don't
have any and it causes problems building the distribution
for Windows. Update version to 0.8.0.
* Doc/thuban.dtd: Removed since it is now in Resources/XML.
* Thuban/UI/mainwindow.py: Add blank line at the end because
file was not being read correctly building the Windows
distribution.
2003-06-23 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
* Thuban/version.py: Temporarily update longversion for
the 0.8 release so that it doesn't have the cvs revision.
2003-06-23 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
to make sure that we don't create reentrant possibilities with
wxYield.
* Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
directly to avoid the wxSafeYield() call which generates an
OnPaint event causing infinite recursion. Don't try to catch
exception anymore. This was for before there were limits on map
scaling.
2003-06-23 Bernhard Herzog <bh@intevation.de>
Bug fix for RT #1961:
* Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
Register DerivedShapestores with the session
* Thuban/Model/session.py (Session.Tables): Make sure each table
is only listed once.
* test/test_load.py (TestJoinedTable.test): Add check_format call.
Update file contents to match the one written out.
2003-06-20 Bernhard Herzog <bh@intevation.de>
* test/xmlsupport.py (SaxEventLister.startElementNS)
(SaxEventLister.endElementNS): Do not include the qname. Python
2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
is (presumably incorrectly) None, whereas it's a string with the
element name in the later versions.
* test/test_xmlsupport.py (TestEventList.test_even_list_simple)
(TestEventList.test_even_list_namespace): Update tests to reflect
the new behaviour
(TestEventList.test_even_list_id_normalization): Fix doc-string
2003-06-20 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
by deriving classes to determine if that layer supports shapes.
(Layer): Override HasShapes and return true.
* Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
instead of a direct call to wx[Begin|End]CusyCursor().
(GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
table data.
* Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
New. Wrappers around the wxWindows functions that allow us to
make additional calls such as wxYield which gives the native
system a chance to update the cursor correctly.
* Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
instead of a direct call to wx[Begin|End]CusyCursor().
* Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
instead of a direct call to wx[Begin|End]CusyCursor().
(MapCanvas.find_shape_at): Check if the current search layer
support shapes, otherwise go on to the next layer.
* test/test_layer.py: Add tests in each type of layer for
HasClassification() and HasShapes()
2003-06-20 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
turning on the busy cursor to allow the system to change the
cursor before we begin painting. This fixes a problem that
was occuring only under GTK. Fixes RTbug #1840.
2003-06-20 Bernhard Herzog <bh@intevation.de>
* Resources/XML/thuban-0.8.dtd: New DTD for the new file format
version.
* Thuban/Model/save.py (sort_data_stores): New. Make topological
sort of the data sources so they can be written with sources that
data sources that depend on other data sources come after the
sources they depend on.
(SessionSaver.__init__): Add idmap instance variable to map from
objects to the ids used in the file.
(SessionSaver.get_id, SessionSaver.define_id)
(SessionSaver.has_id): New. Methods to manage the idmap
(SessionSaver.write): Use thuban-0.8.dtd
(SessionSaver.write_session): Add a namespace on the session and
write out the data sources before the maps.
(SessionSaver.write_data_containers): New. Write the data
containers.
(SessionSaver.write_layer): Layer elements now refer to a
shapestore and don't contain filenames anymore.
* Thuban/Model/load.py (LoadError): Exception class to raise when
errors in the files are discovered
(SessionLoader.__init__): Define dispatchers for elements with a
thuban-0.8 namespace too.
(SessionLoader.check_attrs): New helper method to check and
convert attributes
(AttrDesc): New. Helper class for SessionLoader.check_attrs
(SessionLoader.start_fileshapesource)
(SessionLoader.start_derivedshapesource)
(SessionLoader.start_filetable, SessionLoader.start_jointable):
Handlers for the new elements in the new fileformat
(SessionLoader.start_layer): Handle the shapestore attribute in
addition to filename.
(SessionLoader.start_table, SessionLoader.end_table): Removed.
They were never used in the old formats and aren't needed for the
new.
* Thuban/Model/session.py (Session.DataContainers): New method to
return all "data containers", i.e. shapestores and tables
* test/xmlsupport.py (SaxEventLister.__init__)
(SaxEventLister.startElementNS, sax_eventlist): Add support to
normalize IDs.
* test/test_xmlsupport.py
(TestEventList.test_even_list_id_normalization): New test case for
id normalization
* test/test_load.py (LoadSessionTest.check_format): Use ID
normalization
(LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
class atrributes used for ID normalization
(TestSingleLayer, TestLayerVisibility, TestLabels.test)
(TestLayerProjection.test, TestRasterLayer.test): Adapt to new
file format
(TestJoinedTable): New test for loading sessions with joined
tables.
(TestLoadError): New. Test whether missing required attributes
cause a LoadError.
* test/test_save.py (SaveSessionTest.thubanids)
(SaveSessionTest.thubanidrefs): New class attributes for ID
normalization in .thuban files.
(SaveSessionTest.compare_xml): Use id-normalization.
(SaveSessionTest.testEmptySession)
(SaveSessionTest.testLayerProjection)
(SaveSessionTest.testRasterLayer)
(SaveSessionTest.testClassifiedLayer): Adapt to new file format.
(SaveSessionTest.testLayerProjection): The filename used was the
same as for testSingleLayer. Use a different one.
(SaveSessionTest.test_dbf_table)
(SaveSessionTest.test_joined_table): New test cases for saving the
new data sources structures.
(TestStoreSort, MockDataStore): Classes to test the sorting of the
data stores for writing.
* test/runtests.py: Add CVS keywords
2003-06-20 Jonathan Coles <jonathan@intevation.de>
* test/test_session.py
(UnreferencedTablesTests.test_unreferenced_tables_with_joins):
Use the cultural_landmark-point.dbf file for the store so that
the table rows and shape count match.
2003-06-20 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
an exception if the number of shapes is different from the
number of rows in the table. Address RTbug #1933.
* test/test_layer.py (TestLayer.test_derived_store): Add
a test for the new exception in DerivedShapeStore.__init__.
* test/support.py (FloatTestCase): Removed since there is
already FloatComparisonMixin. Fixes RTbug #1954.
(FloatComparisonMixin.assertFloatEqual): Include test for
infinity that was part of FloatTestCase.
* test/test_range.py (RangeTest): Inherit from
support.FloatComparisonMixin now that we don't have
support.FloatTestCase.
2003-06-20 Bernhard Herzog <bh@intevation.de>
* test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
the implementation in xmlsupport instead.
(SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
* test/test_proj.py: Import sax_eventlist from xmlsupport instead
of test_save
2003-06-20 Bernhard Herzog <bh@intevation.de>
* test/test_load.py (LoadSessionTest.check_format): New helper
method to make sure the test files we load might have been written
by the current thuban version.
(ClassificationTest.TestLayers, TestSingleLayer.test)
(TestLayerVisibility.test, TestClassification.test)
(TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
Add check_format() calls and fix the thuban data to match the data
that would be written by saving the session loaded from it.
* test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
the same class and function in test_save.
* test/test_xmlsupport.py (TestEventList): New. test cases for
sax_eventlist
2003-06-20 Bernhard Herzog <bh@intevation.de>
* Resources/XML/thuban.dtd: Add comment about which versions of
Thuban are covered by this DTD
(map): Fix content model for layers and raster layers. There can
be any number or layers and raster layers in any order.
2003-06-20 Jonathan Coles <jonathan@intevation.de>
This is mainly about fixing RTbug #1949.
* Thuban/Model/classification.py: Remove "from __future__"
import statement since python 2.2 is the earliest supported
version.
* Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
depending on the units this projection *forwards* into.
* Thuban/Model/save.py (SessionSaver.write_classification):
Remove unnecessary use of lambdas and nested functions.
* Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
adjustment here if the map projection uses degrees.
* Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
scale adjust code since it is now done before calling
this method. Don't do anything if the map projection
is None.
2003-06-19 Bernhard Herzog <bh@intevation.de>
Move version specific load tests to their own file.
* test/test_load.py: Expand the doc-string to explain a bit how to
handle file format changes.
(TestClassification.test): Update the docstring as this test is
not about Thuban 0.2 anymore.
* test/test_load_0_2.py: New file with the load tests for thuban
files created with Thuban 0.2 and earlier.
2003-06-19 Bernhard Herzog <bh@intevation.de>
Add XML validation to some of the tests. Validation will only be
done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
To make the DTD available to the test cases it's moved into
Resources/XML
* Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
for versions up to and including 0.2. Two slight changes: added an
encoding specification and fixed the comment which refered to
GRASS, not Thuban
* test/xmlsupport.py: New support module for tests involving XML.
Currently there's a mix-in class for XML validation.
* test/test_xmlsupport.py: New. Tests for the xmlsupport module
* test/test_save.py (SaveSessionTest): Derive from ValidationTest
so that we can validate the
(SaveSessionTest.testEmptySession)
(SaveSessionTest.testSingleLayer)
(SaveSessionTest.testSingleLayer)
(SaveSessionTest.testLayerProjection)
(SaveSessionTest.testRasterLayer)
(SaveSessionTest.testClassifiedLayer): Validate the generated XML
* test/runtests.py (main): Call print_additional_summary instead
of print_garbage_information
* test/support.py (resource_dir): New function to return the
"Resource" subdirectory
(print_additional_summary): New function to combine several
summary functions
(run_tests): Use print_additional_summary instead of calling
print_garbage_information directly
2003-06-19 Bernhard Herzog <bh@intevation.de>
* Doc/thuban.dtd (classification): Correct the content model of
the classification element.
(projection): Add the "name" attribute
2003-06-19 Frank Koormann <frank.koormann@intevation.de>
MERGE from the greater-ms3 branch.
* Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
scale if projection is latlong to get better estimate.
Fix problem of hidden properties dialog under windows after double
click on layer tree:
The tree control always gets an Expanded / Collapsed event after
the ItemActivated on double click, which raises the main window again.
We add a second ItemActivated event to the queue, which simply
raises the already displayed window.
* Thuban/UI/legend.py (LegendTree.__init__): Instance variable
raiseProperties initialized to prevent endless loops
(LegendTree._OnItemActivated): Depending on self.raiseProperties
simply raise the properties or open the dialog and issue a second
event.
2003-06-18 Jonathan Coles <jonathan@intevation.de>
* setup.py: Fix a few problems that occurred under Windows.
2003-06-18 Jonathan Coles <jonathan@intevation.de>
When Thuban loaded the map was redrawn twice because the
legend was being opened after the mainwindow was created
and not during its creation. This meant the map was drawn
initially and then had to be redrawn when the legend
caused the display to change. Now the legend is opened
in the mainwindow constructor which resolves this issue.
Also, although we were checking for the existence of
gdal and gdalwarp modules, the gdalwarp extension was
still being compiled (which may fail if the system doesn't
have gdal installed). the build_ext command to setup.py
now accepts the flags --with-gdal and --without-gdal.
If --without-gdal is specified setup.py will try to
use the gdal parameters specified by gdal-config. Under
windows, those parameters have to be set in setup.py
as with proj4 an wxWindows.
* setup.py: Use a list instead of seperate variables for
extension parameters so we can create a generic function
that runs an appropriate *-config script.
(run_cs_script): Renamed from run_wx_script and modified
to accept a second argument which is a list of lists to
be filled in by the values returned from running the command.
(thuban_build_ext): New. Extends the build_ext command and
provides the options --with-gdal/--without-gdal which then
optionally includes the gdalwarp extension.
* Thuban/Model/resource.py: First check if we can import
the gdalwarp Thuban extension before checking for gdal.
Also added some comments.
* Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
the map is None which may be the case if none has been loaded
yet.
* Thuban/UI/main.py (main): Remove call to ShowLegend.
* Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
* Thuban/UI/renderer.py: Check for gdal support before importing
gdalwarp.
(MapRenderer.render_map): Only try to optimize if we have gdal
support otherwise nothing will get drawn.
* Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
during startup before a map has been created. Check if map is None
before using it and do nothing if it is.
2003-06-17 Jonathan Coles <jonathan@intevation.de>
Fix the problem with raster layers under Windows that caused
Thuban to crash. The view should respond to layer projection
changed events to update the display. Changes to a projection
should not cause the map to be set to full extent.
* Thuban/UI/view.py (MapCanvas.__init__): New instance variable
current_map_proj to remember the current map projection so that
when the projection changes we know what the previous projection
was.
(MapCanvas.SetMap): Unsubscribe and subscribe to
LAYER_PROJECTION_CHANGED events.
(MapCanvas.projection_changed): Split into two methods that respond
to map and layer projection changes.
(MapCanvas.map_projection_changed): New. Takes the current view and
projects it using the new projection. This does not cause the
map to be redrawn at full extent.
(MapCanvas.layer_projection_changed): New. Cause a redraw which
will draw each layer in its new projection.
* extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
under Windows.
* extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
to twice sizeof(void*) because there are two digits for each
hex byte.
2003-06-16 Bernhard Herzog <bh@intevation.de>
Update to the layer interface: Direct access to the table,
shapetable, shapefile and filename attributes is now actively
deprecated by issuing deprecation warnings for all places where
this happens.
* Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
to the instance variables table, shapetable, shapefile and
filename via __getattr__ so that we can issue a deprecation
warning.
(Layer.SetShapeStore): Don't set the deprecated instance variables
any more
(Layer.SetShapeStore): Don't use deprecated layer instance
variables
(Layer.Destroy): No need to explicitly remove the instance
variables any more
(Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
instance variables
* Thuban/UI/classgen.py (ClassGenDialog.__init__)
(GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
(GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
use deprecated layer instance variables
* Thuban/UI/classifier.py (Classifier.__init__): Don't use
deprecated layer instance variables
* Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
(IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
instance variables
* Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
deprecated layer instance variables
* Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
deprecated layer instance variables
* Thuban/Model/save.py (SessionSaver.write_layer): Don't use
deprecated layer instance variables
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
(MapRenderer.polygon_render_param): Don't use deprecated layer instance
variables
* test/runtests.py (main): Turn Thuban's deprecation warnings into
errors so that they're cought by the tests
* test/test_load.py (TestSingleLayer.test): Don't use deprecated
layer instance variables
2003-06-16 Jonathan Coles <jonathan@intevation.de>
Fix a problem under Windows whereby if the user double-clicks on a
layer in the legend that tree item will expand or collapse as well
as open the layer properties dialog. The state of the tree item
should not be affected.
* Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
preventExpandCollapse and subscribe to expanding and collapsing
events.
(LegendTree.OnItemExpandCollapse): New. Responds to expanding and
collapsing events and will veto the event if it has been triggered
by the user double clicking on a layer.
(LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
that an expanding/collapsing event should be vetoed.
2003-06-13 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/classifier.py (Classifier.OnClose)
(Classifier.map_layers_removed)
(Classifier.layer_shapestore_replaced): Unsubscribe the messages
in OnClose and not in map_layers_removed or
layer_shapestore_replaced to make sure it always happens when the
dialog is closed
2003-06-13 Jonathan Coles <jonathan@intevation.de>
This puts back a fix for Windows where a panel is needed so that
the background of the table view appears correctly.
* Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
object that can be used by derived classes to place any
controls (including the grid) onto.
(QueryTableFrame.__init__): Use the panel as the parent window
for all the controls. Reparent the grid so that the panel is
the parent. Call UpdateStatusText() to correctly initialize
the status bar.
2003-06-13 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
from wxFrame (as opposed to wxDialog like the other classes)
but otherwise behaves like the other classes. This is needed
for the TableView which isn't really a dialog and needs to
have a status bar and control buttons.
* Thuban/UI/tableview.py (TableGrid.__init__): Create an
instance variable to keep track of how many rows are selected.
Subscribe once to the the events we are interested in.
(ThubanGrid.OnRangeSelect): Only handle event if event handling
hasn't been turned off.
(ThubanGrid.OnSelectCell): Only handle event if event handling
hasn't been turned off.
(ThubanGrid.ToggleEventListeners): Rather than subscribe None
as an event listener (which changes the event handler stack)
simply set an instance variable to False. This is checked in
the event handlers.
(ThubanGrid.GetNumberSelected): Return the number of currently
selected rows.
(TableFrame): Inherit from ThubanFrame so we can have a
status bar and control buttons.
(QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
Explicitly set which items are selected in the operator choice and
action choice so there is always a valid selection. Fixes RTbug #1941.
Subscribe to grid cell selection events so we can update the
status bar.
(QueryTableFrame.UpdateStatusText): Update the status bar with
how many rows are in the grid, how many columns, and how many
rows are selected.
(QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
Call UpdateStatusText when cells are (de)selected.
(QueryTableFrame.OnQuery): Use the string value in the value
combo if either the selected item index is 0 or if the string
cannot be found in the predefined list (this happens if the
user changes the text). Fixes RTbug #1940.
Only turn off the grid event listeners if there a query comes
back with a none empty list of ids. in the case that the list
is empty this causes a grid.ClearSelection() call to actually
clear the grid selection which causes the selected items in
the map to be deselected. Fixes RTbug #1939.
* test/test_save.py (XMLWriterTest.Encode): Check return values.
Fixes RTbug #1851.
2003-06-13 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/identifyview.py (IdentifyView.__init__): Call
self.selected_shape with the current selection to make sure the
contents of the dialog are up to date when it's shown for the
first time.
The dialog used to work without this by luck. The recent fix to
the connector module 'broke' a 'feature' the identify view was
relying on, i.e that subscribing to a message in response to
receiving a message of that type would mean that the new
subscriber would also be called for the same message.
2003-06-12 Jonathan Coles <jonathan@intevation.de>
* extensions/thuban/gdalwarp.cpp: Removed debug printing as
the image is rendered. Fixes RTbug #1937.
2003-06-12 Jonathan Coles <jonathan@intevation.de>
* Thuban/Lib/fileutil.py: As is done under Windows, create the
user directory if it doesn't exist on a posix system.
Fixes RTbug #1815.
* Thuban/Model/resource.py (get_user_proj_files): Moved the
called to get_application_dir here, so that the directory
will only be called if this method is invoked.
* Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
the projfilepath if no projection is selected.
2003-06-12 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
the scalebar if the current map has no projection set.
* Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
projfilepath label to just the basename of the projection file
rather than include the entire path.
* Thuban/Model/resource.py: Fix missed proj functions that
needed to be renamed.
2003-06-12 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py: Removed assert statements that
tested if the variable was an instance of Color.
* Thuban/Model/color.py (Color): Remove commented code that isn't
used.
(Transparent): Renamed from NoColor. Doesn't inherit from Color.
Fixes RTbug #1835.
(Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
Needed now that the class doesn't inherit from Color.
2003-06-12 Jonathan Coles <jonathan@intevation.de>
* test/test_save.py (XMLWriterTest.testEncode): Explicitly
check unicode strings.
* test/test_layer.py: Check for existence of gdal.
2003-06-12 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/xmlreader.py: New. Contains the XMLReader class
that was in load.py
* Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
that was in save.py
2003-06-12 Jonathan Coles <jonathan@intevation.de>
This is largely a collection of bug fixes. We also handle the
case where gdal is not on the system. The XMLReader and XMLWriter
classes were moved into there own files to resolve some circular
import references and because they shouldn't really be in the
file that is dediciated to reading/writing session files since
they are also used elsewhere.
* Thuban/Model/classgen.py: Renamed functions to follow the
function_names_with_underscores style. Fixes RTbug #1903.
(calculate_quantiles): Raise ValueError if 'percents' is invalid.
* Thuban/Model/layer.py: Import gdal only if it available.
(RasterLayer): Handle the case where the gdal library is unavailable.
Addresses RTbug #1877.
* Thuban/Model/load.py (XMLReader): Moved into seperate file
xmlreader.py.
2003-06-12 Jonathan Coles <jonathan@intevation.de>
This is largely a collection of bug fixes. We also handle the
case where gdal is not on the system. The XMLReader and XMLWriter
classes were moved into there own files to resolve some circular
import references and because they shouldn't really be in the
file that is dediciated to reading/writing session files since
they are also used elsewhere.
* Thuban/Model/classgen.py: Renamed functions to follow the
function_names_with_underscores style. Fixes RTbug #1903.
(calculate_quantiles): Raise ValueError if 'percents' is invalid.
* Thuban/Model/layer.py: Import gdal only if it available.
(RasterLayer): Handle the case where the gdal library is unavailable.
Addresses RTbug #1877.
* Thuban/Model/load.py (XMLReader): Moved into seperate file
xmlreader.py.
* Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
file xmlwriter.py.
* Thuban/Model/resource.py: Renamed functions to following the
function_names_with_underscores style.
(has_gdal_support): New function that returns true if the gdal
library is available. Addresses RTbug #1877.
* Thuban/UI/application.py (ThubanApplication.OpenSession):
Display a message box if the gdal library is not available, but
only if there are any layers that would use it. Addresses RTbug #1877.
* Thuban/UI/classgen.py: Use renamed projection resource functions.
(GenUniformPanel.__CalcStepping): Fix a slight discrepency
when using integers versus floats.
* Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
determine if the "Add Image Layer" menu option should be
greyed out or not. Addresses RTbug #1877.
* Thuban/UI/projdialog.py: Use renamed projection resource functions.
* Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
optimize if a raster layer is visible. Fixes RTbug #1931.
Only draw the raster layer if the gdal library is available.
Addresses RTbug #1877.
* test/test_classgen.py: Add tests for generate_singletons,
generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
(test_calculate_quantiles): Fix some tests to catch the new
ValueError that is raised.
* test/test_proj.py: Use renamed projection resource functions.
* test/test_save.py (SaveSessionTest.testClassifiedLayer): New
test for saving classified layers. Fixes RTbug #1902.
(XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
2003-06-12 Jan-Oliver Wagner <jan@intevation.de>
Fix for http://intevation.de/rt/webrt?serial_num=1900.
* Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
* Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
multiplechoicedialog.py rather than from the wxPython library.
2003-06-11 Frank Koormann <frank.koormann@intevation.de>
* Thuban/Lib/fileutil.py (get_application_dir): Minor stability
update.
2003-06-11 Frank Koormann <frank.koormann@intevation.de>
* Thuban/Lib/fileutil.py (get_application_dir): New function to
determine the absolute .thuban/thuban directory under
"posix" (os.expanduser) and "nt" (read AppData registry key).
* Thuban/Model/resource.py: Use get_application_dir
* Thuban/UI/application.py (ThubanApplication.read_startup_files):
Use get_application_dir.
2003-06-10 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
the messages MAP_LAYERS_REMOVED messages
(LayerTableFrame.OnClose): Unsubscribe from it.
(LayerTableFrame.map_layers_removed): New. Receiver for
MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
dialog is showing is removed.
2003-06-10 Bernhard Herzog <bh@intevation.de>
* Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
of the receivers list so that unsubscribing in a receiver doesn't
modify it while iterating over it.
* test/test_connector.py
(ConnectorTest.test_disconnect_in_receiver): New. Test whether
unsubscribing in a receiver works correctly. See docstring for
details
2003-06-10 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
message.
* Thuban/Model/layer.py (Layer.SetShapeStore): Send
LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
LAYER_CHANGED will still be sent if the classification changes.
* Thuban/UI/classifier.py (Classifier.__init__): Add the map as
parameter so we can subscribe to some of its messages
(Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
and the layer's LAYER_SHAPESTORE_REPLACED
(Classifier.unsubscribe_messages): New. Unsubscribe from message
subscribed to in __init__
(Classifier.map_layers_removed)
(Classifier.layer_shapestore_replaced): receivers for the messages
subscribed to in __init__. Unsubscribe and close the dialog
* Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
the map to the Classifier dialog
* test/test_layer.py (SetShapeStoreTests): Derive from
SubscriberMixin as well so we can test messages
(SetShapeStoreTests.setUp): Subscribe to some of the layer's
messages
(SetShapeStoreTests.tearDown): Clear the messages again
(SetShapeStoreTests.test_sanity): Expand the doc-string and check
for the modified flag too
(SetShapeStoreTests.test_set_shape_store_modified_flag): New test
to check whether SetShapeStore sets the modified flag
(SetShapeStoreTests.test_set_shape_store_different_field_name)
(SetShapeStoreTests.test_set_shape_store_same_field)
(SetShapeStoreTests.test_set_shape_store_same_field_different_type):
Add tests for the messages. This checks both the new
LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
2003-06-06 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/mainwindow.py: Improved and partly added help texts for
the menu items.
2003-06-05 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/identifyview.py (IdentifyView.__init__):
Layout reimplemented without panel. Make life easier to fit the list
in the dialog.
2003-06-05 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
once on initialisation (Former implementation resulted in multiple
entries for each projection).
(ProjFrame.__FillAvailList): selectProj as second optional parameter,
if set, select the projection found under the specified name. This
overwrites any other selection estimate.
Removed projchoice filling from this method.
(ProjFrame._OnSave, ProjFrame._OnAddToList):
Updated call of ProjFrame.__FillAvailList
(LCCPanel._DoLayout): Moved parameter controls in more common order.
* Resources/Projections/defaults.proj: Extended defaults representing
various common European projections.
2003-06-05 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/identifyview.py (IdentifyView.__init__):
Use ListCtrl instead of GridCtrl
* Thuban/Model/resource.py:
Guess location of .thuban directory from tempdir parent directory.
* Thuban/UI/application.py (ThubanApplication.read_startup_files):
Guess location of .thuban directory from tempdir parent directory.
2003-06-04 Bernhard Herzog <bh@intevation.de>
Do not cache the values returned by the tree widget's
GetFirstChild and GetNextChild methods because it led to lots of
segfaults. The new way requires more brute force but is more
reliable.
* Thuban/UI/legend.py (LegendTree.__init__): Remove instance
variable layer2id
(LegendTree.find_layer): New method to do with brute force what
layer2id tried to accomplish
(LegendTree._OnMsgLayerChanged)
(LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
Use find_layer instead of layer2id
(LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
update layer2id anymore
(LegendTree._OnMsgMapLayersRemoved)
(LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
2003-06-03 Thomas Koester <tkoester@intevation.de>
* Thuban/Model/classgen.py (GenQuantiles0): New function.
2003-06-02 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
New commands.
(main_menu): Add the new commands.
(MainWindow.TableRename): New. Implementation of the table_rename
command.
(MainWindow.RenameLayer): New. Implementation of the layer_rename
command.
* Thuban/Model/session.py (Session.AddTable): call self.changed to
set the modified flag
* test/test_session.py (TestSessionSimple.test_add_table): Test
whether the modified flag is set properly
* Thuban/Model/base.py (TitledObject.SetTitle): Call changed
instead of issue so that the modified flags get updated.
* test/test_base.py (SomeTitledObject): Derive from Modifiable
instead of Publisher to reflect reality better and to accomodate
the fact that SetTitle now calls changed instead of issue
2003-06-02 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
acquisition has to happen before the try in a try-finally.
2003-06-02 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
possible that a layer is removed that is not currently selected in
the legend so don't check for this.
2003-05-30 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.Destroy): Set all instance
variables to None that have direct or indirect references to
shapefiles or dbf files to make sure that they do go away and the
files are closed.
2003-05-30 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
availImgListIndices when a new image list is created
2003-05-30 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/legend.py (LegendTree.__init__): New instance variable
changing_selection to indicate whether the LegendTree code itself
is currently changing the selection
(LegendTree.normalize_selection): New method to normalize the
selection by selecting the layer item even if the user clicked on
the classification.
(LegendTree._OnSelChanged): normalize the selection. This works
around a bug in wx which doesn't keep track of the selection
properly when subtrees are deleted.
2003-05-30 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
maximum and minimum scale factors.
* test/test_classgen.py (ClassGenTest.test): Update to reflect the
changes in classgen.py
2003-05-30 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classgen.py: Remove ClassGenerator class but make
all the methods functions. Fixes RTBug #1903.
* Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
RTBug #1907.
* Thuban/UI/classgen.py: Use classgen functions that were part
of the ClassGenerator class. Put try/finally blocks around
code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
RTBug #1904.
* Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
* Thuban/UI/legend.py: The legend was cleared and repopulated any
time something changed which caused some state to be lost such
as which children were expanded or collapsed. Fixes RTBug #1901.
(LegendTree._OnMsgMapLayersAdded): Add only new layers.
(LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
the legend but not in the map.
(LegendTree.__FillTree): Move main functionality out into smaller
methods that can be used by other methods.
(LegendTree.__FillTreeLayer): Reuse old slots in the image list
if they are available.
(LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
that we override the wxTreeCtrl method. Iterate over children
and call __RemoveLayer.
(LegendTree.__AddLayer): New. Add a new layer to the legend.
(LegendTree.__RemoveLayer): Remove a layer from the legend.
(LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
Should only be called with the id of a layer branch.
(LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
Returns the root item or creates one if necessary.
* Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
ProjectRasterFile with tuple arguments instead of strings.
* Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
with try/finally. Fixes RTBug #1904.
* Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
with try/finally. Fixes RTBug #1904.
(MapCanvas.FitSelectedToWindow): If a single point is selected
simply center it on the display. Fixes RTBug #1849.
* extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
to be compiled as a standalone app. Now the code can only be
called from Python which simplifies the parameter passing.
(ProjectRasterFile): Handle Python arguments. Remove code that
checks for a destination dataset. Add more clean up code.
* test/test_map.py (TestMapWithContents.test_raise_layer_top,
TestMapWithContents.test_lower_layer_bottom):
Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
Fixes RTBug #1907.
* Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
extent to the map when the legend is toggled. Fixes RTBug #1881.
2003-05-29 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
unsubscribes all that is subcribed in __init__.
2003-05-28 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
(MainWindow.CanDuplicateLayer): New methods to implement the
Layer/Duplicate command.
(layer_duplicate command): New.
(main_menu): Add layer_duplicate to the Layer menu.
2003-05-28 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
renderer so that NULL/None values get displayed differently (by a
gray rectangle).
(TableGrid.__init__): Override the default renderers
2003-05-28 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.SetShapeStore): Set the
classification to "None" if the type of the field has changed.
* test/test_layer.py (SetShapeStoreTests): New. Class with a few
test for the Layer.SetShapeStore method
2003-05-28 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
does not necessarily have a filename).
2003-05-28 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
sort the selection list for the dialog.
2003-05-28 Frank Koormann <frank.koormann@intevation.de>
* extensions/thuban/wxproj.cpp
(project_point): Removed cast to int for projected point coordinates.
(shape_centroid): Return last point if all polygon vertices fall
to one point.
2003-05-28 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
with layers that don't have shapestores, i.e. raster layers.
2003-05-28 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/table.py (DBFTable.__init__): Omit the extension
when determining the title from the filename.
* test/test_dbf_table.py (TestDBFTable.test_title): Update to
reflect changes in the way the title is derived from the filename
2003-05-28 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.TableShow):
Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
2003-05-27 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
delegate SelectedLayer.
(MainWindow.LayerUnjoinTable): Implement.
(_can_unjoin): New. Helper function for the sensitivity of the
layer/unjoin command.
* Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
(DerivedShapeStore.OrigShapeStore): New. Return the original
shapestore. Used to figure out how to unjoin.
(DerivedShapeStore.Shapefile): Fix a typo.
2003-05-27 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
well
(JoinDialog.__init__): Use the layer parameter and only build the
left choice when a layer is given
(JoinDialog.OnJoin): Handle layer joins as well
(JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
that the user selects the "Select..." item. The sensitivitly
updating is now in update_sensitivity
(JoinDialog.y): New method to refactor the sensitivity update of
the join button into its own method.
* Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
2003-05-27 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (table_close command): Make it sensitive
iff there are unreferenced tables in the session
2003-05-27 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/messages.py (TABLE_REMOVED): New message.
* Thuban/Model/session.py (Session.UnreferencedTables): New method
to return tables that are not referenced by other tables or shape
stores and can be removed.
(Session.RemoveTable): Issue a TABLE_REMOVED message after
removing the table
* Thuban/UI/mainwindow.py: Remove unused imports
(MainWindow.TableClose): Implement.
* Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
messages so that the frame will be automatically closed when a new
session is opened or the table is removed.
(TableFrame.OnClose): Unsubscribe the Subscriptions made in
__init__
(TableFrame.close_on_session_replaced)
(TableFrame.close_on_table_removed): New. Subscribers that close
the window
* test/test_session.py (TestSessionMessages.test_remove_table)
(TestSessionSimple.test_remove_table): Move the test to
TestSessionSimple and add test for the TABLE_REMOVED message
(TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
(TestSessionSimple.test_unreferenced_tables) New. Test for the
UnreferencedTables method.
(UnreferencedTablesTests): New. Class with some more sophisticated
tests for UnreferencedTables.
2003-05-27 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
display has some unwanted side effects. Removed again.
2003-05-27 Frank Koormann <frank.koormann@intevation.de>
* Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
* Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
2003-05-27 Jan-Oliver Wagner <jan@intevation.de>
* test/test_menu.py (MenuTest.test): Added test for
Menu.RemoveItem().
* Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
the menu.
2003-05-27 Frank Koormann <frank.koormann@intevation.de>
Nonmodal dialogs without parent (i.e. they can fall behind the main
window)
* Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
all dialogs in the dialogs dictionary and the canvas.
* Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
parent, i.e. can fall behind other windows.
(NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
dictionary before removing it.
* Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
* Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
* Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
* Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
2003-05-27 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
tableview dialog
(MainWindow.TableShow): Use ShowTableView to open the dialogs.
Also, don't use the table's titles as the dialog names. The titles
aren't guaranteed to be unique.
(MainWindow.TableOpen): Open a table view dialog after opening the
table
2003-05-27 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
effect can be achieved by simply closing the window showing the
table.
(MainWindow.TableHide): Removed.
(main_menu): Removed "table_hide"
2003-05-27 Frank Koormann <frank.koormann@intevation.de>
Fix legend tree display problems under Win32
* Thuban/UI/legend.py: BMP_SIZE_W = 15
(LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
(LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
* Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
2003-05-27 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
'after' now allows to insert separators almost anywhere in the menu.
2003-05-27 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
"S" of selection box label to hint on hot key (Alt-S). Works under
Win32 but is ignored under GTK.
2003-05-26 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
Center Choices.
2003-05-26 Bernhard Herzog <bh@intevation.de>
Remove the Precision methods again. They're too DBF specific to be
part of the table interface and they're only used in table_to_dbf
anyway.
* Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
fixed precision of 12 for doubles.
(TransientTableBase.Precision): Removed
(AutoTransientTable.Width): Delegate to self.table.
* Thuban/Model/table.py (DBFTable.Precision)
(MemoryTable.Precision): Removed.
(MemoryTable.Width): Use a fixed precision of 12 for doubles.
(table_to_dbf): Use a fixed precision of 12 for floats unless the
column object specifies something else.
* test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
test for table_to_dbf
2003-05-26 Bernhard Herzog <bh@intevation.de>
* test/test_transientdb.py
(TestTransientTable.run_iceland_political_tests): Fix a comment.
2003-05-26 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
implementation. Mark parts of the file format strings for
localization.
* Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
file and add the table to the tables managed by the session
* test/test_session.py (TestSessionSimple.test_open_table_file):
New. test case for OpenTableFile
2003-05-26 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
Replace the true/false of wxWindows by True/False of Python 2.2.1.
2003-05-26 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
already a selection present, update the grid accordingly.
* Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
resizeable and increase its initial size.
2003-05-26 Frank Koormann <frank.koormann@intevation.de>
Table export functionality
* Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
Return width (in characters) for a column.
(DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
(table_to_dbf): Write table to dbf file.
(table_to_csv): Write table to csv file.
* Thuban/Model/transientdb.py (TransientTableBase.Width,
TransientTableBase.Precision): Return column width and precision.
* Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
or table_to_csv depending on file selection.
* test/test_dbf_table.py:
Test table_to_dbf (extension of former part of test).
* test/test_csv_table.py:
Test table_to_csv.
2003-05-23 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
Use QueryTableFrame instead of TableFrame.
* Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
table window with 'Layer Table:' instead of 'Table:'.
2003-05-23 Jan-Oliver Wagner <jan@intevation.de>
Give all tables a title via mix-in TitledObject.LayerShowTable
* Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
only if it exists.
* Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
and call its init-method with a default title. Remove Title() method.
* Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
AutoTransientTable): mix-in TitledObject and call its init-method with
a default title. Remove Title() method.
2003-05-23 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/session.py (Session.AddShapeStore): Define
AddShapeStore analogously to AddTable.
* test/test_session.py (TestSessionSimple.test_add_shapestore):
New. Test for AddShapeStore
2003-05-23 Jan-Oliver Wagner <jan@intevation.de>
Introducing QueryTableFrame and a very coarse ShowTable implementation.
* Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
The latter implements the selection GUI without dependency on a layer.
LayerTableFrame now is derived from QueryTableFrame and connects
to a layer.
* Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
implementation that still needs work.
* Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
2003-05-22 Frank Koormann <frank.koormann@intevation.de>
* Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
Added "outer_join = False" as optional parameter.
(TransientJoinedTable.create): If outer join is true, perform a
"LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
the left table. Records not matching are filled with 0 / None.
* Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
(JoinDialog.OnJoin): Consider outer join check box.
2003-05-22 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
somewhat safer way. Storing the traceback in a local variable can
lead to memory leaks
2003-05-22 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
the wxMessageDialog's Destroy() method.
2003-05-22 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/join.py (JoinDialog.__init__): Make use of
TransientTable.Title()
2003-05-22 Frank Koormann <frank.koormann@intevation.de>
Join Dialog, initial version.
* Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
* Thuban/UI/join.py (JoinDialog): Functional implementation of
former framework. Renamed Table1/Table2 to LeftTable/RightTable
in all occurences.
* Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
Typo fixed.
2003-05-22 Bernhard Herzog <bh@intevation.de>
Give the tables titles so that the GUI can display more meaningful
names. For now the titles are fixed but depend on e.g. filenames
or the titles of the joined tables.
* Thuban/Model/transientdb.py (TransientTable.Title)
(TransientJoinedTable.Title, AutoTransientTable.Title): New.
* Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
* test/test_transientdb.py
(TestTransientTable.test_auto_transient_table_title): New. Test
for the Title method
(TestTransientTable.test_transient_joined_table)
(TestTransientTable.test_transient_table): Add test for the Title
methods
* test/test_memory_table.py (TestMemoryTable.test_title): New.
Test for the Title method
* test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
the Title method
2003-05-22 Bernhard Herzog <bh@intevation.de>
* test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
Provide a better way to destroy the layers
(TestLayer.test_base_layer, TestLayer.test_arc_layer)
(TestLayer.test_point_layer, TestLayer.test_empty_layer)
(TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
the new way to destroy the layers.
(TestLayer.test_derived_store): New. Test for using a layer with a
DerivedShapeStore
* Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
filename if the shape store actually has one.
2003-05-22 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
for the filename
* test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
for the FileName method
(TestDBFTableWriting.test_write): Fix spelling of filename
2003-05-22 Thomas Koester <tkoester@intevation.de>
* Thuban/Model/range.py, test/test_range.py: Brought over new Range
from SciParam that now really is immutable.
2003-05-22 Frank Koormann <frank.koormann@intevation.de>
Layer Top/Bottom placement added to legend.
* Thuban/UI/legend.py
(LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
bound to tool events.
(LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
New, methods binding the event methods with the map methods.
* Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
layer at top/bottom of layer stack.
* Resources/Bitmaps/top_layer.xpm: New button icon.
* Resources/Bitmaps/bottom_layer.xpm: New button icon.
2003-05-22 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/session.py (Session.RemoveTable): New method to
remove tables
* test/test_session.py (TestSessionSimple.test_remove_table): New.
Test for RemoveTable
2003-05-22 Thomas Koester <tkoester@intevation.de>
* Thuban/Model/classgen.py: Added short module doc string and CVS id.
(ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
2003-05-22 Bernhard Herzog <bh@intevation.de>
Implement a way to discover dependencies between tables and
shapestores.
* Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
(TransientJoinedTable.Dependencies)
(AutoTransientTable.SimpleQuery): New. Implement the dependencies
interface
(TransientJoinedTable.__init__): Keep tack of the original table
objects in addition to the corresponding transient tables.
* Thuban/Model/table.py (DBFTable.Dependencies)
(MemoryTable.Dependencies): New. Implement the dependencies
interface
* Thuban/Model/data.py (ShapeTable): New. Helper class for
ShapefileStore
(ShapefileStore.__init__): Use ShapeTable instead of
AutoTransientTable
(ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
(ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
methods for filename and type
(ShapefileStore.Dependencies): New. Implement the dependencies
interface
(DerivedShapeStore): New class to replace SimpleStore. The main
difference to SimpleStore is that it depends not on a shapefile
but another shapestore which expresses the dependencies a bit
better
(SimpleStore.__init__): Add deprecation warning.
* test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
Test for the Dependencies method.
* test/test_memory_table.py (TestMemoryTable.test_dependencies):
New. Test for the Dependencies method.
* test/test_transientdb.py
(TestTransientTable.test_auto_transient_table_dependencies): New.
Test for the Dependencies method.
(TestTransientTable.test_transient_joined_table): Add test for the
Dependencies method.
* test/test_session.py (TestSessionSimple.setUp)
(TestSessionSimple.tearDown): New. Implement a better way to
destroy the sessions.
(TestSessionSimple.test_initial_state)
(TestSessionSimple.test_add_table): Bind session to self.session
so that it's destroyed by tearDown
(TestSessionSimple.test_open_shapefile): New. Test for
OpenShapefile and the object it returns
2003-05-22 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/session.py (Session.AddTable): New method to
register tables with the session.
(Session.Tables): Return the tables registered with AddTable too.
* test/test_session.py (TestSessionSimple.test_add_table): New.
Test case for the AddTable method
2003-05-22 Frank Koormann <frank.koormann@intevation.de>
UI polishing updates: Place main buttons (OK, Cancel, etc) in the
lower right corner, center labels for selections, initialize controls
in reasonable order for keyboard navigation.
* Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
(ProjFrame.__DoOnProjAvail): Determine position of current projection
using the wxListBox.FindString() method. Still a problem (#1886)
* Thuban/UI/classifier.py
(Classifier.__init__, SelectPropertiesDialog.__init__)
* Thuban/UI/classgen.py (ClassGenDialog.__init__,
(ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
different classification types from here to __init__.
(GenUniquePanel.__init__): Set the column width of the first field
in the Field ListCtrl to the full width.
* Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
Button to 'Export'. Center Buttons in Selection Box, set Focus to
Grid.
(LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
changes focus to the Selection when pressing "Alt-S".
* Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
the text if not visible. The italic font sometimes exceeds the
rendering area.
2003-05-21 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
to OnClose so that Thuban closes correctly.
* Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
DockFrame.OnClose, not DockFrame._OnClose.
2003-05-21 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
references to 'inf' and use new Range __init__ to pass floats
directly rather than converting them to strings first.
Fixes RTBug #1876.
* Thuban/Model/classification.py (ClassGroupRange.SetRange):
Use new Range ___init__ to pass floats.
* Thuban/Model/layer.py (RasterLayer.__init__): Test if the
filename is a valid image file. Throw IOError otherwise.
* Thuban/Model/range.py: Brought over new Range from SciParam that
is immutable and has an __init__ which can accept floats.
* Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
into try block. AddLayer doesn't throw any exceptions anymore.
(MainWindow.AddRasterLayer): Move constructor of RasterLayer into
try block.
* Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
the first item in choices. Fixes RTBug #1882.
* Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
has gone to 0 which is a serious problem. abort.
(MapRenderer.draw_raster_layer): Catch IOError seperately and
print the error from GDAL.
* Thuban/UI/tableview.py (TableGrid.__init__): Call
ToggleEventListeners to turn on listening.
(TableGrid.ToggleEventListeners): New. Turns event listening on
and off so as to prevent excessive messages.
(LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
to suppress excessive messages when selecting many rows.
Fixes RTBug #1880.
* Thuban/UI/view.py: Added checks against if scale == 0. This
is a serious problem that can occur when an image without
geo data is loading and causes the map projection bounds to
go to infinity. Right now, the solution is to simply try
to recover.
* extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
to set the MFILEReceiver attributes even if the data is NULL.
* extensions/thuban/gdalwarp.cpp: Improved the error handling
and passed GDAL messages back up to the Python layer. Also
tried to fix some memory leaks that were present in the original
utility but didn't matter because the program aborted.
* test/test_range.py: Copied over tests from SciParam. Removed
tests against importing. Fixes RTBug #1867.
2003-05-21 Bernhard Herzog <bh@intevation.de>
* test/test_load.py: Remove unused imports and restructure the
test code
(LoadSessionTest): Split into one class for each test and turn
LoadSessionTest itself into the base class for all such session
tests.
(ClassificationTest): New base class for load tests that test
classifications
(TestSingleLayer, TestLayerVisibility, TestClassification)
(TestLabels, TestLayerProjection, TestRasterLayer): New classes
for the individual tests
* test/support.py (FileLoadTestCase.filename): New base class for
file loading tests
2003-05-21 Jan-Oliver Wagner <jan@intevation.de>
* Resources/Projections/defaults.proj: Renamed 'Universal Transverse
Mercator' to 'UTM Zone 32' as a more convenient example.
Added 'Gauss Krueger Zone 6'.
* Data/iceland_sample_raster.thuban: political polygon now
filled transparent to have the raster image visible at once.
2003-05-21 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
OnClose() to keep in sync with extensions. Internally Thuban
still uses "underscored" names.
2003-05-20 Jonathan Coles <jonathan@intevation.de>
This puts back Raster layer support. These layers support projections
through the GDAL library. Currently, the CVS version is being used.
There are no Debian packages available although this may change soon.
A GDAL driver was extended to support writing to memory rather to
files.
There is still some work that needs to be done, such as some error
handling when loading invalid images or when there is a problem
projecting the image. This putback simply checks in the majority
of the work.
* setup.py: Add gdalwarp library extension.
* Thuban/Model/layer.py (BaseLayer.HasClassification): New.
Defaults to False, but can be overridden by subclasses if they
support classification.
(RasterLayer): New. Defines a new layer that represents an
image.
* Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
tag handler.
(SessionLoader.start_layer): Encode the filename.
(SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
New. Supports reading a rasterlayer tag.
* Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
* Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
get a string in Latin1. If we get such as string convert it to
unicode first, otherwise leave if alone before encoding.
(SessionSaver.write_layer): Add support for writing both Layers
and RasterLayers.
* Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
The right argument may not be a string, it could also be a Column.
* Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
Make initial window size 600x400. Fixes RTBug #1872.
* Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
the dialog is constructed so that we can support layers that
do not have classifications.
(Classifier._OnTry): Only build a classification if the layer
supports one.
* Thuban/UI/legend.py: Change all checks that a layer is an
instance of Layer into checks against BaseLayer.
(LegendTree.__FillTreeLayer): Only add children to a branch if
the layer supports classification.
* Thuban/UI/mainwindow.py (MainWindow.NewSession,
MainWindow.OpenSession): Don't proceed with an action if the
user chooses Cancel when they are asked to save changes.
(MainWindow.AddRasterLayer): New. Open a dialog to allow the
user to select an image file. Create a new RasterLayer and add
it to the map.
* Thuban/UI/renderer.py (MapRenderer.render_map): Add support
for rendering RasterLayer layers.
(MapRenderer.draw_raster_layer): Actually method that calls
the GDALWarp python wrapper and constructs an image from the
data returned.
* Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
Choices symbols to match those used in the table query method.
Replace deprecated method calls on table with new method names.
* Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
how small the scale can get. This still needs more testing.
* extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
Provides a driver to output in .bmp format.
* extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
New. Provides IO routines which write to memory, rather than a file.
* extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
of the gdalwarp utility provided in GDAL. Added function calls
that can be accessed from python.
* Data/iceland_sample_raster.thuban: New. Sample file that uses
a raster layer.
* Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
layer image data.
* Doc/thuban.dtd: Added rasterlayer attribute definition.
* test/test_layer.py, test/test_load.py, test/test_save.py: Added
tests associated with the raster layer code.
* test/test_transientdb.py
(TestTransientTable.test_auto_transient_table_query): Added a test
for using a Column object as the "right" parameter to a query.
2003-05-19 Frank Koormann <frank.koormann@intevation.de>
* Thuban/version.py (get_changelog_date):
Catch exceptions if ChangeLog does not exist.
* Thuban/UI/view.py (MapCanvas.Export): Bugfix
2003-05-19 Frank Koormann <frank.koormann@intevation.de>
Extended version information for Thuban
* Thuban/version.py: New, version information for Thuban: Last
modification date and last ChangeLog entry date.
* Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
information: Display Thuban, wxPython and Python version.
2003-05-16 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/save.py: Remove some unused imports including the
__future__ import for nested_scopes as Thuban relies on Python 2.2
now.
(XMLWriter.encode): Remove the special case for a None argument.
In the saver encode is always called with a string argument.
2003-05-16 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/__init__.py: Remove the work-around for the locale bug
in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
of the bug was that e.g. float("1.2") would fail. Thuban now
requires 2.4.x.
2003-05-16 Frank Koormann <frank.koormann@intevation.de>
Printing enhancement and WMF export (under Win32)
* Thuban/UI/renderer.py (ExportRenderer): New, derived from
ScreenRenderer. Renders Map, Legend and Scalebar for export.
(PrinterRenderer): New, derived from ExportRenderer. Replaces the old
PrintRender.
* Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
to fullfil information needed for PrinterRenderer.
(MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
(MapCanvas.Print): Adapted to new MapPrintout.
(OutputTransform): General calculations to transform from canvas
coordinates to export/printing devices.
* Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
new method_command to call ExportMap, with platform dependency (only
__WXMSW__)
* Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
of scalebar drawing area as new parameters.
* Thuban/Model/scalebar.py (roundInterval): round long instead of int
* Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
Update to extended scalebar.DrawScalebar header.
* test/test_export.py: New, test Thuban.UI.view.OutputTransform()
* test/test_scalebar.py: Made test executable as standalone.
2003-05-16 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/table.py (Table): Remove this compatibility alias
for DBFTable.
* test/test_table.py: Import DBFTable as Table because that alias
doesn't exist anymore.
* Thuban/UI/classgen.py: Remove some unused imports
2003-05-14 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
Fix docstring.
(ClassGenerator.GenUniformDistribution): Fix spelling of method name.
(ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
values of the supplied range to determine the beginning and end
bounds of the generated classes.
* Thuban/Model/range.py (Range.number_re): Now accepts floats that
do not have a leading 0 (.5 is now accepted as well as 0.5).
* Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
call to ClassGenerator.GenUniformDistribution.
* Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
layout bug with the 'Projection' label.
* test/support.py (FloatTestCase): New. Needed for the Range tests.
* test/test_range.py: New. Imported from SciParam.
2003-05-12 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
to table.UniqueValues() with calls that retrieve all the values
from the table. This will need to be replaced by a method on table
which can simply return the list (perhaps more efficiently).
2003-05-12 Jonathan Coles <jonathan@intevation.de>
The return value of ClassGenerator.CalculateQuantiles has changed.
Refer to the documentation for details.
* test/test_classgen.py: Modified Quantile tests to use the
new return values.
* Thuban/Model/classgen.py
(ClassGenerator.GenQuantiles): Add comments describing the parameters,
use new return values from CalculateQuantiles to produce the correct
range bounds in the Classification.
(ClassGenerator.CalculateQuantiles): Add more comments describing
the return values and parameters. Make minor adjustments to improve
the legibility of the code. Fix problem with adjusted not being set
in most cases.
2003-05-12 Frank Koormann <frank.koormann@intevation.de>
* Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
and latin1. Fixes #1851 finally.
2003-05-09 Jonathan Coles <jonathan@intevation.de>
* test/test_classgen.py: New. Tests the Quantile algorithm.
* Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
Clean up debugging statement, add comments, fix a small bug in the
returned adjusted percentiles.
2003-05-09 Jonathan Coles <jonathan@intevation.de>
Introduces Range class from SciParam into the ClassGroupRange class,
and such ranges can now be saved and loaded from disk.
Quantiles are now available in the Classification Generator.
Initial support for building Queries on a table. Doesn't do anything
but run some tests.
* Thuban/Model/classification.py: Explicit imports.
(ClassGroupRange): Use the Range class to store the underlying
range information. The interface remains the same, except for
GetRange(), and you can also supply a Range object as the min
parameter to SetRange or __init__.
* Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
string appropriately for use in Thuban. Fixes RTbug #1851.
(SessionLoader.end_projection): Handle the context of the
projection tag a bit better by looking at what objects are not
None. There was an assumption that a projection tag for a map
could occur before any layers.
(SessionLoader.start_clrange): Provide backward compatibility for
reading min/max values as well as the new range parameter.
* Thuban/Model/map.py: Explicit imports.
* Thuban/Model/resource.py: Import _.
(ProjFileSaver.write): write header using projfile.dtd.
* Thuban/Model/save.py: Explicit imports.
(XMLWriter.encode): New. Encode the given string from a format
used by Thuban into UTF-8. Fixes RTbug #1851.
* Thuban/UI/classgen.py: Explicit imports.
(ClassGenDialog.__init__): Clean up the code and add support
for Quantiles.
(ClassGenDialog.OnOK): Add support for Quantiles.
(GenQuantilesPanel): New. Input panel for Quantiles.
(ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
* Thuban/Model/classgen.py: New. Contains all the classes named above.
* Thuban/UI/classifier.py: Explicit imports.
(ClassTable.GetValueAsCust, ClassTable.__ParseInput,
ClassTable.SetValueAsCustom): Reworked to use new Range class.
* Thuban/UI/legend.py: Explicit imports.
* Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
a Table menu and associated method calls.
(MainWindow.choose_color): Removed. No longer needed.
* Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
should be disabled if no projection is selected in the available
list.
* Thuban/UI/renderer.py: Explicit imports.
* Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
with correctly selecting the rows and issuing the right events.
Be sure to call Skip() to allow the grid to do some of its own
handling which allows the rows to actually be selected.
(LayerTableGrid.select_shapes): Rename from select_shape. Supports
selecting multiple shapes.
(LayerTableFrame): Support for building Queries.
(LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
* Thuban/UI/tree.py: Explicit imports.
* Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
table view can call it.
* test/test_classification.py: Explicit imports.
(TestClassification.test_ClassGroupRange): Fix test for new
Range class.
* Doc/thuban.dtd: Add range parameter for clrange.
* Thuban/Model/range.py: Taken from SciParam. Used as the underlying
object in ClassGroupRange, and also uesd for inputting ranges in
the classifer table and elsewhere.
* Thuban/UI/join.py: New. Initial Join dialog. No real functionality
yet.
2003-05-09 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
2003-05-08 Frank Koormann <frank.koormann@intevation.de>
Coding style updates
* test/test_scalebar.py: Replaced tab indentation by spaces.
* Thuban/UI/scalebar.py: Explicit imports.
2003-05-08 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/scalebar.py
(ScaleBar.DrawScalebar): Format string bug fixed.
2003-05-08 Frank Koormann <frank.koormann@intevation.de>
Reorganization of scalebar component (no wx in Thuban/Model)
* Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
(deriveInterval):
Calculate scalebar interval and unit which fits in width for scale.
(roundInterval): Round float.
* Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
* test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
* Thuban/UI/legend.py: Import Thuban.UI.scalebar
2003-05-08 Frank Koormann <frank.koormann@intevation.de>
* Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
Initialize ScaleBar with canvas.map
* Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
round intervals to display smarter lengths
(ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
layer. If the maps has no projection applied grey the scalebar.
2003-05-07 Frank Koormann <frank.koormann@intevation.de>
Basic Scalebar features added.
* Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
* Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
(ScaleBarBitmap): New, links the scalebar bitmap with view messages
and the renderer.
* Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
* Thuban/UI/messages.py: SCALE_CHANGED added.
2003-05-07 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/session.py (Session.__init__): New instance
variable shapestores to hold a list of all open shapestore objects
(Session.ShapeStores): New. Accessor method for the shapestores
list.
(Session._add_shapestore, Session._clean_weak_store_refs): New.
Internal methods to maintain the shapestores list.
(Session.Tables): New. Return all tables open in the session.
(Session.OpenShapefile): Insert the new ShapeStore into the
shapestores list.
* test/test_session.py (TestSessionSimple.test_initial_state): Add
tests for ShapeStores and Tables
(TestSessionWithContent.test_shape_stores)
(TestSessionWithContent.test_tables): New. Test cases for
ShapeStores and Tables
2003-05-07 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
Add comments about the optimizations used.
(AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
Implement the ReadValue table interface method.
* test/test_transientdb.py
(TestTransientTable.run_iceland_political_tests)
(TestTransientTable.test_transient_joined_table): Add tests for
ReadValue
2003-05-07 Frank Koormann <frank.koormann@intevation.de>
* Resources/Bitmaps/fulllayerextent.xpm,
Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
new icons.
2003-05-06 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
New. Simply delegate to the transient table's version.
* test/test_transientdb.py
(TestTransientTable.test_auto_transient_table_query): New. Test
case for AutoTransientTable's SimpleQuery
2003-05-06 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
Implement a simple query method for the query dialog
(TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
the row index or shapeid.
(TransientTable.create): Insert the right value of the row index
(TransientJoinedTable.create): Copy the row index of the left
table to the joined result table
* test/test_transientdb.py
(TestTransientTable.test_transient_table_read_twice): Fix
doc-string
(TestTransientTable.test_transient_table_query): New. Test for the
SimpleQuery method
2003-05-06 Bernhard Herzog <bh@intevation.de>
Convert all table users to use the new table interface. This only
covers Thuban itself, not GREAT-ER or other applications built on
Thuban yet, so the compatibility interface stays in place for the
time being but it now issues DeprecationWarnings.
Finally, the new Table interface has a new method, HasColumn.
* Thuban/Model/table.py (OldTableInterfaceMixin): All methods
issue deprecation warnings when they're. The warnings refer to the
caller of the method.
(OldTableInterfaceMixin.__deprecation_warning): New. Helper method
for the deprecation warnings
* test/test_table.py: Ignore the deprecation warnings for the old
table in the tests in this module. The purpose of the tests is to
test the old interface, after all.
* test/test_transientdb.py
(TestTransientTable.run_iceland_political_tests): Use the
constants for the types. Add a test for HasColumn
(TestTransientTable.test_transient_joined_table): Adapt to new
table interface. Add a test for HasColumn
(TestTransientTable.test_transient_table_read_twice): Adapt to new
table interface
* Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
Adapt to new table interface
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
new table interface
* Thuban/UI/controls.py (RecordListCtrl.fill_list)
(RecordTable.SetTable): Adapt to new table interface
* Thuban/UI/classifier.py (Classifier.__init__)
(Classifier.__init__): Adapt to new table interface
* Thuban/UI/classgen.py (ClassGenDialog.__init__)
(GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
to new table interface
* Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
(AutoTransientTable.HasColumn): Implement the new table interface
method
(AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
(AutoTransientTable.UniqueValues): Adapt to new table interface
* Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
Adapt to new table interface
* test/test_layer.py (TestLayer.open_shapefile): Helper method to
simplify opening shapefiles a bit easier.
(TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
(TestLayer.test_point_layer): Use the new helper method
(TestLayer.test_get_field_type): New. Test for the GetFieldType
method
* test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
the new table method
* test/test_memory_table.py (TestMemoryTable.test_has_column):
Test for the new table method HasColumn
2003-05-06 Jonathan Coles <jonathan@intevation.de>
Addresses the "Selection Extent" wish of RTbug #1787.
* Resources/Bitmaps/fulllayerextent.xpm,
Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
extent. These are just place holders for the real bitmaps.
* Thuban/Model/layer.py (Shape): Since a Shape is immutable only
calculate the bounding box once (the first time compute_bbox() is
called).
(Layer.ShapesBoundingBox): New. Given a list of shape ids, return
the bounding box for the shapes in lat/long coordinates.
* Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
option.
(MainWindow.has_selected_shapes): New. Returns true if there are
any selected shapes.
(MainWindow.FullSelectionExtent): New. Calls
MapCanvas.FitSelectedToWindow() when the user selects the menu option.
(_has_selected_shapes): New. Returns true if there are any
selected shapes.
* Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
true if there are any selected shapes.
* Thuban/UI/view.py (MapCanvas): Added delegated method
HasSelectedShapes.
(MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
shapes on the canvas using the map projection (if any).
* test/test_layer.py (TestLayer.test_arc_layer): Add some tests
for Layer.ShapesBoundingBox().
2003-05-06 Bernhard Herzog <bh@intevation.de>
* Resources/Projections/defaults.proj: Fix spelling of Mercator
2003-05-05 Jonathan Coles <jonathan@intevation.de>
Addresses the "Full Layer Extent" wish of RTbug #1787.
* Resources/Projections/defaults.proj: Added UK National Grid.
* Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
(MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
when the user selects the menu option.
* Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
scales the given layer on the canvas using the map projection.
2003-05-05 Bernhard Herzog <bh@intevation.de>
Convert the table implementations to a new table interface. All
tables use a common mixin class to provide backwards compatibility
until all table users have been updated.
* Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
provide backwards compatibility for table classes implementing the
new interface
(DBFTable, MemoryTable): Implement the new table interface. Use
OldTableInterfaceMixin as base for compatibility
(DBFColumn, MemoryColumn): New. Column description for DBFTable
and MemoryTable resp.
* test/test_dbf_table.py: New. Test cases for the DBFTable with
the new table interface.
* test/test_memory_table.py: New. Test cases for the MemoryTable
with the new table interface.
* test/test_table.py: Document the all tests in this file as only
for backwards compatibility. The equivalent tests for the new
interface are in test_memory_table.py and test_dbf_table.py
(MemoryTableTest.test_read): field_info should be returning tuples
with four items
(MemoryTableTest.test_write): Make doc-string a more precise.
* Thuban/Model/transientdb.py (TransientTableBase): Convert to new
table interface. Derive from from OldTableInterfaceMixin for
compatibility.
(TransientTableBase.create): New intance variable column_map to
map from names and indices to column objects
(TransientTable.create): Use the new table interface of the input
table
(AutoTransientTable): Convert to new table interface. Derive from
from OldTableInterfaceMixin for compatibility.
(AutoTransientTable.write_record): Removed. It's not implemented
yet and we still have to decide how to handle writing with the new
table and data framework.
* test/test_transientdb.py
(TestTransientTable.run_iceland_political_tests)
(TestTransientTable.test_transient_joined_table): Use the new
table interface
2003-05-05 Jonathan Coles <jonathan@intevation.de>
This is namely a collection of UI updates to improve user interactivity.
Tabbing between controls now exists and you can use ESC to close dialog
boxes; ENTER will active the default button.
* Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
order that the controls are created so that tabbing works correctly.
(ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
wxDialog can handle the default button correctly.
(ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
same reasons as for OnOK.
(GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
when we ask the table for the maximum/minimum values of a field
which could take a very long time.
* Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
order that the controls are created so that tabbing works correctly.
(SelectPropertiesDialog.__init__): Rearrange the order that the
controls are created so that tabbing works correctly.
* Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
to derive from a wxDialog but behave like the original implementation
which was derived from a wxFrame. wxDialog provides useful key
handling functionality like ESC calling OnCancel and ENTER calling
OnOK which is lost with wxFrame.
* Thuban/UI/mainwindow.py: Add "..." to menu items that will open
new dialogs.
* Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
order that the controls are created so that tabbing works correctly.
(ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
(ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
(ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
(ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
can provide the "UK National Grid" as a default projection.
(UTMPanel.__init__): Rearrange the order that the controls are
created so that tabbing works correctly.
2003-05-05 Bernhard Herzog <bh@intevation.de>
* extensions/thuban/wxproj.cpp: Fix some of the comments.
(project_point): If a map projection but no layer projection is
given, convert degrees to radians before applying the map
projection.
* Thuban/UI/tableview.py (TableGrid.disallow_messages)
(TableGrid.allow_messages): New methods to make it possible to
inhibit message sending.
(TableGrid.issue): Only send the message if not inhibited.
(LayerTableGrid.select_shape): Use the new methods to make sure
that no ROW_SELECTED message is sent while we're updating the
selected rows to match the selected shapes.
2003-05-02 Jan-Oliver Wagner <jan@intevation.de>
Implementation of MemoryTable.
* Thuban/Model/table.py (MemoryTable): New. Quite simple table
implementation that operates on a list of tuples. All of the data
are kept in the memory.
* test/test_table.py (MemoryTableTest): New.
* test/test_transientdb.py (SimpleTable): Removed.
(TestTransientTable.test_transient_joined_table,
(TestTransientTable.test_transient_table_read_twice): Replaced
SimpleTable by MemoryTable.
2003-04-30 Jonathan Coles <jonathan@intevation.de>
* Data/iceland_sample.thuban: Now contains correct projections
for each of the layers.
* Resources/Projections/defaults.proj: Geographic projection
contains unit conversion parameter.
2003-04-30 Jonathan Coles <jonathan@intevation.de>
The most important part of this putback is the projection changes.
It should now be possible to specify the projection that a layer
is in and then specify a different projection for the map. The
projection dialog has an extra parameter for a geographic projection
which lets the user select if the input is in degrees or radians.
* Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
to say that the parameter is a tuple of unprojected
points (which is what the callers to this method were assuming).
Also, since the points are unprojected we need to projected them.
* Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
groups are selected, move the layer up/down. Fixes RTbug #1833.
* Thuban/UI/mainwindow.py: Move menu item map_rename up.
* Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
parameter in call to SetClientData.
(GeoPanel): Add support for selecting the units that the
source data is in (Radians or Degrees).
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
the rendering loop by reducing the number of if's, removing the
unnecessary try/except block, and checking if the old group
is the same as the new one (which happens a lot if there is
no classification, or lots of shapes are in the same group).
* Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
around the redraw routine to try to catch problems that the user
may create by selecting invalid projections for the data set and
map. Clears the display if there are any problems and prints the
error.
(MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
rectangle.
* extensions/thuban/wxproj.cpp (project_point): First invert the
supplied point (which should be in projected coordinates) using
the layer's projection and then project the point using the
map's projection.
(project_points): Use project_point() to project each point.
2003-04-30 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
don't set the Classification to None if the classfication field
is None (ie only a DEFAULT).
2003-04-30 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py: Fix some typos.
* Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
not pop up the dialog if the selection becomes empty (this could
happen if e.g. a new selection is opened while the identify tool
is active and dialog had been closed)
2003-04-30 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/transientdb.py (TransientTableBase.__init__): New
instance variable read_record_last_result
(TransientTableBase.read_record): Make sure reading the same
record twice works. The implementation uses the new instance
variable read_record_last_result
* test/test_transientdb.py
(TestTransientTable.test_transient_table_read_twice): New test
case for the above bug-fix.
2003-04-29 Jonathan Coles <jonathan@intevation.de>
* Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
* Thuban/UI/classgen.py: Remove all uses of Str2Num.
* Thuban/UI/classifier.py: Remove all uses of Str2Num.
(ClassTable.SetValueAsCustom): Rename keyword argument in
ClassGroup* constructors to match argument name.
2003-04-29 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/session.py (Session.Destroy): Explicitly close the
transient DB if it exists to make sure it doesn't leave a journal
file in the temp directory.
* Thuban/Model/transientdb.py (TransientDatabase.close): Set
self.conn to None after closing the connection to make sure it's
not closed twice
2003-04-29 Jonathan Coles <jonathan@intevation.de>
Add a visible parameter in the layer XML tag. The default value is
"true". If anything other than "false" is specified we also assume
"true". Addresses RTbug #1025.
* Doc/thuban.dtd: Add visible parameter to a layer.
* Thuban/Model/layer.py (BaseLayer.__init__): Change default value
of visible from 1 to True.
(Layer.__init__): Change default value of visible from 1 to True.
* Thuban/Model/load.py (SessionLoader.start_layer): Read visible
parameter.
* Thuban/Model/save.py (SessionSaver.write_layer): Save visible
parameter.
* test/test_load.py: Add new test data contents_test_visible.
(LoadSessionTest.setUp): save test data.
(LoadSessionTest.testLayerVisibility): Test if the visible flag
is loaded correctly.
* test/test_save.py (SaveSessionTest.testSingleLayer): Add test
for saving an invisible layer.
2003-04-29 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
legend dialog box and tell it to change its map to the one
supplied to SetMap(). Fixes RTbug #1770.
2003-04-29 Bernhard Herzog <bh@intevation.de>
Next step of table implementation. Introduce a transient database
using SQLite that some of the data is copied to on demand. This
allows us to do joins and other operations that require an index
for good performance with reasonable efficiency. Thuban now needs
SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
haven't tested that.
* Thuban/Model/transientdb.py: New. Transient database
implementation.
* test/test_transientdb.py: New. Tests for the transient DB
classes.
* Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
classes to help automatically remove temporary files and
directories.
(Session.__init__): New instance variables temp_dir for the
temporary directory and transient_db for the SQLite database
(Session.temp_directory): New. Create a temporary directory if not
yet done and return its name. Use AutoRemoveDir to have it
automatically deleted
(Session.TransientDB): Instantiate the transient database if not
done yet and return it.
* Thuban/Model/data.py (ShapefileStore.__init__): Use an
AutoTransientTable so that data is copied to the transient DB on
demand.
(SimpleStore): New class that simply combines a table and a
shapefile
* Thuban/Model/table.py (Table, DBFTable): Rename Table into
DBFTable and update its doc-string to reflect the fact that this
is only the table interface to a DBF file. Table is now an alias
for DBFTable for temporary backwards compatibility.
* Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
the last reference to the session goes away so that the temporary
files are removed properly.
* test/test_load.py (LoadSessionTest.tearDown): Remove the
reference to the session to make sure the temporary files are
removed.
2003-04-29 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
the __parser instance variable into a normal local variable in
read. It's only used there and read will never be called more than
once. Plus it introduces a reference cycle that keeps can keep the
session object alive for a long time.
2003-04-29 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/proj.py (Projection): Removed Set*() methods to make
Projection an immutable item. Fixes RTbug #1825.
(Projection.__init__): Initialize instance variables here.
(ProjFile.Replace): New. Replace the given projection object with
the new projection object. This solves the problem of needing the
mutator Projection.SetProjection() in the ProjFrame class and
allows a projection to change parameters without changing its
location in the file.
* Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
be of type wxSAVE and should verify overwriting a file.
* Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
ProjFile.Replace() method instead of the mutator
Projection.SetProjection(). Also requires that we reassign the
client data to the new projection.
* test/test_proj.py (TestProjection.test): Test GetName() and
GetAllParameters()
(TestProjFile.test): Remove tests for Set*() methods. Add tests
for Replace().
2003-04-25 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/save.py (SessionSaver.write_projection): Make sure
to save the name of the projection.
* test/test_save.py (SaveSessionTest.testLayerProjection): New
test to verify layer projections are saved correctly.
2003-04-25 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/proj.py (Projection.SetName): Set the name
to "Unknown" if name is None.
(Projection.SetAllParameters): New. Set the projection's
parameter list to the one supplied.
(Projection.SetProjection): New. Set the projection's
properties to those of the supplied Projection.
* Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
the dialog title to include the map's title.
(MainWindow.LayerProjection): Set the dialog title to include
the layer's title.
* Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
error dialogs into a single method call.
(ProjFrame.__VerifyButtons): Add more states to check.
(ProjFrame.__GetProjection): Return the current state of an
edited projection or None.
(ProjFrame.__FillAvailList): Remove checks for states that
shouldn't exist.
(ProjFrame._OnNew): Clear all selected items and supply
a projection panel if necessary.
* test/test_proj.py (TestProjFile.test): Add tests for
ProjFile.SetAllParameters, ProjFile.SetProjection,
ProjFile.SetName.
2003-04-25 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
takes an optional argument to select the current projection.
This does not guarantee that the item is visible due to
limited wxWindows functionality. Fixes RTBug #1821.
2003-04-25 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/load.py (SessionLoader.start_projection): Remember
the projection name and use it when constructing the Projection
object.
* Thuban/Model/proj.py (Projection.__init__): Change the default
value for 'name' to None and then test if name is equal to None
in the body of the constructor. This way the caller doesn't have to
know what the default value should be. Namely, useful in load.py
where we have to pick a default value if the 'name' parameter
doesn't exist in the XML file.
* test/test_load.py (LoadSessionTest.testLayerProjection): New.
Tests a file where a layer has a projection.
2003-04-25 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
tree for projection information.
* Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
XMLReader.GetFileName.
(SessionLoader): Added support for loading projection tags that
appear inside a layer.
* Thuban/Model/proj.py (ProjFile): Document the class. Move
back to using a list because the order of the projections in
the file is important to maintain. Fixes RTbug #1817.
* Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
to ProjFile.GetFilename.
* Thuban/Model/save.py (SessionSaver.write_layer): Save projection
information.
* Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
ProjFrame._OnSaveAs. Removed old dead code from previous
implementation.
(ProjFrame._OnExport): Add support for exporting more than one
projection to a single file.
(ProjFrame.__FillAvailList): use string formatting (% operator)
to build strings that are (partly) translated. Fixes RTbug #1818.
* test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
class.
2003-04-24 Bernhard Herzog <bh@intevation.de>
* po/es.po: Updated Spanish translation by Daniel Calvelo Aros
* po/fr.po: New. French translation by Daniel Calvelo Aros
* Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
empty strings.
2003-04-24 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
implement the interface that the ProjFrame dialog expects.
* Thuban/Model/proj.py (Projection.SetName): New. Allows the
name of the projection to be changed.
(ProjFile): Use a dictionary instead of a list so that removing
projections is easier and we are sure about uniqueness.
(ProjFile.Remove): Remove the given projection object.
* Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
Return a list with only one projection file instead of searching for
any projection file. This simplifies many things if the user can
only have one system file and one user file.
* Thuban/UI/classgen.py: Change all references to
genCombo to genChoice.
* Thuban/UI/mainwindow.py: Add a Projection option under the
layer menu.
(MainWindow.LayerProjection): New. Open up a projection window
for a layer.
* Thuban/UI/projdialog.py: Large changes to how the dialog is
laid out. Use three panels instead of one. One for the list of
projections, one for the edit controls, and one for the buttons.
Fixed resizing problems so that the dialog resizes correctly
when the projection panel changes. Added import/export, save, and
new buttons/functionality.
2003-04-24 Bernhard Herzog <bh@intevation.de>
First step towards table management. Introduce a simple data
abstraction so that we replace the data a layer uses more easily
in the next step.
* Thuban/Model/data.py: New file with a simple data abstraction
that bundles shapefile and dbffile into one object.
* Thuban/Model/session.py (Session.OpenShapefile): New method to
open shapefiles and return a shape store object
* Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
object instead of a shapefile filename. This introduces a new
instance variable store holding the datastore. For intermediate
backwards compatibility keep the old instance variables.
(open_shapefile): Removed. No longer needed with the shape store.
(Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
get the shape store used by a layer.
(Layer.Destroy): No need to explicitly destroy the shapefile or
table anymore.
* Thuban/UI/mainwindow.py (MainWindow.AddLayer)
(MainWindow.AddLayer): Use the session's OpenShapefile method to
open shapefiles
* Thuban/Model/load.py (ProcessSession.start_layer): Use the
session's OpenShapefile method to open shapefiles
* test/test_classification.py
(TestClassification.test_classification): Use the session's
OpenShapefile method to open shapefiles and build the filename in
a more platform independed way
* test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
Implement to have a session to use in the tests
(TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
(TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
session's OpenShapefile method to open shapefiles
(TestLayerLegend.setUp): Instantiate a session so that we can use
it to open shapefiles.
(TestLayerLegend.tearDown): Make sure that all references to
layers and session are removed otherwise we may get a resource
leak
* test/test_map.py (TestMapAddLayer.test_add_layer)
(TestMapWithContents.setUp): Instantiate a session so that we can
use it to open shapefiles.
(TestMapWithContents.tearDown): Make sure that all references to
layers, maps and sessions are removed otherwise we may get a
resource leak
("__main__"): use support.run_tests() so that more info about
uncollected garbage is printed
* test/test_save.py (SaveSessionTest.testSingleLayer): Use the
session's OpenShapefile method to open shapefiles
("__main__"): use support.run_tests() so that more info about
uncollected garbage is printed
* test/test_selection.py (TestSelection.tearDown): Make sure that
all references to the session and the selection are removed
otherwise we may get a resource leak
(TestSelection.get_layer): Instantiate a session so that we can
use it to open shapefiles.
("__main__"): use support.run_tests() so that more info about
uncollected garbage is printed
* test/test_session.py (TestSessionBase.tearDown)
(TestSessionWithContent.tearDown): Make sure that all references
to the session and layers are removed otherwise we may get a
resource leak
(TestSessionWithContent.setUp): Use the session's OpenShapefile
method to open shapefiles
2003-04-24 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/load.py (XMLReader.read): Should have been checking
if the file_or_filename object had the 'read' attribute.
2003-04-23 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/resource.py: Fixes RTbug #1813.
(ReadProjFile): Add documentation about which exceptions are raised.
Always pass the exceptions up to the caller.
(GetProjFiles): If the directory can't be read return an empty list.
If any of the proj files can't be read skip that file and go
on to the next one.
* test/test_proj.py: Added test cases to handle nonexistent files,
unreadable files, and files that don't parse correctly.
2003-04-23 Jonathan Coles <jonathan@intevation.de>
Projection dialog. Allows the user to select from a list
of projection templates and optionally edit them and save new ones.
* Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
(ProjPanel): Base class for projection specific panels.
(TMPanel): Projection panel for Transverse Mercartor.
(UTMPanel): Projection panel for Universal Transverse Mercartor.
(LCCPanel): Projection panel for Lambert Conic Conformal.
(GeoPanel): Projetion panel for Geographic Projection.
2003-04-23 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
promote symmetry. There now exists XMLReader and XMLWriter.
(XMLReader.read): New. Call to read the given file descriptor or
filename.
(XMLReader.close): New. Make sure the file is closed.
(XMLReader.GetFileName): New. Return just the file name that is being
read from.
(XMLReader.GetDirectory): New. Return just the directory of the file
that is being read.
(XMLReader.AddDispatchers): New. Take a dictionary which contains
the names of functions to call as the XML tree is parsed.
(XMLReader.startElementNS): Updated to use new dispatcher dictionary.
(XMLReader.endElementNS): Updated to use new dispatcher dictionary.
(SessionLoader): Removed class variables start_dispatcher and
end_dispatcher since this functionality is now part of a class
instance. Fixes RTbug #1808.
(SessionLoader.__init__): Add dispatcher functions.
(load_xmlfile): Code was moved into the XMLReader.read().
(load_session): Use modified SessionLoader.
* Thuban/Model/map.py (Map.GetProjection): New. Returns the
map's projection.
* Thuban/Model/proj.py (Projection.GetParameters): Renamed to
GetAllParameters.
(Projection.GetParameter): Returns the value for the given parameter.
* Thuban/Model/resource.py: Use XMLReader and XMLWriter.
(GetProjFiles): Renamed from GetProjections. Now returns a list
of ProjFile objects.
(GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
a list of ProjFile objects whose files are not user defined.
(GetUserProjFiles): Renamed from GetUserProjections. Returns a
list of ProjFile objects whose files are user defined.
(ProjFileReader): Extend new XMLReader.
* Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
promote symmetry.
* Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
control instead of a wxComboBox. wxChoice controls do not generate
events as the uses highlights possible choices which fixes problems
with resizing the dialog when the use selects an option.
* Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
control instead of a wxComboBox.
* Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
dialog.
* test/test_proj.py (TestProjection.test): New tests for GetParameter
method.
2003-04-22 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py: Remove some unused imports and global
constants
* Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
(IdentifyGridCtrl.selected_shape): Use table, not shapetable.
2003-04-17 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
(Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
anymore.
(Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
(Layer.ShapeType, Layer.Shape): No need to call
self.open_shapefile since it's always called in __init__
* Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
In wxPython 2.4 there's no need to extend MainLoop anymore since
wxPython itself makes sure OnExit is called.
2003-04-16 Jonathan Coles <jonathan@intevation.de>
Initial putback of projection management code. Includes new
classes to read and write projection files. The current load
and save classes were abstracted a bit so they could be reused.
The Projection class was extended to provide new methods and
have a name.
* Thuban/Model/load.py (XMLProcessor): New. Contains all the
general XML reading methods that were part of ProcessSession.
* Thuban/Model/proj.py (Projection.__init__): Accepts an optional
name.
(ProjFile): New. Represents a file that contains projection
information.
* Thuban/Model/resource.py: New. Contains general utilities
for read and writing projection files.
* Thuban/Model/save.py (XMLSaver): New. Contains all the
general XML writing methods that were part of SessionSaver.
(SessionSaver): Renamed from Saver.
* test/test_proj.py: New test cases for the projection
file read and write functions.
2003-04-16 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py: Use repr() around values
in the ClassGroup*.__repr__() methods so it is clearer when
a value is a string and when it is a number.
* test/test_load.py: Rework the classification test to test
that we can load old files.
(testLabels): Test a file where the groups have labels.
2003-04-16 Bernhard Herzog <bh@intevation.de>
Safer implementation of the performance enhancements of the
low-level renderer:
* extensions/thuban/wxproj.cpp (extract_projection)
(extract_pointer): Rename extract_projection to extract_pointer
and redefine its purpose to return the pointer stored in a CObject
returned by the object's cobject method. Update all callers.
(s_draw_info, free_draw_info, draw_polygon_init): Implement the
handling of these low-level parameters so that each s_draw_info
instance is handled as a CObject at python level that also
contains real references to the actual python objects which
contain the values in the struct. Add free_draw_info as the
destructor.
(draw_polygon_shape): Add the py_draw_info parameter which must a
cobject containing an s_draw_info pointer.
* Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
method to instantiat the low-level render parameter
(MapRenderer.draw_shape_layer): Use the new method. Remove some
commented out code.
(MapRenderer.draw_polygon_shape): Make the first parameter not the
layer but the low-level render parameter
(ScreenRenderer.draw_shape_layer): Use the low-level render
parameter.
2003-04-15 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py: Implemented __repr__ for
the ClassGroup* classes to make debugging a bit easier.
(ClassGroup.SetLabel): Check that the string is an instance
of StringTypes not StringType. Accounts for Unicode strings.
* Thuban/Model/color.py: Implemented __repr__ to make
debugging a bit easier.
* Thuban/Model/save.py (Saver.write_classification): Need to
save the group label.
* test/test_load.py (testClassification): New. Loads the
iceland_sample_test.thuban file and checks if it was loaded
correctly.
2003-04-15 Jonathan Coles <jonathan@intevation.de>
* extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
to improve rendering performance by initializing the variables
that are not change each time draw_polygon_shape() is called.
The values are stored in a global struct draw_info.
(draw_polygon_shape): Removed initialization code that is
now in draw_polygon_init().
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
drawing initialization call to draw_polygon_init()
(MapRenderer.draw_polygon_shape): Use new signature of
draw_polygon_shape.
* Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
weirdness by setting the range to (1, maxint).
* Thuban/Model/classification.py (ClassGroupProperties): Make
instance variables private and optimize comparison operator
by first checking if the color references are the same.
(ClassGroupSingleton): Make instance variables private.
(ClassGroupRange): Make instance variables private.
* HOWTO-Release: Filled in missing steps for releasing packages.
2003-04-15 Bernhard Herzog <bh@intevation.de>
First stab at internationalized messages:
* Thuban/__init__.py (_): Implement the translation function for
real using the python gettext module.
* Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
translate empty strings.
* Thuban/UI/application.py (ThubanApplication.read_startup_files):
Add a missing space to a warning message
* po/README: New. Notes about the management of the translation
files.
* po/Makefile: New. Makefile to help manage the translation files.
* po/es.po: New. Spanish translation by Daniel Calvelo Aros
* MANIFEST.in: Include the *.mo files in Resources/Locale and the
translations and support files in po/
* setup.py (data_files): Add the *.mo files to the data_files too
* README: Add note about the translations when building from CVS
2003-04-14 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/dock.py: Fixes some window resizing problems most
noticable under windows. Always assume the button bitmaps will
be there. Code clean up.
(DockabelWindow.Dock, DockableWindow.UnDock): Force all the
images for the dock/undock button to the same images.
Work around for RTbug #1801.
* Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
be allowed to grow within the sizer. Fixes a bug under Windows
where the toolbar wasn't being drawn.
2003-04-14 Frank Koormann <frank.koormann@intevation.de>
* Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
Updated design to try to make the button functionality more
transparent.
2003-04-14 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
finalize the intialization of the panel.
* Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
creation of the panel. Should be the last thing called in the
initializer of a subclass.
* Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
set the current selections in the combo boxes. This is needed
under Windows.
* Thuban/UI/classifier.py (Classifier.__init__): Add a top
level panel to the dialog so that the background colors are
consistent under Windows.
2003-04-11 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classgen.py: Change color ramps to start at white
not black.
* Thuban/UI/legend.py: Enable/disable the legend buttons when
the legend changes. Fixes RTbug #1793.
* test/test_classification.py: Added test for copying of
classifications.
2003-04-11 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/resource.py: New. Centralize the loading of resources
such as bitmaps.
* Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
added images to the move buttons, added 'reverse' button.
(CustomRampPanel.__init__): Added images to the move buttons.
(GreyRamp): New. Generates a ramp from white to black.
(HotToColdRamp): New. Generates a ramp from cold to hot colors.
* Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
ID_PROPERTY_*.
(Classifier.__init__): Minor changes to the layout.
(Classifier._OnTitleChanged): Listen for when the user edits the
title and update the dialog's title and the layer's title.
* Thuban/UI/dock.py: Use new bitmaps for the control buttons.
* Thuban/UI/legend.py: Use new bitmaps for the control buttons.
(LegendTree._OnMsgLayerTitleChanged): Change the displayed title
if the layer's title changes.
* Thuban/UI/mainwindow.py: Added new menu item and associated code
to open a dialog to rename the map.
(MainWindow): Use new resource class to import bitmaps.
2003-04-11 Jonathan Coles <jonathan@intevation.de>
* Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
Resources/Bitmaps/group_use_none.xpm,
Resources/Bitmaps/group_use_not.xpm,
Resources/Bitmaps/hide_layer.xpm,
Resources/Bitmaps/layer_properties.xpm,
Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
New.
2003-04-10 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py: (ClassGroupRange.__init__):
Should pass group to ClassGroup constructor.
2003-04-10 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py: (ClassGroup): Move all the common
methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
here. Implement SetVisible(), IsVisible().
(ClassGroup.__init__): Add group parameter which acts as a copy
constructor.
* Thuban/UI/classifier.py (ClassTable): Add a new column for the
"Visible" check boxes.
(Classifier): Rename the buttons and refactor the code to match
the new labels.
* Thuban/UI/legend.py: Classify button is now called "Properties".
Refactored the code to change variable names.
(LegendTree.__FillTreeLayer): Only list a group if it is visible.
* Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
renamed to MainWindow.LayerEditProperties.
(MainWindow.ToggleLegend): Don't include map name in legend title.
(MainWindow.SetMap): Added the map name to the window title.
(MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
Functionality is found in the layer properties dialog.
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
draw visible groups.
2003-04-09 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classgen.py: Modifications to allow simple
addition and selection of new color schemes.
(MonochromaticRamp): New. Generates a ramp between two colors.
(RedRamp): New. Generates a ramp of all red.
(GreenRamp): New. Generates a ramp of all green.
(BlueRamp): New. Generates a ramp of all blue.
2003-04-09 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py (Classification.__deepcopy__):
Need to copy over field and fieldType attributes.
* Thuban/Model/table.py (Table.field_range): New. Retrive the
maximum and minimum values over the entire table for a given
field.
(Table.GetUniqueValues): New. Retrieve all the unique values
in the table for a given field.
* Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
(GenUniquePanel): New. Controls to allow the user to select
which unique field values they would like in the classification.
(CustomRampPanel): Code that was in ClassGenDialog that allows
the user to select the properties for a custom ramp.
(ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
* Thuban/UI/classifier.py: Removed a lot of debugging code.
(Classifier._SetClassification): Callback method so that the
class generator can set the classification in the grid.
(ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
editing of a group properties class into a wxWindows control.
* Thuban/UI/dock.py: It was decided that if the user closes
a dockable window the window should simply hide itself. That
way if the user wants to show the dock again it appears in the
same place as it was when it was closed.
(DockableWindow.Destroy): Call renamed method OnDockDestroy().
(DockableWindow._OnButtonClose): Hide the window instead of
destroying it.
(DockableWindow._OnClose): Hide the window instead of
destroying it.
* Thuban/UI/legend.py (LegendTree): Use a private method to
consistently set the font and style of the text. Fixes RTbug #1786.
* Thuban/UI/mainwindow.py: Import just the Classifier class.
2003-04-07 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
to the map module
2003-04-07 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
favor of ToggleSessionTree
(MainWindow.ToggleSessionTree): New method to toggle visibility of
the session tree.
(MainWindow.SessionTreeShown): New method to return whether the
session tree is currently shown.
(MainWindow.ToggleLegend): New method to toggle visibility of the
legend
(MainWindow.ShowLegend): Implement in terms of ToggleLegend and
LegendShown
(MainWindow.LegendShown): New method to return whether the legend
is currently shown.
(_method_command): Add checked parameter so we can define check
menu items
(_has_tree_window_shown, _has_legend_shown): Use the appropriate
mainwindow methods.
(show_session_tree, show_legend commands): Removed.
(toggle_session_tree, toggle_legend commands): New commands to
toggle the visibility of the dialogs
2003-04-07 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classgen.py: Fix Windows problem.
* Thuban/UI/dock.py: Fix Windows problem.
* Thuban/UI/mainwindow.py: Use False instead of false.
(MainWindow.ShowLegend): Remove unnecessary switch parameter.
2003-04-07 Jonathan Coles <jonathan@intevation.de>
Since we now say that the order of the groups in a classification
matters, it makes sense to be able to manipulate that order. Most
of the changes to Thuban/Model/classification.py are to that end.
* Thuban/Model/classification.py (Classification.AppendGroup,
Classification.InsertGroup, Classification.ReplaceGroup,
Classification.RemoveGroup, Classification.GetGroup): Do as the
names imply.
(Classification.FindGroup): This was called GetGroup, but GetGroup
takes an index, while FindGroup takes a value.
(Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
REFERENCE. Currently there is a cyclic reference between the layer
and its classification. If the classification doesn't need to know
its owning layer we can change this, since it may make sense to be
able to use the same classification with different layers.
* Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
* Thuban/UI/classgen.py: Use Classification.AppendGroup(),
not AddGroup()
* Thuban/UI/classifier.py: Now that we can depend on the order in
a Classification and have methods to manipulate that order we don't
need to use our own data structures in the grid. We can simply make
the grid/table access the information they need from a copy of
the classification object.
(Classifier._OnCloseBtn): Event handler for when the user clicks
'Close'. This is needed so if the user applies changes and then
continues to change the table the user has the option of discarding
the most recent changes and keeping what they applied.
* Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
into the same group.
* extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
with a really old version of proj, PJ_VERSION won't even be defined.
If it isn't defined then just compile so that the function always
returns Py_False.
* test/test_classification.py: Fix tests to use the renamed methods.
Still need to write tests for the new methods.
2003-04-04 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classifier.py (Classifier.__SelectField): Move the
call to SetSelection out of the method and before the call
to __SelectField in __init__. This prevents a recursion of events
when _OnFieldSelect is triggered by the user.
2003-04-04 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py: Rename Color.None to
Color.Transparent.
(ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
Don't bother copying the color, since Colors are immutable.
* Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
Thuban/UI/renderer.py, Thuban/UI/view.py:
Rename Color.None to Color.Transparent.
* test/test_classification.py, test/test_load.py: Rename Color.None
to Color.Transparent.
2003-04-04 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py: Fix assert calls.
(ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
Copy the color parameter rather than hold onto a reference.
* Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
the color object.
(NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
are sure there exists only one refernce to Color.None in the system.
This allows us to use 'is' rather than the comparision functions.
* Thuban/Model/save.py: Fix assert calls.
* Thuban/UI/classifier.py: Fix assert calls.
(ClassGrid._OnCellDClick): Call up to the classifier to open the
dialog to edit the groups properties.
(ClassGrid._OnCellResize): Make sure that the scollbars are drawn
correctly if a cell is resized.
(ClassTable.SetClassification): New. Changes the classification
that is in the table.
(ClassTable.__SetRow): Allow groups to be prepended.
(Classifier): New code for opening the EditProperties and
GenerateRanges dialogs.
(SelectPropertiesDialog.__GetColor): Only set the color in the
color dialog if the current color is not None.
* Thuban/UI/dock.py: Fix assert calls.
* Thuban/UI/legend.py: Fix assert calls.
* Thuban/UI/renderer.py: Fix assert calls.
* Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
classifications.
(GenRangePanel): Panel specific to range generation.
(GenSingletonPanel): Panel specific to singleton generation.
(ClassGenerator): Class responsible for actually generating
the classification from the data gathered in the dialog box.
(PropertyRamp): Generates properties whose values range from
a starting property to an ending property.
2003-04-03 Bernhard Herzog <bh@intevation.de>
* test/support.py (print_garbage_information): New function that
prints information about still connected messages and memory
leaks.
(run_suite): Removed.
(run_tests): New function for use as a replacement of
unittest.main in the test_* files. This one calls
print_garbage_information at the end.
* test/runtests.py (main): Use support.print_garbage_information
* test/test_layer.py: Use support.run_tests instead of
unittest.main so we get memory leak information
(TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
(TestLayer.test_point_layer, TestLayer.test_empty_layer)
(TestLayerLegend.test_visibility): Call the layer's Destroy method
to fix a memory leak.
* test/test_classification.py: Use support.run_tests instead of
unittest.main so we get memory leak information
(TestClassification.test_classification): Call the layer's Destroy
method to fix a memory leak.
2003-04-02 Bernhard Herzog <bh@intevation.de>
* extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
Handle the reference counts of the return value and errors in
PyArg_ParseTuple correctly.
* Thuban/UI/application.py (ThubanApplication.OpenSession): Make
sure the filename is absolute to avoid problems when saving the
session again
* Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
2003-04-01 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
that there actually are points in the returned list of points
before trying to index into the list. The list may be empty if
the shape is a Null Shape.
2003-04-01 Bernhard Herzog <bh@intevation.de>
* test/test_map.py: Don't use from <module> import *
2003-04-01 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/session.py: Use LAYER_CHANGED instead of
LAYER_LEGEND_CHANGED
* Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
self.Destroy() to close the window after yesterday's changes.
* test/test_map.py, test/test_session.py: Fix messages that
are sent from maps and layers.
2003-03-31 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classifier.py: Commented out some debugging statements.
(ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
RTbug #1769.
* Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
position (although position doesn't work yet under GTK).
(DockableWindow.Destroy): New. Called when the window must be
closed. Namely needed when the DockFrame closes and must close
its children.
(DockFrame): Listen for EVT_CLOSE and destroy all children.
* Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
when then window is told to close.
(LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
comment in source for more info.
* Thuban/UI/main.py: Show the legend by default when Thuban starts.
* Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
symmetry with other such methods.
(MainWindow.ShowLegend): Show the legend docked by default.
2003-03-28 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classifier.py: Support for highlighting a specific
group within the grid when the classification dialog is opened.
Also contains a lot of debugging printouts which will later
be removed.
* Thuban/UI/dock.py: Complete rework on the dock code so that
that it is fairly removed from the rest of the Thuban application.
It is easy to add new docks which the rest of the program having
to be aware of them.
* Thuban/UI/legend.py: Modifications to support selecting a
specific group in the classification dialog. Changed how layers
are drawn when the layer is visible/invisible.
* Thuban/UI/mainwindow.py: Removed legend specific code and
replaced it with calls to the new dock code.
* Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
to check if scale > 0. Trying to track down a divide by zero.
2003-03-26 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
(LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
now part of DockableWindow.
(LegendPanel.DoOnSelChanged): Select the current layer in the
map.
(LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
with the selected layer and/or group.
2003-03-26 Jonathan Coles <jonathan@intevation.de>
This putback contains the code for dockable windows. There is
no support in wxWindows as of this date for windows that can
attach themselves to other windows.
The current model contains a DockableWindow which has a parent
window for when it is detached and a dock window that it puts
its contents in when it is docked. The contents of a DockableWindow
must be a DockPanel. DockPanel itself derives from wxPanel.
* Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
message, not a LAYER_LEGEND_CHANGED message.
* Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
* Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
as one of the style properties for the fieldTypeText item to
be sure that its size is correct when the text changes.
* Thuban/UI/dock.py: New. Classes for the DockPanel and
DockableWindow.
* Thuban/UI/legend.py: Added some more buttons and made the
LegendPanel a DockPanel.
* Thuban/UI/mainwindow.py: Added sash windows to the main window
and supporting functions for manipulating the sashes.
(MainWindow.ShowLegend): Create a DockableWindow with the
LegendPanel as the contents.
* Thuban/UI/messages.py: Added DOCKABLE_* messages
* Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
not LAYER_LEGEND_CHANGED, messages.
2003-03-25 Jonathan Coles <jonathan@intevation.de>
* setup.py: Added custom script bdist_rpm_build_script so that
when the rpm is built the path to wx-config is correct.
* setup.cfg: Added line saying to use the custom build script
2003-03-20 Jonathan Coles <jonathan@intevation.de>
Initial implementation of the Legend.
* Thuban/UI/legend.py: New. Creates a window that shows the map's
Legend information and allows the user to add/modify classifications
and how the layers are drawn on the map.
* setup.py: New command 'build_docs' which currently uses
happydoc to generate html documentation for Thuban.
* Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
Returns a string which is appropriately describes the group.
* Thuban/Model/layer.py (Layer.SetClassification): Generate a
LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
* Thuban/Model/map.py (Map): Rename messages and use new, more
specific, messages.
* Thuban/Model/messages.py: New message to indicate that a layer's
data has changed (LAYER_CHANGED). New map messages to indicate
when layers have been added/removed/changed or if the stacking order
of the layers has changed.
* Thuban/Model/session.py: Rename and use new messages.
* Thuban/UI/classifier.py: Remember if any changes have actually
been applied so that if the dialog is cancelled without an application
of changes we don't have to set a new classification.
(ClassDataPreviewer): Pulled out the window specific code and put it
ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
symbols on any DC.
* Thuban/UI/mainwindow.py: New code to open the legend.
* Thuban/UI/view.py: Use new message names.
2003-03-19 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/main.py (verify_versions): New. Checks the versions
of Python, wxPython, and some other libraries.
* extensions/thuban/wxproj.cpp (check_version): Checks the given
version against what wxproj was compiled with.
(check_version_gtk): If wxproj was compiled with gtk then check
the given version against the version of the gtk library
currently being used.
2003-03-14 Bernhard Herzog <bh@intevation.de>
* test/test_command.py: Run the tests when the module is run as a
script
2003-03-14 Bernhard Herzog <bh@intevation.de>
Implement selection of multiple selected shapes in the same layer:
- Introduce a new class to hold the selection. This basically
replaces the interactor which was nothing more than the
selection anyway. A major difference is of course that the new
selection class supports multiple selected shapes in one layer
- Move the object that represents the selection from the
application to the canvas. The canvas is a better place than the
application because the selection represents which shapes and
layer of the map displayed by the canvas are selected and
affects how the map is drawn.
- Make the selection and its messages publicly available through
the mainwindow.
- The non-modal dialogs do not get a reference to the interactor
anymore as they can simply refer to their parent, the
mainwindow, for the what the interactor had to offer.
* Thuban/UI/selection.py: New module with a class to represent the
selection.
* Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
these unused messages
* Thuban/UI/application.py (ThubanApplication.OnInit)
(ThubanApplication.OnExit, ThubanApplication.SetSession): The
interactor is gone now.
(ThubanApplication.CreateMainWindow): There is no interactor
anymore so we pass None as the interactor argument for now for
compatibility.
* Thuban/UI/view.py (MapCanvas.delegated_messages)
(MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
Unsubscribe, delegate messages according to the delegated_messages
class variable.
(MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
attributes from instance variables as described with the
delegated_methods class variable.
(MapCanvas.__init__): New instance variable selection holding the
current selection
(MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
pass them on to the renderer
(MapCanvas.SetMap): Clear the selection when a different map is
selected.
(MapCanvas.shape_selected): Simple force a complete redraw. The
selection class now takes care of only issueing SHAPES_SELECTED
messages when the set of selected shapes actually does change.
(MapCanvas.SelectShapeAt): The selection is now managed in
self.selection
* Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
(MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
Unsubscribe, delegate messages according to the delegated_messages
class variable.
(MainWindow.delegated_methods, MainWindow.__getattr__): Get some
attributes from instance variables as described with the
delegated_methods class variable.
(MainWindow.__init__): The interactor as ivar is gone. The
parameter is still there for compatibility. The selection messages
now come from the canvas.
(MainWindow.current_layer, MainWindow.has_selected_layer):
Delegate to the the canvas.
(MainWindow.LayerShowTable, MainWindow.Classify)
(MainWindow.identify_view_on_demand): The dialogs don't need the
interactor parameter anymore.
* Thuban/UI/tableview.py (TableFrame.__init__)
(LayerTableFrame.__init__, LayerTableFrame.OnClose)
(LayerTableFrame.row_selected): The interactor is gone. It's job
from the dialog's point of view is now done by the mainwindow,
i.e. the parent. Subscribe to SHAPES_SELECTED instead
of SELECTED_SHAPE
* Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
is gone. It's job from the dialog's point of view is now done by
the mainwindow, i.e. the parent.
* Thuban/UI/classifier.py (Classifier.__init__): The interactor is
gone. It's job from the dialog's point of view is now done by the
mainwindow, i.e. the parent.
* Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
gone. It's job from the dialog's point of view is now done by the
mainwindow, i.e. the parent.
(SessionTreeCtrl.__init__): New parameter mainwindow which is
stored as self.mainwindow. The mainwindow is need so that the tree
can still subscribe to the selection messages.
(SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
(SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
selection is now accessible through the mainwindow. Subscribe to
SHAPES_SELECTED instead of SELECTED_SHAPE
* Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
SHAPES_SELECTED message now.
(IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
so deal with multiple shapes
(IdentifyView.__init__, IdentifyView.OnClose): The interactor is
gone. It's job from the dialog's point of view is now done by the
mainwindow, i.e. the parent.
* Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
parameter is now a list of shape ids.
(RecordTable.SetTable): The second parameter is now a list of
indices.
* Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
selected_shape parameter and ivar to selected_shapes. It's now a
list of shape ids.
(MapRenderer.draw_label_layer): Deal with multiple selected
shapes. Rearrange the code a bit so that the setup and shape type
distinctions are only executed once.
* test/test_selection.py: Test cases for the selection class
2003-03-11 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/load.py: Temporary fix so that the xml reader
doesn't cause Thuban to crash.
* Thuban/Model/layer.py: Handle the cyclic references between
a layer and its classification better, and be sure to disconnect
the classification from the layer when the layer is destroyed
so that we don't maintain a cyclic reference that may not be
garbage collected.
* Thuban/Model/classification.py: See comment for layer.py.
2003-03-12 Jan-Oliver Wagner <jan@intevation.de>
* HOWTO-Release: New. Information on the steps for releasing
a new version of Thuban.
2003-03-11 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
Use True instead of true.
(Classifier): Should have a single panel in which all the controls lie.
* Thuban/UI/proj4dialog.py: Add normal border.
* Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
* Thuban/UI/mainwindow.py: Use True instead of true.
* setup.py: Update some definitions to use wxWindows2.4 files
* Data/iceland_sample_class.thuban: Fixed file so that the
field_type information is present.
2003-03-10 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classifier.py (Classifier.__init__): Make the
field type label grow so that when the text changes the
size is updated correctly. This may be a wxWindows bug.
2003-03-10 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/application.py: Changed SESSION_CHANGED to
SESSION_REPLACED.
* Thuban/UI/classifier.py: Wrap text with _().
(ClassGrid.CreateTable): Set dimensions and size hints here,
instead of in Reset, so we only set the size once.
* Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
* Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
Call Close() instead of Shutdown().
* Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
* Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
Go back to using OnClose() instead of Shutdown().
2003-03-10 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classifier.py (Classifier): SelectField() needed
to know the old field index as well as the new one.
2003-03-10 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classifier.py (Classifier): Use __SelectField()
to correctly set the table information and call this from
__init__ and from _OnFieldSelect so that all the information
is up to date when the dialog opens and when a field is changed.
2003-03-10 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py (Classification): Don't use
layer's message function directly, use the ClassChanged() method
when then classification changes. SetField/SetFieldType/SetLayer
must keep the information about field name and field type in
sync when an owning layer is set or removed.
* Thuban/Model/layer.py: Added ClassChanged() so that the
classification can tell the layer when its data has changed.
(Layer.SetClassification): Accepts None as an arguement to
remove the current classification and correctly handles
adding a new classification.
* Thuban/Model/load.py: Comment out print statement
* test/test_classification.py, test/test_save.py: New and
improved tests.
2003-03-07 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py: Implemented __copy__ and
__deepcopy__ for ClassGroup* and ClassGroupProperites so
they can easily be copied by the classifier dialog.
(ClassGroupProperites.__init__): The default line color should
have been Color.Black.
* Thuban/UI/classifier.py: Setting and Getting table values now
uses a consistent set of functions.
(Classifier): Now non-modal. Has field type label which changes
as the field changes. Keep track of buttons in a list so that
we can enable/disable the buttons when the None field is selected.
(SelectPropertiesDialog): Add buttons to make the colors transparent.
* Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
does what OnClose did, but can be called by the application to
close a window. Needed when a session changes, and we have to
close the classifier windows.
* Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
Shuts down open dialogs. Used when a new session is created
or a session is opened.
(MainWindow.SaveSession): Should only call application.SaveSession()
if we don't call SaveSessionAs first.
(MainWindow.Classify): Allow different classifier dialogs for
different layers.
* Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
the parent class handle it. Add Shutdown() to unsubscibe from
event notification and call the parent Shutdown(). This was
necessary so the application can close the tree window.
2003-03-06 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py: Minor documentation changes,
Addition of __eq__ and __ne__ methods.
(Classification.SetLayer): prevent recursion between this method
and Layer.SetClassification().
* Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
* Thuban/Model/layer.py (SetClassification): prevent recursion
between this method and Classification.SetLayer().
* test/test_classification.py, test/test_load.py,
test/test_session.py: Fixed and added tests for the classification
classes.
2003-03-06 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/classifier.py (ClassGrid.__init__)
(ClassGrid.CreateTable): Move the SetSelectionMode call to
CreateTable because otherwise it triggers an assertion in
wxPython/wxGTK 2.4.
2003-03-05 Jonathan Coles <jonathan@intevation.de>
* Thuban/common.py: Move FIELDTYPE constants back to table.py.
* Thuban/Model/load.py: import FIELDTYPE constants from table.
* Thuban/UI/classifier.py: import FIELDTYPE constants from table.
* Thuban/Model/table.py: Put FIELDTYPE constants back.
2003-03-05 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classifier.py: Added class documentation.
Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
Store just the groups in the table and generate the other
column information when it is requested. Add "None" field
to pull-down to select no classification.
* Thuban/common.py: Moved FIELDTYPE constants from table.py
(Str2Num): Only catch ValueError exceptions.
* Thuban/Model/classification.py: Class documentation. Renaming
of methods with Stroke to Line. Groups are stored in a single
list with the default as the first element. Groups are searched
in the order they appear in the list.
* Thuban/Model/color.py: Documentation.
* Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
the kind of data represented by a field.
* Thuban/Model/load.py (ProcessSession): Use proper string
conversion function; fixes RTbug #1713.
* Thuban/Model/save.py (Saver): Store field type information.
* Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
(Table): Add field_info_by_name() to retrieve field information
by specifying the field name, not the number.
* Thuban/UI/mainwindow.py: Function name changes.
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
get the layer classification once. Don't try to classify
values when the field is None: just use the default properties.
* Thuban/UI/view.py: Function name changes.
* Doc/thuban.dtd: Add field_type attribute to a classification.
2003-03-04 Bernhard Herzog <bh@intevation.de>
* Doc/thuban.dtd: Use correct syntax for optional attributes. Make
the fill and stroke layer attributes optional with suitable
default values. Add the stroke_width layer attribute. Use correct
syntax for empty elements. Make the attribute list for labels
refer to the label element.
2003-03-04 Bernhard Herzog <bh@intevation.de>
* setup.py (thuban_build_py.build): Add a comment about distutils in
Python 2.3 containing some of the functionality we implement in
setup.py ourselves.
* Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
before the selection mode. Doing it the other way round triggers
an assertion in wxWindows.
* Thuban/Model/save.py (escape): Fix typo in doc-string
* Thuban/Model/classification.py: Remove unnecessary wxPython
import
2003-03-04 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py (ClassGroupRange.GetProperties):
Parameter 'value' should default to None.
* Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
the class attribute __classification is now private.
* Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
Classifier to ClassGrid. Added support for removing selected rows,
which including code for keeping track of when cells are selected,
and deselected.
(ClassTable): Support for added/removing rows. Fixed a problem
with __ParseInput whereby it would not allow strings (only numbers)
to be entered.
(Classifier): Added button and supporting code for removing
selected rows.
2003-02-27 Jonathan Coles <jonathan@intevation.de>
* Thuban/common.py: Moved color conversion functions into
Thuban/UI/common.py.
(Str2Num): Now converts the float (not the string) to a long/int
so that an exception isn't thrown.
* Thuban/UI/common.py: Common functions used in several UI modules
* Thuban/Model/classification.py: Changed the class hierarchy
so that a Classification consists of Groups which return
Properties when a value matches a Group.
* Thuban/Model/layer.py: Fixed name resolution problem.
* Thuban/Model/load.py: Use new Classification and Group functions.
* Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
failure.
(Saver.write_classification): Use new Classification and Group
functions.
* Thuban/UI/classifier.py: Changes to use new Classification and Group
functions. Fix to create a tuple with a single value instead of
simply returning the value.
* Thuban/UI/renderer.py: Use new Classification and Group functions.
Use common.py functions.
* Thuban/UI/tree.py: Use common.py functions.
* test/test_classification.py: Use new Classification and Group
classes.
2003-02-24 Jonathan Coles <jonathan@intevation.de>
* Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
functions from Thuban color objects to wxWindow colour objects.
* Thuban/Model/classification.py (Classification): Renamed
GetProperties() to GetClassData(). Used the new iterator
in TreeInfo().
(ClassIterator): Iterator implementation to iterate over the
ClassData objects in a classification object.
* Thuban/Model/save.py (Saver.write_classificaton): Uses
the new iterator to save the classification information.
* Thuban/UI/classifier.py (SelectPropertiesDialog): Support
for changing the stroke and fill colors and previewing the
changes.
* Thuban/UI/mainwindow.py (MainWindow.OpenSession,
MainWindow.SaveSessionAs): Text string changes so the dialogs
have more meaningful titles.
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
Classification method name from GetProperties to GetClassData.
* Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
instead of accessing now non-existent class variables.
2003-02-24 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
unneeded Shape() call. Rendering is substantially faster without
it and it avoids some problems with broken shape files.
2003-02-20 Frank Koormann <frank@intevation.de>
Force minimal size of identify and label dialogs. The autosizing
looked too ugly.
* Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
* Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
Set size of listctrl.
* Thuban/UI/identifyview.py (IdentifyView.__init__):
Set size of dialog.
2003-02-19 Jonathan Coles <jonathan@intevation.de>
* test/test_classification.py, test/test_layer.py,
test/test_load.py, test/test_map.py, test/test_session.py:
Updated the tests to use the new functions that are in the
respective classes.
* Thuban/Model/classification.py (Classification):
Uses the new ClassData* classes. Modification messages are
passed up to the parent layer (if it exists).
(ClassData): New class to encapsulate the common data in each
classification property.
(ClassDataDefault): Represents the Default class. data.
(ClassDataPoint): Represents a single class. data point
(ClassDataRange): Represents a class. range
(ClassDataMap): Represents a class. map (unused).
* Thuban/Model/color.py: Added Color.None to represent something
with no color. Color.Black represents the color black.
(NoColor): Helper class derived from Color to represent something
with no color.
* Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
stroke_width attributes. Made the 'classification' attribute private.
New methods for setting/getting the classification.
* Thuban/Model/load.py (ProcessSession): Use new methods on Layer
to get the classifcation and use the new ClassData* classes to
hold the classification data. Use Str2Num to convert numbers
properly.
* Thuban/Model/save.py (Saver): Use new Color and Classification
methods
* Thuban/UI/classifier.py (ClassGrid): New class to represent a
custom grid.
(ClassTable): Support for editing Values and Labels and for
changing what type (point or range) of data is stored in each
property based on how the user enters the data.
(Classifier): Support for saving the new classifications and
launching the dialog to edit a property.
(SelectPropertiesDialog): New class for editing the visual
properties of a classification (stroke color, width, and fill color)
(ClassPreviewer): Took the Draw method from ClassRenderer and
made most of it into this new class. Intend to use this class in
the SelectPropertiesDialog for previewing changes.
* Thuban/UI/renderer.py: Use new Color and Classification methods.
* Thuban/UI/tree.py: Formatting changes.
* Doc/thuban.dtd: Add 'label' element
* Thuban/common.py: New. Contains common routines used throughout
the code.
(Str2Num): Takes a string and converts it to the "best" type of
number.
2003-02-14 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
dragging flag is always set to 0 even when the tool implementation
raises an exception
2003-02-11 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/application.py (ThubanApplication.splash_screen): New
method to create a splash screen.
(ThubanApplication.ShowMainWindow): New. Show the main window.
Needed so the splash screen can display the mainwindow
(ThubanApplication.OnInit): Call the
new splash_screen method to determine whether the application
should display a splash screen. If it displays a splash screen do
not immediately show the main window.
2003-02-11 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py: Added import line to fix
feature conflicts between running on python2.2 and python2.1.
* Thuban/UI/classifier.py (ClassTable): Didn't need to hang
onto the clinfo parameter, so removed the deepcopy().
2003-02-10 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/save.py (Saver.open_element, Saver.close_element):
Added element_open variable to track opening and closing of tags
so that tags that don't span more than one line are closed with
/> instead of </tag_name>. Use the GetDefault*() methods of
the Classification class.
* Thuban/Model/classification.py (Classificaton): Added set and
get methods for the default data. The class also takes a layer
reference so that modification messages can be sent. Fixed the
methods to use the new ClassData class.
(ClassData): New class to encapsulate the classification data
* Thuban/Model/layer.py (Layer): Remove the
Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
SetDefault*() methods on the layer's classification object.
(Layer.__init__): Use the new SetDefault*() methods in the
Classification class.
* Thuban/Model/load.py (ProcessSession): Use the new ClassData
object instead of a dictionary.
* Thuban/UI/classifier.py (ClassRenderer): New class to
draw the classifications in the dialog box's table.
(Classifier): Modified to use the ClassRenderer class.
* Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
methods of the Classification class.
* Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
of the ClassData class.
* test/test_classification.py, test/test_layer.py,
test/test_map.py, test/test_session.py: Fix the tests to work
with the above code changes.
2003-02-03 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/classification.py (Classification): Added getNull()
to return the NullData reference
* Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
Layer.SetStrokeWidth): Modified these functions to change the
null data in the classification rather than keep these values
directly in the Layer class. Menu options to change these values
work again.
2003-01-28 Jonathan Coles <jonathan@intevation.de>
* Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
Fixed crashing problem on some systems. Dialog box shows
classification data.
* Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
Colors in the tree view.
* Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
the tree info for classifications. Commented out unnecessary lines.
* Thuban/Model/classification.py (Classification.TreeInfo): New
function to add information about the classification into the
tree view.
2003-01-27 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/__init__.py (_): New.
* Thuban/Model/classification.py, Thuban/Model/extension.py,
Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
Thuban/Model/session.py, Thuban/UI/application.py,
Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
2003-01-27 Jonathan Coles <jonathan@intevation.de>
* Thuban/Model/layer.py: Classification initialization calls.
* Thuban/Model/classification.py: Created class to encapsulate
a layer classification. Supports specific data points and
ranges.
* Thuban/Model/load.py: Added support for loading classification
information.
* Thuban/Model/save.py: Added support for saving classification
information.
* Thuban/UI/classifier.py: Initial class for a dialog box for
specifying classification information.
* Thuban/UI/mainwindows.py: Support for opening the classifier
dialog.
* Thuban/UI/renderer.py: Support for drawing a layer with the
classification information.
* Data/iceland_sample_class.thuban: iceland_sample with
classification data.
* test/test_classification: Tests for the Classification class.
2002-12-09 Bernhard Herzog <bh@intevation.de>
* test/test_command.py: New. Tests for the command classes.
* Thuban/UI/command.py (ToolCommand): New class for tool commands.
(Command.IsTool): New method to distinguish between command
switching tools and other commands.
* Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
the tool to avoid direct assignments to instance variables
(MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
(MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
change the tool
* Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
active tool's command turns insensitive, disable the tool.
(_tool_command): Use the new ToolCommand class
* Examples/simple_extensions/simple_tool.py (simple_tool): Use the
SelectTool method to change the tool
(iconfile): Use the ToolCommand class
2002-12-03 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
the case of selected items that are not children of Layers or Maps
properly. Previously this bug would trigger an assertion in
wxWindows.
2002-11-06 Frank Koormann <franmk.koormann@intevation.de>
* Thuban/UI/mainwindow.py: Altered the order of tools in the
toolbar: First now are all navigation tools (Zoom In/Out, Pan,
Full Extent).
2002-10-23 Bernhard Herzog <bh@intevation.de>
* setup.py (setup call): version now 0.1.3
* MANIFEST.in: Add the files in test/
* test/README: Add note about tests requiring the iceland data
* Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
copyright notice.
2002-10-18 Bernhard Herzog <bh@intevation.de>
* test/test_map.py
(TestMapWithContents.test_projected_bounding_box): Use an explicit
epsilon.
* test/support.py (FloatComparisonMixin.assertFloatEqual)
(FloatComparisonMixin.assertFloatSeqEqual): give a more useful
message if the assertion fails and don't return the return value
of self.assert_. In assertFloatSeqEqual the return meant that not
all items of the sequence were compared.
2002-09-20 Bernhard Herzog <bh@intevation.de>
* test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
* Thuban/Lib/fileutil.py: Fixup some whitespace and typos
* test/test_map.py (TestMapWithContents.test_tree_info): Create
the string with the bounding box on the fly because of platform
differences in the way %g is handled.
* test/test_layer.py (TestLayer.test_empty_layer): Create an empty
DBFfile too because Thuban layers can't yet cope missing DBF
files.
2002-09-20 Bernhard Herzog <bh@intevation.de>
* test/test_menu.py: Use initthuban instead of
add_thuban_dir_to_path to initialize Thuban.
* test/support.py (FloatComparisonMixin.assertFloatEqual): New.
Mixin class for float comparisons
(SubscriberMixin): New. Mixin class to test messages sent through
the Connector class
* test/README: Fix a typo and add the -v flag to the command for
individual tests
* test/test_session.py: New. Test cases for Thuban.Model.session
* test/test_proj.py: New. Test cases for Thuban.Model.proj
* test/test_map.py: New. Test cases for Thuban.Model.map
* test/test_layer.py: New. Test cases for Thuban.Model.layer
* test/test_label.py: New. Test cases for Thuban.Model.label
* test/test_connector.py: New. Test cases for Thuban.Lib.connector
* test/test_color.py: New. Test cases for Thuban.Model.color
* test/test_base.py: New. Test cases for Thuban.Model.base
2002-09-13 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/session.py (Session.forwarded_channels): Forward
the CHANGED channel too.
* Thuban/Model/map.py (Map.forwarded_channels): Forward the
CHANGED channel too.
(Map.__init__): Call the Modifiable constructor as well.
* Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
event if the modified flag changes.
(Modifiable.changed): Tweak the doc-string.
* Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
(MainWindow.set_position_text): Put the code that puts the text
with the mouse position into the status bar into the new method
set_position_text so that it can overwritten in derived classes.
2002-09-12 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
message box on the main window.
2002-09-11 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
the 'E' because it's less likely to interfere with other menu
entries.
(MainWindow.build_menu): remove an incorrect comment.
2002-09-10 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.Map): New.
(_tool_command): Add sensitive parameter
(_has_visible_map): Sensitivity callback to tools and other
commands that require a visible map. Use it in map_zoom_in_tool,
map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
and map_full_extent
2002-09-06 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
VIEW_POSITION
2002-09-04 Frank Koormann <frank.koormann@intevation.de>
* Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
2002-09-02 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py: Get rid of the idle redraw. This is done by
wxWindows already and our implementation doesn't work correctly
with wxGTK 2.3:
(MapCanvas.__init__): Remove the instance variable
(MapCanvas.OnPaint): Always call do_redraw when there's a map to
be drawin
(MapCanvas.OnIdle): Removed.
* Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
a parameter to determine the size of the rectangle.
(MapCanvas.find_shape_at): Create the box around the point on a
layer by layer basis and make the size depend on the shape type.
This solves a problem with the selection of point shapes at the
border of the layer's bounding box
2002-08-30 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
for the sensitivity of remove layer.
(_can_remove_layer): New. Sensitivity callback for remove layer
(Command layer_remove): Use _can_remove_layer
* Thuban/Model/map.py (Map.CanRemoveLayer): New method to
determine whether a given layer can be deleted.
* Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
(MapCanvas.do_redraw): Get rid of the unused update_region
instance variable
* Thuban/UI/view.py: Add/update some doc-strings.
* test/: new subdirectory with a bunch of unit tests.
* test/README, test/test_table.py, test/test_save.py,
test/test_menu.py, test/test_load.py: Initial set of tests and
brief instructions on how to run them
2002-08-29 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
arcs with multiple parts.
* Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
Handle degenrate rectangles.
* Thuban/Model/table.py: Make writing records work correctly:
(Table.__init__): Keep track of whether the DBF is open for
writing
(Table.write_record): Open the DBF file for writing when necessary
2002-08-27 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/table.py (Table.write_record, Table.__init__): Open
dbf files only for reading by default. Use a new writable dbf
object for writing.
2002-08-26 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py: Refactor the context creation:
(MainWindow.Context): New method to return a context
(MainWindow.invoke_command, MainWindow.update_command_ui): Use the
new method
* Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
layer table specific code from TableGrid into LayerTableGrid
(TableFrame, LayerTableFrame): Split the layer table specific code
from TableFrame into LayerTableFrame
(LayerTableGrid.select_shape): Remove a debug print
* Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
LayerTableFrame
2002-08-23 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.__init__): Make sure we have an
absolute filename.
2002-08-22 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/table.py (Table.write_record): New method to write
records.
(Table.__init__): Open the DBF file for writing too.
* Thuban/UI/controls.py (RecordTable.SetValue): Write the value
into the underlying table.
* extensions/shapelib/shapefil.h (DBFCommit),
extensions/shapelib/dbfopen.c (DBFCommit): New API function to
commit any changes made to the DBF file.
* Thuban/UI/mainwindow.py (make_check_current_tool)
(_tool_command): Put the code that generates the "checked"
callback into a separate function so that we can reuse it
elsewhere
* Thuban/Model/save.py (Saver): New class to handle serializing a
session into an XML file. The main reason to introduce a class is
that applications built on Thuban can derive from it so that they
can save additional information in a session file.
(save_session): Delegate almost all the work to the Saver class.
Rename the filename argument to file because it may be a file like
object now.
* Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
code. Remove the little test code which would be executed when the
module is run as a script which didn't work anymore since it can't
import the other Thuban modules.
(ProcessSession, load_session): Refactor the ProcessSession to
have one method for each element start and end tag so that derived
classes can easily override the processing of individual tags.
Also, always parse with namespaces enabled because applications
built on top of Thuban will likely use namespaces if they extend
the session file format.
2002-08-21 Bernhard Herzog <bh@intevation.de>
* setup.py (ThubanInstall.run): Don't repr install_lib_orig
because thubaninit_contents will do it for us.
2002-08-16 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
tree window already open
2002-08-15 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
with self.
* Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
when we have actually captured it.
* Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
shapefile and destroy the table.
* Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
2002-08-14 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
instance variable columns
(RecordTable.GetTypeName): row and col may be negative in some
cases.
* setup.py (InstallLocal.initialize_options)
(InstallLocal.finalize_options, InstallLocal.user_options): New
option create-init-file to build a thubaninit.py when running
install_local
(InstallLocal.run): Create the thubaninit.py module when requested
(thubaninit_contents): Split the template into several parts and
create a new function thubaninit_contents that creates the
contents of a thubaninit module.
(ThubanInstall.run): Use the new function to create the thubaninit
module.
2002-07-30 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/application.py (ThubanApplication.OnExit): Do some
cleanup.
(ThubanApplication.MainLoop): Extend to automatically call OnExit.
* Thuban/Model/session.py (Session.Destroy): Don't bypass the
direct base class' Destroy method.
* Thuban/Model/map.py (Map.ClearLayers): New method to delete all
layers.
(Map.Destroy): Destroy the label_layer as well and call the
inherited Desatroymethod first so that no more messages are
issued.
(Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
message if the stacking order actually has changed. Add
doc-strings.
(Map.BoundingBox): Correct the doc-string.
(Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
(Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
* Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
all labels.
2002-07-29 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/map.py (Map.subscribe_layer_channels)
(Map.unsubscribe_layer_channels): Put the code that (un)subscribes
to a layer's channels into separate methods.
(Map.RemoveLayer, Map.AddLayer): Call the new methods
(Map.Destroy): Unsubscribe from a layer's channels before
destroying it.
* Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
selected_layer parameter to searched_layer which is the layer to
search in.
(MapCanvas.SelectShapeAt): New parameter layer to restrict the
search to that layer. Return the selected layer and shape.
* Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
typo
2002-07-24 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/application.py (ThubanApplication.create_session):
Extend the doc string.
(ThubanApplication.subscribe_session)
(ThubanApplication.unsubscribe_session): New methods to
subscribe/unsubscribe to/from session channels.
(ThubanApplication.SetSession): Call the new methods here.
(ThubanApplication.maps_changed, ThubanApplication.set_map):
Renamed set_map to maps_changed. Its now a subscriber for
MAPS_CHANGED.
* Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
x-coordinate in case of simple clicks
* Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
don't pass it as a parameter
* Thuban/Model/session.py (Session.RemoveMap): New
* Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
window size into a parameter.
2002-07-23 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/menu.py (Menu.item_index): Also search for menus not
just commands.
* Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
parameter list a bit to allow setting the window title and the
initial message in the status bar. Update the callers.
* Thuban/UI/application.py (ThubanApplication.OnInit)
(ThubanApplication.CreateMainWindow): Put the mainwindow
instantiation into a separate method so that it can be overridden
by a subclass.
2002-07-19 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/session.py: Issue a CHANGED message every time
another changed message is issued to make it easier to get
notified of changes.
(Session): Update the doc string
(Session.forward): Issue changed-events as CHANGED as well.
(Session.changed): Overwrite the inherited version to issue
CHANGED events as well.
* Thuban/UI/tree.py: We can now simply subscribe to the session's
CHANGED channel to be informed of changes.
(SessionTreeCtrl.session_channels): Not needed any longer.
(SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
Only have to (un)subscribe CHANGED
* Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
* Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
for the wxPython locale bug to __init__.py so that it's
automatically executed by anybody using UI code from Thuban.
2002-07-18 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/main.py (main): app no longer needs to be global
* Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
as parameter and store it in an instance variable
(MainWindow.invoke_command, MainWindow.update_command_ui)
(MainWindow.save_modified_session, MainWindow.NewSession)
(MainWindow.OpenSession, MainWindow.SaveSession)
(MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
application object.
* Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
the main window with self.
* Thuban/UI/context.py: New module with the context class
* Thuban/UI/command.py (Command): Update doc string.
* Thuban/UI/mainwindow.py (MainWindow.invoke_command,
MainWindow.update_command_ui): Pass an instance of the context
class to the command's methods
(check_current_tool, call_method): Handle the new context
implementation
* Examples/simple_extensions/simple_tool.py (simple_tool,
check_simple_tool): Handle the new context implementation
* Examples/simple_extensions/simple_command.py (simple_command):
Handle the new context implementation. Update the comments about
the context.
* Thuban/UI/application.py (ThubanApplication.SetSession): Add
doc-string
(ThubanApplication.Session): New method to return the session
object
* Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
interactor's selected_layer may not be a layer of the current
session when the tree is updated while a new session is being set.
2002-07-17 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/tree.py (color_string): Removed. No longer used.
(SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
update_tree into update_tree and add_items. The tree now uses a
more generic way to display the contents of the tree.
(SessionTreeCtrl): Add a doc string explaining the TreeInfo method
* Thuban/Model/layer.py (Layer.TreeInfo),
Thuban/Model/extension.py (Extension.TreeInfo),
Thuban/Model/map.py (Map.TreeInfo),
Thuban/Model/session.py (Session.TreeInfo):
Add TreeInfo methods to implement the new tree view update scheme
2002-07-16 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/application.py: Don't use "import from" for the
MainWindow. It can't always be resolved.
(ThubanApplication.OnInit): change reference to MainWindow
accordingly.
* Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
completely
2002-07-10 Bernhard Herzog <bh@intevation.de>
* setup.py (create_init_module): New configurable variable whose
default depends on the platform we're running on.
(ThubanInstall.initialize_options): Initialize
self.create_init_module from the global create_init_module
(ThubanInstall.user_options): indictate that the options
create-init-module and init-module-dir have arguments.
* setup.py: In the setup call change the version number to include
cvs.
* MANIFEST.in: Add the files in Examples
2002-07-09 Bernhard Herzog <bh@intevation.de>
* setup.py: In the setup call, use the thuban homepage as the
value of the url parameter.
* Examples: New subdirectory for examples.
* Examples/simple_extensions/simple_tool.xpm,
Examples/simple_extensions/simple_tool.py,
Examples/simple_extensions/simple_command.py,
Examples/simple_extensions/README: Simple examples showing how to
add new commands and tools.
* setup.cfg (bdist_rpm): Add the default value for prefix and tell
bdist_rpm that we also have an install script.
(bdist_inno): Add 2002 to the copyright notice.
* setup.py: Create a file in python's site-packages directory to
make installation of Thuban as a library easier.
(ThubanInstall.user_options): Add two new options,
create-init-module and init-module-dir
(ThubanInstall.expand_with_pure_python_dirs): New method to expand
filenames for installation in the default directories.
(ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
the inherited methods to capture some filenames before they're
transformed too much by distutils.
(ThubanInstall.run): Create the init module if requested.
(ThubanInstall.thuban_init_filename): New method to return the
full name of the init module.
(ThubanInstall.get_outputs): Append the filename of the init
module.
2002-07-08 Bernhard Herzog <bh@intevation.de>
* setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
handle the prefix properly which means that the default for the
installation prefix should be /usr for RPMs and /usr/local when
doing a normal source install.
(bdist_rpm_install_script): Script to override the default install
commands in the specfile generated by the bdist_rpm command.
(thuban_bdist_rpm.user_options): Add a prefix option
(thuban_bdist_rpm.initialize_options): Init the prefix option.
Create the script files for the spec files as empty files here
(thuban_bdist_rpm._make_spec_file): Override the inherited method
to fill the script files with content.
* Thuban/Model/save.py (relative_filename): Wrapper around
Thuban.Lib.fileutil.relative_filename that accepts an empty dir
argument. save_session now automatically uses this version,
solving a problem when saving to a relative filename.
* setup.py: In the setup call, make sure that the library
directories are under $prefix/lib not directly under $prefix.
2002-06-20 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/Model/extension.py: new module to handle extension objects.
* Thuban/Model/messages.py: new messages for extensions.
* Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
Session.AddExtension): new for handling extensions.
Also some other minor changes to round up extension handling.
* Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
of Extension titles and title and names of its objects.
2002-05-29 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
the events for a command.
(MainWindow.add_toolbar_command, MainWindow.add_menu_command):
Call bind_command_events to bind the events. add_toolbar_command
can now bind events too so that it's possible to have commands
that are only available through the toolbar.
(MainWindow.init_ids): New instance variable events_bound to keep
track of for which commands events have been bound.
2002-05-28 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/menu.py: New module to build and manage menus.
* Thuban/UI/mainwindow.py: Remove some unused imports.
(MainWindow.__init__, main_menu): move the definition of the main
menu from __init__ to the Menu instance main_menu.
(MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
build the menu bar and sub-menus from a menu description.
* Thuban/UI/application.py (ThubanApplication.OnInit): Read the
startup file
(ThubanApplication.read_startup_files): New method to run
~/.thuban/thubanstart.py
* Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
Move the toolbar definition to the Menu instance main_toolbar.
(MainWindow.build_toolbar): New method to build the toolbar
similar to the build_menu methods
2002-05-23 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
layer_outline_color. Fix it in the definition of the command too.
* Thuban/UI/command.py (Command): Fix typo in doc string
2002-05-22 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
in the docstring
2002-05-15 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
when the shapefile is empty.
(Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
now return None for empty shapefiles. Update doc-strings.
* Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
the layer's bbox being None.
* Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
layer's bbox being None.
* Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
necessary.
(MapCanvas.__init__): New instance variables, last_selected_layer
and last_selected_shape to determine how the selection has
changed.
* Thuban/UI/tableview.py (TableGrid.__init__): Do not call
AutoSizeColumns because it will cause a traversal of the entire
table which for large .dbf files will take a very long time.
2002-05-14 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
maximum depth for the tree than shapelib does by default.
2002-05-10 Bernhard Herzog <bh@intevation.de>
* setup.py (py_modules): The shptree modules doesn't have a
wrapper, so don't include it in the py_modules
2002-05-08 Bernhard Herzog <bh@intevation.de>
* extensions/shapelib/shptree.c (compare_ints): Make arguments
const void * as in the qsort prototype
(SHPTreeFindLikelyShapes): Remove some unused variables.
* Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
maintains to redraw the window during a drag.
(MapCanvas.unprojected_rect_around_point): New method to determine
a small region around a point for hit-testing.
(MapCanvas.find_shape_at): Only test the shapes in a small region
around the point.
* setup.py: Increment the version to 0.1.2
* Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
debug print and set session to None after unsubscribing
2002-05-07 Bernhard Herzog <bh@intevation.de>
* Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
the file to have a .thuban extension.
* Thuban/UI/tree.py (session_channels): New class constant with
all the session channels to subscribe to to update the tree
(SessionTreeCtrl.session_changed): Remember the session so that we
can unsubscribe properly. Use the new class constant to
unsubscribe from the old session and subscribe to the new one.
(SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
subscriptions of the SessionTreeCtrl.
(SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
* Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
Session Tree" command to the file menu.
* Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
as update_region to the renderer.
* Thuban/UI/renderer.py
(ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
update box is now directly a tuple, not a wxRect anymore.
* Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
prints.
2002-05-07 Bernhard Herzog <bh@intevation.de>
* setup.py: Add the shptree extension module. See
extensions/pyshapelib/ChangeLog for more details.
* extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
extensions/shapelib/dbfopen.c: Really update to the versions of
shapelib 1.2.9. For some reason it wasn't really done on
2002-04-11.
* extensions/shapelib/shptree.c: Modified version of shptree.c of
shapelib 1.2.9. The only real difference is the use of qsort
instead of a bubble sort implementation
* Thuban/Model/layer.py (Layer.__init__): New instance variable
shapetree to hold the shapelib quadtree for the shapefile
(Layer.open_shapefile): Create the quad tree.
(Layer.ShapesInRegion): New method to return the ids of shapes in
a given region using the quad tree.
* extensions/thuban/wxproj.cpp (project_points): Fix some typos in
comment
(draw_polygon_shape): Accept both arcs and polygons.
(initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
the api.
* Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
return the shape ids to be rendered in a given layer.
(MapRenderer.draw_shape_layer): Call layer_ids to get the list of
ids. Use draw_polygon_shape to draw arc shapes as well.
(ScreenRenderer.RenderMap): New parameter for the rectangle that
has to be updated
(ScreenRenderer.layer_ids): Make use of the layer's quadtree by
calling it's ShapesInRegion method.
* Thuban/UI/view.py (MapCanvas.__init__): New instance variable
update_region for the update region.
(MapCanvas.OnPaint): Maintain the update region
(MapCanvas.do_redraw): Pass the bounding box of the update_region
to the renderer when drawing the bitmap. Reset the update_region.
2002-05-03 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
MainWindow.OpenSession): Change the file extension of the session
files to .thuban
* Thuban/Model/session.py (Session.AddMap, forwarded_channels):
Move the map channels to be forwarded by the session into the
class constant with forwarded_channels. Also add
LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
forwarded_channels
* Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
typo and some rewording).
2002-05-02 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py: Keep the temporary bitmap used during drawing
around to speed up most redraws:
(MapCanvas.__init__): New instance variable bitmap which holds the
bitmap
(MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
self.bitmap to draw.
(MapCanvas.full_redraw): New method to force a full redraw
including the bitmap
(MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
make sure the bitmap is redrawn.
(MapCanvas.projection_changed, MapCanvas.set_view_transform,
MapCanvas.shape_selected): Call full_redraw instead of readraw to
make sure the bitmap is redrawn.
(MapCanvas.OnSize): New method to handle size events so that the
bitmap can be redrawn.
2002-04-29 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
canvas' VIEW_POSITION event
(MainWindow.view_position_changed): Handler for VIEW_POSITION.
Update the text in the status-bar accordingly.
* Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
(MapCanvas.__del__): Implement because Publisher.__del__ has to be
called.
(MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
current_position
(MapCanvas.set_current_position): New method to set
current_position. Issue a VIEW_POSITION event
(MapCanvas.CurrentPosition): New public method to return the value
of current_position. Should be called when the VIEW_POSITION event
is processed.
(MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
Update the position.
(MapCanvas.OnLeaveWindow): Set the position to None.
* Thuban/UI/messages.py (VIEW_POSITION): New message for the
position in the statusbar
2002-04-26 Frank Koormann <frank@intevation.de>
* Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
2002-04-24 Frank Koormann <frank@intevation.de>
* Resources/Bitmaps/identify.xpm: shadow added
* Resources/Bitmaps/fullextent.xpm: new
2002-04-22 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/tree.py (update_tree): added test for None on map bounding
box
2002-04-21 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
* Thuban/UI/tree.py (update_tree): added added map extent
* Thuban/UI/mainwindow.py (_method_command): extended by parameter
icon; added map_full_extend as tool
2002-04-19 Jan-Oliver Wagner <jan@intevation.de>
* Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
saving _new_ sessions
* Thuban/Model/session.py (create_empty_session): new session
don't have a filename (set to None)
* Thuban/UI/tree.py (update_tree): added filename and modified flag
* Thuban/Model/load.py (ProcessSession): convert projection
parameters from unicode to regular string
* Data/iceland_sample.session: Added UTM Zone 26 projection.
2002-04-11 Bernhard Herzog <bh@intevation.de>
* extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
extensions/shapelib/dbfopen.c: Update to the versions of shapelib
1.2.9
* setup.py (Lib.wxproj extension): Don't link shpopen.c and put
the pyshapelib directoy into the list of include dirs, so that
pyshapelib_api.h can be found.
* extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
holds the pyshapelib C-API
(draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
pyshapelib_api to access the shapelib functions.
(initwxproj): Import the c_api from the shapelib module and
initialize pyshapelib_api.
2002-04-04 Bernhard Herzog <bh@intevation.de>
* setup.py (thuban_bdist_rpm.initialize_options): Use
initialize_options to create the scripts for the rpm.
* extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
2002-04-03 Bernhard Herzog <bh@intevation.de>
* setup.py: Increment version to 0.1.1
* Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
Layer" and "Remove Layer" commands from the layer menu to the map
menu
2002-02-15 Bernhard Herzog <bh@intevation.de>
* Thuban/Model/layer.py (Layer.Shape): list append only takes one
argument (python <= 1.5.2 erroneously accepted multiuple
arguments)
2002-02-04 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
RecordGrid in the identifyview.
(IdentifyView.__init__): Use IdentifyGridCtrl instead of
IdentifyListCtrl. The grid allows editing of the values.
* Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
implementing a grid for a single row of a thuban table.
* Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
layers by default. Easier to use than the previous default of only
searching through the select layer which meant that if no layer
was selected, you couldn't select a shape.
* Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
* Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
stroke_width attribute
* Thuban/Model/save.py (save_session): Write the new stroke_width
attribute
* Thuban/Model/load.py (ProcessSession.startElement): Read the
stroke_width attribute
* Thuban/Model/layer.py (Layer.__init__): New parameter and
instance variable stroke_width
(Layer.SetStrokeWidth): Set the stroke_width.
2002-02-01 Bernhard Herzog <bh@intevation.de>
* extensions/thuban/wxproj.cpp (project_points): Fix two
off-by-one errors in the last loop that joins the various parts
together.
2002-01-14 Bernhard Herzog <bh@intevation.de>
* setup.py (data_dist.make_distribution): Fix some typos
2001-09-18 Bernhard Herzog <bh@intevation.de>
* README: Slight tweaking in preparation for the 0.1 release
* setup.cfg: Add section for sdist to create both tgz and zip
archives
* setup.py: increase version number to 0.1
(data_dist): New command class for data distribution
2001-09-14 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
Handle the case of no layer (i.e. layer is None) properly.
* Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
Set the initial selection of the combo boxes to reflect the
projection we're starting with in a way that works on windows,
too.
* Thuban/Lib/connector.py (Connector.print_connections): Print the
puiblisher's ids in hex to make it easier to compare them to the
standard repr of python methods
* Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
messages
2001-09-13 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
deselect the layer if no layer is selected
* Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
idle time when there actually is something to draw. If there's
nothing to draw simply clear the window
(MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
(MapCanvas.SetMap): force a redraw in all cases because
FitMapToWindow doesn't always do it.
(MapCanvas.ZoomFactor): Add an optional parameter, center, to
specify the point to move into the center of the window
(ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
dragged, zoon in/out by a factor of 2
(MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
index, i.e. reversed drawing order) so that objects appearing to
be in from of others are selected first. This is probably mostly
relevant for point shapes where the symbols used may overlap
* Thuban/Model/session.py (create_empty_session): Unset the
modified bit before returning it
* Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
create_empty_session session to create the new, empty session.
* Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
the tool bitmaps.
(MainWindow.OnClose, MainWindow.save_modified_session): Separate
the code that asks whether the session should be saved into the
new method save_modified_session.
(MainWindow.OpenSession, MainWindow.NewSession): Use the new
method to save modified session here too.
2001-09-11 Bernhard Herzog <bh@intevation.de>
* setup.py (InnoIconItem): fix typo
(thuban_bdist_inno.run):
(bdist_inno.run): Move the decision not to create symlinks on
non-nt platforms to thuban_bdist_inno and do it unconditinally
since we never want to create the symlinks here
2001-09-10 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
identify view immediately
* Thuban/UI/controls.py: New file with two classes RecordListCtrl
and SelectableRecordListCtrl that implement the code shared by the
identify view and the label dialog
* Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
new class RecordListCtrl
* Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
return value of GetValue is None instead of using it as a boolean
directly so that Zero numbers are handled properly.
(LabelListCtrl): Derive from the new class
SelectableRecordListCtrl
* Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
(Proj4Dialog.dialogLayout): Make the window resizable and set the
size of the text control explicitly to make the sizers work on
both Windows and X.
2001-09-07 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
that can limit the search to the currently selected layer.
(MapCanvas.SelectShapeAt): Make sure that the currently selected
layer stays selected even when no shape is found
(MapCanvas.FitRectToWindow): If the rect has zero with or zero
height do nothing (avoids zero division errors)
2001-09-06 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
Correct the spelling of SessionTreeCtrl. dabbrev is too damn
convenient :-)
(SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
a new instvar layer_to_item to map layers to tree items
(SessionTreeCtrl.layer_selected): Select the appropriate tree item
to match the current selection in the interactor
* Thuban/UI/interactor.py (Interactor.SelectedLayer):
(Interactor.HasSelectedLayer): New methods to query the current
selection
* Thuban/UI/mainwindow.py (MainWindow.current_layer):
(MainWindow.has_selected_layer): Simply call the appropriate
interactor method
* Thuban/UI/mainwindow.py (MainWindow.__init__):
(MainWindow.LayerShowTable):
(MainWindow.identify_view_on_demand): Store the interactor in an
instvar and use that reference instead of going through main.app
* Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
* Thuban/UI/application.py (ThubanApplication.OnInit):
* Thuban/UI/main.py (main): Create the session tree view in main
with the new mainwindow method ShowSessionTree and not directly
the application's OnInit method
* Thuban/UI/tree.py (myTreeCtrlPanel):
(SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
TreeCtrl isntead of a panel. This affects most method since we now
refer to self instead of self.tree
(SessionTreeView): New class implementing a non-modal dialog
showing the session tree.
* Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
layer to the tableview dialog.
* Thuban/UI/tableview.py: Add some doc-strings
(TableGrid):
(TableGrid.OnRangeSelect):
(TableGrid.OnSelectCell):
(TableFrame.__init__):
(TableFrame.row_selected):
Selecting rows in the grid view now updates the selected shapes
through the TableFrame. To achieve this we derive TableGrid from
Publisher and introduce the message type ROW_SELECTED which the
TableFrame subscribes to and which is issued by OnRangeSelect and
OnSelectCell
(DataTable.SelectRow): Removed because it's no longer needed in
the row/shape selection scheme
* Thuban/UI/dialogs.py: New file implementing common classes for
dialogs
* Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
the SELECTED_SHAPE message anymore. This is now handled by the
parent.
(TableGrid.select_shape): Only update the selection if the shape
is not None.
(TableFrame): Inherit from the new NonModalDialog class.
(TableFrame.__init__, TableFrame.select_shape): Handle the
SELECT_SHAPE message.
(TableFrame.OnClose): Extend the inherited method to unsubscribe
SELECT_SHAPE
* Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
(MainWindow.add_dialog):
(MainWindow.dialog_open):
(MainWindow.remove_dialog):
(MainWindow.get_open_dialog): New methods to maintain a dictionary
of opened non-modal dialogs.
(MainWindow.__init__): Initialize the new non-modal dictionary
management code
(MainWindow.LayerShowTable): maintain separate dialogs for each
table using the non-modal dialog management code to only open a
view once for each table.
(MainWindow.IdentifyTool):
(MainWindow.__init__):
(MainWindow.identify_view_on_demand): Don't open the identify view
in IdentifyTool anymore. This will be done automatically by the
new method identify_view_on_demand which handles the
SELECTED_SHAPE message so that the identify view will be opened on
demand
* Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
the interactor argument. The SELECTED_SHAPE message is now handled
by the parent.
(IdentifyView.__init__): Add the interactor argument so that we
can handle the SELECTED_SHAPE message here
(IdentifyView.selected_shape): New method to handle the
SELECTED_SHAPE messages
* Thuban/UI/identifyview.py (IdentifyView): Derive from the new
NonModalDialog class
(IdentifyView.OnClose): Extend the inherited version to
unsubscribe SELECT_SHAPE
* Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
2001-09-05 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
* Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
interactor to pass through to the MapCanvas
* Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
argument to the MainWindow constructor to get rid of the ugly hack
that made main.app available early just so that the mapcanvas
could access the interactor object.
2001-09-04 Bernhard Herzog <bh@intevation.de>
* Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
that runs a modal message box
(MainWindow.OnClose): Use the new method
(MainWindow.RemoveLayer): Just do nothing in case no layer is
selected. The command should be grayed out anyway, so there's no
need to pop up a message box.
(MainWindow.AddLayer): Pop up a message box with an error message
if the shape file can't be opened
* Thuban/Model/layer.py (Layer.__init__): Open the shapefile
immediately. This will cause an exception in case the file can't
be opened and we can display an appropriate message.
* MANIFEST.in: Add extensions/pyprojection/LICENSE
* setup.py (thuban_bdist_rpm): New class implementing a Thuban
specific bdist_rpm command.
* Thuban/UI/main.py: Catch ImportError exceptions when importing
the locale module because it may not be available on some
installations.
* extensions/pyprojection/LICENSE: Copy of the license text in
Projection.i. Having it in a separate file makes it easier to
refer to license text in e.g. RPMs
2001-09-03 Bernhard Herzog <bh@intevation.de>
* setup.py: use wx-config instead of wxgtk-config because it's
more generic
* setup.py (ThubanInstall.get_outputs): Add the symlink in
<prefix>/bin to the outputs
(ThubanInstall.link_file): New method to link files. We need this
because the standard copy_files refuses to link non-existing
files.
(ThubanInstall.run): Remove the leading install root from the
script filename if an install root was specified and use the new
link_file method
* Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
the window when the first layer is added to the map.
* setup.py (ThubanInstall.run): Honor the build root (self.root)
when linking thuban.py to <prefix>/bin
2001-08-31 Bernhard Herzog <bh@intevation.de>
* setup.py: In the setup call, the install parameters shouldn't
have trailing slashes because distutils on non-posix platforms
doesn't like that. The same applies to other directories like
"Resources/Bitmaps"
In the configuration section for nt, move the wxWindows directory
optins into the part clearly marked as editable.
(InstallLocal.initialize_options):
(InstallLocal.user_options): remove the currently unused debug
flag
(thuban_build_py.find_all_modules): Add this method so that it
works for our case of having packages and modules in one
distribution as well.
(ThubanInstall.initialize_options):
(ThubanInstall.finalize_options):
(ThubanInstall.user_options):
(ThubanInstall.boolean_options): Add new options, do-symlink and
extra files. Since these are the first ThubanInstall specific
options, override user_options and boolean_options
(ThubanInstall.run): Honor the new do-symlink and extra-files
options.
(ThubanInstall.get_outputs): Add to override the base-class's
version and add the extra-files to the outputs
(bdist_inno): New class for windows distributions with Inno Setup
(InnoIconItem): Helper class for bdist_inno
(thuban_bdist_inno): Thuban specific version of bdist_inno. Added
this together with the appropriate parameters, to the setup call.
* setup.cfg (bdist_inno): added new section for the inno setup
installer
* Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
changing_selection to avoid recursive selection events when
modifying the selection in response to a selection event.
(myTreeCtrlPanel.normalize_selection): Set the new inst var when
changing the tree's selection.
(myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
we're not being called indirectly from normalize_selection.
* Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
event.Check only if the command is actuall checkable.
(MainWindow.__init__): Call the toolbar's Realize method to make
sure that the items are actually shown
2001-08-28 Bernhard Herzog <bh@intevation.de>
* setup.py: Fix some doc strings
* ChangeLog: started
|