Exemplo n.º 1
0
  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
Exemplo n.º 2
0
  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()