Witam,
Mam problem w QGIS z
RuntimeError: wrapped C/C++ object of type QgsVectorLayer has been deleted.
Potrzebuje dodać warunki else
do funkcji:
ptpla = QgsProject.instance().mapLayersByName('OT_PTPL_A plac') # warstwa jest na liście w Programie QGIS
if ptpla: # Place
ptpl = ptpla[0]
unikalny_idensimc = set()
unikalny_idenulic = set()
if ptpl and ptpl.isValid() and self.modelSimcPtpl.rowCount() < 1: #próbowałem też tu
# Pobierz atrybuty z warstwy i dodaj je do modelu. Ładuje się tylko raz na początku
for feature in ptpl.getFeatures():
idenulic = str(feature.attributes()[ptpl.fields().indexFromName('IDENTYFIKATORULIC')])
idensimc = str(feature.attributes()[ptpl.fields().indexFromName('IDENTYFIKATORSIMC')])
self.modelSimcPtpl.sort(0)
self.modelUlicPtpl.sort(0)
self.dlg.comboBox_29.setModel(self.modelSimcPtpl)
self.dlg.comboBox_30.setModel(self.modelUlicPtpl)
if idensimc not in unikalny_idensimc:
unikalny_idensimc.add(idensimc)
if idensimc != 'NULL':
self.modelSimcPtpl.appendRow(QStandardItem(idensimc))
if idenulic not in unikalny_idenulic:
unikalny_idenulic.add(idenulic)
if idenulic != 'NULL':
self.modelUlicPtpl.appendRow(QStandardItem(idenulic))
self.dlg.pushButton_47.clicked.connect(self.zaznaczPtpl) # ta linia była początkowo po za If-em, ale nie rozwiązała problemu
Pozwalającej uniknąć powyższy błąd w przypadku, gdy użytkownik usunie warstwę z listy Warstw, a pozostawi włączoną wtyczkę- która wciąż zawiera dane z usuniętej warstwy.
Warunki:
else: # od if ptpl and ptpl.isValid()...
print ('Tabela OT_PTPL_A nie występuje!')
else: # od if ptpla...
print("Warstwa OT_PTPL_A plac nie występuje na spisie!")
Nie do końca rozwiązują ten problem.
Dodatkowo błąd ten pojawia się gdy chce uruchomić funkcję do aktualizacji wartości zgromadzonych w comboBox_29 i 30.
Kod wygląda tak (jest to wnętrze funkcji zaznaczPtpl
):
liczba = 0
ptpl = ptpla[0]
simcPtpl = self.dlg.comboBox_29.currentText()
ulicPtpl = self.dlg.comboBox_30.currentText()
wyrazenie= f'IDENTYFIKATORSIMC= {simcPtpl} AND IDENTYFIKATORULIC = {ulicPtpl}'
ptpl.selectByExpression(wyrazenie) #błąd po usunięciu tabeli wywala się tutaj- ptpl zostało usunięte, ale dopisanie if-a w #tym miejscu nie rozwiązuje problemu
danePtpl = []
if self.model8.rowCount() > 0:
# Usunięcie wszystkich rekordów z modelu6
self.model8.removeRows(0, self.model8.rowCount())
if ptpl and ptpl.isValid():
# Pobierz atrybuty z warstwy i dodaj je do modelu
for feature in ptpl.getFeatures():
idenulic = str(feature.attributes()[ptpl.fields().indexFromName('IDENTYFIKATORULIC')])
idensimc = str(feature.attributes()[ptpl.fields().indexFromName('IDENTYFIKATORSIMC')])
placcecha = str(feature.attributes()[ptpl.fields().indexFromName('PLACCECHA')]) #...
Możliwe, że trzeba coś dodać do warunków if
, żeby zabezpieczyć wtyczkę przed tym błędem - przypadkowym usunięciem warstwy źródłowej przez użytkownika.
Z góry dziękuje za każdą pomoc
PS. AI słabo podpowiada (możliwe, że źle definiuje problem?)