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 = []
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)
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()
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()
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()
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
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
def reset(self): self.rubberBand_click.reset(QgsWkbTypes.GeometryType(3)) self.rubberBand.reset(QgsWkbTypes.GeometryType(3)) self.snap_mark.hide() self.points = []
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)