24-04-2016, 21:52
Cześć, za cel postawiłem sobie napisanie wtyczki do Qgisa. W pierwszej kolejności chcę uzyskać działający kod w konsoli i tutaj pojawia się problem z wykorzystaniem rozwijanej listy z comboBox, kod się wykonuje do końca ale fakt wybory z listy jest pomijany (pętla przyjmuje domyślna wartość, czyli pierwszą i dla niej liczy). Może ktoś mnie nakieruje gdzie popełniam błąd, to są moje pierwsze kroki z programowaniem.
fragment kodu...
Aha, kod działa na warstwie poligonowej, docelowo ma tworzyć nowe kolumny w oparciu o kolumny pomocnicze, które na końcu są usuwane. Użytkownik ma jedynie wybrać jedną wartość spośród 4 dostępnych (rozwijana list) w oparciu o którą dokonuje się jedno z obliczeń. Na chwilę obecna wygląda to trochę chaotycznie, ale mam nadzieję że uda mi się to uprościć i zrobić z tego działający skrypt i wtyczkę.
fragment kodu...
Kod:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
layer = iface.activeLayer()
#dodaj nowe puste kolumny
layer.dataProvider().addAttributes([QgsField('pow_mat', QVariant.Double),
QgsField('Xgk', QVariant.Double),
QgsField('Ygk', QVariant.Double),
QgsField('v', QVariant.Double),
QgsField('u', QVariant.Double)
])
layer.updateFields()
#ustaw index
idx_pow_mat = layer.fieldNameIndex('pow_mat')
idx_Xgk = layer.fieldNameIndex('Xgk')
idx_Ygk = layer.fieldNameIndex('Ygk')
idx_v = layer.fieldNameIndex('v')
idx_u = layer.fieldNameIndex('u')
#oblicz powierzchnie i umiesc ja w kolumnie pow_mat
layer.startEditing()
for f in layer.getFeatures():
area = f.geometry().area()
layer.changeAttributeValue(f.id(),idx_pow_mat, area)
layer.commitChanges()
#utworz rozwijana liste wyboru strefy
cb = QComboBox()
cb.addItems(['5','6','7','8'])
cb.resize(250,35)
cb.setWindowTitle('Wybierz strefe')
cb.show()
#ustaw zmienna z rozwijanej listy
list = [""]
layer.startEditing()
#wykonaj oblicze w oparciu o wybor z rozwijanej listy
for k in list:
Pas = int(cb.currentText())
if Pas == 5:
for e in layer.getFeatures():
e2 = QgsExpression("pow_mat+500000")
e2.prepare(layer.pendingFields())
value_e2 = e2.evaluate(e)
layer.changeAttributeValue(e.id(), idx_Xgk, value_e2)
elif Pas == 6:
for e in layer.getFeatures():
e2 = QgsExpression("pow_mat+6000000")
e2.prepare(layer.pendingFields())
value_e2 = e2.evaluate(e)
layer.changeAttributeValue(e.id(), idx_Ygk, value_e2)
elif Pas == 7:
for e in layer.getFeatures():
e2 = QgsExpression("pow_mat+7000000")
e2.prepare(layer.pendingFields())
value_e2 = e2.evaluate(e)
layer.changeAttributeValue(e.id(), idx_Xgk, value_e2)
elif Pas == 8:
for e in layer.getFeatures():
e2 = QgsExpression("pow_mat+8000000")
e2.prepare(layer.pendingFields())
value_e2 = e2.evaluate(e)
layer.changeAttributeValue(e.id(), idx_Ygk, value_e2)
pass#zajety, poczekaj na nacisniecie klawisza
layer.commitChanges()
layer.startEditing()
#wyrazenie kolumna razy jakas wartosc
e3 = QgsExpression("Ygk*2")
e4 = QgsExpression("Xgk*4")
e3.prepare(layer.pendingFields())
e4.prepare(layer.pendingFields())
for l in layer.getFeatures():
value_e3 = e3.evaluate(l)
layer.changeAttributeValue(l.id(), idx_u, value_e3)
for o in layer.getFeatures():
value_e4 = e4.evaluate(o)
layer.changeAttributeValue(o.id(), idx_v, value_e4)
layer.commitChanges()
Aha, kod działa na warstwie poligonowej, docelowo ma tworzyć nowe kolumny w oparciu o kolumny pomocnicze, które na końcu są usuwane. Użytkownik ma jedynie wybrać jedną wartość spośród 4 dostępnych (rozwijana list) w oparciu o którą dokonuje się jedno z obliczeń. Na chwilę obecna wygląda to trochę chaotycznie, ale mam nadzieję że uda mi się to uprościć i zrobić z tego działający skrypt i wtyczkę.