Forum QGIS

Pełna wersja: comboBox w konsoli Pythona
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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...
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ę.