[QGIS Commit] r9676 - in branches/vector_overlay_branch/src: app core plugins

svn_qgis at osgeo.org svn_qgis at osgeo.org
Fri Nov 21 09:06:24 EST 2008


Author: mhugent
Date: 2008-11-21 09:06:24 -0500 (Fri, 21 Nov 2008)
New Revision: 9676

Added:
   branches/vector_overlay_branch/src/core/pal/
   branches/vector_overlay_branch/src/plugins/diagram_overlay/
Modified:
   branches/vector_overlay_branch/src/app/qgisapp.cpp
   branches/vector_overlay_branch/src/app/qgspluginregistry.cpp
   branches/vector_overlay_branch/src/app/qgspluginregistry.h
   branches/vector_overlay_branch/src/app/qgsvectorlayerproperties.cpp
   branches/vector_overlay_branch/src/app/qgsvectorlayerproperties.h
   branches/vector_overlay_branch/src/core/CMakeLists.txt
   branches/vector_overlay_branch/src/core/qgsgeometry.cpp
   branches/vector_overlay_branch/src/core/qgsgeometry.h
   branches/vector_overlay_branch/src/core/qgsmaprenderer.cpp
   branches/vector_overlay_branch/src/core/qgsmaprenderer.h
   branches/vector_overlay_branch/src/core/qgsrendercontext.h
   branches/vector_overlay_branch/src/core/qgsvectorlayer.cpp
   branches/vector_overlay_branch/src/core/qgsvectorlayer.h
   branches/vector_overlay_branch/src/plugins/CMakeLists.txt
   branches/vector_overlay_branch/src/plugins/qgisplugin.h
Log:
First try to port diagram branch to 1.0. Still crashes frequently

Modified: branches/vector_overlay_branch/src/app/qgisapp.cpp
===================================================================
--- branches/vector_overlay_branch/src/app/qgisapp.cpp	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/app/qgisapp.cpp	2008-11-21 14:06:24 UTC (rev 9676)
@@ -4261,6 +4261,7 @@
       switch ( pType() )
       {
         case QgisPlugin::RENDERER:
+        case QgisPlugin::VECTOR_OVERLAY:
         case QgisPlugin::UI:
         {
           // UI only -- doesn't use mapcanvas

Modified: branches/vector_overlay_branch/src/app/qgspluginregistry.cpp
===================================================================
--- branches/vector_overlay_branch/src/app/qgspluginregistry.cpp	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/app/qgspluginregistry.cpp	2008-11-21 14:06:24 UTC (rev 9676)
@@ -129,3 +129,14 @@
     }
   }
 }
+
+QList<QgsPluginMetadata*> QgsPluginRegistry::pluginData()
+{
+   QList<QgsPluginMetadata*> resultList;
+   QMap<QString, QgsPluginMetadata>::iterator it = mPlugins.begin();
+   for(; it != mPlugins.end(); ++it)
+   {
+      resultList.push_back(&(it.value()));
+   }
+   return resultList;
+}

Modified: branches/vector_overlay_branch/src/app/qgspluginregistry.h
===================================================================
--- branches/vector_overlay_branch/src/app/qgspluginregistry.h	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/app/qgspluginregistry.h	2008-11-21 14:06:24 UTC (rev 9676)
@@ -68,6 +68,9 @@
     
     //! Dump list of plugins
     void dump();
+
+    //! Returns metadata of all loaded plugins
+    QList<QgsPluginMetadata*> pluginData();
   
   protected:
     //! protected constructor

Modified: branches/vector_overlay_branch/src/app/qgsvectorlayerproperties.cpp
===================================================================
--- branches/vector_overlay_branch/src/app/qgsvectorlayerproperties.cpp	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/app/qgsvectorlayerproperties.cpp	2008-11-21 14:06:24 UTC (rev 9676)
@@ -22,6 +22,7 @@
 #include "qgisapp.h"
 #include "qgsapplication.h"
 #include "qgsattributeactiondialog.h"
+#include "qgsapplydialog.h"
 #include "qgscontexthelp.h"
 #include "qgscontinuouscolordialog.h"
 #include "qgscoordinatetransform.h"
@@ -30,6 +31,8 @@
 #include "qgslabel.h"
 #include "qgsgenericprojectionselector.h"
 #include "qgslogger.h"
+#include "qgspluginmetadata.h"
+#include "qgspluginregistry.h"
 #include "qgsproject.h"
 #include "qgssinglesymboldialog.h"
 #include "qgsuniquevaluedialog.h"
@@ -37,6 +40,7 @@
 #include "qgsvectorlayerproperties.h"
 #include "qgsconfig.h"
 #include "qgsvectordataprovider.h"
+#include "qgsvectoroverlayplugin.h"
 
 #ifdef HAVE_POSTGRESQL
 #include "qgspgquerybuilder.h"
@@ -134,6 +138,19 @@
 
   connect( sliderTransparency, SIGNAL( valueChanged( int ) ), this, SLOT( sliderTransparency_valueChanged( int ) ) );
 
+  //for each overlay plugin create a new tab
+  int position;
+  QList<QgsVectorOverlayPlugin*> overlayPluginList = overlayPlugins();
+  QList<QgsVectorOverlayPlugin*>::const_iterator it = overlayPluginList.constBegin();
+
+  for(; it != overlayPluginList.constEnd(); ++it)
+    {
+      QgsApplyDialog* d = (*it)->dialog(lyr);
+      position = tabWidget->addTab(d, (*it)->name());
+      tabWidget->setCurrentIndex(position); //ugly, but otherwise the properties dialog is a mess
+      mOverlayDialogs.push_back(d);
+    }
+
   tabWidget->setCurrentIndex( 0 );
 } // QgsVectorLayerProperties ctor
 
@@ -593,6 +610,12 @@
   }
   layer->setTransparency( static_cast < unsigned int >( 255 - sliderTransparency->value() ) );
 
+  //apply overlay dialogs
+  for(QList<QgsApplyDialog*>::iterator it = mOverlayDialogs.begin(); it != mOverlayDialogs.end(); ++it)
+    {
+      (*it)->apply();
+    }
+
   // update symbology
   emit refreshLegend( layer->getLayerID(), false );
 
@@ -1050,3 +1073,30 @@
     myQSettings.setValue( "style/lastStyleDir", myFileDialog->directory().absolutePath() );
   }
 }
+
+QList<QgsVectorOverlayPlugin*> QgsVectorLayerProperties::overlayPlugins() const
+{
+  QList<QgsVectorOverlayPlugin*> pluginList;
+
+  QgisPlugin* thePlugin = 0;
+  QgsVectorOverlayPlugin* theOverlayPlugin = 0;
+
+  QList<QgsPluginMetadata*> pluginData = QgsPluginRegistry::instance()->pluginData();
+  for(QList<QgsPluginMetadata*>::iterator it = pluginData.begin(); it != pluginData.end(); ++it)
+    {
+      if(*it)
+    {
+      thePlugin = (*it)->plugin();
+      if(thePlugin && thePlugin->type() == QgisPlugin::VECTOR_OVERLAY)
+        {
+          theOverlayPlugin = dynamic_cast<QgsVectorOverlayPlugin*>(thePlugin);
+          if(theOverlayPlugin)
+        {
+          pluginList.push_back(theOverlayPlugin);
+        }
+        }
+    }
+    }
+
+  return pluginList;
+}

Modified: branches/vector_overlay_branch/src/app/qgsvectorlayerproperties.h
===================================================================
--- branches/vector_overlay_branch/src/app/qgsvectorlayerproperties.h	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/app/qgsvectorlayerproperties.h	2008-11-21 14:06:24 UTC (rev 9676)
@@ -30,8 +30,10 @@
 class QgsMapLayer;
 
 class QgsAttributeActionDialog;
+class QgsApplyDialog;
 class QgsLabelDialog;
 class QgsVectorLayer;
+class QgsVectorOverlayPlugin;
 
 class QgsVectorLayerProperties : public QDialog, private Ui::QgsVectorLayerPropertiesBase
 {
@@ -120,10 +122,15 @@
     /**Actions dialog. If apply is pressed, the actions are stored for later use */
     QgsAttributeActionDialog* actionDialog;
 
+    QList<QgsApplyDialog*> mOverlayDialogs;
+
     void updateButtons();
     void loadRows();
     void setRow( int row, int idx, const QgsField &field );
 
+    /**Requests all overlay plugis from the plugin registry. Usefull for inserting their dialogs as new tabs*/
+    QList<QgsVectorOverlayPlugin*> overlayPlugins() const;
+
     /**Buffer pixmap which takes the picture of renderers before they are assigned to the vector layer*/
     //QPixmap bufferPixmap;
     static const int context_id = 94000531;

Modified: branches/vector_overlay_branch/src/core/CMakeLists.txt
===================================================================
--- branches/vector_overlay_branch/src/core/CMakeLists.txt	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/core/CMakeLists.txt	2008-11-21 14:06:24 UTC (rev 9676)
@@ -7,6 +7,7 @@
   qgis.cpp
   qgsapplication.cpp
   qgsattributeaction.cpp
+  qgscentralpointpositionmanager.cpp
   qgsclipper.cpp
   qgscontexthelp.cpp
   qgscoordinatetransform.cpp
@@ -26,6 +27,8 @@
   qgsmaprenderer.cpp
   qgsmaptopixel.cpp
   qgsmessageoutput.cpp
+  qgsoverlayobject.cpp
+  qgspalobjectpositionmanager.cpp
   qgspoint.cpp
   qgsproject.cpp
   qgsprojectfiletransform.cpp
@@ -47,6 +50,7 @@
   qgsvectordataprovider.cpp
   qgsvectorfilewriter.cpp
   qgsvectorlayer.cpp
+  qgsvectoroverlay.cpp
 
   composer/qgscomposeritem.cpp
   composer/qgscomposeritemgroup.cpp
@@ -63,6 +67,21 @@
   composer/qgsticksscalebarstyle.cpp
   composer/qgscomposition.cpp
 
+  pal/feature.cpp
+  pal/geomfunction.cpp
+  pal/label.cpp
+  pal/labelposition.cpp
+  pal/layer.cpp
+  pal/pal.cpp
+  pal/palstat.cpp
+  pal/pointset.cpp
+  pal/priorityqueue.cpp
+  pal/problem.cpp
+  pal/util.cpp
+  pal/linkedlist.hpp
+  pal/hashtable.hpp
+  pal/rtree.hpp
+
   raster/qgscliptominmaxenhancement.cpp
   raster/qgscolorrampshader.cpp
   raster/qgscontrastenhancement.cpp
@@ -140,6 +159,7 @@
 INCLUDE_DIRECTORIES(
   ${CMAKE_CURRENT_SOURCE_DIR} 
   composer
+  pal
   raster 
   renderer 
   symbology
@@ -162,6 +182,13 @@
   ENDIF (MSVC)
 ENDIF (WIN32)
 
+#for PAL classes
+IF (WIN32)
+    ADD_DEFINITIONS("-D_HAVE_WINDOWS_H_")
+ELSE (WIN32)
+    ADD_DEFINITIONS("-D_HAVE_PTHREAD_")
+ENDIF (WIN32)
+
 #############################################################
 # spatial indexing library
 

Modified: branches/vector_overlay_branch/src/core/qgsgeometry.cpp
===================================================================
--- branches/vector_overlay_branch/src/core/qgsgeometry.cpp	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/core/qgsgeometry.cpp	2008-11-21 14:06:24 UTC (rev 9676)
@@ -580,7 +580,19 @@
   return mGeometrySize;
 }
 
+GEOSGeometry* QgsGeometry::asGeos()
+{
+  if(mDirtyGeos)
+  {
+    if(!exportWkbToGeos())
+    {
+      return 0;
+    }
+  }
+  return mGeos;
+}
 
+
 QGis::WkbType QgsGeometry::wkbType()
 {
   unsigned char *geom = asWkb(); // ensure that wkb representation exists

Modified: branches/vector_overlay_branch/src/core/qgsgeometry.h
===================================================================
--- branches/vector_overlay_branch/src/core/qgsgeometry.h	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/core/qgsgeometry.h	2008-11-21 14:06:24 UTC (rev 9676)
@@ -118,6 +118,9 @@
     */
     size_t wkbSize();
 
+    /**Returns a geos geomtry. QgsGeometry keeps ownership, don't delete this object!*/
+    GEOSGeometry* asGeos();
+
     /** Returns type of wkb (point / linestring / polygon etc.) */
     QGis::WkbType wkbType();
 

Modified: branches/vector_overlay_branch/src/core/qgsmaprenderer.cpp
===================================================================
--- branches/vector_overlay_branch/src/core/qgsmaprenderer.cpp	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/core/qgsmaprenderer.cpp	2008-11-21 14:06:24 UTC (rev 9676)
@@ -25,8 +25,13 @@
 #include "qgsmaplayer.h"
 #include "qgsmaplayerregistry.h"
 #include "qgsdistancearea.h"
-//#include "qgscoordinatereferencesystem.h"
+#include "qgscentralpointpositionmanager.h"
+#include "qgsoverlayobjectpositionmanager.h"
+//#include "qgspalobjectpositionmanager.h"
+#include "qgsvectorlayer.h"
+#include "qgsvectoroverlay.h"
 
+
 #include <QDomDocument>
 #include <QDomNode>
 #include <QPainter>
@@ -52,6 +57,9 @@
   mDestCRS = new QgsCoordinateReferenceSystem( GEO_EPSG_CRS_ID, QgsCoordinateReferenceSystem::EpsgCrsId ); //WGS 84
 
   mOutputUnits = QgsMapRenderer::Millimeters;
+
+  //mOverlayPos = new QgsPALObjectPositionManager();
+  mOverlayPos = new QgsCentralPointPositionManager();
 }
 
 QgsMapRenderer::~QgsMapRenderer()
@@ -59,6 +67,7 @@
   delete mScaleCalculator;
   delete mDistArea;
   delete mDestCRS;
+  delete mOverlayPos;
 }
 
 
@@ -128,6 +137,12 @@
   return mSize;
 }
 
+ void QgsMapRenderer::setOverlayManager(QgsOverlayObjectPositionManager* m)
+ {
+   delete mOverlayPos;
+   mOverlayPos = m;
+ }
+
 void QgsMapRenderer::adjustExtentToSize()
 {
   int myHeight = mSize.height();
@@ -249,6 +264,16 @@
   mRenderContext.setScaleFactor( scaleFactor );
   mRenderContext.setRasterScaleFactor( rasterScaleFactor );
 
+  bool placeOverlays = false;
+  QList<QgsVectorOverlay*> allOverlayList; //list of all overlays, used to draw them after layers have been rendered
+  if(mOverlayPos)
+  {
+    placeOverlays = true;
+  }
+
+  //add map scale to render context
+  mRenderContext.setScaleDenominator(mScale);
+
   // render all layers in the stack, starting at the base
   QListIterator<QString> li( mLayerSet );
   li.toBack();
@@ -338,6 +363,26 @@
         mRenderContext.painter()->scale( 1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor );
       }
 
+      //create overlay objects for features within the view extent
+      if(ml->type() == QgsMapLayer::VectorLayer && mOverlayPos)
+      {
+        QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>(ml);
+        if(vl)
+          {
+            QList<QgsVectorOverlay*> thisLayerOverlayList;
+            vl->vectorOverlays(thisLayerOverlayList);
+
+            QList<QgsVectorOverlay*>::iterator overlayIt = thisLayerOverlayList.begin();
+            for(; overlayIt != thisLayerOverlayList.end(); ++overlayIt)
+            {
+              (*overlayIt)->createOverlayObjects(mRenderContext.extent());
+              allOverlayList.push_back(*overlayIt);
+            }
+
+	    mOverlayPos->addLayer(vl, thisLayerOverlayList);
+          }
+      }
+
       if ( !ml->draw( mRenderContext ) )
       {
         emit drawError( ml );
@@ -420,6 +465,18 @@
     }
   } // if (!mOverview)
 
+  //find overlay positions and draw the vector overlays
+  if(mOverlayPos)
+  {
+    mOverlayPos->findObjectPositions(mRenderContext);
+    //draw all the overlays
+    QList<QgsVectorOverlay*>::iterator allOverlayIt = allOverlayList.begin();
+    for(; allOverlayIt != allOverlayList.end(); ++allOverlayIt)
+    {
+      (*allOverlayIt)->drawOverlayObjects(mRenderContext);
+    }
+  }
+
   // make sure progress bar arrives at 100%!
   emit drawingProgress( 1, 1 );
 

Modified: branches/vector_overlay_branch/src/core/qgsmaprenderer.h
===================================================================
--- branches/vector_overlay_branch/src/core/qgsmaprenderer.h	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/core/qgsmaprenderer.h	2008-11-21 14:06:24 UTC (rev 9676)
@@ -33,6 +33,7 @@
 class QgsScaleCalculator;
 class QgsCoordinateReferenceSystem;
 class QgsDistanceArea;
+class QgsOverlayObjectPositionManager;
 
 /** \ingroup core
  * A non GUI class for rendering a map layer set onto a QPainter.
@@ -133,6 +134,9 @@
     //! change current layer set
     void setLayerSet( const QStringList& layers );
 
+    //! Set object containing overlay placement. Takes ownership of the passed object.
+    void setOverlayManager(QgsOverlayObjectPositionManager* m);
+
     //! updates extent of the layer set
     void updateFullExtent();
 
@@ -220,6 +224,9 @@
 
     //!Output units
     OutputUnits mOutputUnits;
+
+    //!Arrangement of labels and diagrams
+    QgsOverlayObjectPositionManager* mOverlayPos;
 };
 
 #endif

Modified: branches/vector_overlay_branch/src/core/qgsrendercontext.h
===================================================================
--- branches/vector_overlay_branch/src/core/qgsrendercontext.h	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/core/qgsrendercontext.h	2008-11-21 14:06:24 UTC (rev 9676)
@@ -56,6 +56,8 @@
 
     bool drawEditingInformation() const {return mDrawEditingInformation;}
 
+    double scaleDenominator() const {return mScaleDenominator;}
+
     //setters
 
     /**Sets coordinate transformation. QgsRenderContext takes ownership and deletes if necessary*/
@@ -67,6 +69,7 @@
     void setScaleFactor( double factor ) {mScaleFactor = factor;}
     void setRasterScaleFactor( double factor ) {mRasterScaleFactor = factor;}
     void setPainter( QPainter* p ) {mPainter = p;}
+    void setScaleDenominator(double denom){mScaleDenominator = denom;}
 
   private:
 
@@ -94,6 +97,9 @@
 
     /**Factor to scale rasters*/
     double mRasterScaleFactor;
+
+    /**Map scale*/
+    double mScaleDenominator;
 };
 
 #endif

Modified: branches/vector_overlay_branch/src/core/qgsvectorlayer.cpp
===================================================================
--- branches/vector_overlay_branch/src/core/qgsvectorlayer.cpp	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/core/qgsvectorlayer.cpp	2008-11-21 14:06:24 UTC (rev 9676)
@@ -67,6 +67,7 @@
 #include "qgssinglesymbolrenderer.h"
 #include "qgscoordinatereferencesystem.h"
 #include "qgsvectordataprovider.h"
+#include "qgsvectoroverlay.h"
 #include "qgslogger.h"
 
 #ifdef Q_WS_X11
@@ -3533,3 +3534,37 @@
 
   return mRanges[ fields[idx].name()];
 }
+
+void QgsVectorLayer::addOverlay(QgsVectorOverlay* overlay)
+{
+    mOverlays.push_back(overlay);
+}
+
+void QgsVectorLayer::removeOverlay(const QString& typeName)
+{
+   for(int i = mOverlays.size() - 1; i >=0; --i)
+    {
+      if(mOverlays.at(i)->typeName() == typeName)
+      {
+        mOverlays.removeAt(i);
+      }
+    }
+}
+
+void QgsVectorLayer::vectorOverlays(QList<QgsVectorOverlay*>& overlayList)
+{
+    overlayList = mOverlays;
+}
+
+QgsVectorOverlay* QgsVectorLayer::findOverlayByType(const QString& typeName)
+{
+  QList<QgsVectorOverlay*>::iterator it = mOverlays.begin();
+  for(; it != mOverlays.end(); ++it)
+  {
+    if( (*it)->typeName() == typeName)
+    {
+      return *it;
+    }
+  }
+  return 0; //not found
+}

Modified: branches/vector_overlay_branch/src/core/qgsvectorlayer.h
===================================================================
--- branches/vector_overlay_branch/src/core/qgsvectorlayer.h	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/core/qgsvectorlayer.h	2008-11-21 14:06:24 UTC (rev 9676)
@@ -43,6 +43,7 @@
 class QgsRect;
 class QgsRenderer;
 class QgsVectorDataProvider;
+class QgsVectorOverlay;
 
 class QgsGeometry;
 class QgsRect;
@@ -421,6 +422,18 @@
     /**access range */
     RangeData &range( int idx );
 
+    /**Adds a new overlay to this class. QgsVectorLayer takes ownership of the object*/
+    void addOverlay(QgsVectorOverlay* overlay);
+
+    /**Removes all overlays of a given type*/
+    void removeOverlay(const QString& typeName);
+
+    /**Returns pointers to the overlays of this layer*/
+    void vectorOverlays(QList<QgsVectorOverlay*>& overlayList);
+
+    /**Returns the (first) overlay of a type, e.g. diagram or label*/
+    QgsVectorOverlay* findOverlayByType(const QString& typeName);
+
   public slots:
     /** Select feature by its ID, optionally emit signal selectionChanged() */
     void select( int featureId, bool emitSignal = TRUE );
@@ -616,6 +629,9 @@
     /** Display labels */
     bool mLabelOn;
 
+    /**List of overlays. Vector overlays will be rendered on top of all maplayers*/
+    QList<QgsVectorOverlay*> mOverlays;
+
     QStringList mCommitErrors;
 
     QMap< QString, EditType > mEditTypes;

Modified: branches/vector_overlay_branch/src/plugins/CMakeLists.txt
===================================================================
--- branches/vector_overlay_branch/src/plugins/CMakeLists.txt	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/plugins/CMakeLists.txt	2008-11-21 14:06:24 UTC (rev 9676)
@@ -24,3 +24,5 @@
 SUBDIRS (coordinate_capture dxf2shp_converter) 
 
 SUBDIRS (ogr_converter)
+
+SUBDIRS (diagram_overlay)

Modified: branches/vector_overlay_branch/src/plugins/qgisplugin.h
===================================================================
--- branches/vector_overlay_branch/src/plugins/qgisplugin.h	2008-11-20 22:19:42 UTC (rev 9675)
+++ branches/vector_overlay_branch/src/plugins/qgisplugin.h	2008-11-21 14:06:24 UTC (rev 9676)
@@ -65,7 +65,8 @@
     {
       UI = 1,                     /* user interface plug-in */
       MAPLAYER,                    /* map layer plug-in */
-      RENDERER                     /*a plugin for a new renderer class*/
+      RENDERER,                     /*a plugin for a new renderer class*/
+      VECTOR_OVERLAY
     };
 
 



More information about the QGIS-commit mailing list