def canvasReleaseEvent(self,event): #Get the click x = event.pos().x() y = event.pos().y() layer = self.canvas.currentLayer() visibleLayers = [] if self.allLayers: legendIface = self.iface.legendInterface() for aLayer in legendIface.layers(): if 0 == aLayer.type(): if legendIface.isLayerVisible(aLayer) and \ self.isPolygonLayer(aLayer): visibleLayers.append(aLayer) else: if layer <> None: visibleLayers.append(layer) if len(visibleLayers) > 0: #the clicked point is our starting point startingPoint = QtCore.QPoint(x,y) mapToPixel = self.canvas.getCoordinateTransform() thisQgsPoint = mapToPixel.toMapCoordinates(startingPoint) multiGeom = None for aLayer in visibleLayers: if not self.allLayers and aLayer.selectedFeatureCount() > 0: #we assume, that the gap is between the selected polyons hadSelection = True else: hadSelection = False spatialIndex = dtutils.dtSpatialindex(aLayer) # get the 100 closest Features featureIds = spatialIndex.nearestNeighbor(thisQgsPoint, 100) aLayer.setSelectedFeatures(featureIds) multiGeom = dtutils.dtCombineSelectedPolygons(aLayer, self.iface, multiGeom) if self.allLayers or not hadSelection: aLayer.removeSelection() if multiGeom == None: return None if multiGeom != None: rings = dtutils.dtExtractRings(multiGeom) if len(rings) > 0: for aRing in rings: if aRing.contains(thisQgsPoint): self.gapSelected.emit([aRing]) break
def process(self): # DtDualTool makes sure a selection exists layer = self.iface.activeLayer() multiGeom = dtutils.dtCombineSelectedPolygons(layer, self.iface) if multiGeom != None: rings = dtutils.dtExtractRings(multiGeom) if len(rings) == 0: self.iface.messageBar().pushWarning( self.title, QtCore.QCoreApplication.translate( "digitizingtools", "There are no gaps between the polygons.")) else: defaultAttributeMap = dtutils.dtGetDefaultAttributeMap(layer) layer.featureAdded.connect(self.featureAdded) numRingsFilled = 0 aborted = False for aRing in rings: if numRingsFilled == 0: layer.beginEditCommand( QtCore.QCoreApplication.translate( "editcommand", "Fill gaps")) if self.iface.vectorLayerTools().addFeature( layer, defaultValues=defaultAttributeMap, defaultGeometry=aRing): layer.featureAdded.disconnect(self.featureAdded) else: layer.featureAdded.disconnect(self.featureAdded) aborted = True break else: aFeat = dtutils.dtCopyFeature(layer, srcFid=self.newFid) aFeat.setGeometry(aRing) layer.addFeature(aFeat) numRingsFilled += 1 if aborted: layer.destroyEditCommand() else: layer.endEditCommand() self.canvas.refresh()
def process(self): # DtDualTool makes sure a selection exists layer = self.iface.activeLayer() multiGeom = dtutils.dtCombineSelectedPolygons(layer, self.iface) if multiGeom != None: rings = dtutils.dtExtractRings(multiGeom) if len(rings) == 0: self.iface.messageBar().pushMessage(self.title, QtCore.QCoreApplication.translate("digitizingtools", "There are no gaps between the polygons."), level=QgsMessageBar.WARNING, duration = 10) else: defaultAttributeMap = dtutils.dtGetDefaultAttributeMap(layer) layer.featureAdded.connect(self.featureAdded) numRingsFilled = 0 aborted = False for aRing in rings: if numRingsFilled == 0: layer.beginEditCommand(QtCore.QCoreApplication.translate( "editcommand", "Fill gaps")) if self.iface.vectorLayerTools().addFeature( layer, defaultValues = defaultAttributeMap, defaultGeometry = aRing): layer.featureAdded.disconnect(self.featureAdded) else: layer.featureAdded.disconnect(self.featureAdded) aborted = True break else: aFeat = dtutils.dtCopyFeature(layer, srcFid = self.newFid) aFeat.setGeometry(aRing) layer.addFeature(aFeat) numRingsFilled += 1 if aborted: layer.destroyEditCommand() else: layer.endEditCommand() self.canvas.refresh()