#include "qmycustomplot.h" #include "CallManage.h" #include "geometryutils.h" QMyCustomPlot::QMyCustomPlot(QWidget *parent, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName) : QCustomPlot(parent) { m_strSlfName = strSlfName; m_strWellName = strWellName; m_strTrackName = strTrackName; m_strLineName = strLineName; setObjectName("QMyCustomPlot"); //this->setOpenGl(true); xAxis->setTickLabels(false); yAxis->setTickLabels(false); // xAxis2->setTickLabels(false); yAxis2->setTickLabels(false); // make bottom and left axes transfer their ranges to top and right axes: connect(xAxis, SIGNAL(rangeChanged(QCPRange)), xAxis2, SLOT(setRange(QCPRange))); connect(yAxis, SIGNAL(rangeChanged(QCPRange)), yAxis2, SLOT(setRange(QCPRange))); //关联信号槽 //左刻度 connect(CallManage::getInstance(), SIGNAL(sig_ChangeLeftScale(QString, QString, QString, QString, double)), this, SLOT(s_ChangeLeftScale(QString, QString, QString, QString, double))); //右刻度 connect(CallManage::getInstance(), SIGNAL(sig_ChangeRightScale(QString, QString, QString, QString, double)), this, SLOT(s_ChangeRightScale(QString, QString, QString, QString, double))); connect(CallManage::getInstance(), SIGNAL(sig_Raise(QString, QString, QString, QString)), this, SLOT(s_Raise(QString, QString, QString, QString))); //颜色 connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineColor(QString, QString, QString, QString, QColor)), this, SLOT(s_ChangeLineColor(QString, QString, QString, QString, QColor))); //线宽 connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineWidth(QString, QString, QString, QString, double)), this, SLOT(s_ChangeLineWidth(QString, QString, QString, QString, double))); //线型 connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineStyle(QString, QString, QString, QString, Qt::PenStyle)), this, SLOT(s_ChangeLineStyle(QString, QString, QString, QString, Qt::PenStyle))); //岩性填充-不填充 connect(CallManage::getInstance(), SIGNAL(sig_ClearFillMode(QString, QString, QString, QString)), this, SLOT(s_ClearFillMode(QString, QString, QString, QString))); //岩性填充-填充 connect(CallManage::getInstance(), SIGNAL(sig_ChangeFillMode(QString, QString, QString, QString, QString, QString, QColor, QString, QString, float, float)), this, SLOT(s_ChangeFillMode(QString, QString, QString, QString, QString, QString, QColor, QString, QString, float, float))); } void QMyCustomPlot::init(QString strName, QVector xx, QVector yy0) { //raise(); //置于上层显示 } void QMyCustomPlot::mousePressEvent(QMouseEvent *event) { qDebug() << "mousePress"; QCustomPlot::mousePressEvent(event); } //槽函数,选中曲线 void QMyCustomPlot::s_LineClicked(int index) { // qDebug() << "s_LineClicked"; // //全部取消选中 // deselectAll(); // //重新选中 // QCPGraph *graph = this->graph(index); // if (graph) // { // //qDebug() << "s_LineClicked graph"; // graph->setSelection(QCPDataSelection(graph->data()->dataRange())); // QCPPlottableLegendItem *item = legend->itemWithPlottable(graph); // if (item) // { // //qDebug() << "s_LineClicked item"; // //仅显示当前被选中的曲线 // item->setSelected(true); // replot(); // } // } } void QMyCustomPlot::contextMenuEvent(QContextMenuEvent *event) { QMenu menu(this); QAction *resetAction = menu.addAction("添加框图"); m_event = event; connect(resetAction, &QAction::triggered, this, &QMyCustomPlot::onAddRect); // if (selectedGraphs().size() > 0)//选中曲线 // { // menu.addAction("删除选中曲线", this, SLOT(removeSelectedGraph())); // } menu.exec(event->globalPos()); } void QMyCustomPlot::onAddRect() { double right_Hight = xAxis->pixelToCoord(m_event->pos().y());//x轴展示深度 double left_Low = right_Hight-5; //添加图形 emit CallManage::getInstance()->sig_addImageToPlot(this, left_Low, right_Hight, ":/image/file.png"); } void QMyCustomPlot::onResetZoom() { // //rescaleAxes(); // //x,y互换 // yAxis->setRange(m_iX1, m_iX2); // xAxis->setRange(m_iY1, m_iY2); // // // replot(); } void QMyCustomPlot::removeSelectedGraph() { // if (selectedGraphs().size() > 0) // { // QString strLineName = selectedGraphs().first()->name(); // qDebug() << "removeSelectedGraph name=" << strLineName; // removeGraph(selectedGraphs().first()); // replot(); // //emit CallManage::getInstance()->sig_DelCurve(m_indexID, strLineName); // } } void QMyCustomPlot::removeSelectedGraphByTitle() { // if (selectedGraphs().size() > 0) // { // QString strLineName = selectedGraphs().first()->name(); // qDebug() << "removeSelectedGraph name=" << strLineName; // removeGraph(selectedGraphs().first()); // replot(); // emit CallManage::getInstance()->sig_DelCurve(m_indexID, strLineName); // } } void QMyCustomPlot::s_Raise(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName) { if(m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { raise(); } } //属性-左刻度 void QMyCustomPlot::s_ChangeLeftScale(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double newLeftScale) { if(m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_iX1 = newLeftScale; yAxis->setRange(m_iX1, m_iX2); // replot(); } else if(m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_newTargetLine == strLineName) { //其他曲线 s_ChangeFillMode(m_strSlfName, m_strWellName, m_strTrackName, m_strLineName, m_newFillType, m_newTargetLine, m_newColor, m_newLithosImage, m_newHeadFill, newLeftScale, m_vMax); } } //属性-右刻度 void QMyCustomPlot::s_ChangeRightScale(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double newRightScale) { if(m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { m_iX2 = newRightScale; yAxis->setRange(m_iX1, m_iX2); // replot(); } else if(m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_newTargetLine == strLineName) { //其他曲线 s_ChangeFillMode(m_strSlfName, m_strWellName, m_strTrackName, m_strLineName, m_newFillType, m_newTargetLine, m_newColor, m_newLithosImage, m_newHeadFill, m_vMin, newRightScale); } } //属性-颜色 void QMyCustomPlot::s_ChangeLineColor(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QColor lineColor) { if(m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { QPen pen = this->graph(0)->pen(); pen.setColor(lineColor); graph(0)->setPen(pen); // replot(); } } //属性-线宽 void QMyCustomPlot::s_ChangeLineWidth(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double width) { if(m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { QPen pen = this->graph(0)->pen(); pen.setWidthF(width); graph(0)->setPen(pen); // replot(); } } //属性-线型 void QMyCustomPlot::s_ChangeLineStyle(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, Qt::PenStyle lineStyle) { if(m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { QPen pen = this->graph(0)->pen(); pen.setStyle(lineStyle); graph(0)->setPen(pen); // replot(); } } //岩性填充-不填充 void QMyCustomPlot::s_ClearFillMode(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName) { if(m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { //清空填充 if(this->graphCount() > 1) { this->removeGraph(1); } graph(0)->setBrush(Qt::NoBrush); // replot(); } } //岩性填充-填充 void QMyCustomPlot::s_ChangeFillMode(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QString newFillType, QString newTargetLine, QColor newColor, QString newLithosImage, QString newHeadFill, float vMin, float vMax) { if(m_strSlfName == strSlfName && m_strWellName == strWellName && m_strTrackName == strTrackName && m_strLineName == strLineName) { //其他曲线 m_newFillType = newFillType; m_newTargetLine = newTargetLine; m_newColor = newColor; m_newLithosImage = newLithosImage; m_newHeadFill = newHeadFill; m_vMin = vMin; m_vMax = vMax; //填充 if(this->graphCount() > 1) { this->removeGraph(1); } //graph(1) QVector x, y; if(newTargetLine=="左界道") { this->addGraph(); x.append(m_iY1); y.append(m_iX1); // x.append(m_iY2); y.append(m_iX1); } else if(newTargetLine=="右界道") { this->addGraph(); x.append(m_iY1); y.append(m_iX2); // x.append(m_iY2); y.append(m_iX2); } else if(newTargetLine=="对称线") { this->addGraph(); CLogIO *logio=new CLogIO(); logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead); int index=logio->OpenCurve(strLineName.toStdString().c_str()); if(index<0) { delete logio; } else { Slf_CURVE curveinfo; float *val; float sdep,edep,rlev; float vmax,vmin; // logio->GetCurveInfo(index,&curveinfo); sdep=curveinfo.StartDepth; edep=curveinfo.EndDepth; rlev=curveinfo.DepLevel; // int count=(curveinfo.EndDepth-curveinfo.StartDepth)/curveinfo.DepLevel+1.5; val=new float[count]; logio->ReadCurve(index,curveinfo.StartDepth,count,&val[0]); logio->CloseCurve(index); delete logio; for(int i=0; iOpen(strSlfName.toStdString().c_str(),CSlfIO::modeRead); int index=logio->OpenCurve(newTargetLine.toStdString().c_str()); if(index<0) { this->addGraph(); delete logio; } else { Slf_CURVE curveinfo; float *val; float sdep,edep,rlev; // logio->GetCurveInfo(index,&curveinfo); sdep=curveinfo.StartDepth; edep=curveinfo.EndDepth; rlev=curveinfo.DepLevel; // int count=(curveinfo.EndDepth-curveinfo.StartDepth)/curveinfo.DepLevel+1.5; val=new float[count]; logio->ReadCurve(index,curveinfo.StartDepth,count,&val[0]); logio->CloseCurve(index); delete logio; float newVal = 0.0; for(int i=0; iyAxis2->setRange(m_iY1, m_iY2); this->xAxis2->setRange(vMin, vMax); this->addGraph(yAxis2, xAxis2); } } this->graph(1)->setData(x, y); graph(1)->setLineStyle(graph(0)->lineStyle());//曲线 graph(1)->setScatterStyle(graph(0)->scatterStyle()); graph(1)->setPen(QColor(0, 0, 0));//(graph(0)->pen()); // if(newFillType == "岩性模式") { graph(0)->setBrush(QBrush(QPixmap(newLithosImage))); //graph(0)->setBrush(QBrush(QPixmap(":/image/file.png"))); } else if(newFillType == "颜色模式") { graph(0)->setBrush(QBrush(newColor)); } else if(newFillType == "成像化") { } graph(0)->setChannelFillGraph( this->graph(1)); // replot(); } } void QMyCustomPlot::mouseMoveEvent(QMouseEvent *event) { // 当前鼠标位置(像素坐标) //int x_pos = event->pos().x(); int y_pos = event->pos().y(); // 像素坐标转成实际的x,y轴的坐标 //float x_val = yAxis->pixelToCoord(x_pos); float y_val = xAxis->pixelToCoord(y_pos); emit CallManage::getInstance()->sig_MouseMove(m_strWellName, m_strTrackName, 0-y_val); QCustomPlot::mouseMoveEvent(event); }