def renderSchema(self, selectedLayers): templateFile = QFile(":/resources/schema-graphics.qpt") if not templateFile.open(QIODevice.ReadOnly | QIODevice.Text): QMessageBox.warning(self, self.tr("Template load error"), self.tr("Cannot read load composition template from file:\n%s") % (templateFile.errorString()) ) return False myTemplate = QDomDocument() success, errorString, errorLine, errorColumn = myTemplate.setContent(templateFile, True) if not success: QMessageBox.warning(self, self.tr("Template load error"), self.tr("Parse error at line %d, column %d:\n%s") % (errorLine, errorColumn, errorString) ) myTemplate = None templateFile.close() return False templateFile.close() # prepare composition renderer = QgsMapRenderer() layers = [] for layer in self.canvas.layers(): layers.append(unicode(layer.id())) # substitutions substitutions = {"title" : "QGIS"} if self.leTitle.text() != "": substitutions["title"] = self.leTitle.text() composition = QgsComposition(self.canvas.mapRenderer()) composition.loadFromTemplate(myTemplate, substitutions) ln = [] for k, v in selectedLayers.iteritems(): ln.append(utils.getVectorLayerById(v).name()) legend = composition.getComposerItemById("Legend0") legend.updateLegend() lm = legend.model() for r in xrange(lm.rowCount()): i = lm.item(r, 0) if i is not None and i.text() not in ln: lm.removeRow(i.index().row(), i.index().parent()) myMap = composition.getComposerMapById(0) myMap.setNewExtent(self.extent) if self.leScale.text() != "": myMap.setNewScale(float(self.leScale.text())) img = composition.printPageAsRaster(0) img.save(QDir.tempPath() + "/schema-test.png") return True
def createReport(self): if self.extent is None: QMessageBox.warning(self, self.tr("Empty AOI"), self.tr("Area of interest is not set. Please specify it and try again.") ) return settings = QSettings("NextGIS", "SimpleReports") lastDirectory = settings.value("lastReportDir", ".") fName = QFileDialog.getSaveFileName(self, self.tr("Save file"), lastDirectory, self.tr("OpenDocument Text (*.odt *.ODT)") ) if fName == "": return if not fName.lower().endswith(".odt"): fName += ".odt" templateFile = QFile(":/resources/schema-template.odt") if templateFile.open(QIODevice.ReadOnly): outFile = QFile(fName) if outFile.open(QIODevice.WriteOnly): outFile.write(templateFile.readAll()) outFile.close() templateFile.close() # get selected layers layerNames = dict() for i in xrange(self.lstLayers.topLevelItemCount()): item = self.lstLayers.topLevelItem(i) if item.checkState(0) == Qt.Checked: layerNames[item.text(0)] = item.data(0, Qt.UserRole) self.progressBar.setRange(0, len(layerNames) + 1) # generate map image if not self.renderSchema(layerNames): QMessageBox.warning(self, self.tr("Image not found"), self.tr("Cannot load schema map from temporary file") ) return self.progressBar.setValue(self.progressBar.value() + 1) QCoreApplication.processEvents() # open template writer = odftools.ODFWriter() writer.setFileName(unicode(fName)) writer.openFile() parser = odftools.ODFParser() parser.setContent(writer.readDocument()) parser.setManifest(writer.readManifest()) # add image writer.addPicture(QDir.tempPath() + "/schema-test.png", "schema.png") parser.addPictureToManifest("schema.png") parser.addPictureToDocument("@schema@", "schema.png", 35.297, 24.993) # find placeholder te = parser.getTextElement() tp = parser.findPlaceholder("@tables@") # create attribute table for each layer f = QgsFeature() for k, v in layerNames.iteritems(): layer = utils.getVectorLayerById(v) myAttrs = dict() attrNames = [] for i in xrange(len(layer.pendingAllAttributesList())): if layer.editType(i) != QgsVectorLayer.Hidden: myAttrs[i] = layer.attributeDisplayName(i) attrNames.append(layer.pendingFields()[i].name()) tableTitle = parser.addParagraph(k) table = parser.addTable(k, len(myAttrs)) # table header parser.addTableRow(table, myAttrs.values()) # table data request = QgsFeatureRequest() request.setFilterRect(self.canvas.mapRenderer().mapToLayerCoordinates(layer, self.extent)) request.setFlags(QgsFeatureRequest.NoGeometry) request.setSubsetOfAttributes(myAttrs.keys()) fit = layer.getFeatures(request) while fit.nextFeature(f): attrs = f.attributes() tmp = [] for i in myAttrs.keys(): tmp.append(attrs[i]) parser.addTableRow(table, tmp) # write table to file te.insertBefore(tableTitle, tp) te.insertBefore(table, tp) te.insertBefore(parser.addParagraph(""), tp) self.progressBar.setValue(self.progressBar.value() + 1) QCoreApplication.processEvents() # remove placeholder te.removeChild(tp) writer.writeManifest(parser.getManifest()) writer.writeDocument(parser.getContent()) writer.closeFile() self.progressBar.setRange(0, 1) self.progressBar.setValue(0) QMessageBox.information(self, self.tr("Completed"), self.tr("Report generated successfully") ) self.mapTool.reset()