def createFeature(self, Id): lyr = self.iface.mapCanvas().currentLayer() formValue = self.botaoConfig[self.getButton()][1] if (lyr) and (Id < 0) and (formValue != u"sim"): lyr.select(Id) f = lyr.selectedFeatures()[0] lyr.deselect(Id) provider = lyr.dataProvider() fields = lyr.pendingFields() try: attr = f.initAttributes(len(fields)) for i in range(len(fields)): f.setAttribute(i, provider.defaultValue(i)) except AttributeError: for i in fields: f.addAttribute(i, provider.defaultValue(i)) attrDialog = QgsAttributeDialog(lyr, f, False) self.attributeForm(attrDialog, lyr) result = attrDialog.exec_() if not result: lyr.deleteFeature(Id) self.iface.mapCanvas().refresh() elif (lyr) and (Id < 0) and (formValue == u"sim"): lyr.select(Id) f = lyr.selectedFeatures()[0] lyr.deselect(Id) self.autoAttribute(lyr, f)
def showDocumentForm(self): if self._currentDocumentId is None: return layer = self.relation().referencingLayer() if self.nmRelation().isValid(): layer = self.nmRelation().referencedLayer() showDocumentFormDialog = QgsAttributeDialog( layer, layer.getFeature(self._currentDocumentId), False, self, True) showDocumentFormDialog.exec() self.updateUi()
def createGeometry(self, geom): geom = self.reprojectRubberBand(geom) if geom: layer = self.canvas.currentLayer() feature = QgsFeature() fields = layer.pendingFields() feature.setGeometry(geom) feature.initAttributes(fields.count()) provider = layer.dataProvider() for i in range(fields.count()): feature.setAttribute(i, provider.defaultValue(i)) form = QgsAttributeDialog(layer, feature, False) form.setMode(QgsAttributeForm.AddFeatureMode) formSuppress = layer.editFormConfig().suppress() if formSuppress == QgsEditFormConfig.SuppressDefault: if self.getSuppressOptions( ): #this is calculated every time because user can switch options while using tool layer.addFeature(feature, True) else: if not form.dialog().exec_(): feature.setAttributes(form.feature().attributes()) elif formSuppress == QgsEditFormConfig.SuppressOff: if not form.dialog().exec_(): feature.setAttributes(form.feature().attributes()) else: layer.addFeature(feature, True) layer.endEditCommand() self.canvas.refresh() self.initVariable()
def createGeometry(self, geom): geom = self.reprojectRubberBand(geom) if geom : layer = self.canvas.currentLayer() feature = QgsFeature() fields = layer.pendingFields() feature.setGeometry(geom) feature.initAttributes(fields.count()) provider = layer.dataProvider() for i in range(fields.count()): feature.setAttribute(i, provider.defaultValue(i)) form = QgsAttributeDialog(layer, feature, False) form.setMode(QgsAttributeForm.AddFeatureMode) formSuppress = layer.editFormConfig().suppress() if formSuppress == QgsEditFormConfig.SuppressDefault: if self.getSuppressOptions(): #this is calculated every time because user can switch options while using tool layer.addFeature(feature, True) else: if not form.dialog().exec_(): feature.setAttributes(form.feature().attributes()) elif formSuppress == QgsEditFormConfig.SuppressOff: if not form.dialog().exec_(): feature.setAttributes(form.feature().attributes()) else: layer.addFeature(feature, True) layer.endEditCommand() self.canvas.refresh() self.initVariable()
def updateDialog(self, feat): if isinstance(self.previousDialog, QgsAttributeDialog): self.previousDialog.accept() self.currentDialog = QgsAttributeDialog(self.layer, feat, False, showDialogButtons=False) self.currentDialog.setWindowFlag(Qt.Widget) self.scrollArea.setWidget(self.currentDialog) self.previousDialog = self.currentDialog
def actionShowFormTriggered(self): if self.mFeaturesTreeWidget.currentItem() is None: QMessageBox.critical(self, self.tr("No feature selected"), self.tr("Please select a feature.")) return if self.mFeaturesTreeWidget.currentItem().data( 0, TreeWidgetItemRole.Type) != TreeWidgetItemType.Feature: QMessageBox.critical(self, self.tr("Selected item is not a feature"), self.tr("Please select a feature.")) return showDocumentFormDialog = QgsAttributeDialog( self.mFeaturesTreeWidget.currentItem().data( 0, TreeWidgetItemRole.Layer), self.mFeaturesTreeWidget.currentItem().data( 0, TreeWidgetItemRole.Feature), False, self, True) showDocumentFormDialog.exec() self.updateUi()
def updateAttributesAfterAdding(self): """ Updates feature attributes according to the button configuration :return: """ layer = self.sender() while self.addedFeatures: featureId = self.addedFeatures.pop() #begining the edit command # layer.beginEditCommand(self.tr("DSG Tools reclassification tool: adjusting feature's attributes")) #accessing added features editBuffer = layer.editBuffer() features = editBuffer.addedFeatures() for key in features: #just checking the newly added feature, the other I don't care if key == featureId: feature = features[key] #setting the attributes using the reclassification dictionary self.setFeatureAttributes(feature, editBuffer) # layer.endEditCommand() if 'openForm' in self.reclassificationDict[self.category][ self.edgvClass][self.buttonName]['buttonProp']: layer.updateFeature(feature) form = QgsAttributeDialog(layer, feature, False) form.setMode(int(QgsAttributeForm.SingleEditMode)) form.exec_() layer.updateFeature(feature)
def _newDialog(self, cloneFeature): feature = QgsFeature() if (cloneFeature): feature = QgsFeature(self._feature) else: feature = self._feature context = QgsAttributeEditorContext() myDa = QgsDistanceArea() myDa.setSourceCrs(self._layer.crs()) myDa.setEllipsoidalMode( self._iface.mapCanvas().mapSettings().hasCrsTransformEnabled()) myDa.setEllipsoid(QgsProject.instance().readEntry( 'Measure', '/Ellipsoid', GEO_NONE)[0]) context.setDistanceArea(myDa) context.setVectorLayerTools(self._iface.vectorLayerTools()) dialog = QgsAttributeDialog(self._layer, feature, cloneFeature, None, True, context) if (self._layer.actions().size() > 0): dialog.setContextMenuPolicy(Qt.ActionsContextMenu) a = QAction(self.tr('Run actions'), dialog) a.setEnabled(False) dialog.addAction(a) i = 0 for action in self._layer.actions(): if (action.runable()): a = FeatureAction(action.name(), feature, self._layer, i, -1, self._iface, dialog) dialog.addAction(a) a.triggered.connect(a.execute) pb = dialog.findChild(action.name()) if (pb): pb.clicked.connect(a.execute) i += 1 return dialog
def _newDialog(self, cloneFeature): feature = QgsFeature() if (cloneFeature): feature = QgsFeature(self._feature) else: feature = self._feature context = QgsAttributeEditorContext() myDa = QgsDistanceArea() myDa.setSourceCrs(self._layer.crs()) myDa.setEllipsoidalMode(self._iface.mapCanvas().mapSettings().hasCrsTransformEnabled()) myDa.setEllipsoid(QgsProject.instance().readEntry('Measure', '/Ellipsoid', GEO_NONE)[0]) context.setDistanceArea(myDa) context.setVectorLayerTools(self._iface.vectorLayerTools()) dialog = QgsAttributeDialog(self._layer, feature, cloneFeature, None, True, context) if (self._layer.actions().size() > 0): dialog.setContextMenuPolicy(Qt.ActionsContextMenu) a = QAction(self.tr('Run actions'), dialog) a.setEnabled(False) dialog.addAction(a) i = 0 for action in self._layer.actions(): if (action.runable()): a = ArkFeatureAction(action.name(), feature, self._layer, i, -1, self._iface, dialog) dialog.addAction(a) a.triggered.connect(a.execute) pb = dialog.findChild(action.name()) if (pb): pb.clicked.connect(a.execute) i += 1 return dialog
def addFeature(self, feature, layer, field, pointValue): fields = layer.fields() feature.initAttributes(fields.count()) provider = layer.dataProvider() for i in range(fields.count()): value = provider.defaultValue(i) if fields[i].name() != field else pointValue if value: feature.setAttribute(i, value) form = QgsAttributeDialog(layer, feature, False) form.setMode(QgsAttributeForm.AddFeatureMode) formSuppress = layer.editFormConfig().suppress() if formSuppress == QgsEditFormConfig.SuppressDefault: if self.getSuppressOptions(): #this is calculated every time because user can switch options while using tool layer.addFeature(feature, True) else: if not form.exec_(): feature.setAttributes(form.feature().attributes()) elif formSuppress == QgsEditFormConfig.SuppressOff: if not form.exec_(): feature.setAttributes(form.feature().attributes()) else: layer.addFeature(feature, True)
def createGeometry(self, geom): geom = self.reprojectRubberBand(geom) if geom : layer = self.canvas.currentLayer() feature = QgsFeature() fields = layer.pendingFields() feature.setGeometry(geom) feature.initAttributes(fields.count()) provider = layer.dataProvider() for i in range(fields.count()): feature.setAttribute(i, provider.defaultValue(i)) form = QgsAttributeDialog(layer, feature, False) form.setIsAddDialog(True) if not form.dialog().exec_(): ok = False else: ok = True if ok: feature.setAttributes(form.feature().attributes()) layer.endEditCommand() self.initVariable() else: self.initVariable()
def insert_line(self, method): layer = self.iface.activeLayer() if not isinstance(layer, QgsVectorLayer) or layer.geometryType() != QGis.Line: self.iface.messageBar().pushMessage( self.tr("ReconstructLine"), self. tr("Line can\'t be inserted! Select lines layer for inserting new geom!" ), level=QgsMessageBar.WARNING, duration=5) return if not layer.isEditable(): self.iface.messageBar().pushMessage( self.tr("ReconstructLine"), self.tr("Line can\'t be inserted! Layer is not editable!"), level=QgsMessageBar.WARNING, duration=5) return if not self._geom_buffer: self.iface.messageBar().pushMessage( self.tr("ReconstructLine"), self.tr("Line can\'t be inserted! Copy points first!"), level=QgsMessageBar.WARNING, duration=5) return #show message self.iface.messageBar().clearWidgets() self.iface.messageBar().pushMessage( self.tr("ReconstructLine"), self.tr("Processing points. Please wait..."), level=QgsMessageBar.INFO) QgsApplication.setOverrideCursor(Qt.WaitCursor) QgsApplication.processEvents() QgsApplication.processEvents() QgsApplication.processEvents() try: # Create line # QGS geoms to np points = [(in_geom.x(), in_geom.y()) for in_geom in self._geom_buffer] data = np.array(points) # Make line if method == 'MST': conn = MST(data) result = conn.connect() elif method == 'SOM': som = SOM1d(data) result = som.connect() else: raise ValueError #np to QGS lines = [] for line in result: lines.append( [QgsPoint(out_geom[0], out_geom[1]) for out_geom in line]) geom_list = [] if layer.wkbType() == QGis.WKBMultiLineString: geom_list.append(QgsGeometry.fromMultiPolyline(lines)) else: for line in lines: geom_list.append(QgsGeometry.fromPolyline(line)) # Check crs and reproject target_crs = layer.crs() if target_crs.srsid() != self._srid.srsid(): transf = QgsCoordinateTransform(self._srid, target_crs) for geom in geom_list: geom.transform(transf) # Insert feature(s) features = [] for geom in geom_list: feat = QgsFeature() feat.setFields(layer.dataProvider().fields()) feat.setGeometry(geom) features.append(feat) default_suppress = (method == 'MST') suppressForm = QSettings().value( "/qgis/digitizing/disable_enter_attribute_values_dialog", type=bool, defaultValue=default_suppress) if suppressForm: # quite insert feature result = layer.addFeatures(features) else: # show dialog QgsApplication.restoreOverrideCursor() for feat in features: attrDialog = QgsAttributeDialog(layer, feat, False) attrDialog.setIsAddDialog(True) result = attrDialog.exec_() # show message self.iface.messageBar().clearWidgets() if result: self.iface.messageBar().pushMessage( self.tr("ReconstructLine"), self.tr("%s line segment(s) was sucesfull added" % (len(features))), level=QgsMessageBar.INFO) else: self.iface.messageBar().pushMessage( self.tr("ReconstructLine"), self.tr("Line was not added"), level=QgsMessageBar.CRITICAL) self.iface.mapCanvas().refresh() finally: QgsApplication.restoreOverrideCursor()
def openFormAttribute(self): lyr = self.iface.mapCanvas().currentLayer() if lyr: f = lyr.selectedFeatures()[0] attrDialog = QgsAttributeDialog(lyr, f, False) result = attrDialog.exec_()
def insert_line(self): layer = self.iface.activeLayer() if not isinstance(layer, QgsVectorLayer) or layer.geometryType() != QGis.Line: self.iface.messageBar().pushMessage(self.tr("ReconstructLine"), self.tr("Line can\'t be inserted! Select lines layer for inserting new geom!"), level=QgsMessageBar.WARNING, duration=5) return if not layer.isEditable(): self.iface.messageBar().pushMessage(self.tr("ReconstructLine"), self.tr("Line can\'t be inserted! Layer is not editable!"), level=QgsMessageBar.WARNING, duration=5) return if not self._geom_buffer: self.iface.messageBar().pushMessage(self.tr("ReconstructLine"), self.tr("Line can\'t be inserted! Copy points first!"), level=QgsMessageBar.WARNING, duration=5) return #show message self.iface.messageBar().clearWidgets() self.iface.messageBar().pushMessage(self.tr("ReconstructLine"), self.tr("Processing points. Please wait..."), level=QgsMessageBar.INFO ) QgsApplication.setOverrideCursor(Qt.WaitCursor) QgsApplication.processEvents() QgsApplication.processEvents() QgsApplication.processEvents() try: # Create line # QGS geoms to np points = [(in_geom.x(), in_geom.y()) for in_geom in self._geom_buffer] data = np.array(points) # Make line som = SOM1d(data) result = som.connect() #np to QGS self._geom_buffer = [QgsPoint(out_geom[0], out_geom[1]) for out_geom in result] if layer.wkbType() == QGis.WKBMultiLineString: geom = QgsGeometry.fromMultiPolyline([self._geom_buffer]) else: geom = QgsGeometry.fromPolyline(self._geom_buffer) # Check crs and reproject target_crs = layer.crs() if target_crs.srsid() != self._srid.srsid(): transf = QgsCoordinateTransform(self._srid, target_crs) geom.transform(transf) # Insert feature feat = QgsFeature() feat.setFields(layer.dataProvider().fields()) feat.setGeometry(geom) suppressForm = QSettings().value("/qgis/digitizing/disable_enter_attribute_values_dialog", type=bool, defaultValue=False) if suppressForm: # quite insert feature result = layer.addFeatures([feat]) else: # show dialog QgsApplication.restoreOverrideCursor() attrDialog = QgsAttributeDialog(layer, feat, False) attrDialog.setIsAddDialog(True) result = attrDialog.exec_() # show message self.iface.messageBar().clearWidgets() if result: self.iface.messageBar().pushMessage(self.tr("ReconstructLine"), self.tr("One line was sucesfull added"), level=QgsMessageBar.INFO) else: self.iface.messageBar().pushMessage(self.tr("ReconstructLine"), self.tr("Line was not added"), level=QgsMessageBar.CRITICAL) self.iface.mapCanvas().refresh() finally: QgsApplication.restoreOverrideCursor()
# coding: utf-8 from qgis.gui import QgsAttributeDialog from qgis.utils import iface map_canvas = iface.mapCanvas() layer = map_canvas.currentLayer() feature = layer.getFeatures().next() attribute_dialog = QgsAttributeDialog(layer, feature, True) attribute_dialog.show() attribute_dialog_from_iface = iface.getFeatureForm(layer, feature) attribute_dialog_from_iface.show()
def get_feature_form(layer, feature, isadd=False): dlg = QgsAttributeDialog(layer, feature, False, None) dlg.setIsAddDialog(isadd) return dlg
class NTMainPanel(BASE, WIDGET): def __init__(self, iface, vlayer): super().__init__(None) self.setupUi(self) self.iface = iface self.layer = vlayer self.setWindowTitle('NavTable - ' + self.layer.name()) self.exprFilterBT.setIcon(QgsApplication.getThemeIcon('mIconExpressionSelect.svg')) self.removeFilterBT.setIcon(QgsApplication.getThemeIcon('mActionDeselectAll.svg')) self.orderByBT.setIcon(QgsApplication.getThemeIcon('sort.svg')) self.previousDialog = self.widget_form self.validator = QIntValidator(1, 1) self.currentFeatLB.setValidator(self.validator) self.nextBT.clicked.connect(self.next) self.previousBT.clicked.connect(self.previous) self.lastBT.clicked.connect(self.last) self.firstBT.clicked.connect(self.first) self.orderByBT.clicked.connect(self.orderBy) self.exprFilterBT.clicked.connect(self.filter_by_expression) self.removeFilterBT.clicked.connect(self.removeFilter) self.deleteBT.clicked.connect(self.deleteFeature) self.currentFeatLB.returnPressed.connect(self.manual) self.layer.editingStarted.connect(self.activateEdit) self.layer.editingStopped.connect(self.deactivateEdit) self.allIds = self.layer.allFeatureIds() self.currentIndexFid = 0 self.currentFid = self.allIds[self.currentIndexFid] self.currentExpression = '' self.update(self.currentFid, self.currentIndexFid) self.removeFilterBT.setEnabled(False) if self.layer.isEditable(): self.activateEdit() def setCounters(self, current, max): self.currentFeatLB.setText(current) self.nFeatLB.setText(max) self.validator.setRange(1, int(max)) def keyPressEvent(self, event): if event.key() == Qt.Key_Enter: pass else: super().keyPressEvent(event) def next(self): newIndex = self.currentIndexFid + 1 newFid = self.allIds[newIndex] self.update(newFid, newIndex) def previous(self): newIndex = self.currentIndexFid - 1 newFid = self.allIds[newIndex] self.update(newFid, newIndex) def last(self): newIndex = len(self.allIds) - 1 newFid = self.allIds[newIndex] self.update(newFid, newIndex) def first(self): newIndex = 0 newFid = self.allIds[newIndex] self.update(newFid, newIndex) def manual(self): newIndex = int(self.currentFeatLB.text()) - 1 newFid = self.allIds[newIndex] self.update(newFid, newIndex) def update(self, newFid, newIndex): feat = self.getFeature(newFid) if not feat: print("Error accesing index.") return self.currentIndexFid = newIndex self.currentFid = newFid self.updateNFeatLB() self.updateCanvas(feat) self.updateDialog(feat) self.checkButtons() def updateCanvas(self, feat): if self.has_to_select(): self.layer.selectByIds([self.currentFid]) geom = feat.geometry() if self.has_to_zoom(): self.zoomTo(geom.boundingBox()) # TODO: be careful with crs elif self.has_to_pan(): self.panTo(geom.centroid()) # TODO: be careful with crs def zoomTo(self, newExtent): ''' newExtend is bbox ''' self.iface.mapCanvas().setExtent(newExtent) self.iface.mapCanvas().refresh() def panTo(self, newCenter): ''' newCenter is QgsPoint geometry Taked from: http://svn.reprojected.com/qgisplugins/trunk/refmap/refmap.py ''' newCenterPoint = newCenter.asPoint() currentExtent = self.iface.mapCanvas().extent() currentCenter = currentExtent.center() dx = math.fabs(newCenterPoint.x() - currentCenter.x()) dy = math.fabs(newCenterPoint.y() - currentCenter.y()) if (newCenterPoint.x() > currentCenter.x()): currentExtent.setXMinimum(currentExtent.xMinimum() + dx) currentExtent.setXMaximum(currentExtent.xMaximum() + dx) else: currentExtent.setXMinimum(currentExtent.xMinimum() - dx) currentExtent.setXMaximum(currentExtent.xMaximum() - dx) if (newCenterPoint.y() > currentCenter.y()): currentExtent.setYMaximum(currentExtent.yMaximum() + dy) currentExtent.setYMinimum(currentExtent.yMinimum() + dy) else: currentExtent.setYMaximum(currentExtent.yMaximum() - dy) currentExtent.setYMinimum(currentExtent.yMinimum() - dy) self.iface.mapCanvas().setExtent(currentExtent) self.iface.mapCanvas().refresh() def has_to_pan(self): return self.panCB.isChecked() def has_to_zoom(self): return self.zoomCB.isChecked() def has_to_select(self): return self.selectCB.isChecked() def updateNFeatLB(self): self.setCounters(str(self.currentIndexFid + 1), str(len(self.allIds))) def getFeature(self, fid): feat = QgsFeature() if self.layer.getFeatures(QgsFeatureRequest().setFilterFid(fid)).nextFeature(feat): return feat else: # return False return feat def checkButtons(self): if self.currentIndexFid == len(self.allIds) - 1: self.nextBT.setEnabled(False) self.lastBT.setEnabled(False) else: self.nextBT.setEnabled(True) self.lastBT.setEnabled(True) if self.currentIndexFid == 0: self.previousBT.setEnabled(False) self.firstBT.setEnabled(False) else: self.previousBT.setEnabled(True) self.firstBT.setEnabled(True) def updateDialog(self, feat): if isinstance(self.previousDialog, QgsAttributeDialog): self.previousDialog.accept() self.currentDialog = QgsAttributeDialog(self.layer, feat, False, showDialogButtons=False) self.currentDialog.setWindowFlag(Qt.Widget) self.scrollArea.setWidget(self.currentDialog) self.previousDialog = self.currentDialog def deleteFeature(self): self.layer.deleteFeature(self.currentFid) self.allIds.remove(self.currentFid) if self.currentIndexFid >= len(self.allIds) - 1: self.currentIndexFid = self.currentIndexFid - 1 newFid = self.allIds[self.currentIndexFid] self.update(newFid, self.currentIndexFid) def activateEdit(self): self.deleteBT.setEnabled(True) self.deleteBT.setStyleSheet("background-color: red") def deactivateEdit(self): self.deleteBT.setEnabled(False) self.deleteBT.setStyleSheet("") def filter_by_expression(self): dialog = NTExpressionBuilder(self.layer, self.currentExpression, self.iface) if dialog.exec_(): expression = dialog.expressionBuilder.expressionText() self.filter(expression) def filter_by_form(self): dialog = NTSelectByFormDialog(self.layer, self.iface) if dialog.exec_(): expression = dialog.expression self.filter(expression) def removeFilter(self): self.filter('') self.removeFilterBT.setEnabled(False) def filter(self, expression): self.currentExpression = expression if self.currentExpression != '': expr = QgsExpression(self.currentExpression) selection = self.layer.getFeatures(QgsFeatureRequest(expr)) self.allIds = [s.id() for s in selection] self.setWindowTitle('NavTable - {} ({})'.format(self.layer.name(), self.tr('Filtered'))) self.removeFilterBT.setEnabled(True) if len(self.allIds) == 0 or self.currentExpression == '': self.allIds = self.layer.allFeatureIds() self.setWindowTitle('NavTable - ' + self.layer.name()) self.currentIndexFid = 0 newFid = self.allIds[self.currentIndexFid] self.update(newFid, self.currentIndexFid) def orderBy(self): dialog = NTFieldSelect(self.layer) if dialog.exec_(): featureRequest = dialog.generateFeatureRequest() featureRequest.setFilterFids(self.allIds) feats = self.layer.getFeatures(featureRequest) self.allIds = [f.id() for f in feats] self.currentIndexFid = 0 newFid = self.allIds[self.currentIndexFid] self.update(newFid, self.currentIndexFid)