diff --git a/logPlus/DrawNrad.cpp b/logPlus/DrawNrad.cpp new file mode 100644 index 0000000..7b3c1c3 --- /dev/null +++ b/logPlus/DrawNrad.cpp @@ -0,0 +1,319 @@ +#include +#include +#include +#include +#include "MemRdwt.h" +#include "DrawNrad.h" + +#define MAX_ARM 100 // 最大臂数 +#define MAX_HORZ_GRID 20 // 最大插值点数 + +extern double GetData(int RepCode,char *buffer); + +CDrawNrad::CDrawNrad(QMyCustomPlot *myCustomPlot, QString strSlfName, QString csCurve) +{ + m_myCustomPlot = myCustomPlot; + + // + m_PointNum=0; + m_LeftVal=30; + m_RightVal=65; + + m_crHorzLine=qRgb(0,0,0); + m_crVertLine=qRgb(0,0,0); + m_nHorzLineWidth = 1; + m_nVertLineWidth = 1; + m_nHorzGrid = 0; + m_nArm = 36; + m_iStartArmPos=1; + m_iEndArmPos=11; + m_nFrac = 0; + + m_D3Angle = 10; + m_iDoor = 0; // 门槛值 + m_nAmp = 128; + + m_nColorNum = 32; + + m_flWjMaxFactor = 0.6; + m_flWjMinFactor = 0.5; + m_flVFactor = 0.8; //椭圆纵向半径占横向半径比例 +} + +CDrawNrad::~CDrawNrad(void) +{ + +} + +void CDrawNrad::ReadData(QString strSlfName, QString csCurve) +{ + if(strSlfName.isEmpty())return; + + CMemRdWt mrw; + m_PointNum = 0 ; + char strFracTable[256]; + int i,iIndex,iIndex2,nCount; + m_nArm = 1; + memset(&WaveInfo,0x00,sizeof(Slf_WAVE)); + WaveInfo.ArrayNum = 0; + WaveInfo.TimeLevel = 0; + WaveInfo.TimeSamples = 0; + if ( mrw.Open(strSlfName.toStdString().c_str()) ) // 打开井文件 + { + iIndex = mrw.OpenWave(csCurve.toStdString().c_str()); + if (iIndex >= 0) + { + mrw.GetWaveInfo(iIndex,&WaveInfo); + m_SDep = WaveInfo.StartDepth; + m_EDep = WaveInfo.EndDepth; + m_Rlev = WaveInfo.DepLevel; + m_nSamples = WaveInfo.TimeSamples; + m_flRlev2 = WaveInfo.TimeLevel; + m_PointNum = (float)(fabs((m_EDep-m_SDep)/m_Rlev+0.5)); + m_nArm = WaveInfo.TimeSamples; + } + mrw.CloseWave(iIndex); + //vVdl.vchar=m_Value; + mrw.Close(); //关闭井文件 + } +} + +void CDrawNrad::DrawNrad(QString strSlfName, QString csCurve) +{ + if(strSlfName.isEmpty()) return; + if(m_nHorzLineWidth<=0)m_nHorzLineWidth = 1; + if(m_nVertLineWidth<=0)m_nVertLineWidth = 1; + float sdep,edep,flDepthScale,tempf; + float dep; + float x,y; + int i,j,k,nPointNum,mOffset =0; + int iIndex,npoint; + CMemRdWt mrw; + QPen pPen; + + QPointF pt[MAX_ARM*MAX_HORZ_GRID]; + QPointF **ptCal;//[2000][42]; + float *Data,*DataTo; // 原始数据、插值后数据 + float flScale[MAX_ARM*MAX_HORZ_GRID],flStep; + float flSin[MAX_ARM*MAX_HORZ_GRID],flCos[MAX_ARM*MAX_HORZ_GRID]; + int nDrawArm,offsetX; // 插值前绘制的臂数 + int nDrawArm2; // 插值后的臂数 + int centerX,centerY ,nWidth ; + float xspeed; + float angle,ls1,ls2; + int r; + int iArmPos[MAX_ARM]; + int nMid; + + // 计算显示深度 + tempf = (m_EDep - m_SDep)/m_Rlev+0.5; + nPointNum = tempf+1; + if ( nPointNum <= 1) + return ; + if ( m_nArm < 2) + return ; + if(m_iStartArmPos >= m_nArm) m_iStartArmPos = m_nArm-1; + + // 初始化 + int iMyWidth = m_myCustomPlot->axisRect(0)->width(); + centerX = (iMyWidth+0)/2.0; + centerY = 0; + nWidth = iMyWidth; + // 最大外径宽度 + tempf = m_flWjMaxFactor*nWidth/2; + r = tempf; + // 最大外径与最小外径差,即井径曲线的显示范围 + tempf = (m_flWjMaxFactor-m_flWjMinFactor)*nWidth/2; + offsetX = tempf; + + ls1 = nWidth*m_flWjMinFactor/2; + ls2 = nWidth*m_flWjMaxFactor/2; + + // 统计需要显示井径曲线的序号 + if ( m_iStartArmPos < m_iEndArmPos ) + { + nDrawArm = m_iEndArmPos - m_iStartArmPos +1; + if ( nDrawArm > m_nArm ) + nDrawArm = m_nArm; + for (i=0; i m_nArm ) + nDrawArm = m_nArm; + for (i=0; i 0 ) + DataTo = new float[(nDrawArm+nDrawArm*m_nHorzGrid)+1]; + ptCal = new QPointF *[nPointNum]; + for (i=0; i= 0) + { + mrw.ReadWave(iIndex,dep,1,(void *)value); + } + else + memset(value,0,m_nSamples*WaveInfo.DepLevel); + // 需要绘制的井径曲线 + for (j=0; j nMid ) + { + tempf = pt[j].x() +(DataTo[j]-m_LeftVal)/flScale[j]; + } + else + { + tempf= pt[j].x(); + } + } + + x = tempf; + // y坐标不计算,按采样间隔计算得来 + tempf = y + pt[j].y(); + + ptCal[npoint][j].setX(x); + ptCal[npoint][j].setY(tempf); + } + npoint++; + } + // 绘制横线 + QPointF *ptOld = new QPointF[nDrawArm2+1]; + pPen.setColor(m_crHorzLine); + pPen.setWidth(m_nHorzLineWidth); + + for (i=0;idrawPolyline(ptOld,nDrawArm2); + + } + + delete [] ptOld; + // 绘制竖线 + pPen.setColor(m_crVertLine); + pPen.setWidth(m_nVertLineWidth); + + ptOld = new QPointF[npoint+1]; + for (i=0;idrawPolyline(ptOld,npoint); + } + delete [] ptOld; + // 清理、释放内存 + delete [] value; + delete [] Data ; + if ( m_nHorzGrid > 0 ) + delete [] DataTo; + + for (i=0; i +#include "qmycustomplot.h" + +class CDrawNrad:public QObject +{ + Q_OBJECT +public: + CDrawNrad(QMyCustomPlot *myCustomPlot, QString strSlfName, QString csCurve); + virtual ~CDrawNrad(void); + +public: + void ReadData(QString strSlfName, QString csCurve); + void DrawNrad(QString strSlfName, QString csCurve); + +public: + // 以下变量需保存在模板里 + float m_flVFactor; // 椭圆纵向半径占横向半径比例 + float m_flWjMaxFactor; //外径最大位置占道的比例 + float m_flWjMinFactor; //外径最小位置占道的比例 + float m_nVertGrid; // 深度方向每隔多少个采样点绘制一个网格 + int m_nHorzStep; // 旋转时增量,最小0,最大:20 + int m_nHorzGrid; // 井径曲线间网格数 + QColor m_crHorzLine, m_crVertLine; // 网格纵、横线颜色 + int m_nHorzLineWidth, m_nVertLineWidth;// 网格纵、横线宽度 + int m_nArm, m_nColorNum;// + int m_iStartArmPos, m_iEndArmPos; // 开始位置、结束位置 + int m_nFrac; + float m_D3Angle; + int m_nAmp; //幅度 + int m_iDoor; // 门槛值 + + QMyCustomPlot *m_myCustomPlot; + + float m_flRlev2; //二维曲线采样间隔 + int m_nSamples; + int m_PointNum; + float m_LeftVal; //左刻度 + float m_RightVal; //右刻度 + Slf_WAVE WaveInfo; //波列基本信息 + float m_SDep,m_EDep,m_Rlev; +}; + +#endif // DrawNrad_H diff --git a/logPlus/formdraw.cpp b/logPlus/formdraw.cpp index bfec9b7..af10386 100644 --- a/logPlus/formdraw.cpp +++ b/logPlus/formdraw.cpp @@ -39,7 +39,7 @@ extern int g_iScale; extern int g_iSupport3D; - +double GetData(int RepCode,char *buffer); extern void AppendConsole(Priority priority, const QString &output); //曲线绘制(多个) diff --git a/logPlus/logPlus.pro b/logPlus/logPlus.pro index e2ff438..4ac57f1 100644 --- a/logPlus/logPlus.pro +++ b/logPlus/logPlus.pro @@ -31,6 +31,7 @@ SOURCES += \ ../common/geometryutils.cpp \ ConsoleOutputWidget.cpp \ DrawFac.cpp \ + DrawNrad.cpp \ GeoIndicatorGenerator.cpp \ Gradient.cpp \ InDefTableDlg.cpp \ @@ -84,6 +85,7 @@ HEADERS += \ ConsoleOutputWidget.h \ DraggablePixmap.h \ DrawFac.h \ + DrawNrad.h \ GeoIndicatorGenerator.h \ Gradient.h \ InDefTableDlg.h \