def executeSearch(self): """ Base class override. Search for matching items for the specified entity and column. """ model_root_node = None prog_dialog = QProgressDialog(self) prog_dialog.setFixedWidth(380) prog_dialog.setWindowTitle( QApplication.translate("STRViewEntityWidget", "Searching for STR...")) prog_dialog.show() prog_dialog.setRange(0, 10) search_term = self._searchTerm() prog_dialog.setValue(2) # Try to get the corresponding search term value from the completer model if not self._completer_model is None: reg_exp = QRegExp("^%s$" % (search_term), Qt.CaseInsensitive, QRegExp.RegExp2) self._proxy_completer_model.setFilterRegExp(reg_exp) if self._proxy_completer_model.rowCount() > 0: # Get corresponding actual value from the first matching item value_model_idx = self._proxy_completer_model.index(0, 1) source_model_idx = self._proxy_completer_model.mapToSource( value_model_idx) prog_dialog.setValue(4) search_term = self._completer_model.data( source_model_idx, Qt.DisplayRole) modelInstance = self.config.STRModel() modelQueryObj = modelInstance.queryObject() queryObjProperty = getattr(self.config.STRModel, self.currentFieldName()) entity_name = modelQueryObj._primary_entity._label_name entity = self.curr_profile.entity_by_name(entity_name) prog_dialog.setValue(6) # Get property type so that the filter can # be applied according to the appropriate type propType = queryObjProperty.property.columns[0].type results = [] try: if not isinstance(propType, String): col_name = self.currentFieldName() col = entity.columns[self.currentFieldName()] if col.TYPE_INFO == 'LOOKUP': lookup_entity = lookup_parent_entity( self.curr_profile, col_name) lkp_model = entity_model(lookup_entity) lkp_obj = lkp_model() value_obj = getattr(lkp_model, 'value') result = lkp_obj.queryObject().filter( func.lower(value_obj) == func.lower( search_term)).first() if result is None: result = lkp_obj.queryObject().filter( func.lower(value_obj).like(search_term + '%')).first() if not result is None: results = modelQueryObj.filter( queryObjProperty == result.id).all() else: results = [] else: results = modelQueryObj.filter( func.lower(queryObjProperty) == func.lower( search_term)).all() if self.validity.isEnabled(): valid_str_ids = self.str_validity_period_filter(results) else: valid_str_ids = None prog_dialog.setValue(7) except exc.StatementError: return model_root_node, [], search_term # if self.formatter is not None: # self.formatter.setData(results) # model_root_node = self.formatter.root(valid_str_ids) prog_dialog.setValue(10) prog_dialog.hide() return results, search_term
class UpdateThemesOfGroup: def __init__(self, iface, plugin_dir, yleiskaavaSettings, yleiskaavaDatabase, yleiskaavaUtils): self.iface = iface self.yleiskaavaSettings = yleiskaavaSettings self.yleiskaavaDatabase = yleiskaavaDatabase self.yleiskaavaUtils = yleiskaavaUtils self.plugin_dir = plugin_dir self.dialogUpdateThemeOfGroup = uic.loadUi( os.path.join(self.plugin_dir, 'ui', 'yleiskaava_dialog_update_themes_of_group.ui')) self.themes = None self.themeNames = None self.currentTheme = None self.hasUserSelectedPolygonFeaturesForUpdate = False self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = False self.hasUserSelectedLineFeaturesForUpdate = False self.hasUserSelectedPointFeaturesForUpdate = False self.hasUserCanceledCopy = False self.progressDialog = None self.shouldHide = False def setup(self): self.setupDialogUpdateThemeOfGroup() def setupDialogUpdateThemeOfGroup(self): self.dialogUpdateThemeOfGroup.comboBoxThemeNames.currentIndexChanged.connect( self.handleComboBoxThemeNameChanged) self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.stateChanged.connect( self.checkBoxUpdatePolygonFeaturesStateChanged) self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.stateChanged.connect( self.checkBoxUpdateSupplementaryPolygonFeaturesStateChanged) self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.stateChanged.connect( self.checkBoxUpdateLineFeaturesStateChanged) self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.stateChanged.connect( self.checkBoxUpdatePointFeaturesStateChanged) # Varoita käyttäjää, jos jo valmiiksi valittuja kohteita self.dialogUpdateThemeOfGroup.pushButtonSelectPolygonFeatures.clicked.connect( self.selectPolygonFeatures) self.dialogUpdateThemeOfGroup.pushButtonSelectSupplementaryPolygonFeatures.clicked.connect( self.selectSupplementaryPolygonFeatures) self.dialogUpdateThemeOfGroup.pushButtonSelectLineFeatures.clicked.connect( self.selectLineFeatures) self.dialogUpdateThemeOfGroup.pushButtonSelectPointFeatures.clicked.connect( self.selectPointFeatures) self.dialogUpdateThemeOfGroup.pushButtonUpdate.clicked.connect( self.handleUpdateTheme) self.dialogUpdateThemeOfGroup.pushButtonUpdateAndClose.clicked.connect( self.handleUpdateThemeAndClose) self.dialogUpdateThemeOfGroup.pushButtonCancel.clicked.connect( self.dialogUpdateThemeOfGroup.hide) def selectPolygonFeatures(self): layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_ALUE)[0] if layer.selectedFeatureCount() > 0: self.iface.messageBar().pushMessage( 'Aluevaraukset karttatasolla on jo valmiiksi valittuja kohteita', Qgis.Info, duration=20) self.iface.showAttributeTable(layer) self.hasUserSelectedPolygonFeaturesForUpdate = True self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.setChecked( True) def selectSupplementaryPolygonFeatures(self): layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_ALUE_TAYDENTAVA)[0] if layer.selectedFeatureCount() > 0: self.iface.messageBar().pushMessage( 'Täydentävät aluekohteet karttatasolla on jo valmiiksi valittuja kohteita', Qgis.Info, duration=20) self.iface.showAttributeTable(layer) self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = True self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.setChecked( True) def selectLineFeatures(self): layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_VIIVA)[0] if layer.selectedFeatureCount() > 0: self.iface.messageBar().pushMessage( 'Viivamaiset kaavakohteet karttatasolla on jo valmiiksi valittuja kohteita', Qgis.Info, duration=20) self.iface.showAttributeTable(layer) self.hasUserSelectedLineFeaturesForUpdate = True self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.setChecked( True) def selectPointFeatures(self): layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_PISTE)[0] if layer.selectedFeatureCount() > 0: self.iface.messageBar().pushMessage( 'Pistemäiset kaavakohteet karttatasolla on jo valmiiksi valittuja kohteita', Qgis.Info, duration=20) self.iface.showAttributeTable(layer) self.hasUserSelectedPointFeaturesForUpdate = True self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.setChecked( True) def checkBoxUpdatePolygonFeaturesStateChanged(self): pass # if self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.isChecked(): # self.dialogUpdateThemeOfGroup.pushButtonSelectPolygonFeatures.setEnabled(True) # else: # self.dialogUpdateThemeOfGroup.pushButtonSelectPolygonFeatures.setEnabled(False) def checkBoxUpdateSupplementaryPolygonFeaturesStateChanged(self): pass # if self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.isChecked(): # self.dialogUpdateThemeOfGroup.pushButtonSelectSupplementaryPolygonFeatures.setEnabled(True) # else: # self.dialogUpdateThemeOfGroup.pushButtonSelectSupplementaryPolygonFeatures.setEnabled(False) def checkBoxUpdateLineFeaturesStateChanged(self): pass # if self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.isChecked(): # self.dialogUpdateThemeOfGroup.pushButtonSelectLineFeatures.setEnabled(True) # else: # self.dialogUpdateThemeOfGroup.pushButtonSelectLineFeatures.setEnabled(False) def checkBoxUpdatePointFeaturesStateChanged(self): pass # if self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.isChecked(): # self.dialogUpdateThemeOfGroup.pushButtonSelectPointFeatures.setEnabled(True) # else: # self.dialogUpdateThemeOfGroup.pushButtonSelectPointFeatures.setEnabled(False) def openDialogUpdateThemeForGroup(self): self.reset() if self.yleiskaavaSettings.shouldKeepDialogsOnTop(): self.dialogUpdateThemeOfGroup.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowStaysOnTopHint) else: self.dialogUpdateThemeOfGroup.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) self.dialogUpdateThemeOfGroup.show() def handleUpdateTheme(self): self.shouldHide = False self.updateTheme() def handleUpdateThemeAndClose(self): self.shouldHide = True self.updateTheme() def updateTheme(self): # Päivitä teema ja siihen liitetyt kaavakohteet ja huomio asetukset, sekä mahd. useat teemat kohteella # Tarkista, onko teeman lomaketiedoissa eroa ja jos ei, niin ilmoita käyttäjälle. # Lisää teema sellaisille kaavakohteille, joilla sitä ei vielä ole, mutta käyttäjä on ko. kaavakohteen valinnut / valitsee # Anna käyttäjän valita kaavakohteet, joille teema päivitetään. # Varmista, että käyttäjä ei voi vahingossa päivittää jo aiemmin valitsemiaan kaavaobjekteja. # Varmista jotenkin, että käyttäjän valitsemat kohteet päivitetään vaikka niillä olisi eri teema kuin muutettava teema / rajoita valintamahdollisuus kohteisiin, joilla muutettavan teeman relaatio # Ilmoita käyttäjälle, että valitse kohteet, tms., jos ei ole valinnut. # Varmista, että self.currentTheme != None jo vaikka käyttäjä ei ole valinnut dialogista kohteita / lisää ensimmäiseksi vaihtoehdoksi comboboxiin "Valitse teema" # Huomioi, "Poista kaavakohteilta vanhat teemat"-asetuksen pois päältä olo, kun käyttäjä vain päivittää kohteilla jo olevaa teemaa -> ei siis tehdä duplikaattirelaatiota # näytä käyttöliittymässä yleiskaavan id, nimi, nro if self.currentTheme != None: themeID = self.currentTheme["id"] themeName = self.dialogUpdateThemeOfGroup.lineEditThemeName.text() themeDescription = self.dialogUpdateThemeOfGroup.plainTextEditThemeDescription.toPlainText( ) if not self.equalsThemeAndFormTexts(themeName, themeDescription): # self.yleiskaavaDatabase.reconnectToDB() success = self.yleiskaavaDatabase.updateTheme( themeID, themeName, themeDescription) if success: self.currentTheme["alpha_sort_key"] = themeName self.currentTheme["nimi"] = QVariant(themeName) self.currentTheme["kuvaus"] = QVariant(themeDescription) # self.currentTheme["id_yleiskaava"] = QVariant(themeDescription) self.iface.messageBar().pushMessage('Teema päivitetty', Qgis.Info, duration=30) elif not self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.isChecked( ) and not self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.isChecked( ) and not self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.isChecked( ) and not self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.isChecked( ): self.iface.messageBar().pushMessage( 'Teemaan ei ole tehty muutoksia eikä päivitettäviä kaavakohteita ole valittu. Ei tehdä päivityksiä', Qgis.Info, duration=30) if self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.isChecked( ): if not self.hasUserSelectedPolygonFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä aluevarauksia; aluevarauksia ei päivitetty', Qgis.Warning, duration=0) else: self.progressDialog = QProgressDialog( "Päivitetään aluevarausten teemoja...", "Keskeytä", 0, 100) self.progressDialog.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint) self.updateSpatialFeatures("alue") if self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.isChecked( ): if not self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä täydentäviä aluekohteita; täydentäviä aluekohteita ei päivitetty', Qgis.Warning, duration=0) else: self.progressDialog = QProgressDialog( "Päivitetään täydentävien aluekohteiden teemoja...", "Keskeytä", 0, 100) self.progressDialog.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint) self.updateSpatialFeatures("alue_taydentava") if self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.isChecked( ): if not self.hasUserSelectedLineFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä viivamaisia kohteita; viivamaisia ei päivitetty', Qgis.Warning, duration=0) else: self.progressDialog = QProgressDialog( "Päivitetään viivamaisten kohteiden teemoja...", "Keskeytä", 0, 100) self.progressDialog.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint) self.updateSpatialFeatures("viiva") if self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.isChecked( ): if not self.hasUserSelectedPointFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä pistemäisiä kohteita; pistemäisiä kohteita ei päivitetty', Qgis.Warning, duration=0) else: self.progressDialog = QProgressDialog( "Päivitetään pistemäisten kohteiden teemoja...", "Keskeytä", 0, 100) self.progressDialog.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint) self.updateSpatialFeatures("piste") if self.shouldHide: self.dialogUpdateThemeOfGroup.hide() # else: # self.iface.messageBar().pushMessage("Kaavakohteita ei päivitetty", Qgis.Critical) elif self.dialogUpdateThemeOfGroup.checkBoxRemoveOldThemesFromSpatialFeatures.isChecked( ): # ainoastaan poistetaan vanha(t) teema(t) valituilta kohteilta if self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.isChecked( ): if not self.hasUserSelectedPolygonFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä aluevarauksia; aluevarauksia ei päivitetty', Qgis.Warning, duration=0) else: success = self.removeThemesFromSpatialFeatures("alue") if success: self.iface.messageBar().pushMessage( 'Aluvarausten teemat poistettu', Qgis.Info, duration=30) if self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.isChecked( ): if not self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä täydentäviä aluekohteita; täydentäviä aluekohteita ei päivitetty', Qgis.Warning, duration=0) else: success = self.removeThemesFromSpatialFeatures( "alue_taydentava") if success: self.iface.messageBar().pushMessage( 'Täydentävien aluekohteiden teemat poistettu', Qgis.Info, duration=30) if self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.isChecked( ): if not self.hasUserSelectedLineFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä viivamaisia kohteita; viivamaisia ei päivitetty', Qgis.Warning, duration=0) else: success = self.removeThemesFromSpatialFeatures("viiva") if success: self.iface.messageBar().pushMessage( 'Viivamaisten kohteiden teemat poistettu', Qgis.Info, duration=30) if self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.isChecked( ): if not self.hasUserSelectedPointFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä pistemäisiä kohteita; pistemäisiä kohteita ei päivitetty', Qgis.Warning, duration=0) else: success = self.removeThemesFromSpatialFeatures("piste") if success: self.iface.messageBar().pushMessage( 'Pistemäisten kohteiden teemat poistettu', Qgis.Info, duration=30) if self.shouldHide: self.dialogUpdateThemeOfGroup.hide() self.finishUpdate() else: self.iface.messageBar().pushMessage('Valitse teema', Qgis.Info, duration=30) def equalsThemeAndFormTexts(self, formThemeName, formThemeDescription): themeName = self.currentTheme["nimi"] themeDescription = "" if self.currentTheme["kuvaus"] is not None: themeDescription = self.currentTheme["kuvaus"] if formThemeName == themeName and formThemeDescription == themeDescription: return True return False def finishUpdate(self): self.yleiskaavaUtils.refreshTargetLayersInProject() def reset(self): self.setupThemesInDialog() self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.setChecked( False) self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.setChecked( False) self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.setChecked( False) self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.setChecked( False) self.hasUserSelectedPolygonFeaturesForUpdate = False self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = False self.hasUserSelectedLineFeaturesForUpdate = False self.hasUserSelectedPointFeaturesForUpdate = False self.updateUserSelectionsBasedOnLayers() def updateUserSelectionsBasedOnLayers(self): layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_ALUE)[0] if layer.selectedFeatureCount() > 0: self.hasUserSelectedPolygonFeaturesForUpdate = True self.dialogUpdateThemeOfGroup.checkBoxUpdatePolygonFeatures.setChecked( True) layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_ALUE_TAYDENTAVA)[0] if layer.selectedFeatureCount() > 0: self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = True self.dialogUpdateThemeOfGroup.checkBoxUpdateSupplementaryPolygonFeatures.setChecked( True) layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_VIIVA)[0] if layer.selectedFeatureCount() > 0: self.hasUserSelectedLineFeaturesForUpdate = True self.dialogUpdateThemeOfGroup.checkBoxUpdateLineFeatures.setChecked( True) layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_PISTE)[0] if layer.selectedFeatureCount() > 0: self.hasUserSelectedPointFeaturesForUpdate = True self.dialogUpdateThemeOfGroup.checkBoxUpdatePointFeatures.setChecked( True) def updateSpatialFeatures(self, featureType): if self.currentTheme != None: themeID = self.currentTheme["id"] themeName = self.currentTheme["nimi"] shouldRemoveOldThemeRelations = self.dialogUpdateThemeOfGroup.checkBoxRemoveOldThemesFromSpatialFeatures.isChecked( ) # self.yleiskaavaDatabase.reconnectToDB() self.updateThemesOfGroupTask = UpdateThemesOfGroupTask( self.yleiskaavaDatabase, featureType, themeID, themeName, shouldRemoveOldThemeRelations) targetLayer = self.yleiskaavaDatabase.getTargetLayer(featureType) themeLayer = self.yleiskaavaDatabase.getProjectLayer( "yk_kuvaustekniikka.teema") themeRelationLayer = self.yleiskaavaDatabase.getProjectLayer( "yk_kuvaustekniikka.kaavaobjekti_teema_yhteys") self.updateThemesOfGroupTask.setDependentLayers( [targetLayer, themeLayer, themeRelationLayer]) self.progressDialog.canceled.connect( self.handleUpdateThemesOfGroupTaskStopRequestedByUser) self.updateThemesOfGroupTask.progressChanged.connect( self.handleUpdateThemesOfGroupTaskProgressChanged) self.updateThemesOfGroupTask.taskCompleted.connect( self.handleUpdateThemesOfGroupTaskCompleted) self.updateThemesOfGroupTask.taskTerminated.connect( self.handleUpdateThemesOfGroupTaskTerminated) self.progressDialog.setValue(0) self.progressDialog.show() QgsApplication.taskManager().addTask(self.updateThemesOfGroupTask) def handleUpdateThemesOfGroupTaskStopRequestedByUser(self): self.hasUserCanceledCopy = True self.updateThemesOfGroupTask.cancel() def handleUpdateThemesOfGroupTaskProgressChanged(self, progress): self.progressDialog.setValue(int(progress)) def handleUpdateThemesOfGroupTaskCompleted(self): self.progressDialog.hide() self.finishUpdate() if not self.hasUserCanceledCopy: self.iface.messageBar().pushMessage( 'Valittujen kaavakohteiden teemat päivitetty', Qgis.Info, duration=30) else: self.iface.messageBar().pushMessage( 'Valittujen kaavakohteiden teemoja ei päivitetty kokonaisuudessaan tietokantaan', Qgis.Info, duration=30) self.hasUserCanceledCopy = False def handleUpdateThemesOfGroupTaskTerminated(self): if not self.hasUserCanceledCopy: self.iface.messageBar().pushMessage( "Teemojen päivityksessä tapahtui virhe", Qgis.Critical, duration=0) else: self.hasUserCanceledCopy = False self.progressDialog.hide() self.finishUpdate() def removeThemesFromSpatialFeatures(self, featureType): # self.yleiskaavaDatabase.reconnectToDB() spatialFeatures = self.yleiskaavaDatabase.getSelectedFeatures( featureType, ["id"]) # spatialFeatures = self.yleiskaavaDatabase.getSpatialFeaturesWithRegulationForType(regulationID, featureType) for feature in spatialFeatures: success = self.yleiskaavaDatabase.removeSpatialFeatureThemes( feature["id"], featureType) if not success: self.iface.messageBar().pushMessage( "Kaavakohteelta, jonka tyyppi on " + self.yleiskaavaDatabase. getUserFriendlySpatialFeatureTypeName(featureType) + " ja id on " + str(feature["id"]) + " ei voitu poistaa teemoja", Qgis.Critical, duration=0) return False return True def setupThemesInDialog(self): # self.yleiskaavaDatabase.reconnectToDB() self.themes = sorted(self.yleiskaavaDatabase.getThemes(), key=itemgetter('alpha_sort_key')) self.themeNames = [] for index, theme in enumerate(self.themes): # QgsMessageLog.logMessage("setupThemesInDialog - index: " + str(index) + ", theme['kuvaus']: " + str(theme['kuvaus']) + ", theme['nimi']: " + str(theme['nimi']), 'Yleiskaava-työkalu', Qgis.Info) nimi = "" kuvaus = "" if theme["nimi"] is not None or theme["kuvaus"] is not None: if theme["kuvaus"] is not None: kuvaus = ( theme["kuvaus"][:25] + '..') if len(theme["kuvaus"]) > 25 else theme["kuvaus"] self.themeNames.append(str(theme["nimi"]) + ' - ' + kuvaus) self.dialogUpdateThemeOfGroup.comboBoxThemeNames.clear() self.dialogUpdateThemeOfGroup.comboBoxThemeNames.addItems( self.themeNames) self.dialogUpdateThemeOfGroup.comboBoxThemeNames.insertItem( 0, "Valitse teema") self.dialogUpdateThemeOfGroup.comboBoxThemeNames.setCurrentIndex(0) self.currentTheme = None def handleComboBoxThemeNameChanged(self, currentIndex): self.currentTheme = self.themes[currentIndex - 1] if currentIndex > 0: self.dialogUpdateThemeOfGroup.lineEditThemeName.setText( self.currentTheme["nimi"]) if self.currentTheme["kuvaus"] is not None: self.dialogUpdateThemeOfGroup.plainTextEditThemeDescription.setPlainText( self.currentTheme["kuvaus"]) else: self.dialogUpdateThemeOfGroup.plainTextEditThemeDescription.setPlainText( "") if self.currentTheme["yleiskaava_nimi"] is not None: self.dialogUpdateThemeOfGroup.lineEditPlanName.setText( self.currentTheme["yleiskaava_nimi"]) else: self.dialogUpdateThemeOfGroup.lineEditPlanName.setText("") else: self.currentTheme = None self.dialogUpdateThemeOfGroup.lineEditThemeName.setText("") self.dialogUpdateThemeOfGroup.plainTextEditThemeDescription.setPlainText( "") self.dialogUpdateThemeOfGroup.lineEditPlanName.setText("")
class UpdateRegulationOfGroup: def __init__(self, iface, plugin_dir, yleiskaavaSettings, yleiskaavaDatabase, yleiskaavaUtils): self.iface = iface self.yleiskaavaSettings = yleiskaavaSettings self.yleiskaavaDatabase = yleiskaavaDatabase self.yleiskaavaUtils = yleiskaavaUtils self.plugin_dir = plugin_dir self.dialogUpdateRegulationOfGroup = uic.loadUi( os.path.join(self.plugin_dir, 'ui', 'yleiskaava_dialog_update_regulation_of_group.ui')) self.regulations = None self.regulationTitles = None self.currentRegulation = None self.hasUserSelectedPolygonFeaturesForUpdate = False self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = False self.hasUserSelectedLineFeaturesForUpdate = False self.hasUserSelectedPointFeaturesForUpdate = False self.hasUserCanceledCopy = False self.progressDialog = None self.shouldHide = False def setup(self): self.setupDialogUpdateRegulationOfGroup() def setupDialogUpdateRegulationOfGroup(self): self.dialogUpdateRegulationOfGroup.comboBoxRegulationTitles.currentIndexChanged.connect( self.handleComboBoxRegulationTitleChanged) self.dialogUpdateRegulationOfGroup.checkBoxShowOnlyUsedRegulations.stateChanged.connect( self.checkBoxShowOnlyUsedRegulationsStateChanged) self.dialogUpdateRegulationOfGroup.checkBoxShowAreaRegulations.stateChanged.connect( self.checkBoxShowAreaRegulationsStateChanged) self.dialogUpdateRegulationOfGroup.checkBoxShowSuplementaryAreaRegulations.stateChanged.connect( self.checkBoxShowSuplementaryAreaRegulationsStateChanged) self.dialogUpdateRegulationOfGroup.checkBoxShowLineRegulations.stateChanged.connect( self.checkBoxShowLineRegulationsStateChanged) self.dialogUpdateRegulationOfGroup.checkBoxShowPointRegulations.stateChanged.connect( self.checkBoxShowPointRegulationsStateChanged) self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.stateChanged.connect( self. checkBoxUpdateLandUseClassificationsForPolygonFeaturesStateChanged) self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.stateChanged.connect( self. checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeaturesStateChanged ) self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.stateChanged.connect( self. checkBoxUpdateLandUseClassificationsForLineFeaturesStateChanged) self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.stateChanged.connect( self. checkBoxUpdateLandUseClassificationsForPointFeaturesStateChanged) # Varoita käyttäjää, jos jo valmiiksi valittuja kohteita self.dialogUpdateRegulationOfGroup.pushButtonSelectPolygonFeatures.clicked.connect( self.selectPolygonFeatures) self.dialogUpdateRegulationOfGroup.pushButtonSelectSupplementaryPolygonFeatures.clicked.connect( self.selectSupplementaryPolygonFeatures) self.dialogUpdateRegulationOfGroup.pushButtonSelectLineFeatures.clicked.connect( self.selectLineFeatures) self.dialogUpdateRegulationOfGroup.pushButtonSelectPointFeatures.clicked.connect( self.selectPointFeatures) self.dialogUpdateRegulationOfGroup.pushButtonUpdate.clicked.connect( self.handleUpdateRegulation) self.dialogUpdateRegulationOfGroup.pushButtonUpdateAndClose.clicked.connect( self.handleUpdateRegulationAndClose) self.dialogUpdateRegulationOfGroup.pushButtonCancel.clicked.connect( self.dialogUpdateRegulationOfGroup.hide) def selectPolygonFeatures(self): layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_ALUE)[0] if layer.selectedFeatureCount() > 0: self.iface.messageBar().pushMessage( 'Aluevaraukset karttatasolla on jo valmiiksi valittuja kohteita', Qgis.Info, duration=20) self.iface.showAttributeTable(layer) self.hasUserSelectedPolygonFeaturesForUpdate = True self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.setChecked( True) def selectSupplementaryPolygonFeatures(self): layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_ALUE_TAYDENTAVA)[0] if layer.selectedFeatureCount() > 0: self.iface.messageBar().pushMessage( 'Täydentävät aluekohteet karttatasolla on jo valmiiksi valittuja kohteita', Qgis.Info, duration=20) self.iface.showAttributeTable(layer) self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = True self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.setChecked( True) def selectLineFeatures(self): layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_VIIVA)[0] if layer.selectedFeatureCount() > 0: self.iface.messageBar().pushMessage( 'Viivamaiset kaavakohteet karttatasolla on jo valmiiksi valittuja kohteita', Qgis.Info, duration=20) self.iface.showAttributeTable(layer) self.hasUserSelectedLineFeaturesForUpdate = True self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.setChecked( True) def selectPointFeatures(self): layer = QgsProject.instance().mapLayersByName( YleiskaavaDatabase.KAAVAOBJEKTI_PISTE)[0] if layer.selectedFeatureCount() > 0: self.iface.messageBar().pushMessage( 'Pistemäiset kaavakohteet karttatasolla on jo valmiiksi valittuja kohteita', Qgis.Info, duration=20) self.iface.showAttributeTable(layer) self.hasUserSelectedPointFeaturesForUpdate = True self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.setChecked( True) def checkBoxUpdateLandUseClassificationsForPolygonFeaturesStateChanged( self): pass # if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.isChecked(): # self.dialogUpdateRegulationOfGroup.pushButtonSelectPolygonFeatures.setEnabled(True) # else: # self.dialogUpdateRegulationOfGroup.pushButtonSelectPolygonFeatures.setEnabled(False) def checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeaturesStateChanged( self): pass # if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.isChecked(): # self.dialogUpdateRegulationOfGroup.pushButtonSelectSupplementaryPolygonFeatures.setEnabled(True) # else: # self.dialogUpdateRegulationOfGroup.pushButtonSelectSupplementaryPolygonFeatures.setEnabled(False) def checkBoxUpdateLandUseClassificationsForLineFeaturesStateChanged(self): pass # if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.isChecked(): # self.dialogUpdateRegulationOfGroup.pushButtonSelectLineFeatures.setEnabled(True) # else: # self.dialogUpdateRegulationOfGroup.pushButtonSelectLineFeatures.setEnabled(False) def checkBoxUpdateLandUseClassificationsForPointFeaturesStateChanged(self): pass # if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.isChecked(): # self.dialogUpdateRegulationOfGroup.pushButtonSelectPointFeatures.setEnabled(True) # else: # self.dialogUpdateRegulationOfGroup.pushButtonSelectPointFeatures.setEnabled(False) def openDialogUpdateRegulationOfGroup(self): self.reset() if self.yleiskaavaSettings.shouldKeepDialogsOnTop(): self.dialogUpdateRegulationOfGroup.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint | Qt.WindowStaysOnTopHint) else: self.dialogUpdateRegulationOfGroup.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) self.dialogUpdateRegulationOfGroup.show() def handleUpdateRegulation(self): self.shouldHide = False self.updateRegulation() def handleUpdateRegulationAndClose(self): self.shouldHide = True self.updateRegulation() def updateRegulation(self): # Päivitä kaavamääräys ja siihen liitetyt kaavakohteet ja huomio asetukset, sekä mahd. useat määräykset kohteella kayttotarkoitus_lyhenne-päivityksessä. # Tarkista, onko kaavamääräyksen lomaketiedoissa eroa ja jos ei, niin ilmoita käyttäjälle. # Lisää kaavamääräys sellaisille kaavakohteille, joilla sitä ei vielä ole, mutta käyttäjä on ko. kaavakohteen valinnut / valitsee # Anna käyttäjän valita kaavakohteet, joille kaavamääräys päivitetään. # Varmista, että käyttäjä ei voi vahingossa päivittää jo aiemmin valitsemiaan kaavaobjekteja. # Varmista jotenkin, että käyttäjän valitsemat kohteet päivitetään vaikka niillä olisi eri kaavamääräys kuin muutettava kaavamääräys / rajoita valintamahdollisuus kohteisiin, joilla muutettavan kaavamääräyksen relaatio # Ilmoita käyttäjälle, että valitse kohteet, tms., jos ei ole valinnut. # Varmista, että self.currentRegulation != None jo vaikka käyttäjä ei ole valinnut dialogista kohteita / lisää ensimmäiseksi vaihtoehdoksi comboboxiin "Valitse kaavamääräys" # Huomioi, "Poista kaavakohteilta vanhat kaavamääräykset"-asetuksen pois päältä olo, kun käyttäjä vain päivittää kohteilla jo olevaa kaavamääräystä -> ei siis tehdä duplikaattirelaatiota # Kun "Päivitä käyttötarkoitus vaikka kohteella olisi useita kaavamääräyksiä"-asetus on pois päältä, niin lisää kuitenkin kaavamääräys if self.currentRegulation != None: regulationID = self.currentRegulation["id"] regulationTitle = self.dialogUpdateRegulationOfGroup.plainTextEditRegulationTitle.toPlainText( ) regulationText = self.dialogUpdateRegulationOfGroup.plainTextEditRegulationText.toPlainText( ) regulationDescription = self.dialogUpdateRegulationOfGroup.plainTextEditRegulationDescription.toPlainText( ) if not self.equalsRegulationAndFormTexts( regulationTitle, regulationText, regulationDescription): # self.yleiskaavaDatabase.reconnectToDB() success = self.yleiskaavaDatabase.updateRegulation( regulationID, regulationTitle, regulationText, regulationDescription) if success: self.currentRegulation["alpha_sort_key"] = regulationTitle self.currentRegulation["kaavamaarays_otsikko"] = QVariant( regulationTitle) self.currentRegulation["maaraysteksti"] = QVariant( regulationText) self.currentRegulation["kuvaus_teksti"] = QVariant( regulationDescription) self.iface.messageBar().pushMessage( 'Kaavamääräys päivitetty', Qgis.Info, duration=30) elif not self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.isChecked( ) and not self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.isChecked( ) and not self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.isChecked( ) and not self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.isChecked( ): self.iface.messageBar().pushMessage( 'Kaavamääräykseen ei ole tehty muutoksia eikä päivitettäviä kaavakohteita ole valittu. Ei tehdä päivityksiä', Qgis.Info, duration=30) if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.isChecked( ): if not self.hasUserSelectedPolygonFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä aluevarauksia; aluevarauksia ei päivitetty', Qgis.Warning, duration=0) else: self.progressDialog = QProgressDialog( "Päivitetään aluevarausten kaavamääräyksiä...", "Keskeytä", 0, 100) self.progressDialog.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint) self.updateRegulationsAndLandUseClassificationsForSpatialFeatures( "alue") if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.isChecked( ): if not self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä täydentäviä aluekohteita; täydentäviä aluekohteita ei päivitetty', Qgis.Warning, duration=0) else: self.progressDialog = QProgressDialog( "Päivitetään täydentävien aluekohteiden kaavamääräyksiä...", "Keskeytä", 0, 100) self.progressDialog.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint) self.updateRegulationsAndLandUseClassificationsForSpatialFeatures( "alue_taydentava") if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.isChecked( ): if not self.hasUserSelectedLineFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä viivamaisia kohteita; viivamaisia ei päivitetty', Qgis.Warning, duration=0) else: self.progressDialog = QProgressDialog( "Päivitetään viivamaisten kohteiden kaavamääräyksiä...", "Keskeytä", 0, 100) self.progressDialog.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint) self.updateRegulationsAndLandUseClassificationsForSpatialFeatures( "viiva") if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.isChecked( ): if not self.hasUserSelectedPointFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä pistemäisiä kohteita; pistemäisiä kohteita ei päivitetty', Qgis.Warning, duration=0) else: self.progressDialog = QProgressDialog( "Päivitetään pistemäisten kohteiden kaavamääräyksiä...", "Keskeytä", 0, 100) self.progressDialog.setWindowFlags( Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint) self.updateRegulationsAndLandUseClassificationsForSpatialFeatures( "piste") # else: # self.iface.messageBar().pushMessage("Kaavakohteita ei päivitetty", Qgis.Critical) if self.shouldHide: self.dialogUpdateRegulationOfGroup.hide() elif self.dialogUpdateRegulationOfGroup.checkBoxRemoveOldRegulationsFromSpatialFeatures.isChecked( ): shouldUpdateOnlyRelation = False if not self.dialogUpdateRegulationOfGroup.checkBoxUpdateRegulationTextsEvenIfSpatialFeatureHasMultipleRegulations.isChecked( ): shouldUpdateOnlyRelation = True # ainoastaan poistetaan vanha(t) kaavamääys/kaavamääräykset valituilta kohteilta if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.isChecked( ): if not self.hasUserSelectedPolygonFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä aluevarauksia; aluevarauksia ei päivitetty', Qgis.Warning, duration=0) else: success = self.removeRegulationsAndLandUseClassificationsFromSpatialFeatures( "alue", shouldUpdateOnlyRelation) if success: if shouldUpdateOnlyRelation: self.iface.messageBar().pushMessage( 'Aluvarausten kaavamääräykset poistettu', Qgis.Info, duration=30) else: self.iface.messageBar().pushMessage( 'Aluvarausten kaavamääräykset ja käyttötarkoitus poistettu', Qgis.Info, duration=30) if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.isChecked( ): if not self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä täydentäviä aluekohteita; täydentäviä aluekohteita ei päivitetty', Qgis.Warning, duration=0) else: success = self.removeRegulationsAndLandUseClassificationsFromSpatialFeatures( "alue_taydentava", shouldUpdateOnlyRelation) if success: if shouldUpdateOnlyRelation: self.iface.messageBar().pushMessage( 'Täydentävien aluekohteiden kaavamääräykset poistettu', Qgis.Info, duration=30) else: self.iface.messageBar().pushMessage( 'Täydentävien aluekohteiden kaavamääräykset ja käyttötarkoitus poistettu', Qgis.Info, duration=30) if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.isChecked( ): if not self.hasUserSelectedLineFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä viivamaisia kohteita; viivamaisia ei päivitetty', Qgis.Warning, duration=0) else: success = self.removeRegulationsAndLandUseClassificationsFromSpatialFeatures( "viiva", shouldUpdateOnlyRelation) if success: if shouldUpdateOnlyRelation: self.iface.messageBar().pushMessage( 'Viivamaisten kohteiden kaavamääräykset poistettu', Qgis.Info, duration=30) else: self.iface.messageBar().pushMessage( 'Viivamaisten kohteiden kaavamääräykset ja käyttötarkoitus poistettu', Qgis.Info, duration=30) if self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.isChecked( ): if not self.hasUserSelectedPointFeaturesForUpdate: self.iface.messageBar().pushMessage( 'Et ole valinnut päivitettäviä pistemäisiä kohteita; pistemäisiä kohteita ei päivitetty', Qgis.Warning, duration=0) else: success = self.removeRegulationsAndLandUseClassificationsFromSpatialFeatures( "piste", shouldUpdateOnlyRelation) if success: if shouldUpdateOnlyRelation: self.iface.messageBar().pushMessage( 'Pistemäisten kohteiden kaavamääräykset poistettu', Qgis.Info, duration=30) else: self.iface.messageBar().pushMessage( 'Pistemäisten kohteiden kaavamääräykset ja käyttötarkoitus poistettu', Qgis.Info, duration=30) if self.shouldHide: self.dialogUpdateRegulationOfGroup.hide() self.finishUpdate() else: self.iface.messageBar().pushMessage('Valitse kaavamääräys', Qgis.Info, duration=30) def equalsRegulationAndFormTexts(self, formRegulationTitle, formRegulationText, formRegulationDescription): regulationTitle = self.currentRegulation["kaavamaarays_otsikko"].value( ) regulationText = "" regulationDescription = "" if not self.currentRegulation["maaraysteksti"].isNull(): regulationText = self.currentRegulation["maaraysteksti"].value() if not self.currentRegulation["kuvaus_teksti"].isNull(): regulationDescription = self.currentRegulation[ "kuvaus_teksti"].value() if formRegulationTitle == regulationTitle and formRegulationText == regulationText and formRegulationDescription == regulationDescription: return True return False def finishUpdate(self): self.yleiskaavaUtils.refreshTargetLayersInProject() def reset(self): self.setupRegulationsInDialog() self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPolygonFeatures.setChecked( False) self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForSupplementaryPolygonFeatures.setChecked( False) self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForLineFeatures.setChecked( False) self.dialogUpdateRegulationOfGroup.checkBoxUpdateLandUseClassificationsForPointFeatures.setChecked( False) self.hasUserSelectedPolygonFeaturesForUpdate = False self.hasUserSelectedSuplementaryPolygonFeaturesForUpdate = False self.hasUserSelectedLineFeaturesForUpdate = False self.hasUserSelectedPointFeaturesForUpdate = False def updateRegulationsAndLandUseClassificationsForSpatialFeatures( self, featureType): if self.currentRegulation != None: # self.yleiskaavaDatabase.reconnectToDB() regulationID = self.currentRegulation["id"] regulationTitle = self.currentRegulation[ "kaavamaarays_otsikko"].value( ) if not self.currentRegulation["kaavamaarays_otsikko"].isNull( ) else None shouldRemoveOldRegulationRelations = self.dialogUpdateRegulationOfGroup.checkBoxRemoveOldRegulationsFromSpatialFeatures.isChecked( ) shouldUpdateOnlyRelation = False shouldUpdateRegulationTextsEvenIfSpatialFeatureHasMultipleRegulations = self.dialogUpdateRegulationOfGroup.checkBoxUpdateRegulationTextsEvenIfSpatialFeatureHasMultipleRegulations.isChecked( ) self.updateRegulationOfGroupTask = UpdateRegulationOfGroupTask( self.yleiskaavaDatabase, featureType, regulationID, regulationTitle, shouldRemoveOldRegulationRelations, shouldUpdateRegulationTextsEvenIfSpatialFeatureHasMultipleRegulations ) targetLayer = self.yleiskaavaDatabase.getTargetLayer(featureType) regulationLayer = self.yleiskaavaDatabase.getProjectLayer( "yk_yleiskaava.kaavamaarays") regulationRelationLayer = self.yleiskaavaDatabase.getProjectLayer( "yk_yleiskaava.kaavaobjekti_kaavamaarays_yhteys") self.updateRegulationOfGroupTask.setDependentLayers( [targetLayer, regulationLayer, regulationRelationLayer]) self.progressDialog.canceled.connect( self.handleUpdateRegulationOfGroupTaskStopRequestedByUser) self.updateRegulationOfGroupTask.progressChanged.connect( self.handleUpdateRegulationOfGroupTaskProgressChanged) self.updateRegulationOfGroupTask.taskCompleted.connect( self.handleUpdateRegulationOfGroupTaskCompleted) self.updateRegulationOfGroupTask.taskTerminated.connect( self.handleUpdateRegulationOfGroupTaskTerminated) self.progressDialog.setValue(0) self.progressDialog.show() QgsApplication.taskManager().addTask( self.updateRegulationOfGroupTask) def handleUpdateRegulationOfGroupTaskStopRequestedByUser(self): self.hasUserCanceledCopy = True self.updateRegulationOfGroupTask.cancel() def handleUpdateRegulationOfGroupTaskProgressChanged(self, progress): self.progressDialog.setValue(int(progress)) def handleUpdateRegulationOfGroupTaskCompleted(self): self.progressDialog.hide() self.finishUpdate() if not self.hasUserCanceledCopy: self.iface.messageBar().pushMessage( 'Valittujen kaavakohteiden kaavamääräykset päivitetty', Qgis.Info, duration=30) else: self.iface.messageBar().pushMessage( 'Valittujen kaavakohteiden kaavamääräyksiä ei päivitetty kokonaisuudessaan tietokantaan', Qgis.Info, duration=30) self.hasUserCanceledCopy = False #if success: # self.iface.messageBar().pushMessage('Aluvarausten käyttötarkoitukset päivitetty', Qgis.Info, 30) # self.iface.messageBar().pushMessage('Täydentävien aluekohteiden käyttötarkoitukset päivitetty', Qgis.Info, 30) # self.iface.messageBar().pushMessage('Viivamaisten kohteiden käyttötarkoitukset päivitetty', Qgis.Info, 30) # self.iface.messageBar().pushMessage('Pistemäisten kohteiden käyttötarkoitukset päivitetty', Qgis.Info, 30) def handleUpdateRegulationOfGroupTaskTerminated(self): if not self.hasUserCanceledCopy: self.iface.messageBar().pushMessage( "Kaavamääräyksen sekä kaavamaaraysteksti- ja kayttotarkoitus_lyhenne-kenttien tekstien päivityksessä tapahtui virhe", Qgis.Critical, duration=0) else: self.hasUserCanceledCopy = False self.progressDialog.hide() self.finishUpdate() def removeRegulationsAndLandUseClassificationsFromSpatialFeatures( self, featureType, shouldUpdateOnlyRelation): # self.yleiskaavaDatabase.reconnectToDB() spatialFeatures = self.yleiskaavaDatabase.getSelectedFeatures( featureType, ["id"]) # spatialFeatures = self.yleiskaavaDatabase.getSpatialFeaturesWithRegulationForType(regulationID, featureType) for feature in spatialFeatures: success = self.yleiskaavaDatabase.removeSpatialFeatureRegulationAndLandUseClassification( feature["id"], featureType, shouldUpdateOnlyRelation) if not success: self.iface.messageBar().pushMessage( "Kaavakohteelta, jonka tyyppi on " + self.yleiskaavaDatabase. getUserFriendlySpatialFeatureTypeName(featureType) + " ja id on " + str(feature["id"]) + " ei voitu poistaa kaavamääräystä eikä kaavamaaraysteksti- ja kayttotarkoitus_lyhenne-kenttien tekstejä", Qgis.Critical, duration=0) return False return True def setupRegulationsInDialog(self): shouldShowOnlyUsedRegulations = False includeAreaRegulations = False includeSuplementaryAreaRegulations = False includeLineRegulations = False includePointRegulations = False if self.dialogUpdateRegulationOfGroup.checkBoxShowOnlyUsedRegulations.isChecked( ): shouldShowOnlyUsedRegulations = True if self.dialogUpdateRegulationOfGroup.checkBoxShowAreaRegulations.isChecked( ): includeAreaRegulations = True if self.dialogUpdateRegulationOfGroup.checkBoxShowSuplementaryAreaRegulations.isChecked( ): includeSuplementaryAreaRegulations = True if self.dialogUpdateRegulationOfGroup.checkBoxShowLineRegulations.isChecked( ): includeLineRegulations = True if self.dialogUpdateRegulationOfGroup.checkBoxShowPointRegulations.isChecked( ): includePointRegulations = True # self.yleiskaavaDatabase.reconnectToDB() self.regulations = sorted( self.yleiskaavaDatabase.getSpecificRegulations( shouldShowOnlyUsedRegulations, includeAreaRegulations, includeSuplementaryAreaRegulations, includeLineRegulations, includePointRegulations), key=itemgetter('alpha_sort_key')) self.regulationTitles = [] for index, regulation in enumerate(self.regulations): #QgsMessageLog.logMessage("setupRegulationsInDialog - index: " + str(index) + ", regulation['kaavamaarays_otsikko']: " + str(regulation['kaavamaarays_otsikko'].value()) + ", regulation['maaraysteksti']: " + str(regulation['maaraysteksti'].value()) + ", regulation['kuvaus_teksti']: " + str(regulation['kuvaus_teksti'].value()), 'Yleiskaava-työkalu', Qgis.Info) # QgsMessageLog.logMessage("setupRegulationsInDialog - index: " + str(index) + ", regulation['kaavamaarays_otsikko']: " + str(regulation['kaavamaarays_otsikko'].value()), 'Yleiskaava-työkalu', Qgis.Info) self.regulationTitles.append( regulation["kaavamaarays_otsikko"].value()) self.dialogUpdateRegulationOfGroup.comboBoxRegulationTitles.clear() self.dialogUpdateRegulationOfGroup.comboBoxRegulationTitles.addItems( self.regulationTitles) self.dialogUpdateRegulationOfGroup.comboBoxRegulationTitles.insertItem( 0, "Valitse kaavamääräys") self.dialogUpdateRegulationOfGroup.comboBoxRegulationTitles.setCurrentIndex( 0) self.currentRegulation = None def handleComboBoxRegulationTitleChanged(self, currentIndex): # QgsMessageLog.logMessage("handleComboBoxRegulationTitleChanged - currentIndex: " + str(currentIndex) + ", len(self.regulations): " + str(len(self.regulations)), 'Yleiskaava-työkalu', Qgis.Info) if currentIndex > 0 and self.regulations is not None and len( self.regulations) >= (currentIndex - 1): self.currentRegulation = self.regulations[currentIndex - 1] self.dialogUpdateRegulationOfGroup.plainTextEditRegulationTitle.setPlainText( self.currentRegulation["kaavamaarays_otsikko"].value()) if not self.currentRegulation["maaraysteksti"].isNull(): self.dialogUpdateRegulationOfGroup.plainTextEditRegulationText.setPlainText( self.currentRegulation["maaraysteksti"].value()) else: self.dialogUpdateRegulationOfGroup.plainTextEditRegulationText.setPlainText( "") if not self.currentRegulation["kuvaus_teksti"].isNull(): self.dialogUpdateRegulationOfGroup.plainTextEditRegulationDescription.setPlainText( self.currentRegulation["kuvaus_teksti"].value()) else: self.dialogUpdateRegulationOfGroup.plainTextEditRegulationDescription.setPlainText( "") else: self.currentRegulation = None self.dialogUpdateRegulationOfGroup.plainTextEditRegulationTitle.setPlainText( "") self.dialogUpdateRegulationOfGroup.plainTextEditRegulationText.setPlainText( "") self.dialogUpdateRegulationOfGroup.plainTextEditRegulationDescription.setPlainText( "") def checkBoxShowOnlyUsedRegulationsStateChanged(self): self.setupRegulationsInDialog() def checkBoxShowAreaRegulationsStateChanged(self): self.setupRegulationsInDialog() def checkBoxShowSuplementaryAreaRegulationsStateChanged(self): self.setupRegulationsInDialog() def checkBoxShowLineRegulationsStateChanged(self): self.setupRegulationsInDialog() def checkBoxShowPointRegulationsStateChanged(self): self.setupRegulationsInDialog()