成像到绘制,使用QPainer实现。

This commit is contained in:
DESKTOP-450PEFP\mainc 2026-05-26 22:00:41 +08:00
parent a1d59208b0
commit ac7106e59f
8 changed files with 1085 additions and 27 deletions

View File

@ -12,6 +12,7 @@
#include "formline.h"
#include "formlogmud.h"
#include "formwave.h"
#include "formimage.h"
#include "PropertyWidget.h"
#include "DrawTvd.h"
#include "DepthProgress.h"
@ -164,6 +165,14 @@ void FormDraw::setDrawData(QStringList listdt, QJsonObject objInfo)
pwave->m_formTrack = m_formTrack;
pwave->show();
}
else if ("DrawImageObject" == strType)
{
FormImage *pimg = new FormImage(this, strSlfName, strWellName, m_strTrackName, strLineName);
pimg->setDepthY(m_iY1, m_iY2);
pimg->initGeometry(m_strUuid, m_iScale, dW, m_nObjDrawH);
pimg->m_formTrack = m_formTrack;
pimg->show();
}
else
{
//
@ -4278,38 +4287,36 @@ void FormDraw::s_addDrawImage(QString strUuid, QString strSlfName, QString strWe
return;
}
//
QMyCustomPlot *curv = new QMyCustomPlot(this, strSlfName, strWellName, strTrackName, strLineName, "DrawImageObject");
//绑定m_formTrack方便关联formInfo
curv->m_formTrack = m_formTrack;
curv->setDepthY(m_iY1, m_iY2);
curv->setScaleX(0, 264);
if (nW <= 0)
nW = g_iOneWidth;
curv->initGeometry(m_strUuid, m_iScale, nW);
curv->m_bX2Y = false;
curv->show();
//图像 成像
QString strWaveName = "";
int _nSamples = 0;
curv->initImage(strSlfName, strWaveName);
//curv->initImage3D(strSlfName, strWaveName);
//DrawImageNew_NoFilter(curv, strSlfName, strWaveName, _nSamples);
//curv->m_colorMap->setVisible(false);
//CylindricalImageMap* cylinderMap = new CylindricalImageMap(curv->xAxis, curv->yAxis);
//cylinderMap->setData(curv->m_colorMap->data());
//cylinderMap->setCylinderRadius(2.0);
//cylinderMap->setSourceColorMap(curv->m_colorMap); // 共享梯度
//cylinderMap->setAzimuth(45);
//cylinderMap->setElevation(30);
//
connect(curv, SIGNAL(mouseWheel(QWheelEvent*)), this, SLOT(s_mouseWheel(QWheelEvent*)));
bool bDraw = true;
if (bDraw)
{
FormImage *pImg = new FormImage(this, strSlfName, strWellName, strTrackName, strLineName);
pImg->setDepthY(m_iY1, m_iY2);
pImg->initGeometry(m_strUuid, m_iScale, nW, m_nObjDrawH);
pImg->m_formTrack = m_formTrack;
pImg->show();
_nSamples = 264;
}
else
{
QMyCustomPlot *curv = new QMyCustomPlot(this, strSlfName, strWellName, strTrackName, strLineName, "DrawImageObject");
//绑定m_formTrack方便关联formInfo
curv->m_formTrack = m_formTrack;
curv->setDepthY(m_iY1, m_iY2);
curv->setScaleX(0, 264);
curv->initGeometry(m_strUuid, m_iScale, nW);
curv->m_bX2Y = false;
curv->show();
//图像 成像
QString strWaveName = "";
curv->initImage(strSlfName, strWaveName);
connect(curv, SIGNAL(mouseWheel(QWheelEvent*)), this, SLOT(s_mouseWheel(QWheelEvent*)));
}
//
m_listLineName.push_back(strLineName);

881
logPlus/formimage.cpp Normal file
View File

@ -0,0 +1,881 @@
#include "FormImage.h"
#include "ui_FormImage.h"
#include <QPainter>
#include "CallManage.h"
#include "forminfo.h"
#include "formtrack.h"
#include "geometryutils.h"
#include "qtColorSchemeComboBox.h"
extern double g_dPixelPerCm;//每厘米像素数
FormImage::FormImage(QWidget *parent, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName) :
QWidget(parent),
ui(new Ui::FormImage)
{
ui->setupUi(this);
m_strSlfName = strSlfName;
m_strWellName = strWellName;
m_strTrackName = strTrackName;
m_strLineName = strLineName;
//LoadFromSLF_wave();
m_parent = parent;
//斜井三图一表
// connect(CallManage::getInstance(), SIGNAL(sig_ChangeTvdProperty(QString, QString, QString, QString, QString, QString, QString, QVariant)),
// this, SLOT(s_ChangeTvdProperty(QString, QString, QString, QString, QString, QString, QString, QVariant)));
//自定义滚动条
//connect(CallManage::getInstance(), SIGNAL(sig_vertScrollBarChanged_santuyibiao(QString, double, double, double)), this, SLOT(vertScrollBarChanged(QString, double, double, double)));
//打印
//connect(CallManage::getInstance(), SIGNAL(sig_vertScrollBarChanged_santu_Print(QString, int, int)), this, SLOT(vertScrollBarChanged_Print(QString, int, int)));
connect(CallManage::getInstance(), SIGNAL(sig_vertScrollBarChanged(QString, double, double, double)), this, SLOT(vertScrollBarChanged(QString, double, double, double)));
connect(CallManage::getInstance(), SIGNAL(sig_vertScrollBarChanged_setGeometry(QString, double, double, double, int)), this, SLOT(vertScrollBarChanged_setGeometry(QString, double, double, double, int)));
connect(CallManage::getInstance(), SIGNAL(sig_ResizeDepth(QString, int, float)), this, SLOT(s_ResizeDepth(QString, int, float)));
//黑白图
connect(CallManage::getInstance(), SIGNAL(sig_changeBlack(QString, bool)), this, SLOT(s_changeBlack(QString, bool)));
}
FormImage::~FormImage()
{
delete ui;
}
void FormImage::initGeometry(QString strUuid, int nscale, double fW, int nH)
{
if (strUuid.length() > 0)
this->m_strUuid = strUuid;
m_iScale = nscale;
int ntmpw = fW * g_dPixelPerCm;
this->setGeometry(0, 0, ntmpw - 2, (int)nH);
//修改滚动条,针对新建的
emit CallManage::getInstance()->sig_changeScrollBar(m_strUuid);
}
void FormImage::setDepthY(float fy1, float fy2)
{
this->m_iY1 = fy1;
this->m_iY2 = fy2;
m_PlotSdep = qAbs(this->m_iY2);
m_fTopY = m_PlotSdep;
}
void FormImage::updateDepthY(float fy1, float fy2)
{
this->m_iY1 = fy1;
this->m_iY2 = fy2;
m_fTopY = qAbs(this->m_iY2);
update();
}
bool FormImage::LoadFromSLF_wave()
{
CLogIO * logio = new CLogIO();
if (!logio->Open(m_strSlfName.toStdString().c_str(), CSlfIO::modeRead))
{
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty = 0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty = NULL;
return false;
}
int curveindex = logio->OpenWave(m_strLineName.toStdString().c_str());
if (curveindex < 0)
{
m_vMD.SetSize(0);
m_vMD.m_vProperty = 0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty = NULL;
delete logio;
return false;
}
//m_ObjectType = WAVE_OBJECT;
logio->GetWaveInfo(curveindex, &waveinfo);
// if (m_ArrayNum > 1) {
// if (waveinfo.RepCode == REPR_CHAR) waveinfo.RepCode = REPR_UCHAR;
// }
// acurveinfo.RepCode = waveinfo.RepCode;
// acurveinfo.CodeLen = waveinfo.CodeLen;
// acurveinfo.DepLevel = waveinfo.DepLevel;
// acurveinfo.StartDepth = waveinfo.StartDepth;
// acurveinfo.EndDepth = waveinfo.EndDepth;
// isRun = true;
int samplenum = (waveinfo.EndDepth - waveinfo.StartDepth) / waveinfo.DepLevel + 1.5;
QString name = m_strSlfName + m_strLineName;
// if (m_ArrayNum > 1) {
// name += "Array";
// }
// key = name;
int nbpp = waveinfo.SamplePoint;
int mlen = 0;
int myWidth = 0;
int chlen = 0;
int nPadZ = 0;
int myWidth1 = waveinfo.SamplePoint;
int shift0 = 0;
// if (m_ArrayNum > 1) {
// shift0 = pMsa->shift0;
// nPadZ = pMsa->nPadZ;
// myWidth = pMsa->Width;
// nbpp = pMsa->nSample;
// m_ArrayNum = pMsa->nPad;
// mlen = myWidth - m_ArrayNum * nbpp;//总盲区宽度
// mlen /= m_ArrayNum;
// if (mlen % 2 != 0) mlen += 1;
// if (nPadZ < 4) chlen = mlen / 8;
// else chlen = mlen / 4;
// if (chlen % 2 != 0) chlen += 1;
// if (chlen == 0) chlen = 2;
// // mlen=mlen-chlen;
// mlen = m_ArrayNum * chlen / nPadZ;
// if (mlen % 2 != 0) mlen++;
// if (mlen > 20) mlen = 20;
// if (chlen < 4) chlen = 4;
// // chlen=(myWidth-(mlen*m_ArrayNum+nbpp*m_ArrayNum))/nPadZ;
// int klen = pMsa->nPadZ*waveinfo.SamplePoint + mlen + pMsa->nPadZ*chlen;
// myWidth1 = klen * pMsa->nPad / pMsa->nPadZ;
// }
// else
myWidth = waveinfo.SamplePoint;
int nlen = waveinfo.CodeLen*waveinfo.SamplePoint;
int reclen = waveinfo.CodeLen*myWidth*waveinfo.ArrayNum;
m_SDep = waveinfo.StartDepth;
m_EDep = waveinfo.EndDepth;
m_Rlev = waveinfo.DepLevel;
m_nSamples = waveinfo.SamplePoint*waveinfo.ArrayNum;
m_PointNum = (float)(fabs((m_EDep - m_SDep) / m_Rlev + 0.5));
m_sharedMemory.setKey(name);
// 3. 创建或附加到共享内存
if (m_sharedMemory.isAttached())
{
m_sharedMemory.detach();
}
int nMemnum = 3 * sizeof(float) + sizeof(int) + reclen * (samplenum + 1);
if (!m_sharedMemory.attach())
{
// 尝试创建共享内存
if (!m_sharedMemory.create(nMemnum))
{
qDebug() << "Failed to create shared memory:"
<< m_sharedMemory.errorString();
return false;
}
float *buffer = (float*)m_sharedMemory.data();
buffer[0] = waveinfo.StartDepth;
buffer[1] = waveinfo.EndDepth;
buffer[2] = waveinfo.DepLevel;
((int *)buffer)[3] = samplenum;
char *pchar = (char *)&buffer[4];
//double laa = (double)reclen*(double)samplenum / waveinfo.CodeLen;
int num = reclen * samplenum / waveinfo.CodeLen;
float defval = -9999;
if (waveinfo.RepCode == REPR_CHAR || waveinfo.RepCode == REPR_UCHAR) defval = 0;
else if (waveinfo.RepCode == REPR_SHORT || waveinfo.RepCode == REPR_USHORT) defval = 0xffff;
for (int i = 0; i < num; i++)
{
this->SetData(waveinfo.RepCode, &pchar[i*waveinfo.CodeLen], defval);
}
logio->ReadWave(curveindex, waveinfo.StartDepth, samplenum, (void *)pchar);
}
// 4. 锁定共享内存并写入数据
if (!m_sharedMemory.lock())
{
qDebug() << "Failed to lock shared memory";
m_sharedMemory.detach();
return false;
}
m_vMD.SetSize(3);
m_vMD.m_vProperty = (float *)m_sharedMemory.data();
int size = ((int *)m_sharedMemory.data())[3];
m_vProperty.SetSize(size);
m_vProperty.m_vProperty = &m_vMD.m_vProperty[4];
if (m_vMD.size() > 0) {
m_TopDepth = m_vMD.m_vProperty[0];
m_BottomDepth = m_vMD.m_vProperty[1];
m_Rlev = m_vMD.m_vProperty[2];
}
float val = 0;
valMin.clear();
valMax.clear();
valMin.resize((waveinfo.SamplePoint)*waveinfo.ArrayNum);
valMax.resize((waveinfo.SamplePoint)*waveinfo.ArrayNum);
for (int j = 0; j < (waveinfo.SamplePoint)*waveinfo.ArrayNum; j++) {
valMin[j] = 999999999;
valMax[j] = -99999999;
}
char buf[200];
for (int i = 0; i < samplenum; i++) {
for (int j = 0; j < waveinfo.SamplePoint*waveinfo.ArrayNum; j++)
{
val = GetData(i, j, buf);
if (val == 0 || val == -9999 || val == -999.25 || val == -99999 || val == -32767 || val == 32767) continue;
if (_isnan(val) || !_finite(val)) continue;
if (valMax[j] < val)valMax[j] = val;
if (valMin[j] > val)valMin[j] = val;
}
}
if (waveinfo.MaxValue == -50 || waveinfo.MinValue == 50 || fabs(waveinfo.MaxValue) < 1e-6 || waveinfo.MinValue < 1e-6 || waveinfo.MaxValue == -99999 || waveinfo.MaxValue == -9999 || waveinfo.MinValue == 999999 || waveinfo.MinValue == 999999 || waveinfo.MinValue == 99999 || waveinfo.MinValue == 99999 || waveinfo.MinValue == -9999)
{
float valmin = 99999;
float valmax = -99999;
for (int j = 0; j < waveinfo.SamplePoint*waveinfo.ArrayNum; j++) {
if (valmin > valMax[j]) valmin = valMax[j];
if (valmin > valMin[j]) valmin = valMin[j];
if (valmax < valMin[j]) valmin = valMin[j];
if (valmax < valMax[j]) valmax = valMax[j];
}
waveinfo.MaxValue = valmax;
waveinfo.MinValue = valmin;
//BWAVEINFO.MaxValue = valmax;
//BWAVEINFO.MinValue = valmin;
//logio->SetWaveInfo(curveindex, &BWAVEINFO);
}
m_sharedMemory.unlock();
logio->Clear();
delete logio;
return true;
}
void FormImage::setSchemIndex(int nidx)
{
schemIndex = nidx;
m_rgbList = QtColorTableData::getInstance()->GetRgb_UseTag(1, schemIndex, 256);
}
void FormImage::paintEvent(QPaintEvent*)
{
//
QPainter painter(this);
QRect rect = this->rect();
// QRect rect = m_parent->rect();
//背景透明
painter.fillRect(rect.left(), rect.top(), rect.width(), rect.height(), QColor(0, 0, 0, 0)); //QColor(67, 67, 67, 100)
if (m_formTrack)
{
if (m_pInfo == NULL)
{
m_pInfo = m_formTrack->getFormInfoByParameters(m_strUuid, m_strWellName, m_strTrackName, m_strLineName);
}
if (m_pInfo)
{
if (m_pInfo->m_bShow3D)
this->DrawImage3D(&painter, rect);
else
this->DrawImage(&painter, rect);
}
}
}
void FormImage::s_ResizeDepth(QString strUuid, int nHeight, float fDepthLowerY)
{
if (m_strUuid != strUuid)
return;
this->setFixedHeight(nHeight);
m_fDepthLowerY = qAbs(fDepthLowerY);
m_fAddY = m_fDepthLowerY - m_fTopY;
}
void FormImage::s_changeBlack(QString strUuid, bool bBlack)
{
if (m_strUuid != strUuid || m_bBlack == bBlack)
return;
m_bBlack = bBlack;
m_rgbList = QtColorTableData::getInstance()->GetRgb_UseTag(1, m_bBlack ? 2 : schemIndex, 256);
update();
}
//自定义滚动条
void FormImage::vertScrollBarChanged(QString strUuid, double value, double low, double upper)
{
if (m_strUuid == strUuid)
{
}
else
{
return;
}
m_fTopY = value;
update();
}
//打印
void FormImage::vertScrollBarChanged_Print(QString strUuid, int iNum, int iHeightOfScreen)
{
if (m_strUuid == strUuid)
{
}
else
{
return;
}
//上移或下移
QRect geoRect = geometry();
//
double dDelta = iHeightOfScreen * (iNum - 1);
setGeometry(0, -dDelta, geoRect.width(), geoRect.height());
}
void FormImage::vertScrollBarChanged_setGeometry(QString strUuid, double value, double low, double upper, int ndepth)
{
if (m_strUuid == strUuid)
{
}
else
{
return;
}
m_fTopY = ndepth;
update();
}
void FormImage::wheelEvent(QWheelEvent *event) // 滚轮事件
{
emit CallManage::getInstance()->sig_mouseWheel(event);
}
void FormImage::DrawImage(QPainter* pdc, QRectF mrt1)
{
if (m_pInfo == NULL)
{
m_pInfo = m_formTrack->getFormInfoByParameters(m_strUuid, m_strWellName, m_strTrackName, m_strLineName);
}
if (m_pInfo == NULL)
return;
if (!m_pInfo->m_pImage)
{
m_pInfo->m_pImage = this;
}
CLogIO *logio = new CLogIO();
logio->Open(m_strSlfName.toStdString().c_str(), CSlfIO::modeRead);
//
int iIndex = logio->OpenWave(m_strLineName.toStdString().c_str());
if (iIndex < 0) {
delete logio;
return;
}
Slf_WAVE _wave;
logio->GetWaveInfo(iIndex, &_wave);
m_SDep = _wave.StartDepth;
m_EDep = _wave.EndDepth;
m_Rlev = _wave.DepLevel;
float sdep, edep, flDepthScale = 18.897617f, temp;
// 计算显示深度
float sdepc = m_fTopY, edepc = m_fTopY + m_fAddY;
sdep = sdepc;
edep = edepc;
flDepthScale = mrt1.height() / (edepc - sdepc);
if (edep > m_EDep) edep = m_EDep;
if (sdep < m_SDep) sdep = m_SDep;
if (sdep > m_EDep) return;
if (edep < m_SDep) return;
if (edep > m_EDep) edep = m_EDep;
if (edep < sdep) edep = sdep;
if (edep > m_EDep) edep = m_EDep;
if (sdep > m_EDep) sdep = m_EDep;
int incount = (edep - sdep) / m_Rlev;
if (incount == 0)
return;
QRectF rt = mrt1;
float flDep;
int i, ii, j, nPoint = 0, m;
QRectF wrt;
float dep, ch;
double ratio;
CString cs;
QString qs;
int ytmp = -1;
float y = 9999999.0;
//计算数据点数
temp = _wave.TimeSamples;
if (temp < 0) temp -= 0.5;
nPoint = abs(temp);
ratio = 1.0;// int((float)incount * 1000 / rt.height()) / 1000.0; //比例
char *value = new char[incount*nPoint*_wave.CodeLen];
//按块读数据
if (iIndex >= 0)
{
logio->ReadWave(iIndex, sdep, incount, (void *)value);
}
else memset(value, 0, incount*nPoint*_wave.CodeLen);
float depcount = (float)incount / (edep - sdep);
float depcount1 = 0;
QSize qsize;
int rh = mrt1.height();
int rw = this->size().width();
long nLnBytes = (nPoint * 3 + 3) / 4 * 4;
unsigned char *pData = new unsigned char[nLnBytes*(int)(rh + 0.5)];
memset(pData, 255, nLnBytes*(int)(rh + 0.5));
int datatype = 0;
int m_LeftVal = 0;
int m_RightVal = 128;
float m_flBackVal = -9999;
if (m_pInfo)
{
datatype = m_pInfo->m_nCoord;
m_LeftVal = m_pInfo->m_ImgMinVal;
m_RightVal = m_pInfo->m_ImgMaxVal;
m_flBackVal = -9999;
schemIndex = m_pInfo->m_nSchemeIndex;
}
if (m_rgbList.size() <= 0)
{
m_rgbList = QtColorTableData::getInstance()->GetRgb_UseTag(1, schemIndex, 256);
}
QRgb rgbbg = QtColorTableData::getInstance()->getRgb_Bg(schemIndex);
for (double dep1 = sdep; dep1 < edep; dep1 += ratio * m_Rlev)
{
y = (dep1 - sdepc)*flDepthScale;
//y = ConvertY( eCoord_GEO,dep1,eCoord_GEONormal );
if (y < 0) continue;
if (ytmp == int(y)) continue;
else ytmp = y;
wrt.setTop(y);
depcount1 = (dep1 - sdep)*depcount;
for (i = 0; i < nPoint; i++)
{
ch = GetData(_wave.RepCode, (char *)&value[(int(depcount1)*nPoint + i)*_wave.CodeLen]);
if (wrt.top() >= rh)
break;
m = (int)wrt.top();
if (m_flBackVal != ch)
{
if (datatype == 0) //线性刻度
{
ii = 256 * (ch - m_LeftVal) / (m_RightVal - m_LeftVal);
}
else
{
if (m_LeftVal < 1.0)
ii = 256 * (log10(ch)) / log10(m_RightVal);
else
ii = 256 * (log10(ch) - log10(m_LeftVal)) / (log10(m_RightVal) - log10(m_LeftVal));
}
if (ii > 254) ii = 254;
if (ii < 0) ii = 0;
pData[m*nLnBytes + 3 * i] = qRed(m_rgbList.at(ii));
pData[m*nLnBytes + 3 * i + 1] = qGreen(m_rgbList.at(ii));
pData[m*nLnBytes + 3 * i + 2] = qBlue(m_rgbList.at(ii));
}
else
{
pData[m*nLnBytes + 3 * i] = qRed(rgbbg);
pData[m*nLnBytes + 3 * i + 1] = qGreen(rgbbg);
pData[m*nLnBytes + 3 * i + 2] = qBlue(rgbbg);
}
}
} //read data end
int nheight = rh;
if (wrt.top() < rh - 1)
nheight = (int)(wrt.top() + 0.5); //若数据行数小于rt.Height()
//防止图片扭曲:同时限定每一行的数据大小可以保证
QImage membmp(pData, nPoint, nheight, 3 * nPoint, QImage::Format_RGB888);
qsize.setWidth(rw - 2);
qsize.setHeight(nheight);
// 图像缩放
QImage result = membmp.scaled(qsize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
pdc->drawImage(rt.left() + 1, rt.top(), result);
delete[]pData; pData = NULL;
delete[]value;
}
void FormImage::DrawImage3D(QPainter* pdc, QRectF mrt)
{
if (m_pInfo == NULL)
{
m_pInfo = m_formTrack->getFormInfoByParameters(m_strUuid, m_strWellName, m_strTrackName, m_strLineName);
}
if (m_pInfo == NULL)
return;
if (!m_pInfo->m_pImage)
{
m_pInfo->m_pImage = this;
}
CLogIO *logio = new CLogIO();
logio->Open(m_strSlfName.toStdString().c_str(), CSlfIO::modeRead);
//
int iIndex = logio->OpenWave(m_strLineName.toStdString().c_str());
if (iIndex < 0) {
delete logio;
return;
}
Slf_WAVE _wave;
logio->GetWaveInfo(iIndex, &_wave);
m_SDep = _wave.StartDepth;
m_EDep = _wave.EndDepth;
m_Rlev = _wave.DepLevel;
float sdep, edep, flDepthScale = 18.897617f, temp;
// 计算显示深度
float sdepc = m_fTopY, edepc = m_fTopY + m_fAddY;
sdep = sdepc;
edep = edepc;
flDepthScale = mrt.height() / (edepc - sdepc);
if (sdep > m_EDep) sdep = m_EDep;
if (edep < m_SDep) edep = m_SDep;
if (sdep < m_SDep) sdep = m_SDep;
if (edep > m_EDep) edep = m_EDep;
if (edep < sdep) edep = sdep;
int iDepCount = (edep - sdep) / m_Rlev;
if (iDepCount == 0)
return;
// 计算开始数据点及数据点数
int nPoint, m;
float flVal;
//计算数据点数
temp = _wave.TimeSamples;
if (temp < 0) temp -= 0.5;
nPoint = abs(temp);
// 绘制
QRectF wrt;
int dep = 0;
float detp = sdepc;
int rh = mrt.height();
int rw = this->size().width();
double ratio = 1;// int((float)iDepCount * 1000 / rt.height()) / 1000.0;
if (ratio > 1) ratio = 1;
char *value = new char[iDepCount*nPoint*_wave.CodeLen];
long nLnBytes = (nPoint * 3 + 3) / 4 * 4;
unsigned char *pData = new unsigned char[nLnBytes*(int)(rh + 0.5)];
memset(pData, 255, nLnBytes*(int)(rh + 0.5));
int m_iStartAngle = 20;
int m_iStartPos = 0;
int datatype = 0;
int m_LeftVal = 0;
int m_RightVal = 128;
if (m_pInfo)
{
m_iStartAngle = m_pInfo->m_nOverlook;
m_iStartPos = m_pInfo->m_nAzimuth;
datatype = m_pInfo->m_nCoord;
m_LeftVal = m_pInfo->m_ImgMinVal;
m_RightVal = m_pInfo->m_ImgMaxVal;
schemIndex = m_pInfo->m_nSchemeIndex;
}
//QList<QRgb> rgbList = QtColorTableData::getInstance()->GetRgb_UseTag(1, m_nSchemeIndex, 256);
if (m_rgbList.size() <= 0)
{
m_rgbList = QtColorTableData::getInstance()->GetRgb_UseTag(1, schemIndex, 256);
}
float pi = 3.1415926;
float angle = pi / ((float)nPoint / 2.0);
int drawdep;
float fangle = m_iStartAngle / 90.0;
int r = rw / 4 * fangle;
int dis = nPoint / 4;
float flOffset = 0;
int drawFlag = -1;
int drawHead = 0;
bool flag1 = ((sdep > detp) || (sdep > detp));
bool flag2 = ((m_SDep < sdep) || (m_SDep > sdep));
int ioffset = m_iStartPos * nPoint / 360.0 + 0.5;
int ytmp = -1;
for (double dep1 = sdep; dep1 < edep; dep1 += ratio * m_Rlev)
{
float y = (dep1 - sdepc)*flDepthScale;
if (ytmp == int(y)) continue;
else ytmp = y;
wrt.setTop(y);
drawFlag++;
if (!drawFlag)
drawHead = wrt.top();
if (!flag1)
drawHead = r;
if (!flag2)
wrt.setTop(wrt.top() - r);
if (wrt.top() == r)
flOffset = dep1 - sdep;
//画带头的圆柱
if (!flag1 || !flag2)
{
if (iIndex >= 0)
{
logio->ReadWave(iIndex, dep1 + flOffset, 1, (void *)value);
}
else memset(value, 0, m_nSamples*_wave.DepLevel);
for (int i = 0; i <= nPoint / 2; i++)
{
drawdep = wrt.top() + r + r * sin(angle*i);
flVal = GetData(_wave.RepCode, (char *)&value[(i + ioffset) % nPoint*_wave.CodeLen]);
if (drawdep > rh - 1)
continue;
else
{
// if (m_flBackVal == flVal)
// {
// pData[drawdep*nLnBytes + 3 * (i + dis)] = GetBValue(m_GraInfo.GetBackgroundColour());
// pData[drawdep*nLnBytes + 3 * (i + dis) + 1] = GetGValue(m_GraInfo.GetBackgroundColour());
// pData[drawdep*nLnBytes + 3 * (i + dis) + 2] = GetRValue(m_GraInfo.GetBackgroundColour());
// }
// else
{
int ii;
if (datatype == 0) //线性刻度
{
ii = 256 * (flVal - m_LeftVal) / (m_RightVal - m_LeftVal);
}
else
{
if (m_LeftVal < 1.0)
ii = 256 * (log10(flVal)) / log10(m_RightVal);
else
ii = 256 * (log10(flVal) - log10(m_LeftVal)) / (log10(m_RightVal) - log10(m_LeftVal));
}
if (ii > 254) ii = 254;
if (ii < 0) ii = 0;
pData[drawdep*nLnBytes + 3 * (i + dis)] = qRed(m_rgbList.at(ii));// GetBValue(pColorArr[ii]);
pData[drawdep*nLnBytes + 3 * (i + dis) + 1] = qGreen(m_rgbList.at(ii));// GetGValue(pColorArr[ii]);
pData[drawdep*nLnBytes + 3 * (i + dis) + 2] = qBlue(m_rgbList.at(ii));// GetRValue(pColorArr[ii]);
}
}
}
}
/* else //不带头
{
if (iIndex >= 0)
{
mrw.ReadWave(iIndex, dep1 - flOffset, 1, (void *)value);
}
else memset(value, 0, m_nSamples*WaveInfo.DepLevel);
for (i = 0; i <= nPoint / 2; i++)
{
drawdep = wrt.top() - r + r * sin(angle*i);
if (drawdep < 0)
continue;
else
{
flVal = GetData(WaveInfo.RepCode, (char *)&value[(i + ioffset) % nPoint*WaveInfo.CodeLen]);
if (m_flBackVal == flVal)
{
pData[drawdep*nLnBytes + 3 * (i + dis)] = GetBValue(m_GraInfo.GetBackgroundColour());
pData[drawdep*nLnBytes + 3 * (i + dis) + 1] = GetGValue(m_GraInfo.GetBackgroundColour());
pData[drawdep*nLnBytes + 3 * (i + dis) + 2] = GetRValue(m_GraInfo.GetBackgroundColour());
}
else
{
int ii;
if (datatype == LINEAR) //线性刻度
{
ii = 256 * (flVal - m_LeftVal) / (m_RightVal - m_LeftVal);
}
else
{
if (m_LeftVal < 1.0)
ii = 256 * (log10(flVal)) / log10(m_RightVal);
else
ii = 256 * (log10(flVal) - log10(m_LeftVal)) / (log10(m_RightVal) - log10(m_LeftVal));
}
if (ii > 255) ii = 255;
if (ii < 0) ii = 0;
pData[drawdep*nLnBytes + 3 * (i + dis)] = GetBValue(pColorArr[ii]);
pData[drawdep*nLnBytes + 3 * (i + dis) + 1] = GetGValue(pColorArr[ii]);
pData[drawdep*nLnBytes + 3 * (i + dis) + 2] = GetRValue(pColorArr[ii]);
}
}
}
}*/
}
int nheight = rh;
if (wrt.top() < rh - 1)
nheight = (int)(wrt.top() + 0.5);
long nLnBytes1 = (nPoint * 3 + 3) / 4 * 4;
BYTE *pData1 = new BYTE[nLnBytes1*nheight];
memcpy(pData1, pData, nLnBytes1*nheight);
QImage membmp(pData1, nPoint, nheight, 3 * nPoint, QImage::Format_RGB888);
QSize qsize;
qsize.setWidth(rw - 2);
qsize.setHeight(nheight);
// 图像缩放
QImage result = membmp.scaled(qsize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
pdc->drawImage(mrt.left() + 1, mrt.top(), result);
delete[]pData1;
delete[]pData;
delete[]value;
delete logio;
}
double FormImage::GetData(int i, int j, char *buffer)
{
float yy = -9999;
if (m_vProperty.size() > i) {
int pos = (int)(i*waveinfo.TimeSamples + j);
yy = GetData(waveinfo.RepCode, (char *)&((char *)m_vProperty.m_vProperty)[pos*waveinfo.CodeLen], waveinfo.CodeLen);
}
return yy;
}
double FormImage::GetData(int repCode, char *buffer, int repLen)
{
double yy = -99999;
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
if (repLen >= 200)
repLen = 199;
if (repLen > 0)
{
memmove(m_strValue, buffer, repLen);
m_strValue[repLen] = 0;
}
else
{
m_strValue[0] = 0;
yy = -99999;
}
break;
}
return yy;
}
void FormImage::SetData(int repCode, char *buffer, double yy)
{
if (!buffer)
{
return;
}
switch (repCode)
{
case REPR_INT: //0
(*((int*)buffer)) = (int)yy;
break;
case REPR_SHORT: //1
(*((short *)buffer)) = (short)yy;
break;
case REPR_LONG://2
(*((long *)buffer)) = (long)yy;
break;
case REPR_FLOAT://3
(*((float *)buffer)) = yy;
break;
case REPR_DOUBLE://4
(*((double *)buffer)) = (double)yy;
break;
case REPR_CHAR://5
(*((char *)buffer)) = (char)yy;
break;
case REPR_UCHAR://6
(*((unsigned char *)buffer)) = (unsigned char)yy;
break;
case REPR_USHORT://7
(*((unsigned short *)buffer)) = (unsigned short)yy;
break;
case REPR_UINT://8
(*((unsigned int *)buffer)) = (unsigned int)yy;
break;
case REPR_ULONG://9
(*((unsigned long *)buffer)) = (unsigned long)yy;
break;
case REPR_STRING://10
// *yy=-99999;
break;
}
return;
}

114
logPlus/formimage.h Normal file
View File

@ -0,0 +1,114 @@
#ifndef FormImage_H
#define FormImage_H
#include <QWidget>
#include <QVariant>
#include <QSharedMemory>
#include "BaseFun.h"
#include "MemRdWt.h"
#pragma execution_character_set("utf-8")
namespace Ui {
class FormImage;
}
class FormTrack;
class FormInfo;
class FormImage : public QWidget
{
Q_OBJECT
public:
explicit FormImage(QWidget *parent = nullptr, QString strSlfName = "", QString strWellName = "", QString strTrackName = "", QString strLineName = "");
~FormImage();
void initGeometry(QString strUuid, int nscale, double fW, int nH);
void setDepthY(float fy1, float fy2);
//改变深度更新绘图
void updateDepthY(float fy1, float fy2);
bool LoadFromSLF_wave();
// 改变色板
void setSchemIndex(int nidx);
private:
Ui::FormImage *ui;
protected:
void paintEvent(QPaintEvent *event);
virtual void wheelEvent(QWheelEvent *event);
void DrawImage(QPainter* pdc, QRectF mrt);
void DrawImage3D(QPainter* pdc, QRectF mrt);
double GetData(int i, int j, char *buffer);
double GetData(int repCode, char *buffer, int repLen = 0);
void SetData(int repCode, char *buffer, double yy);
bool IsFiniteNumber(float v)
{
return qIsFinite(v) != 0;
}
public:
QString m_strUuid;
QString m_strSlfName;
QString m_strWellName;
QString m_strTrackName;
QString m_strLineName;
QWidget *m_parent;
FormTrack *m_formTrack = NULL;
FormInfo* m_pInfo = NULL;
float m_iY1, m_iY2;
int m_iScale = 200;
double m_wellTop = 0.0;
double m_dTopDepth = 0.0;
QSharedMemory m_sharedMemory;
PFLOATPROPERTY m_vMD;
PFLOATPROPERTY m_vProperty;
MyDataTypeEnum vVdl;
Slf_WAVE waveinfo;
float m_SDep, m_EDep, m_Rlev;
float m_PlotSdep = 0.0f;
int m_nSamples; //每深度间隔的数据点
int m_PointNum;
QVector <double> valMin, valMax;
double m_TopDepth;
double m_BottomDepth;
QList<QRgb> m_rgbList;
char m_strValue[200];
int CtrlCurve = 0;
int PickFlag = 0;
float m_fTopY = 0.0f;
float m_fDepthLowerY = 0.0f;
float m_fAddY = 29.0f;
int schemIndex = 1;
int colornum = 256;
// 黑白图
bool m_bBlack = false;
public:
//void DrawWave(QPainter* pdc, QRectF mrt1);
public slots:
void s_ResizeDepth(QString strUuid, int nHeight, float fDepthLowerY);
// 黑白图
void s_changeBlack(QString strUuid, bool bBlack);
//滚动条
void vertScrollBarChanged(QString strUuid, double value, double low, double upper);
void vertScrollBarChanged_Print(QString strUuid, int iNum, int iHeightOfScreen);
void vertScrollBarChanged_setGeometry(QString strUuid, double value, double low, double upper, int ndepth);
};
#endif // FormImage_H

33
logPlus/formimage.ui Normal file
View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FormImage</class>
<widget class="QWidget" name="FormImage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -12,6 +12,7 @@
#include "qtColorSchemeComboBox.h"
#include "DrawTvd.h"
#include "formwave.h"
#include "formimage.h"
//曲线名称(单个)
FormInfo::FormInfo(QWidget *parent, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QColor lineColor) :
@ -2794,6 +2795,10 @@ bool FormInfo::setInfoProperty(QString strProName, QVariant val, QString strGp)
else if ("配色方案" == strProName)
{
this->m_nSchemeIndex = val.toInt();
if (m_pImage)
{
m_pImage->setSchemIndex(this->m_nSchemeIndex);
}
}
// else if ("背景值" == strProName)
// {
@ -2813,6 +2818,10 @@ bool FormInfo::setInfoProperty(QString strProName, QVariant val, QString strGp)
{
m_pWave->update();
}
if (m_pImage)
{
m_pImage->update();
}
return bDraw;
}

View File

@ -16,6 +16,7 @@ namespace Ui {
class FormInfo;
}
class FormImage;
class FormWave;
class CDrawTvd;
class FormInfo : public QWidget
@ -268,6 +269,7 @@ public:
//斜井三图一表(井斜数据表参数)
CDrawTvd *m_pTvd;
FormWave* m_pWave = NULL;
FormImage* m_pImage = NULL;
// 深度
QColor m_sdRulerColor; // 标尺颜色

View File

@ -12,6 +12,7 @@
</ItemGroup>
<ItemGroup>
<QtMoc Include="formwave.h" />
<QtMoc Include="formimage.h" />
<ClInclude Include="LogmuditemDrawer.h" />
<QtMoc Include="LogmudResultItem.h" />
<QtMoc Include="selectlinedialog.h" />
@ -165,6 +166,7 @@
<ClCompile Include="FormBase.cpp" />
<ClCompile Include="formdraw.cpp" />
<ClCompile Include="formhead.cpp" />
<ClCompile Include="formimage.cpp" />
<ClCompile Include="forminfo.cpp" />
<ClCompile Include="formline.cpp" />
<ClCompile Include="formlogmud.cpp" />
@ -230,6 +232,7 @@
<ItemGroup>
<QtUic Include="formdraw.ui" />
<QtUic Include="formhead.ui" />
<QtUic Include="formimage.ui" />
<QtUic Include="forminfo.ui" />
<QtUic Include="formline.ui" />
<QtUic Include="formlogmud.ui" />

View File

@ -322,6 +322,9 @@
<QtMoc Include="formwave.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="formimage.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup>
<ItemGroup>
<ClCompile Include="backgrounddelegate.cpp">
@ -675,6 +678,9 @@
<ClCompile Include="formwave.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="formimage.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<QtRcc Include="logplus.qrc">
@ -751,5 +757,8 @@
<QtUic Include="formwave.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="formimage.ui">
<Filter>Form Files</Filter>
</QtUic>
</ItemGroup>
</Project>