AW: [Qgis-user] lines with arrowheads
Hugentobler Marco
marco.hugentobler at karto.baug.ethz.ch
Mon Jun 2 23:21:48 PDT 2008
Hi Tim,
>Marco what is the plan / status of that for 1.0?
Prior 1.0, there will be no major redesign of vector rendering mechanism. Post 1.0, I think it is absolutely necessary to do so and to let renderer subclasses decide what shapes to draw.
I think the patch only makes sense if, as you suggested in February (see below), the arrow heads can be enabled/disabled via vector layer props and the state is saved to the project file.
>If anyone vigorously disagrees let me know,
>otherwise I'll incorporate your patch in 0.9.3 with some additions
>from myself to enabled or disable line arrows via the layer props
>dialog, the vector api and the layer properties serialisation
>mechanism.
Regards,
Marco
-----Ursprüngliche Nachricht-----
Von: Tim Sutton [mailto:tim at linfiniti.com]
Gesendet: Mo 02.06.2008 22:10
An: Stefanie Tellex
Cc: qgis-user at lists.osgeo.org; Hugentobler Marco
Betreff: Re: [Qgis-user] lines with arrowheads
Hi
Yes I was for accepting the patch, but I believe others wanted to
wait under we had rendering stuff revised. Marco what is the plan /
status of that for 1.0? My feeling is we should reconsider the patch
if we wont have the render modules in place for 1.0....
Regards
Tim
2008/6/2 Stefanie Tellex <stefie10 at media.mit.edu>:
> 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
>> Qgis-user at lists.osgeo.org
>> 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
> Qgis-user at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/qgis-user
>
>
--
Tim Sutton
QGIS Project Steering Committee Member - Release Manager
Visit http://qgis.org for a great open source GIS
openModeller Desktop Developer
Visit http://openModeller.sf.net for a great open source ecological
niche modelling tool
Home Page: http://tim.linfiniti.com
Skype: timlinux
Irc: timlinux on #qgis at freenode.net
More information about the Qgis-user
mailing list