[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