Forum QGIS
Akcje Pythona - dodawanie warstw do grupy - Wersja do druku

+- Forum QGIS (http://forum.quantum-gis.pl)
+-- Dział: Desktop GIS (http://forum.quantum-gis.pl/forum-4.html)
+--- Dział: QGIS (http://forum.quantum-gis.pl/forum-5.html)
+--- Wątek: Akcje Pythona - dodawanie warstw do grupy (/thread-553.html)

1 2


RE: Akcje Pythona - dodawanie warstw do grupy - tomalos - 21-09-2011

Akcie działają aż miło Smile Bardzo mi pomogliście... ale są jeszcze dwie drobnostki.

1. Nie potrafię sobie poradzić z polskimi znakami z "ogonkami" (wychodzą krzaczki) jeśli pojawiają się w nazwie gminy, dla której obiekty dodaję akcją:
qgis.utils.iface.addVectorLayer (u"dbname='mojabaza' host=192.168.0.1 port=5432 key='gid' table='obiekty'(the_geom)sql=id LIKE '%ident%'",'%NazwaGm','postgres')
Zresztą tak jest zawsze jak dodaję warstwy akcją Pythona a w nazwie dodanej warstwy na wystąpić polski znak z "ogonkiem".

2. Warstwy rastrowe dodane akcją Pythona do konkretnej grupy lądują co prawda w grupie, jednak zachowują się jakby leżały "na wierzchu". Włączenie i wyłączenie wyświetlania dodanej warstwy przywołuje ją do porządku.

Jesteście w stanie poradzić coś na te drobnostki?


RE: Akcje Pythona - dodawanie warstw do grupy - Rayo - 21-09-2011

(21-09-2011, 19:16)tomalos napisał(a): 1. Nie potrafię sobie poradzić z polskimi znakami z "ogonkami" (wychodzą krzaczki) jeśli pojawiają się w nazwie gminy, dla której obiekty dodaję akcją:
qgis.utils.iface.addVectorLayer (u"dbname='mojabaza' host=192.168.0.1 port=5432 key='gid' table='obiekty'(the_geom)sql=id LIKE '%ident%'",'%NazwaGm','postgres')
Zresztą tak jest zawsze jak dodaję warstwy akcją Pythona a w nazwie dodanej warstwy na wystąpić polski znak z "ogonkiem".

Dodanie litery 'u' przed nazwą warstwy powinno pomóc. Tzn zapis powinien wyglądać tak:

Kod:
qgis.utils.iface.addVectorLayer (u"dbname='mojabaza' host=192.168.0.1 port=5432 key='gid' table='obiekty'(the_geom)sql=id LIKE '%ident%'",u'%NazwaGm','postgres')

Cytat:2. Warstwy rastrowe dodane akcją Pythona do konkretnej grupy lądują co prawda w grupie, jednak zachowują się jakby leżały "na wierzchu". Włączenie i wyłączenie wyświetlania dodanej warstwy przywołuje ją do porządku.

Co znaczy, że zachowują się jakby były na wierzchu? Na mapie przykrywają inne warstwy?


RE: Akcje Pythona - dodawanie warstw do grupy - tomalos - 21-09-2011

Cytat:Co znaczy, że zachowują się jakby były na wierzchu? Na mapie przykrywają inne warstwy?

Dokładnie tak. Po przesunięciu warstwy wyżej lub niżej albo wyłączeniu i włączeniu jej wyświetlania problem znika.


RE: Akcje Pythona - dodawanie warstw do grupy - p0cisk - 21-09-2011

Cytat:2. Warstwy rastrowe dodane akcją Pythona do konkretnej grupy lądują co prawda w grupie, jednak zachowują się jakby leżały "na wierzchu". Włączenie i wyłączenie wyświetlania dodanej warstwy przywołuje ją do porządku.
Też to zauważyłem. Wygląda mi to na bug. Czy dodanie na końcu polecenia
Kod:
qgis.utils.iface.mapCanvas().refresh()
rozwiązuje ten problem?
Jeszcze kwestia bardziej skomplikowanych skryptów Pythona odpalanych z akcji. Można stworzyć plik .py w katalogu z projektem i go zaimportować w akcji, a następnie uruchomić z niego dowolną funkcję,do której można przekazać parametry z tabeli atrybutów.W pliku trzeba tylko pamiętać o imporcie odpowiednich modułów żeby wszystko działało.


RE: Akcje Pythona - dodawanie warstw do grupy - Rayo - 21-09-2011

Może brak odświeżania mapy po zmianie jej pozycji w legendzie nie jest błędem, ale celowym zamysłem. Jeżeli akcja zmieniałaby pozycję kilku (-nastu, -dziesięciu) warstw, a program po każdej warstwie odświeżał widok to trwałoby to dosyć długo.
Niektóre działania na mapie z poziomu Pythona powodują automatyczne jej odświeżanie i czasami pisząc wtyczkę/akcję lepiej na początku wyłączyć renderowanie, a dopiero na końcu kodu włączyć je z powrotem i odświeżyć mapę. Na pewno przyspieszy to działanie.


RE: Akcje Pythona - dodawanie warstw do grupy - tomalos - 22-09-2011

Po dodaniu warstwy akcją (zarówno wektorowej jak i rastrowej) ładowała się ona w domyślnym stylu pomimo zadeklarowania w akcji stylu z pliku, jednak nie było to problemem bo jakiekolwiek przesunięcie mapy ją odświeżało. Dodanie na końcu polecenia
Kod:
qgis.utils.iface.mapCanvas().refresh()
podziałało na styl, warstwy ładują się z tym poleceniem od razu w zadeklarowanym stylu.

Okazało się jednak, że warstwy (rastrowe i wektorowe) po załadowaniu akcją do jakiejś grupy wyświetlają się jakby "nie wiedziały", że są w tej grupie i przykrywają wszystkie załadowane do projektu warstwy, dodanie do akcji polecenia
Kod:
qgis.utils.iface.mapCanvas().refresh()
nie wpływa na kolejność wyświetlania a jedynie na styl wyświetlania. Odświeżenie widoku przyciskiem "Odśwież" też tego nie zmienia.

Aha, dodanie litery 'u' przed nazwą warstwy nie pomogło, nadal są krzaczki zamiast polskich znaków z ogonkami.


RE: Akcje Pythona - dodawanie warstw do grupy - Rayo - 22-09-2011

(22-09-2011, 08:39)tomalos napisał(a): Okazało się jednak, że warstwy (rastrowe i wektorowe) po załadowaniu akcją do jakiejś grupy wyświetlają się jakby "nie wiedziały", że są w tej grupie i przykrywają wszystkie załadowane do projektu warstwy, dodanie do akcji polecenia
Kod:
qgis.utils.iface.mapCanvas().refresh()
nie wpływa na kolejność wyświetlania a jedynie na styl wyświetlania.
Odświeżenie widoku przyciskiem "Odśwież" też tego nie zmienia.

To jest chyba jakiś błąd. Odświeżanie wywołane z Pythona też nie poprawia sytuacji. Trzeba to wziąć sposobem. Dopisz na końcu polecenia, które wyłączą i włączą warstwę.

Kod:
qgis.utils.iface.legendInterface().setLayerVisible (layer, False); qgis.utils.iface.legendInterface().setLayerVisible (layer, True)

Sprawdziłem, pomaga. Nie sprawdzałem tylko, czy odświeży też styl i będzie można zrezygnować z

Kod:
qgis.utils.iface.mapCanvas().refresh()

(22-09-2011, 08:39)tomalos napisał(a): Aha, dodanie litery 'u' przed nazwą warstwy nie pomogło, nadal są krzaczki zamiast polskich znaków z ogonkami.

W takim razie nazwę warstwy zapisz następująco:

Kod:
unicode('%NazwaGm','UTF-8')



RE: Akcje Pythona - dodawanie warstw do grupy - tomalos - 23-09-2011

Udało się, wszystko działa, dzięki.
A polecenie
Kod:
qgis.utils.iface.legendInterface().setLayerVisible (layer, False); qgis.utils.iface.legendInterface().setLayerVisible (layer, True)
odświeży styl i można już zrezygnować z
Kod:
qgis.utils.iface.mapCanvas().refresh()
.