Beispiel #1
0
    def __init__(self, iface, action, geometryClass):
        self.canvas = iface.mapCanvas()
        self.iface = iface
        self.action = action
        self.geometryClass = geometryClass

        obj_color = QColor(254, 0, 0)
        obj_color_alpha = QColor(254, 0, 0)
        obj_color_alpha.setAlpha(60)
        vert_color = QColor(0, 0, 255)

        QgsMapTool.__init__(self, self.canvas)

        self.rubberBand = QgsRubberBand(self.canvas,
                                        QgsWkbTypes.GeometryType(3))
        self.rubberBand.setWidth(1)
        self.rubberBand.setStrokeColor(obj_color)
        self.rubberBand.setFillColor(obj_color_alpha)

        self.rubberBand_click = QgsRubberBand(self.canvas,
                                              QgsWkbTypes.GeometryType(3))
        self.rubberBand_click.setWidth(0)
        self.rubberBand_click.setFillColor(obj_color_alpha)

        # snap marker
        self.snap_mark = QgsVertexMarker(self.canvas)
        self.snap_mark.setColor(vert_color)
        self.snap_mark.setPenWidth(2)
        self.snap_mark.setIconType(QgsVertexMarker.ICON_BOX)
        self.snap_mark.setIconSize(10)

        self.points = []
Beispiel #2
0
    def __init__(self, canvas, iface):
        QgsMapToolEmitPoint.__init__(self, canvas)

        # qgis interface
        self.canvas = canvas
        self.iface = iface

        # snap marker
        self.snap_mark = QgsVertexMarker(self.canvas)
        self.snap_mark.setColor(QColor(0, 0, 255))
        self.snap_mark.setPenWidth(2)
        self.snap_mark.setIconType(QgsVertexMarker.ICON_BOX)
        self.snap_mark.setIconSize(10)

        # rectangle
        self.rubberBand = QgsRubberBand(self.canvas,
                                        QgsWkbTypes.GeometryType(3))
        self.rubberBand.setWidth(3)
        self.rubberBand.setStrokeColor(QColor(254, 0, 0))

        # initialize variable
        self.rubberBand_width = 0
        self.rubberBand_height = 0
        self.rubberBand_angle = 0

        self.reset()
    def __init__(self, iface, action, plugin_dir, spinbox):
        self.canvas = iface.mapCanvas()
        self.iface = iface
        self.action = action
        self.icon_path = os.path.join(plugin_dir,"icons")
        self.spinbox = spinbox

        self.rubberBand = QgsRubberBand(self.canvas, QgsWkbTypes.GeometryType(3))
        self.rubberBand.setWidth(3)
        self.rubberBand.setStrokeColor(QColor(254,0,0))

        self.snap_mark = QgsVertexMarker(self.canvas)
        self.snap_mark.setColor(QColor(0, 0, 255))
        self.snap_mark.setPenWidth(2)
        self.snap_mark.setIconType(QgsVertexMarker.ICON_BOX)
        self.snap_mark.setIconSize(10)

        QgsMapToolIdentify.__init__(self, self.canvas)

        self.selectFeatureMode = True
        self.firstPointMode = False
        self.secondPointMode = False
        self.objectSizeMode = False

        self.firstPoint_locate = None
        self.linestring = None

        self.dist = self.spinbox.value()

        self.canvas.layersChanged.connect(self.setPolygonLayers)
Beispiel #4
0
    def canvasMoveEvent(self, e):
        self.snap_mark.hide()
        self.snapPoint = False
        self.snapPoint = self.checkSnapToPoint(e.pos())

        if self.snapPoint[0]:
            self.snap_mark.setCenter(self.snapPoint[1])
            self.snap_mark.show()

        if len(self.points) > 0:
            self.rubberBand.reset(QgsWkbTypes.GeometryType(3))
            point = self.toMapCoordinates(self.canvas.mouseLastXY())
            temp_points = self.points[:]
            temp_points.append(point)
            polygon = QgsGeometry.fromPolygonXY([temp_points])
            self.rubberBand.setToGeometry(polygon, None)
            self.rubberBand.show()
Beispiel #5
0
    def canvasMoveEvent(self, e):
        self.snap_mark.hide()
        self.snapPoint = False
        self.rubberBand.reset(QgsWkbTypes.GeometryType(3))

        self.snapPoint = self.checkSnapToPoint(e.pos())

        if self.snapPoint[0]:
            self.snap_mark.setCenter(self.snapPoint[1])
            self.snap_mark.show()
            self.rectangle = self.getRectangle(self.snapPoint[1])
            self.rubberBand.setToGeometry(self.rectangle, None)
            self.rubberBand.show()

        else:
            self.rectangle = self.getRectangle(self.toMapCoordinates(e.pos()))
            self.rubberBand.setToGeometry(self.rectangle, None)
            self.rubberBand.show()
Beispiel #6
0
    def canvasPressEvent(self, e):
        # Left mouse button
        if e.button() == Qt.LeftButton:
            if self.snapPoint[0]:
                point = self.snapPoint[1]
            else:
                point = self.toMapCoordinates(self.canvas.mouseLastXY())

            self.points.append(point)
            polygon = QgsGeometry.fromPolygonXY([self.points])
            self.rubberBand_click.reset(QgsWkbTypes.GeometryType(3))
            self.rubberBand_click.setToGeometry(polygon, None)
            self.rubberBand_click.show()

        # Right mouse button
        if e.button() == Qt.RightButton:
            geometry = QgsGeometry.fromPolygonXY([self.points])
            self.geometryClass.geometry = geometry
            self.cut.emit()
            self.reset()
Beispiel #7
0
def load_layers(iface):
    # Load a dictionary of layerId:layer pairs
    layer_dic = QgsProject.instance().layerStore().mapLayers()

    # Filter the vector layers (LayerType(0))
    vec_dic = dict()
    for l in layer_dic:
        if layer_dic[l].type() == QgsMapLayer.LayerType(0):
            vec_dic[l] = layer_dic[l]

    # Further filter those polygon layers (geometryType(2)) which have
    #          at least 1 feature and add them to the drop down menu.
    poly_geom = QgsWkbTypes.GeometryType(2)
    poly_dic = dict()
    poly_ind = []  # Indices are saved here
    for l in vec_dic:
        if vec_dic[l].geometryType() == poly_geom and vec_dic[l].featureCount(
        ) and vec_dic[l].crs().authid() == 'EPSG:31287':
            poly_dic[l] = vec_dic[l]
            poly_ind.append(l)

    return poly_dic, poly_ind
Beispiel #8
0
    def getRectangle(self, point):
        polygon = QgsWkbTypes.GeometryType(3)

        x = point.x()
        y = point.y()

        points = [[
            QgsPointXY(  # Left Top corner
                x - (self.rubberBand_width / 2),
                y + (self.rubberBand_height / 2)),
            QgsPointXY(  # Right Top corner
                x + (self.rubberBand_width / 2),
                y + (self.rubberBand_height / 2)),
            QgsPointXY(  # Right Down corner
                x + (self.rubberBand_width / 2),
                y - (self.rubberBand_height / 2)),
            QgsPointXY(  # Left Down corner
                x - (self.rubberBand_width / 2),
                y - (self.rubberBand_height / 2))
        ]]
        polygon = QgsGeometry.fromPolygonXY(points)
        polygon.rotate(self.rubberBand_angle, point)
        return polygon
Beispiel #9
0
 def reset(self):
     self.rubberBand_click.reset(QgsWkbTypes.GeometryType(3))
     self.rubberBand.reset(QgsWkbTypes.GeometryType(3))
     self.snap_mark.hide()
     self.points = []
Beispiel #10
0
 def reset(self):
     self.rubberBand.reset(QgsWkbTypes.GeometryType(3))
     self.isEmittingPoint = False
    def __init__(self, iface, plugin_dir, toolbar, icon_path):
        self.iface = iface
        self.plugin_dir = os.path.dirname(__file__)
        self.toolsToolbar = toolbar
        self.icon_path = icon_path

        self.canvas = iface.mapCanvas()

        self.qgsProject = QgsProject.instance()
        self.qgsProject.layersAdded.connect(self.layerWasAdded)
        self.qgsProject.layersWillBeRemoved.connect(self.layerWasRemoved)
        
        locale = QSettings().value('locale/userLocale')[0:2]
        locale_path = os.path.join(
            self.plugin_dir,
            'i18n',
            'painter_{}.qm'.format(locale))

        if os.path.exists(locale_path):
            self.translator = QTranslator()
            self.translator.load(locale_path)

            if qVersion() > '4.3.3':
                QCoreApplication.installTranslator(self.translator)

        self.actions = []

        self.geometry_class = Painters_geometry()

        self.tool = addPolygon(self.iface, None, self.geometry_class)
        self.tool.pos.connect(self.clickTool)
        self.tool.res.connect(self.reset)
        
        self.settingsWidget = settingsPanel()
        self.settingsWidget.checkBox_allLayers.stateChanged.connect(self.clickAllLayers)
        self.settingsWidget.checkBox_onlyVisible.stateChanged.connect(self.clickOnlyVisibleLayers)
        self.settingsWidget.checkBox_selectedByUser.stateChanged.connect(self.clickSelectedByUser)
        self.settingsWidget.checkBox_askTargetLayer.stateChanged.connect(self.clickAskTargetLayer)
        self.settingsWidget.listWidget.setEnabled(False)
        self.iface.addDockWidget(Qt.LeftDockWidgetArea, self.settingsWidget)
        self.settingsWidget.label_target_layer.setEnabled(False)
        self.settingsWidget.comboBox_targetLayer.setEnabled(False)
        self.settingsWidget.showButton.setEnabled(False)
        self.settingsWidget.hideButton.setEnabled(False)
        self.settingsWidget.showButton.clicked.connect(self.clickShowAll)
        self.settingsWidget.hideButton.clicked.connect(self.clickHideAll)
        self.settingsWidget.checkBoxPolygon.stateChanged.connect(self.rebuildListWidget)
        self.settingsWidget.checkBoxLine.stateChanged.connect(self.rebuildListWidget)
        self.settingsWidget.hide()

        icon = QIcon(self.icon_path + 'selectAll.svg')
        self.settingsWidget.showButton.setIcon(icon)

        icon = QIcon(self.icon_path + 'hideAll.svg')
        self.settingsWidget.hideButton.setIcon(icon)

        icon = QIcon(self.icon_path + 'geofabryka.png')
        self.settingsWidget.pushButton_geofabryka.setIcon(icon)

        self.tool.deact.connect(self.settingsWidget.hide)

        obj_color = QColor(254,0,0)
        obj_color_alpha = QColor(254,0,0)
        obj_color_alpha.setAlpha(60)

        self.rubberBand = QgsRubberBand(self.canvas,QgsWkbTypes.GeometryType(3))
        self.rubberBand.setWidth(1)
        self.rubberBand.setStrokeColor(obj_color)
        self.rubberBand.setFillColor(obj_color_alpha)

        self.setLayers()
        self.rebuildListWidget()
        self.rebuildComboBox()

        self.first_start = None
        
        self.initGui()
    def clickTool(self):
        self.rubberBand.reset(QgsWkbTypes.GeometryType(3))
        click_point_geom = QgsGeometry.fromPointXY(self.geometry_class.geometry)
        buffer_geom = click_point_geom.buffer(self.settingsWidget.spinBox_searchArea.value(),20)

        lines_layers = self.getLayers(1)
        polygons_layers = self.getLayers(2)
        len_line_layers = 0
        len_polygon_layers = 0

        try:
            len_line_layers += len(lines_layers)
        except TypeError:
            pass

        try:
            len_polygon_layers += len(polygons_layers)
        except TypeError:
            pass

        if len_polygon_layers == 0 and len_line_layers == 0:
            QMessageBox.warning(None,'Missing restrictive layers', 'Select one of the settings')
            return

        self.target_geom = None

        # Polygon layers
        if self.settingsWidget.checkBoxPolygon.isChecked() and len_polygon_layers > 0:
            for l in polygons_layers:
                poly_layer = l[0]
                
                for f in poly_layer.getFeatures(buffer_geom.boundingBox()):
                    f_geom = f.geometry()
                    if f_geom.intersects(click_point_geom):
                        QMessageBox.warning(None,'No space to fill', 'No space to fill, choose a different location')
                        return
                        
                    if f_geom.intersects(buffer_geom):
                        buffer_geom = buffer_geom.difference(f_geom)

                if not poly_layer.isEditable():
                    poly_layer.startEditing()
                
                for part in buffer_geom.parts():
                    part_wkt = part.asWkt()
                    part_geom = QgsGeometry.fromWkt(part_wkt)
                    if part_geom.intersects(click_point_geom):
                        target_geom = part_geom
                        break 

        # Line layers
        if self.settingsWidget.checkBoxLine.isChecked():
            for l in lines_layers:
                line_layer = l[0]
                features = [i.geometry() for i in line_layer.getFeatures(buffer_geom.boundingBox())]
                buffer_geom_linestring = self.polygon2Linestring(buffer_geom)
                if buffer_geom_linestring != None:
                    features.append(buffer_geom_linestring)
                features_unary_geom = QgsGeometry.unaryUnion(features)
                features_unary_geom_parts = [QgsGeometry.fromWkt(i.asWkt()) for i in features_unary_geom.parts()]
                features_polygonize = QgsGeometry.polygonize(features_unary_geom_parts)

                for part in features_polygonize.parts():
                    part_geom = QgsGeometry.fromWkt(part.asWkt())
                    if part_geom.intersects(click_point_geom):
                        if target_geom == None:
                            target_geom = part_geom
                        else:
                            target_geom = target_geom.intersection(part_geom)
                        break 

        target_geom.convertGeometryCollectionToSubclass(2)

        for part in target_geom.parts():
            if part != None:
                part_geom = QgsGeometry.fromWkt(part.asWkt())
                if part_geom.intersects(click_point_geom):
                    self.target_geom = part_geom

        if self.target_geom != None:
            self.rubberBand.setToGeometry(self.target_geom,None)

            if self.settingsWidget.checkBox_askTargetLayer.isChecked():
                self.addMenu()
            else:
                t_layer = self.getTargetLayer()

                if t_layer == None:
                    QMessageBox.warning(None,'Missing target layer', 'Select one of the settings')
                    return
                else:
                    self.addFeature(t_layer)