Forum QGIS
Python - 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: Python (/thread-332.html)

1 2 3


RE: Python - Rayo - 23-12-2010

Dzięki, działa.
Ale komunikat w przypadku popełnienia błędu jest rewelacyjny Smile
"Wtyczka zniknęła.
Wszystko wskazuje, że zainstalowałem wtyczkę, ale nie wiem gdzie..." Smile Smile


RE: Python - borys - 24-12-2010

Smile To znaczy, że nazwa pliku zip nie zgadzała się z nazwą zawartego w nim katalogu - a ta nazwa jest identyfikatorem wtyczki.


RE: Python - Rayo - 26-12-2010

Czy w kodzie wtyczek QGISa nie można używać polskich znaków? U mnie zawsze pojawia się błąd gdy ich użyję. Nawet jeśli są to tylko komunikaty do wyświetlenia przez wtyczkę w otwieranym oknie.


RE: Python - borys - 26-12-2010

To jest związane nie z Quantum, tylko z faktem, że Python 2.x pracuje domyślnie w kodowaniu iso latin-1. Jeśli w treści pliku .py gdziekolwiek chcesz użyć polskiego znaku, to pierwsza linijka (ewentualnie druga, jeśli pierwsza zawiera ścieżkę do interpretera) musi zawierać deklarację kodowania, np:

# -*- coding: utf-8 -*-

To załatwia problem literek w treści pliku .py. Natomiast co do wartości zmiennych, to do polskich liter nie możesz używać zmiennej typu string, lecz unicode (lub QString, które obsługuje znaki unikodowe). Pogooglaj problem unikodu w Pythonie.


RE: Python - Rayo - 28-12-2010

Jak zwykle po Twojej radzie działa Smile

Tym razem mam problem z odczytaniem informacji, czy dana warstwa jest widoczna, czy nie. Korzystam z funkcji

QgsMapCanvasLayer(warstwa).isVisible()

ale dla wszystkich warstw dostaję wartość True, podczas gdy część jest wyłączona.


RE: Python - Rayo - 28-12-2010

Udało mi się problem rozwiązać w następujący sposób

self.iface.legendInterface().isLayerVisible(warstwa)

Działa, ale do końca nie wiem jak Wink
Będę wdzięczny, jak mnie ktoś oświeci. Z dokumentacji QGisa wynika, że składnia powinna być następująca

QgsLegendInterface.isLayerVisible(warstwa)

Ale tak zapisane u mnie nie działa. Dlaczego?


RE: Python - borys - 28-12-2010

Bo metoda legendInterface() zwraca konkretny obiekt klasy QgsLegendInterface, należący do jej obiektu, czyli w tym wypadku do self.iface - bieżącej instancji interfejsu Qgisa. Natomiast pisząc QgsLegendInterface próbujesz skonstruować nowy obiekt klasy QgsLegendInterface, zamiast odwołać się do tego istniejącego.


RE: Python - Rayo - 28-12-2010

Trochę podrążę jeszcze ten temat, choć być może pytam o zupełne podstawy...
W dokumentacji API QGisa opisane są klasy, np QgsLegendInterface. Gdzie znajdę opisy metod, np legendInterface()?


RE: Python - borys - 28-12-2010

Właśnie tam. Szukasz metody legendInterface() zmiennej iface, która jest obiektem typu QgisInterface (żeby to sprawdzić, wpisz w qgisowej konsoli qgis.utils.iface), więc to w niej musisz szukać:

http://doc.qgis.org/head/classQgisInterface.html

Na marginesie, dokumentacja jest do wersji stabilnej (1.0) oraz rozwojowej:

http://doc.qgis.org/

Akurat tej metody nie znajdziesz w wersji stabilnej, co oznacza, że jeśli jej użyjesz, Twoja wtyczka nie będzie kompatybilna z Qgisem 1.0. Dostęp z Pythona do legendy wprowadziliśmy dopiero w 1.4.


RE: Python - Rayo - 29-12-2010

Czy qgis.utils.iface to zmienna systemowa umożliwiająca dostęp do interface'u QGISa? Wpisując to w konsoli otrzymuję

<qgis.gui.QgisInterface object at 0x05A2E810>

Ale użycie w skrypcie powoduje błąd

NameError: global name 'qgis' is not defined