def writeVectors(writer, legendInterface=None, progress=None): settings = writer.settings baseExtent = settings.baseExtent progress = progress or dummyProgress renderer = QgsMapRenderer() layers = [] if legendInterface is None: for parentId in [ ObjectTreeItem.ITEM_POINT, ObjectTreeItem.ITEM_LINE, ObjectTreeItem.ITEM_POLYGON ]: for layerId, properties in settings.get(parentId, {}).iteritems(): if properties.get("visible", False): layers.append([layerId, properties]) else: # use vector layer order in legendInterface for layer in legendInterface.layers(): if layer.type() != QgsMapLayer.VectorLayer: continue parentId = ObjectTreeItem.parentIdByLayer(layer) properties = settings.get(parentId, {}).get(layer.id(), {}) if properties.get("visible", False): layers.append([layer.id(), properties]) finishedLayers = 0 for layerId, properties in layers: mapLayer = QgsMapLayerRegistry.instance().mapLayer(layerId) if mapLayer is None: continue prop = VectorPropertyReader(writer.objectTypeManager, mapLayer, properties) obj_mod = writer.objectTypeManager.module(prop.mod_index) if obj_mod is None: logMessage("Module not found") continue # prepare triangle mesh geom_type = mapLayer.geometryType() if geom_type == QGis.Polygon and prop.type_index == 1 and prop.isHeightRelativeToDEM( ): # Overlay progress(None, "Initializing triangle mesh for overlay polygons") writer.triangleMesh() progress( 30 + 30 * finishedLayers / len(layers), u"Writing vector layer ({0} of {1}): {2}".format( finishedLayers + 1, len(layers), mapLayer.name())) # write layer object layer = VectorLayer(writer, mapLayer, prop, obj_mod) writer.writeLayer(layer.layerObject(), layer.fieldNames) # initialize symbol rendering mapLayer.rendererV2().startRender( renderer.rendererContext(), mapLayer.pendingFields() if QGis.QGIS_VERSION_INT >= 20300 else mapLayer) # features to export request = QgsFeatureRequest() clipGeom = None if properties.get("radioButton_IntersectingFeatures", False): request.setFilterRect( layer.transform.transformBoundingBox( baseExtent.boundingBox(), QgsCoordinateTransform.ReverseTransform)) if properties.get("checkBox_Clip"): extent = baseExtent.clone().scale( 0.999999 ) # clip with slightly smaller extent than map canvas extent clipGeom = extent.geometry() for feat in layer.features(request, clipGeom): # write geometry obj_mod.write(writer, layer, feat) # writer.writeFeature(layer, feat, obj_mod) # stack attributes in writer if layer.writeAttrs: writer.addAttributes(feat.attributes()) # write attributes if layer.writeAttrs: writer.writeAttributes() # write materials writer.writeMaterials(layer.materialManager) mapLayer.rendererV2().stopRender(renderer.rendererContext()) finishedLayers += 1
def saveControlImage(self, tmpimg=''): # don't save control images for RenderVsOtherOutput (Vs) tests, since # those control images belong to a different test result if ('PAL_CONTROL_IMAGE' not in os.environ or 'Vs' in self._TestGroup): return imgpath = self.controlImagePath() # print "saveControlImage: {0}".format(imgpath) testdir = os.path.dirname(imgpath) if not os.path.exists(testdir): os.makedirs(testdir) imgbasepath = \ os.path.join(testdir, os.path.splitext(os.path.basename(imgpath))[0]) for f in glob.glob(imgbasepath + '.*'): if os.path.exists(f): os.remove(f) if tmpimg and os.path.exists(tmpimg): shutil.copyfile(tmpimg, imgpath) else: print '\nsaveControlImage.render(): entered' print '{0}.{1}'.format(self._TestGroup, self._TestFunction) ms = self._MapSettings # class settings """:type: QgsMapSettings""" if self._TestMapSettings is not None: ms = self._TestMapSettings # per test settings print 'self._MapSettings...' print 'ms.layers(): {0}'.format( [self._MapRegistry.mapLayer(i).name() for i in ms.layers()]) print 'ms.outputSize(): {0} x {1}'.format(ms.outputSize().width(), ms.outputSize().height()) print 'ms.outputDpi(): {0}'.format(ms.outputDpi()) print 'ms.mapUnits(): {0}'.format(ms.mapUnits()) print 'ms.extent(): {0}'.format(ms.extent().toString()) print 'ms.hasCrsTransformEnabled(): {0}'.format( ms.hasCrsTransformEnabled()) print 'ms.destinationCrs(): {0}'.format( ms.destinationCrs().authid()) # pal = QgsPalLabeling() pal = self._Pal.clone() # or custom settings are lost pal.init(ms) r = QgsMapRenderer() r.setLabelingEngine(pal) # this seems too redundant r.setOutputSize(ms.outputSize(), ms.outputDpi()) r.setMapUnits(ms.mapUnits()) r.setExtent(ms.extent()) r.setProjectionsEnabled(ms.hasCrsTransformEnabled()) r.setDestinationCrs(ms.destinationCrs()) r.setLayerSet(ms.layers()) ctx = r.rendererContext() ctx.setDrawEditingInformation( ms.testFlag(QgsMapSettings.DrawEditingInfo)) ctx.setForceVectorOutput( ms.testFlag(QgsMapSettings.ForceVectorOutput)) ctx.setUseAdvancedEffects( ms.testFlag(QgsMapSettings.UseAdvancedEffects)) image = QImage(ms.outputSize(), QImage.Format_ARGB32) image.fill(ms.backgroundColor().rgb()) image.setDotsPerMeterX(ms.outputDpi() / 25.4 * 1000) image.setDotsPerMeterY(ms.outputDpi() / 25.4 * 1000) p = QPainter(image) r.render(p) p.end() if not image.save(imgpath, 'png'): os.unlink(imgpath) # delete extraneous world file (always generated) # wrld_file = imgbasepath + '.PNGw' # if os.path.exists(wrld_file): # os.remove(wrld_file) if not os.path.exists(imgpath): raise OSError('Control image not created: {0}'.format(imgpath))
def writeVectors(writer, legendInterface=None, progress=None): settings = writer.settings baseExtent = settings.baseExtent progress = progress or dummyProgress renderer = QgsMapRenderer() layers = [] if legendInterface is None: for parentId in [ObjectTreeItem.ITEM_POINT, ObjectTreeItem.ITEM_LINE, ObjectTreeItem.ITEM_POLYGON]: for layerId, properties in settings.get(parentId, {}).iteritems(): if properties.get("visible", False): layers.append([layerId, properties]) else: # use vector layer order in legendInterface for layer in legendInterface.layers(): if layer.type() != QgsMapLayer.VectorLayer: continue parentId = ObjectTreeItem.parentIdByLayer(layer) properties = settings.get(parentId, {}).get(layer.id(), {}) if properties.get("visible", False): layers.append([layer.id(), properties]) finishedLayers = 0 for layerId, properties in layers: mapLayer = QgsMapLayerRegistry.instance().mapLayer(layerId) if mapLayer is None: continue prop = VectorPropertyReader(writer.objectTypeManager, mapLayer, properties) obj_mod = writer.objectTypeManager.module(prop.mod_index) if obj_mod is None: logMessage("Module not found") continue # prepare triangle mesh geom_type = mapLayer.geometryType() if geom_type == QGis.Polygon and prop.type_index == 1 and prop.isHeightRelativeToDEM(): # Overlay progress(None, "Initializing triangle mesh for overlay polygons") writer.triangleMesh() progress(30 + 30 * finishedLayers / len(layers), u"Writing vector layer ({0} of {1}): {2}".format(finishedLayers + 1, len(layers), mapLayer.name())) # write layer object layer = VectorLayer(writer, mapLayer, prop, obj_mod) writer.writeLayer(layer.layerObject(), layer.fieldNames) # initialize symbol rendering mapLayer.rendererV2().startRender(renderer.rendererContext(), mapLayer.pendingFields() if QGis.QGIS_VERSION_INT >= 20300 else mapLayer) # features to export request = QgsFeatureRequest() clipGeom = None if properties.get("radioButton_IntersectingFeatures", False): request.setFilterRect(layer.transform.transformBoundingBox(baseExtent.boundingBox(), QgsCoordinateTransform.ReverseTransform)) if properties.get("checkBox_Clip"): extent = baseExtent.clone().scale(0.999999) # clip with slightly smaller extent than map canvas extent clipGeom = extent.geometry() for feat in layer.features(request, clipGeom): # write geometry obj_mod.write(writer, layer, feat) # writer.writeFeature(layer, feat, obj_mod) # stack attributes in writer if layer.writeAttrs: writer.addAttributes(feat.attributes()) # write attributes if layer.writeAttrs: writer.writeAttributes() # write materials writer.writeMaterials(layer.materialManager) mapLayer.rendererV2().stopRender(renderer.rendererContext()) finishedLayers += 1
def saveControlImage(self, tmpimg=''): # don't save control images for RenderVsOtherOutput (Vs) tests, since # those control images belong to a different test result if ('PAL_CONTROL_IMAGE' not in os.environ or 'Vs' in self._TestGroup): return imgpath = self.controlImagePath() # print "saveControlImage: {0}".format(imgpath) testdir = os.path.dirname(imgpath) if not os.path.exists(testdir): os.makedirs(testdir) imgbasepath = \ os.path.join(testdir, os.path.splitext(os.path.basename(imgpath))[0]) for f in glob.glob(imgbasepath + '.*'): if os.path.exists(f): os.remove(f) if tmpimg and os.path.exists(tmpimg): shutil.copyfile(tmpimg, imgpath) else: print '\nsaveControlImage.render(): entered' print '{0}.{1}'.format(self._TestGroup, self._TestFunction) ms = self._MapSettings # class settings """:type: QgsMapSettings""" if self._TestMapSettings is not None: ms = self._TestMapSettings # per test settings print 'self._MapSettings...' print 'ms.layers(): {0}'.format( [self._MapRegistry.mapLayer(i).name() for i in ms.layers()] ) print 'ms.outputSize(): {0} x {1}'.format( ms.outputSize().width(), ms.outputSize().height()) print 'ms.outputDpi(): {0}'.format(ms.outputDpi()) print 'ms.mapUnits(): {0}'.format(ms.mapUnits()) print 'ms.extent(): {0}'.format(ms.extent().toString()) print 'ms.hasCrsTransformEnabled(): {0}'.format( ms.hasCrsTransformEnabled()) print 'ms.destinationCrs(): {0}'.format( ms.destinationCrs().authid()) # pal = QgsPalLabeling() pal = self._Pal.clone() # or custom settings are lost pal.init(ms) r = QgsMapRenderer() r.setLabelingEngine(pal) # this seems too redundant r.setOutputSize(ms.outputSize(), ms.outputDpi()) r.setMapUnits(ms.mapUnits()) r.setExtent(ms.extent()) r.setProjectionsEnabled(ms.hasCrsTransformEnabled()) r.setDestinationCrs(ms.destinationCrs()) r.setLayerSet(ms.layers()) ctx = r.rendererContext() ctx.setDrawEditingInformation( ms.testFlag(QgsMapSettings.DrawEditingInfo)) ctx.setForceVectorOutput( ms.testFlag(QgsMapSettings.ForceVectorOutput)) ctx.setUseAdvancedEffects( ms.testFlag(QgsMapSettings.UseAdvancedEffects)) image = QImage(ms.outputSize(), QImage.Format_ARGB32) image.fill(ms.backgroundColor().rgb()) image.setDotsPerMeterX(ms.outputDpi() / 25.4 * 1000) image.setDotsPerMeterY(ms.outputDpi() / 25.4 * 1000) p = QPainter(image) r.render(p) p.end() if not image.save(imgpath, 'png'): os.unlink(imgpath) # delete extraneous world file (always generated) # wrld_file = imgbasepath + '.PNGw' # if os.path.exists(wrld_file): # os.remove(wrld_file) if not os.path.exists(imgpath): raise OSError('Control image not created: {0}'.format(imgpath))