[QGIS Commit] r14838 - in trunk/qgis/src: core/symbology-ng gui/symbology-ng ui/symbollayer

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sat Dec 4 11:53:16 EST 2010


Author: wonder
Date: 2010-12-04 08:53:16 -0800 (Sat, 04 Dec 2010)
New Revision: 14838

Modified:
   trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.cpp
   trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.h
   trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp
   trunk/qgis/src/ui/symbollayer/widget_markerline.ui
Log:
[FEATURE] Option to put marker on the central point of a line


Modified: trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.cpp	2010-12-04 15:46:28 UTC (rev 14837)
+++ trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.cpp	2010-12-04 16:53:16 UTC (rev 14838)
@@ -245,6 +245,8 @@
       x->setPlacement( LastVertex );
     else if ( props["placement"] == "firstvertex" )
       x->setPlacement( FirstVertex );
+    else if ( props["placement"] == "centralpoint" )
+      x->setPlacement( CentralPoint );
     else
       x->setPlacement( Interval );
   return x;
@@ -288,6 +290,8 @@
   {
     if ( mPlacement == Interval )
       renderPolylineInterval( points, context );
+    else if ( mPlacement == CentralPoint )
+      renderPolylineCentral( points, context );
     else
       renderPolylineVertex( points, context );
   }
@@ -296,6 +300,8 @@
     QPolygonF points2 = ::offsetLine( points, context.outputLineWidth( mOffset ) );
     if ( mPlacement == Interval )
       renderPolylineInterval( points2, context );
+    else if ( mPlacement == CentralPoint )
+      renderPolylineCentral( points2, context );
     else
       renderPolylineVertex( points2, context );
   }
@@ -429,6 +435,52 @@
   mMarker->setAngle( origAngle );
 }
 
+void QgsMarkerLineSymbolLayerV2::renderPolylineCentral( const QPolygonF& points, QgsSymbolV2RenderContext& context )
+{
+  // calc length
+  qreal length = 0;
+  QPolygonF::const_iterator it = points.constBegin();
+  QPointF last = *it;
+  for ( ++it; it != points.constEnd(); ++it )
+  {
+    length += sqrt(( last.x() - it->x() ) * ( last.x() - it->x() ) +
+                   ( last.y() - it->y() ) * ( last.y() - it->y() ) );
+    last = *it;
+  }
+
+  // find the segment where the central point lies
+  it = points.constBegin();
+  last = *it;
+  qreal last_at = 0, next_at;
+  QPointF next;
+  int segment = 0;
+  for ( ++it; it != points.constEnd(); ++it )
+  {
+    next = *it;
+    next_at += sqrt(( last.x() - it->x() ) * ( last.x() - it->x() ) +
+                    ( last.y() - it->y() ) * ( last.y() - it->y() ) );
+    if ( next_at >= length / 2 )
+      break; // we have reached the center
+    last = *it;
+    last_at = next_at;
+    segment++;
+  }
+
+  // find out the central point on segment
+  MyLine l( last, next ); // for line angle
+  qreal k = ( length * 0.5 - last_at ) / ( next_at - last_at );
+  QPointF pt = last + ( next - last ) * k;
+
+  // draw the marker
+  double origAngle = mMarker->angle();
+  if ( mRotateMarker )
+    mMarker->setAngle( origAngle + l.angle() * 180 / M_PI );
+  mMarker->renderPoint( pt, context.renderContext(), -1, context.selected() );
+  if ( mRotateMarker )
+    mMarker->setAngle( origAngle );
+}
+
+
 QgsStringMap QgsMarkerLineSymbolLayerV2::properties() const
 {
   QgsStringMap map;
@@ -441,6 +493,8 @@
     map["placement"] = "lastvertex";
   else if ( mPlacement == FirstVertex )
     map["placement"] = "firstvertex";
+  else if ( mPlacement == CentralPoint )
+    map["placement"] = "centralpoint";
   else
     map["placement"] = "interval";
   return map;

Modified: trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.h	2010-12-04 15:46:28 UTC (rev 14837)
+++ trunk/qgis/src/core/symbology-ng/qgslinesymbollayerv2.h	2010-12-04 16:53:16 UTC (rev 14838)
@@ -90,7 +90,8 @@
       Interval,
       Vertex,
       LastVertex,
-      FirstVertex
+      FirstVertex,
+      CentralPoint
     };
 
     // static stuff
@@ -137,6 +138,7 @@
 
     void renderPolylineInterval( const QPolygonF& points, QgsSymbolV2RenderContext& context );
     void renderPolylineVertex( const QPolygonF& points, QgsSymbolV2RenderContext& context );
+    void renderPolylineCentral( const QPolygonF& points, QgsSymbolV2RenderContext& context );
 
     bool mRotateMarker;
     double mInterval;

Modified: trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp
===================================================================
--- trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp	2010-12-04 15:46:28 UTC (rev 14837)
+++ trunk/qgis/src/gui/symbology-ng/qgssymbollayerv2widget.cpp	2010-12-04 16:53:16 UTC (rev 14838)
@@ -363,6 +363,7 @@
   connect( radVertex, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
   connect( radVertexLast, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
   connect( radVertexFirst, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
+  connect( radCentralPoint, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
 }
 
 void QgsMarkerLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
@@ -383,6 +384,8 @@
     radVertex->setChecked( true );
   else if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::LastVertex )
     radVertexLast->setChecked( true );
+  else if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::CentralPoint )
+    radCentralPoint->setChecked( true );
   else
     radVertexFirst->setChecked( true );
   updateMarker();
@@ -440,8 +443,10 @@
     mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::Vertex );
   else if ( radVertexLast->isChecked() )
     mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::LastVertex );
+  else if ( radVertexFirst->isChecked() )
+    mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::FirstVertex );
   else
-    mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::FirstVertex );
+    mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::CentralPoint );
 
   emit changed();
 }

Modified: trunk/qgis/src/ui/symbollayer/widget_markerline.ui
===================================================================
--- trunk/qgis/src/ui/symbollayer/widget_markerline.ui	2010-12-04 15:46:28 UTC (rev 14837)
+++ trunk/qgis/src/ui/symbollayer/widget_markerline.ui	2010-12-04 16:53:16 UTC (rev 14838)
@@ -95,21 +95,21 @@
      </property>
     </widget>
    </item>
-   <item row="6" column="0" colspan="2">
+   <item row="8" column="0" colspan="2">
     <widget class="QCheckBox" name="chkRotateMarker">
      <property name="text">
       <string>Rotate marker</string>
      </property>
     </widget>
    </item>
-   <item row="7" column="0">
+   <item row="9" column="0">
     <widget class="QLabel" name="label_3">
      <property name="text">
       <string>Line offset</string>
      </property>
     </widget>
    </item>
-   <item row="7" column="1">
+   <item row="9" column="1">
     <widget class="QDoubleSpinBox" name="spinOffset">
      <property name="decimals">
       <number>2</number>
@@ -122,7 +122,7 @@
      </property>
     </widget>
    </item>
-   <item row="8" column="0" colspan="3">
+   <item row="10" column="0" colspan="3">
     <spacer>
      <property name="orientation">
       <enum>Qt::Vertical</enum>
@@ -135,6 +135,20 @@
      </property>
     </spacer>
    </item>
+   <item row="7" column="0" colspan="3">
+    <widget class="Line" name="line">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+   <item row="6" column="0">
+    <widget class="QRadioButton" name="radCentralPoint">
+     <property name="text">
+      <string>on central point</string>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
  <tabstops>
@@ -142,6 +156,9 @@
   <tabstop>radInterval</tabstop>
   <tabstop>spinInterval</tabstop>
   <tabstop>radVertex</tabstop>
+  <tabstop>radVertexLast</tabstop>
+  <tabstop>radVertexFirst</tabstop>
+  <tabstop>radCentralPoint</tabstop>
   <tabstop>chkRotateMarker</tabstop>
   <tabstop>spinOffset</tabstop>
  </tabstops>



More information about the QGIS-commit mailing list