コード例 #1
0
ファイル: form_manager.py プロジェクト: IGNF/saisie_carhab
 def submit_uvc(self, table_name, form_obj, id):
     result_msg = self.submit(table_name, form_obj, id)
     if not result_msg == 1:
         popup(str(result_msg))
         
         return
     self.db.commit()
     iface.mapCanvas().currentLayer().triggerRepaint()
     self.close_db()
     self.uvc_form.close()
     
コード例 #2
0
ファイル: catalog.py プロジェクト: IGNF/saisie_carhab
 def valid(self):
     msg = ''
     for cat_name in self.catalog:
         disp_path_wdgt = self.ui.findChild(QLineEdit, cat_name)
         if disp_path_wdgt.text():
             self.catalog[cat_name] = disp_path_wdgt.text()
         else:
             msg += cat_name + '\n'
     if msg:
         popup('Catalogues non renseignés :\n\n' + msg)
         return
     elif self.check_data():
         s = QSettings()
         s.setValue('catalogs', self.catalog)
         iface.removeDockWidget(self.ui)
コード例 #3
0
ファイル: import_layer.py プロジェクト: IGNF/saisie_carhab
    def launch_import(self, file_name):
        # Set corresponding layer.
        importLayer = self.createQgisVectorLayer(file_name)
        # Carhab layer should not overlaps itself. Calculate difference between layers.
        diffLayer = self.makeDifference(importLayer)

        if diffLayer:
            if diffLayer.featureCount() == 0:
                popup(
                    ("Emprise de la couche à importer déjà peuplée " "dans la couche Carhab : aucune entité ajoutée.")
                )
            else:
                # Import only difference between layers.
                self.makeImport(diffLayer)
        else:
            popup(("Erreur inconnue : aucune entité ajoutée."))
コード例 #4
0
ファイル: catalog.py プロジェクト: IGNF/saisie_carhab
 def check_data(self):
     catalog_struct = Config.CATALOG_STRUCTURE
     msg = ''
     for cat_name, cat_path in self.catalog.items():
         fl_name = path.basename(cat_path)
         if not path.exists(cat_path) and not path.isfile(cat_path):
             msg += 'Chemin de fichier invalide pour {}.\n'.format(fl_name)
             continue
         with open(cat_path, 'rb') as cat_file:
             reader = csv.reader(cat_file, delimiter=b';')
             headers = reader.next()
             file_ctnt = []
             for row in reader:
                 file_ctnt.append(row)
         if len(headers) < 2:
             msg += 'Délimiteur ";" requis dans {}.\n'.format(fl_name)
             continue
         if catalog_struct.get('data').get(cat_name):
             for field in catalog_struct.get('data').get(cat_name):
                 if not field in headers:
                     msg += 'Champ "{}" manquant dans le fichier "{}".\n'\
                         .format(field, fl_name)
         else:
             cds = [i[2] for i in catalog_struct.get('links').get(cat_name)]
             for cd in cds:
                 if not cd in headers:
                     msg += 'Champ "{}" manquant dans le fichier "{}".\n'\
                         .format(cd, fl_name)
         i = 2
         for row in file_ctnt:
             diff = len(row) - len(headers)
             if diff > 0:
                 msg += '{} colonne(s) en trop dans {} à la ligne {}.\n'\
                     .format(unicode(diff), cat_name, unicode(i))
             elif diff < 0:
                 msg += '{} colonne(s) manquante(s) dans {} à la ligne {}.\n'\
                     .format(unicode(-diff), fl_name, unicode(i))
             i += 1
                 
         
     if msg:
         popup(msg)
         return False
     else:
         return True
コード例 #5
0
ファイル: form_manager.py プロジェクト: IGNF/saisie_carhab
 def open_sf(self, table_name, id=None):
     self.create_savepoint('sigmaf')
     s = QSettings()
     s.setValue('current_info/sigmaf', id)
     disp_fields = [
         'cd_syntax',
         'lb_syntax',
         'abon_domin'
     ]
     self.rel_syn = RelationsManager('composyntaxon', disp_fields)
     self.rel_syn.add_clicked.connect(self.open_syntaxon)
     self.rel_syn.edit_clicked.connect(self.open_syntaxon)
     self.rel_syn.del_clicked.connect(self.del_record)
     
     from_cat = False
     r = self.get_recorder('sigmaf')
     if id:
         from_cat = r.select('id', id)[0].get('catalog')
     else:
         last_sf_id = r.get_last_id() if r.get_last_id() else 0
         s.setValue('current_info/sigmaf', last_sf_id + 1)
         from_cat = question('Appel aux catalogues ?,',\
             'Sélectionner un sigma facies issu des catalogues ?')
         s.setValue('current_info/sigmaf/catalog', int(from_cat))
     
     if not s.value('catalogs'):
         popup('Les référentiels ne sont pas renseignés')
         Catalog().run()
         return
     
     form_name = 'form_sigmaf_cat' if from_cat else 'form_sigmaf'
     self.sf_form = Form(form_name, id, self.rel_syn)
     self.sf_form.canceled.connect(self.cancel_sf_fill)
     self.sf_form.valid_clicked.connect(self.submit_sf)
     self._open_form('sigmaf', self.sf_form)
     
     cd_sf_field = self.sf_form.ui.findChild(QComboBox, 'code_sigma')
     if cd_sf_field:
         cd_sf_field.currentIndexChanged.connect(self._get_syntax)
コード例 #6
0
ファイル: import_layer.py プロジェクト: IGNF/saisie_carhab
 def closeImport(self, success, code):
     if not success:
         if code == 0:
             popup("Erreur inconnue : aucune entité ajoutée.")
         elif code == 1:
             popup("Pas de couche carhab initialisée : aucune entité ajoutée.")
         elif code == 2:
             popup("Import annulé : aucune entité ajoutée")
     if self.progressBar:
         self.progressBar.setValue(100)
         self.progressValue = 100
         iface.messageBar().popWidget(self.msgBarItem)
     self.canvas.currentLayer().updateExtents()
     self.canvas.setExtent(self.canvas.currentLayer().extent())
     self.canvas.refresh()
コード例 #7
0
 def _get_selected_item_id(self):
     sel_item = self._tbl_wdgt.item(self._tbl_wdgt.currentRow(), 0)
     msg = 'Sélectionner une ligne dans le tableau'
     return sel_item.text() if sel_item else popup(msg)
     return False
コード例 #8
0
ファイル: fse.py プロジェクト: IGNF/saisie_carhab
    def run(self):
        """Specific stuff at tool activating."""

        cur_carhab_lyr = CarhabLayerRegistry.instance().getCurrentCarhabLayer()
        if not cur_carhab_lyr:
            no_carhab_lyr_msg()
            return
        csv_dir = QFileDialog.getExistingDirectory(None, "Select a folder:", None, QFileDialog.ShowDirsOnly)
        if csv_dir:
            now = time.strftime("%Y-%m-%d-%H%M%S")
            directory = os.path.join(csv_dir, cur_carhab_lyr.getName() + "_" + now)
            if not os.path.exists(directory):
                os.makedirs(directory)

            for tbl_name, desc in Config.DB_STRUCTURE:
                file_name = desc.get("std_name")
                tbl_fields = desc.get("fields")
                if file_name:
                    if not desc.get("spatial"):
                        csv_name = file_name if file_name.endswith(".csv") else file_name + ".csv"
                        csv_path = os.path.join(directory, csv_name)
                        field_names = [row[1].get("std_name") for row in tbl_fields if row[1].get("std_name")]
                        db = DbManager(cur_carhab_lyr.dbPath)
                        r = Recorder(db, tbl_name)
                        tbl_rows = r.select_all()
                        csv_rows = []
                        for tbl_row in tbl_rows:
                            csv_row = {}
                            for dbf, value in tbl_row.items():
                                for field in desc.get("fields"):
                                    if dbf == field[0] and field[1].get("std_name"):
                                        csv_row[encode(field[1].get("std_name"))] = encode(value)
                                        break
                            csv_rows.append(csv_row)

                        with open(csv_path, "wb") as csv_file:
                            writer = csv.DictWriter(csv_file, field_names)
                            writer.writeheader()
                            writer.writerows(csv_rows)
                    else:
                        for vlyr in cur_carhab_lyr.getQgisLayers():
                            vlyr_tbl = QgsDataSourceURI(vlyr.dataProvider().dataSourceUri()).table()
                            if tbl_name == vlyr_tbl:
                                shp_name = file_name if file_name.endswith(".shp") else file_name + ".shp"
                                shp_path = os.path.join(directory, shp_name)
                                QgsVectorFileWriter.writeAsVectorFormat(vlyr, shp_path, "utf-8", None)
                                shp_lyr = QgsVectorLayer(shp_path, "", "ogr")
                                shapefile = shp_lyr.dataProvider()
                                features = shapefile.getFeatures()
                                attrs_to_del = []
                                for attr, attr_desc in tbl_fields:
                                    std_attr = attr_desc.get("std_name")
                                    if not std_attr == attr:
                                        if std_attr:
                                            cur_field = shapefile.fields().field(attr)
                                            new_field = QgsField(cur_field)
                                            new_field.setName(std_attr)
                                            shapefile.addAttributes([new_field])
                                            for feat in features:
                                                idx = shapefile.fields().indexFromName(std_attr)
                                                update_map = {feat.id(): {idx: feat[attr]}}
                                                shapefile.changeAttributeValues(update_map)
                                        attrs_to_del.append(shapefile.fields().indexFromName(attr))
                                shapefile.deleteAttributes(attrs_to_del)
            popup("Export effectué")