Forum QGIS

Pełna wersja: Python
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
Systemowa jak systemowa. Jest to zmienna iface modułu qgis.utils: http://trac.osgeo.org/qgis/browser/trunk...n/utils.py

którego nie zaimportowałeś, jak głosi komunikat. Ale dla wtyczki i tak się tak nie da, zamiast tego wskaźnik do interfejsu jest przekazywany przez QGISa do jej pseudo-konstruktora, czyli metody MojaWtyczka.__init__(iface) . Zazwyczaj wtyczki zaczynamy tak:

class MojaWtyczka():
def __init__(self, iface):
self.iface = iface

Ponieważ iface jest tu zmienną lokalną i działa tylko wewnątrz metody __init__, to od razu go podstawiamy pod self.iface, czyli pole iface klasy MojaWtyczka. Później, wewnątrz obiektu wtyczki masz do niej dostęp przez self.iface (a z zewnątrz oczywiście przez mojawtyczka.iface ).
Wtyczkę mam napisaną w ten sposób, że główny program odwołuje się do modułu, w którym mam definicje poszczególnych funkcji. W tej chwili informację o iface podaję jako zmienne dla poszczególnych funkcji w module. Można to jakoś uprościć, żeby zmienna ta była widziana bezpośrednio w module?
MojaWtyczka.iface nie bardzo mi odpowiada, bo jeśli będę chciał zastosować ten sam moduł w innej wtyczce, to będę musiał zmieniać na MojaWtyczka2.iface.
A spróbuj w tym module utworzyć zmienną iface, zaimportować ją i i podstawić w konstruktorze wtyczki:

Kod:
from mojmoduł import iface
class MojaWtyczka():
    def __init__(self, ifaceeee):
        global iface
        iface = ifaceeee

Może podziała, albo jak nie to jakoś tą drogą Smile
Jak można odczytać sygnał emitowany przez daną klasę?
Np stawiam nowy obiekt poprzez

QgsVectorLayer.addFeature()

i chciałbym odczytać ID dodanego obiektu.
W dokumentacji jest sygnał featureAdded, ale nie wiem jak go odczytać.
Musisz go gdzieś podłączyć:
QObject.connect(nadajnik, SIGNAL("sygnał (parametry)"), slot)

Teoria -> googlaj pod hasłami PyQt signals slots
Praktyka -> przeszukaj zainstalowane wtyczki pod hasłem connect
W jaki sposób wyszukać na warstwie obiekty o danych atrybutach? Ja robię to tak, że w pętli sprawdzam dany atrybut kolejno każdego obiektu i porównuję z zadanym warunkiem. Jest to jednak wolne przy dużej ilości obiektów, a poza tym nie chce mi się wierzyć, że nie ma na to gotowego sposobu.
Zastanawiałem się nad warstwa.select(), ale nie wiem jak podać warunki.
Jeszcze jedno pytanie. Jaka jest różnica między klasami QgsVectorDataProvider a QgsVectorLayer?
Część metod jest identyczna dla nich obu: wyszukiwanie obiektów, zliczanie itd. Której klasy należy używać dla wtyczek wyszukujących obiekty po atrybutach, obiekty przecinające się itp.?
Jeśli chodzi o wolne wyszukiwanie obiektów w pętli to problem rozwiązany - QGIS strasznie zwalnia nie przy wyszukiwaniu, a przy zaznaczeniu dużej ilości obiektów na warstwie (i tego należy unikać). Dzieje się tak nie tylko przy zaznaczaniu poprzez Pythona, ale "ręcznie" również. Otwarcie tabeli atrybutów z paroma tysiącami obiektów trwa strasznie długo. Ta sama tabela bez zaznaczonych obiektów otwiera się bezproblemowo.
Jak w Pythonie można obliczyć obwód poligonu?
Długość i powierzchnię obiektu można wyliczyć za pomocą metod length() i area() klasy QgsGeometry, ale do liczenia obwodu nic nie mogę znaleźć..
Zrobiłem mały eksperyment i wyliczyłem długość dla poligonu (metoda length()). W wyniku otrzymałem obwód Smile
Działa też dla obiektów złożonych i "dziurawych".
Stron: 1 2 3