コード例 #1
0
bool PSV_ChartItem::addCurveItem(PSV_CurveInfo &curveInfo)
{
    if(curveInfo.m_isHidden)
    {
        return true;
    }
    setCurrentAxisType(curveInfo.m_axisType);
    PSV::CURVETYPE curveType = curveInfo.m_curveType;
    QMap<double, double> curve_data = curveInfo.m_curveDataMap;
    QPen pen(curveInfo.m_lineColor);
    pen.setWidth(curveInfo.m_lineWidth);
    QMapIterator<double, double> iter(curve_data);
    QLineF lineF;
    QLineF lineF_V;
    QLineF lineF_H;
    bool is_first = true;
    QMap<double, QGraphicsLineItem *> line_item_map;
    QMap<double, QGraphicsLineItem *> line_V_item_map;
    QMap<double, QGraphicsLineItem *> line_H_item_map;

    while(iter.hasNext())
    {
        iter.next();
        double x = getAxisX(iter.key());//不调整
        double y = getAxisY(iter.value());//不调整
        QPointF point(x,y);
        if(is_first)
        {
            is_first = false;
            if(curveType == PSV::E_CURVE_PARELLEL)
            {
                lineF_H.setP1(point);
            }
            else
            {
                lineF.setP1(point);
            }
        }
        else
        {
            if(curveType == PSV::E_CURVE_PARELLEL)
            {
                QGraphicsLineItem *line_item_H = new QGraphicsLineItem(this);
                line_item_H->setZValue(m_curveZValue);
                lineF_H.setP2(QPointF(x,lineF_H.p1().y()));
                line_item_H->setLine(lineF_H);
                line_item_H->setPen(pen);
                line_H_item_map.insert(iter.key(),line_item_H);
                lineF_V.setP1(QPointF(x,lineF_H.p1().y()));
                lineF_V.setP2(point);
                QGraphicsLineItem *line_item_V = new QGraphicsLineItem(this);
                line_item_V->setZValue(m_curveZValue);
                line_item_V->setLine(lineF_V);
                line_item_V->setPen(pen);
                line_V_item_map.insert(iter.key(),line_item_V);
                lineF_H.setP1(point);
            }
            else
            {
                QGraphicsLineItem *line_item;
                line_item = new QGraphicsLineItem(this);
                line_item->setZValue(m_curveZValue);
                lineF.setP2(point);
                line_item->setLine(lineF);
                line_item->setPen(pen);
                line_item_map.insert(iter.key(),line_item);
                lineF.setP1(lineF.p2());
            }
        }
    }
    m_curveZValue++;
    return true;
}
コード例 #2
0
bool PSV_ChartRealItem::addCurve(const QMap<double, double> &data, const PSV_CurveParam &curveParam)
{
    QString curveName = curveParam.m_curveName;
    if(curveParam.m_isReplace)
    {
        clearCurve(curveName);
    }
    if(m_curveDataMap.contains(curveName) || curveName.isEmpty())
    {
        return false;
    }
    if(data.count() <= 0)
    {
        PSV_Public::printMes(QString::fromLocal8Bit("warning:数据为空"));
        return false;
    }
    QMapIterator<double,double> iter(data);
    PSV_CurveInfo curveInfo(curveName);
    curveInfo.m_axisType = curveParam.m_axisType;
    setCurrentAxisType(curveInfo.m_axisType);
    curveInfo.m_curveType = curveParam.m_curveType;
    double sum = 0.0;
    double max_y = 0.0;
    double min_y = 0.0;
//    double max_y_pointX = 0.0;
//    double min_y_pointX = 0.0;

    double max_x = 0.0;
    double min_x = 0.0;
    bool isFisrt = true;
    while(iter.hasNext())
    {
        iter.next();
        double value = iter.value();
        if(isFisrt)
        {
            isFisrt = false;
            max_y = value;
            min_y = value;
            sum = value;
            max_x = iter.key();
            min_x = iter.key();
//            max_y_pointX = iter.key();
//            min_y_pointX = iter.key();
        }
        else
        {
            sum += value;
            if(max_y < value)
            {
                max_y = value;
//                max_y_pointX = iter.key();
            }
            if(min_y > value)
            {
                min_y = value;
//                min_y_pointX = iter.key();
            }
            if(max_x < iter.key())
            {
                max_x = iter.key();
            }
            if(min_x > iter.key())
            {
                min_x = iter.key();
            }
        }
    }
    if(*m_isFisrtCurve_curP)
    {
        *m_max_y_curP = max_y;
        *m_min_y_curP = min_y;
        if(m_isFisrtCurve_left && m_isFisrtCurve_right)
        {
            m_rangeX.first = min_x;
            m_rangeX.second = max_x;
        }
        *m_isFisrtCurve_curP = false;
    }
    else
    {
        if(*m_max_y_curP < max_y)
        {
            *m_max_y_curP = max_y;
        }
        if(*m_min_y_curP > min_y)
        {
            *m_min_y_curP = min_y;
        }
    }
    if(m_rangeX.first > min_x)
    {
        m_rangeX.first = min_x;
    }
    if(m_rangeX.second < max_x)
    {
        m_rangeX.second = max_x;
    }
    m_max_x = m_rangeX.second;
    m_min_x = m_rangeX.first;
    double avg_y = sum / data.count();
    QStringList textList;
    textList.append(QString("%1:").arg(curveName));
    textList.append(QString(" %1:%2").arg(QString::fromLocal8Bit("最大值")).arg(QString::number(max_y,'f',m_decimal)));
    textList.append(QString(" %1:%2").arg(QString::fromLocal8Bit("最小值")).arg(QString::number(min_y,'f',m_decimal)));
    textList.append(QString(" %1:%2").arg(QString::fromLocal8Bit("平均值")).arg(QString::number(avg_y,'f',m_decimal)));

    QString staHtmText = PSV_Public::getStaText(textList/*,m_staFont*/);
    curveInfo.m_staHtmText = staHtmText;
    curveInfo.m_staText = textList.join("");
    curveInfo.m_curveDataMap = data;
    m_curveDataMap.insert(curveName,curveInfo);
    if(curveParam.m_isUpdate)
    {
        refreshItem();
    }
    return true;
}
コード例 #3
0
bool PSV_ChartItem::addEllipseItem(PSV_CurveInfo &curveInfo)
{
    if(curveInfo.m_isHidden)
    {
        return true;
    }
    setCurrentAxisType(curveInfo.m_axisType);
    QMap<double, double> curveData = curveInfo.m_curveDataMap;
    QMapIterator<double, double> iter(curveData);
    QPolygonF polygon;
    int m_radius = curveInfo.m_pointSize;
    double pointY0 = getAxisY(*m_min_y_curP,m_radius);;
    QPointF fisrtPoint(0,pointY0);
    QString curveName = curveInfo.m_curveName;
    QPen pen(curveInfo.m_pointColor);
    QBrush brush(curveInfo.m_pointColor);
    int count =1;
    double previous_time = 1.0 * qrand();
    QGraphicsEllipseItem* preItem = NULL;
    int index = 1;
    while(iter.hasNext())
    {
        iter.next();
        double x = getAxisX(iter.key(),m_radius);
        double y = getAxisY(iter.value(),m_radius);
        QPointF point(x, y);
        if(index == 1)
        {
            fisrtPoint = QPointF(x + m_radius,pointY0 + m_radius);
            polygon.append(fisrtPoint);
        }
        polygon.append(QPointF(x+m_radius,y+m_radius));
        if(index == curveData.count())
        {
            polygon.append(QPointF(x + m_radius,pointY0 + m_radius));
            polygon.append(fisrtPoint);
        }
        index++;
        QGraphicsEllipseItem *ellipse_item = new QGraphicsEllipseItem(this);
        ellipse_item->setZValue(m_curveZValue);
        ellipse_item->setRect(0,0,2*m_radius,2*m_radius);
        ellipse_item->setPos(point);
        ellipse_item->setFlag(QGraphicsItem::ItemIsSelectable);
        ellipse_item->setPen(pen);
        ellipse_item->setBrush(brush);
        ellipse_item->setData(E_CURVE_NAME,curveName);  //设置属于哪条曲线
        ellipse_item->setData(E_AXIS_X,iter.key());  //设置对应的X坐标轴值
        ellipse_item->setData(E_PREVIOUS_TIME,previous_time);
        ellipse_item->setData(E_NEXT_TIME,previous_time);
        ellipse_item->setData(E_POINT_TYPE,EV_FIRST);
        ellipse_item->setData(E_ITEM_TYPE,PSV::ellipseItem);
        ellipse_item->setToolTip(getToolTipText(iter.key(),iter.value()));
        ellipse_item->installSceneEventFilter(this);
        if(ellipse_item != NULL)
        {
            preItem->setData(E_NEXT_TIME,iter.key());
            if(count == curveData.count() - 1)
            {
                ellipse_item->setData(E_POINT_TYPE,EV_LAST);
            }
            else if(count != 1)
            {
                ellipse_item->setData(E_POINT_TYPE,EV_MID);
            }
        }
        preItem = ellipse_item;
        previous_time = iter.key();
    }
    curveInfo.m_polygon = polygon;
    m_curveZValue++;
    return true;
}
コード例 #4
0
bool PSV_ChartDateTimeItem::addCurve(const QMap<QDateTime, double> &data
                                     , const PSV_CurveParam &curveParam
                                     , bool isDate)
{
    QString curveName = curveParam.m_curveName;
    if(curveParam.m_isReplace)
    {
        clearCurve(curveName);
    }
    if(m_curveDataMap.contains(curveName) || curveName.isEmpty())
    {
        return false;
    }
    if(data.count() <= 0)
    {
        PSV_Public::printMes(QString::fromLocal8Bit("warning:数据为空"));
        return false;
    }

    QMap<double,double> curveData;
    QMapIterator<QDateTime,double> iter(data);
    PSV_CurveInfo curveInfo(curveName);
    curveInfo.m_axisType = curveParam.m_axisType;
    setCurrentAxisType(curveInfo.m_axisType);
    curveInfo.m_curveType = curveParam.m_curveType;
    if(isDate)
    {
        curveInfo.m_dataType = PSV::E_DATATYPE_DATE;
    }
    else
    {
        curveInfo.m_dataType = PSV::E_DATATYPE_DATETIME;
    }


    bool isChangedY = false;
    bool isChangedX = false;
    //==========================
    double sum = 0.0;
    double max_y = 0.0;
    double min_y = 0.0;
    QDateTime max_y_pointX = PSV_BEGIN_DATETIME;
    QDateTime min_y_pointX = PSV_BEGIN_DATETIME;

    QDateTime max_x = PSV_BEGIN_DATETIME;
    QDateTime min_x = PSV_BEGIN_DATETIME;

    bool isFisrt = true;

    while(iter.hasNext())
    {
        iter.next();
        if(!iter.key().isValid())
        {
            continue;
        }
        double value = iter.value();
        if(isFisrt)
        {
            isFisrt = false;
            max_y = value;
            min_y = value;
            sum = value;
            max_y_pointX = iter.key();
            min_y_pointX = iter.key();
            max_x = iter.key();
            min_x = iter.key();
        }
        else
        {
            sum += value;
            if(max_y < value)
            {
                max_y = value;
                max_y_pointX = iter.key();
            }
            if(min_y > value)
            {
                min_y = value;
                min_y_pointX = iter.key();
            }
            if(max_x < iter.key())
            {
                max_x = iter.key();
            }
            if(min_x > iter.key())
            {
                min_x = iter.key();
            }
        }
        int sec = m_beginDateTime.secsTo(iter.key());//
        curveData.insert(sec,iter.value());
    }

    if(*m_isFisrtCurve_curP)
    {
        *m_max_y_curP = max_y;
        *m_min_y_curP = min_y;
        if(m_isFisrtCurve_left && m_isFisrtCurve_right)
        {
            m_max_dateTime = max_x;
            m_min_dateTime = min_x;
        }
        *m_isFisrtCurve_curP = false;
    }
    else
    {
        if(*m_max_y_curP < max_y)
        {
            *m_max_y_curP = max_y;
        }
        if(*m_min_y_curP > min_y)
        {
            *m_min_y_curP = min_y;
        }
    }
    if(m_max_dateTime < max_x)
    {
        m_max_dateTime = max_x;
    }
    if(m_min_dateTime > min_x)
    {
        m_min_dateTime = min_x;
    }
//    PSV_Public::printMes(max_y_pointX,"max_y_pointX");
//    PSV_Public::printMes(min_y_pointX,"min_y_pointX");
    m_max_x = m_max_dateTime;
    m_min_x = m_min_dateTime;
//    PSV_Public::printMes(m_max_x,"m_max_x");
//    PSV_Public::printMes(m_min_x,"m_min_x");
    //======================================
    QString dateForm = curveInfo.m_dataType == PSV::E_DATATYPE_DATETIME ? "yyyy-MM-dd hh:mm:ss" : "yyyy-MM-dd";
    double avg_y = sum / data.count();
    QStringList textList;
    int dml = decimal();
    textList.append(QString("%1:").arg(curveName));
    textList.append(QString(" %1:(%2,%3)").arg(QString::fromLocal8Bit("最大值"))
                    .arg(max_y_pointX.toString(dateForm))
                    .arg(QString::number(max_y,'f',dml)));

    textList.append(QString(" %1:(%2,%3)")
                    .arg(QString::fromLocal8Bit("最小值"))
                    .arg(min_y_pointX.toString(dateForm))
                    .arg(QString::number(min_y,'f',dml)));
    textList.append(QString(" %1:%2")
                    .arg(QString::fromLocal8Bit("平均值"))
                    .arg(QString::number(avg_y,'f',dml)));

    QString staHtmText = PSV_Public::getStaText(textList/*,m_staFont*/);
    curveInfo.m_staHtmText = staHtmText;
    curveInfo.m_staText = textList.join("");
    //======================================
    curveInfo.m_curveDataMap = curveData;
    m_curveDataMap.insert(curveName,curveInfo);
    if(curveParam.m_isUpdate)
    {
        if(isChangedY || isChangedX)
        {
//            PSV_Public::printMes("19refreshItem");
            refreshItem();
        }
    }
    return true;
}