Estoy escribiendo un Plugin en el que construir redes con punto y de la línea de geometrías. Una Herramienta que debe dar al Usuario la posibilidad de hacer cambios a la red arrastrando y soltando los puntos a otra ubicación. Desde los puntos son a veces conectadas a las líneas quiero el vértice de las líneas conectadas a la nueva ubicación. Me las arreglé para escribir una herramienta que hace exactamente eso, pero si varias características de línea están conectados al mismo punto de falla y sólo arrastra una línea. He probado de bucle a través de todas las funciones de línea y pensé que debería funcionar, pero sólo se mueve en una línea y no sé por qué.
aquí un par de fotos para ilustrar mi problema:
Esta es la forma en que la red podría estar constituido por
el cambio de un punto con una línea funciona como se esperaba el cambio de medio punto de falla
Escribí un maptool clase de pasar el QgsMapTool.
En el canvasPressEvent me llaman por dos métodos, uno se busca las características y el otro para los vértices. si hay resultados que permiten arrastrar y empezar a editar. Aquí está el código de partes donde creo que el problema podría estar en
def findVertexAt (self, pos):
self.lineFeatures=[]
self.vertices = []
point = QgsPoint(self.canvas.getCoordinateTransform().toMapCoordinates(pos.x(), pos.y()))
tolerance = self.calcTolerance(pos)
searchRect = QgsRectangle(point.x() - tolerance,
point.y() - tolerance,
point.x() + tolerance,
point.y() + tolerance)
request = QgsFeatureRequest()
request.setFilterRect(searchRect)
request.setFlags(QgsFeatureRequest.ExactIntersect)
for feature in self.netLayer.getFeatures(request):
self.lineFeatures.append(feature)
i = 0
while i <= len(self.lineFeatures)-1:
vertexCoord, vertex, prevVertex, nextVertex, distSquared = self.lineFeatures[i].geometry().closestVertex(QgsPointXY(point))
self.vertices.append(vertex)
i = i + 1
return self.vertices
def canvasMoveEvent(self, event):
point = QgsPoint(self.canvas.getCoordinateTransform().toMapCoordinates(event.pos()))
pointXY = QgsPointXY(point)
if self.dragging:
geometry = QgsGeometry.fromPointXY(pointXY)
self.layer.changeGeometry(self.feature.id(),geometry)
if self.lineDragging:
i = 0
while i <= len(self.lineFeatures)-1:
lineGeometry = self.lineFeatures[i].geometry()
lineGeometry.moveVertex(point, self.vertices[i])
self.netLayer.changeGeometry(self.lineFeatures[i].id(), lineGeometry)
i = i + 1
El canvasRelease evento, a continuación, simplemente desactiva arrastrar y confirma los cambios