Exemplo n.º 1
0
    def check_for_missing_fonts(symbol: QgsSymbol, feedback: QgsProcessingFeedback):
        """
        Checks for missing (not installed) fonts, and warns
        """

        for l in symbol.symbolLayers():
            try:
                font = l.fontFamily()
            except AttributeError:
                continue

            if font not in QFontDatabase().families():
                feedback.reportError('Warning: font {} not available on system'.format(font))
    def _get_style(self, symbol: QgsSymbol) -> Style:
        self.feedback.pushDebugInfo(str(type(symbol)))

        symbol_opacity: float = symbol.opacity()

        symbol_layer: QgsSymbolLayer = symbol.symbolLayers()[0]
        if symbol_layer.subSymbol() is not None:
            return self._get_style(symbol_layer.subSymbol())

        style: Style = self.style_type.get_style()
        sym_type = SymbolLayerType[symbol_layer.layerType()]
        sym = symbol_layer.properties()

        # Add data defined properties for the style
        if symbol_layer.hasDataDefinedProperties():
            data_defined_props: QgsPropertyCollection = (
                symbol_layer.dataDefinedProperties())
            for key in data_defined_props.propertyKeys():
                prop: QgsProperty = data_defined_props.property(key)
                if prop.field() != "":
                    style.add_data_defined_expression(prop.field(),
                                                      prop.asExpression())

        if isinstance(symbol, QgsFillSymbol):
            if sym_type == SymbolLayerType.SimpleLine:
                style.type = "line"
                style.fill = "#000000"
                style.fill_opacity = 0
                style.stroke = style.rgb_extract(sym["outline_color"])[0]
                style.stroke_opacity = (
                    symbol_opacity *
                    style.rgb_extract(sym["outline_color"])[1])
                style.stroke_width = style.convert_to_pixels(
                    float(sym["outline_width"]), sym["outline_width_unit"])
            if sym_type in [
                    SymbolLayerType.CentroidFill, SymbolLayerType.SimpleFill
            ]:
                if sym_type == SymbolLayerType.CentroidFill:
                    style.type = "circle"
                else:
                    style.type = "square"
                style.fill = style.rgb_extract(sym["color"])[0]
                style.fill_opacity = symbol_opacity * style.rgb_extract(
                    sym["color"])[1]
                style.stroke = style.rgb_extract(sym["outline_color"])[0]
                style.stroke_opacity = (
                    symbol_opacity *
                    style.rgb_extract(sym["outline_color"])[1])
                style.stroke_width = style.convert_to_pixels(
                    float(sym["outline_width"]), sym["outline_width_unit"])

        elif isinstance(symbol, QgsLineSymbol):
            if sym_type == SymbolLayerType.SimpleLine:
                self.feedback.pushDebugInfo(symbol_layer.properties())
                style.type = "line"
                style.fill = "transparent"
                style.fill_opacity = 0
                style.stroke = style.rgb_extract(sym["line_color"])[0]
                style.stroke_opacity = (
                    symbol_opacity * style.rgb_extract(sym["line_color"])[1])
                style.stroke_width = style.convert_to_pixels(
                    float(sym["line_width"]), sym["line_width_unit"])
        elif isinstance(symbol, QgsMarkerSymbol):
            if sym_type == SymbolLayerType.SimpleMarker:
                assert isinstance(style, PointStyle)
                style.type = "circle"
                style.fill = style.rgb_extract(sym["color"])[0]
                style.fill_opacity = symbol_opacity * style.rgb_extract(
                    sym["color"])[1]
                style.has_fill = style.fill_opacity > 0.0
                style.stroke = style.rgb_extract(sym["outline_color"])[0]
                style.stroke_opacity = (
                    symbol_opacity *
                    style.rgb_extract(sym["outline_color"])[1])
                style.stroke_width = style.convert_to_pixels(
                    float(sym["outline_width"]), sym["outline_width_unit"])
                style.has_stroke = style.stroke_opacity > 0.0
                style.radius = style.convert_to_pixels(float(sym["size"]),
                                                       sym["size_unit"])

        else:
            raise ValueError(f"Unkown symbol type: {symbol_layer.layerType()}")
        return style
    def _extract_layer_style(self,
                             symbol: QgsSymbol) -> Tuple[List[int], VisConfig]:
        symbol_opacity: float = symbol.opacity()
        symbol_layer: QgsSymbolLayer = symbol.symbolLayers()[0]
        if symbol_layer.subSymbol() is not None:
            return self._extract_layer_style(symbol_layer.subSymbol())

        sym_type = SymbolLayerType[symbol_layer.layerType()]
        properties = symbol_layer.properties()

        # Default values
        radius = VisConfig.radius
        color_range = ColorRange.create_default()
        radius_range = VisConfig.radius_range

        if isinstance(symbol, QgsMarkerSymbol) or isinstance(
                symbol, QgsFillSymbol):
            fill_rgb, alpha = extract_color(properties['color'])
            opacity = round(symbol_opacity * alpha, 2)
            stroke_rgb, stroke_alpha = extract_color(
                properties['outline_color'])
            stroke_opacity = round(symbol_opacity * stroke_alpha, 2)
            thickness = self._convert_to_pixels(
                float(properties['outline_width']),
                properties['outline_width_unit'])
            outline = stroke_opacity > 0.0 and properties[
                'outline_style'] != 'no'
            stroke_opacity = stroke_opacity if outline else None
            stroke_color = stroke_rgb if outline else None
            filled = opacity > 0.0 and properties.get('style', 'solid') != 'no'

            if isinstance(symbol, QgsMarkerSymbol):
                size_range, height_range, elevation_scale, stroked, enable3_d, wireframe = [
                    None
                ] * 6

                # Fixed radius seems to always be False with point types
                fixed_radius = False

                radius = self._convert_to_pixels(float(properties['size']),
                                                 properties['size_unit'],
                                                 radius=True)
                thickness = thickness if thickness > 0.0 else 1.0  # Hairline in QGIS
            else:
                size_range = VisConfig.size_range
                height_range = VisConfig.height_range
                elevation_scale = VisConfig.elevation_scale
                if outline:
                    stroked = True
                else:
                    stroked = False
                    stroke_color = None
                wireframe, enable3_d = [False] * 2
                fixed_radius, outline = [None] * 2
        elif isinstance(symbol, QgsLineSymbol):
            fill_rgb, stroke_alpha = extract_color(properties['line_color'])
            opacity = round(symbol_opacity * stroke_alpha, 2)
            stroke_opacity = opacity
            thickness = self._convert_to_pixels(
                float(properties['line_width']), properties['line_width_unit'])

            size_range = VisConfig.size_range
            height_range = VisConfig.height_range
            elevation_scale = VisConfig.elevation_scale
            stroked = True
            wireframe, enable3_d, filled = [False] * 3
            stroke_color, fixed_radius, outline = [None] * 3
        else:
            raise QgsPluginNotImplementedException(tr(
                'Symbol type {} is not supported yet', symbol.type()),
                                                   bar_msg=bar_msg())

        thickness = thickness if thickness > 0.0 else VisConfig.thickness

        vis_config = VisConfig(opacity, stroke_opacity, thickness,
                               stroke_color, color_range, color_range, radius,
                               size_range, radius_range, height_range,
                               elevation_scale, stroked, filled, enable3_d,
                               wireframe, fixed_radius, outline)

        return fill_rgb, vis_config