4243 lines
139 KiB
C++
4243 lines
139 KiB
C++
#include "qmycustomplot.h"
|
||
#include "CallManage.h"
|
||
#include "geometryutils.h"
|
||
#include "TransparentDraggableRect.h"
|
||
#include "TransparentGroupResult.h"
|
||
#include "TransparentDraggableResult.h"
|
||
#include "TransparentDraggableGeoLith.h"
|
||
#include "TransparentDraggableSwallCore.h"
|
||
#include "TransparentDraggableGujing.h"
|
||
#include "transparentdraggableimage.h"
|
||
#include "TransparentDraggableJiegutext.h"
|
||
#include "TransparentDraggableMFac.h"
|
||
#include "TransparentDraggablePhase.h"
|
||
#include "TransparentDraggableFac.h"
|
||
#include "transparentdraggableGuan.h"
|
||
#include "TransparentDraggableLine.h"
|
||
#include "transparentdraggableSelectRect.h"
|
||
#include "transparentdraggableRightList.h"
|
||
#include "qtcommonclass.h"
|
||
#include "slf.h"
|
||
#include "MemRdWt.h"
|
||
#include "PropertyWidget.h"
|
||
|
||
//是否隐藏刻度
|
||
extern int g_iShow;
|
||
extern double g_dPixelPerCm;//每厘米像素数
|
||
|
||
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;
|
||
|
||
mSizeHandleManager = new QCPSizeHandleManager(this);
|
||
|
||
setObjectName("QMyCustomPlot");
|
||
//this->setOpenGl(true);//不开启,电脑不支持会卡
|
||
// this->setNotAntialiasedElements(QCP::aeAll); // 关闭所有抗锯齿
|
||
m_newColor = Qt::black;
|
||
// 开启抗锯齿
|
||
this->setAntialiasedElement(QCP::aeAll);
|
||
|
||
//背景设置成透明色
|
||
this->setBackground(Qt::transparent);
|
||
this->setStyleSheet("background: transparent;");
|
||
|
||
//jyl
|
||
if(g_iShow==1)
|
||
{
|
||
yAxis->setTickLabels(true);
|
||
}
|
||
else
|
||
{
|
||
//隐藏刻度
|
||
yAxis->setTickLabels(false);
|
||
}
|
||
//
|
||
xAxis->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(this, SIGNAL(afterReplot()), this, SLOT(drawCustomElements()));
|
||
|
||
//关联信号槽
|
||
//左刻度
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeLeftScale(QString, QString, QString, QString, QString, double)), this, SLOT(s_ChangeLeftScale(QString, QString, QString, QString, QString, double)));
|
||
//右刻度
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeRightScale(QString, QString, QString, QString, QString, double)), this, SLOT(s_ChangeRightScale(QString, QString, QString, QString, QString, double)));
|
||
//刻度类型
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeScaleType(QString, QString, QString, QString, QString, QString)), this, SLOT(s_ChangeScaleType(QString, QString, QString, QString, QString, QString)));
|
||
|
||
//曲线选中,置顶
|
||
connect(CallManage::getInstance(), SIGNAL(sig_Raise(QString, QString, QString, QString, QString, int, QString)), this, SLOT(s_Raise(QString, QString, QString, QString, QString, int, QString)));
|
||
//颜色
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineColor(QString, QString, QString, QString, QString, QColor)), this, SLOT(s_ChangeLineColor(QString, QString, QString, QString, QString, QColor)));
|
||
//线宽
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineWidth(QString, QString, QString, QString, QString, double)), this, SLOT(s_ChangeLineWidth(QString, QString, QString, QString, QString, double)));
|
||
//线型
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineStyle(QString, QString, QString, QString, QString, Qt::PenStyle)), this, SLOT(s_ChangeLineStyle(QString, QString, QString, QString, QString, Qt::PenStyle)));
|
||
|
||
//绘制方式
|
||
//曲线
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeDrawLine(QString, QString, QString, QString, QString, bool)), this, SLOT(s_ChangeDrawLine(QString, QString, QString, QString, QString, bool)));
|
||
//杆状
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeDrawGan(QString, QString, QString, QString, QString, bool)), this, SLOT(s_ChangeDrawGan(QString, QString, QString, QString, QString, bool)));
|
||
//点状
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeDrawPoint(QString, QString, QString, QString, QString, bool)), this, SLOT(s_ChangeDrawPoint(QString, QString, QString, QString, QString, bool)));
|
||
//绘制对称曲线
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeDrawSymmetry(QString, QString, QString, QString, QString, bool)), this, SLOT(s_ChangeDrawSymmetry(QString, QString, QString, QString, QString, bool)));
|
||
|
||
//岩性填充-不填充
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ClearFillMode(QString, QString, QString, QString, QString)), this, SLOT(s_ClearFillMode(QString, QString, QString, QString, QString)));
|
||
//岩性填充-填充
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ChangeFillMode(QString, QString, QString, QString, QString, QString, QString, QColor, QString, QString, float, float, QString , QColor, QColor, QString, bool)),
|
||
this, SLOT(s_ChangeFillMode(QString, QString, QString, QString, QString, QString, QString, QColor, QString, QString, float, float, QString, QColor, QColor, QString, bool)));
|
||
//添加校深线段
|
||
connect(CallManage::getInstance(), SIGNAL(sig_AddShifLineToPlot(QString, QString, QString, QString, QString, double, double)), this, SLOT(s_AddShifLineToPlot(QString, QString, QString, QString, QString, double, double)));
|
||
//清除当前分段线
|
||
connect(CallManage::getInstance(), SIGNAL(sig_DelSelectShiftLineFromPlot(QString, QString, QString, QString, QString)), this, SLOT(s_DelSelectShiftLineFromPlot(QString, QString, QString, QString, QString)));
|
||
//清除全部分段线
|
||
connect(CallManage::getInstance(), SIGNAL(sig_DelAllShiftLineFromPlot(QString, QString, QString, QString, QString)), this, SLOT(s_DelAllShiftLineFromPlot(QString, QString, QString, QString, QString)));
|
||
|
||
//执行校正
|
||
connect(CallManage::getInstance(), SIGNAL(sig_RuncorFromPlot(QString, QString, QString, QString, QString)), this, SLOT(s_RuncorFromPlot(QString, QString, QString, QString, QString)));
|
||
//执行拼接
|
||
connect(CallManage::getInstance(), SIGNAL(sig_MergeFromPlot(QString, QString, QString, QString, QString)), this, SLOT(s_MergeFromPlot(QString, QString, QString, QString, QString)));
|
||
//执行预览
|
||
connect(CallManage::getInstance(), SIGNAL(sig_PreMergeFromPlot(QString, QString, QString, QString, QString)), this, SLOT(s_PreMergeFromPlot(QString, QString, QString, QString, QString)));
|
||
//采用右侧数据,执行预览
|
||
connect(CallManage::getInstance(), SIGNAL(sig_PreMerge_FromRightList(QString, QString, QString, QString, QString, QList<double>, QList<double>)), this, SLOT(s_PreMerge_FromRightList(QString, QString, QString, QString, QString, QList<double>, QList<double>)));
|
||
//关闭预览框
|
||
connect(CallManage::getInstance(), SIGNAL(sig_PreMerge_Close(QString, QString, QString, QString, QString)), this, SLOT(s_PreMerge_Close(QString, QString, QString, QString, QString)));
|
||
|
||
//Plot重新加载数据
|
||
connect(CallManage::getInstance(), SIGNAL(sig_ReloadPlot(QString, QString, QString)), this, SLOT(s_ReloadPlot(QString, QString, QString)));
|
||
|
||
connect(CallManage::getInstance(), SIGNAL(sig_changeDrawProperty(QVariantList)), this, SLOT(s_changeDrawProperty(QVariantList)));
|
||
}
|
||
|
||
void QMyCustomPlot::initGeometry(QString strUuid, int nscale, int nW)
|
||
{
|
||
this->m_strUuid = strUuid;
|
||
|
||
double dHight = (m_iY2 - m_iY1)*100.0 / (double)nscale * g_dPixelPerCm;
|
||
if (g_iShow == 1)
|
||
{
|
||
//显示刻度
|
||
dHight = dHight + 30;
|
||
}
|
||
|
||
qDebug() << "FormDraw dHight=" << QString::number((int)dHight);
|
||
if (dHight > 32767)
|
||
{
|
||
dHight = 32767;
|
||
}
|
||
|
||
//curv->setMaximumHeight((int)dHight);
|
||
//curv->setViewport(QRect(0, 0, g_iOneWidth, (int)dHight));//7500-3184
|
||
this->setGeometry(0, 0, nW, (int)dHight);//7500-3184
|
||
}
|
||
|
||
void QMyCustomPlot::changePropertyWaveUpdate()
|
||
{
|
||
if (m_nDrawType == 0 || m_nDrawType == 1)
|
||
{
|
||
if (this->m_colorMap)
|
||
this->m_colorMap->setVisible(false);
|
||
|
||
clearGraphs();
|
||
clearItems();
|
||
|
||
if (this->m_colorMap && this->m_bX2Y)
|
||
{
|
||
QCPAxis *yAxis = this->yAxis;
|
||
QCPAxis *xAxis = this->xAxis;
|
||
this->xAxis = yAxis;
|
||
this->yAxis = xAxis;
|
||
this->m_bX2Y = false;
|
||
}
|
||
this->initWave2(m_strSlfName, m_strLineName);
|
||
}
|
||
else if (m_nDrawType == 2)
|
||
{
|
||
if (this->m_colorMap)
|
||
this->m_colorMap->setVisible(true);
|
||
clearGraphs();
|
||
clearItems();
|
||
|
||
this->m_bX2Y = true;
|
||
this->initWave(m_strSlfName, m_strLineName);
|
||
}
|
||
}
|
||
|
||
void QMyCustomPlot::initWave(QString strSlfName, QString strWaveName)
|
||
{
|
||
CLogIO *logio = new CLogIO();
|
||
logio->Open(strSlfName.toStdString().c_str(), CSlfIO::modeRead);
|
||
//
|
||
int index = logio->OpenWave(strWaveName.toStdString().c_str());
|
||
if (index < 0) {
|
||
delete logio;
|
||
return;
|
||
}
|
||
|
||
QMyCustomPlot* widget = this;
|
||
Slf_WAVE _wave;
|
||
logio->GetWaveInfo(index, &_wave);
|
||
float _SDep, _EDep, _Rlev;
|
||
_SDep = _wave.StartDepth;
|
||
_EDep = _wave.EndDepth;
|
||
// _SDep = 0.0 - m_iY2;
|
||
// _EDep = 0.0 - m_iY1;
|
||
_Rlev = _wave.DepLevel;
|
||
int m_Record = (float)(fabs((_EDep - _SDep) / _Rlev + 0.5));
|
||
|
||
int _nSamples = _wave.TimeSamples;
|
||
if (m_fScaleV <= 0.0f)
|
||
m_fScaleV = _nSamples;
|
||
char *value = new char[(_nSamples + 1)*m_Record*_wave.CodeLen + 1];
|
||
logio->ReadWave(index, _SDep, m_Record, (void *)value);
|
||
logio->CloseWave(index);
|
||
delete logio;
|
||
|
||
bool bFistValue = false;
|
||
float vmax = -9999;//(float)_nSamples;
|
||
float vmin = -9999;
|
||
//
|
||
double** wavedata = widget->getWavedata(_nSamples, m_Record);
|
||
//wavedata = new double*[_nSamples];
|
||
//for(int kk = 0;kk<_nSamples;kk++){
|
||
// wavedata[kk] = new double[m_Record];
|
||
//}
|
||
|
||
for (int i = 0; i < m_Record; i++)
|
||
{
|
||
for (int kk = 0; kk < _nSamples; kk++)
|
||
{
|
||
double val = GetData(_wave.RepCode, (char *)&value[(kk)*_wave.CodeLen + i * _nSamples*_wave.CodeLen]);
|
||
wavedata[kk][i] = val;
|
||
if (val == -9999)
|
||
{
|
||
continue;
|
||
}
|
||
if (bFistValue == false)
|
||
{
|
||
//最大值,最小值默认采用第一个有效值
|
||
bFistValue = true;
|
||
vmax = vmin = val;
|
||
}
|
||
//
|
||
if (vmax < val)vmax = val;
|
||
if (vmin > val)vmin = val;
|
||
}
|
||
}
|
||
delete[] value;
|
||
|
||
// m_iY1 = 0.0 -_EDep;
|
||
// m_iY2 = 0.0 -_SDep;
|
||
//------------------------
|
||
widget->m_iY1 = m_iY1;
|
||
widget->m_iY2 = m_iY2;
|
||
//
|
||
widget->xAxis->setRange(vmin, vmax);
|
||
widget->yAxis->setRange(m_iY1, m_iY2);
|
||
widget->axisRect()->setupFullAxesBox();
|
||
//
|
||
widget->xAxis->ticker()->setTickCount(10);//x个主刻度
|
||
widget->yAxis->ticker()->setTickCount(60);//y个主刻度
|
||
|
||
widget->xAxis->setTicks(false);
|
||
widget->yAxis->setTicks(false);
|
||
widget->xAxis2->setTicks(false);
|
||
widget->yAxis2->setTicks(false);
|
||
|
||
//对调XY轴,在最前面设置
|
||
QCPAxis *yAxis = widget->yAxis;
|
||
QCPAxis *xAxis = widget->xAxis;
|
||
widget->xAxis = yAxis;
|
||
widget->yAxis = xAxis;
|
||
|
||
widget->m_fmin = vmin;
|
||
widget->m_fmax = vmax;
|
||
|
||
//-------------------
|
||
// set up the QCPColorMap:
|
||
if (widget->m_colorMap == NULL)
|
||
{
|
||
QCPColorMap *colorMap = new QCPColorMap(widget->xAxis, widget->yAxis);
|
||
widget->m_colorMap = colorMap;
|
||
|
||
int nx = m_Record;
|
||
int ny = _nSamples;
|
||
colorMap->data()->setSize(nx, ny); // 我们希望彩色地图有nx*ny的数据点
|
||
//colorMap->data()->setRange(QCPRange(m_iY1, m_iY2), QCPRange(vmin, vmax)); // 并在键(x)和值(y)维上跨越坐标范围-4..4
|
||
colorMap->data()->setRange(QCPRange(0 - _EDep, 0 - _SDep), QCPRange(vmin, vmax));
|
||
// :现在,我们通过访问颜色贴图的QCPColorMapData实例来分配一些数据:
|
||
this->updateWave();
|
||
|
||
// 添加色标:
|
||
QCPColorScale *colorScale = new QCPColorScale(widget);
|
||
colorMap->setColorScale(colorScale); // 将颜色图与色标关联
|
||
// 重新缩放数据维度(颜色),以使所有数据点都位于颜色渐变显示的范围内:
|
||
colorMap->rescaleDataRange();
|
||
|
||
this->setSchemeIndex(m_nSchemeIndex, m_nColorNum);
|
||
}
|
||
else
|
||
{
|
||
this->updateWave();
|
||
}
|
||
}
|
||
|
||
void QMyCustomPlot::initWave2(QString strSlfName, QString strWaveName)
|
||
{
|
||
QMyCustomPlot* widget = this;
|
||
CLogIO *logio = new CLogIO();
|
||
logio->Open(strSlfName.toStdString().c_str(), CSlfIO::modeRead);
|
||
//
|
||
int index = logio->OpenWave(strWaveName.toStdString().c_str());
|
||
if (index < 0) {
|
||
delete logio;
|
||
return;
|
||
}
|
||
|
||
float vmax = 264;// (float)_nSamples;
|
||
float vmin = 0;
|
||
|
||
//widget->m_iX1 = vmin;
|
||
//widget->m_iX2 = vmax;
|
||
//
|
||
widget->xAxis->setRange(vmin, vmax);
|
||
widget->yAxis->setRange(m_iY1, m_iY2);
|
||
widget->axisRect()->setupFullAxesBox();
|
||
//
|
||
widget->xAxis->setTicks(false);
|
||
widget->yAxis->setTicks(false);
|
||
widget->xAxis2->setTicks(false);
|
||
widget->yAxis2->setTicks(false);
|
||
|
||
//注意,不对调XY轴
|
||
widget->m_bX2Y = false;
|
||
|
||
Slf_WAVE _wave;
|
||
logio->GetWaveInfo(index, &_wave);
|
||
|
||
float m_SDep = _wave.StartDepth;
|
||
float m_EDep = _wave.EndDepth;
|
||
float m_Rlev = _wave.DepLevel;
|
||
int m_Record = (float)(fabs((m_EDep - m_SDep) / m_Rlev + 0.5));
|
||
int _nSamples = _wave.TimeSamples;
|
||
|
||
char *value = new char[(_nSamples + 1)*m_Record*_wave.CodeLen + 1];
|
||
logio->ReadWave(index, m_SDep, m_Record, (void *)value);
|
||
logio->CloseWave(index);
|
||
delete logio;
|
||
|
||
MyDataTypeEnum vVdl;
|
||
int lpoint = 0;
|
||
int nPoint = _nSamples;
|
||
float detp = -m_iY2;
|
||
float edepc = -m_iY1;
|
||
float m_PlotSdep = -m_iY2;
|
||
float m_MoveDep = 0.0f;
|
||
float DifBase = (m_MaxRange - m_Base) / 1;
|
||
float yscale = m_nWaveHei;
|
||
yscale = yscale / DifBase;
|
||
|
||
int nStep = m_nWaveJg;// mWaveMes.m_WaveSpace;
|
||
if (m_nWaveJg < 10)
|
||
nStep = 10;
|
||
|
||
if (nStep < 1) nStep = 1;
|
||
float m_r = m_Rlev * nStep;
|
||
detp = int((detp - m_PlotSdep) / m_r)*m_r + m_PlotSdep;
|
||
|
||
int nOdd = 0;
|
||
int nidx = 0;
|
||
for (float dep1 = detp - m_r; dep1 < edepc + m_MoveDep + m_r; dep1 += m_r)
|
||
{
|
||
if (dep1 >= m_EDep || dep1 + m_r < m_SDep)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
int iIndex = Slf_Int(dep1 + m_MoveDep, m_SDep, m_Rlev);
|
||
if (iIndex < 0) {
|
||
continue;
|
||
}
|
||
|
||
QVector<float> vals;
|
||
if (iIndex < 0 || iIndex >= m_Record)
|
||
continue;
|
||
|
||
vals.resize(nPoint);
|
||
vVdl.vchar = &((char *)value)[iIndex*_nSamples*_wave.CodeLen];
|
||
|
||
for (int i = 0; i < nPoint; i++)
|
||
{
|
||
float ch = 0.0f;
|
||
if (i + lpoint < 0)
|
||
ch = 0;
|
||
else if (i + lpoint < _nSamples) {
|
||
if (_wave.RepCode == REPR_CHAR) {
|
||
ch = vVdl.vchar[i + lpoint];
|
||
}
|
||
else if (_wave.RepCode == REPR_UCHAR) {
|
||
ch = vVdl.vuchar[i + lpoint];
|
||
}
|
||
else if (_wave.RepCode == REPR_SHORT) {
|
||
ch = vVdl.vshort[i + lpoint];
|
||
if (ch == -32767) ch = 0;
|
||
}
|
||
else if (_wave.RepCode == REPR_USHORT) {
|
||
ch = vVdl.vushort[i + lpoint];
|
||
if ((short)ch == -32767) ch = 0;
|
||
}
|
||
else if (_wave.RepCode == REPR_FLOAT) {
|
||
ch = vVdl.vfloat[i + lpoint];
|
||
}
|
||
else
|
||
ch = GetData(_wave.RepCode, (char *)&vVdl.vchar[(i + lpoint)*_wave.CodeLen]);
|
||
if (ch == -9999.0 || ch == -99999.0 || ch == -999.25)
|
||
ch = 0;
|
||
}
|
||
else ch = 0;
|
||
vals[i] = ch;
|
||
}
|
||
|
||
QVector<double> vx;
|
||
QVector<double> vy;
|
||
double dminy = 0.0;
|
||
for (int i = 0; i < nPoint; i++)
|
||
{
|
||
vx << i;
|
||
|
||
double d = (-dep1 - 1) + vals[i] * yscale;
|
||
vy << d;
|
||
if (d < dminy)
|
||
dminy = d;
|
||
}
|
||
|
||
QCPGraph * graph0 = widget->graph(nidx);
|
||
if (graph0 == NULL)
|
||
{
|
||
graph0 = widget->addGraph();
|
||
graph0->setPen(QPen(m_newColor));
|
||
}
|
||
if (m_nDrawType == 0 && m_bOddEven) // 波形&&奇偶配色
|
||
{
|
||
if (nOdd % 2 == 1)
|
||
graph0->setPen(QPen(QColor(255, 0, 0)));
|
||
}
|
||
graph0->setData(vx, vy);
|
||
|
||
if (m_bDrawDepth)
|
||
{
|
||
QCPItemText* pText = new QCPItemText(this);
|
||
pText->setText(QString::number(dminy*-1, 'f', 2));
|
||
pText->position->setCoords(30, dminy);
|
||
if (m_bOddEven && nOdd % 2 == 1)
|
||
pText->setColor(QColor(255, 0, 0));
|
||
else
|
||
pText->setColor(m_newColor);
|
||
}
|
||
//graph->setBrush(QBrush(QColor(255, 0, 0, 100)));
|
||
nidx++;
|
||
|
||
if (m_bDrawBase || m_nDrawType == 1) // 填充 || 绘制波基线
|
||
{
|
||
QCPGraph * graph1 = widget->graph(nidx);
|
||
if (graph1 == NULL)
|
||
{
|
||
graph1 = widget->addGraph();
|
||
graph1->setPen(QPen(m_newColor));
|
||
}
|
||
if (m_bOddEven && nOdd % 2 == 1)
|
||
graph1->setPen(QPen(QColor(255, 0, 0)));
|
||
double dx1 = vx[0];
|
||
double dx2 = vx[vx.size() - 1];
|
||
vx.clear();
|
||
vx << dx1 << dx2;
|
||
vy.clear();
|
||
vy << dminy << dminy;
|
||
graph1->setData(vx, vy);
|
||
nidx++;
|
||
if (m_nDrawType == 1)
|
||
{
|
||
graph0->setBrush(QBrush(m_newColor));
|
||
graph0->setChannelFillGraph(graph1);
|
||
}
|
||
}
|
||
|
||
nOdd++;
|
||
}
|
||
widget->replot();
|
||
|
||
delete[]value;
|
||
}
|
||
|
||
void QMyCustomPlot::initColorTable()
|
||
{
|
||
this->setSchemeIndex(m_nSchemeIndex, m_nColorNum);
|
||
}
|
||
|
||
void QMyCustomPlot::setSchemeIndex(int nidx, int colorNum)
|
||
{
|
||
if (m_colorMap == NULL)
|
||
return;
|
||
|
||
m_nSchemeIndex = nidx;
|
||
m_nColorNum = colorNum;
|
||
|
||
QtColorTableData::getInstance()->SetCurrentSchemeIndex(nidx);
|
||
//ColorTableIndex = ind;
|
||
|
||
QtColorTableData::getInstance()->ChangeColorNum(colorNum);
|
||
QList<QRgb> rgbList = QtColorTableData::getInstance()->GetRgb();
|
||
|
||
int iColorNum = rgbList.size();
|
||
QCPColorGradient gradient;
|
||
for (int i = 0; i < iColorNum; i++)
|
||
{
|
||
QColor acolor = rgbList.at(i);
|
||
double dbTmpIndex = (double)(i) / iColorNum;
|
||
gradient.setColorStopAt(dbTmpIndex, acolor); // x% 位置的颜色
|
||
//mWaveMes.m_ColorMessage.Color[i] = acolor;
|
||
}
|
||
|
||
m_colorMap->setGradient(gradient);
|
||
}
|
||
|
||
double** QMyCustomPlot::getWavedata(int nrow, int ncol)
|
||
{
|
||
if (nrow > 0 && m_wavedata)
|
||
{
|
||
for (int i = 0; i < m_nRow; i++)
|
||
{
|
||
if (m_wavedata[i])
|
||
{
|
||
delete[] m_wavedata[i];
|
||
}
|
||
}
|
||
delete[] m_wavedata;
|
||
m_wavedata = NULL;
|
||
}
|
||
m_nRow = nrow;
|
||
m_nCol = ncol;
|
||
m_wavedata = new double*[nrow];
|
||
for (int kk = 0; kk < nrow; kk++) {
|
||
m_wavedata[kk] = new double[ncol];
|
||
}
|
||
return m_wavedata;
|
||
}
|
||
|
||
QCPColorMap * QMyCustomPlot::updateWave()
|
||
{
|
||
int nx = m_nCol;
|
||
int ny = m_nRow;
|
||
|
||
// :现在,我们通过访问颜色贴图的QCPColorMapData实例来分配一些数据:
|
||
double x, y, z;
|
||
for (int xIndex = 0; xIndex < nx; ++xIndex)
|
||
{
|
||
for (int yIndex = 0; yIndex < ny; ++yIndex)
|
||
{
|
||
double dz = m_wavedata[yIndex][xIndex];
|
||
if (m_nMode == 0)
|
||
{
|
||
if (m_wavedata[yIndex][xIndex] == -9999)
|
||
{
|
||
dz = m_fmax;
|
||
}
|
||
}
|
||
else if (m_nMode == 1)
|
||
{
|
||
if (m_wavedata[yIndex][xIndex] == -9999)
|
||
{
|
||
dz = m_fmin;
|
||
}
|
||
}
|
||
else if (m_nMode == 2)
|
||
{
|
||
if (m_wavedata[yIndex][xIndex] == -9999)
|
||
{
|
||
dz = m_fmax;
|
||
}
|
||
else
|
||
{
|
||
dz = m_fmin;
|
||
}
|
||
}
|
||
m_colorMap->data()->setCell(nx - xIndex - 1, yIndex, dz);
|
||
}
|
||
}
|
||
return m_colorMap;
|
||
}
|
||
|
||
float QMyCustomPlot::getScaleV()
|
||
{
|
||
return m_fScaleV;
|
||
}
|
||
|
||
void QMyCustomPlot::groupBeginResult(float fEndDepth, float fStartDepth)
|
||
{
|
||
// 组ID
|
||
m_strGroupUid = getUUid();
|
||
m_fResultEndDepth = fEndDepth;
|
||
addResultGroup(fEndDepth, fStartDepth, m_strGroupUid, "11");
|
||
}
|
||
|
||
void QMyCustomPlot::groupEndResult()
|
||
{
|
||
m_strGroupUid = "";
|
||
}
|
||
|
||
void QMyCustomPlot::setShowProperty(QVariant val, int ntag)
|
||
{
|
||
QObjectList objList = m_mapDragGroup.values();
|
||
for (int i = 0; i < objList.size(); i++)
|
||
{
|
||
TransparentGroupResult *pGroup = qobject_cast<TransparentGroupResult *>(objList.at(i));
|
||
if (pGroup == nullptr)
|
||
continue;
|
||
if (ntag == 1)
|
||
{
|
||
pGroup->setGroupConclusionProportion(val.toInt());
|
||
}
|
||
else if (ntag == 2)
|
||
{
|
||
pGroup->setGroupShowPos(val.toInt());
|
||
}
|
||
else if (ntag == 3)
|
||
{
|
||
pGroup->setFloorVisible(val.toBool());
|
||
}
|
||
else if (ntag == 4)
|
||
{
|
||
QFont f = val.value<QFont>();
|
||
pGroup->setFloorFont(f);
|
||
}
|
||
}
|
||
}
|
||
|
||
void QMyCustomPlot::setConclusionProportion(int nCopro)
|
||
{
|
||
QObjectList objList = m_mapDragGroup.values();
|
||
for (int i = 0; i < objList.size(); i++)
|
||
{
|
||
TransparentGroupResult *pGroup = qobject_cast<TransparentGroupResult *>(objList.at(i));
|
||
if (pGroup == nullptr)
|
||
continue;
|
||
pGroup->setGroupConclusionProportion(nCopro);
|
||
}
|
||
}
|
||
|
||
void QMyCustomPlot::setShowPos(int nSPos)
|
||
{
|
||
QObjectList objList = m_mapDragGroup.values();
|
||
for (int i = 0; i < objList.size(); i++)
|
||
{
|
||
TransparentGroupResult *pGroup = qobject_cast<TransparentGroupResult *>(objList.at(i));
|
||
if (pGroup == nullptr)
|
||
continue;
|
||
pGroup->setGroupShowPos(nSPos);
|
||
}
|
||
}
|
||
|
||
//蝌蚪图,重绘网格线
|
||
void QMyCustomPlot::drawCustomElements()
|
||
{
|
||
QCPPainter painter(this);
|
||
|
||
//if(!mKedou)
|
||
{
|
||
return;
|
||
}
|
||
// 绘制自定义背景网格
|
||
painter.setPen(QPen(QColor(220, 0, 0), 0, Qt::DotLine));
|
||
for (int i=0; i<10; ++i) {
|
||
double x = xAxis->range().lower + i*xAxis->range().size()/10.0;
|
||
QPointF p1;
|
||
QPointF p2;
|
||
p1.setX(xAxis->coordToPixel(x));
|
||
p1.setY(yAxis->coordToPixel(yAxis->range().lower));
|
||
//
|
||
p2.setX(xAxis->coordToPixel(x));
|
||
p2.setY(yAxis->coordToPixel(yAxis->range().upper));
|
||
//
|
||
painter.drawLine(p1,p2);
|
||
}
|
||
|
||
// 绘制自定义标记
|
||
painter.setPen(Qt::NoPen);
|
||
painter.setBrush(QColor(255, 100, 100, 150));
|
||
painter.drawEllipse(QPointF(xAxis->coordToPixel(5.0),
|
||
yAxis->coordToPixel(0.5)), 20, 20);
|
||
}
|
||
|
||
|
||
void QMyCustomPlot::init(QString strName, QVector<double> xx, QVector<double> yy0)
|
||
{
|
||
//raise(); //置于上层显示
|
||
}
|
||
|
||
//void QMyCustomPlot::mousePressEvent(QMouseEvent *event)
|
||
//{
|
||
// //qDebug() << "mousePress";
|
||
// QCustomPlot::mousePressEvent(event);
|
||
//}
|
||
|
||
void QMyCustomPlot::mousePressEvent(QMouseEvent *event)
|
||
{
|
||
// if (event->button() == Qt::LeftButton) {
|
||
|
||
// if (auto *item = itemAt(event->pos(), true)) {
|
||
// emit mousePress(event); // 由于我们直接返回了,所以要负责将鼠标点击信号发送出去
|
||
|
||
// // deselectAll();
|
||
// mMousePress = true;
|
||
// mLastPos = event->pos();
|
||
// item->setSelected(true);
|
||
// replot();
|
||
// return; // 如果点击的是一个item直接返回,不然QCustomPlot会把事件传递给其它的层对象(例如:轴矩形)
|
||
// }
|
||
// }
|
||
|
||
if(m_bDrawCore_PHYSICS)//岩心分析
|
||
{
|
||
//获取鼠标点位置
|
||
double x_pos = event->pos().x();
|
||
double y_pos = event->pos().y();
|
||
|
||
double x_val;
|
||
double y_val;
|
||
//转为图像位置
|
||
x_val = xAxis->pixelToCoord(y_pos);
|
||
//曲线关联在左右轴判断
|
||
y_val = yAxis->pixelToCoord(x_pos);
|
||
|
||
//从选择中获取数据区间
|
||
QCPDataRange range;
|
||
if(graph(0)->selected()){
|
||
range = graph(0)->selection().dataRange();
|
||
}
|
||
// 检查选定的区间是否是单个数据点
|
||
if (range.size() == 1) {
|
||
// 获取选定的数据点的下标范围
|
||
dataIndex = range.begin();
|
||
// 执行特定操作,例如输出下标:
|
||
}else{
|
||
dataIndex = -1;
|
||
return;
|
||
}
|
||
|
||
double xx = graph(0)->data()->at(dataIndex)->key;
|
||
// double yy = graph(0)->data()->at(dataIndex)->value;
|
||
|
||
//// double newYPoint = y_val / yy; //曲线Y轴数据 m_y.at(dataIndex)
|
||
//// double xDistand = abs(x_val - xx); //曲线X轴数据 m_x.at(dataIndex)
|
||
|
||
//// //鼠标位距离数据点位置判断
|
||
//// if (newYPoint > 0.2 && newYPoint < 3 && xDistand < 5) {
|
||
//// //在此范围(自由设计)则表示选中数据点
|
||
//// dataIndex = dataIndex;
|
||
//// }else{
|
||
//// dataIndex = -1;
|
||
//// }
|
||
|
||
singleOldPosition = xx; //记录了该点在曲线中Y轴的值 m_y.at(dataIndex)
|
||
singleDragMove = true;
|
||
}
|
||
|
||
QCustomPlot::mousePressEvent(event);
|
||
}
|
||
|
||
|
||
void QMyCustomPlot::mouseMoveEvent(QMouseEvent *event)
|
||
{
|
||
QCustomPlot::mouseMoveEvent(event);
|
||
|
||
int nmaxCursor = 0;
|
||
QObjectList objList = m_mapDragGroup.values();
|
||
for( int i = 0; i< objList.size(); i++)
|
||
{
|
||
TransparentGroupResult* group = qobject_cast<TransparentGroupResult*>(objList.at(i));
|
||
if (group)
|
||
{
|
||
if (group->getCursor() > nmaxCursor)
|
||
{
|
||
nmaxCursor = group->getCursor();
|
||
}
|
||
}
|
||
}
|
||
if (nmaxCursor == 2)
|
||
{
|
||
this->setCursor(Qt::ClosedHandCursor);
|
||
}
|
||
else if (nmaxCursor == 1)
|
||
{
|
||
this->setCursor(Qt::SizeVerCursor);
|
||
}
|
||
else
|
||
{
|
||
this->setCursor(Qt::ArrowCursor);
|
||
}
|
||
// if (mMousePress) {
|
||
// auto items = selectedItems();
|
||
|
||
// foreach (auto *item, items) {
|
||
// if (auto *sizeHandle = qobject_cast<QCPSizeHandle *>(item))
|
||
// {
|
||
// mSizeHandleManager->handleItemResize(sizeHandle, event->pos() - mLastPos); // 控制item缩放
|
||
// }
|
||
// else
|
||
// {
|
||
// mSizeHandleManager->handleItemMove(item, event->pos() - mLastPos); // 控制item移动
|
||
// }
|
||
|
||
// }
|
||
// mLastPos = event->pos();
|
||
// replot();
|
||
// }
|
||
// else
|
||
|
||
if(m_bDrawCore_PHYSICS)//岩心分析
|
||
{
|
||
if(singleDragMove){
|
||
executeSingle(event);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// 当前鼠标位置(像素坐标)
|
||
//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_strUuid, m_strWellName, m_strTrackName, 0-y_val);
|
||
}
|
||
}
|
||
|
||
void QMyCustomPlot::mouseReleaseEvent(QMouseEvent *event)
|
||
{
|
||
// if (mMousePress) {
|
||
// mMousePress = false;
|
||
// if (auto *item = itemAt(event->pos(), true)) {
|
||
// emit mouseReleaseEvent(event); // 由于我们直接返回了,所以要负责将鼠标点击信号发送出去
|
||
// item->setSelected(false);
|
||
// replot();
|
||
// return;
|
||
// }
|
||
// }
|
||
|
||
if(m_bDrawCore_PHYSICS)//岩心分析
|
||
{
|
||
dataIndex = -1;
|
||
singleDragMove = false;
|
||
//setCursor(Qt::ArrowCursor);
|
||
replot(QCustomPlot::rpQueuedReplot);
|
||
}
|
||
QCustomPlot::mouseReleaseEvent(event);
|
||
}
|
||
|
||
//单点移动功能
|
||
void QMyCustomPlot::executeSingle(QMouseEvent *event)
|
||
{
|
||
try {
|
||
if(dataIndex == -1)
|
||
{
|
||
return;
|
||
}
|
||
|
||
//获取鼠标信息
|
||
int x_pos = event->pos().x();
|
||
int y_pos = event->pos().y();
|
||
// double x_val = xAxis->pixelToCoord(x_pos);
|
||
// double y_val = yAxis->pixelToCoord(y_pos);
|
||
|
||
double x_val;
|
||
double y_val;
|
||
//转为图像位置
|
||
x_val = xAxis->pixelToCoord(y_pos);
|
||
//曲线关联在左右轴判断
|
||
y_val = yAxis->pixelToCoord(x_pos);
|
||
|
||
//double xx = graph(0)->data()->at(dataIndex)->key;
|
||
//double yy = graph(0)->data()->at(dataIndex)->value;
|
||
|
||
// //获取数据改变鼠标的形状
|
||
// double newYPoint = y_val / yy;
|
||
// double xDistand = abs(x_val - xx);
|
||
// if (newYPoint > 0.2 && newYPoint < 3 && xDistand < 5) {
|
||
// customPlot->setCursor(Qt::ClosedHandCursor);
|
||
// }else{
|
||
// customPlot->setCursor(Qt::ArrowCursor);
|
||
// }
|
||
|
||
//更新曲线数据中拖动的那个点数据
|
||
for(int i =0; i<m_x.size(); i++)
|
||
{
|
||
if(m_x[i] == singleOldPosition)
|
||
{
|
||
m_y[i]=y_val;
|
||
break;
|
||
}
|
||
}
|
||
graph(0)->data()->clear();
|
||
graph(0)->setData(m_x, m_y);
|
||
// graph(0)->data()->remove(dataIndex);
|
||
// graph(0)->addData(singleOldPosition, y_val); //更新曲线数据
|
||
replot(QCustomPlot::rpQueuedReplot); //刷新曲线
|
||
} catch (...) {
|
||
//FERROR("系统发异常!");
|
||
}
|
||
}
|
||
|
||
//槽函数,选中曲线
|
||
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)
|
||
{
|
||
m_event = event;
|
||
//曲线
|
||
if(m_addRandomGraph)
|
||
{
|
||
QMenu menu(this);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/ZonePoint.png"), "添加分段线", this, &QMyCustomPlot::onAddShiftLine);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/ClearZonePoint.png"), "清除当前分段线", this, &QMyCustomPlot::onDelSelectShiftLine);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/ClearZone.png"), "清除全部分段线", this, &QMyCustomPlot::onDelAllShiftLine);
|
||
menu.addAction(QIcon(::GetImagePath() + "curve.png"), "开始编辑曲线", this, &QMyCustomPlot::onEditLine);
|
||
menu.exec(event->globalPos());
|
||
}
|
||
|
||
if (m_strLineName == "GUJING1_RESULT" || m_strLineName == "GUJING2_RESULT" || m_strLineName == "GUJING3_RESULT")
|
||
{
|
||
QMenu menu(this);
|
||
//固井
|
||
menu.addAction(QIcon(::GetImagePath() + "curve.png"), "开始编辑固井结论", this, &QMyCustomPlot::onEditGujing);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/CopyCoreTxt.png"), "从剪切板文本数据粘贴", this, &QMyCustomPlot::addItems_Gujing);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/ClearSelectCore.png"), "取消选中", this, &QMyCustomPlot::ClearSelectItems);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/Delete.png"), "全部清空", this, &QMyCustomPlot::DeleteItems_Gujing);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/CopyCoreTxt.png"), "刷新数据", this, &QMyCustomPlot::RefreshItems_Gujing);
|
||
menu.addAction(QIcon(::GetImagePath() + "development.png"), "合并结论", this, &QMyCustomPlot::MegResult_Gujing);
|
||
menu.exec(event->globalPos());
|
||
}
|
||
|
||
if (m_strLineName == "SWALL_CORE")
|
||
{
|
||
QMenu menu(this);
|
||
//井壁取心
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/OneSideWallCore.png"), "增加井壁取心", this, &QMyCustomPlot::addItem_SWallCore);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/OneSideWallCore.png"), "平移水平位置", this, &QMyCustomPlot::moveItems_SWallCore);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/CopyCoreTxt.png"), "从剪切板文本数据粘贴", this, &QMyCustomPlot::addItems_SWallCore);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/ClearSelectCore.png"), "取消选中", this, &QMyCustomPlot::ClearSelectItems);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/Delete.png"), "全部清空", this, &QMyCustomPlot::DeleteItems_SWallCore);
|
||
menu.addAction(QIcon(::GetImagePath() + "icon/CopyCoreTxt.png"), "刷新数据", this, &QMyCustomPlot::RefreshItems_SWallCore);
|
||
menu.exec(event->globalPos());
|
||
}
|
||
|
||
// QAction *resetAction = menu.addAction("添加框图");
|
||
// connect(resetAction, &QAction::triggered, this, &QMyCustomPlot::onAddRect);
|
||
|
||
// if (selectedGraphs().size() > 0)//选中曲线
|
||
// {
|
||
// menu.addAction("删除选中曲线", this, SLOT(removeSelectedGraph()));
|
||
// }
|
||
|
||
}
|
||
|
||
//右键--添加分段线
|
||
void QMyCustomPlot::onAddShiftLine()
|
||
{
|
||
double right_Hight = xAxis->pixelToCoord(m_event->pos().y());//x轴展示深度
|
||
double left_Low = right_Hight;
|
||
|
||
//通知界面,增加一条校深线段
|
||
emit CallManage::getInstance()->sig_AddShiftLine(m_strUuid, left_Low, right_Hight);
|
||
}
|
||
|
||
//右键--清除当前分段线
|
||
void QMyCustomPlot::onDelSelectShiftLine()
|
||
{
|
||
//通知界面,清除当前分段线
|
||
emit CallManage::getInstance()->sig_DelSelectShiftLine(m_strUuid);
|
||
}
|
||
|
||
//右键--清除全部分段线
|
||
void QMyCustomPlot::onDelAllShiftLine()
|
||
{
|
||
//通知界面,清除全部分段线
|
||
emit CallManage::getInstance()->sig_DelAllShiftLine(m_strUuid);
|
||
}
|
||
|
||
//右键--编辑曲线
|
||
void QMyCustomPlot::onEditLine()
|
||
{
|
||
if(m_bEditRect)
|
||
{
|
||
QMessageBox::information(nullptr, "提示", "当前正在编辑曲线,请先完成编辑!");
|
||
return;
|
||
}
|
||
this->setInteractions(QCP::iSelectAxes | QCP::iSelectLegend | QCP::iSelectPlottables | QCP::iMultiSelect); // 轴、图例、图表可以被选择,并且是多选的方式
|
||
this->setSelectionRectMode(QCP::srmCustom); // 鼠标框选
|
||
|
||
if(m_bFirstTimeConnect)
|
||
{
|
||
//信号槽只绑定一次,避免重复绑定
|
||
m_bFirstTimeConnect = false;
|
||
|
||
for (int i=0; i < this->graphCount(); ++i) {
|
||
QCPGraph *graph = this->graph(i);
|
||
graph->setSelectable(QCP::stDataRange);
|
||
break;
|
||
}
|
||
|
||
connect(this->selectionRect(), &QCPSelectionRect::accepted, [this](){
|
||
if(this->m_bDrawRect == false)
|
||
{
|
||
this->m_bDrawRect = true;
|
||
return;
|
||
}
|
||
// 当选择完成时,获取矩形范围并放大
|
||
QRectF rect = this->selectionRect()->rect(); // 获取选择的矩形区域(像素坐标)
|
||
m_bEditRect=true;//当前是否正在编辑曲线。
|
||
|
||
// 转换为坐标轴范围
|
||
double top = rect.top();
|
||
double bottom = rect.bottom();
|
||
|
||
double right_Hight = this->xAxis->pixelToCoord(top);
|
||
double left_Low = this->xAxis->pixelToCoord(bottom);
|
||
|
||
float rlev=0;
|
||
if(m_x.size()>=2)
|
||
{
|
||
rlev = abs(m_x[1] - m_x[0]);
|
||
}
|
||
//
|
||
int left_Low_Number=0;
|
||
int right_Hight_Number=0;
|
||
for(int i =0; i<m_x.size(); i++)
|
||
{
|
||
if(abs(m_x[i]-left_Low) <= rlev)
|
||
{
|
||
left_Low_Number = i;
|
||
break;
|
||
}
|
||
}
|
||
for(int i =0; i<m_x.size(); i++)
|
||
{
|
||
if(abs(m_x[i]-right_Hight) <= rlev)
|
||
{
|
||
right_Hight_Number = i;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(abs(right_Hight-left_Low) >= (3*rlev) )//至少选中5个点
|
||
{
|
||
// for (int j=right_Hight_Number; j<left_Low_Number-1; j++)
|
||
// {
|
||
// QCPItemLine *qcpItemLine = new QCPItemLine(this);
|
||
// qcpItemLine->setPen(QPen(Qt::blue));
|
||
// qcpItemLine->setLayer("overlay"); // 确保在最上层
|
||
// qcpItemLine->start->setCoords(this->m_x[j], this->m_y[j]);
|
||
// qcpItemLine->end->setCoords(this->m_x[j+1], this->m_y[j+1]);
|
||
// }
|
||
// this->replot();
|
||
// QPixmap p = this->grab(QRect(rect.x(), rect.y(), rect.width(), rect.height()));
|
||
// p.save("./Rectpicture.png", "png");
|
||
|
||
//添加图形
|
||
this->addSelectRectToPlot(m_x[left_Low_Number], m_x[right_Hight_Number], left_Low_Number, right_Hight_Number);//left_Low, right_Hight
|
||
|
||
//取消框选
|
||
this->setInteractions(QCP::iSelectLegend | QCP::iSelectPlottables);
|
||
this->setSelectionRectMode(QCP::srmNone);
|
||
}
|
||
});
|
||
|
||
}
|
||
}
|
||
|
||
//右键--添加固井
|
||
void QMyCustomPlot::onEditGujing()
|
||
{
|
||
this->setInteractions(QCP::iSelectAxes | QCP::iSelectLegend | QCP::iSelectPlottables | QCP::iMultiSelect); // 轴、图例、图表可以被选择,并且是多选的方式
|
||
this->setSelectionRectMode(QCP::srmCustom); // 鼠标框选
|
||
|
||
if(m_bFirstTimeConnect)
|
||
{
|
||
//信号槽只绑定一次,避免重复绑定
|
||
m_bFirstTimeConnect = false;
|
||
|
||
for (int i=0; i < this->graphCount(); ++i) {
|
||
QCPGraph *graph = this->graph(i);
|
||
graph->setSelectable(QCP::stDataRange);
|
||
break;
|
||
}
|
||
|
||
connect(this->selectionRect(), &QCPSelectionRect::accepted, [this](){
|
||
if(this->m_bDrawRect == false)
|
||
{
|
||
this->m_bDrawRect = true;
|
||
return;
|
||
}
|
||
// 当选择完成时,获取矩形范围并放大
|
||
QRectF rect = this->selectionRect()->rect(); // 获取选择的矩形区域(像素坐标)
|
||
m_bEditRect=true;//当前是否正在编辑曲线。
|
||
|
||
// 转换为坐标轴范围
|
||
double top = rect.top();
|
||
double bottom = rect.bottom();
|
||
|
||
double right_Hight = this->xAxis->pixelToCoord(top);
|
||
double left_Low = this->xAxis->pixelToCoord(bottom);
|
||
|
||
//追加判断,避免框选重叠
|
||
TransparentDraggableGujing *pDraggableRect =NULL;
|
||
{
|
||
QMap<QString,QObject *>::Iterator it = m_mapDraggable_Gujing.begin();
|
||
while( it != m_mapDraggable_Gujing.end() )
|
||
{
|
||
pDraggableRect = (TransparentDraggableGujing*)it.value();
|
||
//
|
||
QCPRange tmpRange = pDraggableRect->getRange();
|
||
if(tmpRange.lower >= left_Low && tmpRange.upper <= right_Hight)
|
||
{
|
||
return;
|
||
}
|
||
|
||
if(tmpRange.upper >= left_Low && tmpRange.upper <= right_Hight)
|
||
{
|
||
return;
|
||
}
|
||
|
||
if(tmpRange.lower >= left_Low && tmpRange.lower <= right_Hight)
|
||
{
|
||
return;
|
||
}
|
||
|
||
it++;
|
||
}
|
||
}
|
||
|
||
{
|
||
//添加固井结论
|
||
this->addGujingToPlot(left_Low, right_Hight, ::GetGujingSymbolDir());
|
||
|
||
//保存
|
||
this->SaveToSLF_Gujing();
|
||
|
||
//属性清空
|
||
PropertyService()->InitCurrentViewInfo();
|
||
|
||
//取消框选
|
||
this->setInteractions(QCP::iSelectLegend | QCP::iSelectPlottables);
|
||
this->setSelectionRectMode(QCP::srmNone);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
bool QMyCustomPlot::SaveToSLF_SwallCore()
|
||
{
|
||
static int isrun=false;
|
||
if(isrun) return false;
|
||
QString ss=m_strSlfName;
|
||
if(ss=="") return false;
|
||
isrun=true;
|
||
|
||
WALLCORE_DATA m_Result;
|
||
CMemRdWt *logio=new CMemRdWt();
|
||
if(!logio->Open(ss.toStdString().c_str(),CSlfIO::modeReadWrite))
|
||
{
|
||
delete logio;
|
||
QMessageBox::information(NULL,"提示","SLF文件打开失败,请检查!!",QMessageBox::Yes);
|
||
isrun=false;
|
||
return false;
|
||
}
|
||
bool isfirst=false;
|
||
int iIndex=logio->OpenTable(m_strLineName.toStdString().c_str());
|
||
if (iIndex < 0)
|
||
{
|
||
if(!m_mapDraggable_SwallCore.size()) {
|
||
delete logio;
|
||
isrun=false;
|
||
return false;
|
||
}
|
||
iIndex=logio->Open_Set_Table(m_strLineName.toStdString().c_str(),0,8,
|
||
"NO,DEPTH,OIL,LITH,COLOR,LEFT,WIDTH,DEST",
|
||
"4,4,4,4,4,4,4,64",//字段长度
|
||
"1,4,1,1,1,4,4,6",//字段类型
|
||
"0,0,3,4,5,0,0,0");//字段备注,1-枚举
|
||
isfirst=true;
|
||
}
|
||
else {
|
||
static int err=0;
|
||
int fc=logio->GetTableFieldCount(iIndex);
|
||
Slf_TABLE_FIELD *tf=new Slf_TABLE_FIELD[fc+1];
|
||
logio->GetTableFieldInfo(iIndex,tf);
|
||
if(fc<5||tf[0].RepCode!=REPR_INT||
|
||
tf[1].RepCode!=REPR_FLOAT||
|
||
tf[2].RepCode!=REPR_INT||
|
||
tf[3].RepCode!=REPR_INT||
|
||
tf[4].RepCode!=REPR_INT||
|
||
tf[5].RepCode!=REPR_FLOAT||
|
||
tf[6].RepCode!=REPR_FLOAT)
|
||
{
|
||
if(!err)QMessageBox::information(NULL,"提示","不是有效取心表,无法保存数据!");
|
||
err++;
|
||
delete tf;
|
||
delete logio;
|
||
isrun=false;
|
||
return false;
|
||
}
|
||
else err=0;
|
||
delete tf;
|
||
}
|
||
logio->SetTableRecordCount(iIndex,m_mapDraggable_SwallCore.size());
|
||
if(!m_mapDraggable_SwallCore.size()) {
|
||
delete logio;
|
||
if(isfirst)AddTableToWellRound();
|
||
isrun=false;
|
||
return false;
|
||
}
|
||
|
||
TransparentDraggableSwallCore *pDraggableRect =NULL;
|
||
|
||
//排序
|
||
QList<float> listSDepth;
|
||
for (QMap<QString,QObject *>::Iterator iter = m_mapDraggable_SwallCore.begin(); iter != m_mapDraggable_SwallCore.end(); iter++)
|
||
{
|
||
pDraggableRect = (TransparentDraggableSwallCore*)iter.value();
|
||
//
|
||
QCPRange tmpRange = pDraggableRect->getRange();
|
||
//
|
||
float fSDepth = -tmpRange.lower;
|
||
listSDepth.append(fSDepth);
|
||
}
|
||
qSort(listSDepth);
|
||
|
||
//------------
|
||
QStringList liths;
|
||
QStringList oils;
|
||
QStringList colors;
|
||
QStringList colorinds;
|
||
QString cs=GetConfPath();
|
||
QString color;
|
||
for(int j=0;j<4;j++)
|
||
{
|
||
if(j==0) color=cs+"corecolor.ini";
|
||
else if(j==1) color=cs+"corelith.ini";
|
||
else if(j==2) color=cs+"coreoil.ini";
|
||
else color=cs+"colorind.ini";
|
||
FILE *fp=fopen(color.toStdString().c_str(),"rt");
|
||
QStringList ss;
|
||
char buf[100];
|
||
if(fp) {
|
||
while(!feof(fp)) {
|
||
fscanf(fp,"%s",buf);
|
||
ss.append(buf);
|
||
}
|
||
fclose(fp);
|
||
}
|
||
if(j==0) colors=ss;
|
||
else if(j==1) liths=ss;
|
||
else if(j==2) oils=ss;
|
||
else colorinds=ss;
|
||
}
|
||
|
||
//
|
||
for(int i=0; i<listSDepth.size(); i++)
|
||
{
|
||
char dest[64];
|
||
dest[0]=0;
|
||
for (QMap<QString,QObject *>::Iterator iter = m_mapDraggable_SwallCore.begin(); iter != m_mapDraggable_SwallCore.end(); iter++)
|
||
{
|
||
pDraggableRect = (TransparentDraggableSwallCore*)iter.value();
|
||
//
|
||
QCPRange tmpRange = pDraggableRect->getRange();
|
||
float fSDepth = -tmpRange.lower;
|
||
if(fSDepth == listSDepth[i])//按顺序写入
|
||
{
|
||
memset(&m_Result,0,sizeof(WALLCORE_DATA));
|
||
m_Result.Depth=fSDepth;
|
||
m_Result.Order=i+1;
|
||
|
||
QString name,lithname,oilname,colorname;
|
||
pDraggableRect->m_Lith.replace("\\","/");
|
||
int l=pDraggableRect->m_Lith.lastIndexOf("/");
|
||
if(l>-1) name=pDraggableRect->m_Lith.mid(l+1);
|
||
l=name.indexOf(".");
|
||
name=name.left(l);
|
||
lithname=name;
|
||
m_Result.CoreLith=liths.indexOf(name)+1;
|
||
if(m_Result.CoreLith<1) m_Result.CoreLith=1;
|
||
//
|
||
pDraggableRect->m_Oil.replace("\\","/");
|
||
l=pDraggableRect->m_Oil.lastIndexOf("/");
|
||
if(l>-1) name=pDraggableRect->m_Oil.mid(l+1);
|
||
|
||
l=name.indexOf(".");
|
||
if(l>-1)name=name.left(l);
|
||
oilname=name;
|
||
m_Result.CoreOil=oils.indexOf(name)+1;
|
||
if(m_Result.CoreOil<1) m_Result.CoreOil=1;
|
||
|
||
m_Result.CoreColor=pDraggableRect->mstrTitle.toInt();
|
||
|
||
m_Result.left=pDraggableRect->m_fLeftSpace / g_dPixelPerCm;
|
||
m_Result.width=SideWallCoreWidth * g_dPixelPerCm;//1.2厘米像素数
|
||
if(m_Result.width<=0) m_Result.width=1;
|
||
//
|
||
int ind=colorinds.indexOf(QString::number(m_Result.CoreColor));
|
||
if (ind>-1&&ind<colors.size())
|
||
{
|
||
colorname=colors[ind];
|
||
}
|
||
|
||
name="";
|
||
if(colorname!="空白"||name!="空") name+=colorname;
|
||
if(oilname!="空白"||name!="空") name+=oilname;
|
||
if(lithname!="空白"||name!="空") name+=lithname;
|
||
int n=strlen(name.toStdString().c_str());
|
||
if(n>sizeof(m_Result.dest)) n=sizeof(m_Result.dest);
|
||
strncpy(m_Result.dest,name.toLocal8Bit().data(),n);
|
||
logio->WriteTable(iIndex,i+1,&m_Result);
|
||
}
|
||
}
|
||
}
|
||
|
||
logio->CloseTable(iIndex);
|
||
delete logio;
|
||
if(isfirst)AddTableToWellRound();
|
||
isrun=false;
|
||
return true;
|
||
}
|
||
|
||
//保存固井结论道
|
||
bool QMyCustomPlot::SaveToSLF_Gujing()
|
||
{
|
||
static int isrun=false;
|
||
if(isrun) return false;
|
||
QString ss=m_strSlfName;
|
||
if(ss=="") return false;
|
||
isrun=true;
|
||
|
||
GUJING_DATA m_Result;
|
||
CMemRdWt *logio=new CMemRdWt();
|
||
if(ss==""||!logio->Open(ss.toStdString().c_str(),CSlfIO::modeReadWrite))
|
||
{
|
||
delete logio;
|
||
QMessageBox::information(NULL,"提示","SLF文件打开失败,请检查!!",QMessageBox::Yes);
|
||
isrun=false;
|
||
return false;
|
||
}
|
||
|
||
int iIndex=logio->OpenTable(m_strLineName.toStdString().c_str());
|
||
bool isfirst=false;
|
||
if (iIndex < 0)
|
||
{
|
||
if(!m_mapDraggable_Gujing.size()) {
|
||
delete logio;
|
||
isrun=false;
|
||
return false;
|
||
}
|
||
iIndex=logio->Open_Set_Table(m_strLineName.toStdString().c_str(),GUJING_OBJECT,4,
|
||
"NO,SDEP,EDEP,RESULT",
|
||
"4,4,4,4",//字段长度
|
||
"1,4,4,1",//字段类型
|
||
"0,0,0,2");//字段备注
|
||
isfirst=true;
|
||
}
|
||
logio->SetTableRecordCount(iIndex,m_mapDraggable_Gujing.size());
|
||
//int j=0;
|
||
if(!m_mapDraggable_Gujing.size()) {
|
||
delete logio;
|
||
if(isfirst)AddTableToWellRound();
|
||
isrun=false;
|
||
return false;
|
||
}
|
||
|
||
TransparentDraggableGujing *pDraggableRect =NULL;
|
||
|
||
//排序
|
||
QList<float> listSDepth;
|
||
for (QMap<QString,QObject *>::Iterator iter = m_mapDraggable_Gujing.begin(); iter != m_mapDraggable_Gujing.end(); iter++)
|
||
{
|
||
pDraggableRect = (TransparentDraggableGujing*)iter.value();
|
||
//
|
||
QCPRange tmpRange = pDraggableRect->getRange();
|
||
//
|
||
float fSDepth = -tmpRange.upper;
|
||
listSDepth.append(fSDepth);
|
||
}
|
||
qSort(listSDepth);
|
||
|
||
//
|
||
for(int i=0; i<listSDepth.size(); i++)
|
||
{
|
||
for (QMap<QString,QObject *>::Iterator iter = m_mapDraggable_Gujing.begin(); iter != m_mapDraggable_Gujing.end(); iter++)
|
||
{
|
||
pDraggableRect = (TransparentDraggableGujing*)iter.value();
|
||
//
|
||
QCPRange tmpRange = pDraggableRect->getRange();
|
||
float fSDepth = -tmpRange.upper;
|
||
if(fSDepth == listSDepth[i])//按顺序写入
|
||
{
|
||
memset(&m_Result,0,sizeof(GUJING_DATA));
|
||
m_Result.SDEP = -tmpRange.upper;
|
||
m_Result.EDEP = -tmpRange.lower;
|
||
m_Result.NO=i+1;
|
||
m_Result.RESULT=0;
|
||
QString innerresult=GetIntResult_Gujing(pDraggableRect->m_Result);
|
||
if(innerresult!="")
|
||
m_Result.RESULT=innerresult.toInt();
|
||
if(m_Result.RESULT<0) m_Result.RESULT=0;
|
||
//写入
|
||
logio->WriteTable(iIndex,i+1,&m_Result);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
logio->CloseTable(iIndex);
|
||
delete logio;
|
||
if(isfirst)AddTableToWellRound();
|
||
isrun=false;
|
||
return true;
|
||
}
|
||
|
||
QString QMyCustomPlot::GetIntResult_Gujing(QString result)
|
||
{
|
||
if(result=="") return "";
|
||
QFileInfo afile(result);
|
||
QString strBaseName = afile.completeBaseName();
|
||
|
||
return zoneOrder_Gujing.value(strBaseName);
|
||
}
|
||
|
||
//向左侧树图,追加固井结论表格
|
||
void QMyCustomPlot::AddTableToWellRound()
|
||
{
|
||
emit CallManage::getInstance()->sig_AddGujingToTree(m_strSlfName, m_strWellName, m_strLineName);
|
||
}
|
||
|
||
//增加井壁取心
|
||
void QMyCustomPlot::addItem_SWallCore()
|
||
{
|
||
QStringList liths;
|
||
QStringList oils;
|
||
QStringList colors;
|
||
QStringList colorinds;
|
||
|
||
QString cs=GetConfPath();
|
||
QString color;
|
||
for(int j=0;j<4;j++)
|
||
{
|
||
if(j==0) color=cs+"corecolor.ini";
|
||
else if(j==1) color=cs+"corelith.ini";
|
||
else if(j==2) color=cs+"coreoil.ini";
|
||
else color=cs+"colorind.ini";
|
||
FILE *fp=fopen(color.toStdString().c_str(),"rt");
|
||
QStringList ss;
|
||
char buf[100];
|
||
if(fp) {
|
||
while(!feof(fp)) {
|
||
fscanf(fp,"%s",buf);
|
||
ss.append(buf);
|
||
}
|
||
fclose(fp);
|
||
}
|
||
if(j==0) colors=ss;
|
||
else if(j==1) liths=ss;
|
||
else if(j==2) oils=ss;
|
||
else colorinds=ss;
|
||
}
|
||
|
||
QString LithologyImage="";
|
||
QString OilGasImage="";
|
||
QString ColorImage="";
|
||
|
||
int CoreLith=27;
|
||
int CoreOil=7;
|
||
int CoreColor=0;
|
||
if (liths.size()>=CoreLith)
|
||
{
|
||
LithologyImage=::GetSymbolDir()+"/取心岩性符号/"+liths[CoreLith-1]+".svg";
|
||
QDir ss(LithologyImage);
|
||
if(!ss.exists()) {
|
||
LithologyImage=::GetSymbolDir()+"/取心岩性符号/"+liths[CoreLith-1]+".png";
|
||
}
|
||
}
|
||
if (CoreOil>0&&oils.size()>=CoreOil)
|
||
{
|
||
OilGasImage=::GetGasSymbolDir()+""+oils[CoreOil-1]+".svg";
|
||
}
|
||
int ind=colorinds.indexOf(QString::number(CoreColor));
|
||
if (ind>-1&&ind<colors.size())
|
||
{
|
||
ColorImage=::GetColorSymbolDir()+""+colors[ind]+".svg";
|
||
}
|
||
|
||
float width = SideWallCoreWidth * g_dPixelPerCm;//1.2cm
|
||
float Sideleft = 0;
|
||
|
||
double right_Hight = xAxis->pixelToCoord(m_event->pos().y());//x轴展示深度
|
||
//添加井壁取心
|
||
addSwallCoreToPlot(right_Hight, LithologyImage, OilGasImage, ColorImage, Sideleft, width, CoreColor);
|
||
|
||
//保存
|
||
this->SaveToSLF_SwallCore();
|
||
|
||
//属性清空
|
||
PropertyService()->InitCurrentViewInfo();
|
||
}
|
||
|
||
//平移水平位置
|
||
void QMyCustomPlot::moveItems_SWallCore()
|
||
{
|
||
int num=m_mapDraggable_SwallCore.size();
|
||
if(num)
|
||
{
|
||
bool ok=0;
|
||
QString Formtiom=QInputDialog::getText(NULL,"水平位置移动","请输入移动量(1,2,3,4..)",QLineEdit::Normal,"",&ok);
|
||
if(!ok) return;
|
||
if(Formtiom.toFloat())
|
||
{
|
||
float dleft=Formtiom.toFloat();//厘米数
|
||
|
||
TransparentDraggableSwallCore *pDraggableRect =NULL;
|
||
for (QMap<QString,QObject *>::Iterator iter = m_mapDraggable_SwallCore.begin(); iter != m_mapDraggable_SwallCore.end(); iter++)
|
||
{
|
||
pDraggableRect = (TransparentDraggableSwallCore*)iter.value();
|
||
pDraggableRect->m_fLeftSpace += dleft*g_dPixelPerCm;
|
||
//刷新
|
||
QCPRange tmpRange = pDraggableRect->getRange();
|
||
pDraggableRect->setRange(tmpRange.lower, tmpRange.upper);
|
||
}
|
||
|
||
//保存
|
||
this->SaveToSLF_SwallCore();
|
||
|
||
//属性清空
|
||
PropertyService()->InitCurrentViewInfo();
|
||
}
|
||
}
|
||
}
|
||
|
||
//从剪切板文本数据粘贴
|
||
void QMyCustomPlot::addItems_SWallCore()
|
||
{
|
||
//清空
|
||
liths_SWallCore.clear();
|
||
oils_SWallCore.clear();
|
||
colors_SWallCore.clear();
|
||
colorinds_SWallCore.clear();
|
||
|
||
QString cs=GetConfPath();
|
||
QString color;
|
||
for(int j=0;j<4;j++)
|
||
{
|
||
if(j==0) color=cs+"corecolor.ini";
|
||
else if(j==1) color=cs+"corelith.ini";
|
||
else if(j==2) color=cs+"coreoil.ini";
|
||
else color=cs+"colorind.ini";
|
||
FILE *fp=fopen(color.toStdString().c_str(),"rt");
|
||
QStringList ss;
|
||
char buf[100];
|
||
if(fp) {
|
||
while(!feof(fp)) {
|
||
fscanf(fp,"%s",buf);
|
||
ss.append(buf);
|
||
}
|
||
fclose(fp);
|
||
}
|
||
if(j==0) colors_SWallCore=ss;
|
||
else if(j==1) liths_SWallCore=ss;
|
||
else if(j==2) oils_SWallCore=ss;
|
||
else colorinds_SWallCore=ss;
|
||
}
|
||
|
||
QClipboard *clipboard = QApplication::clipboard(); //获取系统剪贴板指针
|
||
QString originalText = clipboard->text(); //获取剪贴板上文本信息
|
||
int isspace=originalText.indexOf(" ");
|
||
int istab=originalText.indexOf("\t");
|
||
int isd=originalText.indexOf(",");
|
||
|
||
if((istab>-1|isd>-1)&&isspace>-1)
|
||
{
|
||
QMessageBox::information(NULL,"提示", "\",\"或制表符与空格键并存,自动分解可能有误!\n建议用单一符号风格!");
|
||
}
|
||
originalText.replace("\t"," ");
|
||
originalText.replace(","," ");
|
||
originalText.replace("\r\n","\n");
|
||
originalText.replace("\r","\n");
|
||
QStringList line=originalText.split("\n");
|
||
line.removeAll("");
|
||
for(int i=0;i<line.size();i++) {
|
||
QStringList coredat=line[i].split(" ");
|
||
if((istab==-1||isd==-1)&&isspace>=0) coredat.removeAll("");
|
||
if(coredat.size()<1) continue;
|
||
if(!coredat[0].isEmpty()&&!coredat[0].at(0).isDigit()) continue;
|
||
|
||
AddItem_SWallCore(coredat);
|
||
}
|
||
|
||
//保存
|
||
this->SaveToSLF_SwallCore();
|
||
|
||
//属性清空
|
||
PropertyService()->InitCurrentViewInfo();
|
||
}
|
||
|
||
void QMyCustomPlot::AddItem_SWallCore(QStringList lists)
|
||
{
|
||
if(lists.size()<2) return;
|
||
if(lists.size()<3) lists.insert(0,"0");
|
||
WALLCORE_DATA m_Result;
|
||
memset(&m_Result,0,sizeof(WALLCORE_DATA));
|
||
double top=-9999.0;
|
||
double bottom=-9999.0;
|
||
m_Result.Order=lists[0].toInt();
|
||
top=lists[1].toDouble();
|
||
bottom=top;
|
||
m_Result.Depth=top;
|
||
if(lists.size()>2) {
|
||
if(!lists[2].isEmpty()) {
|
||
if(lists[2].at(0).isDigit()) {
|
||
m_Result.CoreOil=lists[2].toDouble();
|
||
if(lists.size()>3) m_Result.CoreLith=lists[3].toDouble();
|
||
if(lists.size()>4) m_Result.CoreColor=lists[4].toDouble();
|
||
}
|
||
else {
|
||
for(int j=0;j<3;j++) {
|
||
QStringList ss;
|
||
if(j==0) ss=colors_SWallCore;
|
||
else if(j==1) ss=liths_SWallCore;
|
||
else ss=oils_SWallCore;
|
||
int len=0;
|
||
int len1=0;
|
||
int iid=0;
|
||
for(int i=0;i<ss.size();i++) {
|
||
if(lists[2].indexOf(ss[i])>-1) {
|
||
len1=strlen(ss[i].toStdString().c_str());
|
||
if(len<len1) {
|
||
len=len1;
|
||
iid=i;
|
||
}
|
||
}
|
||
}
|
||
if(len) {
|
||
if(j==0) {
|
||
if(iid>=0&&iid<colorinds_SWallCore.size()) m_Result.CoreColor=colorinds_SWallCore[iid].toInt();
|
||
else m_Result.CoreColor=0;
|
||
}
|
||
else if(j==1) m_Result.CoreLith=iid+1;
|
||
else m_Result.CoreOil=iid+1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if(top&&bottom==0) bottom=top;
|
||
|
||
if(m_Result.CoreLith<1) m_Result.CoreLith=1;
|
||
if(m_Result.CoreOil<1) m_Result.CoreOil=1;
|
||
if(m_Result.CoreColor<0) m_Result.CoreColor=0;
|
||
|
||
QString LithologyImage="";
|
||
QString OilGasImage="";
|
||
QString ColorImage="";
|
||
|
||
//
|
||
if(m_Result.CoreLith<1) {
|
||
LithologyImage="";
|
||
}
|
||
else if (liths_SWallCore.size()>=m_Result.CoreLith)
|
||
{
|
||
LithologyImage=::GetSymbolDir()+"/取心岩性符号/"+liths_SWallCore[m_Result.CoreLith-1]+".svg";
|
||
QDir ss(LithologyImage);
|
||
if(!ss.exists()) {
|
||
LithologyImage=::GetSymbolDir()+"/取心岩性符号/"+liths_SWallCore[m_Result.CoreLith-1]+".png";
|
||
}
|
||
}
|
||
if (m_Result.CoreOil>0&&oils_SWallCore.size()>=m_Result.CoreOil)
|
||
{
|
||
OilGasImage=::GetGasSymbolDir()+""+oils_SWallCore[m_Result.CoreOil-1]+".svg";
|
||
}
|
||
else {
|
||
OilGasImage="";
|
||
}
|
||
int ind=colorinds_SWallCore.indexOf(QString::number(m_Result.CoreColor));
|
||
if (ind>-1&&ind<colors_SWallCore.size())
|
||
{
|
||
ColorImage=::GetColorSymbolDir()+""+colors_SWallCore[ind]+".svg";
|
||
}
|
||
else {
|
||
ColorImage="";
|
||
}
|
||
|
||
float width = 1;
|
||
float Sideleft = 0;
|
||
//增加井壁取心
|
||
addSwallCoreToPlot(-m_Result.Depth, LithologyImage, OilGasImage, ColorImage, Sideleft, width, m_Result.CoreColor);
|
||
}
|
||
|
||
//全部清空
|
||
void QMyCustomPlot::DeleteItems_SWallCore()
|
||
{
|
||
if(QMessageBox::information(NULL,QObject::tr("提示"),QObject::tr("该功能将清除当前组件展示的全部信息,清除后无法恢复,但会备份到对应的\"_BAK\"中,确定清除吗?"),QMessageBox::Yes|QMessageBox::No)!=QMessageBox::Yes) return;
|
||
QString obj=m_strLineName + "BAK";
|
||
CopyToSLFFile(m_strSlfName, false, (char *)obj.toStdString().c_str());
|
||
AddTableToWellRound();
|
||
|
||
//删除对象
|
||
TransparentDraggableSwallCore *pDraggableRect =NULL;
|
||
QMap<QString,QObject *>::Iterator it = m_mapDraggable_SwallCore.begin();
|
||
while( it != m_mapDraggable_SwallCore.end() )
|
||
{
|
||
pDraggableRect = (TransparentDraggableSwallCore*)it.value();
|
||
it++;
|
||
pDraggableRect->deleteRect();
|
||
}
|
||
|
||
//保存
|
||
this->SaveToSLF_SwallCore();
|
||
//属性清空
|
||
PropertyService()->InitCurrentViewInfo();
|
||
}
|
||
|
||
//刷新数据
|
||
void QMyCustomPlot::RefreshItems_SWallCore()
|
||
{
|
||
//删除对象
|
||
TransparentDraggableSwallCore *pDraggableRect =NULL;
|
||
QMap<QString,QObject *>::Iterator it = m_mapDraggable_SwallCore.begin();
|
||
while( it != m_mapDraggable_SwallCore.end() )
|
||
{
|
||
pDraggableRect = (TransparentDraggableSwallCore*)it.value();
|
||
it++;
|
||
pDraggableRect->deleteRect();
|
||
}
|
||
|
||
//重新加载
|
||
LoadFromSLF_SwallCore(m_strSlfName, m_strLineName);
|
||
//属性清空
|
||
PropertyService()->InitCurrentViewInfo();
|
||
}
|
||
|
||
bool QMyCustomPlot::LoadFromSLF_SwallCore(QString strSlfName, QString strLineName)
|
||
{
|
||
WALLCORE_DATA m_Result;
|
||
CMemRdWt *logio=new CMemRdWt();
|
||
if(strSlfName==""||!logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead))
|
||
{
|
||
delete logio;
|
||
// QMessageBox::information(NULL,"提示","SLF文件打开失败,请检查!!",QMessageBox::Yes);
|
||
return false;
|
||
}
|
||
|
||
QStringList liths;
|
||
QStringList oils;
|
||
QStringList colors;
|
||
QStringList colorinds;
|
||
|
||
QString cs=GetConfPath();
|
||
QString color;
|
||
for(int j=0;j<4;j++)
|
||
{
|
||
if(j==0) color=cs+"corecolor.ini";
|
||
else if(j==1) color=cs+"corelith.ini";
|
||
else if(j==2) color=cs+"coreoil.ini";
|
||
else color=cs+"colorind.ini";
|
||
FILE *fp=fopen(color.toStdString().c_str(),"rt");
|
||
QStringList ss;
|
||
char buf[100];
|
||
if(fp) {
|
||
while(!feof(fp)) {
|
||
fscanf(fp,"%s",buf);
|
||
ss.append(buf);
|
||
}
|
||
fclose(fp);
|
||
}
|
||
if(j==0) colors=ss;
|
||
else if(j==1) liths=ss;
|
||
else if(j==2) oils=ss;
|
||
else colorinds=ss;
|
||
}
|
||
|
||
//
|
||
int iIndex=logio->OpenTable(strLineName.toStdString().c_str());
|
||
if(iIndex>-1) {
|
||
int count=logio->GetTableRecordCount(iIndex);
|
||
for(int i=0;i<count;i++) {
|
||
memset(&m_Result,0,sizeof(WALLCORE_DATA));
|
||
logio->ReadTable(iIndex,i+1,&m_Result);
|
||
double top=m_Result.Depth;
|
||
double bottom=m_Result.Depth;
|
||
|
||
QString LithologyImage="";
|
||
QString OilGasImage="";
|
||
QString ColorImage="";
|
||
|
||
//
|
||
if(m_Result.CoreLith<1) {
|
||
LithologyImage="";
|
||
}
|
||
else if (liths.size()>=m_Result.CoreLith)
|
||
{
|
||
LithologyImage=::GetSymbolDir()+"/取心岩性符号/"+liths[m_Result.CoreLith-1]+".svg";
|
||
QDir ss(LithologyImage);
|
||
if(!ss.exists()) {
|
||
LithologyImage=::GetSymbolDir()+"/取心岩性符号/"+liths[m_Result.CoreLith-1]+".png";
|
||
}
|
||
}
|
||
if (m_Result.CoreOil>0&&oils.size()>=m_Result.CoreOil)
|
||
{
|
||
OilGasImage=::GetGasSymbolDir()+""+oils[m_Result.CoreOil-1]+".svg";
|
||
}
|
||
else {
|
||
OilGasImage="";
|
||
}
|
||
int ind=colorinds.indexOf(QString::number(m_Result.CoreColor));
|
||
if (ind>-1&&ind<colors.size())
|
||
{
|
||
ColorImage=::GetColorSymbolDir()+""+colors[ind]+".svg";
|
||
}
|
||
else {
|
||
ColorImage="";
|
||
}
|
||
float depth = m_Result.Depth;
|
||
float width = 1;
|
||
float Sideleft = m_Result.left;
|
||
if(m_Result.width<=0)
|
||
{
|
||
width = 1;
|
||
}
|
||
else
|
||
{
|
||
width = m_Result.width;
|
||
}
|
||
if(Sideleft<0) Sideleft=0;
|
||
if(width<=0) width=1;
|
||
|
||
//
|
||
addSwallCoreToPlot(-m_Result.Depth, LithologyImage, OilGasImage, ColorImage, Sideleft, width, m_Result.CoreColor);
|
||
}
|
||
logio->CloseTable(iIndex);
|
||
}
|
||
delete logio;
|
||
return true;
|
||
}
|
||
|
||
//从剪切板文本数据粘贴
|
||
void QMyCustomPlot::addItems_Core()
|
||
{
|
||
QClipboard *clipboard = QApplication::clipboard(); //获取系统剪贴板指针
|
||
QString originalText = clipboard->text(); //获取剪贴板上文本信息
|
||
int isspace=originalText.indexOf(" ");
|
||
int istab=originalText.indexOf("\t");
|
||
int isd=originalText.indexOf(",");
|
||
|
||
if((istab>-1|isd>-1)&&isspace>-1)
|
||
{
|
||
QMessageBox::information(NULL,"提示", "\",\"或制表符与空格键并存,自动分解可能有误!\n建议用单一符号风格!");
|
||
}
|
||
originalText.replace(","," ");
|
||
originalText.replace("\t"," ");
|
||
originalText.replace("\r\n","\n");
|
||
originalText.replace("\r","\n");
|
||
|
||
QStringList line=originalText.split("\n");
|
||
QString ss=m_strSlfName;
|
||
CMemRdWt *logio=new CMemRdWt();
|
||
if(ss==""||!logio->Open(ss.toStdString().c_str(),CSlfIO::modeReadWrite))
|
||
{
|
||
delete logio;
|
||
QMessageBox::information(NULL,"提示","SLF文件打开失败,请检查!!",QMessageBox::Yes);
|
||
return;
|
||
}
|
||
bool isfirst=false;
|
||
int iIndex=logio->OpenTable(m_strLineName.toStdString().c_str());
|
||
if(iIndex<=0){
|
||
delete logio;
|
||
QMessageBox::information(NULL,"提示","缺失表"+m_strLineName+",请检查!!",QMessageBox::Yes);
|
||
return;
|
||
}
|
||
|
||
int k=0;
|
||
for(int i=0;i<line.size();i++) {
|
||
QStringList coredat=line[i].split(" ");
|
||
if((istab==-1||isd==-1)&&isspace>=0) coredat.removeAll("");
|
||
if(coredat.size()<1) continue;
|
||
if(coredat[0].isEmpty()) continue;
|
||
if(!i) {
|
||
if(coredat.size()<4){
|
||
QMessageBox::information(NULL,"提示","字段数不能小于4个!\nNO DEPTH CURRDEPTH AC DEN ...\n1 2200 220.1 350 2.3\n2 2202 2202.2 340 25.0\n");
|
||
delete logio;
|
||
if(isfirst)this->AddTableToWellRound();
|
||
return;
|
||
}
|
||
if(!coredat[0].isEmpty()&&!coredat[0].at(0).isDigit())
|
||
{
|
||
if(iIndex>=0) {
|
||
int count=logio->GetTableFieldCount(iIndex);
|
||
if(count!=coredat.size()) {
|
||
logio->DiscardObject(m_strLineName.toStdString().c_str());
|
||
}
|
||
iIndex=-1;
|
||
}
|
||
if (iIndex < 0)
|
||
{
|
||
QString Names=coredat.join(",");
|
||
Names=Names.toUpper();
|
||
QString types="1";
|
||
for(int i=0;i<coredat.size()-1;i++) types+=",4";
|
||
QString lengs="4";
|
||
for(int i=0;i<coredat.size()-1;i++) lengs+=",4";
|
||
QString ress="0";
|
||
for(int i=0;i<coredat.size()-1;i++) ress+=",0";
|
||
iIndex=logio->Open_Set_Table(m_strLineName.toStdString().c_str(),CORE_PHYSICS_OBJECT,coredat.size(),
|
||
(char*)Names.toStdString().c_str(),
|
||
(char*)lengs.toStdString().c_str(),//字段长度
|
||
(char*)types.toStdString().c_str(),//字段类型
|
||
(char*)ress.toStdString().c_str());//字段备注,1-枚举
|
||
//if(coredat.indexOf(CoreObj->GetFieldName())==-1) CoreObj->SetFieldName(coredat.at(3));
|
||
isfirst=true;
|
||
}
|
||
logio->SetTableRecordCount(iIndex,0);
|
||
//if(CoreObj->GetFieldName().isEmpty()||coredat.indexOf(CoreObj->GetFieldName())<0) CoreObj->SetFieldName(coredat[3]);
|
||
continue;
|
||
}
|
||
else {
|
||
QMessageBox::information(NULL,"提示", "首行必须是表头!如:\nNO,DEPTH,...");
|
||
delete logio;
|
||
if(isfirst)this->AddTableToWellRound();
|
||
return;
|
||
}
|
||
}
|
||
else {
|
||
//
|
||
if(!coredat[0].isEmpty()&&!coredat[0].at(0).isDigit()) continue;
|
||
for(int j=0;j<coredat.size();j++)
|
||
{
|
||
float yy=coredat[j].toFloat();
|
||
logio->SetTableFieldData(iIndex,j,(char*)&yy,k+1);
|
||
}
|
||
k++;
|
||
}
|
||
}
|
||
delete logio;
|
||
if(isfirst)this->AddTableToWellRound();
|
||
|
||
// //保存
|
||
// this->SaveToSLF_SwallCore();
|
||
// //属性清空
|
||
// PropertyService()->InitCurrentViewInfo();
|
||
}
|
||
|
||
//从剪切板文本数据粘贴
|
||
void QMyCustomPlot::addItems_Gujing()
|
||
{
|
||
QClipboard *clipboard = QApplication::clipboard(); //获取系统剪贴板指针
|
||
QString originalText = clipboard->text(); //获取剪贴板上文本信息
|
||
int isspace=originalText.indexOf(" ");
|
||
int istab=originalText.indexOf("\t");
|
||
int isd=originalText.indexOf(",");
|
||
|
||
if((istab>-1|isd>-1)&&isspace>-1)
|
||
{
|
||
QMessageBox::information(NULL,"提示", "\",\"或制表符与空格键并存,自动分解可能有误!\n建议用单一符号风格!");
|
||
}
|
||
originalText.replace(","," ");
|
||
originalText.replace("\t"," ");
|
||
originalText.replace("\r\n","\n");
|
||
originalText.replace("\r","\n");
|
||
QStringList line=originalText.split("\n");
|
||
QStringList old;
|
||
for(int i=0;i<line.size();i++) {
|
||
QStringList coredat=line[i].split(" ");
|
||
if((istab==-1||isd==-1)&&isspace>=0) coredat.removeAll("");
|
||
if(coredat.size()<1) continue;
|
||
if(!coredat[0].isEmpty()&&!coredat[0].at(0).isDigit()) continue;
|
||
if(coredat.size()<3) {
|
||
if(old.size()<1) {
|
||
old=coredat;
|
||
continue;
|
||
}
|
||
else {
|
||
QStringList cs;
|
||
cs.append(old[0]);
|
||
cs.append(old[1]);
|
||
cs.append(coredat[1]);
|
||
// cs.append(old[2]);
|
||
old=coredat;
|
||
coredat=cs;
|
||
}
|
||
}
|
||
//添加固井结论
|
||
int NO = coredat[0].toInt();
|
||
float SDEP = coredat[1].toDouble();
|
||
float EDEP = coredat[2].toDouble();
|
||
int iRESULT = 0;
|
||
QString result = "";
|
||
if(coredat.size()>3) {
|
||
if(coredat[3].at(0).isDigit()) {
|
||
iRESULT = coredat[3].toInt();
|
||
QString iconshotname=zoneOrder_Gujing.key(QString::number(iRESULT));
|
||
if(iconshotname!="")
|
||
result=::GetGujingSymbolDir()+iconshotname+".svg";
|
||
}
|
||
else
|
||
{
|
||
QStringList vals=zoneOrder_Gujing.keys();
|
||
coredat[3].trimmed();
|
||
int j=vals.indexOf(coredat[3]);
|
||
if(j>-1) {
|
||
result=::GetGujingSymbolDir()+vals[j]+".svg";
|
||
}
|
||
}
|
||
}
|
||
|
||
//
|
||
int len=2;
|
||
int pos=result.indexOf(".//");
|
||
if(pos<0) pos=result.indexOf("./");
|
||
else len=3;
|
||
QString svg;
|
||
if(pos==0)
|
||
{
|
||
svg=QCoreApplication::applicationDirPath()+ QDir::separator();
|
||
svg+=result.mid(len-1);
|
||
}
|
||
else svg=result;
|
||
QDir ss;
|
||
if(!ss.exists(svg))
|
||
{
|
||
QString path=svg.left(svg.lastIndexOf('.')+1);
|
||
svg=path+"png";
|
||
}
|
||
result=QDir::toNativeSeparators(svg);
|
||
|
||
//显示固井
|
||
addGujingToPlot(-EDEP, -SDEP, result);
|
||
}
|
||
//保存
|
||
this->SaveToSLF_Gujing();
|
||
//属性清空
|
||
PropertyService()->InitCurrentViewInfo();
|
||
}
|
||
|
||
//取消选中
|
||
void QMyCustomPlot::ClearSelectItems()
|
||
{
|
||
//属性清空
|
||
PropertyService()->InitCurrentViewInfo();
|
||
}
|
||
|
||
//全部清空
|
||
void QMyCustomPlot::DeleteItems_Gujing()
|
||
{
|
||
if(QMessageBox::information(NULL,QObject::tr("提示"),QObject::tr("该功能将清除当前组件展示的全部信息,清除后无法恢复,但会备份到对应的\"_BAK\"中,确定清除吗?"),QMessageBox::Yes|QMessageBox::No)!=QMessageBox::Yes) return;
|
||
QString obj=m_strLineName + "BAK";
|
||
CopyToSLFFile(m_strSlfName, false, (char *)obj.toStdString().c_str());
|
||
AddTableToWellRound();
|
||
|
||
//删除对象
|
||
TransparentDraggableGujing *pDraggableRect =NULL;
|
||
QMap<QString,QObject *>::Iterator it = m_mapDraggable_Gujing.begin();
|
||
while( it != m_mapDraggable_Gujing.end() )
|
||
{
|
||
pDraggableRect = (TransparentDraggableGujing*)it.value();
|
||
it++;
|
||
pDraggableRect->deleteRect();
|
||
}
|
||
|
||
//保存
|
||
this->SaveToSLF_Gujing();
|
||
//属性清空
|
||
PropertyService()->InitCurrentViewInfo();
|
||
}
|
||
|
||
//刷新数据
|
||
void QMyCustomPlot::RefreshItems_Gujing()
|
||
{
|
||
//删除对象
|
||
TransparentDraggableGujing *pDraggableRect =NULL;
|
||
QMap<QString,QObject *>::Iterator it = m_mapDraggable_Gujing.begin();
|
||
while( it != m_mapDraggable_Gujing.end() )
|
||
{
|
||
pDraggableRect = (TransparentDraggableGujing*)it.value();
|
||
it++;
|
||
pDraggableRect->deleteRect();
|
||
}
|
||
|
||
//重新加载
|
||
LoadFromSLF_Gujing(m_strSlfName, m_strLineName);
|
||
//属性清空
|
||
PropertyService()->InitCurrentViewInfo();
|
||
}
|
||
|
||
//合并结论
|
||
void QMyCustomPlot::MegResult_Gujing()
|
||
{
|
||
typedef struct ss_struct{
|
||
int NO;
|
||
float SDEP,EDEP;
|
||
int RESULT;
|
||
} GUJING;
|
||
CMemRdWt *MemRdWt=new CMemRdWt();
|
||
if(!MemRdWt->Open(m_strSlfName.toStdString().c_str(),CMemRdWt::modeReadWrite)) {
|
||
delete MemRdWt;
|
||
return;
|
||
}
|
||
int itable2=MemRdWt->OpenOG_RESULT(m_strLineName.toStdString().c_str());
|
||
if(itable2<1) {
|
||
delete MemRdWt;
|
||
return;
|
||
}
|
||
GUJING *pg1=NULL;
|
||
GUJING *pgb=NULL;
|
||
int rec1=0;
|
||
int j=0;
|
||
int jj=0;
|
||
|
||
////////////////////////////////////////////
|
||
rec1=MemRdWt->GetTableRecordCount(itable2);
|
||
if(rec1<=0) {
|
||
QMessageBox::information(NULL,"提示","没有数据,终止运行!");
|
||
return;
|
||
}
|
||
pg1=new GUJING[rec1];
|
||
pgb=new GUJING[rec1];
|
||
for(j=0;j<rec1;j++) {
|
||
MemRdWt->ReadTable(itable2,j+1,&pg1[j]);
|
||
}
|
||
jj=0;
|
||
for(j=0;j<rec1;j++) {
|
||
if(j!=0&&pg1[j].EDEP-pg1[j].SDEP<0.2) {
|
||
pgb[jj-1].EDEP=pg1[j].EDEP;
|
||
}
|
||
else {
|
||
memmove((char *)&pgb[jj],(char *)&pg1[j],sizeof(GUJING));
|
||
jj++;
|
||
}
|
||
}
|
||
rec1=jj;
|
||
jj=0;
|
||
for(j=1;j<rec1;j++) {
|
||
if(pgb[j].RESULT==pgb[jj].RESULT) {
|
||
pgb[jj].EDEP=pgb[j].EDEP;
|
||
pgb[j].RESULT=-1;
|
||
}
|
||
else {
|
||
jj=j;
|
||
}
|
||
}
|
||
MemRdWt->SetTableRecordCount(itable2,0);
|
||
jj=0;
|
||
for(j=0;j<rec1;j++) {
|
||
if(pgb[j].RESULT!=-1) {
|
||
pgb[j].NO=jj;
|
||
MemRdWt->WriteTable(itable2,jj+1,&pgb[j]);
|
||
jj++;
|
||
}
|
||
}
|
||
|
||
delete pg1;
|
||
delete pgb;
|
||
delete MemRdWt;
|
||
|
||
//刷新数据
|
||
RefreshItems_Gujing();
|
||
}
|
||
|
||
//加载固井slf数据
|
||
bool QMyCustomPlot::LoadFromSLF_Gujing(QString strSlfName, QString strLineName)
|
||
{
|
||
CMemRdWt *logio=new CMemRdWt();
|
||
if(!logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead))
|
||
{
|
||
delete logio;
|
||
// QMessageBox::information(NULL,"提示","SLF文件打开失败,请检查!!",QMessageBox::Yes);
|
||
return false;
|
||
}
|
||
|
||
QString configfile=GetConfPath()+GetOilFieldName()+"GujingOrder.ini";
|
||
QStringList lines;
|
||
QFile file( configfile );
|
||
if ( file.open( QIODevice::ReadOnly ) ) {
|
||
QTextStream stream( &file );
|
||
stream.setCodec("UTF-8"); // 设置UTF-8编码
|
||
QString line;
|
||
int n = 1;
|
||
while ( !stream.atEnd() ) {
|
||
line = stream.readLine(); // 不包括“\n”的一行文本
|
||
lines += line;
|
||
}
|
||
file.close();
|
||
}
|
||
|
||
//QMap<QString,QString> zoneOrder;
|
||
for(int i=0;i<lines.size();i++){
|
||
zoneOrder_Gujing.insert(lines[i],QString::number(i));
|
||
}
|
||
|
||
int iIndex=logio->OpenTable(strLineName.toStdString().c_str());
|
||
if(iIndex>-1) {
|
||
int len=logio->GetTableRecordLength(iIndex);
|
||
int sl=sizeof(GUJING_DATA);
|
||
if(sl>len) len=sl;
|
||
GUJING_DATA *m_Result;
|
||
m_Result=(GUJING_DATA *)new char[len+1];
|
||
int count=logio->GetTableRecordCount(iIndex);
|
||
for(int i=0;i<count;i++) {
|
||
memset(m_Result,0,len);
|
||
logio->ReadTable(iIndex,i+1,m_Result);
|
||
|
||
int NO = m_Result->NO;
|
||
float SDEP = m_Result->SDEP;
|
||
float EDEP = m_Result->EDEP;
|
||
int iRESULT = m_Result->RESULT;
|
||
QString result = "";
|
||
|
||
//
|
||
QString iconshotname=zoneOrder_Gujing.key(QString::number(m_Result->RESULT));
|
||
if(iconshotname!="")
|
||
result=::GetGujingSymbolDir()+iconshotname+".svg";
|
||
int len=2;
|
||
int pos=result.indexOf(".//");
|
||
if(pos<0) pos=result.indexOf("./");
|
||
else len=3;
|
||
QString svg;
|
||
if(pos==0)
|
||
{
|
||
svg=QCoreApplication::applicationDirPath()+ QDir::separator();
|
||
svg+=result.mid(len-1);
|
||
}
|
||
else svg=result;
|
||
QDir ss;
|
||
if(!ss.exists(svg))
|
||
{
|
||
QString path=svg.left(svg.lastIndexOf('.')+1);
|
||
svg=path+"png";
|
||
}
|
||
result=QDir::toNativeSeparators(svg);
|
||
|
||
//显示固井
|
||
addGujingToPlot(-EDEP, -SDEP, result);
|
||
}
|
||
logio->CloseTable(iIndex);
|
||
delete m_Result;
|
||
}
|
||
delete logio;
|
||
return true;
|
||
}
|
||
|
||
bool QMyCustomPlot::CopyToSLFFile(QString targetSLFFileName, bool deleteFromSrc, char*newCurveName)
|
||
{
|
||
if(m_strSlfName=="") return false;
|
||
CLogIO a_cslfio;
|
||
CLogIO * logio=new CLogIO();
|
||
if(!logio->Open(targetSLFFileName.toStdString().c_str(),CSlfIO::modeReadWrite))
|
||
{
|
||
delete logio;
|
||
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败,请检查!");
|
||
return false;
|
||
};
|
||
if(!a_cslfio.Open(m_strSlfName.toStdString().c_str(),CSlfIO::modeReadWrite))
|
||
{
|
||
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败,请检查!");
|
||
delete logio;
|
||
return false;
|
||
};
|
||
char* curvename=new char[65];
|
||
curvename[64]='\0';
|
||
strcpy(curvename, m_strLineName.toStdString().c_str());
|
||
if(newCurveName) logio->CopyFromFile(a_cslfio, curvename, newCurveName);
|
||
else logio->CopyFromFile(a_cslfio,curvename);
|
||
delete[] curvename;
|
||
delete logio;
|
||
}
|
||
|
||
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)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableImage *dragRect = new TransparentDraggableImage(this, strUuid);
|
||
//图片,提前设值,后面setRange改变
|
||
dragRect->setResult(imagePath);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(QColor(255, 255, 255, 80)); // 半透明红色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
//dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_Image[strUuid] = dragRect;
|
||
}
|
||
|
||
void QMyCustomPlot::addSelectRectToPlot(double left_Low, double right_Hight, int left_Low_Number, int right_Hight_Number)
|
||
{
|
||
//qDebug() << "QMyCustomPlot addSelectRectToPlot";
|
||
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableSelectRect *dragRect = new TransparentDraggableSelectRect(this, strUuid);
|
||
//图片,提前设值,后面setRange改变
|
||
dragRect->setNumber(left_Low_Number, right_Hight_Number);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(QColor(255, 255, 255, 80)); // 半透明红色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
//dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_SelectRect[strUuid] = dragRect;
|
||
}
|
||
|
||
//预览
|
||
void QMyCustomPlot::addRightListToPlot( QList<double> new_DepthList, QList<double> new_ValueListt)
|
||
{
|
||
//qDebug() << "QMyCustomPlot addSelectRectToPlot";
|
||
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableRightList *dragRect = new TransparentDraggableRightList(this, strUuid);
|
||
//图片,提前设值,后面setRange改变
|
||
dragRect->setRightList(new_DepthList, new_ValueListt);
|
||
// 设置初始范围
|
||
dragRect->setRange(new_DepthList[new_DepthList.size()-1], new_DepthList[0]);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(QColor(255, 255, 255, 80)); // 半透明红色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
//dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_RightList[strUuid] = dragRect;
|
||
}
|
||
|
||
//校深线段
|
||
void QMyCustomPlot::s_AddShifLineToPlot(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double left_Low, double right_Hight)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
addLineToPlot(left_Low, right_Hight, "");
|
||
}
|
||
|
||
//清除当前分段线
|
||
void QMyCustomPlot::s_DelSelectShiftLineFromPlot(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
if(m_SelectShiftLine)
|
||
{
|
||
TransparentDraggableLine *pDraggableLine = (TransparentDraggableLine *)m_SelectShiftLine;
|
||
pDraggableLine->deleteRect();
|
||
}
|
||
}
|
||
|
||
//清除全部分段线
|
||
void QMyCustomPlot::s_DelAllShiftLineFromPlot(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
TransparentDraggableLine *pDraggableLine =NULL;
|
||
QMap<QString,QObject *>::Iterator it = m_mapDraggable_Line.begin();
|
||
while( it != m_mapDraggable_Line.end() )
|
||
{
|
||
pDraggableLine = (TransparentDraggableLine*)it.value();
|
||
it++;
|
||
pDraggableLine->deleteRect();
|
||
}
|
||
}
|
||
|
||
//执行校正
|
||
void QMyCustomPlot::s_RuncorFromPlot(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
QList<double> left_Low_List;
|
||
QList<double> right_Hight_List;
|
||
|
||
TransparentDraggableLine *pDraggableLine =NULL;
|
||
QMap<QString,QObject *>::Iterator it = m_mapDraggable_Line.begin();
|
||
while( it != m_mapDraggable_Line.end() )
|
||
{
|
||
pDraggableLine = (TransparentDraggableLine*)it.value();
|
||
left_Low_List.append(0-pDraggableLine->m_left_Low);
|
||
right_Hight_List.append(0-pDraggableLine->m_right_Hight);
|
||
|
||
//
|
||
it++;
|
||
}
|
||
|
||
if(left_Low_List.size()<=0)
|
||
{
|
||
QMessageBox::warning(nullptr, "提示", "无校正深度线或深度移动量!");
|
||
return;
|
||
}
|
||
|
||
//执行校正
|
||
emit CallManage::getInstance()->sig_Runcor_List(m_strUuid, left_Low_List, right_Hight_List);
|
||
}
|
||
|
||
//执行拼接
|
||
void QMyCustomPlot::s_MergeFromPlot(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
QList<double> left_Low_List;
|
||
QList<double> right_Hight_List;
|
||
|
||
TransparentDraggableLine *pDraggableLine =NULL;
|
||
QMap<QString,QObject *>::Iterator it = m_mapDraggable_Line.begin();
|
||
while( it != m_mapDraggable_Line.end() )
|
||
{
|
||
pDraggableLine = (TransparentDraggableLine*)it.value();
|
||
left_Low_List.append(0-pDraggableLine->m_left_Low);
|
||
right_Hight_List.append(0-pDraggableLine->m_right_Hight);
|
||
|
||
//
|
||
it++;
|
||
}
|
||
|
||
if(left_Low_List.size()<=0)
|
||
{
|
||
QMessageBox::warning(nullptr, "提示", "曲线拼接深度点不存在,无法拼接!请先设置拼接深度点。");
|
||
return;
|
||
}
|
||
|
||
//执行拼接
|
||
emit CallManage::getInstance()->sig_Merge_List(m_strUuid, left_Low_List, right_Hight_List);
|
||
}
|
||
|
||
//关闭预览框
|
||
void QMyCustomPlot::s_PreMerge_Close(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
TransparentDraggableRightList *pDraggableRect =NULL;
|
||
{
|
||
QMap<QString,QObject *>::Iterator it = this->m_mapDraggable_RightList.begin();
|
||
if( it != this->m_mapDraggable_RightList.end() )
|
||
{
|
||
pDraggableRect = (TransparentDraggableRightList*)it.value();
|
||
pDraggableRect->deleteRect();
|
||
}
|
||
}
|
||
}
|
||
|
||
void QMyCustomPlot::s_PreMerge_FromRightList(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QList<double> new_DepthList, QList<double> new_ValueList)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
//预览
|
||
addRightListToPlot(new_DepthList, new_ValueList);
|
||
}
|
||
|
||
//执行预览
|
||
void QMyCustomPlot::s_PreMergeFromPlot(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
QList<double> left_Low_List;
|
||
QList<double> right_Hight_List;
|
||
|
||
TransparentDraggableLine *pDraggableLine =NULL;
|
||
QMap<QString,QObject *>::Iterator it = m_mapDraggable_Line.begin();
|
||
while( it != m_mapDraggable_Line.end() )
|
||
{
|
||
pDraggableLine = (TransparentDraggableLine*)it.value();
|
||
left_Low_List.append(0-pDraggableLine->m_left_Low);
|
||
right_Hight_List.append(0-pDraggableLine->m_right_Hight);
|
||
|
||
//
|
||
it++;
|
||
}
|
||
|
||
if(left_Low_List.size()<=0)
|
||
{
|
||
QMessageBox::warning(nullptr, "提示", "曲线拼接深度点不存在,无法拼接!请先设置拼接深度点。");
|
||
return;
|
||
}
|
||
|
||
//执行预览
|
||
emit CallManage::getInstance()->sig_PreMerge_List(m_strUuid, m_strSlfName, m_strWellName, m_strTrackName, m_strLineName, left_Low_List, right_Hight_List);
|
||
}
|
||
|
||
//Plot重新加载数据
|
||
void QMyCustomPlot::s_ReloadPlot(QString strUuid, QString strSlfName, QString strLineName)
|
||
{
|
||
if(m_strSlfName == strSlfName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
//读取slf
|
||
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;
|
||
return;
|
||
}
|
||
|
||
Slf_CURVE curveinfo;
|
||
float *val;
|
||
DWORD count;
|
||
float sdep,edep,rlev;
|
||
//
|
||
logio->GetCurveInfo(index,&curveinfo);
|
||
sdep=curveinfo.StartDepth;
|
||
edep=curveinfo.EndDepth;
|
||
rlev=curveinfo.DepLevel;
|
||
//
|
||
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;
|
||
|
||
//slf文件读取曲线
|
||
QVector<double> x, y;
|
||
for(int i=0; i<count; i++)
|
||
{
|
||
x.append(-(sdep+ rlev*i));
|
||
y.append(val[i]);
|
||
}
|
||
|
||
//先清空
|
||
m_x.clear();
|
||
m_y.clear();
|
||
//
|
||
m_x.append(x);
|
||
m_y.append(y);
|
||
|
||
graph(0)->data()->clear();
|
||
graph(0)->setData(m_x, m_y);
|
||
replot(QCustomPlot::rpQueuedReplot); //刷新曲线
|
||
}
|
||
|
||
void QMyCustomPlot::s_changeDrawProperty(QVariantList vlist)
|
||
{
|
||
QString strUuid = vlist.at(0).toString();
|
||
QString strSlfName = vlist.at(1).toString();
|
||
QString strWellName = vlist.at(2).toString();
|
||
QString strTrackName = vlist.at(3).toString();
|
||
QString strLineName = vlist.at(4).toString();
|
||
|
||
if (m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
QString strProperty = vlist.at(5).toString();
|
||
QVariant varVal = vlist.at(6).toString();
|
||
if ("类型" == strProperty)
|
||
{
|
||
m_nDrawType = varVal.toInt();
|
||
this->changePropertyWaveUpdate();
|
||
}
|
||
else if ("绘制波深度" == strProperty)
|
||
{
|
||
m_bDrawDepth = varVal.toBool();
|
||
this->changePropertyWaveUpdate();
|
||
}
|
||
else if ("绘制波基线" == strProperty)
|
||
{
|
||
m_bDrawBase = varVal.toBool();
|
||
this->changePropertyWaveUpdate();
|
||
}
|
||
else if ("奇偶配色" == strProperty)
|
||
{
|
||
m_bOddEven = varVal.toBool();
|
||
this->changePropertyWaveUpdate();
|
||
}
|
||
else if ("波列基值" == strProperty)
|
||
{
|
||
m_Base = varVal.toFloat();
|
||
this->changePropertyWaveUpdate();
|
||
}
|
||
else if ("波形间隔" == strProperty)
|
||
{
|
||
m_nWaveJg = varVal.toInt();
|
||
this->changePropertyWaveUpdate();
|
||
}
|
||
else if ("波形高度" == strProperty)
|
||
{
|
||
m_nWaveHei = varVal.toInt();
|
||
this->changePropertyWaveUpdate();
|
||
}
|
||
else if ("颜色" == strProperty)
|
||
{
|
||
m_newColor = varVal.value<QColor>();
|
||
this->changePropertyWaveUpdate();
|
||
}
|
||
else if ("方式" == strProperty)
|
||
{
|
||
m_nMode = varVal.toFloat();
|
||
this->updateWave();
|
||
}
|
||
else if ("左刻度" == strProperty)
|
||
{
|
||
|
||
}
|
||
else if ("右刻度" == strProperty)
|
||
{
|
||
if (m_colorMap)
|
||
{
|
||
m_fScaleV = varVal.toFloat();
|
||
float f = 264 / m_fScaleV;
|
||
m_colorMap->data()->setValueRange(QCPRange(m_fmin, m_fmax*f));
|
||
}
|
||
}
|
||
else if ("最大振幅" == strProperty)
|
||
{
|
||
m_MaxRange = varVal.toDouble();
|
||
this->changePropertyWaveUpdate();
|
||
}
|
||
else if ("色板" == strProperty)
|
||
{
|
||
this->setSchemeIndex(varVal.toInt(), m_nColorNum);
|
||
}
|
||
else if ("变密度颜色级数" == strProperty)
|
||
{
|
||
this->setSchemeIndex(m_nSchemeIndex, varVal.toInt());
|
||
}
|
||
else if ("结论占比%" == strProperty)
|
||
{
|
||
this->setShowProperty(varVal, 1);
|
||
}
|
||
else if ("显示位置(cm)" == strProperty)
|
||
{
|
||
this->setShowProperty(varVal, 2);
|
||
}
|
||
else if ("显示层号" == strProperty)
|
||
{
|
||
this->setShowProperty(varVal, 3);
|
||
}
|
||
else if ("层号字体" == strProperty)
|
||
{
|
||
this->setShowProperty(varVal, 4);
|
||
}
|
||
this->replot();
|
||
}
|
||
}
|
||
|
||
void QMyCustomPlot::addLineToPlot(double left_Low, double right_Hight, const QString strText, QColor crColor)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableLine *dragRect = new TransparentDraggableLine(this, strUuid);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(crColor); // 半透明白色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_Line[strUuid] = dragRect;
|
||
}
|
||
|
||
void QMyCustomPlot::addTextToPlot(double left_Low, double right_Hight, const QString strText, QColor crColor)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
// 在初始化代码中
|
||
TransparentDraggableRect *dragRect = new TransparentDraggableRect(this, strUuid);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(crColor); // 半透明白色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_Rect[strUuid] = dragRect;
|
||
}
|
||
|
||
TransparentGroupResult* QMyCustomPlot::addResultGroup(double left_Low, double right_Hight, QString &strUuid, QString strText /*= ""*/)
|
||
{
|
||
TransparentGroupResult *upGroup = nullptr;
|
||
if (strUuid != "")
|
||
{
|
||
upGroup = (TransparentGroupResult *)m_mapDragGroup[strUuid];
|
||
}
|
||
|
||
strUuid = getUUid();
|
||
|
||
// 在初始化代码中addResultToPlot
|
||
TransparentGroupResult *dragRect = new TransparentGroupResult(this, upGroup, strUuid);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
dragRect->setTitle(strText);
|
||
|
||
m_mapDragGroup[strUuid] = dragRect;
|
||
|
||
return dragRect;
|
||
}
|
||
|
||
void QMyCustomPlot::addResultToPlot(double left_Low, double right_Hight, QString myResult, QString &strUuid, QString strText)
|
||
{
|
||
//获取上方Rect
|
||
TransparentDraggableResult *upDragRect = nullptr;
|
||
if(strUuid!="")
|
||
{
|
||
upDragRect = (TransparentDraggableResult *)m_mapDraggable_Result[strUuid];
|
||
}
|
||
|
||
strUuid = getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableResult *dragRect = new TransparentDraggableResult(this, upDragRect, strUuid);
|
||
//图片,提前设值,后面setRange改变
|
||
dragRect->setResult(myResult);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
//dragRect->setColor(QColor(255, 0, 0, 80)); // 半透明红色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_Result[strUuid] = dragRect;
|
||
}
|
||
|
||
void QMyCustomPlot::addSwallCoreToPlot(double Depth, QString LithologyImage, QString OilGasImage, QString ColorImage, double Sideleft, double width, int iColor)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableSwallCore *dragRect = new TransparentDraggableSwallCore(this, strUuid);
|
||
//图片,提前设值,后面setRange改变
|
||
dragRect->setOil(OilGasImage);
|
||
dragRect->setLith(LithologyImage);
|
||
dragRect->setTitle(QString::number(iColor));
|
||
//左侧空白
|
||
dragRect->m_fLeftSpace = Sideleft*g_dPixelPerCm;
|
||
// 设置初始范围
|
||
double h = SideWallCoreHeight * g_dPixelPerCm; //0.4cm //40;
|
||
double x1 = this->xAxis->coordToPixel(Depth);
|
||
//
|
||
double Depth2 = this->xAxis->pixelToCoord(x1-h);
|
||
dragRect->setRange(Depth, Depth2);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(QColor(255, 255, 255, 80)); // 半透明红色255, 100, 100, 80
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
//dragRect->setColor(myColor);
|
||
|
||
m_mapDraggable_SwallCore[strUuid] = dragRect;
|
||
|
||
//刷新
|
||
//this->replot();
|
||
}
|
||
|
||
void QMyCustomPlot::addGeoLithToPlot(double left_Low, double right_Hight, const QString myLith, const QString myOil, const QString myColor)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableGeoLith *dragRect = new TransparentDraggableGeoLith(this, strUuid);
|
||
//图片,提前设值,后面setRange改变
|
||
dragRect->setOil(myOil);
|
||
dragRect->setLith(myLith, myColor);
|
||
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(QColor(255, 255, 255, 80)); // 半透明红色255, 100, 100, 80
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
//dragRect->setColor(myColor);
|
||
|
||
m_mapDraggable_GeoLith[strUuid] = dragRect;
|
||
|
||
//刷新
|
||
//this->replot();
|
||
}
|
||
|
||
void QMyCustomPlot::addGujingToPlot(double left_Low, double right_Hight, const QString strResult)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableGujing *dragRect = new TransparentDraggableGujing(this, strUuid);
|
||
//图片,提前设值,后面setRange改变
|
||
dragRect->setResult(strResult);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(QColor(255, 255, 255, 80)); // 半透明红色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
//dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_Gujing[strUuid] = dragRect;
|
||
|
||
}
|
||
|
||
//气测/FMT/射孔/文本
|
||
void QMyCustomPlot::addJiegutextToPlot(double left_Low, double right_Hight, const QStringList strText, int &iMaxNum, QColor crColor)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableJiegutext *dragRect = new TransparentDraggableJiegutext(this, strUuid, 1.0, strText);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(crColor); // 半透明白色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
//dragRect->setTitle(strText);//直接创建时赋值
|
||
|
||
m_mapDraggable_Jiegutext[strUuid] = dragRect;
|
||
//
|
||
iMaxNum = dragRect->iMaxNum;
|
||
}
|
||
|
||
//沉积相-微相
|
||
void QMyCustomPlot::addMFacToPlot(double left_Low, double right_Hight, const QString strText, QColor crColor)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableMFac *dragRect = new TransparentDraggableMFac(this, strUuid);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(crColor); // 半透明白色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_MFac[strUuid] = dragRect;
|
||
}
|
||
|
||
//沉积相-亚相
|
||
void QMyCustomPlot::addPhaseToPlot(double left_Low, double right_Hight, const QString strText, QColor crColor)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggablePhase *dragRect = new TransparentDraggablePhase(this, strUuid);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(crColor); // 半透明白色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_Phase[strUuid] = dragRect;
|
||
}
|
||
|
||
//沉积相-相
|
||
void QMyCustomPlot::addFacToPlot(double left_Low, double right_Hight, const QString strText, QColor crColor)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableFac *dragRect = new TransparentDraggableFac(this, strUuid);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(crColor); // 半透明白色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_Fac[strUuid] = dragRect;
|
||
}
|
||
|
||
//套管
|
||
void QMyCustomPlot::addGuanToPlot(double left_Low, double right_Hight, const QString imagePath, float in)
|
||
{
|
||
QtCommonClass *qtCommon = new QtCommonClass(this);
|
||
QString strUuid = qtCommon->getUUid();
|
||
|
||
// 在初始化代码中
|
||
TransparentDraggableGuan *dragRect = new TransparentDraggableGuan(this, strUuid);
|
||
//长度
|
||
dragRect->setOin(in);
|
||
//图片,提前设值,后面setRange改变
|
||
dragRect->setResult(imagePath);
|
||
// 设置初始范围
|
||
dragRect->setRange(left_Low, right_Hight);
|
||
// 可选:设置颜色
|
||
dragRect->setColor(QColor(255, 255, 255, 80)); // 半透明红色
|
||
//最小宽度
|
||
dragRect->setMinWidth(0.1);
|
||
//dragRect->setTitle(strText);
|
||
|
||
m_mapDraggable_Guan[strUuid] = dragRect;
|
||
}
|
||
|
||
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 strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType, QString strFormInfoType)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName &&
|
||
iTableType==3)
|
||
{
|
||
raise();
|
||
}
|
||
}
|
||
|
||
//属性-左刻度
|
||
void QMyCustomPlot::s_ChangeLeftScale(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double newLeftScale)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
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_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_newTargetLine == strLineName)
|
||
{
|
||
//其他曲线
|
||
s_ChangeFillMode(m_strUuid, m_strSlfName, m_strWellName, m_strTrackName, m_strLineName,
|
||
m_newFillType, m_newTargetLine, m_newColor, m_newLithosImage, m_newHeadFill,
|
||
newLeftScale, m_vMax, m_strOtherScaleType, m_frontColor, m_backColor, m_newFillMode, true);
|
||
}
|
||
}
|
||
|
||
//属性-右刻度
|
||
void QMyCustomPlot::s_ChangeRightScale(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double newRightScale)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
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_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_newTargetLine == strLineName)
|
||
{
|
||
//其他曲线
|
||
s_ChangeFillMode(m_strUuid, m_strSlfName, m_strWellName, m_strTrackName, m_strLineName,
|
||
m_newFillType, m_newTargetLine, m_newColor, m_newLithosImage, m_newHeadFill,
|
||
m_vMin, newRightScale, m_strOtherScaleType, m_frontColor, m_backColor, m_newFillMode, true);
|
||
}
|
||
}
|
||
|
||
//属性-刻度类型
|
||
void QMyCustomPlot::s_ChangeScaleType(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QString strScaleType)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
m_strScaleType = strScaleType;
|
||
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
yAxis->setScaleType(QCPAxis::stLogarithmic);
|
||
}
|
||
else //if(m_strScaleType=="线性")
|
||
{
|
||
yAxis->setScaleType(QCPAxis::stLinear);
|
||
}
|
||
|
||
//
|
||
replot();
|
||
}
|
||
else if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_newTargetLine == strLineName)
|
||
{
|
||
//其他曲线
|
||
s_ChangeFillMode(m_strUuid, m_strSlfName, m_strWellName, m_strTrackName, m_strLineName,
|
||
m_newFillType, m_newTargetLine, m_newColor, m_newLithosImage, m_newHeadFill,
|
||
m_vMin, m_vMax, strScaleType, m_frontColor, m_backColor, m_newFillMode, true);
|
||
}
|
||
}
|
||
|
||
//属性-颜色
|
||
void QMyCustomPlot::s_ChangeLineColor(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QColor lineColor)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
QCPGraph* graph =this->graph(0);
|
||
if(graph)
|
||
{
|
||
QPen pen = graph->pen();
|
||
pen.setColor(lineColor);
|
||
graph->setPen(pen);
|
||
//
|
||
replot();
|
||
}
|
||
}
|
||
}
|
||
|
||
//属性-线宽
|
||
void QMyCustomPlot::s_ChangeLineWidth(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, double width)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
QCPGraph* graph = this->graph(0);
|
||
if(graph)
|
||
{
|
||
QPen pen = graph->pen();
|
||
pen.setWidthF(width);
|
||
graph->setPen(pen);
|
||
|
||
//
|
||
replot();
|
||
}
|
||
}
|
||
}
|
||
|
||
//属性-线型
|
||
void QMyCustomPlot::s_ChangeLineStyle(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, Qt::PenStyle lineStyle)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
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::ChangeDrawMethod(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
QCPGraph* graph =this->graph(0);
|
||
if(graph)
|
||
{
|
||
//勾选3个
|
||
if(m_bDrawLine && m_bDrawGan && m_bDrawPoint)
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));//杆状线
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssCircle)));//圆圈
|
||
}
|
||
//勾选2个
|
||
else if(m_bDrawLine && m_bDrawGan && !m_bDrawPoint){//曲线+杆状
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssDot)));
|
||
}
|
||
else if(m_bDrawLine && !m_bDrawGan && m_bDrawPoint){//曲线+点状
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsLine));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssCircle)));//圆圈
|
||
}
|
||
else if(!m_bDrawLine && m_bDrawGan && m_bDrawPoint){//杆状+点状
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssCircle)));//圆圈
|
||
}
|
||
//勾选1个
|
||
else if(m_bDrawLine && !m_bDrawGan && !m_bDrawPoint)//曲线
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsLine));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssDot)));
|
||
}
|
||
else if(!m_bDrawLine && m_bDrawGan && !m_bDrawPoint)//杆状
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssDot)));
|
||
}
|
||
else if(!m_bDrawLine && !m_bDrawGan && m_bDrawPoint)//点状
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsNone));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssCircle)));//圆圈
|
||
}
|
||
//勾选0个
|
||
else if(!m_bDrawLine && !m_bDrawGan && !m_bDrawPoint)//曲线
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsNone));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssNone)));
|
||
}
|
||
//
|
||
replot();
|
||
}
|
||
}
|
||
}
|
||
|
||
//曲线
|
||
void QMyCustomPlot::s_ChangeDrawLine(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, bool bDrawLine)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
//
|
||
m_bDrawLine = bDrawLine;
|
||
//绘制方式
|
||
ChangeDrawMethod(strUuid, strSlfName, strWellName, strTrackName, strLineName);
|
||
}
|
||
|
||
//杆状
|
||
void QMyCustomPlot::s_ChangeDrawGan(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, bool bDrawGan)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
//
|
||
m_bDrawGan = bDrawGan;
|
||
//绘制方式
|
||
ChangeDrawMethod(strUuid, strSlfName, strWellName, strTrackName, strLineName);
|
||
}
|
||
|
||
//点状
|
||
void QMyCustomPlot::s_ChangeDrawPoint(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, bool bDrawPoint)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
//
|
||
m_bDrawPoint = bDrawPoint;
|
||
//绘制方式
|
||
ChangeDrawMethod(strUuid, strSlfName, strWellName, strTrackName, strLineName);
|
||
}
|
||
|
||
//绘制对称曲线
|
||
void QMyCustomPlot::s_ChangeDrawSymmetry(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, bool bDrawSymmetry)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
//
|
||
m_bDrawSymmetry = bDrawSymmetry;
|
||
|
||
if(m_bDrawSymmetry)//绘制对称线
|
||
{
|
||
|
||
//graph(duichen)
|
||
QVector<double> x, y;
|
||
|
||
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));
|
||
//对称处理
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
y.append(log(m_iX1)+log(m_iX2)-log(val[i]));
|
||
}
|
||
else //if(m_strScaleType=="线性")
|
||
{
|
||
y.append(m_iX1+m_iX2-val[i]);
|
||
}
|
||
}
|
||
}
|
||
//
|
||
this->yAxis2->setRange(m_iY1, m_iY2);
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
this->xAxis2->setRange(log(m_iX1), log(m_iX2));
|
||
}
|
||
else //if(m_strScaleType=="线性")
|
||
{
|
||
this->xAxis2->setRange(m_iX1, m_iX2);
|
||
}
|
||
//移除
|
||
if(graph_Symmetry)
|
||
{
|
||
this->removeGraph(graph_Symmetry);
|
||
graph_Symmetry=nullptr;
|
||
}
|
||
//新建
|
||
graph_Symmetry = this->addGraph(yAxis2, xAxis2);
|
||
if(graph_Symmetry)
|
||
{
|
||
graph_Symmetry->setData(x, y);
|
||
graph_Symmetry->setLineStyle(graph(0)->lineStyle());//曲线
|
||
graph_Symmetry->setScatterStyle(graph(0)->scatterStyle());
|
||
//graph_Fill->setPen(QColor(255, 255, 255));
|
||
graph_Symmetry->setPen(QColor(0, 0, 0));//(graph(0)->pen());
|
||
//
|
||
replot();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//移除
|
||
if(graph_Symmetry)
|
||
{
|
||
this->removeGraph(graph_Symmetry);
|
||
graph_Symmetry=nullptr;
|
||
//
|
||
replot();
|
||
}
|
||
}
|
||
}
|
||
|
||
//岩性填充-不填充
|
||
void QMyCustomPlot::s_ClearFillMode(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName)
|
||
{
|
||
if(m_strUuid == strUuid &&
|
||
m_strSlfName == strSlfName &&
|
||
m_strWellName == strWellName &&
|
||
m_strTrackName == strTrackName &&
|
||
m_strLineName == strLineName)
|
||
{
|
||
//清空填充
|
||
if(this->graphCount() > 1)
|
||
{
|
||
this->removeGraph(1);
|
||
}
|
||
if(graph(0))
|
||
{
|
||
graph(0)->setBrush(Qt::NoBrush);
|
||
//
|
||
replot();
|
||
}
|
||
}
|
||
}
|
||
|
||
//岩性填充-填充
|
||
void QMyCustomPlot::s_ChangeFillMode(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName,
|
||
QString newFillType, QString newTargetLine, QColor newColor, QString newLithosImage, QString newHeadFill,
|
||
float vMin, float vMax, QString strOtherScaleType, QColor frontColor, QColor backColor, QString newFillMode, bool bFillNow)
|
||
{
|
||
|
||
if(m_strUuid == strUuid &&
|
||
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;
|
||
m_strOtherScaleType = strOtherScaleType;
|
||
m_frontColor = frontColor;
|
||
m_backColor = backColor;
|
||
m_newFillMode = newFillMode;
|
||
m_bFillNow = bFillNow;
|
||
|
||
//默认true,只有模板存在填充时,才会false
|
||
if(m_bFillNow==false)
|
||
{
|
||
return;
|
||
}
|
||
//填充
|
||
//if(this->graphCount() > 1)
|
||
if(graph_Fill)
|
||
{
|
||
//this->removeGraph(1);
|
||
this->removeGraph(graph_Fill);
|
||
graph_Fill=nullptr;
|
||
}
|
||
//graph(1)
|
||
//QCPGraph *graph_Fill=nullptr;
|
||
QVector<double> x, y;
|
||
|
||
if(newTargetLine=="左界道")
|
||
{
|
||
x.append(m_iY1);
|
||
y.append(m_iX1);
|
||
//
|
||
x.append(m_iY2);
|
||
y.append(m_iX1);
|
||
|
||
//
|
||
graph_Fill=this->addGraph();
|
||
}
|
||
else if(newTargetLine=="右界道")
|
||
{
|
||
x.append(m_iY1);
|
||
y.append(m_iX2);
|
||
//
|
||
x.append(m_iY2);
|
||
y.append(m_iX2);
|
||
|
||
//
|
||
graph_Fill=this->addGraph();
|
||
}
|
||
else if(newTargetLine=="对称线")
|
||
{
|
||
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));
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
y.append(log(m_iX1)+log(m_iX2)-log(val[i]));
|
||
}
|
||
else //if(m_strScaleType=="线性")
|
||
{
|
||
y.append(m_iX1+m_iX2-val[i]);
|
||
}
|
||
}
|
||
}
|
||
//
|
||
this->yAxis2->setRange(m_iY1, m_iY2);
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
this->xAxis2->setRange(log(m_iX1), log(m_iX2));
|
||
}
|
||
else //if(m_strScaleType=="线性")
|
||
{
|
||
this->xAxis2->setRange(m_iX1, m_iX2);
|
||
}
|
||
graph_Fill=this->addGraph(yAxis2, xAxis2);
|
||
}
|
||
else//其他曲线
|
||
{
|
||
if(newFillMode=="左填充")
|
||
{
|
||
float iX1_Tmp=m_iX1;
|
||
float iX2_Tmp=m_iX2;
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
iX1_Tmp=log(m_iX1);
|
||
iX2_Tmp=log(m_iX2);
|
||
}
|
||
|
||
//其他曲线(左填充)
|
||
CLogIO *logio=new CLogIO();
|
||
logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead);
|
||
|
||
//读取基线信息
|
||
int indexBaseCurv = logio->OpenCurve(strLineName.toStdString().c_str());
|
||
if(indexBaseCurv < 0) {
|
||
graph_Fill=this->addGraph();//空曲线
|
||
delete logio;
|
||
}
|
||
else
|
||
{
|
||
//其他曲线
|
||
int index=logio->OpenCurve(newTargetLine.toStdString().c_str());
|
||
if(index<0)
|
||
{
|
||
graph_Fill=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 vMax_Tmp=vMax;
|
||
float vMin_Tmp=vMin;
|
||
if(strOtherScaleType=="对数")
|
||
{
|
||
vMax_Tmp=log(vMax);
|
||
vMin_Tmp=log(vMin);
|
||
}
|
||
|
||
float newVal = 0.0;
|
||
for(int i=0; i<count; i++)
|
||
{
|
||
float x0=-(sdep+ rlev*i);
|
||
float y0_old=val[i];
|
||
float y0 = (iX2_Tmp-iX1_Tmp)*(val[i]-vMin_Tmp)/(vMax_Tmp-vMin) + iX1_Tmp;
|
||
if(strOtherScaleType=="对数")
|
||
{
|
||
//其他曲线
|
||
y0_old=log(val[i]);
|
||
y0 = (iX2_Tmp-iX1_Tmp)*(log(val[i])-vMin_Tmp)/(vMax_Tmp-vMin_Tmp) + iX1_Tmp;
|
||
}
|
||
|
||
//读取基线
|
||
float BaseY0=0;
|
||
float BaseY0_Tmp=0;
|
||
logio->ReadCurve(indexBaseCurv, 0-x0, 1, &BaseY0);
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
BaseY0_Tmp=log(BaseY0);
|
||
BaseY0 = BaseY0_Tmp;
|
||
}
|
||
|
||
//
|
||
if(i+1<count)
|
||
{
|
||
float x1=-(sdep+ rlev*(i+1));
|
||
//float y1=val[i+1];
|
||
float y1 = (iX2_Tmp-iX1_Tmp)*(val[i+1]-vMin_Tmp)/(vMax_Tmp-vMin_Tmp) + iX1_Tmp;
|
||
if(strOtherScaleType=="对数")
|
||
{
|
||
//其他曲线
|
||
y1 = (iX2_Tmp-iX1_Tmp)*(log(val[i+1])-vMin_Tmp)/(vMax_Tmp-vMin_Tmp) + iX1_Tmp;
|
||
}
|
||
|
||
//读取基线
|
||
float BaseY1=0;
|
||
float BaseY1_Tmp=0;
|
||
logio->ReadCurve(indexBaseCurv, 0-x1, 1, &BaseY1);
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
BaseY1_Tmp=log(BaseY1);
|
||
BaseY1 = BaseY1_Tmp;
|
||
}
|
||
|
||
if(BaseY0<=y0 && BaseY1<=y1)
|
||
{
|
||
//基线在左,采用基线值
|
||
//y0=BaseY0;
|
||
y0_old = (BaseY0-iX1_Tmp)/(iX2_Tmp-iX1_Tmp)*(vMax_Tmp-vMin_Tmp) + vMin_Tmp;
|
||
//
|
||
x.append(x0);
|
||
y.append(y0_old);
|
||
}
|
||
else if(BaseY0>=y0 && BaseY1>=y1)
|
||
{
|
||
//基线在右,直接赋值
|
||
x.append(x0);
|
||
y.append(y0_old);
|
||
}
|
||
else if(BaseY0<=y0 && BaseY1>=y1)
|
||
{
|
||
//基线起点在左,采用基线值
|
||
//y0=BaseY0;
|
||
y0_old = (BaseY0-iX1_Tmp)/(iX2_Tmp-iX1_Tmp)*(vMax_Tmp-vMin_Tmp) + vMin_Tmp;
|
||
//
|
||
x.append(x0);
|
||
y.append(y0_old);
|
||
|
||
//插值
|
||
float xNew=x0-rlev*(y0-BaseY0)/((BaseY1-y1)+(y0-BaseY0));//(BaseY1-y1);
|
||
float yNew=(y0-y1)/(x0-x1)*(xNew-x1) + y1;
|
||
float yNew_Old=(yNew-iX1_Tmp)/(iX2_Tmp-iX1_Tmp)*(vMax_Tmp-vMin_Tmp) + vMin_Tmp;
|
||
//
|
||
x.append(xNew);
|
||
y.append(yNew_Old);
|
||
}
|
||
else if(BaseY0>=y0 && BaseY1<=y1)
|
||
{
|
||
//基线在右,直接赋值
|
||
x.append(x0);
|
||
y.append(y0_old);
|
||
|
||
//插值
|
||
float xNew=x0-rlev*(y0-BaseY0)/((BaseY1-y1)+(y0-BaseY0));//(BaseY1-y1);
|
||
float yNew=(BaseY0-BaseY1)/(x0-x1)*(xNew-x1) + BaseY1;
|
||
float yNew_Old=(yNew-iX1_Tmp)/(iX2_Tmp-iX1_Tmp)*(vMax_Tmp-vMin_Tmp) + vMin_Tmp;
|
||
//
|
||
x.append(xNew);
|
||
y.append(yNew_Old);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//最后一个点
|
||
if(BaseY0<y0)
|
||
{
|
||
//基线在左,采用基线值
|
||
//y0=BaseY0;
|
||
y0_old = (BaseY0-iX1_Tmp)/(iX2_Tmp-iX1_Tmp)*(vMax_Tmp-vMin_Tmp) + vMin_Tmp;
|
||
}
|
||
x.append(x0);
|
||
y.append(y0_old);
|
||
}
|
||
}
|
||
logio->CloseCurve(indexBaseCurv);
|
||
delete logio;
|
||
//
|
||
this->yAxis2->setRange(m_iY1, m_iY2);
|
||
this->xAxis2->setRange(vMin_Tmp, vMax_Tmp);
|
||
graph_Fill=this->addGraph(yAxis2, xAxis2);
|
||
}
|
||
}
|
||
}
|
||
else if(newFillMode=="右填充")
|
||
{
|
||
float iX1_Tmp=m_iX1;
|
||
float iX2_Tmp=m_iX2;
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
iX1_Tmp=log(m_iX1);
|
||
iX2_Tmp=log(m_iX2);
|
||
}
|
||
|
||
//其他曲线(右填充)
|
||
CLogIO *logio=new CLogIO();
|
||
logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead);
|
||
|
||
//读取基线信息
|
||
int indexBaseCurv = logio->OpenCurve(strLineName.toStdString().c_str());
|
||
if(indexBaseCurv < 0) {
|
||
graph_Fill=this->addGraph();//空曲线
|
||
delete logio;
|
||
}
|
||
else
|
||
{
|
||
//其他曲线
|
||
int index=logio->OpenCurve(newTargetLine.toStdString().c_str());
|
||
if(index<0)
|
||
{
|
||
graph_Fill=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 vMax_Tmp=vMax;
|
||
float vMin_Tmp=vMin;
|
||
if(strOtherScaleType=="对数")
|
||
{
|
||
vMax_Tmp=log(vMax);
|
||
vMin_Tmp=log(vMin);
|
||
}
|
||
|
||
float newVal = 0.0;
|
||
for(int i=0; i<count; i++)
|
||
{
|
||
float x0=-(sdep+ rlev*i);
|
||
float y0_old=val[i];
|
||
float y0 = (iX2_Tmp-iX1_Tmp)*(val[i]-vMin_Tmp)/(vMax_Tmp-vMin_Tmp) + iX1_Tmp;
|
||
if(strOtherScaleType=="对数")
|
||
{
|
||
//其他曲线
|
||
y0_old=log(val[i]);
|
||
y0 = (iX2_Tmp-iX1_Tmp)*(log(val[i])-vMin_Tmp)/(vMax_Tmp-vMin_Tmp) + iX1_Tmp;
|
||
}
|
||
|
||
//读取基线
|
||
float BaseY0=0;
|
||
float BaseY0_Tmp=0;
|
||
logio->ReadCurve(indexBaseCurv, 0-x0, 1, &BaseY0);
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
BaseY0_Tmp=log(BaseY0);
|
||
BaseY0 = BaseY0_Tmp;
|
||
}
|
||
|
||
//
|
||
if(i+1<count)
|
||
{
|
||
float x1=-(sdep+ rlev*(i+1));
|
||
//float y1=val[i+1];
|
||
float y1 = (iX2_Tmp-iX1_Tmp)*(val[i+1]-vMin_Tmp)/(vMax_Tmp-vMin_Tmp) + iX1_Tmp;
|
||
if(strOtherScaleType=="对数")
|
||
{
|
||
//其他曲线
|
||
y1 = (iX2_Tmp-iX1_Tmp)*(log(val[i+1])-vMin_Tmp)/(vMax_Tmp-vMin_Tmp) + iX1_Tmp;
|
||
}
|
||
|
||
//读取基线
|
||
float BaseY1=0;
|
||
float BaseY1_Tmp=0;
|
||
logio->ReadCurve(indexBaseCurv, 0-x1, 1, &BaseY1);
|
||
if(m_strScaleType=="对数")
|
||
{
|
||
BaseY1_Tmp=log(BaseY1);
|
||
BaseY1 = BaseY1_Tmp;
|
||
}
|
||
|
||
if(BaseY0<=y0 && BaseY1<=y1)
|
||
{
|
||
//基线在左,直接赋值
|
||
x.append(x0);
|
||
y.append(y0_old);
|
||
}
|
||
else if(BaseY0>=y0 && BaseY1>=y1)
|
||
{
|
||
//基线在右,采用基线值
|
||
//y0=BaseY0;
|
||
y0_old = (BaseY0-iX1_Tmp)/(iX2_Tmp-iX1_Tmp)*(vMax_Tmp-vMin_Tmp) + vMin_Tmp;
|
||
//
|
||
x.append(x0);
|
||
y.append(y0_old);
|
||
}
|
||
else if(BaseY0<=y0 && BaseY1>=y1)
|
||
{
|
||
//基线起点在左,直接赋值
|
||
x.append(x0);
|
||
y.append(y0_old);
|
||
|
||
//插值
|
||
float xNew=x0-rlev*(y0-BaseY0)/((BaseY1-y1)+(y0-BaseY0));//(BaseY1-y1);
|
||
float yNew=(y0-y1)/(x0-x1)*(xNew-x1) + y1;
|
||
float yNew_Old=(yNew-iX1_Tmp)/(iX2_Tmp-iX1_Tmp)*(vMax_Tmp-vMin_Tmp) + vMin_Tmp;
|
||
//
|
||
x.append(xNew);
|
||
y.append(yNew_Old);
|
||
}
|
||
else if(BaseY0>=y0 && BaseY1<=y1)
|
||
{
|
||
//基线在右,采用基线值
|
||
//y0=BaseY0;
|
||
y0_old = (BaseY0-iX1_Tmp)/(iX2_Tmp-iX1_Tmp)*(vMax_Tmp-vMin_Tmp) + vMin_Tmp;
|
||
//
|
||
x.append(x0);
|
||
y.append(y0_old);
|
||
|
||
//插值
|
||
float xNew=x0-rlev*(y0-BaseY0)/((BaseY1-y1)+(y0-BaseY0));//(BaseY1-y1);
|
||
float yNew=(BaseY0-BaseY1)/(x0-x1)*(xNew-x1) + BaseY1;
|
||
float yNew_Old=(yNew-iX1_Tmp)/(iX2_Tmp-iX1_Tmp)*(vMax_Tmp-vMin_Tmp) + vMin_Tmp;
|
||
//
|
||
x.append(xNew);
|
||
y.append(yNew_Old);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//最后一个点
|
||
if(BaseY0>y0)
|
||
{
|
||
//基线在右,采用基线值
|
||
//y0=BaseY0;
|
||
y0_old = (BaseY0-iX1_Tmp)/(iX2_Tmp-iX1_Tmp)*(vMax_Tmp-vMin_Tmp) + vMin_Tmp;
|
||
}
|
||
x.append(x0);
|
||
y.append(y0_old);
|
||
}
|
||
}
|
||
logio->CloseCurve(indexBaseCurv);
|
||
delete logio;
|
||
//
|
||
this->yAxis2->setRange(m_iY1, m_iY2);
|
||
this->xAxis2->setRange(vMin_Tmp, vMax_Tmp);
|
||
graph_Fill=this->addGraph(yAxis2, xAxis2);
|
||
}
|
||
}
|
||
}
|
||
else //填充
|
||
{
|
||
//其他曲线
|
||
CLogIO *logio=new CLogIO();
|
||
logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead);
|
||
int index=logio->OpenCurve(newTargetLine.toStdString().c_str());
|
||
if(index<0)
|
||
{
|
||
graph_Fill=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 vMax_Tmp=vMax;
|
||
float vMin_Tmp=vMin;
|
||
if(strOtherScaleType=="对数")
|
||
{
|
||
vMax_Tmp=log(vMax);
|
||
vMin_Tmp=log(vMin);
|
||
}
|
||
|
||
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];
|
||
if(strOtherScaleType=="对数")
|
||
{
|
||
//其他曲线
|
||
newVal = log(val[i]);
|
||
}
|
||
y.append(newVal);
|
||
}
|
||
this->yAxis2->setRange(m_iY1, m_iY2);
|
||
this->xAxis2->setRange(vMin_Tmp, vMax_Tmp);
|
||
graph_Fill=this->addGraph(yAxis2, xAxis2);
|
||
}
|
||
}
|
||
}
|
||
|
||
if(graph_Fill)
|
||
{
|
||
graph_Fill->setData(x, y);
|
||
graph_Fill->setLineStyle(graph(0)->lineStyle());//曲线
|
||
graph_Fill->setScatterStyle(graph(0)->scatterStyle());
|
||
//graph_Fill->setPen(QColor(255, 255, 255));
|
||
graph_Fill->setPen(QColor(0, 0, 0));//(graph(0)->pen());
|
||
}
|
||
|
||
// this->graph(1)->setData(x, y);
|
||
// graph(1)->setLineStyle(graph(0)->lineStyle());//曲线
|
||
// graph(1)->setScatterStyle(graph(0)->scatterStyle());
|
||
// //graph(1)->setPen(QColor(255, 255, 255));
|
||
// graph(1)->setPen(QColor(0, 0, 0));//(graph(0)->pen());
|
||
|
||
//
|
||
if(newFillType == "岩性模式")
|
||
{
|
||
QColor oldFrontColor(0, 0, 0); // 原始颜色
|
||
QColor oldBackColor(255, 255, 255); // 原始颜色
|
||
//
|
||
QImage image(newLithosImage);
|
||
for (int y = 0; y < image.height(); ++y) {
|
||
for (int x = 0; x < image.width(); ++x) {
|
||
QColor pixelColor = QColor(image.pixel(x, y));
|
||
if (pixelColor == oldFrontColor) {
|
||
image.setPixelColor(x, y, m_frontColor); // 使用 setPixelColor 来设置新颜色
|
||
}
|
||
if (pixelColor == oldBackColor) {
|
||
image.setPixelColor(x, y, m_backColor); // 使用 setPixelColor 来设置新颜色
|
||
}
|
||
}
|
||
}
|
||
|
||
//
|
||
graph(0)->setBrush(QBrush(QPixmap::fromImage(image)));
|
||
//graph(0)->setBrush(QBrush(QPixmap(newLithosImage)));
|
||
}
|
||
else if(newFillType == "颜色模式")
|
||
{
|
||
graph(0)->setBrush(QBrush(newColor));
|
||
}
|
||
else if(newFillType == "成像化")
|
||
{
|
||
|
||
}
|
||
|
||
if(graph_Fill)
|
||
{
|
||
graph(0)->setChannelFillGraph( graph_Fill);//this->graph()
|
||
}
|
||
//
|
||
replot();
|
||
//update();
|
||
}
|
||
}
|
||
|
||
//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_strUuid, m_strWellName, m_strTrackName, 0-y_val);
|
||
|
||
// QCustomPlot::mouseMoveEvent(event);
|
||
//}
|
||
|
||
|
||
void QMyCustomPlot::addRandomGraph(QVector<double> x, QVector<double> y, QString strSlfName, QString strLineName, QString strAliasName, QString strUnit,
|
||
double newLeftScale, double newRightScale, QString strScaleType, QColor &newlineColor, double width, Qt::PenStyle lineStyle)
|
||
{
|
||
//AppendConsole(PAI_INFO, "FormDraw addRandomGraph");
|
||
|
||
m_addRandomGraph=true;
|
||
|
||
m_x.append(x);
|
||
m_y.append(y);
|
||
|
||
QCPGraph *graph=addGraph();
|
||
if(strLineName=="")
|
||
{
|
||
strLineName = QString("曲线 %1").arg(graphCount());
|
||
}
|
||
graph->setName(strLineName);
|
||
//禁用自动重绘:在大量数据更新前禁用自动重绘
|
||
//setNotAntialiasedElements(QCP::aeAll);
|
||
|
||
//graph()->setData(x, y);
|
||
|
||
if(newLeftScale!=-9999)
|
||
{
|
||
if(m_bDrawCore_PHYSICS)//岩心分析
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));//杆状线
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssCircle)));//圆圈
|
||
}
|
||
else
|
||
{
|
||
//勾选3个
|
||
if(m_bDrawLine && m_bDrawGan && m_bDrawPoint)
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));//杆状线
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssCircle)));//圆圈
|
||
}
|
||
//勾选2个
|
||
else if(m_bDrawLine && m_bDrawGan && !m_bDrawPoint){//曲线+杆状
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssDot)));
|
||
}
|
||
else if(m_bDrawLine && !m_bDrawGan && m_bDrawPoint){//曲线+点状
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsLine));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssCircle)));//圆圈
|
||
}
|
||
else if(!m_bDrawLine && m_bDrawGan && m_bDrawPoint){//杆状+点状
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssCircle)));//圆圈
|
||
}
|
||
//勾选1个
|
||
else if(m_bDrawLine && !m_bDrawGan && !m_bDrawPoint)//曲线
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsLine));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssDot)));
|
||
}
|
||
else if(!m_bDrawLine && m_bDrawGan && !m_bDrawPoint)//杆状
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssDot)));
|
||
}
|
||
else if(!m_bDrawLine && !m_bDrawGan && m_bDrawPoint)//点状
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsNone));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssCircle)));//圆圈
|
||
}
|
||
//勾选0个
|
||
else if(!m_bDrawLine && !m_bDrawGan && !m_bDrawPoint)//曲线
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsNone));
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssNone)));
|
||
}
|
||
|
||
// graph()->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsLine));//曲线
|
||
// graph()->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssDot)));//点
|
||
}
|
||
|
||
QPen graphPen;
|
||
graphPen.setColor(newlineColor);
|
||
graphPen.setWidthF(width);
|
||
graphPen.setStyle(lineStyle);//实线
|
||
graph->setPen(graphPen);
|
||
}
|
||
else
|
||
{
|
||
if(m_bDrawCore_PHYSICS)//岩心分析
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));//杆状线
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssCircle)));//圆圈
|
||
}
|
||
else
|
||
{
|
||
graph->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsLine));//曲线
|
||
graph->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(QCPScatterStyle::ssDot)));//点
|
||
}
|
||
|
||
// graph()->setScatterStyle(QCPScatterStyle(QPixmap(":/image/file.png")));
|
||
//graph()->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 5));
|
||
|
||
QPen graphPen;
|
||
newlineColor = QColor(std::rand()%245+10, std::rand()%245+10, std::rand()%245+10);
|
||
graphPen.setColor(newlineColor);
|
||
width = 2;
|
||
graphPen.setWidthF(width);
|
||
graphPen.setStyle(Qt::SolidLine);//实线
|
||
graph->setPen(graphPen);
|
||
//replot();
|
||
}
|
||
|
||
|
||
if(x.size()<m_iSplitNum)
|
||
{
|
||
graph->setData(x, y);
|
||
replot();
|
||
//replot(QCustomPlot::rpRefreshHint);// 仅刷新可见部分,跳过轴计算等
|
||
}
|
||
else
|
||
{
|
||
graph->setData(x.mid(0,m_iSplitNum), y.mid(0,m_iSplitNum));
|
||
replot();
|
||
|
||
m_iCurNum = m_iSplitNum;
|
||
QTimer::singleShot(100, this, SLOT(slot_time()));
|
||
}
|
||
|
||
|
||
}
|
||
|
||
void QMyCustomPlot::slot_time()
|
||
{
|
||
if(m_iCurNum >= m_x.size())
|
||
{
|
||
//处理完成
|
||
return;
|
||
}
|
||
|
||
//
|
||
if(m_x.size() <= m_iCurNum+m_iSplitNum)
|
||
{
|
||
graph()->addData(m_x.mid(m_iCurNum), m_y.mid(m_iCurNum));
|
||
m_iCurNum = m_x.size();
|
||
|
||
//处理完成,绘制对称曲线
|
||
if(m_bDrawSymmetry)
|
||
{
|
||
s_ChangeDrawSymmetry(m_strUuid, m_strSlfName, m_strWellName, m_strTrackName, m_strLineName, m_bDrawSymmetry);
|
||
}
|
||
|
||
//处理完成,填充
|
||
//默认true,只有模板存在填充时,才会false
|
||
if(m_bFillNow==false)
|
||
{
|
||
s_ChangeFillMode(m_strUuid, m_strSlfName, m_strWellName, m_strTrackName, m_strLineName,
|
||
m_newFillType, m_newTargetLine, m_newColor, m_newLithosImage, m_newHeadFill,
|
||
m_vMin, m_vMax, m_strOtherScaleType, m_frontColor, m_backColor, m_newFillMode, true);
|
||
|
||
}
|
||
replot();
|
||
}
|
||
else
|
||
{
|
||
graph()->addData(m_x.mid(m_iCurNum, m_iSplitNum), m_y.mid(m_iCurNum, m_iSplitNum));
|
||
m_iCurNum = m_iCurNum + m_iSplitNum;
|
||
//replot();
|
||
QTimer::singleShot(100, this, SLOT(slot_time()));
|
||
}
|
||
//replot();
|
||
}
|