logplus/logPlus/qmycustomplot.cpp
2025-10-30 11:55:37 +08:00

457 lines
14 KiB
C++

#include "qmycustomplot.h"
#include "CallManage.h"
#include "geometryutils.h"
#include "TransparentDraggableRect.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<double> xx, QVector<double> 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");
addImageToPlot(left_Low, right_Hight, ":/image/file.png");
}
void QMyCustomPlot::addImageToPlot(double left_Low, double right_Hight, const QString imagePath)
{
// 在初始化代码中
TransparentDraggableRect *dragRect = new TransparentDraggableRect(this);
// 设置初始范围
dragRect->setRange(left_Low, right_Hight);
// 可选:设置颜色
dragRect->setColor(QColor(255, 100, 100, 80)); // 半透明红色
//最小宽度
dragRect->setMinWidth(5);
}
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<double> 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; i<count; i++)
{
x.append(-(sdep+ rlev*i));
y.append(m_iX1+m_iX2-val[i]);
}
}
}
else
{
//其他曲线
CLogIO *logio=new CLogIO();
logio->Open(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; i<count; i++)
{
x.append(-(sdep+ rlev*i));
//newVal = (m_iX2-m_iX1)*(val[i]-vMin)/(vMax-vMin) + m_iX1;
newVal = val[i];
y.append(newVal);
}
this->yAxis2->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);
}