def validate_type_of_parcel(self, parcel_type): constraint_types_of_parcels = LayerConfig.get_constraint_types_of_parcels(self.names) # Activate all push buttons self.btn_plot_map.setEnabled(True) self.btn_plot_expression.setEnabled(True) self.btn_building_map.setEnabled(True) self.btn_building_expression.setEnabled(True) self.btn_building_unit_map.setEnabled(True) self.btn_building_unit_expression.setEnabled(True) parcel_type = self.dict_parcel_type[parcel_type] # Disable labels/controls depending on parcel_type for spatial_unit in constraint_types_of_parcels[parcel_type]: if constraint_types_of_parcels[parcel_type][spatial_unit] is None: if spatial_unit == self.names.OP_PLOT_T: self.btn_plot_map.setEnabled(False) self.btn_plot_expression.setEnabled(False) elif spatial_unit == self.names.OP_BUILDING_T: self.btn_building_map.setEnabled(False) self.btn_building_expression.setEnabled(False) elif spatial_unit == self.names.OP_BUILDING_UNIT_T: self.btn_building_unit_map.setEnabled(False) self.btn_building_unit_expression.setEnabled(False) self.update_help_message(parcel_type) self.check_selected_features()
def check_selected_features(self): constraint_types_of_parcels = LayerConfig.get_constraint_types_of_parcels(self.names) self.lb_plot.setText(QCoreApplication.translate("WizardTranslations", "<b>Plot(s)</b>: {count} Feature(s) Selected").format(count=self._layers[self.names.OP_PLOT_T][LAYER].selectedFeatureCount())) self.lb_plot.setStyleSheet(CSS_COLOR_OKAY_LABEL) # Default color self.lb_building.setText(QCoreApplication.translate("WizardTranslations","<b>Building(s)</b>: {count} Feature(s) Selected").format(count=self._layers[self.names.OP_BUILDING_T][LAYER].selectedFeatureCount())) self.lb_building.setStyleSheet(CSS_COLOR_OKAY_LABEL) # Default color self.lb_building_unit.setText(QCoreApplication.translate("WizardTranslations","<b>Building unit(s)</b>: {count} Feature(s) Selected").format(count=self._layers[self.names.OP_BUILDING_UNIT_T][LAYER].selectedFeatureCount())) self.lb_building_unit.setStyleSheet(CSS_COLOR_OKAY_LABEL) # Default color parcel_type = self.dict_parcel_type[self.cb_parcel_type.currentText()] for spatial_unit in constraint_types_of_parcels[parcel_type]: _layer = self._spatial_unit_layers[spatial_unit] _color = CSS_COLOR_OKAY_LABEL if constraint_types_of_parcels[parcel_type][spatial_unit] == 1 and not _layer.selectedFeatureCount() == 1: _color = CSS_COLOR_ERROR_LABEL elif constraint_types_of_parcels[parcel_type][spatial_unit] == '+' and _layer.selectedFeatureCount() < 1: _color = CSS_COLOR_ERROR_LABEL elif constraint_types_of_parcels[parcel_type][spatial_unit] is None: _color = CSS_COLOR_INACTIVE_LABEL if spatial_unit == self.names.OP_PLOT_T: self.lb_plot.setStyleSheet(_color) elif spatial_unit == self.names.OP_BUILDING_T: self.lb_building.setStyleSheet(_color) elif spatial_unit == self.names.OP_BUILDING_UNIT_T: self.lb_building_unit.setStyleSheet(_color) self.button(self.FinishButton).setEnabled(self.is_constraint_satisfied(parcel_type))
def is_constraint_satisfied(self, parcel_type): constraint_types_of_parcels = LayerConfig.get_constraint_types_of_parcels(self.names) result = True for spatial_unit in constraint_types_of_parcels[parcel_type]: _layer = self._spatial_unit_layers[spatial_unit] if constraint_types_of_parcels[parcel_type][spatial_unit] == 1 and not _layer.selectedFeatureCount() == 1: result = False elif constraint_types_of_parcels[parcel_type][spatial_unit] == '+' and _layer.selectedFeatureCount() < 1: result = False return result
def __init__(self, db, layers, editing_layer): self.__db = db self.__layers = layers self.__editing_layer = editing_layer self.__constraint_types_of_parcels = LayerConfig.get_constraint_types_of_parcels( self.__db.names) self.parcel_type_ili_code = None self.__relatable_layers = dict() self.__init_selectable_layer_by_type()
def adjust_page_2_controls(self): constraint_types_of_parcels = LayerConfig.get_constraint_types_of_parcels( self.names) self.button(self.FinishButton).setDisabled(True) self.disconnect_signals() # Load layers result = self.prepare_feature_creation_layers() if result is None: self.close_wizard(show_message=False) self.dict_parcel_type = dict() for feature in self._layers[ self.names.LC_CONDITION_PARCEL_TYPE_D].getFeatures(): self.dict_parcel_type[feature[ self.names.DISPLAY_NAME_F]] = feature[self.names.ILICODE_F] if self.cb_parcel_type.count() == 0: for feature in self._layers[ self.names.LC_CONDITION_PARCEL_TYPE_D].getFeatures(): if feature[ self.names.ILICODE_F] in constraint_types_of_parcels: self.cb_parcel_type.addItem( feature[self.names.DISPLAY_NAME_F], feature[self.names.T_ID_F]) # Select previous option saved if self.type_of_parcel_selected: index = self.cb_parcel_type.findText( self.type_of_parcel_selected) if index != -1: self.cb_parcel_type.setCurrentIndex(index) self.cb_parcel_type.currentTextChanged.connect( self.validate_type_of_parcel) self.cb_parcel_type.currentTextChanged.emit( self.cb_parcel_type.currentText()) # Check if a previous feature is selected self.check_selected_features() # Register select features by expression if isinstance(self, SelectFeatureByExpressionDialogWrapper): self.register_select_features_by_expression() # Register select features on map if isinstance(self, SelectFeaturesOnMapWrapper): self.register_select_feature_on_map()
def post_save(self, features): constraint_types_of_parcels = LayerConfig.get_constraint_types_of_parcels(self.names) message = QCoreApplication.translate("WizardTranslations", "'{}' tool has been closed because an error occurred while trying to save the data.").format(self.WIZARD_TOOL_NAME) if len(features) != 1: message = QCoreApplication.translate("WizardTranslations", "'{}' tool has been closed. We should have got only one {} by we have {}").format(self.WIZARD_TOOL_NAME, self.WIZARD_FEATURE_NAME, len(features)) self.logger.warning(__name__, "We should have got only one {}, but we have {}".format(self.WIZARD_FEATURE_NAME, len(features))) else: fid = features[0].id() if not self._layers[self.EDITING_LAYER_NAME][LAYER].getFeature(fid).isValid(): self.logger.warning(__name__, "Feature not found in layer {}...".format(self.EDITING_LAYER_NAME)) else: parcel_id = self._layers[self.EDITING_LAYER_NAME][LAYER].getFeature(fid)[self.names.T_ID_F] plot_ids = list() building_ids = list() building_unit_ids = list() # Apply restriction to the selection if self.names.OP_PLOT_T in constraint_types_of_parcels[self.dict_parcel_type[self.cb_parcel_type.currentText()]]: if constraint_types_of_parcels[self.dict_parcel_type[self.cb_parcel_type.currentText()]][self.names.OP_PLOT_T] is not None: plot_ids = [f[self.names.T_ID_F] for f in self._layers[self.names.OP_PLOT_T][LAYER].selectedFeatures()] else: plot_ids = [f[self.names.T_ID_F] for f in self._layers[self.names.OP_PLOT_T][LAYER].selectedFeatures()] if self.names.OP_BUILDING_T in constraint_types_of_parcels[self.dict_parcel_type[self.cb_parcel_type.currentText()]]: if constraint_types_of_parcels[self.dict_parcel_type[self.cb_parcel_type.currentText()]][self.names.OP_BUILDING_T] is not None: building_ids = [f[self.names.T_ID_F] for f in self._layers[self.names.OP_BUILDING_T][LAYER].selectedFeatures()] else: building_ids = [f[self.names.T_ID_F] for f in self._layers[self.names.OP_BUILDING_T][LAYER].selectedFeatures()] if self.names.OP_BUILDING_UNIT_T in constraint_types_of_parcels[self.dict_parcel_type[self.cb_parcel_type.currentText()]]: if constraint_types_of_parcels[self.dict_parcel_type[self.cb_parcel_type.currentText()]][self.names.OP_BUILDING_UNIT_T] is not None: building_unit_ids = [f[self.names.T_ID_F] for f in self._layers[self.names.OP_BUILDING_UNIT_T][LAYER].selectedFeatures()] else: building_unit_ids = [f[self.names.T_ID_F] for f in self._layers[self.names.OP_BUILDING_UNIT_T][LAYER].selectedFeatures()] # Fill uebaunit table new_features = [] for plot_id in plot_ids: new_feature = QgsVectorLayerUtils().createFeature(self._layers[self.names.COL_UE_BAUNIT_T][LAYER]) new_feature.setAttribute(self.names.COL_UE_BAUNIT_T_OP_PLOT_F, plot_id) new_feature.setAttribute(self.names.COL_UE_BAUNIT_T_PARCEL_F, parcel_id) self.logger.info(__name__, "Saving Plot-Parcel: {}-{}".format(plot_id, parcel_id)) new_features.append(new_feature) for building_id in building_ids: new_feature = QgsVectorLayerUtils().createFeature(self._layers[self.names.COL_UE_BAUNIT_T][LAYER]) new_feature.setAttribute(self.names.COL_UE_BAUNIT_T_OP_BUILDING_F, building_id) new_feature.setAttribute(self.names.COL_UE_BAUNIT_T_PARCEL_F, parcel_id) self.logger.info(__name__, "Saving Building-Parcel: {}-{}".format(building_id, parcel_id)) new_features.append(new_feature) for building_unit_id in building_unit_ids: new_feature = QgsVectorLayerUtils().createFeature(self._layers[self.names.COL_UE_BAUNIT_T][LAYER]) new_feature.setAttribute(self.names.COL_UE_BAUNIT_T_OP_BUILDING_UNIT_F, building_unit_id) new_feature.setAttribute(self.names.COL_UE_BAUNIT_T_PARCEL_F, parcel_id) self.logger.info(__name__, "Saving Building Unit-Parcel: {}-{}".format(building_unit_id, parcel_id)) new_features.append(new_feature) self._layers[self.names.COL_UE_BAUNIT_T][LAYER].dataProvider().addFeatures(new_features) if plot_ids and building_ids and building_unit_ids: message = QCoreApplication.translate("WizardTranslations", "The new parcel (t_id={}) was successfully created and associated with its corresponding Plot (t_id={}) and Building(s) (t_id={}) and Building Unit(s) (t_id={})!").format(parcel_id, ", ".join([str(b) for b in plot_ids]), ", ".join([str(b) for b in building_ids]), ", ".join([str(b) for b in building_unit_ids])) elif plot_ids and building_ids and not building_unit_ids: message = QCoreApplication.translate("WizardTranslations", "The new parcel (t_id={}) was successfully created and associated with its corresponding Plot (t_id={}) and Building(s) (t_id={})!").format(parcel_id, ", ".join([str(b) for b in plot_ids]), ", ".join([str(b) for b in building_ids])) elif plot_ids and not building_ids and building_unit_ids: message = QCoreApplication.translate("WizardTranslations", "The new parcel (t_id={}) was successfully created and associated with its corresponding Plot (t_id={}) and Building Unit(s) (t_id={})!").format(parcel_id, ", ".join([str(b) for b in plot_ids]), ", ".join([str(b) for b in building_unit_ids])) elif plot_ids and not building_ids and not building_unit_ids: message = QCoreApplication.translate("WizardTranslations", "The new parcel (t_id={}) was successfully created and associated with its corresponding Plot (t_id={})!").format(parcel_id, ", ".join([str(b) for b in plot_ids])) elif not plot_ids and building_ids and not building_unit_ids: message = QCoreApplication.translate("WizardTranslations", "The new parcel (t_id={}) was successfully created and associated with its corresponding Building(s) (t_id={})!").format(parcel_id, ", ".join([str(b) for b in building_ids])) elif not plot_ids and building_ids and building_unit_ids: message = QCoreApplication.translate("WizardTranslations", "The new parcel (t_id={}) was successfully created and associated with its corresponding Building(s) (t_id={}) and Building Unit(s) (t_id={})!").format(parcel_id, ", ".join([str(b) for b in building_ids]), ", ".join([str(b) for b in building_unit_ids])) elif not plot_ids and not building_ids and building_unit_ids: message = QCoreApplication.translate("WizardTranslations", "The new parcel (t_id={}) was successfully created and associated with its corresponding Building Unit(s) (t_id={})!").format(parcel_id, ", ".join([str(b) for b in building_unit_ids])) elif not plot_ids and not building_ids and not building_unit_ids: message = QCoreApplication.translate("WizardTranslations", "The new parcel (t_id={}) was successfully created but this one wasn't associated with a spatial unit").format(parcel_id) return message