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 get_feature_form(layer, feature, isadd=False): dlg = QgsAttributeDialog(layer, feature, False, None) dlg.setIsAddDialog(isadd) return dlg
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()
def get_feature_form(layer, feature, isadd=False): dlg = QgsAttributeDialog(layer, feature, False, None) dlg.setIsAddDialog(isadd) return dlg