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; }
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; }
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; }
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; }