示例#1
0
class RightOfWayManager:

    def __init__(self, db, layers, editing_layer):
        self._db = db
        self.__layers = layers
        self.__translatable_config_strings = TranslatableConfigStrings()
        self.width_line = 1.0

        self._editing_layer = editing_layer
        self.app = None

    def finish_feature_creation(self, layerId, features):
        fid = features[0].id()
        is_valid = False
        feature_tid = None

        if self._editing_layer.getFeature(fid).isValid():
            is_valid = True
            feature_tid = self._editing_layer.getFeature(fid)[self._db.names.T_ID_F]

        return FinishFeatureCreationArgs(is_valid, feature_tid)

    def get_memory_line_layer(self, base_layer):
        translated_strings = self.__translatable_config_strings.get_translatable_config_strings()
        # Add Memory line layer
        temporal_layer = QgsVectorLayer(
            "MultiLineString?crs={}".format(get_crs_authid(base_layer.sourceCrs())),
            translated_strings[RIGHT_OF_WAY_LINE_LAYER], "memory")

        return temporal_layer

    def get_feature_with_buffer_right_of_way(self, tmp_layer, layer):
        params = {'INPUT': tmp_layer,
                  'DISTANCE': self.width_line,
                  'SEGMENTS': 5,
                  'END_CAP_STYLE': 1,  # Flat
                  'JOIN_STYLE': 2,
                  'MITER_LIMIT': 2,
                  'DISSOLVE': False,
                  'OUTPUT': 'memory:'}
        buffered_right_of_way_layer = processing.run("native:buffer", params)['OUTPUT']
        buffer_geometry = buffered_right_of_way_layer.getFeature(1).geometry()
        feature = QgsVectorLayerUtils().createFeature(layer, buffer_geometry)
        tmp_layer.commitChanges()

        return feature

    def add_tmp_feature_to_layer(self, layer, tmp_feature):
        # Add temporal geometry create
        if not layer.isEditable():
            layer.startEditing()

        self.app.core.suppress_form(layer, True)

        layer.addFeature(tmp_feature)
    def get_quality_error_group_names():
        root = QgsProject.instance().layerTreeRoot()
        prefix = TranslatableConfigStrings.get_translatable_config_strings(
        )[ERROR_LAYER_GROUP_PREFIX]
        error_group_names = list()

        for group in root.findGroups(False):
            if group.name().startswith(prefix):
                error_group_names.append(group.name())

        return error_group_names
    def get_quality_error_group(timestamp, create_if_non_existent=True):
        root = QgsProject.instance().layerTreeRoot()
        prefix = TranslatableConfigStrings.get_translatable_config_strings(
        )[ERROR_LAYER_GROUP_PREFIX]
        group_name = "{} {}".format(prefix, timestamp)

        group = root.findGroup(group_name)
        if group is None and create_if_non_existent:
            group = root.insertGroup(0, group_name)
            ilg = qgis.utils.plugins['InvisibleLayersAndGroups']
            ilg.hideGroup(group)
            group.setExpanded(False)

        return group
示例#4
0
    def get_indicators_config(self, node_name, node_type):
        """
        Gets the configuration of layer tree node indicators. Each node could have several indicators.

        :param node_name: Layer tree node name
        :param node_type: QgsLayerTreeNode.NodeType
        :return: List of indicators data. Each indicator config data is a dict, which has these mandatory keys:
                    INDICATOR_TOOLTIP,
                    INDICATOR_ICON,
                    INDICATOR_SLOT
        """
        indicators_config = []
        translated_strings = TranslatableConfigStrings.get_translatable_config_strings(
        )

        if node_type == QgsLayerTreeNode.NodeGroup:
            if node_name == translated_strings[ERROR_LAYER_GROUP]:
                indicators_config = [{
                    INDICATOR_TOOLTIP:
                    QCoreApplication.translate(
                        "LayerTreeIndicatorConfig",
                        "<b>Export</b><br>Export quality errors to GeoPackage"
                    ),
                    INDICATOR_ICON:
                    QIcon(":/Asistente-LADM-COL/resources/images/save.svg"),
                    INDICATOR_SLOT:
                    self._slot_caller.export_error_group
                }, {
                    INDICATOR_TOOLTIP:
                    QCoreApplication.translate(
                        "LayerTreeIndicatorConfig",
                        "<b>Export</b><br>Export quality errors to PDF"),
                    INDICATOR_ICON:
                    QIcon(":/Asistente-LADM-COL/resources/images/pdf.svg"),
                    INDICATOR_SLOT:
                    self._slot_caller.show_log_quality_dialog
                }]
        elif node_type == QgsLayerTreeNode.NodeLayer:
            pass

        return indicators_config
示例#5
0
 def get_error_layers_group(self):
     """
     Get the topology errors group. If it exists but is placed in another
     position rather than the top, it moves the group to the top.
     """
     root = QgsProject.instance().layerTreeRoot()
     translated_strings = TranslatableConfigStrings.get_translatable_config_strings(
     )
     group = root.findGroup(translated_strings[ERROR_LAYER_GROUP])
     if group is None:
         group = root.insertGroup(0, translated_strings[ERROR_LAYER_GROUP])
         self.add_indicators_requested.emit(
             translated_strings[ERROR_LAYER_GROUP],
             QgsLayerTreeNode.NodeGroup)
     elif not self.iface.layerTreeView().layerTreeModel().node2index(
             group).row() == 0 or type(group.parent()) is QgsLayerTreeGroup:
         group_clone = group.clone()
         root.insertChildNode(0, group_clone)
         parent = group.parent()
         parent.removeChildNode(group)
         group = group_clone
     return group
示例#6
0
class QgisModelBakerUtils(QObject):
    def __init__(self):
        QObject.__init__(self)
        self.logger = Logger()
        from asistente_ladm_col.config.config_db_supported import ConfigDBsSupported
        self._dbs_supported = ConfigDBsSupported()
        self.translatable_config_strings = TranslatableConfigStrings()

    def get_generator(self, db):
        if 'QgisModelBaker' in qgis.utils.plugins:
            tool = self._dbs_supported.get_db_factory(
                db.engine).get_model_baker_db_ili_mode()

            QgisModelBaker = qgis.utils.plugins["QgisModelBaker"]
            generator = QgisModelBaker.get_generator()(
                tool, db.uri, "smart2", db.schema, pg_estimated_metadata=False)
            return generator
        else:
            self.logger.critical(
                __name__,
                QCoreApplication.translate(
                    "AsistenteLADMCOLPlugin",
                    "The QGIS Model Baker plugin is a prerequisite, install it before using LADM-COL Assistant."
                ))
            return None

    def get_model_baker_db_connection(self, db):
        generator = self.get_generator(db)
        if generator is not None:
            return generator._db_connector

        return None

    def load_layers(self, db, layer_list):
        """
        Load a selected list of layers from qgis model baker.
        This call should configure relations and bag of enums
        between layers being loaded, but not when a layer already
        loaded has a relation or is part of a bag of enum. For
        that case, we use a cached set of relations and bags of
        enums that we get only once per session and configure in
        the Asistente LADM-COL.
        """
        translated_strings = self.translatable_config_strings.get_translatable_config_strings(
        )

        if 'QgisModelBaker' in qgis.utils.plugins:
            QgisModelBaker = qgis.utils.plugins["QgisModelBaker"]

            tool = self._dbs_supported.get_db_factory(
                db.engine).get_model_baker_db_ili_mode()

            generator = QgisModelBaker.get_generator()(
                tool, db.uri, "smart2", db.schema, pg_estimated_metadata=False)
            layers = generator.layers(layer_list)
            relations, bags_of_enum = generator.relations(layers, layer_list)
            legend = generator.legend(
                layers,
                ignore_node_names=[translated_strings[ERROR_LAYER_GROUP]])
            QgisModelBaker.create_project(layers,
                                          relations,
                                          bags_of_enum,
                                          legend,
                                          auto_transaction=False)
        else:
            self.logger.critical(
                __name__,
                QCoreApplication.translate(
                    "AsistenteLADMCOLPlugin",
                    "The QGIS Model Baker plugin is a prerequisite, install it before using LADM-COL Assistant."
                ))

    def get_required_layers_without_load(self, layer_list, db):
        """
        Gets a list of layers from a list of layer names using QGIS Model Baker.
        Layers are register in QgsProject, but not loaded to the canvas!
        :param layer_list: list of layers names (e.g., ['lc_terreno', 'lc_lindero'])
        :param db: db connection
        :return: list of QgsVectorLayers registered in the project
        """
        layers = list()
        if 'QgisModelBaker' in qgis.utils.plugins:
            QgisModelBaker = qgis.utils.plugins["QgisModelBaker"]

            tool = self._dbs_supported.get_db_factory(
                db.engine).get_model_baker_db_ili_mode()
            generator = QgisModelBaker.get_generator()(
                tool, db.uri, "smart2", db.schema, pg_estimated_metadata=False)
            model_baker_layers = generator.layers(layer_list)

            for model_baker_layer in model_baker_layers:
                layer = model_baker_layer.create(
                )  # Convert Model Baker layer to QGIS layer
                QgsProject.instance().addMapLayer(
                    layer, False)  # Do not load it to canvas
                layers.append(layer)
        else:
            self.logger.critical(
                __name__,
                QCoreApplication.translate(
                    "AsistenteLADMCOLPlugin",
                    "The QGIS Model Baker plugin is a prerequisite, install it before using LADM-COL Assistant."
                ))

        return layers

    def get_layers_and_relations_info(self, db):
        """
        Called once per session, this is used to get information
        of all relations and bags of enums in the DB and cache it
        in the Asistente LADM-COL.
        """
        if 'QgisModelBaker' in qgis.utils.plugins:
            generator = self.get_generator(db)

            layers = generator.get_tables_info_without_ignored_tables()
            relations = [
                relation for relation in generator.get_relations_info()
            ]
            self.logger.debug(
                __name__,
                "Relationships before filter: {}".format(len(relations)))
            self.filter_relations(relations)
            self.logger.debug(
                __name__,
                "Relationships after filter: {}".format(len(relations)))
            return (layers, relations, {})
        else:
            self.logger.critical(
                __name__,
                QCoreApplication.translate(
                    "AsistenteLADMCOLPlugin",
                    "The QGIS Model Baker plugin is a prerequisite, install it before using LADM-COL Assistant."
                ))
            return (list(), list(), dict())

    def filter_relations(self, relations):
        """
        Modifies the input list of relations, removing elements that meet a condition.

        :param relations: List of a dict of relations.
        :return: Nothing, changes the input list of relations.
        """
        to_delete = list()
        for relation in relations:
            if relation[QueryNames.REFERENCING_FIELD].startswith(
                    'uej2_') or relation[
                        QueryNames.REFERENCING_FIELD].startswith('ue_'):
                to_delete.append(relation)

        for idx in to_delete:
            relations.remove(idx)

    def get_tables_info_without_ignored_tables(self, db):
        if 'QgisModelBaker' in qgis.utils.plugins:
            generator = self.get_generator(db)
            return generator.get_tables_info_without_ignored_tables()
        else:
            self.logger.critical(
                __name__,
                QCoreApplication.translate(
                    "AsistenteLADMCOLPlugin",
                    "The QGIS Model Baker plugin is a prerequisite, install it before using LADM-COL Assistant."
                ))

    def get_first_index_for_layer_type(
        self, layer_type, group=QgsProject.instance().layerTreeRoot()):
        if 'QgisModelBaker' in qgis.utils.plugins:
            import QgisModelBaker
            return QgisModelBaker.utils.qgis_utils.get_first_index_for_layer_type(
                layer_type, group)
        return None

    @staticmethod
    def get_suggested_index_for_layer(layer, group):
        if 'QgisModelBaker' in qgis.utils.plugins:
            import QgisModelBaker
            return QgisModelBaker.utils.qgis_utils.get_suggested_index_for_layer(
                layer, group)
        return None
class QualityDialog(QDialog, DIALOG_UI):
    def __init__(self, db, qgis_utils, quality, parent=None):
        QDialog.__init__(self, parent)
        self.setupUi(self)
        self._db = db
        self.qgis_utils = qgis_utils
        self.quality = quality
        self.names = self._db.names
        self.translatable_config_strings = TranslatableConfigStrings()

        self.trw_quality_rules.setItemsExpandable(False)
        self.trw_quality_rules.itemSelectionChanged.connect(
            self.validate_selection_rules)
        self.trw_quality_rules.itemSelectionChanged.emit()

        # Set connections
        self.buttonBox.accepted.connect(self.accepted)
        self.buttonBox.rejected.connect(self.rejected)
        self.buttonBox.helpRequested.connect(self.show_help)
        self.btn_select_all.clicked.connect(self.select_all)
        self.btn_clear_selection.clicked.connect(self.clear_selection)

        translated_strings = self.translatable_config_strings.get_translatable_config_strings(
        )

        self.items_dict = collections.OrderedDict()
        self.items_dict[QCoreApplication.translate(
            "QualityDialog", "Rules for Points"
        )] = {
            'icon':
            'points',
            'rules': [{
                'id':
                'check_overlaps_in_boundary_points',
                'text':
                translated_strings[CHECK_OVERLAPS_IN_BOUNDARY_POINTS]
            }, {
                'id':
                'check_overlaps_in_control_points',
                'text':
                translated_strings[CHECK_OVERLAPS_IN_CONTROL_POINTS]
            }, {
                'id':
                'check_boundary_points_covered_by_boundary_nodes',
                'text':
                translated_strings[
                    CHECK_BOUNDARY_POINTS_COVERED_BY_BOUNDARY_NODES]
            }, {
                'id':
                'check_boundary_points_covered_by_plot_nodes',
                'text':
                translated_strings[CHECK_BOUNDARY_POINTS_COVERED_BY_PLOT_NODES]
            }]
        }
        self.items_dict[QCoreApplication.translate(
            "QualityDialog", "Rules for Lines")] = {
                'icon':
                'lines',
                'rules': [{
                    'id':
                    'check_overlaps_in_boundaries',
                    'text':
                    translated_strings[CHECK_OVERLAPS_IN_BOUNDARIES]
                }, {
                    'id':
                    'check_boundaries_are_not_split',
                    'text':
                    translated_strings[CHECK_BOUNDARIES_ARE_NOT_SPLIT]
                }, {
                    'id':
                    'check_boundaries_covered_by_plots',
                    'text':
                    translated_strings[CHECK_BOUNDARIES_COVERED_BY_PLOTS]
                }, {
                    'id':
                    'check_boundary_nodes_covered_by_boundary_points',
                    'text':
                    translated_strings[
                        CHECK_BOUNDARY_NODES_COVERED_BY_BOUNDARY_POINTS]
                }, {
                    'id':
                    'check_dangles_in_boundaries',
                    'text':
                    translated_strings[CHECK_DANGLES_IN_BOUNDARIES]
                }]
            }
        self.items_dict[QCoreApplication.translate(
            "QualityDialog", "Rules for Polygons"
        )] = {
            'icon':
            'polygons',
            'rules': [
                {
                    'id': 'check_overlaps_in_plots',
                    'text': translated_strings[CHECK_OVERLAPS_IN_PLOTS]
                },
                {
                    'id': 'check_overlaps_in_buildings',
                    'text': translated_strings[CHECK_OVERLAPS_IN_BUILDINGS]
                },
                {
                    'id': 'check_overlaps_in_rights_of_way',
                    'text': translated_strings[CHECK_OVERLAPS_IN_RIGHTS_OF_WAY]
                },
                {
                    'id': 'check_plots_covered_by_boundaries',
                    'text':
                    translated_strings[CHECK_PLOTS_COVERED_BY_BOUNDARIES]
                    #}, {
                    #    'id': 'check_missing_survey_points_in_buildings',
                    #    'text': QCoreApplication.translate("QualityDialog", "Buildings nodes should be covered by Survey Points")
                },
                {
                    'id':
                    'check_right_of_way_overlaps_buildings',
                    'text':
                    translated_strings[CHECK_RIGHT_OF_WAY_OVERLAPS_BUILDINGS]
                },
                {
                    'id': 'check_gaps_in_plots',
                    'text': translated_strings[CHECK_GAPS_IN_PLOTS]
                },
                {
                    'id': 'check_multipart_in_right_of_way',
                    'text': translated_strings[CHECK_MULTIPART_IN_RIGHT_OF_WAY]
                },
                {
                    'id':
                    'check_plot_nodes_covered_by_boundary_points',
                    'text':
                    translated_strings[
                        CHECK_PLOT_NODES_COVERED_BY_BOUNDARY_POINTS]
                },
                {
                    'id': 'check_buildings_should_be_within_plots',
                    'text': translated_strings[CHECK_BUILDING_WITHIN_PLOTS]
                },
                {
                    'id': 'check_building_units_should_be_within_plots',
                    'text':
                    translated_strings[CHECK_BUILDING_UNIT_WITHIN_PLOTS]
                }
            ]
        }

        self.items_dict[QCoreApplication.translate(
            "QualityDialog", "Logic consistency rules")] = {
                'icon':
                'tables',
                'rules': [{
                    'id':
                    'check_parcel_right_relationship',
                    'text':
                    translated_strings[CHECK_PARCEL_RIGHT_RELATIONSHIP]
                }, {
                    'id':
                    'find_duplicate_records_in_a_table',
                    'text':
                    translated_strings[FIND_DUPLICATE_RECORDS_IN_A_TABLE]
                }, {
                    'id':
                    'check_fraction_sum_for_party_groups',
                    'text':
                    translated_strings[CHECK_FRACTION_SUM_FOR_PARTY_GROUPS]
                }, {
                    'id':
                    'check_department_code_has_two_numerical_characters',
                    'text':
                    translated_strings[
                        CHECK_DEPARMENT_CODE_HAS_TWO_NUMERICAL_CHARACTERS]
                }, {
                    'id':
                    'check_municipality_code_has_three_numerical_characters',
                    'text':
                    translated_strings[
                        CHECK_MUNICIPALITY_CODE_HAS_THREE_NUMERICAL_CHARACTERS]
                }, {
                    'id':
                    'check_parcel_number_has_30_numerical_characters',
                    'text':
                    translated_strings[
                        CHECK_PARCEL_NUMBER_HAS_30_NUMERICAL_CHARACTERS]
                }, {
                    'id':
                    'check_parcel_number_before_has_20_numerical_characters',
                    'text':
                    translated_strings[
                        CHECK_PARCEL_NUMBER_BEFORE_HAS_20_NUMERICAL_CHARACTERS]
                }, {
                    'id':
                    'check_col_party_natural_type',
                    'text':
                    translated_strings[CHECK_COL_PARTY_NATURAL_TYPE]
                }, {
                    'id':
                    'check_col_party_legal_type',
                    'text':
                    translated_strings[CHECK_COL_PARTY_LEGAL_TYPE]
                }, {
                    'id':
                    'check_parcel_type_and_22_position_of_parcel_number',
                    'text':
                    translated_strings[
                        CHECK_PARCEL_TYPE_AND_22_POSITON_OF_PARCEL_NUMBER]
                }, {
                    'id': 'check_uebaunit_parcel',
                    'text': translated_strings[CHECK_UEBAUNIT_PARCEL]
                }]
            }

        self.load_items()

    def validate_selection_rules(self):
        # At least one quality rule must have been selected
        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(
            bool(self.trw_quality_rules.selectedItems()))

    def load_items(self):
        self.trw_quality_rules.setUpdatesEnabled(
            False)  # Don't render until we're ready
        self.trw_quality_rules.clear()

        font = QFont()
        font.setBold(True)

        for group, items in self.items_dict.items():
            children = []
            group_item = QTreeWidgetItem([group])
            group_item.setData(0, Qt.BackgroundRole,
                               QBrush(QColor(219, 219, 219, 255)))
            group_item.setData(0, Qt.FontRole, font)
            icon = QIcon(":/Asistente-LADM_COL/resources/images/{}.png".format(
                items['icon']))
            group_item.setData(0, Qt.DecorationRole, icon)

            for rule in items['rules']:
                rule_item = QTreeWidgetItem([rule['text']])
                rule_item.setData(0, Qt.UserRole, rule['id'])

                children.append(rule_item)

            group_item.addChildren(children)
            self.trw_quality_rules.addTopLevelItem(group_item)

        # Make group items non selectable and expanded
        for i in range(self.trw_quality_rules.topLevelItemCount()):
            self.trw_quality_rules.topLevelItem(i).setFlags(
                Qt.ItemIsEnabled)  # Not selectable
            self.trw_quality_rules.topLevelItem(i).setExpanded(True)

        self.trw_quality_rules.setUpdatesEnabled(True)  # Now render!

    def accepted(self):
        # we erase the group error layer every time it runs because we assume that data set changes.
        self.qgis_utils.remove_error_group_requested.emit()
        self.quality.initialize_log_dialog_quality()
        selected_count = len(self.trw_quality_rules.selectedItems())

        if selected_count > 0:
            self.quality.set_count_topology_rules(selected_count)
        translated_strings = self.translatable_config_strings.get_translatable_config_strings(
        )

        iterator = QTreeWidgetItemIterator(self.trw_quality_rules,
                                           QTreeWidgetItemIterator.Selectable)
        while iterator.value():
            item = iterator.value()

            if item.isSelected():
                id = item.data(0, Qt.UserRole)
                rule_name = item.text(0)

                # NOTE: Do not remove the named parameters, this is needed for making a decorator that thinks they are
                # optional happy!
                if id == 'check_overlaps_in_boundary_points':
                    self.quality.check_overlapping_points(
                        self._db,
                        point_layer_name=self.names.OP_BOUNDARY_POINT_T,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_overlaps_in_control_points':
                    self.quality.check_overlapping_points(
                        self._db,
                        point_layer_name=self.names.OP_CONTROL_POINT_T,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_boundary_points_covered_by_boundary_nodes':
                    self.quality.check_boundary_points_covered_by_boundary_nodes(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_boundary_points_covered_by_plot_nodes':
                    self.quality.check_boundary_points_covered_by_plot_nodes(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_overlaps_in_boundaries':
                    self.quality.check_overlaps_in_boundaries(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_boundaries_are_not_split':
                    self.quality.check_boundaries_are_not_split(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_boundaries_covered_by_plots':
                    self.quality.check_boundaries_covered_by_plots(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_boundary_nodes_covered_by_boundary_points':
                    self.quality.check_boundary_nodes_covered_by_boundary_points(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_dangles_in_boundaries':
                    self.quality.check_dangles_in_boundaries(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_overlaps_in_plots':
                    self.quality.check_overlapping_polygons(
                        self._db,
                        polygon_layer_name=self.names.OP_PLOT_T,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_overlaps_in_buildings':
                    self.quality.check_overlapping_polygons(
                        self._db,
                        polygon_layer_name=self.names.OP_BUILDING_T,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_overlaps_in_rights_of_way':
                    self.quality.check_overlapping_polygons(
                        self._db,
                        polygon_layer_name=self.names.OP_RIGHT_OF_WAY_T,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_plots_covered_by_boundaries':
                    self.quality.check_plots_covered_by_boundaries(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                #elif id == 'check_missing_survey_points_in_buildings':
                #    self.quality.check_missing_survey_points_in_buildings(self._db)
                elif id == 'check_right_of_way_overlaps_buildings':
                    self.quality.check_right_of_way_overlaps_buildings(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_gaps_in_plots':
                    self.quality.check_gaps_in_plots(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_multipart_in_right_of_way':
                    self.quality.check_multiparts_in_right_of_way(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_plot_nodes_covered_by_boundary_points':
                    self.quality.check_plot_nodes_covered_by_boundary_points(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_buildings_should_be_within_plots':
                    self.quality.check_building_within_plots(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_building_units_should_be_within_plots':
                    self.quality.check_building_unit_within_plots(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'check_parcel_right_relationship':
                    self.quality.check_parcel_right_relationship(
                        self._db,
                        rule_name=rule_name,
                        translated_strings=translated_strings)
                elif id == 'find_duplicate_records_in_a_table':
                    self.quality.find_duplicate_records_in_a_table(
                        self._db, rule_name=rule_name)
                elif id == 'check_fraction_sum_for_party_groups':
                    self.quality.check_fraction_sum_for_party_groups(
                        self._db, rule_name=rule_name)
                elif id == 'check_department_code_has_two_numerical_characters':
                    self.quality.basic_logic_validations(
                        self._db,
                        rule='DEPARTMENT_CODE_VALIDATION',
                        rule_name=rule_name)
                elif id == 'check_municipality_code_has_three_numerical_characters':
                    self.quality.basic_logic_validations(
                        self._db,
                        rule='MUNICIPALITY_CODE_VALIDATION',
                        rule_name=rule_name)
                elif id == 'check_parcel_number_has_30_numerical_characters':
                    self.quality.basic_logic_validations(
                        self._db,
                        rule='PARCEL_NUMBER_VALIDATION',
                        rule_name=rule_name)
                elif id == 'check_parcel_number_before_has_20_numerical_characters':
                    self.quality.basic_logic_validations(
                        self._db,
                        rule='PARCEL_NUMBER_BEFORE_VALIDATION',
                        rule_name=rule_name)
                elif id == 'check_col_party_natural_type':
                    self.quality.advanced_logic_validations(
                        self._db,
                        rule='COL_PARTY_TYPE_NATURAL_VALIDATION',
                        rule_name=rule_name)
                elif id == 'check_col_party_legal_type':
                    self.quality.advanced_logic_validations(
                        self._db,
                        rule='COL_PARTY_TYPE_NO_NATURAL_VALIDATION',
                        rule_name=rule_name)
                elif id == 'check_parcel_type_and_22_position_of_parcel_number':
                    self.quality.advanced_logic_validations(
                        self._db,
                        rule=
                        'PARCEL_TYPE_AND_22_POSITION_OF_PARCEL_NUMBER_VALIDATION',
                        rule_name=rule_name)
                elif id == 'check_uebaunit_parcel':
                    self.quality.advanced_logic_validations(
                        self._db,
                        rule='UEBAUNIT_PARCEL_VALIDATION',
                        rule_name=rule_name)

            iterator += 1

        if selected_count > 0:
            self.quality.generate_log_button()

        if self.qgis_utils.error_group_exists():
            group = self.qgis_utils.get_error_layers_group()
            # # Check if group layer is empty
            if group.findLayers():
                self.qgis_utils.set_error_group_visibility(True)
            else:
                self.qgis_utils.remove_error_group_requested.emit()

    def rejected(self):
        pass

    def select_all(self):
        self.trw_quality_rules.selectAll()

    def clear_selection(self):
        self.trw_quality_rules.clearSelection()

    def show_help(self):
        self.qgis_utils.show_help("quality_rules")
class Symbology:
    ERROR_LAYER = 'error_layer'

    def __init__(self):
        self.translatable_config_strings = TranslatableConfigStrings()

    def get_default_style_group(self, names):
         return {
            names.OP_BOUNDARY_T: {
                QgsWkbTypes.LineGeometry: 'style_boundary'
            },
            names.OP_BOUNDARY_POINT_T: {
                QgsWkbTypes.PointGeometry: 'style_boundary_point'
            },
            names.OP_SURVEY_POINT_T: {
                QgsWkbTypes.PointGeometry: 'style_survey_point'
            },
            names.OP_CONTROL_POINT_T: {
                QgsWkbTypes.PointGeometry: 'style_control_point'
            },
            names.OP_PLOT_T: {
                QgsWkbTypes.PointGeometry: 'style_plot_point',
                QgsWkbTypes.PolygonGeometry: 'style_plot_polygon'
            },
            names.OP_BUILDING_T: {
                QgsWkbTypes.PointGeometry: 'style_building_point',
                QgsWkbTypes.PolygonGeometry: 'style_building'
            },
            names.OP_BUILDING_UNIT_T: {
                QgsWkbTypes.PointGeometry: 'style_building_unit_point',
                QgsWkbTypes.PolygonGeometry: 'style_building_unit_25'
            },
            names.OP_RIGHT_OF_WAY_T: {
                QgsWkbTypes.PointGeometry: 'style_right_of_way_point',
                QgsWkbTypes.PolygonGeometry: 'style_right_of_way'
            },
            self.ERROR_LAYER: {
                QgsWkbTypes.PointGeometry: 'style_point_error',
                QgsWkbTypes.LineGeometry: 'style_line_error',
                QgsWkbTypes.PolygonGeometry: 'style_polygon_error'
            }
        }

    def get_supplies_style_group(self, names):
        return {
            names.GC_PLOT_T: {
                QgsWkbTypes.PolygonGeometry: 'style_supplies_plot_polygon'
            }
        }

    def get_custom_error_layers(self):
        translated_strings = self.translatable_config_strings.get_translatable_config_strings()

        return {
            translated_strings[CHECK_BOUNDARIES_COVERED_BY_PLOTS]: {
                'es': 'style_boundary_should_be_covered_by_plot_es',
                'en': 'style_boundary_should_be_covered_by_plot_en'
            },
            translated_strings[CHECK_PLOTS_COVERED_BY_BOUNDARIES]: {
                'es': 'style_plot_should_be_covered_by_boundary_es',
                'en': 'style_plot_should_be_covered_by_boundary_en'
            },
            translated_strings[CHECK_BOUNDARY_POINTS_COVERED_BY_BOUNDARY_NODES]: {
                'es': 'style_boundary_points_should_be_covered_by_boundary_nodes_es',
                'en': 'style_boundary_points_should_be_covered_by_boundary_nodes_en'
            },
            translated_strings[CHECK_BOUNDARY_NODES_COVERED_BY_BOUNDARY_POINTS]: {
                'es': 'style_boundary_nodes_should_be_covered_by_boundary_points_es',
                'en': 'style_boundary_nodes_should_be_covered_by_boundary_points_en'
             }
        }

    def get_error_layer_name(self):
        return self.ERROR_LAYER
示例#9
0
 def error_group_exists(self):
     root = QgsProject.instance().layerTreeRoot()
     translated_strings = TranslatableConfigStrings.get_translatable_config_strings(
     )
     return root.findGroup(
         translated_strings[ERROR_LAYER_GROUP]) is not None