def s57_truncate(self, version=2, decimal_places=1): if len(self.s57_list) == 0: logger.warning('No selected S57 files to use for truncation') return if version not in [ 2, ] or not isinstance(version, int): logger.warning('Invalid version: %s' % version) return False if (decimal_places < 0) or not isinstance(decimal_places, int): logger.warning('Invalid version: %s' % version) return False opened_folders = list() for i, s57_file in enumerate(self.s57_list): start_time = time.time() self.progress.start(text="Data processing [%d/%d]" % (i + 1, len(self.grid_list))) self.clear_survey_label() survey_label = self.make_survey_label_from_path(s57_file) self.progress.update(value=20) # output naming output_name = str(os.path.basename(s57_file).split(".")[0]) + \ ".truncV" + str(version) + "d" + str(decimal_places) + ".000" if self.output_project_folder: output_folder = os.path.join(self.output_folder, survey_label) else: output_folder = self.output_folder if self.output_subfolders: output_path = os.path.join(output_folder, "s57_truncate", output_name) else: output_path = os.path.join(output_folder, output_name) output_folder = os.path.dirname(output_path) if not os.path.exists(output_folder): os.makedirs(output_folder) self.progress.update(text="S57 data loading", value=30) self.progress.update(text="S57 data truncating", value=40) success = self._ft.truncate(input_file=s57_file, output_file=output_path, decimal_places=decimal_places) self.progress.end() if (output_folder not in opened_folders) and success: Helper.explore_folder(output_folder) opened_folders.append(output_folder) logger.info("BAG truncate -> execution time: %.3f s" % (time.time() - start_time)) return True
def open_offline_manual(self) -> None: logger.debug("open offline manual") pdf_path = os.path.join(self._ai.app_media_path, "manual.pdf") if not os.path.exists(pdf_path): logger.warning("unable to find offline manual at %s" % pdf_path) return Helper.explore_folder(pdf_path)
def on_open_output_folder(self): output_folder = self.settings.value(app_info.key_raster_export_folder, self.lib.export_folder) if not os.path.exists(output_folder): logger.warning("unable to locate output folder: %s" % output_folder) return Helper.explore_folder(path=output_folder)
def grid_truncate(self, version=2, decimal_places=1): if not self.has_bag_grid(): logger.warning('No BAG files for truncation') return False if version not in [ 2, ] or not isinstance(version, int): logger.warning('Invalid version: %s' % version) return False if (decimal_places < 0) or not isinstance(decimal_places, int): logger.warning('Invalid version: %s' % version) return False opened_folders = list() for i, grid_file in enumerate(self.grid_list): self.progress.start(text="Data processing [%d/%d]" % (i + 1, len(self.grid_list))) self.clear_survey_label() survey_label = self.make_survey_label_from_path(grid_file) self.progress.update(value=20) # output naming output_name = str(os.path.basename(grid_file).split(".")[0]) + \ ".truncV" + str(version) + "d" + str(decimal_places) + ".bag" if self.output_project_folder: output_folder = os.path.join(self.output_folder, survey_label) else: output_folder = self.output_folder if self.output_subfolders: output_path = os.path.join(output_folder, "grid_truncate", output_name) else: output_path = os.path.join(output_folder, output_name) output_folder = os.path.dirname(output_path) if not os.path.exists(output_folder): os.makedirs(output_folder) self.progress.update(value=30) success = self._gr.truncate(input_file=grid_file, output_file=output_path, decimal_places=decimal_places) self.progress.end() if (output_folder not in opened_folders) and success: Helper.explore_folder(output_folder) opened_folders.append(output_folder) return True
def save_bug_report(self): logger.debug("save bug report") report = "".join(self.format_bug_report()) hint_name = "%s_%s_bug_%.0f" \ % (self._ai.app_name, self._ai.app_version.replace(".", "_"), datetime.utcnow().timestamp()) # noinspection PyCallByClass filename, _ = QtWidgets.QFileDialog.getSaveFileName( self, "Bug Report", hint_name, "Text files (*.txt)", "Text files (*.txt)") if filename: fd = open(filename, 'w') try: fd.write(report) fd.close() Helper.explore_folder(filename) except Exception as e: msg = 'Unable to save the bug report:\n%s' % str(e) # noinspection PyCallByClass,PyArgumentList QtWidgets.QMessageBox.warning(self, "Saving issue", msg)
def click_open_manual(cls) -> None: logger.debug("open manual") Helper.explore_folder( "https://www.hydroffice.org/manuals/openbst/user_manual_2_tool_product_clone.html" )
def click_open_manual(cls): logger.debug("open manual") Helper.explore_folder("https://www.hydroffice.org/manuals/qctools/stable/user_manual_survey_valsou_checks.html")
def click_open_manual_v2(cls): logger.debug("open manual") Helper.explore_folder( "https://www.hydroffice.org/manuals/qctools/user_manual_survey_scan_designated.html" )
len(bag_without_uncertainty_list), len(bag_done_list)) for bag_without_uncertainty in bag_without_uncertainty_list: report += " . %s\n" % bag_without_uncertainty report += "\n- crashes while processing: %d/%d\n" % (len(bag_crash_list), nr_bag_todo) for bag_crash in bag_crash_list: report += " . %s\n" % bag_crash logger.info("\n%s" % report) # save on disk a final report if write_report_on_disk: report_path = os.path.join(output_folder, "Uncertainty_Scan_Results.txt") try: # Trapping Exceptions like OSError (File permissions) with open(report_path, "w") as fod: fod.write(report) except Exception as e: logger.warning("issue in saving report on disk: %s (%s)" % (report_path, e)) # open the output folder if open_output_folder: Helper.explore_folder(output_folder) logger.debug("DONE!")
def _open_scan_output_folder(self): if self.file_scan_s57 or self.file_scan_pdf: Helper.explore_folder(self._scan_output_folder) else: logger.warning('unable to define the output folder to open')
def open_projects_folder(self) -> None: Helper.explore_folder(str(self.projects_folder()))
def load_noaa_ocs_gov(cls): url = 'https://www.nauticalcharts.noaa.gov/' Helper.explore_folder(url)
def grid_xyz(self, version: int = 2, geographic: bool = True, elevation: bool = False, truncate: bool = False, decimal_places: int = 0, epsg_code: Optional[int] = None, order: str = 'yxz'): if not self.has_bag_grid(): logger.warning('No BAG files for truncation') return False if version not in [ 2, ] or not isinstance(version, int): logger.warning('Invalid version: %s' % version) return False if not isinstance(geographic, bool): logger.warning('Invalid geographic parameter: %s' % geographic) return False logger.debug( "geographic: %s, elevation: %s, truncate: %s, decimal places: %s" % (geographic, elevation, truncate, decimal_places)) opened_folders = list() for i, grid_file in enumerate(self.grid_list): start_time = time.time() self.progress.start(text="Data processing [%d/%d]" % (i + 1, len(self.grid_list))) self.clear_survey_label() survey_label = self.make_survey_label_from_path(grid_file) self.progress.update(value=20) # output naming output_name = str(os.path.basename(grid_file).split(".") [0]) + ".V" + str(version) if elevation: output_name += ".elevation" else: output_name += ".depth" if truncate: output_name += ".trunc" + str(decimal_places) if geographic: output_name += ".wgs84" if epsg_code is not None: output_name += ".%d" % epsg_code output_name += ".%s" % order if self.output_project_folder: output_folder = os.path.join(self.output_folder, survey_label) else: output_folder = self.output_folder if self.output_subfolders: output_path = os.path.join(output_folder, "grid_xyz", output_name) else: output_path = os.path.join(output_folder, output_name) output_folder = os.path.dirname(output_path) if not os.path.exists(output_folder): os.makedirs(output_folder) self.progress.update(value=30) success = self._gr.xyz(input_file=grid_file, output_file=output_path, geographic=geographic, elevation=elevation, truncate=truncate, decimal_places=decimal_places, epsg_code=epsg_code, order=order) self.progress.end() if (output_folder not in opened_folders) and success: Helper.explore_folder(output_folder) opened_folders.append(output_folder) logger.info("BAG xyz -> execution time: %.3f s" % (time.time() - start_time)) return True
def open_online_manual(self) -> None: logger.debug("open online manual") Helper.explore_folder(self._ai.app_manual_url)
def on_export_profile_btn(self): logger.debug("export profile clicked") if len(self.selected_writers) == 0: msg = "Select output formats before data export!" # noinspection PyCallByClass QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) return # special case for Fugro ISS format custom_writer_instrument = None # special case: synthetic profile and NCEI for writer in self.selected_writers: if writer != 'ncei': continue if self.lib.ssp.l[0].meta.sensor_type == Dicts.sensor_types[ 'Synthetic']: msg = "Attempt to export a synthetic profile in NCEI format!" # noinspection PyCallByClass QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) return if self.lib.current_project == 'default': msg = "The 'default' project cannot be used for NCEI export.\n\n" \ "Rename the project in the Database tab!" if self.lib.setup.noaa_tools: msg += "\n\nRecommend in project_survey format, e.g. OPR-P999-RA-17_H12345" # noinspection PyCallByClass QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) return if self.lib.setup.noaa_tools and self.lib.not_noaa_project( self.lib.current_project): current_project, format_ok = self.lib.cb.ask_formatted_text( default=self.lib.noaa_project) if self.lib.not_noaa_project(current_project, format_ok): msg = "The project name cannot be used for NCEI export.\n\n" \ "Rename the project in the Database tab!\n\n" \ "Recommend \"project_survey\" format, e.g. OPR-P999-RA-17_H12345" # noinspection PyCallByClass QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) return if not self.lib.ssp.cur.meta.survey or \ not self.lib.ssp.cur.meta.vessel or \ not self.lib.ssp.cur.meta.institution: msg = "Survey, vessel, and institution metadata are mandatory for NCEI export.\n\n" \ "To fix the issue:\n" \ "- Load the profile (if not already loaded)\n" \ "- Set the missing values using the Metadata button on the Editor tool bar\n" # noinspection PyCallByClass QtWidgets.QMessageBox.warning(self, "Export warning", msg, QtWidgets.QMessageBox.Ok) return # special case for Fugro ISS format with NCEI format if self.lib.ssp.cur.meta.probe_type == Dicts.probe_types['ISS']: logger.info("special case: NCEI and ISS format") if custom_writer_instrument is None: msg = "Enter the instrument type and model \n(if you don't know, leave it blank):" instrument = self.lib.cb.ask_text("ISS for NCEI", msg) # if empty, we just use the sensor type if instrument is None or instrument == "": instrument = self.lib.ssp.cur.meta.sensor custom_writer_instrument = instrument settings = QtCore.QSettings() select_output_folder = self.selectFolder.isChecked() settings.setValue("select_output_folder", select_output_folder) output_folders = dict() # each writer may potentially have is own folder if select_output_folder: dlg = OutputFoldersDialog(main_win=self.main_win, lib=self.lib, writers=self.selected_writers, parent=self) dlg.exec_() output_folders = dlg.output_folders if len(output_folders) == 0: return # case where all the writers will write to the same folder if len(output_folders) == 0: for writer in self.selected_writers: output_folders[writer] = self.lib.outputs_folder settings.setValue("export_folder", self.lib.outputs_folder) logger.debug('output folder: %s' % self.lib.outputs_folder) # ask user for basename basenames = dict() # NCEI has special filename convention if (len(self.selected_writers) == 1) and (self.selected_writers[0] == 'ncei'): pass else: basename_msg = "Enter output basename (without extension):" while True: # noinspection PyCallByClass basename, ok = QtWidgets.QInputDialog.getText( self, "Output basename", basename_msg, text=self.lib.cur_basename) if not ok: return for writer in self.selected_writers: basenames[writer] = basename break # actually do the export self.progress.start() try: self.lib.export_data( data_paths=output_folders, data_files=basenames, data_formats=self.selected_writers, custom_writer_instrument=custom_writer_instrument) except RuntimeError as e: self.progress.end() msg = "Issue in exporting the data.\nReason: %s" % e # noinspection PyCallByClass QtWidgets.QMessageBox.critical(self, "Export error", msg, QtWidgets.QMessageBox.Ok) return # opening the output folder export_open_folder = self.openFolder.isChecked() settings.setValue("export_open_folder", export_open_folder) if export_open_folder: opened_folders = list() for output_folder in output_folders.values(): if output_folder not in opened_folders: Helper.explore_folder( output_folder) # open the output folder opened_folders.append(output_folder) self.progress.end() else: self.progress.end() msg = "Profile successfully exported!" # noinspection PyCallByClass QtWidgets.QMessageBox.information(self, "Export profile", msg, QtWidgets.QMessageBox.Ok) self.accept()
def open_project_folder(self) -> None: Helper.explore_folder(str(self.path))
from hyo2.abc.lib.helper import Helper from hyo2.qc.common import lib_info from hyo2.qc.common import default_logging from hyo2.qc.common import testing default_logging.load() Helper.explore_folder(Helper(lib_info=lib_info).package_folder()) Helper(lib_info=lib_info).explore_package_folder() print("- This file size: %s" % Helper.file_size(__file__)) print("- Info libs:\n%s" % Helper(lib_info=lib_info).package_info()) print("- Python path: %s" % Helper.python_path()) print("- QC2 package folder: %s" % Helper(lib_info=lib_info).package_folder()) print("- Testing output: %s" % testing.output_data_folder()) print("- Web URL: %s" % Helper(lib_info=lib_info).web_url(suffix="test"))
def click_open_manual(cls): logger.debug("open manual") Helper.explore_folder( "https://www.hydroffice.org/manuals/qctools/user_manual_survey_sbdare_export.html" )
def click_open_manual_v8(cls): logger.debug("open manual") Helper.explore_folder( "https://www.hydroffice.org/manuals/qctools/user_manual_survey_detect_fliers.html" )
def _open_triangle_output_folder(self): if self.file_triangle_s57: Helper.explore_folder(os.path.dirname(self.file_triangle_s57)) else: logger.warning('unable to define the output folder to open')
def click_open_manual_v3(cls): logger.debug("open manual") Helper.explore_folder( "https://www.hydroffice.org/manuals/qctools/user_manual_survey_submission_checks.html" )
def open_system_noaa_support_folder(cls): if cls.system_noaa_support_folder_present(): Helper.explore_folder(cls.system_noaa_support_folder()) return
def open_output_folder(self) -> None: if self.output_folder: Helper.explore_folder(str(self.output_folder)) else: logger.warning('unable to define the output folder to open')
def click_open_manual(cls): logger.debug("open manual") Helper.explore_folder( "https://www.hydroffice.org/manuals/abc/user_manual_info.html#noaa-s-57-support-files-for-caris" )
def load_ccom_unh_edu(cls): url = 'https://ccom.unh.edu' Helper.explore_folder(url)
def open_root_folder(self) -> None: Helper.explore_folder(str(self.root_folder()))
def open_local_noaa_support_folder(self): if self.local_noaa_support_folder_present(): Helper.explore_folder(self.local_noaa_support_folder()) return Helper(lib_info=self._li).explore_package_folder()
def load_unh_edu(cls): url = 'https://www.unh.edu' Helper.explore_folder(url)
def click_open_manual(cls): logger.debug("open manual") Helper.explore_folder( "https://www.hydroffice.org/manuals/qctools/user_manual_chart_grid_truncate.html" )
def load_ausseabed_gov_au(cls): url = 'http://www.ausseabed.gov.au/' Helper.explore_folder(url)