def canvasMoveEvent(self, event: QgsMapMouseEvent): if self.is_tracking and not self.capturing or self.editvertex is None: return point = QgsGeometry(point_from_event(event, self.snapping)).asPoint() if not self.editmode: self.pointband.movePoint(point) if self.capturing: self.band.movePoint(point) if self.editmode and self.editvertex is not None: found, vertexid = self.geom.vertexIdFromVertexNr(self.editvertex) self.geom.get().moveVertex(vertexid, QgsPoint(point)) self.feature.setGeometry(self.geom) self.currentVectorLayer().updateFeature(self.feature) self.pointband.setToGeometry(self.toMultiPoint(self.geom), self.currentVectorLayer()) self.band.setToGeometry(self.geom, self.currentVectorLayer())
def endcapture(self): # if not self.editmode: # self.band.removeLastPoint() self.update_valid_state() errors = self.has_errors() if errors and self.config.get("geometry_validation", True): self.error.emit("Invalid geometry. <br>" "Please recapture. Last capture shown in grey <br>" "<h2>Errors</h2> {0}".format("<br>".join( error.what() for error in errors))) self.endinvalidcapture(errors) return self.capturing = False self.set_tracking(False) self.captureaction.setChecked(True) self.undoaction.setEnabled(False) self.endcaptureaction.setEnabled(False) self.clearErrors() self.geometryComplete.emit(QgsGeometry(self.get_geometry()))
def canvasPressEvent(self, event): geom = self.band.asGeometry() if not geom: return point = QgsGeometry(point_from_event(event, self.snapping)).asPoint() if self.editmode: layer = self.currentVectorLayer() event.snapToGrid(layer.geometryOptions().geometryPrecision(), layer.crs()) tol = QgsTolerance.vertexSearchRadius(self.canvas.mapSettings()) loc = self.canvas.snappingUtils().locatorForLayer(layer) matches = loc.verticesInRect(point, tol) if matches: for match in matches: if match.featureId() != self.feature.id(): continue self.editpart = 0 self.editvertex = match.vertexIndex() break else: self.editvertex = None self.editpart = 0
def toMultiPoint(self, geom): points = QgsMultiPoint() for count, v in enumerate(geom.vertices()): points.addGeometry(v.clone()) newgeom = QgsGeometry(points) return newgeom