[QGIS Commit] r15041 - in trunk/qgis: python/core src/core/composer src/mapserver

svn_qgis at osgeo.org svn_qgis at osgeo.org
Fri Jan 14 05:23:16 EST 2011


Author: mhugent
Date: 2011-01-14 02:23:15 -0800 (Fri, 14 Jan 2011)
New Revision: 15041

Modified:
   trunk/qgis/python/core/qgscomposerlabel.sip
   trunk/qgis/src/core/composer/qgscomposerlabel.cpp
   trunk/qgis/src/core/composer/qgscomposerlabel.h
   trunk/qgis/src/mapserver/qgsconfigparser.cpp
   trunk/qgis/src/mapserver/qgsconfigparser.h
   trunk/qgis/src/mapserver/qgsprojectparser.cpp
   trunk/qgis/src/mapserver/qgsprojectparser.h
   trunk/qgis/src/mapserver/qgssldparser.cpp
   trunk/qgis/src/mapserver/qgssldparser.h
   trunk/qgis/src/mapserver/qgswmsserver.cpp
Log:
Add a label id to distinguish different composer labels. Allow label string replacement in GetPrint request of qgis server and return more verbose error messages

Modified: trunk/qgis/python/core/qgscomposerlabel.sip
===================================================================
--- trunk/qgis/python/core/qgscomposerlabel.sip	2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/python/core/qgscomposerlabel.sip	2011-01-14 10:23:15 UTC (rev 15041)
@@ -48,4 +48,7 @@
        * @param node is Dom node corresponding to 'ComposerLabel' tag
        */
     bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
+
+    /**Get label identification number*/
+    int id() const;
 };

Modified: trunk/qgis/src/core/composer/qgscomposerlabel.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlabel.cpp	2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/core/composer/qgscomposerlabel.cpp	2011-01-14 10:23:15 UTC (rev 15041)
@@ -25,6 +25,9 @@
 {
   //default font size is 10 point
   mFont.setPointSizeF( 10 );
+
+  //get new id
+  mId = maximumLabelId( composition ) + 1;
 }
 
 QgsComposerLabel::~QgsComposerLabel()
@@ -127,6 +130,7 @@
 
   composerLabelElem.setAttribute( "halign", mHAlignment );
   composerLabelElem.setAttribute( "valign", mVAlignment );
+  composerLabelElem.setAttribute( "id", mId );
 
 
   //font
@@ -168,6 +172,9 @@
   //Vertical alignment
   mVAlignment = ( Qt::AlignmentFlag )( itemElem.attribute( "valign" ).toInt() );
 
+  //id
+  mId = itemElem.attribute( "id", "0" ).toInt();
+
   //font
   QDomNodeList labelFontList = itemElem.elementsByTagName( "LabelFont" );
   if ( labelFontList.size() > 0 )
@@ -201,3 +208,27 @@
   emit itemChanged();
   return true;
 }
+
+int QgsComposerLabel::maximumLabelId( const QgsComposition* c ) const
+{
+  int id = -1;
+  if ( !c )
+  {
+    return id;
+  }
+
+  QList<QGraphicsItem *> itemList = c->items();
+  QList<QGraphicsItem *>::const_iterator itemIt = itemList.constBegin();
+  for ( ; itemIt != itemList.constEnd(); ++itemIt )
+  {
+    const QgsComposerLabel* label = dynamic_cast<const QgsComposerLabel *>( *itemIt );
+    if ( label )
+    {
+      if ( label->id() > id )
+      {
+        id = label->id();
+      }
+    }
+  }
+  return id;
+}

Modified: trunk/qgis/src/core/composer/qgscomposerlabel.h
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlabel.h	2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/core/composer/qgscomposerlabel.h	2011-01-14 10:23:15 UTC (rev 15041)
@@ -72,6 +72,9 @@
        */
     bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
 
+    /**Get label identification number*/
+    int id() const { return mId; }
+
   private:
     // Text
     QString mText;
@@ -91,8 +94,14 @@
     // Vertical Alignment
     Qt::AlignmentFlag mVAlignment;
 
+    // Label id (unique within the same composition)
+    int mId;
+
     /**Replaces replace '$CURRENT_DATE<(FORMAT)>' with the current date (e.g. $CURRENT_DATE(d 'June' yyyy)*/
     void replaceDateText( QString& text ) const;
+
+    /**Returns maximum id of all label items or -1 if no item is in the scene. Used to generate new ids in the constructor*/
+    int maximumLabelId( const QgsComposition* c ) const;
 };
 
 #endif

Modified: trunk/qgis/src/mapserver/qgsconfigparser.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgsconfigparser.cpp	2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgsconfigparser.cpp	2011-01-14 10:23:15 UTC (rev 15041)
@@ -17,6 +17,7 @@
 
 #include "qgsconfigparser.h"
 #include "qgsapplication.h"
+#include "qgscomposerlabel.h"
 #include "qgscomposermap.h"
 #include "qgscomposition.h"
 #include "qgsrasterlayer.h"
@@ -375,7 +376,25 @@
     }
   }
 
-  //replace composer label text
+  //replace label text
+  QList<QgsComposerLabel*>::const_iterator labelIt = composerLabels.constBegin();
+  QgsComposerLabel* currentLabel = 0;
 
+  for ( ; labelIt != composerLabels.constEnd(); ++labelIt )
+  {
+    currentLabel = *labelIt;
+    QMap< QString, QString >::const_iterator titleIt = parameterMap.find( "LABEL" + QString::number( currentLabel->id() ) );
+    if ( titleIt == parameterMap.constEnd() )
+    {
+      //remove label
+      c->removeItem( *labelIt );
+      delete( *labelIt );
+      continue;
+    }
+
+    currentLabel->setText( titleIt.value() );
+    currentLabel->adjustSizeToText();
+  }
+
   return c;
 }

Modified: trunk/qgis/src/mapserver/qgsconfigparser.h
===================================================================
--- trunk/qgis/src/mapserver/qgsconfigparser.h	2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgsconfigparser.h	2011-01-14 10:23:15 UTC (rev 15041)
@@ -96,7 +96,7 @@
     QgsComposition* createPrintComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, const QMap< QString, QString >& parameterMap ) const;
 
     /**Creates a composition from the project file (probably delegated to the fallback parser)*/
-    virtual QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const = 0;
+    virtual QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const = 0;
 
     /**Adds print capabilities to xml document. ParentElem usually is the <Capabilities> element*/
     virtual void printCapabilities( QDomElement& parentElement, QDomDocument& doc ) const = 0;

Modified: trunk/qgis/src/mapserver/qgsprojectparser.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgsprojectparser.cpp	2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgsprojectparser.cpp	2011-01-14 10:23:15 UTC (rev 15041)
@@ -19,6 +19,7 @@
 #include "qgsepsgcache.h"
 #include "qgsmslayercache.h"
 #include "qgsmapserverlogger.h"
+#include "qgsmapserviceexception.h"
 #include "qgsrasterlayer.h"
 #include "qgsvectorlayer.h"
 
@@ -32,6 +33,7 @@
 #include "qgscomposerscalebar.h"
 #include "qgscomposershape.h"
 
+
 QgsProjectParser::QgsProjectParser( QDomDocument* xmlDoc ): QgsConfigParser(), mXMLDoc( xmlDoc )
 {
   mOutputUnits = QgsMapRenderer::Millimeters;
@@ -824,13 +826,13 @@
   return legendLayerFileList.at( 0 ).toElement().attribute( "layerid" );
 }
 
-QgsComposition* QgsProjectParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const
+QgsComposition* QgsProjectParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const
 {
   //Create composition from xml
   QDomElement composerElem = composerByName( composerTemplate );
   if ( composerElem.isNull() )
   {
-    return 0;
+    throw QgsMapServiceException( "Error", "Composer template not found" );
   }
 
   QDomElement compositionElem = composerElem.firstChildElement( "Composition" );
@@ -957,6 +959,16 @@
       composerTemplateElem.appendChild( composerMapElem );
     }
 
+    //add available composer labels
+    QDomNodeList composerLabelList = currentComposerElem.elementsByTagName( "ComposerLabel" );
+    for ( int j = 0; j < composerLabelList.size(); ++j )
+    {
+      QDomElement clabel = composerLabelList.at( j ).toElement();
+      QDomElement composerLabelElem = doc.createElement( "ComposerLabel" );
+      composerLabelElem.setAttribute( "name", "label" + clabel.attribute( "id" ) );
+      composerTemplateElem.appendChild( composerLabelElem );
+    }
+
     parentElement.appendChild( composerTemplateElem );
   }
 }

Modified: trunk/qgis/src/mapserver/qgsprojectparser.h
===================================================================
--- trunk/qgis/src/mapserver/qgsprojectparser.h	2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgsprojectparser.h	2011-01-14 10:23:15 UTC (rev 15041)
@@ -88,7 +88,7 @@
     const QDomDocument* xmlDoc() const { return mXMLDoc; }
 
     /**Creates a composition from the project file (probably delegated to the fallback parser)*/
-    QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const;
+    QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const;
 
     /**Adds print capabilities to xml document. ParentElem usually is the <Capabilities> element*/
     void printCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;

Modified: trunk/qgis/src/mapserver/qgssldparser.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgssldparser.cpp	2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgssldparser.cpp	2011-01-14 10:23:15 UTC (rev 15041)
@@ -1539,7 +1539,7 @@
   }
 }
 
-QgsComposition* QgsSLDParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const
+QgsComposition* QgsSLDParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const
 {
   if ( mFallbackParser )
   {

Modified: trunk/qgis/src/mapserver/qgssldparser.h
===================================================================
--- trunk/qgis/src/mapserver/qgssldparser.h	2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgssldparser.h	2011-01-14 10:23:15 UTC (rev 15041)
@@ -69,7 +69,7 @@
     virtual void setParameterMap( const std::map<QString, QString>& parameterMap ) { mParameterMap = parameterMap; }
 
     /**Creates a composition from the project file (delegated to the fallback parser)*/
-    QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* > labelList ) const;
+    QgsComposition* initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const;
 
     /**Adds print capabilities to xml document. Delegated to fallback parser*/
     void printCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;

Modified: trunk/qgis/src/mapserver/qgswmsserver.cpp
===================================================================
--- trunk/qgis/src/mapserver/qgswmsserver.cpp	2011-01-14 10:17:32 UTC (rev 15040)
+++ trunk/qgis/src/mapserver/qgswmsserver.cpp	2011-01-14 10:23:15 UTC (rev 15041)
@@ -369,7 +369,7 @@
   std::map<QString, QString>::const_iterator templateIt = mParameterMap.find( "TEMPLATE" );
   if ( templateIt == mParameterMap.end() )
   {
-    return 0;
+    throw QgsMapServiceException( "ParameterMissing", "The TEMPLATE parameter is required for the GetPrint request" );
   }
 
   QgsComposition* c = mConfigParser->createPrintComposition( templateIt->second, mMapRenderer, QMap<QString, QString>( mParameterMap ) );
@@ -401,7 +401,7 @@
     c->render( &p, targetArea, sourceArea );
     p.end();
   }
-  else if ( formatString.compare( "png", Qt::CaseInsensitive ) == 0 )
+  else if ( formatString.compare( "png", Qt::CaseInsensitive ) == 0 || formatString.compare( "jpg", Qt::CaseInsensitive ) == 0 )
   {
     int width = ( int )( c->paperWidth() * c->printResolution() / 25.4 ); //width in pixel
     int height = ( int )( c->paperHeight() * c->printResolution() / 25.4 ); //height in pixel
@@ -417,7 +417,7 @@
     ba = new QByteArray();
     QBuffer buffer( ba );
     buffer.open( QIODevice::WriteOnly );
-    image.save( &buffer, "png", -1 );
+    image.save( &buffer, formatString.toLocal8Bit().data(), -1 );
   }
   else if ( formatString.compare( "pdf", Qt::CaseInsensitive ) == 0 )
   {
@@ -443,6 +443,10 @@
     ba = new QByteArray();
     *ba = tempFile.readAll();
   }
+  else //unknown format
+  {
+    throw QgsMapServiceException( "InvalidFormat", "Output format '" + formatString + "' is not supported in the GetPrint request" );
+  }
 
   delete c;
   return ba;



More information about the QGIS-commit mailing list