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()
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()
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()