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 - borys - 29-12-2010

Systemowa jak systemowa. Jest to zmienna iface modułu qgis.utils: http://trac.osgeo.org/qgis/browser/trunk/qgis/python/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 ).


RE: Python - Rayo - 29-12-2010

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.


RE: Python - borys - 29-12-2010

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


RE: Python - Rayo - 02-01-2011

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ć.


RE: Python - borys - 02-01-2011

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


RE: Python - Rayo - 22-02-2011

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.


RE: Python - Rayo - 22-02-2011

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.?


RE: Python - Rayo - 28-02-2011

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.


RE: Python - Rayo - 04-05-2011

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".