[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