def _prepare_code(self, specification): """Prepare the code turning templates into python. :param specification: Specification instance containing template replacement keys/values. :type specification: PluginSpecification """ # process the user entries if specification.gen_makefile: self.populate_template(specification, self.shared_dir, 'Makefile.tmpl', 'Makefile') if specification.gen_pb_tool: self.populate_template(specification, self.shared_dir, 'pb_tool.tmpl', 'pb_tool.cfg') self.populate_template(specification, self.template_dir, '__init__.tmpl', '__init__.py') self.populate_template(specification, self.template_dir, 'module_name.tmpl', '%s.py' % specification.module_name) if specification.gen_scripts: release_script = QFile(os.path.join(self.shared_dir, 'release.sh')) release_script.copy(os.path.join(self.plugin_path, 'release.sh')) plugin_upload = QFile( os.path.join(self.shared_dir, 'plugin_upload.py')) plugin_upload.copy( os.path.join(self.plugin_path, 'plugin_upload.py')) # noinspection PyCallByClass,PyTypeChecker QFile.setPermissions( os.path.join(self.plugin_path, 'plugin_upload.py'), QFile.ReadOwner | QFile.WriteOwner | QFile.ExeOwner | QFile.ReadUser | QFile.WriteUser | QFile.ExeUser | QFile.ReadGroup | QFile.ExeGroup | QFile.ReadOther | QFile.ExeOther)
def convert_metadata(self): """Method invoked when OK button is clicked.""" # Converter parameter converter_parameter = {} # Target exposure if self.target_exposure_combo_box.isEnabled(): exposure_index = self.target_exposure_combo_box.currentIndex() exposure_key = self.target_exposure_combo_box.itemData( exposure_index, Qt.UserRole) converter_parameter['exposure'] = exposure_key # Metadata current_metadata = self.keyword_io.read_keywords(self.layer) old_metadata = convert_metadata(current_metadata, **converter_parameter) # Input input_layer_path = self.layer.source() input_directory_path = os.path.dirname(input_layer_path) input_file_name = os.path.basename(input_layer_path) input_base_name = os.path.splitext(input_file_name)[0] input_extension = os.path.splitext(input_file_name)[1] # Output output_path = self.output_path_line_edit.text() output_directory_path = os.path.dirname(output_path) output_file_name = os.path.basename(output_path) output_base_name = os.path.splitext(output_file_name)[0] # Copy all related files, if exists extensions = [ # Vector layer '.shp', '.geojson', '.qml', '.shx', '.dbf', '.prj', 'qpj', # Raster layer '.tif', '.tiff', '.asc', ] for extension in extensions: source_path = os.path.join(input_directory_path, input_base_name + extension) if not os.path.exists(source_path): continue target_path = os.path.join(output_directory_path, output_base_name + extension) QFile.copy(source_path, target_path) # Replace the metadata with the old one output_file_path = os.path.join(output_directory_path, output_base_name + input_extension) write_iso19115_metadata(output_file_path, old_metadata, version_35=True)
def _add_raster_layer(self, raster_layer, layer_name, save_style=False): """Add a raster layer to the folder. :param raster_layer: The layer to add. :type raster_layer: QgsRasterLayer :param layer_name: The name of the layer in the datastore. :type layer_name: str :param save_style: If we have to save a QML too. Default to False. :type save_style: bool :returns: A two-tuple. The first element will be True if we could add the layer to the datastore. The second element will be the layer name which has been used or the error message. :rtype: (bool, str) .. versionadded:: 4.0 """ if not self.is_writable(): return False, 'The destination is not writable.' output = QFileInfo(self.uri.filePath(layer_name + '.tif')) source = QFileInfo(raster_layer.source()) if source.exists() and source.suffix() in ['tiff', 'tif']: # If it's tiff file based. QFile.copy(source.absoluteFilePath(), output.absoluteFilePath()) else: # If it's not file based. renderer = raster_layer.renderer() provider = raster_layer.dataProvider() crs = raster_layer.crs() pipe = QgsRasterPipe() pipe.set(provider.clone()) pipe.set(renderer.clone()) file_writer = QgsRasterFileWriter(output.absoluteFilePath()) file_writer.Mode(1) file_writer.writeRaster( pipe, provider.xSize(), provider.ySize(), provider.extent(), crs) del file_writer if save_style: style_path = QFileInfo(self.uri.filePath(layer_name + '.qml')) raster_layer.saveNamedStyle(style_path.absoluteFilePath()) assert output.exists() return True, output.baseName()
def _add_raster_layer(self, raster_layer, layer_name, save_style=False): """Add a raster layer to the folder. :param raster_layer: The layer to add. :type raster_layer: QgsRasterLayer :param layer_name: The name of the layer in the datastore. :type layer_name: str :param save_style: If we have to save a QML too. Default to False. :type save_style: bool :returns: A two-tuple. The first element will be True if we could add the layer to the datastore. The second element will be the layer name which has been used or the error message. :rtype: (bool, str) .. versionadded:: 4.0 """ if not self.is_writable(): return False, 'The destination is not writable.' output = QFileInfo(self.uri.filePath(layer_name + '.tif')) source = QFileInfo(raster_layer.source()) if source.exists() and source.suffix() in ['tiff', 'tif']: # If it's tiff file based. QFile.copy(source.absoluteFilePath(), output.absoluteFilePath()) else: # If it's not file based. renderer = raster_layer.renderer() provider = raster_layer.dataProvider() crs = raster_layer.crs() pipe = QgsRasterPipe() pipe.set(provider.clone()) pipe.set(renderer.clone()) file_writer = QgsRasterFileWriter(output.absoluteFilePath()) file_writer.Mode(1) file_writer.writeRaster(pipe, provider.xSize(), provider.ySize(), provider.extent(), crs) del file_writer if save_style: style_path = QFileInfo(self.uri.filePath(layer_name + '.qml')) raster_layer.saveNamedStyle(style_path.absoluteFilePath()) assert output.exists() return True, output.baseName()
def convert_metadata(self): """Method invoked when OK button is clicked.""" # Converter parameter converter_parameter = {} # Target exposure if self.target_exposure_combo_box.isEnabled(): exposure_index = self.target_exposure_combo_box.currentIndex() exposure_key = self.target_exposure_combo_box.itemData( exposure_index, Qt.UserRole) converter_parameter['exposure'] = exposure_key # Metadata current_metadata = self.keyword_io.read_keywords(self.layer) old_metadata = convert_metadata( current_metadata, **converter_parameter) # Input input_layer_path = self.layer.source() input_directory_path = os.path.dirname(input_layer_path) input_file_name = os.path.basename(input_layer_path) input_base_name = os.path.splitext(input_file_name)[0] input_extension = os.path.splitext(input_file_name)[1] # Output output_path = self.output_path_line_edit.text() output_directory_path = os.path.dirname(output_path) output_file_name = os.path.basename(output_path) output_base_name = os.path.splitext(output_file_name)[0] # Copy all related files, if exists extensions = [ # Vector layer '.shp', '.geojson', '.qml', '.shx', '.dbf', '.prj', 'qpj', # Raster layer '.tif', '.tiff', '.asc', ] for extension in extensions: source_path = os.path.join( input_directory_path, input_base_name + extension) if not os.path.exists(source_path): continue target_path = os.path.join( output_directory_path, output_base_name + extension) QFile.copy(source_path, target_path) # Replace the metadata with the old one output_file_path = os.path.join( output_directory_path, output_base_name + input_extension ) write_iso19115_metadata( output_file_path, old_metadata, version_35=True)
def download_csv_file(self, filename): settings = QSettings() settings.setValue('Asistente-LADM-COL/wizards/points_csv_file_delimiter', self.txt_delimiter.text().strip()) new_filename, filter = QFileDialog.getSaveFileName(self, QCoreApplication.translate("WizardTranslations", "Save File"), os.path.join(settings.value('Asistente-LADM-COL/wizards/points_download_csv_path', '.'), filename), QCoreApplication.translate("WizardTranslations", "CSV File (*.csv *.txt)")) if new_filename: settings.setValue('Asistente-LADM-COL/wizards/points_download_csv_path', os.path.dirname(new_filename)) template_file = QFile(":/Asistente-LADM-COL/resources/csv/" + filename) if not template_file.exists(): self.logger.critical(__name__, "CSV doesn't exist! Probably due to a missing 'make' execution to generate resources...") msg = QCoreApplication.translate("WizardTranslations", "CSV file not found. Update your plugin. For details see log.") self.show_message(msg, Qgis.Warning) return if os.path.isfile(new_filename): self.logger.info(__name__, 'Removing existing file {}...'.format(new_filename)) os.chmod(new_filename, 0o777) os.remove(new_filename) if template_file.copy(new_filename): os.chmod(new_filename, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH) msg = QCoreApplication.translate("WizardTranslations", """The file <a href="file:///{}">{}</a> was successfully saved!""").format(normalize_local_url(new_filename), os.path.basename(new_filename)) self.show_message(msg, Qgis.Info) else: self.logger.warning(__name__, 'There was an error copying the CSV file {}!'.format(new_filename)) msg = QCoreApplication.translate("WizardTranslations", "The file couldn\'t be saved.") self.show_message(msg, Qgis.Warning)
def copy_core_configuration(): """ Copies the basic STDM configuration to the user directory if there is none. """ # check network config exist core_config_path = read_network_path() if not QFile.exists(core_config_path): return else: # if not core_config_path: # core_config_path = u'{0}/templates/configuration.stc'.format( # os.path.dirname(__file__) # ) # # #Exit if the core configuration does not exist # if not QFile.exists(core_config_path): # return # File name of previous configuration v1_1_config_path = '{0}/stdmConfig.xml'.format(USER_PLUGIN_DIR) # Only copy the new one if there is no copy of the previous version # since the version updater will automatically handle the upgrade. if QFile.exists(v1_1_config_path): # Version update will handle the migration return # Copy config assuming that the plugin user folder has no previous # configuration. conf_file = QFile(core_config_path) conf_dest = '{0}/configuration.stc'.format(USER_PLUGIN_DIR) copy_status = conf_file.copy(conf_dest)
def _prepare_specific_files(self, specification): """Prepare specific templates and files. :param specification: Specification instance containing template replacement keys/values. :type specification: PluginSpecification """ for template_name, output_name in \ self.template.template_files(specification).items(): self.populate_template(specification, self.template_dir, template_name, output_name) # copy the non-generated files to the new plugin dir for template_file, output_name in \ self.template.copy_files(specification).items(): t_file = QFile(os.path.join(self.template_dir, template_file)) t_file.copy(os.path.join(self.plugin_path, output_name))
def download_excel_file(self, filename): settings = QSettings() new_filename, filter = QFileDialog.getSaveFileName( self, QCoreApplication.translate("ImportFromExcelDialog", "Save File"), os.path.join( settings.value( 'Asistente-LADM_COL/import_from_excel_dialog/template_save_path', '.'), filename), QCoreApplication.translate("ImportFromExcelDialog", "Excel File (*.xlsx *.xls)")) if new_filename: settings.setValue( 'Asistente-LADM_COL/import_from_excel_dialog/template_save_path', os.path.dirname(new_filename)) template_file = QFile(":/Asistente-LADM_COL/resources/excel/" + filename) if not template_file.exists(): self.logger.critical( __name__, "Excel doesn't exist! Probably due to a missing 'make' execution to generate resources..." ) msg = QCoreApplication.translate( "ImportFromExcelDialog", "Excel file not found. Update your plugin. For details see log." ) self.show_message(msg, Qgis.Warning) return if os.path.isfile(new_filename): self.logger.info( __name__, 'Removing existing file {}...'.format(new_filename)) os.chmod(new_filename, 0o777) os.remove(new_filename) if template_file.copy(new_filename): os.chmod( new_filename, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH) msg = QCoreApplication.translate( "ImportFromExcelDialog", """The file <a href="file:///{}">{}</a> was successfully saved!""" ).format(normalize_local_url(new_filename), os.path.basename(new_filename)) self.show_message(msg, Qgis.Info) else: self.logger.info( __name__, 'There was an error copying the CSV file {}!'.format( new_filename)) msg = QCoreApplication.translate( "ImportFromExcelDialog", "The file couldn\'t be saved.") self.show_message(msg, Qgis.Warning)
def testStatistics(self): """Test zonal stats""" TEST_DATA_DIR = unitTestDataPath() + "/zonalstatistics/" myTempPath = QDir.tempPath() + "/" testDir = QDir(TEST_DATA_DIR) for f in testDir.entryList(QDir.Files): QFile.remove(myTempPath + f) QFile.copy(TEST_DATA_DIR + f, myTempPath + f) myVector = QgsVectorLayer(myTempPath + "polys.shp", "poly", "ogr") myRasterPath = myTempPath + "edge_problem.asc" zs = QgsZonalStatistics(myVector, myRasterPath, "", 1) zs.calculateStatistics(None) feat = QgsFeature() # validate statistics for each feature request = QgsFeatureRequest().setFilterFid(0) feat = next(myVector.getFeatures(request)) myMessage = ('Expected: %f\nGot: %f\n' % (12.0, feat[1])) assert feat[1] == 12.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (8.0, feat[2])) assert feat[2] == 8.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.666666666666667, feat[3])) assert abs(feat[3] - 0.666666666666667) < 0.00001, myMessage request.setFilterFid(1) feat = next(myVector.getFeatures(request)) myMessage = ('Expected: %f\nGot: %f\n' % (9.0, feat[1])) assert feat[1] == 9.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (5.0, feat[2])) assert feat[2] == 5.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.555555555555556, feat[3])) assert abs(feat[3] - 0.555555555555556) < 0.00001, myMessage request.setFilterFid(2) feat = next(myVector.getFeatures(request)) myMessage = ('Expected: %f\nGot: %f\n' % (6.0, feat[1])) assert feat[1] == 6.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (5.0, feat[2])) assert feat[2] == 5.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.833333333333333, feat[3])) assert abs(feat[3] - 0.833333333333333) < 0.00001, myMessage
def load_template_into_layout(layout: QgsLayout, file_path: str): """ Loads a document template into the view and updates the necessary STDM-related composer items. """ copy_file = file_path.replace('sdt', 'cpy') # remove existing copy file if QFile.exists(copy_file): copy_template = QFile(copy_file) copy_template.remove() orig_template_file = QFile(file_path) layout.setCustomProperty('variable_template_path', file_path) # make a copy of the original orig_template_file.copy(copy_file) # work with copy template_file = QFile(copy_file) if not template_file.open(QIODevice.ReadOnly): raise IOError(template_file.errorString()) template_doc = QDomDocument() if template_doc.setContent(template_file): # First load vector layers for the table definitions in the config # collection before loading the composition from file. # table_config_collection = TableConfigurationCollection.create(template_doc) # Load items into the composition and configure STDM data controls context = QgsReadWriteContext() try: layout.loadFromTemplate(template_doc, context) except: pass LayoutUtils.sync_ids_with_uuids(layout) template_file.close()
def run(self): # pylint: disable=missing-docstring current = 0 for source, dest in self.file_map.items(): self.setProgress(100 * current / len(self.file_map)) if self.isCanceled(): return False if QFile.exists(dest): if not QFile.remove(dest): self.error = self.tr( 'Could not remove existing file {}'.format(dest)) return False if not QFile.copy(source, dest): self.error = self.tr('Could not copy file {} to {}'.format( source, dest)) return False current += 1 self.setProgress(100) return True
def _prepare_help(self): """Prepare the help directory.""" # Copy over pylintrc # noinspection PyCallByClass,PyTypeChecker QFile.copy(os.path.join(self.shared_dir, 'pylintrc'), os.path.join(self.plugin_path, 'pylintrc')) # Create sphinx default project for help QDir().mkdir(self.plugin_path + '/help') QDir().mkdir(self.plugin_path + '/help/build') QDir().mkdir(self.plugin_path + '/help/build/html') QDir().mkdir(self.plugin_path + '/help/source') QDir().mkdir(self.plugin_path + '/help/source/_static') QDir().mkdir(self.plugin_path + '/help/source/_templates') # copy doc makefiles # noinspection PyCallByClass,PyTypeChecker QFile.copy(os.path.join(self.shared_dir, 'help/make.bat'), os.path.join(self.plugin_path, 'help/make.bat')) # noinspection PyCallByClass,PyTypeChecker QFile.copy(os.path.join(self.shared_dir, 'help/Makefile'), os.path.join(self.plugin_path, 'help/Makefile'))
def testStatistics(self): """Test zonal stats""" TEST_DATA_DIR = unitTestDataPath() + "/zonalstatistics/" myTempPath = QDir.tempPath() + "/" testDir = QDir(TEST_DATA_DIR) for f in testDir.entryList(QDir.Files): QFile.remove(myTempPath + f) QFile.copy(TEST_DATA_DIR + f, myTempPath + f) myVector = QgsVectorLayer(myTempPath + "polys.shp", "poly", "ogr") myRaster = QgsRasterLayer(myTempPath + "edge_problem.asc", "raster", "gdal") zs = QgsZonalStatistics(myVector, myRaster, "", 1, QgsZonalStatistics.All) zs.calculateStatistics(None) feat = QgsFeature() # validate statistics for each feature request = QgsFeatureRequest().setFilterFid(0) feat = next(myVector.getFeatures(request)) myMessage = ('Expected: %f\nGot: %f\n' % (12.0, feat[1])) assert feat[1] == 12.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (8.0, feat[2])) assert feat[2] == 8.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.666666666666667, feat[3])) assert abs(feat[3] - 0.666666666666667) < 0.00001, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[4])) assert feat[4] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.47140452079103201, feat[5])) assert abs(feat[5] - 0.47140452079103201) < 0.00001, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.0, feat[6])) assert feat[6] == 0.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[7])) assert feat[7] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[8])) assert feat[8] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.0, feat[9])) assert feat[9] == 0.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[10])) assert feat[10] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (2.0, feat[11])) assert feat[11] == 2.0, myMessage request.setFilterFid(1) feat = next(myVector.getFeatures(request)) myMessage = ('Expected: %f\nGot: %f\n' % (9.0, feat[1])) assert feat[1] == 9.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (5.0, feat[2])) assert feat[2] == 5.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.555555555555556, feat[3])) assert abs(feat[3] - 0.555555555555556) < 0.00001, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[4])) assert feat[4] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.49690399499995302, feat[5])) assert abs(feat[5] - 0.49690399499995302) < 0.00001, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.0, feat[6])) assert feat[6] == 0.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[7])) assert feat[7] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[8])) assert feat[8] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.0, feat[9])) assert feat[9] == 0.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[10])) assert feat[10] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (2.0, feat[11])) assert feat[11] == 2.0, myMessage request.setFilterFid(2) feat = next(myVector.getFeatures(request)) myMessage = ('Expected: %f\nGot: %f\n' % (6.0, feat[1])) assert feat[1] == 6.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (5.0, feat[2])) assert feat[2] == 5.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.833333333333333, feat[3])) assert abs(feat[3] - 0.833333333333333) < 0.00001, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[4])) assert feat[4] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.372677996249965, feat[5])) assert abs(feat[5] - 0.372677996249965) < 0.00001, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.0, feat[6])) assert feat[6] == 0.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[7])) assert feat[7] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[8])) assert feat[8] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (0.0, feat[9])) assert feat[9] == 0.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (1.0, feat[10])) assert feat[10] == 1.0, myMessage myMessage = ('Expected: %f\nGot: %f\n' % (2.0, feat[11])) assert feat[11] == 2.0, myMessage
def signature_downloaded(filename): if not QFile.copy(filename, destination): self.show_error( 'Error writing to file [{0}]. Check that the file does not exist already.' .format(destination))
def loadTemplate(self, filePath): """ Loads a document template into the view and updates the necessary STDM-related composer items. """ if not QFile.exists(filePath): QMessageBox.critical( self.mainWindow(), QApplication.translate("OpenTemplateConfig", "Open Template Error"), QApplication.translate( "OpenTemplateConfig", "The specified template does not exist.")) return copy_file = filePath.replace('sdt', 'cpy') # remove existing copy file if QFile.exists(copy_file): copy_template = QFile(copy_file) copy_template.remove() orig_template_file = QFile(filePath) self.setDocumentFile(orig_template_file) # make a copy of the original result = orig_template_file.copy(copy_file) #templateFile = QFile(filePath) # work with copy templateFile = QFile(copy_file) self.copy_template_file = templateFile if not templateFile.open(QIODevice.ReadOnly): QMessageBox.critical( self.mainWindow(), QApplication.translate("ComposerWrapper", "Open Operation Error"), "{0}\n{1}".format( QApplication.translate("ComposerWrapper", "Cannot read template file."), templateFile.errorString())) return templateDoc = QDomDocument() if templateDoc.setContent(templateFile): table_config_collection = TableConfigurationCollection.create( templateDoc) ''' First load vector layers for the table definitions in the config collection before loading the composition from file. ''' load_table_layers(table_config_collection) self.clearWidgetMappings() #Load items into the composition and configure STDM data controls self.composition().loadFromTemplate(templateDoc) #Load data controls composerDS = ComposerDataSource.create(templateDoc) #Set title by appending template name title = QApplication.translate("STDMPlugin", "STDM Document Designer") composer_el = templateDoc.documentElement() if not composer_el is None: template_name = "" if composer_el.hasAttribute("title"): template_name = composer_el.attribute("title", "") elif composer_el.hasAttribute("_title"): template_name = composer_el.attribute("_title", "") if template_name: win_title = "{0} - {1}".format(title, template_name) self.mainWindow().setWindowTitle(template_name) self._configure_data_controls(composerDS) #Load symbol editors spatialFieldsConfig = SpatialFieldsConfiguration.create( templateDoc) self._configureSpatialSymbolEditor(spatialFieldsConfig) #Load photo editors photo_config_collection = PhotoConfigurationCollection.create( templateDoc) self._configure_photo_editors(photo_config_collection) # Load table editors self._configure_table_editors(table_config_collection) #Load chart property editors chart_config_collection = ChartConfigurationCollection.create( templateDoc) self._configure_chart_editors(chart_config_collection) # Load QR code property editors qrc_config_collection = QRCodeConfigurationCollection.create( templateDoc) self._configure_qr_code_editors(qrc_config_collection) self._sync_ids_with_uuids()
def accept(self): project_name = self.project_name_le.text() if project_name.endswith('.qgs'): project_name = project_name[:-4] if not project_name: QMessageBox.critical(self, self.tr("OQ-Consolidate: Error"), self.tr("Please specify the project name")) return outputDir = self.leOutputDir.text() if not outputDir: QMessageBox.critical( self, self.tr("OQ-Consolidate: Error"), self.tr("Please specify the output directory.")) return outputDir = os.path.join(outputDir, get_valid_filename(project_name)) # create main directory if not exists d = QDir(outputDir) if not d.exists(): if not d.mkpath("."): QMessageBox.critical( self, self.tr("OQ-Consolidate: Error"), self.tr("Can't create directory to store the project.")) return # create directory for layers if not exists if d.exists("layers"): res = QMessageBox.question( self, self.tr("Directory exists"), self.tr("Output directory already contains 'layers'" " subdirectory. Maybe this directory was used to" " consolidate another project. Continue?"), QMessageBox.Yes | QMessageBox.No) if res == QMessageBox.No: return else: if not d.mkdir("layers"): QMessageBox.critical( self, self.tr("OQ-Consolidate: Error"), self.tr("Can't create directory for layers.")) return # copy project file projectFile = QgsProject.instance().fileName() if projectFile: f = QFile(projectFile) newProjectFile = os.path.join(outputDir, '%s.qgs' % project_name) f.copy(newProjectFile) else: newProjectFile = os.path.join(outputDir, '%s.qgs' % project_name) f = QFileInfo(newProjectFile) p = QgsProject.instance() p.write(f) # start consolidate thread that does all real work self.workThread = consolidatethread.ConsolidateThread( self.iface, outputDir, newProjectFile, self.checkBoxZip.isChecked()) self.workThread.rangeChanged.connect(self.setProgressRange) self.workThread.updateProgress.connect(self.updateProgress) self.workThread.processFinished.connect(self.processFinished) self.workThread.processInterrupted.connect(self.processInterrupted) self.workThread.processError.connect(self.processError) self.workThread.exceptionOccurred.connect(self.exceptionOccurred) self.btnClose.setText(self.tr("Cancel")) self.btnOk.setEnabled(False) self.buttonBox.rejected.disconnect(self.reject) self.btnClose.clicked.connect(self.stopProcessing) self.workThread.start()
def accept(self): self.btnOk.setEnabled(False) self.btnCancel.setEnabled(False) project_name = self.project_name_le.text() if project_name.endswith('.qgs'): project_name = project_name[:-4] if not project_name: msg = tr("Please specify the project name") log_msg(msg, level='C', message_bar=iface.messageBar()) self.restoreGui() return outputDir = self.leOutputDir.text() if not outputDir: msg = tr("Please specify the output directory.") log_msg(msg, level='C', message_bar=iface.messageBar()) self.restoreGui() return outputDir = os.path.join(outputDir, get_valid_filename(project_name)) # create main directory if not exists d = QDir(outputDir) if not d.exists(): if not d.mkpath("."): msg = tr("Can't create directory to store the project.") log_msg(msg, level='C', message_bar=iface.messageBar()) self.restoreGui() return # create directory for layers if not exists if d.exists("layers"): res = QMessageBox.question( self, self.tr("Directory exists"), self.tr("Output directory already contains 'layers'" " subdirectory. Maybe this directory was used to" " consolidate another project. Continue?"), QMessageBox.Yes | QMessageBox.No) if res == QMessageBox.No: self.restoreGui() return else: if not d.mkdir("layers"): msg = tr("Can't create directory for layers.") log_msg(msg, level='C', message_bar=iface.messageBar()) self.restoreGui() return # copy project file projectFile = QgsProject.instance().fileName() try: if projectFile: f = QFile(projectFile) newProjectFile = os.path.join(outputDir, '%s.qgs' % project_name) f.copy(newProjectFile) else: newProjectFile = os.path.join(outputDir, '%s.qgs' % project_name) p = QgsProject.instance() p.write(newProjectFile) except Exception as exc: self.restoreGui() log_msg(str(exc), level='C', message_bar=iface.messageBar(), exception=exc) return # start consolidate task that does all real work self.consolidateTask = ConsolidateTask('Consolidation', QgsTask.CanCancel, outputDir, newProjectFile, self.checkBoxZip.isChecked(), self.cb.currentText()) self.consolidateTask.begun.connect(self.on_consolidation_begun) QgsApplication.taskManager().addTask(self.consolidateTask) super().accept()