Example #1
0
def remove_mask_filter(layer):
    if not isinstance(layer, QgsVectorLayer):
        return False

    # check if a layer has already a mask filter enabled
    if layer.labeling() is None:
        return False

    settings = layer.labeling().settings()

    try:
        if settings.dataDefinedProperties().hasProperty(QgsPalLayerSettings.Show) and \
                settings.dataDefinedProperties().property(QgsPalLayerSettings.Show).expressionString().startswith(SPATIAL_FILTER):
            # new settings
            settings = QgsPalLayerSettings(layer.labeling().settings())
            settings.dataDefinedProperties().setProperty(QgsPalLayerSettings.Show, True)
            if isinstance(layer.labeling(), QgsVectorLayerSimpleLabeling):
                layer.setLabeling(QgsVectorLayerSimpleLabeling(settings))
    except Exception as e:
        for m in e.args:
            QgsMessageLog.logMessage(m, 'Extensions')
Example #2
0
def add_mask_filter(layer):
    if not isinstance(layer, QgsVectorLayer):
        return False

    
    # check if a layer has already a mask filter enabled
    if layer.labeling() is None:
        return False

    try:
        expr = "%s(%d)" % (SPATIAL_FILTER, layer.crs().postgisSrid())
        prop = QgsProperty()
        prop.setExpressionString(expr)

        # new settings
        settings = QgsPalLayerSettings(layer.labeling().settings())
        settings.dataDefinedProperties().setProperty(QgsPalLayerSettings.Show, prop)
        if isinstance(layer.labeling(), QgsVectorLayerSimpleLabeling):
            layer.setLabeling(QgsVectorLayerSimpleLabeling(settings))
        
    except Exception as e:
        for m in e.args:
            QgsMessageLog.logMessage(m, 'Extensions')
Example #3
0
def add_mask_filter(layer):
    if not isinstance(layer, QgsVectorLayer):
        return False

    # check if a layer has already a mask filter enabled
    if layer.labeling() is None:
        return False

    try:
        expr = "%s(%d)" % (SPATIAL_FILTER, layer.crs().postgisSrid())
        prop = QgsProperty()
        prop.setExpressionString(expr)

        # new settings
        settings = QgsPalLayerSettings(layer.labeling().settings())
        settings.dataDefinedProperties().setProperty(QgsPalLayerSettings.Show,
                                                     prop)
        if isinstance(layer.labeling(), QgsVectorLayerSimpleLabeling):
            layer.setLabeling(QgsVectorLayerSimpleLabeling(settings))

    except Exception as e:
        for m in e.args:
            QgsMessageLog.logMessage(m, "Extensions")
Example #4
0
def remove_mask_filter(layer):
    if not isinstance(layer, QgsVectorLayer):
        return False

    # check if a layer has already a mask filter enabled
    if layer.labeling() is None:
        return False

    settings = layer.labeling().settings()

    try:
        if settings.dataDefinedProperties().hasProperty(
                QgsPalLayerSettings.Show) and settings.dataDefinedProperties(
                ).property(QgsPalLayerSettings.Show).expressionString(
                ).startswith(SPATIAL_FILTER):
            # new settings
            settings = QgsPalLayerSettings(layer.labeling().settings())
            settings.dataDefinedProperties().setProperty(
                QgsPalLayerSettings.Show, True)
            if isinstance(layer.labeling(), QgsVectorLayerSimpleLabeling):
                layer.setLabeling(QgsVectorLayerSimpleLabeling(settings))
    except Exception as e:
        for m in e.args:
            QgsMessageLog.logMessage(m, "Extensions")
Example #5
0
    def testCreateProperty(self):
        s = QgsAuxiliaryStorage()
        self.assertTrue(s.isValid())

        # Create a new auxiliary layer with 'pk' as key
        vl = createLayer()
        pkf = vl.fields().field(vl.fields().indexOf('pk'))
        al = s.createAuxiliaryLayer(pkf, vl)
        self.assertTrue(al.isValid())
        vl.setAuxiliaryLayer(al)

        # Create a new labeling property on layer without labels
        key = QgsPalLayerSettings.PositionX
        index = QgsAuxiliaryLayer.createProperty(key, vl)
        self.assertEqual(index, -1)

        vl.setLabeling(QgsVectorLayerSimpleLabeling(QgsPalLayerSettings()))
        index = QgsAuxiliaryLayer.createProperty(key, vl)

        p = QgsPalLayerSettings.propertyDefinitions()[key]
        afName = QgsAuxiliaryLayer.nameFromProperty(p, True)
        afIndex = vl.fields().indexOf(afName)
        self.assertEqual(index, afIndex)

        # with existing property
        key = QgsPalLayerSettings.PositionY
        settings = QgsPalLayerSettings()
        settings.dataDefinedProperties().setProperty(key, QgsProperty.fromExpression('$y + 20'))
        vl.setLabeling(QgsVectorLayerSimpleLabeling(settings))

        # without overwriting existing, property should be upgraded to coalesce("aux field", 'existing expression') type
        index = QgsAuxiliaryLayer.createProperty(key, vl, False)
        p = QgsPalLayerSettings.propertyDefinitions()[key]
        afName = QgsAuxiliaryLayer.nameFromProperty(p, True)
        afIndex = vl.fields().indexOf(afName)
        self.assertEqual(index, afIndex)

        settings = vl.labeling().settings()
        self.assertTrue(settings.dataDefinedProperties().property(key).isActive())
        self.assertEqual(settings.dataDefinedProperties().property(key).asExpression(), 'coalesce("auxiliary_storage_labeling_positiony",$y + 20)')

        # with existing but invalid field name
        key = QgsPalLayerSettings.PositionY
        settings = QgsPalLayerSettings()
        settings.dataDefinedProperties().setProperty(key, QgsProperty.fromField(''))
        vl.setLabeling(QgsVectorLayerSimpleLabeling(settings))

        # even when asked to not overwrite existing, this is an invalid property and should be overwritten
        index = QgsAuxiliaryLayer.createProperty(key, vl, False)
        p = QgsPalLayerSettings.propertyDefinitions()[key]
        afName = QgsAuxiliaryLayer.nameFromProperty(p, True)
        afIndex = vl.fields().indexOf(afName)
        self.assertEqual(index, afIndex)

        settings = vl.labeling().settings()
        self.assertTrue(settings.dataDefinedProperties().property(key).isActive())
        self.assertEqual(settings.dataDefinedProperties().property(key).asExpression(), '"auxiliary_storage_labeling_positiony"')

        # with existing valid field name
        key = QgsPalLayerSettings.PositionY
        settings = QgsPalLayerSettings()
        settings.dataDefinedProperties().setProperty(key, QgsProperty.fromField('asd'))
        vl.setLabeling(QgsVectorLayerSimpleLabeling(settings))

        index = QgsAuxiliaryLayer.createProperty(key, vl, False)
        p = QgsPalLayerSettings.propertyDefinitions()[key]
        afName = QgsAuxiliaryLayer.nameFromProperty(p, True)
        afIndex = vl.fields().indexOf(afName)
        self.assertEqual(index, afIndex)

        settings = vl.labeling().settings()
        self.assertTrue(settings.dataDefinedProperties().property(key).isActive())
        self.assertEqual(settings.dataDefinedProperties().property(key).asExpression(), 'coalesce("auxiliary_storage_labeling_positiony","asd")')

        # with overwrite existing
        key = QgsPalLayerSettings.Show
        settings = QgsPalLayerSettings()
        settings.dataDefinedProperties().setProperty(key, QgsProperty.fromExpression('$y > 20'))
        vl.setLabeling(QgsVectorLayerSimpleLabeling(settings))

        # existing property should be discarded
        index = QgsAuxiliaryLayer.createProperty(key, vl, True)
        p = QgsPalLayerSettings.propertyDefinitions()[key]
        afName = QgsAuxiliaryLayer.nameFromProperty(p, True)
        afIndex = vl.fields().indexOf(afName)
        self.assertEqual(index, afIndex)

        settings = vl.labeling().settings()
        self.assertTrue(settings.dataDefinedProperties().property(key).isActive())
        self.assertEqual(settings.dataDefinedProperties().property(key).field(), 'auxiliary_storage_labeling_show')
Example #6
0
    def convert_fdo_annotations(dest_layer: QgsVectorLayer, context):  # pylint: disable=unused-argument
        """
        Converts FDO annotations
        """
        # one label class, use simple labeling
        label_settings = QgsPalLayerSettings()
        label_settings.fieldName = 'TextString'
        label_settings.drawLabels = True
        label_settings.placement = QgsPalLayerSettings.OverPoint
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.Family, QgsProperty.fromField('FontName'))
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.Size, QgsProperty.fromField('FontSize'))
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.Bold, QgsProperty.fromField('Bold'))
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.Italic, QgsProperty.fromField('Italic'))
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.Underline, QgsProperty.fromField('Underline'))

        quadrant_property = QgsProperty.fromExpression("""case
    when  "VerticalAlignment" = 0 then -- top
    case
        when  "HorizontalAlignment" = 0 then 0
        when  "HorizontalAlignment" = 1 then 1
        when  "HorizontalAlignment" = 2 then 2
    end

    when  "VerticalAlignment" = 1 then -- center
    case
        when  "HorizontalAlignment" = 0 then 3
        when  "HorizontalAlignment" = 1 then 4
        when  "HorizontalAlignment" = 2 then 5
    end

    when  "VerticalAlignment" in (2,3) then -- baseline, bottom
    case
        when  "HorizontalAlignment" = 0 then 6
        when  "HorizontalAlignment" = 1 then 7
        when  "HorizontalAlignment" = 2 then 8
    end
end""")
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.OffsetQuad, quadrant_property)
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.LabelRotation,
            QgsProperty.fromExpression('360-"Angle"'))
        label_settings.dataDefinedProperties().setProperty(
            QgsPalLayerSettings.OffsetXY,
            QgsProperty.fromExpression(
                ' concat(  "XOffset" ,\',\', "YOffset" )'))

        labeling = QgsVectorLayerSimpleLabeling(label_settings)
        dest_layer.setLabeling(labeling)