DCA裂缝检测效果实现

This commit is contained in:
DESKTOP-450PEFP\mainc 2026-01-17 22:35:34 +08:00
parent 250854711b
commit d3fb6a43cd
8 changed files with 254 additions and 10 deletions

View File

@ -3,7 +3,8 @@
//格线类型
//字体对齐方式
#define LEFT Qt::AlignLeft
// #include "VecCoordinate.h"
#define LEFT Qt::AlignLeft
#define RIGHT Qt::AlignRight// 1
#define CENTER Qt::AlignCenter// 2
#define VCENTER Qt::AlignVCenter//3
@ -16,7 +17,7 @@
// #include "HeadObj.h"
// #include "QtWellLogTrackNode.h"
#include "drawbase_global.h"
#include "VecCoordinate.h"
// #include "VecCoordinate.h"
#include <QImage>
#pragma warning( pop )
//#ifdef _WINDOWS
@ -67,8 +68,8 @@ public:
virtual ~CDrawBase();
virtual void Destory();
public:
virtual float ConvertY(eCoordType eInCoordType, double flDep,
eCoordType eOutCoordType );
// virtual float ConvertY(eCoordType eInCoordType, double flDep,
// eCoordType eOutCoordType );
float ConvertY(float fDep);
virtual void _Build();
virtual void DrawCurve(QPainter* pdc,QRectF mrt);

View File

@ -1172,11 +1172,11 @@ float CDrawBase::ComputeCurvePos(float flVal,float lsc,float rsc,float lps,float
// }
// return x;
}
float CDrawBase::ConvertY(eCoordType eInCoordType, double flDep,
eCoordType eOutCoordType )
{
return ConvertY(flDep);
}
// float CDrawBase::ConvertY(eCoordType eInCoordType, double flDep,
// eCoordType eOutCoordType )
// {
// return ConvertY(flDep);
// }
// float CDrawBase::YConvertToGEO(float y)
// {
// CQtWellTrackNode *pWellNode = GetWellTrackNode();

View File

@ -160,6 +160,10 @@ void FormDraw::setDrawData(QStringList listdt)
{
initRose(curv);
}
else if("dcaObject" == strType)
{
initDCA(curv);
}
curv->replot();
connect(curv, SIGNAL(mouseWheel(QWheelEvent*)), this, SLOT(s_mouseWheel(QWheelEvent*)));
@ -4635,6 +4639,215 @@ void FormDraw::addQCPItemLine(QMyCustomPlot *widget, float cx, float cy, const Q
pLine->setPoints(myPolygon);
}
void FormDraw::initDCA(QMyCustomPlot *widget)
{
widget->m_iX1 = 0;
widget->m_iX2 = 360;
widget->m_iY1 = g_iY1;
widget->m_iY2 = g_iY2;
//
widget->xAxis->setRange(widget->m_iX1, widget->m_iX2);
widget->yAxis->setRange(g_iY1, g_iY2);
//对调XY轴在最前面设置
QCPAxis *yAxis = widget->yAxis;
QCPAxis *xAxis = widget->xAxis;
widget->xAxis = yAxis;
widget->yAxis = xAxis;
CMemRdWt mrw;
m_PointNum = 0 ;
float *DCA,*AZIX_DCA;
DWORD m_nSamples = 0;
float m_flRlev2 = 0.0f;
if ( mrw.Open(m_strSlfName.toStdString().c_str()) ) // 打开井文件
{
QString m_csCurveFd=("DCA"); // 方位/倾角 曲线名
int iIndex = mrw.OpenWave(m_csCurveFd.toStdString().c_str());
if (iIndex >= 0)
{
Slf_WAVE WaveInfo;
mrw.GetWaveInfo(iIndex,&WaveInfo);
m_SDep = WaveInfo.StartDepth;
m_EDep = WaveInfo.EndDepth;
m_Rlev = WaveInfo.DepLevel;
m_nSamples = WaveInfo.TimeSamples;
m_flRlev2 = WaveInfo.TimeLevel;
if(m_flRlev2<=0) m_flRlev2=0.1;
m_PointNum = (float)(fabs((m_EDep-m_SDep)/m_Rlev+0.5));
DCA=new float[(m_PointNum+1)*m_nSamples];
mrw.ReadWave(iIndex,m_SDep,m_PointNum,DCA);
float DCA_MAX=0;
for(DWORD i=0;i<m_PointNum*m_nSamples;i++)if(DCA_MAX<DCA[i])DCA_MAX=DCA[i];
mrw.CloseWave(iIndex);
// DCA_Mes.Format(("%s曲线信息\r\n\r\n顶深%f\r\n底深%f\r\n深度间隔%f\r\n样本点数%d\r\n元素个数%d\r\n最大异常值%f"),m_csCurveFw,m_SDep,m_EDep,m_Rlev,m_PointNum,m_nSamples,DCA_MAX);
//mFillMes->ItemNum=m_nSamples;
//----------------------------
}
QString m_csCurveFw=("AZIX_DCA"); // 方位/倾角 曲线名
//AZIX_DCA
iIndex = mrw.OpenWave(m_csCurveFw.toStdString().c_str());
if (iIndex >= 0)
{
Slf_WAVE WaveInfo;
mrw.GetWaveInfo(iIndex,&WaveInfo);
m_SDep = WaveInfo.StartDepth;
m_EDep = WaveInfo.EndDepth;
m_Rlev = WaveInfo.DepLevel;
m_nSamples = WaveInfo.TimeSamples;
m_flRlev2 = WaveInfo.TimeLevel;
if(m_flRlev2<=0) m_flRlev2=0.1;
m_PointNum = (float)(fabs((m_EDep-m_SDep)/m_Rlev+0.5));
AZIX_DCA=new float[(m_PointNum+1)*m_nSamples];
mrw.ReadWave(iIndex,m_SDep,m_PointNum,AZIX_DCA);
mrw.CloseWave(iIndex);
// AZIX_DCA_Mes.Format(("%s曲线信息\r\n\r\n顶深%f\r\n底深%f\r\n深度间隔%f\r\n样本点数%d\r\n元素个数%d"),m_csCurveFd,m_SDep,m_EDep,m_Rlev,m_PointNum,m_nSamples);
//----------------------------
}
mrw.Close(); //关闭井文件
}
// 计算显示深度
float sdepc,edepc;
sdepc = -g_iY2;
edepc = -g_iY1;
if ( sdepc > m_EDep ) sdepc=m_EDep;
if ( edepc > m_EDep ) edepc = m_EDep;
if(edepc<sdepc) edepc=sdepc;
float m_PlotSdep=sdepc;
float m_PlotEdep=edepc;
m_LeftVal = 0;
m_RightVal = 360;
float m_Amp = 5000;
QColor m_crFill[4];
m_crFill[0] = QColor(qRgb(255,0,0));
m_crFill[1] = QColor(qRgb(0,255,0));
m_crFill[2]= QColor(qRgb(0,0,255));
m_crFill[3]= QColor(qRgb(0,0,0));
// float mOffset =m_MoveDep/m_Rlev;
// 绘制
// QRectF wrt;
int dep=0;
// float detp=m_PlotSdep;
// 分配内存
int nPointNum=(edepc+-sdepc)/m_Rlev+0.5;
if(nPointNum<1) return;
QPointF *points,*points1;
points = new QPointF[2*nPointNum+1];
points1 = new QPointF[nPointNum+10];
QPen pPen,pPen_PAD;
// pPen = QPen(m_crCurve,m_nCurveLineWidth);
// //pPen.setColor();
// pDC->setPen(pPen);
// pDC->setRenderHint(QPainter::Antialiasing, true);
// float scale = (m_RightVal-m_LeftVal)/ rt.width();
float scale1 = m_Amp/ widget->m_iX2;
//计算坐标
float x,x1,y=9999999.0;
int e0=(sdepc-m_SDep)/m_Rlev+0.5;
if(sdepc<m_SDep)e0=(sdepc-m_SDep)/m_Rlev-0.5;
for(int npad=0;npad<m_nSamples;npad++)
{
int e=0;
int npoint=0;
float dep=sdepc;
// edepc+=fabs(m_MoveDep);
while(dep<=edepc-m_Rlev)
{
e=(dep-m_SDep)/m_Rlev+0.5;
y = dep * -1.0f;//mrt.top() + (dep-m_PlotSdep)*flDepthScale;
// if(y<mrt.top()) y=mrt.top();
dep=(e+1)*m_Rlev+m_SDep;
if(e<0) continue;
/*if(m_MoveDep&&dep>m_MoveSdep&&dep<m_MoveEdep)
{
e+=mOffset;
if(e<0) e=0;
if(e*m_Rlev+m_SDep>m_EDep) e=(m_EDep-m_SDep)/m_Rlev;
}*/
//方位
float val=AZIX_DCA[e*m_nSamples+npad];
if(val<0)val+=360.;
else if(val>360.)val-=360;
// if(val<=m_LeftVal)x=rt.left();
// else if(val>=m_RightVal)x=rt.right();
// else x = ComputeCurvePos(val,m_LeftVal,0,rt.left(),0,0,scale);
x = val;
points[npoint].setX(x);
points[npoint].setY(y+0.5);
//异常幅度
val=DCA[e*m_nSamples+npad];
if(val<=0)x1=0;
else if(val>=m_Amp)x1=widget->m_iX2;
else
{
x1 = ComputeCurvePos(val,0,m_Amp, 0, 0,0,scale1);
}
float ix=x1+x;
if(ix>widget->m_iX2)ix=widget->m_iX2;
points1[npoint].setX(ix);
points1[npoint].setY(y+0.5);
//if(!m_IsFill)//连线
{
if(val>0)
{
QCPItemLine *qcpItemLine = new QCPItemLine(widget);
qcpItemLine->setPen(QPen(m_crFill[npad],1));
qcpItemLine->start->setCoords(points[npoint].y(), points[npoint].x());//圆心位置
qcpItemLine->end->setCoords(points1[npoint].y(),points1[npoint].x());//圆心位置
}
}
npoint++;
}
QCPGraph * pgra = widget->graph(npad);
if(pgra == NULL)
{
pgra = widget->addGraph();
pgra->setPen(QPen(Qt::black,1));
}
QVector<double> vx;
QVector<double> vy;
for (int k = 0 ; k < npoint-1 ; k++)
{
vx << points[k].y();
vy << points[k].x();
}
pgra->setData(vx, vy);
for(int i=0;i<npoint;i++)
{
points[npoint+i]=points1[npoint-1-i];
}
}
}
float FormDraw::ComputeCurvePos(float flVal, float lsc, float rsc, float lps, float rps, int iType, float scale, float flMin, float flMax)
{
float x;
{
x = lps+(flVal-lsc)/scale;
}
if (x < flMin) {
x = flMin;
}
if (x > flMax) {
x = flMax;
}
return x;
}
//岩心实验数据
void FormDraw::initCorePhysics(QMyCustomPlot *widget, QString strSlfName, QString strLineName)
{

View File

@ -189,6 +189,10 @@ public:
//玫瑰图
void initRose(QMyCustomPlot *widget);
void addQCPItemLine(QMyCustomPlot *widget, float cx, float cy, const QPointF& p1, const QPointF& p2, const QPen& wPen);
// DCA检测
void initDCA(QMyCustomPlot *widget);
float ComputeCurvePos(float flVal,float lsc,float rsc,float lps,float rps,int iType,float scale,float flMin=-99999,float flMax=99999);
signals:
//void sig_AddLine(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName);

View File

@ -235,6 +235,10 @@ void FormTrack::setDrawDt(QStringList listdt, float vmax, float vmin)
{
strAliasName = "玫瑰图";
}
else if("dcaObject" == strType)
{
strAliasName = "裂缝检测";
}
QString strUnit = "";
QColor lineColor=QColor(0,0,0);
double width=2;

View File

@ -356,8 +356,10 @@ void FormWell::s_NewCol(QStringList listdt)
QString strTrackName = "" + QString::number(columnCount+1);
if(strType == "depthObject")
strTrackName = "深度";
if(strType == "roseObject")
else if(strType == "roseObject")
strTrackName = "玫瑰图";
else if(strType == "dcaObject")
strTrackName = "DCA检测";
FormTrack *formTrack = NULL;
//总行数

View File

@ -389,6 +389,7 @@ void MainWindowCurve::initToolBar()
connect(m_pinlvAc, &QAction::triggered, this, &MainWindowCurve::s_pinLvAc);//频率统计图
connect(m_ganzhuangtuAc, &QAction::triggered, this, &MainWindowCurve::s_NewGanZhuangTu);//杆状图
connect(m_roseAc, &QAction::triggered, this, &MainWindowCurve::s_roseAc);//玫瑰图
connect(m_DCAAc, &QAction::triggered, this, &MainWindowCurve::s_dcaAc);
connect(m_collapseAc, &QAction::triggered, this, &MainWindowCurve::s_Jykt);//井眼垮塌矢量图
connect(m_deviAc, &QAction::triggered, this, &MainWindowCurve::s_Denv);//井斜方位图
connect(m_electric_imagingAc, &QAction::triggered, this, &MainWindowCurve::s_DrawImage);//图像
@ -1176,6 +1177,24 @@ void MainWindowCurve::s_roseAc()
emit CallManage::getInstance()->sig_NewCol(dt);
}
void MainWindowCurve::s_dcaAc()
{
int nW = 180;
QStringList sret = this->insertCol(nW);
if(sret.length() <= 0)
return;
QStringList dt;
dt << m_strUuid;
dt << sret.at(0);
dt << sret.at(1);
dt << "";
dt << "dcaObject";
dt << QString::number(nW);
//新建道
emit CallManage::getInstance()->sig_NewCol(dt);
}
//井眼垮塌矢量图
void MainWindowCurve::s_Jykt()
{

View File

@ -127,6 +127,7 @@ public slots:
void s_pinLvAc(); // 频率统计
void s_NewGanZhuangTu(); // 杆状图
void s_roseAc(); // 玫瑰图
void s_dcaAc(); // DCA分析
void s_Jykt(); // 井眼垮塌矢量图
void s_Denv(); // 井斜方位图
void s_DrawImage(); // 图像 成图