def vertexSnapped(self, snapResult): snappedVertex = snapResult[0][0] snappedFid = snapResult[2][0] layer = self.iface.activeLayer() feat = dtutils.dtGetFeatureForId(layer, snappedFid) if feat != None: geom = feat.geometry() rings = dtutils.dtExtractRings(geom) thisRing = None for aRing in rings: for aPoint in dtutils.dtExtractPoints(aRing): if aPoint.x() == snappedVertex.x() and aPoint.y() == snappedVertex.y(): thisRing = aRing break if thisRing != None: defaultAttributeMap = dtutils.dtGetDefaultAttributeMap(layer) layer.beginEditCommand(QtCore.QCoreApplication.translate("editcommand", "Fill ring")) if self.iface.vectorLayerTools().addFeature(layer, defaultValues = defaultAttributeMap, defaultGeometry = thisRing): layer.endEditCommand() self.canvas.refresh() else: layer.destroyEditCommand() self.tool.reset()
def vertexSnapped(self, snapResult): if not self.doIgnoreTool: snappedVertex = snapResult[0][0] snappedFid = snapResult[2][0] layer = self.iface.activeLayer() thisRing = None feat = dtutils.dtGetFeatureForId(layer, snappedFid) if feat != None: geom = feat.geometry() rings = dtutils.dtExtractRings(geom) for aRing in rings: for aPoint in dtutils.dtExtractPoints(aRing): if aPoint.x() == snappedVertex.x() and aPoint.y() == snappedVertex.y(): thisRing = aRing break if thisRing != None: newFeat = dtutils.dtCreateFeature(layer) layer.beginEditCommand(QtCore.QCoreApplication.translate("editcommand", "Fill ring")) if self.iface.openFeatureForm(layer, newFeat, True): # let user edit attributes newFeat.setGeometry(thisRing) layer.addFeature(newFeat) layer.endEditCommand() self.canvas.refresh() else: layer.destroyEditCommand() self.tool.clear()
def vertexSnapped(self, snapResult): snappedVertex = snapResult[0][0] snappedFid = snapResult[2][0] layer = self.iface.activeLayer() feat = dtutils.dtGetFeatureForId(layer, snappedFid) if feat != None: geom = feat.geometry() rings = dtutils.dtExtractRings(geom) thisRing = None for aRing in rings: for aPoint in dtutils.dtExtractPoints(aRing): if aPoint.x() == snappedVertex.x() and aPoint.y( ) == snappedVertex.y(): thisRing = aRing break if thisRing != None: newFeat = dtutils.dtCreateFeature(layer) if self.iface.openFeatureForm(layer, newFeat, True): # let user edit attributes layer.beginEditCommand( QtCore.QCoreApplication.translate( "editcommand", "Fill ring")) newFeat.setGeometry(thisRing) layer.addFeature(newFeat) layer.endEditCommand() self.canvas.refresh() self.tool.clear()
def vertexSnapped(self, snapResult): snappedVertex = snapResult[0][0] snappedFid = snapResult[2][0] layer = self.iface.activeLayer() feat = dtutils.dtGetFeatureForId(layer, snappedFid) if feat != None: geom = feat.geometry() rings = dtutils.dtExtractRings(geom) thisRing = None for aRing in rings: for aPoint in dtutils.dtExtractPoints(aRing): if aPoint.x() == snappedVertex.x() and aPoint.y( ) == snappedVertex.y(): thisRing = aRing break if thisRing != None: defaultAttributeMap = dtutils.dtGetDefaultAttributeMap(layer) layer.beginEditCommand( QtCore.QCoreApplication.translate("editcommand", "Fill ring")) if self.iface.vectorLayerTools().addFeature( layer, defaultValues=defaultAttributeMap, defaultGeometry=thisRing): layer.endEditCommand() self.canvas.refresh() else: layer.destroyEditCommand() self.tool.reset()
def partSelected(self, part): fid = part[0] partNumber = part[1] aPart = part[2] layer = self.iface.mapCanvas().currentLayer() feature = dtutils.dtGetFeatureForId(layer, fid) geom = QgsGeometry(feature.geometry()) if geom.deletePart(partNumber): layer.beginEditCommand(QtCore.QCoreApplication.translate("editcommand", "Extract part")) aFeat = dtutils.dtCopyFeature(layer, feature) aFeat.setGeometry(aPart) layer.addFeature(aFeat) feature.setGeometry(geom) layer.updateFeature(feature) layer.endEditCommand() self.canvas.refresh() self.tool.reset()
def partSelected(self, part): fid = part[0] partNumber = part[1] aPart = part[2] layer = self.iface.mapCanvas().currentLayer() feature = dtutils.dtGetFeatureForId(layer, fid) geom = QgsGeometry(feature.geometry()) if geom.deletePart(partNumber): layer.beginEditCommand( QtCore.QCoreApplication.translate("editcommand", "Extract part")) aFeat = dtutils.dtCopyFeature(layer, feature) aFeat.setGeometry(aPart) layer.addFeature(aFeat) feature.setGeometry(geom) layer.updateFeature(feature) layer.endEditCommand() self.canvas.refresh() self.tool.reset()
def vertexSnapped(self, snapResult): snappedVertex = snapResult[0][0] fid = snapResult[2][0] layer = self.iface.mapCanvas().currentLayer() feature = dtutils.dtGetFeatureForId(layer, fid) geom = feature.geometry() # if feature geometry is multipart start split processing if geom.isMultipart(): # Get parts from original feature parts = geom.asGeometryCollection () foundPart = False for i in range(len(parts)): # find the part that was snapped aPart = parts[i] points = dtutils.dtExtractPoints(aPart) for aPoint in points: if aPoint.x() == snappedVertex.x() and aPoint.y() == snappedVertex.y(): foundPart = True break if foundPart: break if foundPart: if geom.deletePart(i): layer.beginEditCommand(QtCore.QCoreApplication.translate("editcommand", "Extract part")) aFeat = dtutils.dtCopyFeature(layer, feature) aFeat.setGeometry(aPart) layer.addFeature(aFeat) feature.setGeometry(geom) layer.updateFeature(feature) layer.endEditCommand() self.canvas.refresh() self.tool.reset()
def fillRings(self, forFids): layer = self.iface.activeLayer() newFeat = dtutils.dtCreateFeature(layer) layer.beginEditCommand(QtCore.QCoreApplication.translate("editcommand", "Fill rings")) if self.iface.openFeatureForm(layer, newFeat): for fid in forFids: featureToFill = dtutils.dtGetFeatureForId(layer, fid) if featureToFill != None: geom = featureToFill.geometry() rings = dtutils.dtExtractRings(geom) for aRing in rings: aFeat = dtutils.dtCopyFeature(layer, newFeat) aFeat.setGeometry(aRing) #for i in range(layer.pendingFields().count()): layer.addFeature(aFeat) layer.endEditCommand() self.canvas.refresh() else: layer.destroyEditCommand()
def getFeatureForPoint(self, layer, startingPoint, inRing = False): ''' return the feature this QPoint is in (polygon layer) or this QPoint snaps to (point or line layer) ''' result = [] if self.isPolygonLayer(layer): mapToPixel = self.canvas.getCoordinateTransform() #thisQgsPoint = mapToPixel.toMapCoordinates(startingPoint) thisQgsPoint = self.transformed(layer, mapToPixel.toMapCoordinates(startingPoint)) spatialIndex = dtutils.dtSpatialindex(layer) featureIds = spatialIndex.nearestNeighbor(thisQgsPoint, 0) # if we use 0 as neighborCount then only features that contain the point # are included for fid in featureIds: feat = dtutils.dtGetFeatureForId(layer, fid) if feat != None: geom = QgsGeometry(feat.geometry()) if geom.contains(thisQgsPoint): result.append(feat) result.append([]) return result break else: if inRing: rings = dtutils.dtExtractRings(geom) if len(rings) > 0: for aRing in rings: if aRing.contains(thisQgsPoint): result.append(feat) result.append([]) result.append(aRing) return result break else: #we need a snapper, so we use the MapCanvas snapper snapper = self.canvas.snappingUtils() snapper.setCurrentLayer(layer) # snapType = 0: no snap, 1 = vertex, 2 vertex & segment, 3 = segment snapMatch = snapper.snapToCurrentLayer(startingPoint, QgsPointLocator.All) if not snapMatch.isValid(): dtutils.showSnapSettingsWarning(self.iface) else: feat = dtutils.dtGetFeatureForId(layer, snapMatch.featureId()) if feat != None: result.append(feat) if snapMatch.hasVertex(): result.append([snapMatch.point(), None]) if snapMatch.hasEdge(): result.append(snapMatch.edgePoints()) return result return result