def activate(self): cursor = QCursor() cursor.setShape(Qt.ArrowCursor) self.iface.mapCanvas().setCursor(cursor) myLayers = [] # Editing layers = self.getLayers() for layer in layers: openedLayerPath = self.getLayerPath(layer) for name in self.ownMainLayers: layerPath = self.generatePath(self.ProjectDirectory, self.NetworkName + "_" + name + ".shp") if openedLayerPath == layerPath: myLayers.append(layer) if not layer.isEditable(): layer.startEditing() # Snapping self.snapper = QgsMapCanvasSnappingUtils(self.iface.mapCanvas()) self.snapper.setMapSettings(self.iface.mapCanvas().mapSettings()) config = QgsSnappingConfig(QgsProject.instance()) config.setType(2) # Vertex config.setMode(2) # All layers config.setTolerance(1) config.setUnits(2) # Pixels config.setEnabled(True) self.snapper.setConfig(config)
def __init__(self, iface: QgisInterface, layer): QgepMapToolAddFeature.__init__(self, iface, layer) self.snapping_marker = None self.node_layer = QgepLayerManager.layer('vw_wastewater_node') assert self.node_layer is not None self.reach_layer = QgepLayerManager.layer('vw_qgep_reach') assert self.reach_layer is not None self.setAdvancedDigitizingAllowed(True) self.setAutoSnapEnabled(True) layer_snapping_configs = [{ 'layer': self.node_layer, 'mode': QgsSnappingConfig.Vertex }, { 'layer': self.reach_layer, 'mode': QgsSnappingConfig.VertexAndSegment }] self.snapping_configs = [] self.snapping_utils = QgsMapCanvasSnappingUtils(self.iface.mapCanvas()) for lsc in layer_snapping_configs: config = QgsSnappingConfig() config.setMode(QgsSnappingConfig.AdvancedConfiguration) config.setEnabled(True) settings = QgsSnappingConfig.IndividualLayerSettings( True, lsc['mode'], 10, QgsTolerance.Pixels) config.setIndividualLayerSettings(lsc['layer'], settings) self.snapping_configs.append(config)
def resetSnapping(self): self.unlink_mode = False # disable previous snapping setting proj = QgsProject.instance() snapConfig = QgsSnappingConfig() if self.settings[0] != '' and self.settings[0]: # proj.writeEntry('Digitizing', 'SnappingMode', 'advanced') layer = lfh.getLayerByName(self.settings[0]) if layer: # layer might have been removed snapConfig.setMode(QgsSnappingConfig.AdvancedConfiguration) layerSnapConfig = QgsSnappingConfig.IndividualLayerSettings(False, QgsSnappingConfig.Vertex, self.settings[2], QgsTolerance.LayerUnits) snapConfig.setIndividualLayerSettings(layer, layerSnapConfig) proj.setAvoidIntersectionsLayers([layer]) if self.settings[1] != 'no unlinks' and self.settings[1]: # proj.writeEntry('Digitizing', 'SnappingMode', 'advanced') layer = lfh.getLayerByName(self.settings[1]) if layer: snapConfig.setMode(QgsSnappingConfig.AdvancedConfiguration) layerSnapConfig = QgsSnappingConfig.IndividualLayerSettings(False, QgsSnappingConfig.Vertex, self.settings[2], QgsTolerance.LayerUnits) snapConfig.setIndividualLayerSettings(layer, layerSnapConfig) proj.setAvoidIntersectionsLayers([]) snapConfig.setIntersectionSnapping(False) proj.setSnappingConfig(snapConfig) return
def configure_snapping_settings(): my_snap_config = QgsSnappingConfig() my_snap_config.setEnabled(True) my_snap_config.setMode(QgsSnappingConfig.AllLayers) my_snap_config.setType(QgsSnappingConfig.Vertex) my_snap_config.setUnits(QgsTolerance.Pixels) my_snap_config.setTolerance(10) my_snap_config.setIntersectionSnapping(True) QgsProject.instance().setSnappingConfig(my_snap_config)
def configSnapper(self, type): # Snapping self.snapper = QgsMapCanvasSnappingUtils(self.iface.mapCanvas()) self.snapper.setMapSettings(self.iface.mapCanvas().mapSettings()) config = QgsSnappingConfig(QgsProject.instance()) config.setType(type) # 1: Vertex; 2:Segment config.setMode(2) # All layers config.setTolerance(10) config.setUnits(1) # Pixels config.setEnabled(True) self.snapper.setConfig(config)
def activate(self): QgsMapTool.activate(self) # Snapping self.snapper = QgsMapCanvasSnappingUtils(self.iface.mapCanvas()) self.snapper.setMapSettings(self.iface.mapCanvas().mapSettings()) config = QgsSnappingConfig(QgsProject.instance()) config.setType(1) # Vertex config.setMode(2) # All layers config.setTolerance(2) config.setUnits(2) # Pixels config.setEnabled(True) self.snapper.setConfig(config)
def setSnapLayers(self, snapper, layers): config = QgsSnappingConfig() config.setMode(QgsSnappingConfig.AdvancedConfiguration) config.setEnabled(True) for layer in layers: if layer: ils = QgsSnappingConfig.IndividualLayerSettings( True, QgsSnappingConfig.VertexAndSegment, 16, QgsTolerance.Pixels) config.setIndividualLayerSettings(layer, ils) snapper.setConfig(config)
def init_snapper(self): """ Initialize snapper """ if not self.snapper: self.node_layer = self.network_analyzer.getNodeLayer() self.snapper = QgsMapCanvasSnappingUtils(self.canvas) config = QgsSnappingConfig() config.setMode(QgsSnappingConfig.AdvancedConfiguration) config.setEnabled(True) ils = QgsSnappingConfig.IndividualLayerSettings(True, QgsSnappingConfig.VertexAndSegment, 16, QgsTolerance.Pixels) config.setIndividualLayerSettings(self.node_layer, ils) self.snapper.setConfig(config)
def setSnapLayers(self, snapper, layers): config = QgsSnappingConfig() config.setMode(QgsSnappingConfig.AdvancedConfiguration) config.setEnabled(True) for layer in layers: if layer: ils = QgsSnappingConfig.IndividualLayerSettings(True, QgsSnappingConfig.VertexAndSegment, 16, QgsTolerance.Pixels) config.setIndividualLayerSettings(layer, ils) layer.destroyed.connect(self.deactivate) snapper.setConfig(config) snapper.layer_priority = layers
def setAxialSnapping(self): # keep button pressed # un press other buttons # disable previous snapping setting self.resetSnapping() # self.axialButton.setCheckable(True) self.resetIcons() axial_icon = QPixmap(os.path.dirname(__file__) + "/custom_icons/axial.png") self.axialButton.setIcon(QIcon(axial_icon)) self.axialButton.setIconSize(QSize(40, 40)) # snap to nothing if self.settings[0] != '': proj = QgsProject.instance() # fix_print_with_import # fix_print_with_import print(proj, 'ax') proj.writeEntry('Digitizing', 'SnappingMode', 'advanced') layer = lfh.getLayerByName(self.settings[0]) self.iface.setActiveLayer(layer) # if layer.isEditable(): # layer.commitChanges() # else: # layer.startEditing() snapConfig = QgsSnappingConfig() snapConfig.setMode(QgsSnappingConfig.AdvancedConfiguration) layerSnapConfig = QgsSnappingConfig.IndividualLayerSettings(False, QgsSnappingConfig.Vertex, self.settings[2], QgsTolerance.LayerUnits) snapConfig.setIndividualLayerSettings(layer, layerSnapConfig) snapConfig.setEnabled(False) proj.setAvoidIntersectionsLayers([layer]) proj.setSnappingConfig(snapConfig) proj.setTopologicalEditing(False) self.axial_mode = True else: self.iface.messageBar().pushMessage("Network layer not specified!", Qgis.Critical, duration=5) self.axial_mode = False return
def setUnlinkSnapping(self): # disable previous snapping setting if segment self.resetSnapping() # snap to vertex if self.settings[1] != 'no unlinks': self.resetIcons() unlink_icon = QPixmap(os.path.dirname(__file__) + "/custom_icons/unlink.png") self.unlinksButton.setIcon(QIcon(unlink_icon)) self.unlinksButton.setIconSize(QSize(40, 40)) proj = QgsProject.instance() # fix_print_with_import # fix_print_with_import print(proj, 'un') proj.writeEntry('Digitizing', 'SnappingMode', 'advanced') layer = lfh.getLayerByName(self.settings[0]) unlinks_layer = lfh.getLayerByName(self.settings[1]) # if unlinks_layer.isEditable(): # unlinks_layer.commitChanges() # else: # unlinks_layer.startEditing() self.iface.setActiveLayer(unlinks_layer) snapConfig = QgsSnappingConfig() snapConfig.setMode(QgsSnappingConfig.AdvancedConfiguration) layerSnapConfig = QgsSnappingConfig.IndividualLayerSettings(True, QgsSnappingConfig.Vertex, self.settings[2], QgsTolerance.LayerUnits) snapConfig.setIndividualLayerSettings(layer, layerSnapConfig) proj.setAvoidIntersectionsLayers([layer]) snapConfig.setIntersectionSnapping(True) snapConfig.setEnabled(True) QgsProject.instance().setSnappingConfig(snapConfig) proj.setTopologicalEditing(False) self.unlink_mode = True else: self.iface.messageBar().pushMessage("Unlinks layer not specified!", Qgis.Critical, duration=5) self.unlink_mode = False return
def __init__(self, iface, proposalsManager, restrictionTransaction): #def __init__(self, iface, proposalsManager, restrictionTransaction, currFeature, currLayer): QgsMessageLog.logMessage("In TOMsNodeTool:initialising .... ", tag="TOMs panel") self.iface = iface canvas = self.iface.mapCanvas() cadDock = self.iface.cadDockWidget() NodeTool.__init__(self, canvas, cadDock) # set current layer to active layer to avoid any issues in NodeTools cadCanvasReleaseEvent #canvas.setCurrentLayer(self.iface.activeLayer()) self.proposalsManager = proposalsManager self.restrictionTransaction = restrictionTransaction #self.constants = TOMsConstants() #self.origFeature = self.originalFeature() # taken from mapTools.CreateRestrictionTool (not sure if they will make a difference ...) # self.setMode(TOMsNodeTool.CaptureLine) self.snappingConfig = QgsSnappingConfig() self.snappingConfig.setMode(QgsSnappingConfig.AdvancedConfiguration) #RoadCasementLayer = QgsProject.instance().mapLayersByName("rc_nsg_sideofstreet")[0] # get details of the selected feature self.selectedRestriction = self.iface.activeLayer().selectedFeatures()[0] QgsMessageLog.logMessage("In TOMsNodeTool:initialising ... saving original feature + " + self.selectedRestriction.attribute("GeometryID"), tag="TOMs panel") # Create a copy of the feature self.origFeature = originalFeature() self.origFeature.setFeature(self.selectedRestriction) self.origLayer = self.iface.activeLayer() QgsMessageLog.logMessage("In TOMsNodeTool:initialising ... original layer + " + self.origLayer.name(), tag="TOMs panel") #self.origLayer.startEditing() self.origFeature.printFeature() self.origLayer.geometryChanged.connect(self.on_cached_geometry_changed) self.origLayer.featureDeleted.connect(self.on_cached_geometry_deleted) #*** New #RestInProp = self.constants.RESTRICTIONS_IN_PROPOSALS_LAYER() #QgsMessageLog.logMessage("In init: RestInProp: " + str(RestInProp.name()), tag="TOMs panel") #RestInProp.editCommandEnded.connect(self.proposalsManager.updateMapCanvas()) advancedDigitizingPanel = iface.mainWindow().findChild(QDockWidget, 'AdvancedDigitizingTools') advancedDigitizingPanel.setVisible(True) self.setupPanelTabs(self.iface, advancedDigitizingPanel) self.setAdvancedDigitizingAllowed(True) self. setAutoSnapEnabled(True) #QgsMapToolAdvancedDigitizing.deactivate(self) #QgsMapToolAdvancedDigitizing.activate(self) #self.newFeature = None self.finishEdit = False self.iface.mapCanvas().mapToolSet.connect(self.setUnCheck) self.proposalsManager.TOMsToolChanged.connect(functools.partial(self.onGeometryChanged, self.origFeature.getFeature()))
def run(id, gtotool, config, debug): try: #common tool objects iface = gtotool.iface info = gtotool.info gtomain = gtotool.gtomain #tool data activelayer = config.get('active_layer', None) active_tool = config['active_tool'] snapmode = config['snap_mode'] topologicalediting = config['topologicalediting'] snapping_on_intersection = config['snapping_on_intersection'] #default snappings default_snap_type = config['default_snap_type'] default_snap_tolerance = config['default_snap_tolerance'] default_snap_tolerance_unit = config['default_snap_tolerance_unit'] #layers for advanced setting layers = config['layers'] # needed objects prj = QgsProject.instance() snapconfig = QgsSnappingConfig(prj) avoidIntersectLayers = [] if snapmode == 0: snapconfig.setEnabled(False) else: # set default snapping snapconfig.setMode(snapmode) snapconfig.setIntersectionSnapping(snapping_on_intersection) snapconfig.setType(default_snap_type) snapconfig.setUnits(default_snap_tolerance_unit) snapconfig.setTolerance(default_snap_tolerance) if snapmode == QgsSnappingConfig.AdvancedConfiguration: #disable snapping for all layers for maplayername, layer in prj.mapLayers().items(): if isinstance(layer, QgsVectorLayer): snaplayer = snapconfig.individualLayerSettings(layer) if layer.name() in layers: snaplayer.setEnabled(True) else: snaplayer.setEnabled(False) snapconfig.setIndividualLayerSettings(layer, snaplayer) #set settings for layers for setting in layers: if debug: info.log("settings:", setting) maplayer = prj.mapLayersByName(setting['name'])[0] snaplayer = snapconfig.individualLayerSettings(maplayer) snaplayer.setEnabled( setting.get('snap', snaplayer.enabled())) snaplayer.setUnits(setting.get('units', snaplayer.units())) snaplayer.setTolerance( setting.get('tolerance', snaplayer.tolerance())) snaplayer.setType( setting.get('mode', setting.get('snap_type', snaplayer.type()))) snapconfig.setIndividualLayerSettings(maplayer, snaplayer) if setting.get('avoidintersection', True): avoidIntersectLayers.append(maplayer) prj.avoidIntersectionsLayers = avoidIntersectLayers #enable the settings (snapping) snapconfig.setEnabled(True) #set topology editing for project prj.setTopologicalEditing(topologicalediting) #set snappingconfig to project prj.setSnappingConfig(snapconfig) except IndexError as e: info.err(e) try: #set activelayer activelayer = prj.mapLayersByName(activelayer) if activelayer: activelayer = activelayer[0] if isinstance(activelayer, QgsVectorLayer): iface.setActiveLayer(activelayer) except IndexError as e: info.err(e) try: #start editing layer = iface.activeLayer() if not layer.isEditable(): layer.startEditing() # run active tool if active_tool: gtomain.runcmd(active_tool) except IndexError as e: info.err(e)