I submitted a patch to do this a while back, but I don't think it was
accepted. I thought it was because it was decided to wait until a more
modular rendering pipeline was added, but I can't find the messages
about that in the thread. In fact the thread implies it would be
accepted, but if it made it into svn, I never noticed it.
(http://lists.osgeo.org/pipermail/qgis-developer/2008-February/003248.html)
The patches are attached. (arrows_in_linestrings draws arrows;
draw_start_and_stop draws a green dot at the start and a red dot at the
end.)
This message suggests an alternative solution that doesn't require
compiling qgis yourself:
http://lists.osgeo.org/pipermail/qgis-developer/2008-February/003250.html
Stefanie
M S wrote:
One of the outputs from r.flow in GRASS is downslope flow lines.
Without arrowheads (or some similar symbol like that) at the end of
lines pointing which way is downhill, the lines become ambiguous.
Is there a way to draw these lines with arrowheads? Or some other
approach that might achieve this?
Mark
------------------------------------------------------------------------
_______________________________________________
Qgis-user mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/qgis-user
Index: qgis/qgis_unstable/src/core/qgsvectorlayer.cpp
===================================================================
--- qgis.orig/qgis_unstable/src/core/qgsvectorlayer.cpp 2008-06-02
12:17:11.000000000 -0400
+++ qgis/qgis_unstable/src/core/qgsvectorlayer.cpp 2008-06-02
12:34:47.000000000 -0400
@@ -360,7 +360,8 @@
QPainter* p,
const QgsMapToPixel* mtp,
const QgsCoordinateTransform* ct,
- bool drawingToEditingCanvas)
+ bool drawingToEditingCanvas,
+ bool drawArrows)
{
unsigned char *ptr = feature + 5;
unsigned int wkbType = *((int*)(feature+1));
@@ -432,6 +433,7 @@
// 255 = opaque
//
QPen myTransparentPen = p->pen(); // store current pen
+ QBrush brush = p->brush(); //to be kept as original
QColor myColor = myTransparentPen.color();
//only set transparency from layer level if renderer does not provide
//transparency on class level
@@ -459,8 +461,45 @@
}
}
+ // draw arrows
+ if (drawArrows) {
+#define PI 3.14159
+ p->setBrush(QBrush(myColor, Qt::SolidPattern));
+
+ for (int i = 0; i < pa.size(); ++i)
+ {
+ if (i > 0)
+ {
+ QPointF p1 = pa[i];
+ QPointF p2 = pa[i-1];
+
+ QLineF line = QLineF(p1, p2);
+ double angle = ::acos(line.dx() / line.length());
+ if (line.dy() >= 0)
+ {
+ angle = (PI * 2) - angle;
+ }
+
+ float arrowSize = 5;
+ QPointF arrowP1 =
+ line.p1() + QPointF(sin(angle + PI / 3) * arrowSize,
+ cos(angle + PI / 3) * arrowSize);
+ QPointF arrowP2 =
+ line.p1() + QPointF(sin(angle + PI - PI / 3) * arrowSize,
+ cos(angle + PI - PI / 3) * arrowSize);
+ QPolygonF arrowHead;
+ arrowHead << line.p1() << arrowP1 << arrowP2;
+ if (i % 2 == 0) {
+ p->drawPolygon(arrowHead);
+ }
+
+
+ }
+ }
+ }
//restore the pen
p->setPen(pen);
+ p->setBrush(brush);
return ptr;
}
@@ -3057,7 +3096,7 @@
p,
theMapToPixelTransform,
ct,
- drawingToEditingCanvas);
+ drawingToEditingCanvas, TRUE);
break;
}
case QGis::WKBMultiLineString:
Index: qgis/qgis_unstable/src/core/qgsvectorlayer.h
===================================================================
--- qgis.orig/qgis_unstable/src/core/qgsvectorlayer.h 2008-06-02
12:17:11.000000000 -0400
+++ qgis/qgis_unstable/src/core/qgsvectorlayer.h 2008-06-02
12:35:13.000000000 -0400
@@ -451,7 +451,8 @@
QPainter* p,
const QgsMapToPixel* mtp,
const QgsCoordinateTransform* ct,
- bool drawingToEditingCanvas);
+ bool drawingToEditingCanvas,
+ bool drawArrows=FALSE);
/** Draw the polygon as given in the WKB format. Returns a pointer to
* the byte after the end of the polygon binary data stream (WKB).
Index: qgis/qgis_unstable/src/core/qgsvectorlayer.cpp
===================================================================
--- qgis.orig/qgis_unstable/src/core/qgsvectorlayer.cpp 2008-06-02
12:48:56.000000000 -0400
+++ qgis/qgis_unstable/src/core/qgsvectorlayer.cpp 2008-06-02
12:49:22.000000000 -0400
@@ -361,7 +361,8 @@
const QgsMapToPixel* mtp,
const QgsCoordinateTransform* ct,
bool drawingToEditingCanvas,
- bool drawArrows)
+ bool drawArrows,
+ bool drawEndPoints)
{
unsigned char *ptr = feature + 5;
unsigned int wkbType = *((int*)(feature+1));
@@ -470,6 +471,8 @@
{
if (i > 0)
{
+ p->setBrush(QBrush(myColor, Qt::SolidPattern));
+
QPointF p1 = pa[i];
QPointF p2 = pa[i-1];
@@ -494,9 +497,17 @@
}
+ } else {
+
}
}
}
+ if (drawEndPoints) {
+ p->setBrush(QBrush(Qt::green, Qt::SolidPattern));
+ p->drawEllipse(pa[0].x(), pa[0].y(), 5, 5);
+ p->setBrush(QBrush(Qt::red, Qt::SolidPattern));
+ p->drawEllipse(pa[pa.size() - 1].x(), pa[pa.size() - 1].y(), 5, 5);
+ }
//restore the pen
p->setPen(pen);
p->setBrush(brush);
@@ -3104,7 +3115,7 @@
p,
theMapToPixelTransform,
ct,
- drawingToEditingCanvas, TRUE);
+ drawingToEditingCanvas, TRUE, TRUE);
break;
}
case QGis::WKBMultiLineString:
Index: qgis/qgis_unstable/src/core/qgsvectorlayer.h
===================================================================
--- qgis.orig/qgis_unstable/src/core/qgsvectorlayer.h 2008-06-02
12:35:13.000000000 -0400
+++ qgis/qgis_unstable/src/core/qgsvectorlayer.h 2008-06-02
12:49:22.000000000 -0400
@@ -452,7 +452,8 @@
const QgsMapToPixel* mtp,
const QgsCoordinateTransform* ct,
bool drawingToEditingCanvas,
- bool drawArrows=FALSE);
+ bool drawArrows=FALSE,
+ bool drawEndPoints=FALSE);
/** Draw the polygon as given in the WKB format. Returns a pointer to
* the byte after the end of the polygon binary data stream (WKB).
_______________________________________________
Qgis-user mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/qgis-user