306 lines
7.8 KiB
C++
306 lines
7.8 KiB
C++
#include "FormLogmud.h"
|
||
#include "ui_FormLogmud.h"
|
||
#include <QPainter>
|
||
#include "CallManage.h"
|
||
#include "MemRdWt.h"
|
||
|
||
FormLogmud::FormLogmud(QWidget *parent, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName) :
|
||
QWidget(parent),
|
||
ui(new Ui::FormLogmud)
|
||
{
|
||
ui->setupUi(this);
|
||
|
||
m_strSlfName = strSlfName;
|
||
m_strWellName = strWellName;
|
||
m_strTrackName = strTrackName;
|
||
m_strLineName = strLineName;
|
||
|
||
m_pLogMud = new LogmudItemDrawer();
|
||
|
||
LoadFromSLF_LogMud();
|
||
|
||
|
||
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)));
|
||
|
||
}
|
||
|
||
void FormLogmud::DrawTvd()
|
||
{
|
||
// //
|
||
// QPainter painter(this);
|
||
// QRect rect = this->rect();
|
||
// //背景透明
|
||
// painter.fillRect(rect.left(), rect.top(), rect.width(), rect.height(), QColor(0, 0, 0, 0)); //QColor(67, 67, 67, 100)
|
||
|
||
// CDrawTvd *drawTvd = new CDrawTvd();
|
||
// drawTvd->sFilePath = m_strSlfName;
|
||
// drawTvd->DrawTvd(&painter, rect);
|
||
}
|
||
|
||
FormLogmud::~FormLogmud()
|
||
{
|
||
delete ui;
|
||
}
|
||
|
||
bool FormLogmud::LoadFromSLF_LogMud()
|
||
{
|
||
this->m_childrenItems.clear();
|
||
|
||
CMemRdWt *logio = new CMemRdWt();
|
||
if (!logio->Open(m_strSlfName.toStdString().c_str(), CSlfIO::modeRead))
|
||
{
|
||
delete logio;
|
||
return false;
|
||
}
|
||
|
||
int iIndex = logio->OpenTable(m_strLineName.toStdString().c_str());
|
||
if (iIndex < 0)
|
||
return false;
|
||
|
||
int count1 = logio->GetTableRecordCount(iIndex);
|
||
int len = logio->GetTableRecordLength(iIndex);
|
||
if (m_LogMun)
|
||
delete m_LogMun;
|
||
m_LogMun = new struct logmud_stru[count1];
|
||
for (int i = 0; i < count1; i++)
|
||
{
|
||
logio->ReadTable(iIndex, i + 1, &m_LogMun[i]);
|
||
}
|
||
iIndex = logio->OpenTable("LOGMUD_DATA");
|
||
if (iIndex > -1) {
|
||
int count = logio->GetTableRecordCount(iIndex);
|
||
int len = logio->GetTableRecordLength(iIndex);
|
||
logio->IsChange = true;
|
||
logmud_result_stru pLogmud;
|
||
int n = 0;
|
||
for (int i = 0; i < count; i++)
|
||
{
|
||
logio->ReadTable(iIndex, i + 1, &pLogmud);
|
||
double top = pLogmud.depth;
|
||
double bottom = pLogmud.depth;
|
||
LogmudResultItem* pResult = AddItem(top, bottom);
|
||
if (pResult) {
|
||
pResult->Order = i;
|
||
pResult->depth = pLogmud.dep;
|
||
pResult->Number = pLogmud.depth;
|
||
pResult->type = pLogmud.type;
|
||
// pResult->BH=valy;
|
||
// pResult->WH=valx;
|
||
bool matchedLogmud = false;
|
||
for (int j = 0; j < count1; j++) {
|
||
if (qAbs(m_LogMun[j].DEPTH - pResult->depth) < 1e-4f)
|
||
{
|
||
pResult->CoreValues = m_LogMun[j];
|
||
matchedLogmud = true;
|
||
break;
|
||
}
|
||
}
|
||
// 对数图版(type=2)的WH/BH不落盘,加载时重算并进行安全截断,避免极值导致绘制卡死。
|
||
if (matchedLogmud&&qAbs(pResult->type - 2.0f) < 0.5f)
|
||
{
|
||
float safeC1 = qAbs(pResult->CoreValues.C1);
|
||
if (!IsFiniteNumber(safeC1) || safeC1 < 1e-6f) safeC1 = 1e-6f;
|
||
float valx = (pResult->CoreValues.C2 / safeC1)*1000.0f;
|
||
float valy = (pResult->CoreValues.C3 / safeC1)*1000.0f;
|
||
if (!IsFiniteNumber(valx) || valx <= 0.0f) valx = 1.0f;
|
||
if (!IsFiniteNumber(valy) || valy <= 0.0f) valy = 1.0f;
|
||
if (valx > 1000000.0f) valx = 1000000.0f;
|
||
if (valy > 1000000.0f) valy = 1000000.0f;
|
||
pResult->WH = valx;
|
||
pResult->BH = valy;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
delete logio;
|
||
return true;
|
||
}
|
||
|
||
LogmudResultItem* FormLogmud::AddItem(double topDepth, double bottomDepth)
|
||
{
|
||
int insertPos = GetInsertIndex(topDepth, bottomDepth);
|
||
if (insertPos != -1)
|
||
{
|
||
return this->AddItem(topDepth, bottomDepth, insertPos);
|
||
}
|
||
else
|
||
{
|
||
//OutputErrorInfo();
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
LogmudResultItem *FormLogmud::AddItem(double topDepth, double bottomDepth, int insertPos)
|
||
{
|
||
if (topDepth == -9999 || bottomDepth == -9999.0) return NULL;
|
||
|
||
LogmudResultItem* newItem = new LogmudResultItem();
|
||
if (newItem != NULL)
|
||
{
|
||
newItem->SetTopDepth(topDepth);
|
||
newItem->SetBottomDepth(bottomDepth);
|
||
m_childrenItems.insert(insertPos, newItem);
|
||
return newItem;
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
int FormLogmud::GetInsertIndex(double topDepth, double bottomDepth) const
|
||
{
|
||
LogmudResultItem curItem(topDepth, bottomDepth);
|
||
int topIndex = 0;
|
||
int bottomIndex = m_childrenItems.size();
|
||
if (bottomIndex == 0)
|
||
{
|
||
return 0;
|
||
}
|
||
int mid = (bottomIndex + topIndex) / 2;
|
||
|
||
while (topIndex <= bottomIndex && mid < m_childrenItems.size())
|
||
{
|
||
if (m_childrenItems[mid]->Contains(topDepth)) {
|
||
return -1;
|
||
}
|
||
if (m_childrenItems[mid]->Contains(bottomDepth))
|
||
{
|
||
return -1;
|
||
}
|
||
if (*m_childrenItems[mid] < curItem)
|
||
{
|
||
topIndex = mid + 1;
|
||
}
|
||
else if (*m_childrenItems[mid] > curItem)
|
||
{
|
||
bottomIndex = mid - 1;
|
||
}
|
||
else
|
||
{
|
||
if (*m_childrenItems[mid] == curItem)
|
||
{
|
||
return -1;
|
||
}
|
||
//相交了,非法输入
|
||
if ((bottomDepth - topDepth) / 2 + topDepth > (*m_childrenItems[mid]).GetTopDepth() &&
|
||
(bottomDepth - topDepth) / 2 + topDepth < (*m_childrenItems[mid]).GetBottomDepth())
|
||
return -1;
|
||
else return mid + 1;
|
||
}
|
||
mid = (bottomIndex + topIndex) / 2;
|
||
}
|
||
if (mid < m_childrenItems.size() && *m_childrenItems[mid] < curItem)
|
||
{
|
||
return mid + 1;//目前算法有漏洞,临时修改一下
|
||
}
|
||
return mid;
|
||
}
|
||
|
||
void FormLogmud::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)
|
||
|
||
for (int i = 0; i < m_childrenItems.size(); i++)
|
||
{
|
||
LogmudResultItem* pItem = m_childrenItems.at(i);
|
||
if (pItem->type == 1)
|
||
{
|
||
float top = pItem->GetTopDepth();
|
||
float bottom = pItem->GetBottomDepth();
|
||
|
||
if (bottom < m_dTopDepth - 1) continue;
|
||
|
||
double ddep = m_wellTop - m_dTopDepth;
|
||
QRectF itemBoundingRect(0, top + ddep/*+Rlev*/, rect.width(), bottom - top);
|
||
|
||
m_pLogMud->DrawItem(&painter, pItem, itemBoundingRect, false);
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
void FormLogmud::s_ChangeTvdProperty(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName,
|
||
QString strGroup, QString strProperty, QVariant variant)
|
||
{
|
||
if(m_strUuid != strUuid ||
|
||
m_strSlfName != strSlfName ||
|
||
m_strWellName != strWellName ||
|
||
m_strTrackName != strTrackName ||
|
||
m_strLineName != strLineName)
|
||
{
|
||
return;
|
||
}
|
||
if("通常" == strGroup)
|
||
{
|
||
|
||
}
|
||
if("绘制图形对象" == strGroup)
|
||
{
|
||
|
||
}
|
||
if("边框线型" == strGroup)
|
||
{
|
||
if ("线宽" == strProperty)
|
||
;
|
||
else if ("颜色" == strProperty)
|
||
;
|
||
}
|
||
|
||
update();
|
||
}
|
||
|
||
//自定义滚动条
|
||
void FormLogmud::vertScrollBarChanged(QString strUuid, double value, double low, double upper)
|
||
{
|
||
if(m_strUuid==strUuid)
|
||
{
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
m_dTopDepth = value;
|
||
//上移或下移
|
||
QRect geoRect = geometry();
|
||
//
|
||
double dDelta = value - upper;
|
||
double dPercent = dDelta / (low-upper);
|
||
|
||
setGeometry(0, -(dPercent*geoRect.height()), geoRect.width(), geoRect.height());
|
||
}
|
||
|
||
//打印
|
||
void FormLogmud::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 FormLogmud::wheelEvent(QWheelEvent *event) // 滚轮事件
|
||
{
|
||
emit CallManage::getInstance()->sig_mouseWheel(event);
|
||
}
|