波列效果属性编辑

This commit is contained in:
DESKTOP-450PEFP\mainc 2026-02-05 14:53:44 +08:00
parent 1239785258
commit db5eca757c
9 changed files with 371 additions and 203 deletions

View File

@ -12,6 +12,50 @@
float mLineWidth=0.75;
QString OilField;
double GetData(int RepCode, char *buffer)
{
double yy;
if (!buffer) return 0;
switch (RepCode)
{
case REPR_INT: //0
yy = (double)(*((int*)buffer));
break;
case REPR_SHORT: //1
yy = (double)(*((short *)buffer));
break;
case REPR_LONG://2
yy = (double)(*((long *)buffer));
break;
case REPR_FLOAT://3
yy = (double)(*((float *)buffer));
break;
case REPR_DOUBLE://4
yy = (double)(*((double *)buffer));
break;
case REPR_CHAR://5
yy = (double)(*((char *)buffer));
break;
case REPR_UCHAR://6
yy = (double)(*((unsigned char *)buffer));
break;
case REPR_USHORT://7
yy = (double)(*((unsigned short *)buffer));
break;
case REPR_UINT://8
yy = (double)(*((unsigned int *)buffer));
break;
case REPR_ULONG://9
yy = (double)(*((unsigned long *)buffer));
break;
case REPR_STRING://10
yy = -99999;
break;
}
return yy;
}
QString setdec(QString text,int dec,bool all)
{
if(text.size()==0) return text;

View File

@ -168,6 +168,7 @@ typedef struct GEOLITH_Table
char Dest[64];
} GeoLith_DATA;
double GetData(int RepCode, char *buffer);
QString GetProjectFolder();
QString GetLogdataPath();

View File

@ -41,7 +41,6 @@ extern QString g_prjname;
extern int g_iSupport3D;
double GetData(int RepCode,char *buffer);
extern void AppendConsole(Priority priority, const QString &output);
//曲线绘制(多个)
@ -148,6 +147,15 @@ void FormDraw::setDrawData(QStringList listdt, QJsonObject objInfo)
if ("waveObject" == strType)
{
curv->m_iY1 = m_iY1;
curv->m_iY2 = m_iY2;
curv->m_nMode = pInfo->getFillTypeIndex();
//curv->m_fmin = pInfo->getVMin();
//curv->m_fmax = pInfo->getVMax();
curv->m_nColorNum = pInfo->m_nColorNum;
curv->m_nSchemeIndex = pInfo->m_nSchemeIndex;
curv->m_fScaleV = pInfo->getVMax();
int _nSamples = 0;
if (g_iSupport3D)
{
@ -155,17 +163,9 @@ void FormDraw::setDrawData(QStringList listdt, QJsonObject objInfo)
}
else
{
initWave(curv, m_strSlfName, strLineName, _nSamples);
//curv->initWave2(m_strSlfName, strLineName);
curv->initWave(m_strSlfName, strLineName);
}
curv->m_nMode = pInfo->getFillTypeIndex();
//curv->m_fmin = pInfo->getVMin();
//curv->m_fmax = pInfo->getVMax();
curv->m_nColorNum = pInfo->m_nColorNum;
curv->m_nSchemeIndex = pInfo->m_nSchemeIndex;
curv->initColorTable();
curv->updateWave();
float f = 264 / pInfo->getVMax();
curv->m_colorMap->data()->setValueRange(QCPRange(curv->m_fmin, curv->m_fmax*f));
}
// 深度
else if("depthObject" == strType)
@ -2501,49 +2501,6 @@ void FormDraw::initForm(QMyCustomPlot *widget, QString strSlfName, QString strLi
//AppendConsole(PAI_INFO, "FormDraw initForm end");
}
double GetData(int RepCode,char *buffer)
{
double yy;
if(!buffer) return 0;
switch(RepCode)
{
case REPR_INT: //0
yy=(double)(*((int*)buffer));
break;
case REPR_SHORT: //1
yy=(double)(*((short *)buffer));
break;
case REPR_LONG://2
yy=(double)(*((long *)buffer));
break;
case REPR_FLOAT://3
yy=(double)(*((float *)buffer));
break;
case REPR_DOUBLE://4
yy=(double)(*((double *)buffer));
break;
case REPR_CHAR://5
yy=(double)(*((char *)buffer));
break;
case REPR_UCHAR://6
yy=(double)(*((unsigned char *)buffer));
break;
case REPR_USHORT://7
yy=(double)(*((unsigned short *)buffer));
break;
case REPR_UINT://8
yy=(double)(*((unsigned int *)buffer));
break;
case REPR_ULONG://9
yy=(double)(*((unsigned long *)buffer));
break;
case REPR_STRING://10
yy=-99999;
break;
}
return yy;
}
void FormDraw::initWave(QMyCustomPlot *widget, QString strSlfName, QString strWaveName, int &_nSamples)
{
CLogIO *logio=new CLogIO();
@ -3178,146 +3135,6 @@ void FormDraw::DrawImageNew_NoFilter(QMyCustomPlot *widget, QString strSlfName,
//widget->rescaleAxes();
}
void FormDraw::initWave2(QMyCustomPlot *widget, 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;
}
Slf_WAVE _wave;
logio->GetWaveInfo(index, &_wave);
float _SDep,_EDep,_Rlev;
// _SDep = _wave.StartDepth;
// _EDep = _wave.EndDepth;
m_iY2 = 0 - _wave.StartDepth;
m_iY1 = 0 - _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;
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 = (float)_nSamples;
float vmin = 0;
//
double** wavedata;
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_iX1 = vmin;
widget->m_iX2 = vmax;
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个主刻度
//对调XY轴在最前面设置
// QCPAxis *yAxis = widget->yAxis;
// QCPAxis *xAxis = widget->xAxis;
// widget->xAxis = yAxis;
// widget->yAxis = xAxis;
//注意不对调XY轴
widget->m_bX2Y = false;
float nPerHight = 50;//25
float nSpace = 1;
for (int i=0; i<m_Record; i++)
{
//--------------------------------
QVector<double> x;
QVector<double> y;
widget->addGraph();
QString strLineName = "";
if(strLineName=="")
{
strLineName = QString("曲线 %1").arg(widget->graphCount());
}
widget->graph()->setName(strLineName);
for(int kk = 0;kk<_nSamples;kk++)
{
//double val = wavedata[kk][m_Record-i-1];
double val = wavedata[kk][i];
if(val==-9999)
{
continue;
}
//x.append(_nSamples-kk-1);
float tempValue = -(_SDep + nPerHight*_Rlev*i + (val*200*2)/vmax);
x.append(kk);
//float tempValue = -(_SDep + nSpace*i + (val*nPerHight*_Rlev*2)/vmax);
y.append(tempValue);
}
widget->graph()->setData(x, y);
widget->graph()->setLineStyle((QCPGraph::LineStyle)(1));//曲线
widget->graph()->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(1)));
//
QPen graphPen;
QColor newlineColor = QColor(std::rand()%245+10, std::rand()%245+10, std::rand()%245+10);
graphPen.setColor(newlineColor);
double width = 1;
graphPen.setWidthF(width);
graphPen.setStyle(Qt::SolidLine);//实线
widget->graph()->setPen(graphPen);
//widget->replot();
if(i>=20)
break;
}
}
//表格曲线
void FormDraw::initTableLine(QMyCustomPlot *widget, QString strSlfName, QString strLineName)
{

View File

@ -105,6 +105,7 @@ public:
//波列
void initWave(QMyCustomPlot *widget, QString strSlfName, QString strWaveName, int &_nSamples);
void initWave_3D(QMyCustomPlot *widget, QString strSlfName, QString strWaveName, int &_nSamples);
// 绘图类型-波形
void initWave2(QMyCustomPlot *widget, QString strSlfName, QString strWaveName);
//图像-3d成图

View File

@ -82,8 +82,8 @@ void FormInfo::initProperty(QJsonObject obj)
QString strType = obj.value("Type").toString();
if ("waveObject" == strType)
{
m_strDrawType = obj.value("DrawType").toString();
m_strFillType = obj.value("FillType").toString();
m_nDrawType = obj.value("DrawType").toInt();
m_nFillType = obj.value("FillType").toInt();
m_strAmp = obj.value("Amp").toString();
m_fMaxAmp = obj.value("MaxAmp").toDouble();
m_nSchemeIndex = obj.value("SchemeIndex").toInt();
@ -146,8 +146,8 @@ QJsonObject FormInfo::makeJson()
}
else if (m_strType == "waveObject")
{
rootObj["DrawType"] = m_strDrawType;
rootObj["FillType"] = m_strFillType;
rootObj["DrawType"] = m_nDrawType;
rootObj["FillType"] = m_nFillType;
rootObj["Amp"] = m_strAmp;
rootObj["MaxAmp"] = m_fMaxAmp;
@ -571,10 +571,15 @@ bool FormInfo::setInfoProperty(QString strProName, QVariant val)
{
this->m_curveScaleFont = val.value<QFont>();
}
else if ("类型" == strProName)
{
bDraw = true;
this->m_nDrawType = val.toInt();
}
else if ("方式" == strProName)
{
bDraw = true;
this->m_strFillType = val.toString();
this->m_nFillType = val.toInt();
}
else if ("左刻度" == strProName)
{
@ -614,7 +619,7 @@ bool FormInfo::setInfoProperty(QString strProName, QVariant val)
int FormInfo::getFillTypeIndex()
{
return m_strFillType.toInt();
return m_nFillType;
}
//修改曲线选择状态 iSelect=0未知1标准曲线2主曲线3从曲线

View File

@ -98,8 +98,8 @@ public:
int m_nJg;
QString m_strDrawType; // 绘图类型
QString m_strFillType; // 填充类型
int m_nDrawType; // 绘图类型
int m_nFillType; // 填充类型
QString m_strAmp; // 幅度刻度
float m_fMaxAmp; // 最大振幅
bool m_bShowScale; // 显示刻度

View File

@ -365,6 +365,8 @@ void FormTrack::s_addWave(QString strSlfName, QString strWellName, QString strTr
formInfo->setVMax(vmax);
formInfo->setVMin(vmin);
formInfo->m_nDrawType = 2;
formInfo->m_nFillType = 1;
formInfo->m_curveNameFont = QFont("黑体", 12);
formInfo->m_curveUnitFont = QFont("黑体", 10);
formInfo->m_curveScaleFont = QFont("黑体", 10);

View File

@ -16,6 +16,7 @@
#include "transparentdraggableSelectRect.h"
#include "transparentdraggableRightList.h"
#include "qtcommonclass.h"
#include "slf.h"
//是否隐藏刻度
extern int g_iShow;
@ -103,6 +104,265 @@ QMyCustomPlot::QMyCustomPlot(QWidget *parent, QString strSlfName, QString strWel
connect(CallManage::getInstance(), SIGNAL(sig_changeDrawProperty(QVariantList)), this, SLOT(s_changeDrawProperty(QVariantList)));
}
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;
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_iX1 = vmin;
widget->m_iX2 = vmax;
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个主刻度
//对调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 m_MaxRange = 1023.0f;
float m_Base = 0.0f;
float DifBase = (m_MaxRange - m_Base) / 1;
int nStep = 600;// mWaveMes.m_WaveSpace;
if (nStep < 1) nStep = 1;
float m_r = m_Rlev * nStep;
detp = int((detp - m_PlotSdep) / m_r)*m_r + m_PlotSdep;
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];
float nmy = 0;
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;
if (ch > nmy)
{
nmy = ch;
}
//if (objViewInfo->m_Logarithmic == AXIS_LOGARITHMIC ||
// objViewInfo->m_maxRange == -99999) {
// if (vmin > ch) vmin = ch;
// if (vmax < ch) vmax = ch;
//}
}
QVector<double> vx;
QVector<double> vy;
for (int i = 0; i < nPoint; i++)
{
vx << i;
vy << (-dep1 - 1) + vals[i] / nmy;
}
QCPGraph * graph = widget->graph(nidx);
if (graph == NULL)
{
graph = widget->addGraph();
//graph->setPen(QPen(clor));
}
graph->setData(vx, vy);
nidx++;
}
widget->replot();
delete[]value;
}
void QMyCustomPlot::initColorTable()
{
this->setSchemeIndex(m_nSchemeIndex, m_nColorNum);
@ -978,7 +1238,40 @@ void QMyCustomPlot::s_changeDrawProperty(QVariantList vlist)
{
QString strProperty = vlist.at(5).toString();
QString strValue = vlist.at(6).toString();
if ("方式" == strProperty)
if ("类型" == strProperty)
{
if (strValue == "0")
{
if (this->m_colorMap)
this->m_colorMap->setVisible(false);
for (int i = 0; i < graphCount(); i++)
{
graph(i)->setVisible(true);
}
if (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 (strValue == "2")
{
if (this->m_colorMap)
this->m_colorMap->setVisible(true);
for (int i = 0; i < graphCount(); i++)
{
graph(i)->setVisible(false);
}
this->m_bX2Y = true;
this->initWave(m_strSlfName, m_strLineName);
}
}
else if ("方式" == strProperty)
{
m_nMode = strValue.toFloat();
this->updateWave();

View File

@ -21,6 +21,10 @@ public:
{
}
void initWave(QString strSlfName, QString strWaveName);
void initWave2(QString strSlfName, QString strWaveName);
void initColorTable();
void setSchemeIndex(int nidx, int colorNum);
double** getWavedata(int nrow, int ncol);
@ -73,6 +77,7 @@ public:
int m_nCol = 0;
// 0.全周 1.正半周 2.负半周
int m_nMode = 1;
float m_fScaleV = 264.0f;
float m_fmin;
float m_fmax;
int m_nColorNum = 256;