Skip to content

Commit

Permalink
[FEATURE] Option to put marker only on first/last vertex of a line (#…
Browse files Browse the repository at this point in the history
…3279) - contributed by Cedric Moeri - thanks!

git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@14836 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
wonder committed Dec 4, 2010
1 parent 43ef953 commit 5c8fa08
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 113 deletions.
1 change: 1 addition & 0 deletions CONTRIBUTORS
Expand Up @@ -13,6 +13,7 @@ Brent Wood
Brook Milligan Brook Milligan
Carl Anderson Carl Anderson
Carlos Dávila Carlos Dávila
Cédric Möri
Christian Ferreira Christian Ferreira
Diego Moreira Diego Moreira
Duarte Carreira Duarte Carreira
Expand Down
51 changes: 41 additions & 10 deletions src/core/symbology-ng/qgslinesymbollayerv2.cpp
Expand Up @@ -239,7 +239,14 @@ QgsSymbolLayerV2* QgsMarkerLineSymbolLayerV2::create( const QgsStringMap& props
if ( props.contains( "offset" ) ) if ( props.contains( "offset" ) )
x->setOffset( props["offset"].toDouble() ); x->setOffset( props["offset"].toDouble() );
if ( props.contains( "placement" ) ) if ( props.contains( "placement" ) )
x->setPlacement( props["placement"] == "vertex" ? Vertex : Interval ); if ( props["placement"] == "vertex" )
x->setPlacement( Vertex );
else if ( props["placement"] == "lastvertex" )
x->setPlacement( LastVertex );
else if ( props["placement"] == "firstvertex" )
x->setPlacement( FirstVertex );
else
x->setPlacement( Interval );
return x; return x;
} }


Expand Down Expand Up @@ -279,18 +286,18 @@ void QgsMarkerLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym
{ {
if ( mOffset == 0 ) if ( mOffset == 0 )
{ {
if ( mPlacement == Vertex ) if ( mPlacement == Interval )
renderPolylineVertex( points, context );
else
renderPolylineInterval( points, context ); renderPolylineInterval( points, context );
else
renderPolylineVertex( points, context );
} }
else else
{ {
QPolygonF points2 = ::offsetLine( points, context.outputLineWidth( mOffset ) ); QPolygonF points2 = ::offsetLine( points, context.outputLineWidth( mOffset ) );
if ( mPlacement == Vertex ) if ( mPlacement == Interval )
renderPolylineVertex( points2, context );
else
renderPolylineInterval( points2, context ); renderPolylineInterval( points2, context );
else
renderPolylineVertex( points2, context );
} }
} }


Expand Down Expand Up @@ -360,8 +367,25 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineVertex( const QPolygonF& points,


double origAngle = mMarker->angle(); double origAngle = mMarker->angle();
double angle; double angle;
int i, maxCount;


for ( int i = 0; i < points.count(); ++i ) if ( mPlacement == FirstVertex )
{
i = 0;
maxCount = 1;
}
else if ( mPlacement == LastVertex )
{
i = points.count() - 1;
maxCount = points.count();
}
else
{
i = 0;
maxCount = points.count();
}

for ( ; i < maxCount; ++i )
{ {
const QPointF& pt = points[i]; const QPointF& pt = points[i];


Expand Down Expand Up @@ -395,7 +419,7 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineVertex( const QPolygonF& points,
double unitX = cos( a1 ) + cos( a2 ), unitY = sin( a1 ) + sin( a2 ); double unitX = cos( a1 ) + cos( a2 ), unitY = sin( a1 ) + sin( a2 );
angle = atan2( unitY, unitX ); angle = atan2( unitY, unitX );
} }
mMarker->setAngle( angle * 180 / M_PI ); mMarker->setAngle( origAngle + angle * 180 / M_PI );
} }


mMarker->renderPoint( points.at( i ), rc, -1, context.selected() ); mMarker->renderPoint( points.at( i ), rc, -1, context.selected() );
Expand All @@ -411,7 +435,14 @@ QgsStringMap QgsMarkerLineSymbolLayerV2::properties() const
map["rotate"] = ( mRotateMarker ? "1" : "0" ); map["rotate"] = ( mRotateMarker ? "1" : "0" );
map["interval"] = QString::number( mInterval ); map["interval"] = QString::number( mInterval );
map["offset"] = QString::number( mOffset ); map["offset"] = QString::number( mOffset );
map["placement"] = ( mPlacement == Vertex ? "vertex" : "interval" ); if ( mPlacement == Vertex )
map["placement"] = "vertex";
else if ( mPlacement == LastVertex )
map["placement"] = "lastvertex";
else if ( mPlacement == FirstVertex )
map["placement"] = "firstvertex";
else
map["placement"] = "interval";
return map; return map;
} }


Expand Down
4 changes: 3 additions & 1 deletion src/core/symbology-ng/qgslinesymbollayerv2.h
Expand Up @@ -88,7 +88,9 @@ class CORE_EXPORT QgsMarkerLineSymbolLayerV2 : public QgsLineSymbolLayerV2
enum Placement enum Placement
{ {
Interval, Interval,
Vertex Vertex,
LastVertex,
FirstVertex
}; };


// static stuff // static stuff
Expand Down
19 changes: 17 additions & 2 deletions src/gui/symbology-ng/qgssymbollayerv2widget.cpp
Expand Up @@ -361,6 +361,8 @@ QgsMarkerLineSymbolLayerV2Widget::QgsMarkerLineSymbolLayerV2Widget( QWidget* par
connect( spinOffset, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) ); connect( spinOffset, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
connect( radInterval, SIGNAL( clicked() ), this, SLOT( setPlacement() ) ); connect( radInterval, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
connect( radVertex, SIGNAL( clicked() ), this, SLOT( setPlacement() ) ); connect( radVertex, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
connect( radVertexLast, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
connect( radVertexFirst, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
} }


void QgsMarkerLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) void QgsMarkerLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
Expand All @@ -377,8 +379,12 @@ void QgsMarkerLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
spinOffset->setValue( mLayer->offset() ); spinOffset->setValue( mLayer->offset() );
if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::Interval ) if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::Interval )
radInterval->setChecked( true ); radInterval->setChecked( true );
else else if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::Vertex )
radVertex->setChecked( true ); radVertex->setChecked( true );
else if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::LastVertex )
radVertexLast->setChecked( true );
else
radVertexFirst->setChecked( true );
updateMarker(); updateMarker();
setPlacement(); // update gui setPlacement(); // update gui
} }
Expand Down Expand Up @@ -426,8 +432,17 @@ void QgsMarkerLineSymbolLayerV2Widget::updateMarker()
void QgsMarkerLineSymbolLayerV2Widget::setPlacement() void QgsMarkerLineSymbolLayerV2Widget::setPlacement()
{ {
bool interval = radInterval->isChecked(); bool interval = radInterval->isChecked();
mLayer->setPlacement( interval ? QgsMarkerLineSymbolLayerV2::Interval : QgsMarkerLineSymbolLayerV2::Vertex );
spinInterval->setEnabled( interval ); spinInterval->setEnabled( interval );
//mLayer->setPlacement( interval ? QgsMarkerLineSymbolLayerV2::Interval : QgsMarkerLineSymbolLayerV2::Vertex );
if ( radInterval->isChecked() )
mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::Interval );
else if ( radVertex->isChecked() )
mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::Vertex );
else if ( radVertexLast->isChecked() )
mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::LastVertex );
else
mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::FirstVertex );

emit changed(); emit changed();
} }


Expand Down
210 changes: 110 additions & 100 deletions src/ui/symbollayer/widget_markerline.ui
Expand Up @@ -7,112 +7,122 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>352</width> <width>352</width>
<height>232</height> <height>281</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QGridLayout" name="gridLayout">
<item> <item row="0" column="0">
<layout class="QGridLayout" name="gridLayout"> <widget class="QLabel" name="label">
<item row="0" column="0"> <property name="text">
<widget class="QLabel" name="label"> <string>Marker</string>
<property name="text"> </property>
<string>Marker</string> </widget>
</property> </item>
</widget> <item row="0" column="1">
</item> <widget class="QPushButton" name="btnChangeMarker">
<item row="0" column="1"> <property name="text">
<widget class="QPushButton" name="btnChangeMarker"> <string>Change</string>
<property name="text"> </property>
<string>Change</string> </widget>
</property> </item>
</widget> <item row="0" column="2">
</item> <spacer>
<item row="1" column="0" colspan="2"> <property name="orientation">
<widget class="QLabel" name="label_2"> <enum>Qt::Horizontal</enum>
<property name="text"> </property>
<string>Marker placement</string> <property name="sizeType">
</property> <enum>QSizePolicy::Preferred</enum>
</widget> </property>
</item> <property name="sizeHint" stdset="0">
<item row="2" column="0"> <size>
<widget class="QRadioButton" name="radInterval"> <width>109</width>
<property name="text"> <height>20</height>
<string>with interval</string> </size>
</property> </property>
<property name="checked"> </spacer>
<bool>true</bool> </item>
</property> <item row="1" column="0" colspan="2">
</widget> <widget class="QLabel" name="label_2">
</item> <property name="text">
<item row="2" column="1"> <string>Marker placement</string>
<widget class="QDoubleSpinBox" name="spinInterval"> </property>
<property name="decimals"> </widget>
<number>2</number> </item>
</property> <item row="2" column="0">
<property name="maximum"> <widget class="QRadioButton" name="radInterval">
<double>100000.000000000000000</double> <property name="text">
</property> <string>with interval</string>
<property name="value"> </property>
<double>1.000000000000000</double> <property name="checked">
</property> <bool>true</bool>
</widget> </property>
</item> </widget>
<item row="3" column="0" colspan="2"> </item>
<widget class="QRadioButton" name="radVertex"> <item row="2" column="1">
<property name="text"> <widget class="QDoubleSpinBox" name="spinInterval">
<string>on every vertex</string> <property name="decimals">
</property> <number>2</number>
</widget> </property>
</item> <property name="maximum">
<item row="4" column="0" colspan="2"> <double>100000.000000000000000</double>
<widget class="QCheckBox" name="chkRotateMarker"> </property>
<property name="text"> <property name="value">
<string>Rotate marker</string> <double>1.000000000000000</double>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="3" column="0" colspan="2">
<widget class="QLabel" name="label_3"> <widget class="QRadioButton" name="radVertex">
<property name="text"> <property name="text">
<string>Line offset</string> <string>on every vertex</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1"> <item row="4" column="0" colspan="2">
<widget class="QDoubleSpinBox" name="spinOffset"> <widget class="QRadioButton" name="radVertexLast">
<property name="decimals"> <property name="text">
<number>2</number> <string>on last vertex only</string>
</property> </property>
<property name="minimum"> </widget>
<double>-100000.000000000000000</double> </item>
</property> <item row="5" column="0" colspan="2">
<property name="maximum"> <widget class="QRadioButton" name="radVertexFirst">
<double>100000.000000000000000</double> <property name="text">
</property> <string>on first vertex only</string>
</widget> </property>
</item> </widget>
<item row="0" column="2" rowspan="6"> </item>
<spacer> <item row="6" column="0" colspan="2">
<property name="orientation"> <widget class="QCheckBox" name="chkRotateMarker">
<enum>Qt::Horizontal</enum> <property name="text">
</property> <string>Rotate marker</string>
<property name="sizeType"> </property>
<enum>QSizePolicy::Preferred</enum> </widget>
</property> </item>
<property name="sizeHint" stdset="0"> <item row="7" column="0">
<size> <widget class="QLabel" name="label_3">
<width>110</width> <property name="text">
<height>20</height> <string>Line offset</string>
</size> </property>
</property> </widget>
</spacer> </item>
</item> <item row="7" column="1">
</layout> <widget class="QDoubleSpinBox" name="spinOffset">
<property name="decimals">
<number>2</number>
</property>
<property name="minimum">
<double>-100000.000000000000000</double>
</property>
<property name="maximum">
<double>100000.000000000000000</double>
</property>
</widget>
</item> </item>
<item> <item row="8" column="0" colspan="3">
<spacer> <spacer>
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
Expand Down

0 comments on commit 5c8fa08

Please sign in to comment.