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