Ejemplo n.º 1
0
def resetCategoriesIfNeeded(layer, units_field, unassigned=True):
    prev_rend = layer.renderer()

    if not isinstance(prev_rend, QgsCategorizedSymbolRenderer):
        renderer = QgsCategorizedSymbolRenderer(units_field)
        layer.setRenderer(renderer)
    else:
        renderer = prev_rend

    prev_cats = renderer.categories()
    id = layer.fields().indexFromName(units_field)
    uniques = list(layer.uniqueValues(id))
    uniques_clean = []

    for u in uniques:
        if u not in [None, NULL]:
            uniques_clean.append(u)

    values = sorted(uniques_clean)

    if unassigned:
        if None in uniques or NULL in uniques:
            values.append("")

    categories = []

    for current, value in enumerate(values):

        already_in = False
        for prev in prev_cats:
            if prev.value() == value:
                already_in = True
                continue

        if not already_in:
            if value == "":
                name = "Unassigned"
            else:
                name = str(value)
            symbol = QgsSymbol.defaultSymbol(layer.geometryType())
            category = QgsRendererCategory(value, symbol, name)
            categories.append(category)

    for cat in categories:
        renderer.addCategory(cat)

    # layer.setRenderer(renderer)
    layer.rendererChanged.emit()
    layer.dataSourceChanged.emit()

    layer.triggerRepaint()
Ejemplo n.º 2
0
def resetCategoriesIfNeeded(layer, units_field):

    prev_rend = layer.renderer()

    if not isinstance(prev_rend, QgsCategorizedSymbolRenderer):
        renderer = QgsCategorizedSymbolRenderer(units_field)
        layer.setRenderer(renderer)
    else:
        renderer = prev_rend

    prev_cats = renderer.categories()

    id = layer.fields().indexFromName(units_field)
    uniques = list(layer.uniqueValues(id))
    uniques = [u for u in uniques if u is not None]

    values = sorted(uniques)
    categories = []

    # delete "old/unused categories"
    for cat in prev_cats:
        cat: QgsRendererCategory
        if cat.value() not in values:
            cat_id = renderer.categoryIndexForValue(cat.value())
            renderer.deleteCategory(cat_id)

    for current, value in enumerate(values):
        already_in = False
        for prev in prev_cats:
            if prev.value() == value:
                already_in = True
                continue

        if not already_in:
            symbol = QgsSymbol.defaultSymbol(layer.geometryType())
            from qgis.PyQt.QtCore import Qt

            symbol.symbolLayer(0).setStrokeStyle(Qt.NoPen)

            category = QgsRendererCategory(value, symbol, str(value))
            categories.append(category)

    for cat in categories:
        renderer.addCategory(cat)

    # layer.setRenderer(renderer)
    layer.rendererChanged.emit()
    layer.dataSourceChanged.emit()

    layer.triggerRepaint()
Ejemplo n.º 3
0
    def resetCategoriesIfNeeded(self, layer, units_field):

        prev_rend = layer.renderer()

        if not isinstance(prev_rend, QgsCategorizedSymbolRenderer):
            renderer = QgsCategorizedSymbolRenderer(units_field)
            layer.setRenderer(renderer)
        else:
            renderer = prev_rend

        prev_cats = renderer.categories()

        id = layer.fields().indexFromName(units_field)
        uniques = list(layer.uniqueValues(id))
        uniques = [u for u in uniques if u is not None]

        values = sorted(uniques)
        categories = []

        for current, value in enumerate(values):

            already_in = False
            for prev in prev_cats:
                if prev.value() == value:
                    already_in = True
                    continue

            if not already_in:
                symbol = QgsSymbol.defaultSymbol(layer.geometryType())
                category = QgsRendererCategory(value, symbol, str(value))
                categories.append(category)

        for cat in categories:
            renderer.addCategory(cat)

        # layer.setRenderer(renderer)
        layer.rendererChanged.emit()
        layer.dataSourceChanged.emit()

        layer.triggerRepaint()