def build_report(cli_arguments): """Produces pdf products. To be called after shapefile has been written into arguments.output_file. .. versionadded:: 3.2 :param cli_arguments: User inputs. :type cli_arguments: CommandLineArguments :raises: Exception """ try: LOGGER.info('Building a report') impact_layer = get_layer(cli_arguments.output_file, 'Impact Layer') hazard_layer = get_layer(cli_arguments.hazard, 'Hazard Layer') layer_registry = QgsMapLayerRegistry.instance() layer_registry.removeAllMapLayers() extra_layers = [hazard_layer] layer_registry.addMapLayer(impact_layer) layer_registry.addMapLayers(extra_layers) CANVAS.setExtent(impact_layer.extent()) CANVAS.refresh() report = ImpactReport(IFACE, cli_arguments.report_template, impact_layer, extra_layers=extra_layers) report.extent = CANVAS.fullExtent() LOGGER.debug(os.path.splitext(cli_arguments.output_file)[0] + '.pdf') map_path = report.print_map_to_pdf( os.path.splitext(cli_arguments.output_file)[0] + '.pdf') print "Impact Map : " + map_path table_path = report.print_impact_table( os.path.splitext(cli_arguments.output_file)[0] + '_table.pdf') print "Impact Summary Table : " + table_path layer_registry.removeAllMapLayers() except Exception as exception: print exception.message print exception.__doc__ raise RuntimeError
def build_report(cli_arguments): """Produces pdf products. To be called after shapefile has been written into arguments.output_file. .. versionadded:: 3.2 :param cli_arguments: User inputs. :type cli_arguments: CommandLineArguments :raises: Exception """ try: LOGGER.info('Building a report') impact_layer = get_layer(cli_arguments.output_file, 'Impact Layer') hazard_layer = get_layer(cli_arguments.hazard, 'Hazard Layer') layer_registry = QgsMapLayerRegistry.instance() layer_registry.removeAllMapLayers() extra_layers = [hazard_layer] layer_registry.addMapLayer(impact_layer) layer_registry.addMapLayers(extra_layers) CANVAS.setExtent(impact_layer.extent()) CANVAS.refresh() report = ImpactReport( IFACE, cli_arguments.report_template, impact_layer, extra_layers=extra_layers) report.extent = CANVAS.fullExtent() LOGGER.debug(os.path.splitext(cli_arguments.output_file)[0] + '.pdf') map_path = report.print_map_to_pdf( os.path.splitext(cli_arguments.output_file)[0] + '.pdf') print "Impact Map : " + map_path table_path = report.print_impact_table( os.path.splitext(cli_arguments.output_file)[0] + '_table.pdf') print "Impact Summary Table : " + table_path layer_registry.removeAllMapLayers() except Exception as exception: print exception.message print exception.__doc__ raise RuntimeError
def print_map(self, mode="pdf"): """Open impact report dialog that used to tune report when print map button pressed.""" # Check if selected layer is valid impact_layer = self.iface.activeLayer() if impact_layer is None: # noinspection PyCallByClass,PyTypeChecker QtGui.QMessageBox.warning( self.parent, self.tr('InaSAFE'), self.tr('Please select a valid impact layer before ' 'trying to print.')) return # Open Impact Report Dialog print_dialog = ImpactReportDialog(self.iface) print_dialog.button_ok = QtGui.QPushButton(self.tr('OK')) print_dialog.buttonBox.addButton( print_dialog.button_ok, QtGui.QDialogButtonBox.ActionRole) print_dialog.button_ok.clicked.connect(print_dialog.accept) print_dialog.button_save_pdf.hide() print_dialog.button_open_composer.hide() if not print_dialog.exec_() == QtGui.QDialog.Accepted: self.show_dynamic_message( self, m.Message( m.Heading(self.tr('Map Creator'), **WARNING_STYLE), m.Text(self.tr('Report generation cancelled!')))) return # Get the extent of the map for report use_full_extent = print_dialog.analysis_extent_radio.isChecked() if use_full_extent: map_crs = self.iface.mapCanvas().mapRenderer().destinationCrs() layer_crs = self.iface.activeLayer().crs() layer_extent = self.iface.activeLayer().extent() if map_crs != layer_crs: # noinspection PyCallingNonCallable transform = QgsCoordinateTransform(layer_crs, map_crs) layer_extent = transform.transformBoundingBox(layer_extent) area_extent = layer_extent else: area_extent = self.iface.mapCanvas().extent() # Get selected template path to use if print_dialog.default_template_radio.isChecked(): template_path = print_dialog.template_combo.itemData( print_dialog.template_combo.currentIndex()) else: template_path = print_dialog.template_path.text() if not os.path.exists(template_path): # noinspection PyCallByClass,PyTypeChecker QtGui.QMessageBox.warning( self.parent, self.tr('InaSAFE'), self.tr('Please select a valid template before printing. ' 'The template you choose does not exist.')) return # Open in PDF or Open in Composer Flag (not used, the button is hidden # by this class. The wizard has two its own buttons for Open In PDF # and Open In Composer buttons. Use variable 'mode' from param instead) create_pdf_flag = print_dialog.create_pdf # Instantiate and prepare Report self.show_dynamic_message( self, m.Message( m.Heading(self.tr('Map Creator'), **PROGRESS_UPDATE_STYLE), m.Text(self.tr('Preparing map and report')))) impact_report = ImpactReport(self.iface, template_path, impact_layer) impact_report.extent = area_extent # Get other setting settings = QSettings() logo_path = settings.value( 'inasafe/organisation_logo_path', '', type=str) impact_report.organisation_logo = logo_path disclaimer_text = settings.value( 'inasafe/reportDisclaimer', '', type=str) impact_report.disclaimer = disclaimer_text north_arrow_path = settings.value( 'inasafe/north_arrow_path', '', type=str) impact_report.north_arrow = north_arrow_path template_warning_verbose = bool(settings.value( 'inasafe/template_warning_verbose', True, type=bool)) # Check if there's missing elements needed in the template component_ids = ['safe-logo', 'north-arrow', 'organisation-logo', 'impact-map', 'impact-legend'] impact_report.component_ids = component_ids if template_warning_verbose and \ len(impact_report.missing_elements) != 0: title = self.tr('Template is missing some elements') question = self.tr( 'The composer template you are printing to is missing ' 'these elements: %s. Do you still want to continue') % ( ', '.join(impact_report.missing_elements)) # noinspection PyCallByClass,PyTypeChecker answer = QtGui.QMessageBox.question( self.parent, title, question, QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if answer == QtGui.QMessageBox.No: return create_pdf_flag = bool(mode == 'pdf') self.show_busy() if create_pdf_flag: self.print_map_to_pdf(impact_report) else: self.open_map_in_composer(impact_report) self.hide_busy()
def print_map(self, mode="pdf"): """Open impact report dialog that used to tune report when print map button pressed.""" # Check if selected layer is valid impact_layer = self.iface.activeLayer() if impact_layer is None: # noinspection PyCallByClass,PyTypeChecker QtGui.QMessageBox.warning( self.parent, self.tr('InaSAFE'), self.tr('Please select a valid impact layer before ' 'trying to print.')) return # Open Impact Report Dialog print_dialog = ImpactReportDialog(self.iface) print_dialog.button_ok = QtGui.QPushButton(self.tr('OK')) print_dialog.buttonBox.addButton(print_dialog.button_ok, QtGui.QDialogButtonBox.ActionRole) print_dialog.button_ok.clicked.connect(print_dialog.accept) print_dialog.button_save_pdf.hide() print_dialog.button_open_composer.hide() if not print_dialog.exec_() == QtGui.QDialog.Accepted: self.show_dynamic_message( self, m.Message(m.Heading(self.tr('Map Creator'), **WARNING_STYLE), m.Text(self.tr('Report generation cancelled!')))) return # Get the extent of the map for report use_full_extent = print_dialog.analysis_extent_radio.isChecked() if use_full_extent: map_crs = self.iface.mapCanvas().mapRenderer().destinationCrs() layer_crs = self.iface.activeLayer().crs() layer_extent = self.iface.activeLayer().extent() if map_crs != layer_crs: # noinspection PyCallingNonCallable transform = QgsCoordinateTransform(layer_crs, map_crs) layer_extent = transform.transformBoundingBox(layer_extent) area_extent = layer_extent else: area_extent = self.iface.mapCanvas().extent() # Get selected template path to use if print_dialog.default_template_radio.isChecked(): template_path = print_dialog.template_combo.itemData( print_dialog.template_combo.currentIndex()) else: template_path = print_dialog.template_path.text() if not os.path.exists(template_path): # noinspection PyCallByClass,PyTypeChecker QtGui.QMessageBox.warning( self.parent, self.tr('InaSAFE'), self.tr('Please select a valid template before printing. ' 'The template you choose does not exist.')) return # Open in PDF or Open in Composer Flag (not used, the button is hidden # by this class. The wizard has two its own buttons for Open In PDF # and Open In Composer buttons. Use variable 'mode' from param instead) create_pdf_flag = print_dialog.create_pdf # Instantiate and prepare Report self.show_dynamic_message( self, m.Message( m.Heading(self.tr('Map Creator'), **PROGRESS_UPDATE_STYLE), m.Text(self.tr('Preparing map and report')))) impact_report = ImpactReport(self.iface, template_path, impact_layer) impact_report.extent = area_extent # Get other setting settings = QSettings() logo_path = settings.value('inasafe/organisation_logo_path', '', type=str) impact_report.organisation_logo = logo_path disclaimer_text = settings.value('inasafe/reportDisclaimer', '', type=str) impact_report.disclaimer = disclaimer_text north_arrow_path = settings.value('inasafe/north_arrow_path', '', type=str) impact_report.north_arrow = north_arrow_path template_warning_verbose = bool( settings.value('inasafe/template_warning_verbose', True, type=bool)) # Check if there's missing elements needed in the template component_ids = [ 'safe-logo', 'north-arrow', 'organisation-logo', 'impact-map', 'impact-legend' ] impact_report.component_ids = component_ids if template_warning_verbose and \ len(impact_report.missing_elements) != 0: title = self.tr('Template is missing some elements') question = self.tr( 'The composer template you are printing to is missing ' 'these elements: %s. Do you still want to continue') % ( ', '.join(impact_report.missing_elements)) # noinspection PyCallByClass,PyTypeChecker answer = QtGui.QMessageBox.question( self.parent, title, question, QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if answer == QtGui.QMessageBox.No: return create_pdf_flag = bool(mode == 'pdf') self.show_busy() if create_pdf_flag: self.print_map_to_pdf(impact_report) else: self.open_map_in_composer(impact_report) self.hide_busy()