@@ -215,6 +215,7 @@ QgsMarkerLineSymbolLayerV2::QgsMarkerLineSymbolLayerV2( bool rotateMarker, doubl
215
215
mInterval = interval;
216
216
mMarker = NULL ;
217
217
mOffset = 0 ;
218
+ mPlacement = Interval;
218
219
219
220
setSubSymbol ( new QgsMarkerSymbolV2 () );
220
221
}
@@ -237,6 +238,8 @@ QgsSymbolLayerV2* QgsMarkerLineSymbolLayerV2::create( const QgsStringMap& props
237
238
QgsMarkerLineSymbolLayerV2* x = new QgsMarkerLineSymbolLayerV2 ( rotate, interval );
238
239
if ( props.contains ( " offset" ) )
239
240
x->setOffset ( props[" offset" ].toDouble () );
241
+ if ( props.contains ( " placement" ) )
242
+ x->setPlacement ( props[" placement" ] == " vertex" ? Vertex : Interval );
240
243
return x;
241
244
}
242
245
@@ -276,16 +279,22 @@ void QgsMarkerLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym
276
279
{
277
280
if ( mOffset == 0 )
278
281
{
279
- renderPolylineNoOffset ( points, context );
282
+ if ( mPlacement == Vertex )
283
+ renderPolylineVertex ( points, context );
284
+ else
285
+ renderPolylineInterval ( points, context );
280
286
}
281
287
else
282
288
{
283
289
QPolygonF points2 = ::offsetLine ( points, context.outputLineWidth ( mOffset ) );
284
- renderPolylineNoOffset ( points2, context );
290
+ if ( mPlacement == Vertex )
291
+ renderPolylineVertex ( points2, context );
292
+ else
293
+ renderPolylineInterval ( points2, context );
285
294
}
286
295
}
287
296
288
- void QgsMarkerLineSymbolLayerV2::renderPolylineNoOffset ( const QPolygonF& points, QgsSymbolV2RenderContext& context )
297
+ void QgsMarkerLineSymbolLayerV2::renderPolylineInterval ( const QPolygonF& points, QgsSymbolV2RenderContext& context )
289
298
{
290
299
QPointF lastPt = points[0 ];
291
300
double lengthLeft = 0 ; // how much is left until next marker
@@ -344,12 +353,65 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineNoOffset( const QPolygonF& points
344
353
345
354
}
346
355
356
+ void QgsMarkerLineSymbolLayerV2::renderPolylineVertex ( const QPolygonF& points, QgsSymbolV2RenderContext& context )
357
+ {
358
+ QPointF lastPt = points[0 ];
359
+ QgsRenderContext& rc = context.renderContext ();
360
+
361
+ double origAngle = mMarker ->angle ();
362
+ double angle;
363
+
364
+ for ( int i = 0 ; i < points.count (); ++i )
365
+ {
366
+ const QPointF& pt = points[i];
367
+
368
+ // rotate marker (if desired)
369
+ if ( mRotateMarker )
370
+ {
371
+ if ( i == 0 )
372
+ {
373
+ const QPointF& nextPt = points[i+1 ];
374
+ if ( pt == nextPt )
375
+ continue ;
376
+ angle = MyLine ( pt, nextPt ).angle ();
377
+ }
378
+ else if ( i == points.count () - 1 )
379
+ {
380
+ const QPointF& prevPt = points[i-1 ];
381
+ if ( pt == prevPt )
382
+ continue ;
383
+ angle = MyLine ( prevPt, pt ).angle ();
384
+ }
385
+ else
386
+ {
387
+ const QPointF& prevPt = points[i-1 ];
388
+ const QPointF& nextPt = points[i+1 ];
389
+ if ( prevPt == pt || nextPt == pt )
390
+ continue ;
391
+
392
+ // calc average angle between the previous and next point
393
+ double a1 = MyLine ( prevPt, pt ).angle ();
394
+ double a2 = MyLine ( pt, nextPt ).angle ();
395
+ double unitX = cos ( a1 ) + cos ( a2 ), unitY = sin ( a1 ) + sin ( a2 );
396
+ angle = atan2 ( unitY, unitX );
397
+ }
398
+ mMarker ->setAngle ( angle * 180 / M_PI );
399
+ }
400
+
401
+ mMarker ->renderPoint ( points.at ( i ), rc, -1 , context.selected () );
402
+ }
403
+
404
+ // restore original rotation
405
+ mMarker ->setAngle ( origAngle );
406
+ }
407
+
347
408
QgsStringMap QgsMarkerLineSymbolLayerV2::properties () const
348
409
{
349
410
QgsStringMap map;
350
411
map[" rotate" ] = ( mRotateMarker ? " 1" : " 0" );
351
412
map[" interval" ] = QString::number ( mInterval );
352
413
map[" offset" ] = QString::number ( mOffset );
414
+ map[" placement" ] = ( mPlacement == Vertex ? " vertex" : " interval" );
353
415
return map;
354
416
}
355
417
@@ -377,6 +439,7 @@ QgsSymbolLayerV2* QgsMarkerLineSymbolLayerV2::clone() const
377
439
QgsMarkerLineSymbolLayerV2* x = new QgsMarkerLineSymbolLayerV2 ( mRotateMarker , mInterval );
378
440
x->setSubSymbol ( mMarker ->clone () );
379
441
x->setOffset ( mOffset );
442
+ x->setPlacement ( mPlacement );
380
443
return x;
381
444
}
382
445
0 commit comments