Changeset 8501:c439fe25be2a in orange


Ignore:
Timestamp:
07/28/11 09:50:13 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
d7481f32d6db29f4796cc03ea31ba9ac015419ed
Message:

Merge PointsCollection functionality into the Plot class, and slightly speed up the searching process.

Location:
source/orangeplot
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • source/orangeplot/CMakeLists.txt

    r8491 r8501  
    1717    plotitem.cpp  
    1818    point.cpp  
    19     pointscollection.cpp 
    2019    curve.cpp  
    2120    unconnectedlinescurve.cpp  
  • source/orangeplot/curve.cpp

    r8491 r8501  
    88#include <QtCore/QtConcurrentRun> 
    99#include "point.h" 
    10  
    11 Curve::Curve(const QList< double >& x_data, const QList< double >& y_data, QGraphicsItem* parent, QGraphicsScene* scene): PlotItem(parent, scene), PointsCollection() 
     10#include "plot.h" 
     11 
     12Curve::Curve(const QList< double >& x_data, const QList< double >& y_data, QGraphicsItem* parent, QGraphicsScene* scene): PlotItem(parent, scene) 
    1213{ 
    1314    m_style = NoCurve; 
     
    1920} 
    2021 
    21 Curve::Curve(QGraphicsItem* parent, QGraphicsScene* scene): PlotItem(parent, scene), PointsCollection() 
     22Curve::Curve(QGraphicsItem* parent, QGraphicsScene* scene): PlotItem(parent, scene) 
    2223{ 
    2324    m_style = NoCurve; 
     
    3536{ 
    3637  cancelAllUpdates(); 
    37   if (m_continuous) 
     38  if (m_continuous || (m_data.size() == m_pointItems.size())) 
    3839  { 
    3940    m_needsUpdate &= ~UpdateNumberOfItems; 
     
    5152    m_pointItems << new Point(m_symbol, m_color, m_pointSize, this); 
    5253  } 
    53    
     54  register_points(); 
    5455  Q_ASSERT(m_pointItems.size() == m_data.size()); 
    55   set_points(m_pointItems); 
    5656} 
    5757 
     
    150150    m_data.append(p); 
    151151  } 
    152   set_data_points(x_data, y_data); 
    153152  set_data_rect(rect_from_data(x_data, y_data)); 
    154153  m_needsUpdate |= UpdatePosition; 
     
    339338    m_currentUpdate.clear(); 
    340339} 
     340 
     341void Curve::register_points() 
     342{ 
     343    Plot* p = plot(); 
     344    if (p) 
     345    { 
     346        p->remove_all_points(this); 
     347        p->add_points(m_data, m_pointItems, this); 
     348    } 
     349} 
     350 
  • source/orangeplot/curve.h

    r8491 r8501  
    99 
    1010#include <QtCore/QtConcurrentMap> 
    11 #include "pointscollection.h" 
    1211 
    1312struct DataPoint 
     
    8079typedef QList< DataPoint > Data; 
    8180 
    82 class Curve : public PlotItem, public PointsCollection 
     81class Curve : public PlotItem 
    8382{ 
    8483   
     
    145144  virtual QTransform graph_transform() const; 
    146145  virtual void set_graph_transform(const QTransform& transform); 
     146  virtual void register_points(); 
    147147   
    148148  QRectF graphArea() const; 
  • source/orangeplot/networkcurve.cpp

    r8500 r8501  
    482482{ 
    483483    qDeleteAll(m_nodes); 
     484    plot()->remove_all_points(this); 
     485     
    484486    m_nodes = nodes; 
    485487    foreach (NodeItem* node, nodes) 
    486488    { 
    487         add_point(node); 
     489        DataPoint p; 
     490        p.x = node->x(); 
     491        p.y = node->y(); 
     492        plot()->add_point(p, node, this); 
    488493    } 
    489494} 
     
    631636} 
    632637 
     638void NetworkCurve::register_points() 
     639{ 
     640    Plot* p = plot(); 
     641    if (p) 
     642    { 
     643        p->remove_all_points(this); 
     644        const Data d = data(); 
     645        const int n = d.size(); 
     646        for (int i = 0; i < n; ++i) 
     647        { 
     648            p->add_point(d[i], m_nodes[i], this); 
     649        } 
     650    } 
     651} 
     652 
    633653void NetworkCurve::set_use_animations(bool use_animations) 
    634654{ 
    635     m_use_animations = use_animations; 
     655    m_use_animations = use_animations; 
    636656} 
    637657 
    638658bool NetworkCurve::use_animations() const 
    639659{ 
    640     return m_use_animations; 
    641 } 
    642  
     660    return m_use_animations; 
     661} 
     662  
    643663void NetworkCurve::stop_optimization() 
    644664{ 
    645     m_stop_optimization = true; 
    646 } 
     665    m_stop_optimization = true; 
     666} 
  • source/orangeplot/networkcurve.h

    r8500 r8501  
    139139    virtual void update_properties(); 
    140140    virtual QRectF data_rect() const; 
     141    virtual void register_points(); 
    141142     
    142143    int fr(int steps, bool weighted); 
  • source/orangeplot/plot.cpp

    r8494 r8501  
    44 
    55#include <QtCore/QDebug> 
    6 #include "pointscollection.h" 
     6 
     7uint qHash(const DataPoint& pos) 
     8{ 
     9    return pos.x + pos.y; 
     10} 
     11 
     12bool operator==(const DataPoint& one, const DataPoint& other) 
     13{ 
     14    return one.x == other.x && one.y == other.y; 
     15} 
    716 
    817template <class Area> 
     
    5059    item->setParentItem(graph_item); 
    5160    m_items << item; 
     61    item->register_points(); 
    5262} 
    5363 
     
    6878        qWarning() << "Trying to remove an item that doesn't belong to this graph"; 
    6979    } 
     80    remove_all_points(item); 
    7081} 
    7182 
     
    165176    QList<int> selected; 
    166177    selected.reserve(n); 
     178    DataPoint p; 
    167179    for (int i = 0; i < n; ++i) 
    168180    { 
    169         selected << (selected_point_at(QPointF(x_data[i], y_data[i]) * transform) ? 1 : 0); 
     181        p.x = x_data[i]; 
     182        p.y = y_data[i]; 
     183        selected << (selected_point_at(p) ? 1 : 0); 
    170184    } 
    171185    return selected; 
    172186} 
    173187 
    174 Point* Plot::selected_point_at(const QPointF& pos) 
     188Point* Plot::selected_point_at(const DataPoint& pos) 
    175189{ 
    176190    foreach (PlotItem* item, plot_items()) 
    177191    { 
    178         const PointsCollection* collection = dynamic_cast<PointsCollection*>(item); 
    179         if (collection && collection->contains(pos) && collection->point_at(pos)->is_selected()) 
    180         { 
    181             return collection->point_at(pos); 
     192        if (m_point_set.contains(item) && m_point_set[item].contains(pos) && m_point_hash[item][pos]->is_selected()) 
     193        { 
     194            return m_point_hash[item][pos]; 
    182195        } 
    183196    } 
     
    185198} 
    186199 
    187 Point* Plot::point_at(const QPointF& pos) 
     200Point* Plot::point_at(const DataPoint& pos) 
    188201{ 
    189202    Point* point; 
    190203    foreach (PlotItem* item, plot_items()) 
    191204    { 
    192         const PointsCollection* collection = dynamic_cast<PointsCollection*>(item); 
    193         if (collection && collection->contains(pos)) 
    194         { 
    195             return collection->point_at(pos); 
     205        if (m_point_set.contains(item) && m_point_set[item].contains(pos)) 
     206        { 
     207            return m_point_hash[item][pos]; 
    196208        } 
    197209    } 
     
    199211} 
    200212 
     213void Plot::add_point(const DataPoint& pos, Point* item, PlotItem* parent) 
     214{ 
     215    m_point_set[parent].insert(pos); 
     216    m_point_hash[parent].insert(pos, item); 
     217} 
     218 
     219void Plot::add_points(const Data& data, const QList< Point* >& items, PlotItem* parent) 
     220{ 
     221    const int n = qMin(data.size(), items.size()); 
     222    for (int i = 0; i < n; ++i) 
     223    { 
     224        add_point(data[i], items[i], parent); 
     225    } 
     226} 
     227 
     228void Plot::remove_point(const DataPoint& pos, PlotItem* parent) 
     229{ 
     230    if (m_point_set.contains(parent) && m_point_set[parent].contains(pos)) 
     231    { 
     232        m_point_set[parent].remove(pos); 
     233        m_point_hash[parent].remove(pos); 
     234    } 
     235} 
     236 
     237void Plot::remove_all_points(PlotItem* parent) 
     238{ 
     239    if (m_point_set.contains(parent)) 
     240    { 
     241        m_point_set[parent].clear(); 
     242        m_point_hash[parent].clear(); 
     243    } 
     244} 
     245 
    201246#include "plot.moc" 
  • source/orangeplot/plot.h

    r8491 r8501  
    33 
    44#include <QtGui/QGraphicsView> 
     5#include <QtCore/QHash> 
     6#include <QtCore/QMap> 
     7 
     8#include "curve.h" 
    59 
    610class Point; 
     
    1822    }; 
    1923     
    20     Plot(QWidget* parent = 0); 
     24    typedef QSet<DataPoint> PointSet; 
     25    typedef QHash<DataPoint, Point*> PointHash; 
     26 
     27     
     28    explicit Plot(QWidget* parent = 0); 
    2129    virtual ~Plot(); 
    2230     
     
    4452    QList< int > selected_points(const QList< double > x_data, const QList< double > y_data, const QTransform& transform); 
    4553     
    46     Point* point_at(const QPointF& pos); 
    47     Point* selected_point_at(const QPointF& pos); 
     54    Point* point_at(const DataPoint& pos); 
     55    Point* selected_point_at(const DataPoint& pos); 
    4856     
     57    void add_point(const DataPoint& pos, Point* item, PlotItem* parent); 
     58    void add_points(const Data& data, const QList<Point*>& items, PlotItem* parent); 
     59    void remove_point(const DataPoint& pos, PlotItem* parent); 
     60    void remove_all_points(PlotItem* parent); 
     61        
    4962protected: 
    50     void set_clean();; 
     63    void set_clean(); 
    5164    bool is_dirty(); 
    5265     
     
    5568    bool m_dirty; 
    5669    QGraphicsRectItem* clipItem; 
     70    QMap<PlotItem*, PointSet> m_point_set; 
     71    QMap<PlotItem*, PointHash> m_point_hash; 
    5772}; 
    5873 
  • source/orangeplot/plot.sip

    r8479 r8501  
    6363     
    6464    QList< int > selected_points(const QList< double > x_data, const QList< double > y_data, const QTransform& transform); 
    65     Point* point_at(const QPointF& pos); 
     65    Point* point_at(const DataPoint& pos); 
    6666     
    6767protected: 
  • source/orangeplot/plotitem.cpp

    r8446 r8501  
    108108    return m_plot; 
    109109} 
     110 
     111void PlotItem::register_points() 
     112{ 
     113 
     114} 
     115 
  • source/orangeplot/plotitem.h

    r8446 r8501  
    2525    void detach(); 
    2626    Plot* plot(); 
     27    virtual void register_points(); 
    2728     
    2829    static QRectF rect_from_data(const QList<double>& x_data, const QList<double>& y_data); 
Note: See TracChangeset for help on using the changeset viewer.