[QGIS Commit] r9716 -
branches/vector_overlay_branch/src/plugins/diagram_overlay
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Sat Nov 29 08:19:56 EST 2008
Author: mhugent
Date: 2008-11-29 08:19:56 -0500 (Sat, 29 Nov 2008)
New Revision: 9716
Modified:
branches/vector_overlay_branch/src/plugins/diagram_overlay/CMakeLists.txt
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.h
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactory.h
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramoverlay.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgspiediagramfactory.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactory.cpp
branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.cpp
Log:
Print diagrams in correct resolution
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/CMakeLists.txt
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/CMakeLists.txt 2008-11-29 09:42:35 UTC (rev 9715)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/CMakeLists.txt 2008-11-29 13:19:56 UTC (rev 9716)
@@ -4,6 +4,7 @@
SET (DIAGRAMOVERLAY_SRCS
qgsdiagramdialog.cpp
qgsdiagramcategory.cpp
+ qgsdiagramfactory.cpp
qgswkndiagramfactory.cpp
qgsbardiagramfactory.cpp
qgspiediagramfactory.cpp
@@ -52,4 +53,4 @@
INSTALL(TARGETS diagramoverlay
RUNTIME DESTINATION ${QGIS_PLUGIN_DIR}
- LIBRARY DESTINATION ${QGIS_PLUGIN_DIR})
\ No newline at end of file
+ LIBRARY DESTINATION ${QGIS_PLUGIN_DIR})
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.cpp 2008-11-29 09:42:35 UTC (rev 9715)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.cpp 2008-11-29 13:19:56 UTC (rev 9716)
@@ -16,10 +16,11 @@
***************************************************************************/
#include "qgsbardiagramfactory.h"
+#include "qgsrendercontext.h"
#include <limits>
#include <QPainter>
-QgsBarDiagramFactory::QgsBarDiagramFactory(): QgsWKNDiagramFactory(), mBarWidth(20)
+QgsBarDiagramFactory::QgsBarDiagramFactory(): QgsWKNDiagramFactory(), mBarWidth(5)
{
}
@@ -32,26 +33,28 @@
QImage* QgsBarDiagramFactory::createDiagram(int size, const QgsFeature& f, const QgsRenderContext& renderContext) const
{
QgsAttributeMap dataValues = f.attributeMap();
+ double sizeScaleFactor = diagramSizeScaleFactor(renderContext);
//for barcharts, the specified height is valid for the classification attribute
//the heights of the other bars are calculated with the same height/value ratio
//the bar widths are fixed (20 at the moment)
//int diagramWidth = barWidth * mAttributes.size();
- int h = getHeightBarChart(size, dataValues) + 2 * mMaximumPenWidth;
- int w = mBarWidth * mCategories.size() + 2 * mMaximumPenWidth;
+ int h = renderContext.rasterScaleFactor() * (getMaximumHeight(size, dataValues) * sizeScaleFactor + 2 * mMaximumPenWidth);
+ int w = renderContext.rasterScaleFactor() * (mBarWidth * sizeScaleFactor * mCategories.size() + 2 * mMaximumPenWidth);
+
//consider the gaps todo: take this information from method getDiagramDimensions()
QList<QgsDiagramCategory>::const_iterator c_it = mCategories.constBegin();
for(; c_it != mCategories.constEnd(); ++c_it)
{
- w += (2 * c_it->gap());
+ w += (2 * c_it->gap() * renderContext.rasterScaleFactor());
}
QImage* diagramImage = new QImage(QSize(w, h), QImage::Format_ARGB32_Premultiplied);
diagramImage->fill(0); //transparent background
//calculate value/pixel ratio
- double pixelValueRatio = pixelValueRatioBarChart(size, dataValues);
+ double sizeValueRatio = sizeValueRatioBarChart(size, dataValues);
//draw the bars itself
double currentValue;
@@ -73,11 +76,11 @@
currentWidth += category_it->gap(); //first gap
p.setPen(category_it->pen());
currentValue = att_it->toDouble();
- currentBarHeight = (int)(currentValue * pixelValueRatio);
+ currentBarHeight = (int)(currentValue * sizeValueRatio * sizeScaleFactor * renderContext.rasterScaleFactor());
p.setBrush(category_it->brush());
- p.drawRect(QRect(currentWidth, h - currentBarHeight + mMaximumPenWidth, mBarWidth, currentBarHeight));
- currentWidth += category_it->gap(); //second gap
- currentWidth += mBarWidth; //go for the next bar...
+ p.drawRect(QRect(currentWidth, h - currentBarHeight + mMaximumPenWidth, mBarWidth * sizeScaleFactor *renderContext.rasterScaleFactor(), currentBarHeight));
+ currentWidth += category_it->gap() * renderContext.rasterScaleFactor(); //second gap
+ currentWidth += mBarWidth * sizeScaleFactor *renderContext.rasterScaleFactor(); //go for the next bar...
}
}
@@ -86,8 +89,10 @@
int QgsBarDiagramFactory::getDiagramDimensions(int size, const QgsFeature& f, const QgsRenderContext& context, int& width, int& height) const
{
- height = getHeightBarChart(size, f.attributeMap()) + 2 * mMaximumPenWidth;
- width = mBarWidth * mCategories.size() + 2 * mMaximumPenWidth;
+ double sizeScaleFactor = diagramSizeScaleFactor(context);
+
+ height = context.rasterScaleFactor() * (getMaximumHeight(size, f.attributeMap()) * sizeScaleFactor + 2 * mMaximumPenWidth);
+ width = context.rasterScaleFactor() * (mBarWidth * sizeScaleFactor * mCategories.size() + 2 * mMaximumPenWidth);
//consider the gaps
QList<QgsDiagramCategory>::const_iterator c_it = mCategories.constBegin();
for(; c_it != mCategories.constEnd(); ++c_it)
@@ -97,10 +102,10 @@
return 0;
}
-int QgsBarDiagramFactory::getHeightBarChart(int size, const QgsAttributeMap& featureAttributes) const
+int QgsBarDiagramFactory::getMaximumHeight(int size, const QgsAttributeMap& featureAttributes) const
{
//calculate value/pixel ratio
- double pixelValueRatio = pixelValueRatioBarChart(size, featureAttributes);
+ double pixelValueRatio = sizeValueRatioBarChart(size, featureAttributes);
//find maximum attribute value
double maximumAttValue = -std::numeric_limits<double>::max();
@@ -127,7 +132,7 @@
return height;
}
-double QgsBarDiagramFactory::pixelValueRatioBarChart(int size, const QgsAttributeMap& featureAttributes) const
+double QgsBarDiagramFactory::sizeValueRatioBarChart(int size, const QgsAttributeMap& featureAttributes) const
{
//find value for scaling attribute
QList<int>::const_iterator scaling_it = mScalingAttributes.constBegin();
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.h 2008-11-29 09:42:35 UTC (rev 9715)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsbardiagramfactory.h 2008-11-29 13:19:56 UTC (rev 9716)
@@ -47,18 +47,18 @@
private:
- /**width of one bar (default 20 pixel)*/
+ /**width of one bar (default 5 mm)*/
int mBarWidth;
/**Calculates the maximum height of the bar chart (based on size for the
scaling attribute)*/
- int getHeightBarChart(int size, const QgsAttributeMap& featureAttributes) const;
+ int getMaximumHeight(int size, const QgsAttributeMap& featureAttributes) const;
- /**Calculates the value to pixel ratio for the bar chart (based on the size \
+ /**Calculates the value to size unit ratio for the bar chart (based on the size \
of the scaling attribute)
@return the ratio or -1 in case of error*/
- double pixelValueRatioBarChart(int size, const QgsAttributeMap& featureAttributes) const;
+ double sizeValueRatioBarChart(int size, const QgsAttributeMap& featureAttributes) const;
};
#endif
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactory.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactory.h 2008-11-29 09:42:35 UTC (rev 9715)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramfactory.h 2008-11-29 13:19:56 UTC (rev 9716)
@@ -46,6 +46,9 @@
MM,
MapUnits
};
+
+ QgsDiagramFactory();
+ virtual ~QgsDiagramFactory();
/**Creates the diagram image for a feature in order to be placed on the map
@param size diagram size (may be height, diameter, squaresize depending on diagram type
@@ -69,9 +72,12 @@
@param height out: the height of the diagram image in pixels*/
virtual int getDiagramDimensions(int size, const QgsFeature& f, const QgsRenderContext& context, int& width, int& height) const = 0;
virtual bool writeXML(QDomNode& overlay_node, QDomDocument& doc) const = 0;
- virtual ~QgsDiagramFactory(){}
+
+ /**Calculates the size multiplicator. Considers the size unit as well as the render context parameters*/
+ double diagramSizeScaleFactor(const QgsRenderContext& context) const;
+
/**Default is one dimensional scaling*/
- virtual QgsDiagramFactory::SizeType sizeType() const {return QgsDiagramFactory::HEIGHT;}
+ virtual QgsDiagramFactory::SizeType sizeType() const;
void setSizeUnit(SizeUnit u){mSizeUnit = u;}
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramoverlay.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramoverlay.cpp 2008-11-29 09:42:35 UTC (rev 9715)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgsdiagramoverlay.cpp 2008-11-29 13:19:56 UTC (rev 9716)
@@ -106,8 +106,10 @@
theProvider->select(mAttributes, context.extent());
QgsFeature currentFeature;
- QImage* currentDiagramImage = 0;
+ QImage* currentDiagramImage = 0;
+ QPainter* painter = context.painter();
+
while(theProvider->nextFeature(currentFeature))
{
//request diagram from renderer
@@ -132,9 +134,13 @@
context.mapToPixel().transform(&overlayPosition);
int shiftX = currentDiagramImage->width()/2;
int shiftY = currentDiagramImage->height()/2;
- if(context.painter())
+
+ if(painter)
{
- context.painter()->drawImage((int)overlayPosition.x()-shiftX, (int)overlayPosition.y()-shiftY, *currentDiagramImage);
+ painter->save();
+ painter->scale( 1.0 / context.rasterScaleFactor(), 1.0 / context.rasterScaleFactor() );
+ painter->drawImage((int)(overlayPosition.x() * context.rasterScaleFactor())-shiftX, (int)(overlayPosition.y() * context.rasterScaleFactor())-shiftY, *currentDiagramImage);
+ painter->restore();
}
}
}
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgspiediagramfactory.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgspiediagramfactory.cpp 2008-11-29 09:42:35 UTC (rev 9715)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgspiediagramfactory.cpp 2008-11-29 13:19:56 UTC (rev 9716)
@@ -16,6 +16,7 @@
***************************************************************************/
#include "qgspiediagramfactory.h"
+#include "qgsrendercontext.h"
QgsPieDiagramFactory::QgsPieDiagramFactory(): QgsWKNDiagramFactory()
{
@@ -30,9 +31,11 @@
QImage* QgsPieDiagramFactory::createDiagram(int size, const QgsFeature& f, const QgsRenderContext& renderContext) const
{
QgsAttributeMap dataValues = f.attributeMap();
+ double sizeScaleFactor = diagramSizeScaleFactor(renderContext);
//create transparent QImage
- QImage* diagramImage = new QImage(QSize(size + 2 * mMaximumPenWidth + 2 * mMaximumGap, size + 2 * mMaximumPenWidth + 2 * mMaximumGap), QImage::Format_ARGB32_Premultiplied);
+ int imageSideLength = size * sizeScaleFactor * renderContext.rasterScaleFactor() + 2 * mMaximumPenWidth + 2 * mMaximumGap;
+ QImage* diagramImage = new QImage(QSize(imageSideLength, imageSideLength), QImage::Format_ARGB32_Premultiplied);
diagramImage->fill(qRgba(0, 0, 0, 0)); //transparent background
QPainter p;
p.begin(diagramImage);
@@ -87,21 +90,7 @@
gapOffsetsForPieSlice(currentGap, totalAngle + currentAngle/2, xGapOffset, yGapOffset);
}
- //debug: print out all the parameters for debugging purposes
-#if 0
- qWarning("x:");
- qWarning(QString::number(mMaximumPenWidth + mMaximumGap + xGapOffset).toLocal8Bit().data());
- qWarning("y:");
- qWarning(QString::number(mMaximumPenWidth + mMaximumGap - yGapOffset).toLocal8Bit().data());
- qWarning("size: ");
- qWarning(QString::number(size).toLocal8Bit().data());
- qWarning("totalAngle: ");
- qWarning(QString::number(totalAngle).toLocal8Bit().data());
- qWarning("currentAngle: ");
- qWarning(QString::number(currentAngle).toLocal8Bit().data());
-#endif //0
-
- p.drawPie(mMaximumPenWidth + mMaximumGap + xGapOffset, mMaximumPenWidth + mMaximumGap - yGapOffset, size, size, totalAngle, currentAngle);
+ p.drawPie(mMaximumPenWidth * renderContext.rasterScaleFactor() + mMaximumGap + xGapOffset, mMaximumPenWidth * renderContext.rasterScaleFactor() + mMaximumGap - yGapOffset, sizeScaleFactor * renderContext.rasterScaleFactor() * size, sizeScaleFactor * renderContext.rasterScaleFactor() * size, totalAngle, currentAngle);
totalAngle += currentAngle;
}
p.end();
@@ -111,9 +100,10 @@
int QgsPieDiagramFactory::getDiagramDimensions(int size, const QgsFeature& f, const QgsRenderContext& context, int& width, int& height) const
{
- width = size + 2 * mMaximumPenWidth + 2 * mMaximumGap;
- height = size + 2 * mMaximumPenWidth + 2 * mMaximumGap;
- return 0;
+ double squareSide = size * diagramSizeScaleFactor(context) * context.rasterScaleFactor() + 2 * mMaximumPenWidth + 2 * mMaximumGap;
+ width = squareSide;
+ height = squareSide;
+ return 0;
}
int QgsPieDiagramFactory::gapOffsetsForPieSlice(int gap, int angle, int& xOffset, int& yOffset) const
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactory.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactory.cpp 2008-11-29 09:42:35 UTC (rev 9715)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgssvgdiagramfactory.cpp 2008-11-29 13:19:56 UTC (rev 9716)
@@ -16,6 +16,7 @@
***************************************************************************/
#include "qgssvgdiagramfactory.h"
+#include "qgsrendercontext.h"
#include <QImage>
#include <QPainter>
@@ -39,11 +40,11 @@
//size parameter applies to maximum of width, height
if(defaultSize.width() >= defaultSize.height())
{
- scaleFactor = ((double)size) / defaultSize.width();
+ scaleFactor = ((double)size * diagramSizeScaleFactor(renderContext) * renderContext.rasterScaleFactor()) / defaultSize.width();
}
else
{
- scaleFactor = ((double)size) / defaultSize.height();
+ scaleFactor = ((double)size * diagramSizeScaleFactor(renderContext) * renderContext.rasterScaleFactor()) / defaultSize.height();
}
imageWidth = (int)(defaultSize.width() * scaleFactor);
Modified: branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.cpp
===================================================================
--- branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.cpp 2008-11-29 09:42:35 UTC (rev 9715)
+++ branches/vector_overlay_branch/src/plugins/diagram_overlay/qgswkndiagramfactory.cpp 2008-11-29 13:19:56 UTC (rev 9716)
@@ -26,7 +26,7 @@
#include <QPainter>
#include <cmath>
-QgsWKNDiagramFactory::QgsWKNDiagramFactory(): mMaximumPenWidth(0),mMaximumGap(0)
+QgsWKNDiagramFactory::QgsWKNDiagramFactory(): QgsDiagramFactory(), mMaximumPenWidth(0),mMaximumGap(0)
{
}
More information about the QGIS-commit
mailing list