logplus/logPlus/mainwindowcurve.cpp

4414 lines
144 KiB
C++
Raw Normal View History

2025-10-29 17:23:30 +08:00
#include "mainwindowcurve.h"
#include "ui_mainwindowcurve.h"
#include <QFile>
#include <QTextStream>
#include "CallManage.h"
#include <QAbstractItemView>
2025-10-30 11:55:37 +08:00
#include "qtcommonclass.h"
#include <QFuture>
#include <QtConcurrent/QtConcurrent>
#include "newheaddialog.h"
//#include "qmytablewidget.h"
#include "PropertyWidget.h"
2026-01-16 17:18:41 +08:00
#include "LogModuleParamers.h"
#include "LogModuleConsole.h"
#include "DepPairs.h"
2025-10-29 17:23:30 +08:00
extern int g_iOneWidth; //道宽
extern QString g_prjname;
//
2026-01-23 18:20:18 +08:00
//extern int m_iY1;
//extern int m_iY2;
2025-10-29 17:23:30 +08:00
extern double g_dPixelPerCm;//每厘米像素数
extern int g_iShow; //显示刻度
2025-10-29 17:23:30 +08:00
//图头
//extern int g_iRows;
//extern int g_iCols;
//extern int g_iColsWidth;
//extern int g_iRowsHight;
2025-10-29 17:23:30 +08:00
MainWindowCurve::MainWindowCurve(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindowCurve)
{
ui->setupUi(this);
2025-10-30 11:55:37 +08:00
QtCommonClass *qtCommon = new QtCommonClass(this);
m_strUuid = qtCommon->getUUid();
2025-10-29 17:23:30 +08:00
// 设置工具栏的位置,此处设置为在左侧
addToolBar(Qt::LeftToolBarArea, ui->toolBar);
addToolBar(Qt::RightToolBarArea, ui->toolBar_2);
2026-01-30 09:47:13 +08:00
addToolBar(Qt::RightToolBarArea, ui->toolBar_3);
2025-10-29 17:23:30 +08:00
//初始化工具栏
initMainToolBar();
initToolBar();
//校深
initToolBar_2();
ui->toolBar_2->hide();
2026-01-30 09:47:13 +08:00
//拼接
initToolBar_3();
ui->toolBar_3->hide();
2025-10-29 17:23:30 +08:00
//加载样式
loadStyle(":/qrc/qss/flatgray.css");
//-------------------------------------
2025-10-29 17:23:30 +08:00
//ui->tableWidget_2->setFrameShape(QFrame::NoFrame); //设置无边框
//隐藏网格线
ui->tableWidget_2->setShowGrid(false);
//设置样式表,只显示竖直边框
ui->tableWidget_2->setStyleSheet( "QTableView::item {border-left: 1px solid black;} \
QTableView::item:selected {border-left: 1px solid black; color:#57595B; background:#E4E4E4;}\
2025-10-29 17:23:30 +08:00
QTableView::item {border-right: 1px solid black;} \
QTableView::item:selected {border-right: 1px solid black;}");
ui->tableWidget_2->verticalHeader()->hide(); //行
//ui->tableWidget_2->horizontalHeader()->hide();//列
int rowcount = 2; //总行数
ui->tableWidget_2->setRowCount(rowcount); //动态设置行数
//ui->tableWidget_2->verticalHeader()->setFixedWidth(3);//标题栏宽度
2025-10-29 17:23:30 +08:00
ui->tableWidget_2->horizontalHeader()->setFixedHeight(3);//标题栏高度
//我们让一列也可以滑动
ui->tableWidget_2->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
ui->tableWidget_2->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
2025-11-10 15:51:41 +08:00
connect(ui->tableWidget_2, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(onItemClicked(QTableWidgetItem*)));
// 设置右键菜单策略
ui->tableWidget_2->setContextMenuPolicy(Qt::CustomContextMenu);
// 连接信号和槽
connect(ui->tableWidget_2, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
2025-10-29 17:23:30 +08:00
connect(this, SIGNAL(sig_NewTrackChangeWidth(QString, int)), this, SLOT(s_NewTrackChangeWidth(QString, int)));
//connect(this, SIGNAL(sig_NewWell(QString, QString)), this, SLOT(s_NewWell(QString, QString)));
2025-10-29 17:23:30 +08:00
connect(CallManage::getInstance(), SIGNAL(sig_mouseWheel(QWheelEvent*)), this, SLOT(s_mouseWheel(QWheelEvent*)));
2026-01-23 18:20:18 +08:00
connect(CallManage::getInstance(), SIGNAL(sig_changeScale(QString, int)), this, SLOT(s_changeScale(QString, int)));
connect(CallManage::getInstance(), SIGNAL(sig_changeDepth(QString, QString, QString, int, int)), this, SLOT(s_changeDepth(QString, QString, QString, int, int)));
2026-01-23 14:53:34 +08:00
connect(CallManage::getInstance(), SIGNAL(sig_changeWidth(QString, QString, QString, QString, int, int)), this, SLOT(s_changeWidth(QString, QString, QString, QString, int, int)));
connect(CallManage::getInstance(), SIGNAL(sig_changeTrackProperty(QVariantList)), this, SLOT(s_changeTrackProperty(QVariantList)));
//曲线选中,置顶
connect(CallManage::getInstance(), SIGNAL(sig_Raise(QString, QString, QString, QString, QString, int, QString)), this, SLOT(s_Raise(QString, QString, QString, QString, QString, int, QString)));
//右键--添加分段线
connect(CallManage::getInstance(), SIGNAL(sig_AddShiftLine(QString, double, double)), this, SLOT(s_AddShiftLine(QString, double, double)));
//右键--清除当前分段线
connect(CallManage::getInstance(), SIGNAL(sig_DelSelectShiftLine(QString)), this, SLOT(s_DelSelectShiftLine(QString)));
//右键--清除全部分段线
connect(CallManage::getInstance(), SIGNAL(sig_DelAllShiftLine(QString)), this, SLOT(s_DelAllShiftLine(QString)));
//执行校正
connect(CallManage::getInstance(), SIGNAL(sig_Runcor_List(QString, QList<double>, QList<double>)), this, SLOT(s_Runcor_List(QString, QList<double>, QList<double>)));
2026-01-30 09:47:13 +08:00
//执行拼接
connect(CallManage::getInstance(), SIGNAL(sig_Merge_List(QString, QList<double>, QList<double>)), this, SLOT(s_Merge_List(QString, QList<double>, QList<double>)));
2026-02-03 14:40:58 +08:00
//执行预览
connect(CallManage::getInstance(), SIGNAL(sig_PreMerge_List(QString, QString, QString, QString, QString, QList<double>, QList<double>)), this, SLOT(s_PreMerge_List(QString, QString, QString, QString, QString, QList<double>, QList<double>)));
//执行压缩/拉伸
connect(CallManage::getInstance(), SIGNAL(sig_EShiftDepth(QString, QString, int, QList<double>, QList<double>)), this, SLOT(s_EShiftDepth(QString, QString, int, QList<double>, QList<double>)));
//图头----------
m_dock1=new QDockWidget(tr(""),this);
m_dock1->setFeatures(QDockWidget::NoDockWidgetFeatures);//QDockWidget::DockWidgetMovable
//dock1->setAllowedAreas(Qt::TopDockWidgetArea);
//
m_formMultiHeads = new FormMultiHeads(this);
m_formMultiHeads->m_strHeadOrTail = "Head";
m_dock1->setWidget(m_formMultiHeads);
addDockWidget(Qt::TopDockWidgetArea,m_dock1);
//移除标题栏
QWidget* lTitleBar = m_dock1->titleBarWidget();
QWidget* lEmptyWidget = new QWidget();
m_dock1->setTitleBarWidget(lEmptyWidget);
delete lTitleBar;
//隐藏
m_dock1->hide();
//成果表----------
m_dock2=new QDockWidget(tr(""),this);
m_dock2->setFeatures(QDockWidget::NoDockWidgetFeatures);//QDockWidget::DockWidgetMovable
//
m_formMultiTails = new FormMultiHeads(this);
m_formMultiTails->m_strHeadOrTail = "Tail";
m_dock2->setWidget(m_formMultiTails);
addDockWidget(Qt::BottomDockWidgetArea,m_dock2);
//移除标题栏
QWidget* lTitleBar_Tails = m_dock2->titleBarWidget();
QWidget* lEmptyWidget_Tails = new QWidget();
m_dock2->setTitleBarWidget(lEmptyWidget_Tails);
delete lTitleBar_Tails;
//隐藏
m_dock2->hide();
//属性编辑器
// m_propertyWidget = PropertyService();
// m_propertyWidget->setWindowTitle("属性编辑器");
// m_propertyWidget->setParent(this);
// addDockWidget( Qt::TopDockWidgetArea, m_propertyWidget);
2025-10-29 17:23:30 +08:00
}
MainWindowCurve::~MainWindowCurve()
{
delete ui;
}
//鼠标滚动,通知可视解释窗口
void MainWindowCurve::s_mouseWheel(QWheelEvent *event)
{
if (event->angleDelta().y() > 0) {
ui->tableWidget_2->verticalScrollBar()->triggerAction(QAbstractSlider::SliderSingleStepSub); // 向下滚动
} else {
ui->tableWidget_2->verticalScrollBar()->triggerAction(QAbstractSlider::SliderSingleStepAdd); // 向上滚动
}
//verticalScrollBar() horizontalScrollBar()
//event->accept(); // 确保事件被处理
}
2025-10-29 17:23:30 +08:00
//初始化工具栏
void MainWindowCurve::initMainToolBar()
{
QSize toolIconSize(18, 18);
ui->mainToolBar->setIconSize(toolIconSize); //设置工具栏图标大小
QIcon fixwellsectionHeaderIcon(::GetImagePath()+"icon/fixwellsectionHeader.png");
QIcon currtempliteIcon(::GetImagePath()+"icon/currtemplite.png");
QIcon saveastemplateIcon(::GetImagePath()+"icon/saveastemplate.png");
QIcon executeDepthShiftIcon(::GetImagePath()+"icon/ExecuteDepthShift.png");
2026-01-30 09:47:13 +08:00
QIcon joindepthIcon(::GetImagePath()+"icon/joindepth.png");
2026-01-16 17:18:41 +08:00
QIcon ModuleOpenIcon(::GetImagePath()+"icon/ModuleOne.png");
2025-10-29 17:23:30 +08:00
QIcon openFileIcon(":/image/open.png");
QIcon runIcon(":/image/capacity.png");
QIcon debugIcon(":/image/anaysis.png");
QIcon loadIcon(":/image/export.png");
//Main工具栏
QAction* m_fixwellsectionHeaderAc = nullptr; //锁头
QAction* m_currtempliteAc = nullptr; //加载图文件
QAction* m_saveastemplateAc = nullptr; //另存为图文件
QAction* m_executeDepthShiftAc = nullptr; //校深
2026-01-30 09:47:13 +08:00
QAction* m_joindepthAc = nullptr; //拼接
2026-01-16 17:18:41 +08:00
QAction* m_ModuleOpenAc = nullptr; //处理方法
2025-10-30 11:55:37 +08:00
//QAction* m_openAc = nullptr; //打开
// QAction* m_runAc = nullptr;//
// QAction* m_debugAc = nullptr; //
// QAction* m_loadAc = nullptr; //加载
m_fixwellsectionHeaderAc = new QAction(fixwellsectionHeaderIcon, "锁头", this);
m_currtempliteAc = new QAction(currtempliteIcon, "加载图文件", this);
m_saveastemplateAc = new QAction(saveastemplateIcon, "另存为图文件", this);
m_executeDepthShiftAc = new QAction(executeDepthShiftIcon, "校深", this);
2026-01-30 09:47:13 +08:00
m_joindepthAc = new QAction(joindepthIcon, "拼接", this);
2026-01-16 17:18:41 +08:00
m_ModuleOpenAc = new QAction(ModuleOpenIcon, "处理方法", this);
// m_runAc = new QAction(runIcon, "设置井", this);
// m_debugAc = new QAction(debugIcon, "撤销", this);
// m_loadAc = new QAction(loadIcon, "重做", this);
2025-10-30 11:55:37 +08:00
//m_openAc = new QAction(openFileIcon, "打开", this);
2025-10-29 17:23:30 +08:00
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); //此种方式为文字显示在图标右侧
//add QAction to Widget.
ui->mainToolBar->addAction(m_fixwellsectionHeaderAc);
ui->mainToolBar->addAction(m_currtempliteAc);
ui->mainToolBar->addAction(m_saveastemplateAc);
ui->mainToolBar->addAction(m_executeDepthShiftAc);
2026-01-30 09:47:13 +08:00
ui->mainToolBar->addAction(m_joindepthAc);
2026-01-16 17:18:41 +08:00
ui->mainToolBar->addAction(m_ModuleOpenAc);
// ui->mainToolBar->addAction(m_runAc);
// ui->mainToolBar->addAction(m_debugAc);
// ui->mainToolBar->addAction(m_loadAc);
2025-10-30 11:55:37 +08:00
//ui->mainToolBar->addAction(m_openAc);
2025-10-29 17:23:30 +08:00
connect(m_fixwellsectionHeaderAc, &QAction::triggered, this, &MainWindowCurve::s_showHeadTable);
2026-01-23 14:53:34 +08:00
connect(m_currtempliteAc, &QAction::triggered, this, &MainWindowCurve::s_currtemplite);
connect(m_saveastemplateAc, &QAction::triggered, this, &MainWindowCurve::s_Save);
connect(m_executeDepthShiftAc, &QAction::triggered, this, &MainWindowCurve::s_ExecuteDepthShift);
2026-01-30 09:47:13 +08:00
connect(m_joindepthAc, &QAction::triggered, this, &MainWindowCurve::s_ExecuteMerge);
2026-01-16 17:18:41 +08:00
connect(m_ModuleOpenAc, &QAction::triggered, this, &MainWindowCurve::s_ModuleOpen);
2025-10-29 17:23:30 +08:00
// connect(m_grepAc, &QAction::triggered, this, &MainWindow::s_Risize);
// connect(m_compileAc, &QAction::triggered, this, &MainWindow::s_AddOne);
// connect(m_runAc, &QAction::triggered, this, &MainWindow::s_SaveImage);
// connect(m_debugAc, &QAction::triggered, this, &MainWindow::s_DrawImg);
// connect(m_loadAc, &QAction::triggered, this, &MainWindow::s_DrawLine);
//connect(m_openAc, &QAction::triggered, this, &MainWindowCurve::s_Open);
2025-10-29 17:23:30 +08:00
}
//初始化工具栏
void MainWindowCurve::initToolBar()
{
QSize toolIconSize(18, 18);
ui->toolBar->setIconSize(toolIconSize); //设置工具栏图标大小
QIcon blankTrackIcon(::GetImagePath()+"icon/BlankTrack.png");
QIcon depthIcon(::GetImagePath()+"icon/depth.png");
QIcon logsIcon(::GetImagePath()+"icon/logs.png");
QIcon waveIcon(::GetImagePath()+"icon/wave.png");
QIcon OGResultIcon(::GetImagePath()+"icon/OGResult.png");
QIcon gujingIcon(::GetImagePath()+"icon/gujing.png");
QIcon sidecoreIcon(::GetImagePath()+"icon/sidecore.png");
//
QIcon coreIcon(::GetImagePath()+"icon/Core.png");
QIcon mudloggingIcon(::GetImagePath()+"icon/mudlogging.png");
QIcon txtIcon(::GetImagePath()+"icon/txt.png");
QIcon coreimageIcon(::GetImagePath()+"icon/coreimage.png");
QIcon santuyibiaoIcon(::GetImagePath()+"icon/santuyibiao.png");
QIcon crackIcon(::GetImagePath()+"icon/crack.png");
QIcon showdipIcon(::GetImagePath()+"icon/showdip.png");
QIcon pinlvIcon(::GetImagePath()+"icon/pinlv.png");
QIcon ganzhuangtuIcon(::GetImagePath()+"icon/ganzhuangtu.png");
QIcon roseIcon(::GetImagePath()+"icon/rose.png");
QIcon collapseIcon(::GetImagePath()+"icon/collapse.png");
QIcon deviIcon(::GetImagePath()+"icon/devi.png");
QIcon electric_imagingIcon(::GetImagePath()+"icon/electric_imaging.png");
QIcon DCAIcon(::GetImagePath()+"icon/DCA.png");
QIcon GeoSectionIcon(::GetImagePath()+"icon/GeoSection.png");
QIcon jiegutextIcon(::GetImagePath()+"icon/jiegutext.png");
QIcon mcalsIcon(::GetImagePath()+"icon/mcals.png");
QIcon logfaceIcon(::GetImagePath()+"icon/logface.png");
QIcon TubingstringIcon(::GetImagePath()+"icon/Tubingstring.png");
QIcon TDTIcon(::GetImagePath()+"icon/TDT.png");
QIcon LogMudIcon(::GetImagePath()+"icon/LogMud.png");
2025-10-29 17:23:30 +08:00
//工具栏
QAction* m_blankTrackAc = nullptr;
QAction* m_depthAc = nullptr;
QAction* m_logsAc = nullptr;
QAction* m_waveAc = nullptr;
QAction* m_OGResultAc = nullptr;
QAction* m_gujingAc = nullptr;
QAction* m_sidecoreAc = nullptr;
//
QAction* m_coreAc = nullptr;
QAction* m_mudloggingAc = nullptr;
QAction* m_txtAc = nullptr;
QAction* m_coreimageAc = nullptr;
QAction* m_santuyibiaoAc = nullptr;
QAction* m_crackAc = nullptr;
QAction* m_showdipAc = nullptr;
QAction* m_pinlvAc = nullptr;
QAction* m_ganzhuangtuAc = nullptr;
QAction* m_roseAc = nullptr;
QAction* m_collapseAc = nullptr;
QAction* m_deviAc = nullptr;
QAction* m_electric_imagingAc = nullptr;
QAction* m_DCAAc = nullptr;
QAction* m_GeoSectionAc = nullptr;
QAction* m_jiegutextAc = nullptr;
QAction* m_mcalsAc = nullptr;
QAction* m_logfaceAc = nullptr;
QAction* m_TubingstringAc = nullptr;
QAction* m_TDTAc = nullptr;
QAction* m_LogMudAc = nullptr;
m_blankTrackAc = new QAction(blankTrackIcon, "", this);
m_depthAc = new QAction(depthIcon, "", this);
m_logsAc = new QAction(logsIcon, "", this);
m_waveAc = new QAction(waveIcon, "", this);
m_OGResultAc = new QAction(OGResultIcon, "", this);
m_gujingAc = new QAction(gujingIcon, "", this);
m_sidecoreAc = new QAction(sidecoreIcon, "", this);
//
m_coreAc = new QAction(coreIcon, "", this);
m_mudloggingAc = new QAction(mudloggingIcon, "", this);
m_txtAc = new QAction(txtIcon, "", this);
m_coreimageAc = new QAction(coreimageIcon, "", this);
m_santuyibiaoAc = new QAction(santuyibiaoIcon, "", this);
m_crackAc = new QAction(crackIcon, "", this);
m_showdipAc = new QAction(showdipIcon, "", this);
m_pinlvAc = new QAction(pinlvIcon, "", this);
m_ganzhuangtuAc = new QAction(ganzhuangtuIcon, "", this);
m_roseAc = new QAction(roseIcon, "", this);
m_collapseAc = new QAction(collapseIcon, "", this);
m_deviAc = new QAction(deviIcon, "", this);
m_electric_imagingAc = new QAction(electric_imagingIcon, "", this);
m_DCAAc = new QAction(DCAIcon, "", this);
m_GeoSectionAc = new QAction(GeoSectionIcon, "", this);
m_jiegutextAc = new QAction(jiegutextIcon, "", this);
m_mcalsAc = new QAction(mcalsIcon, "", this);
m_logfaceAc = new QAction(logfaceIcon, "", this);
m_TubingstringAc = new QAction(TubingstringIcon, "", this);
m_TDTAc = new QAction(TDTIcon, "", this);
m_LogMudAc = new QAction(LogMudIcon, "", this);
m_blankTrackAc->setToolTip("");
m_depthAc->setToolTip("深度");
m_logsAc->setToolTip("曲线");
m_waveAc->setToolTip("波列");
m_OGResultAc->setToolTip("解释结论道");
m_gujingAc->setToolTip("固井结论道");
m_sidecoreAc->setToolTip("井壁取心");
//
m_coreAc->setToolTip("岩心分析");
m_mudloggingAc->setToolTip("录井剖面");
m_txtAc->setToolTip("岩性描述");
m_coreimageAc->setToolTip("岩心照片");
m_santuyibiaoAc->setToolTip("斜井三图一表");
m_crackAc->setToolTip("裂缝");
m_showdipAc->setToolTip("蝌蚪图");
m_pinlvAc->setToolTip("频率统计图");
m_ganzhuangtuAc->setToolTip("杆状图");
m_roseAc->setToolTip("玫瑰图");
m_collapseAc->setToolTip("井眼垮塌矢量图");
m_deviAc->setToolTip("井斜方位图");
m_electric_imagingAc->setToolTip("图像");
m_DCAAc->setToolTip("裂缝DCA分析");
m_GeoSectionAc->setToolTip("地质层位道");
m_jiegutextAc->setToolTip("气测/管柱/文本/FMT/射孔");
m_mcalsAc->setToolTip("多臂井径");
m_logfaceAc->setToolTip("沉积相");
m_TubingstringAc->setToolTip("套管组件");
m_TDTAc->setToolTip("TDT");
m_LogMudAc->setToolTip("LogMud");
//此种方式为文字显示在图标右侧
ui->toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
2025-10-29 17:23:30 +08:00
//add QAction to Widget.
ui->toolBar->addAction(m_blankTrackAc);
ui->toolBar->addAction(m_depthAc);
ui->toolBar->addAction(m_logsAc);
ui->toolBar->addAction(m_waveAc);
ui->toolBar->addAction(m_OGResultAc);
ui->toolBar->addAction(m_gujingAc);
ui->toolBar->addAction(m_sidecoreAc);
//
ui->toolBar->addAction(m_coreAc);
ui->toolBar->addAction(m_mudloggingAc);
ui->toolBar->addAction(m_txtAc);
ui->toolBar->addAction(m_coreimageAc);
ui->toolBar->addAction(m_santuyibiaoAc);
ui->toolBar->addAction(m_crackAc);
ui->toolBar->addAction(m_showdipAc);
ui->toolBar->addAction(m_pinlvAc);
ui->toolBar->addAction(m_ganzhuangtuAc);
ui->toolBar->addAction(m_roseAc);
ui->toolBar->addAction(m_collapseAc);
ui->toolBar->addAction(m_deviAc);
ui->toolBar->addAction(m_electric_imagingAc);
ui->toolBar->addAction(m_DCAAc);
ui->toolBar->addAction(m_GeoSectionAc);
ui->toolBar->addAction(m_jiegutextAc);
ui->toolBar->addAction(m_mcalsAc);
ui->toolBar->addAction(m_logfaceAc);
ui->toolBar->addAction(m_TubingstringAc);
ui->toolBar->addAction(m_TDTAc);
ui->toolBar->addAction(m_LogMudAc);
2025-10-29 17:23:30 +08:00
2025-12-30 17:38:11 +08:00
connect(m_blankTrackAc, &QAction::triggered, this, &MainWindowCurve::s_NewTrack);
connect(m_depthAc, &QAction::triggered, this, &MainWindowCurve::s_NewDepth);//深度
connect(m_logsAc, &QAction::triggered, this, &MainWindowCurve::s_NewLogs);//曲线
connect(m_waveAc, &QAction::triggered, this, &MainWindowCurve::s_NewWave);//波列
connect(m_OGResultAc, &QAction::triggered, this, &MainWindowCurve::s_NewOGResult);//解释结论道
connect(m_gujingAc, &QAction::triggered, this, &MainWindowCurve::s_NewGujing);//固井结论道
connect(m_sidecoreAc, &QAction::triggered, this, &MainWindowCurve::s_NewSideCore);//井壁取心
connect(m_coreAc, &QAction::triggered, this, &MainWindowCurve::s_NewCore);//岩心分析
connect(m_mudloggingAc, &QAction::triggered, this, &MainWindowCurve::s_NewMudlogging);//录井剖面
connect(m_txtAc, &QAction::triggered, this, &MainWindowCurve::s_NewTxt);//岩性描述
connect(m_coreimageAc, &QAction::triggered, this, &MainWindowCurve::s_NewCoreImage);//岩心照片
connect(m_santuyibiaoAc, &QAction::triggered, this, &MainWindowCurve::s_NewSantuyibiao);//斜井三图一表
2026-01-04 16:54:55 +08:00
connect(m_crackAc, &QAction::triggered, this, &MainWindowCurve::s_NewCrack);//裂缝
2025-12-30 17:38:11 +08:00
connect(m_showdipAc, &QAction::triggered, this, &MainWindowCurve::s_NewShowDip);//蝌蚪图
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);//玫瑰图
2026-01-17 22:35:34 +08:00
connect(m_DCAAc, &QAction::triggered, this, &MainWindowCurve::s_dcaAc);
2025-12-30 17:38:11 +08:00
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);//图像
connect(m_GeoSectionAc, &QAction::triggered, this, &MainWindowCurve::s_NewGeoSection);//地质层位道
connect(m_jiegutextAc, &QAction::triggered, this, &MainWindowCurve::s_NewJiegutext);//气测/FMT/射孔/文本
connect(m_mcalsAc, &QAction::triggered, this, &MainWindowCurve::s_NewMCals);//多臂井径
2026-01-06 16:03:55 +08:00
connect(m_logfaceAc, &QAction::triggered, this, &MainWindowCurve::s_NewLogface);//沉积相
connect(m_TubingstringAc, &QAction::triggered, this, &MainWindowCurve::s_NewTubingstring);//套管组件
connect(m_TDTAc, &QAction::triggered, this, &MainWindowCurve::s_NewTDT);//TDT
2026-01-06 16:03:55 +08:00
2025-10-29 17:23:30 +08:00
}
//初始化工具栏
void MainWindowCurve::initToolBar_2()
{
QSize toolIconSize(26, 26);
ui->toolBar_2->setIconSize(toolIconSize); //设置工具栏图标大小
QIcon ShiftIcon(::GetImagePath()+"icon/Shift.png");
QIcon MoveShiftIcon(::GetImagePath()+"icon/MoveShift.png");
QIcon DepthShiftIcon(::GetImagePath()+"icon/DepthShift.png");
QIcon StandardIcon(::GetImagePath()+"icon/Standard.png");
QIcon CorrectionIcon(::GetImagePath()+"icon/Correction.png");
QIcon ShiftotherIcon(::GetImagePath()+"icon/Shiftother.png");
QIcon autocorIcon(::GetImagePath()+"icon/autocor.png");
QIcon runcorIcon(::GetImagePath()+"icon/runcor.png");
QIcon ClearAllSetCurveIcon(::GetImagePath()+"icon/ClearAllSetCurve.png");
QIcon ClearSetCurveIcon(::GetImagePath()+"icon/ClearSetCurve.png");
//工具栏
QAction* m_ShiftAc = nullptr;
QAction* m_MoveShiftAc = nullptr;
QAction* m_DepthShiftAc = nullptr;
QAction* m_StandardAc = nullptr;
QAction* m_CorrectionAc = nullptr;
QAction* m_ShiftotherAc = nullptr;
QAction* m_autocorAc = nullptr;
QAction* m_runcorAc = nullptr;
QAction* m_ClearAllSetCurveAc = nullptr;
QAction* m_ClearSetCurveAc = nullptr;
m_ShiftAc = new QAction(ShiftIcon, "", this);
m_MoveShiftAc = new QAction(MoveShiftIcon, "", this);
m_DepthShiftAc = new QAction(DepthShiftIcon, "", this);
m_StandardAc = new QAction(StandardIcon, "", this);
m_CorrectionAc = new QAction(CorrectionIcon, "", this);
m_ShiftotherAc = new QAction(ShiftotherIcon, "", this);
m_autocorAc = new QAction(autocorIcon, "", this);
m_runcorAc = new QAction(runcorIcon, "", this);
m_ClearAllSetCurveAc = new QAction(ClearAllSetCurveIcon, "", this);
m_ClearSetCurveAc = new QAction(ClearSetCurveIcon, "", this);
m_ShiftAc->setToolTip("整体深度平移校正");
m_MoveShiftAc->setToolTip("深度分段平移校正");
m_DepthShiftAc->setToolTip("参数卡深度平移校正");
m_StandardAc->setToolTip("设置/取消标准曲线");
m_CorrectionAc->setToolTip("设置/取消校正曲线");
m_ShiftotherAc->setToolTip("批量设置从校正曲线");
m_autocorAc->setToolTip("自动对比");
m_runcorAc->setToolTip("执行校正");
m_ClearAllSetCurveAc->setToolTip("清除全部曲线设置");
m_ClearSetCurveAc->setToolTip("清除全部从曲线设置");
//此种方式为文字显示在图标右侧
ui->toolBar_2->setToolButtonStyle(Qt::ToolButtonIconOnly);
//add QAction to Widget.
ui->toolBar_2->addAction(m_ShiftAc);
ui->toolBar_2->addAction(m_MoveShiftAc);
2026-01-30 09:47:13 +08:00
//ui->toolBar_2->addAction(m_DepthShiftAc);
ui->toolBar_2->addSeparator();
ui->toolBar_2->addAction(m_StandardAc);
ui->toolBar_2->addAction(m_CorrectionAc);
2026-01-30 09:47:13 +08:00
//ui->toolBar_2->addAction(m_ShiftotherAc);
ui->toolBar_2->addSeparator();
ui->toolBar_2->addAction(m_autocorAc);
ui->toolBar_2->addAction(m_runcorAc);
ui->toolBar_2->addSeparator();
ui->toolBar_2->addAction(m_ClearAllSetCurveAc);
ui->toolBar_2->addAction(m_ClearSetCurveAc);
connect(m_ShiftAc, &QAction::triggered, this, &MainWindowCurve::s_Shift);
connect(m_MoveShiftAc, &QAction::triggered, this, &MainWindowCurve::s_MoveShift);
// connect(m_DepthShiftAc, &QAction::triggered, this, &MainWindowCurve::s_DepthShift);
connect(m_StandardAc, &QAction::triggered, this, &MainWindowCurve::s_Standard);
connect(m_CorrectionAc, &QAction::triggered, this, &MainWindowCurve::s_Correction);
// connect(m_ShiftotherAc, &QAction::triggered, this, &MainWindowCurve::s_Shiftother);
connect(m_autocorAc, &QAction::triggered, this, &MainWindowCurve::s_autocor);
connect(m_runcorAc, &QAction::triggered, this, &MainWindowCurve::s_runcor);
connect(m_ClearAllSetCurveAc, &QAction::triggered, this, &MainWindowCurve::s_ClearAllSetCurve);
connect(m_ClearSetCurveAc, &QAction::triggered, this, &MainWindowCurve::s_ClearSetCurve);
2026-01-30 09:47:13 +08:00
}
//初始化工具栏
void MainWindowCurve::initToolBar_3()
{
QSize toolIconSize(26, 26);
ui->toolBar_3->setIconSize(toolIconSize); //设置工具栏图标大小
QIcon StandardIcon(::GetImagePath()+"icon/Standard.png");
QIcon CorrectionIcon(::GetImagePath()+"icon/Correction.png");
QIcon ShiftotherIcon(::GetImagePath()+"icon/Shiftother.png");
QIcon PreMegIcon(::GetImagePath()+"icon/PreMeg.png");
QIcon mergeIcon(::GetImagePath()+"icon/merge.png");
QIcon ClearAllSetCurveIcon(::GetImagePath()+"icon/ClearAllSetCurve.png");
QIcon ClearSetCurveIcon(::GetImagePath()+"icon/ClearSetCurve.png");
//工具栏
QAction* m_StandardAc = nullptr;
QAction* m_CorrectionAc = nullptr;
QAction* m_ShiftotherAc = nullptr;
QAction* m_PreMegAc = nullptr;
QAction* m_mergeAc = nullptr;
QAction* m_ClearAllSetCurveAc = nullptr;
QAction* m_ClearSetCurveAc = nullptr;
2026-01-30 09:47:13 +08:00
m_StandardAc = new QAction(StandardIcon, "", this);
m_CorrectionAc = new QAction(CorrectionIcon, "", this);
m_ShiftotherAc = new QAction(ShiftotherIcon, "", this);
m_PreMegAc = new QAction(PreMegIcon, "", this);
m_mergeAc = new QAction(mergeIcon, "", this);
m_ClearAllSetCurveAc = new QAction(ClearAllSetCurveIcon, "", this);
m_ClearSetCurveAc = new QAction(ClearSetCurveIcon, "", this);
m_StandardAc->setToolTip("设置/取消目标拼接曲线");
m_CorrectionAc->setToolTip("设置/取消源拼接曲线");
m_ShiftotherAc->setToolTip("批量设置从拼接曲线");
m_PreMegAc->setToolTip("拼接效果预览");
m_mergeAc->setToolTip("执行拼接");
m_ClearAllSetCurveAc->setToolTip("清除全部曲线设置");
m_ClearSetCurveAc->setToolTip("清除全部从曲线设置");
//此种方式为文字显示在图标右侧
ui->toolBar_3->setToolButtonStyle(Qt::ToolButtonIconOnly);
//add QAction to Widget.
ui->toolBar_3->addAction(m_StandardAc);
ui->toolBar_3->addAction(m_CorrectionAc);
//ui->toolBar_3->addAction(m_ShiftotherAc);
ui->toolBar_3->addSeparator();
2026-02-03 14:40:58 +08:00
ui->toolBar_3->addAction(m_PreMegAc);
2026-01-30 09:47:13 +08:00
ui->toolBar_3->addAction(m_mergeAc);
ui->toolBar_3->addSeparator();
ui->toolBar_3->addAction(m_ClearAllSetCurveAc);
ui->toolBar_3->addAction(m_ClearSetCurveAc);
connect(m_StandardAc, &QAction::triggered, this, &MainWindowCurve::s_Standard);
connect(m_CorrectionAc, &QAction::triggered, this, &MainWindowCurve::s_Correction);
//// connect(m_ShiftotherAc, &QAction::triggered, this, &MainWindowCurve::s_Shiftother);
2026-02-03 14:40:58 +08:00
connect(m_PreMegAc, &QAction::triggered, this, &MainWindowCurve::s_PreMegAc);
2026-01-30 09:47:13 +08:00
connect(m_mergeAc, &QAction::triggered, this, &MainWindowCurve::s_merge);
connect(m_ClearAllSetCurveAc, &QAction::triggered, this, &MainWindowCurve::s_ClearAllSetCurve);
connect(m_ClearSetCurveAc, &QAction::triggered, this, &MainWindowCurve::s_ClearSetCurve);
}
QStringList MainWindowCurve::getLineList(QString strWellName, QString strTrackName)
{
// 创建根对象
QStringList listLine;
//
int columnCount = ui->tableWidget_2->columnCount();//总列数
for(int i=0; i<columnCount; i++)
{
if(i%2==0)
{
}
else
{
//空白列
continue;
}
if( ui->tableWidget_2->cellWidget(1, i) != nullptr )
{
auto myWidget = ui->tableWidget_2->cellWidget(1, i);
//
FormWell *widgetWell = (FormWell*)myWidget;//获得widget
if(widgetWell)
{
QStringList listTemp = widgetWell->getLineList(strWellName, strTrackName);
if(listTemp.size()>0)
{
listLine.append(listTemp);
}
}
}
}
return listLine;
}
void MainWindowCurve::ApplyShiftDepth(QString strSlfName, QString strLineName, double DepthOffset)
{
//1.修改内存数据
if(strSlfName=="") return ;
CMemRdWt * logio=new CMemRdWt();
if(!logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return ;
};
bool isok=0;
//TODO 目前对于表格类,参数卡类不支持,会崩溃
int curveindex=logio->FindObjectName((char *)strLineName.toStdString().c_str());
if(curveindex>=0) {
CString szBuffer="";
szBuffer=QString::number(DepthOffset,'f',3)+"\r\n";
WriteShiftMessage(*logio,szBuffer,strLineName);
logio->CorrectObjectDepth(curveindex, DepthOffset);
isok=1;
}
delete logio;
//Plot重新加载数据
emit CallManage::getInstance()->sig_ReloadPlot(m_strUuid, strSlfName, strLineName);
}
void MainWindowCurve::s_Shift()
{
if(m_SelectTableItem.m_iTableType==0) {
QMessageBox::warning(this, "提示", "请选择要校正的对象!");
return;
}
if(m_SelectTableItem.m_iTableType==1) {
QMessageBox::warning(this, "提示", "该功能不支持对井次校正,如果需要井次校正请到数据树上进行!");
return;
}
if(m_SelectTableItem.m_iTableType==2 || m_SelectTableItem.m_iTableType==3)
{
//道,曲线
bool ok=0;
double depthshift=QInputDialog::getDouble(NULL,"深度移动","请输入移动的深度量(上移-,下移+)",0.0,-2147483647, 2147483647,4,&ok);
if(!ok) return;
if(depthshift==0) return;
if(depthshift>10)
{
int flag = QMessageBox::warning(this->parentWidget(),"提示",QString("深度移动量 =")+QString::number(depthshift)+"m\n"+"\n您确定执行校正?",
QMessageBox::Yes,QMessageBox::No);
if(flag==QMessageBox::No)
{
return;
}
}
if(m_SelectTableItem.m_iTableType==2)
{
//道
QStringList listLine = getLineList(m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName);
if(listLine.size()>0)
{
for(int i=0; i<listLine.size(); i++)
{
//单条曲线校深
ApplyShiftDepth(m_SelectTableItem.m_strSlfName, listLine[i], depthshift);
}
}
else
{
QMessageBox::warning(this, "提示", "道内曲线对象为空,无对象可校正!");
return;
}
}
else if(m_SelectTableItem.m_iTableType==3)
{
//单条曲线校深
ApplyShiftDepth(m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strLineName, depthshift);
}
}
}
void MainWindowCurve::MoveShift(QString strSlfName, QString strLineName, float sdep,float edep,float delta)
{
if(sdep>=edep&&delta==0) return;
if(strSlfName=="") return;
CMemRdWt * logio=new CMemRdWt();
if(!logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return;
}
int curveindex=logio->FindObjectName((char*)strLineName.toStdString().c_str());
if(curveindex<0)
{
delete logio;
return;
}
CString szBuffer="";
if(sdep==edep&&sdep==-9999.0) {
szBuffer=QString::number(delta,'f',3)+"\r\n";
WriteShiftMessage(*logio,szBuffer,strLineName);
logio->CorrectObjectDepth(curveindex,delta);
delete logio;
//Plot重新加载数据
emit CallManage::getInstance()->sig_ReloadPlot(m_strUuid, strSlfName, strLineName);
return;
}
curveindex=logio->OpenChannel(strLineName.toStdString().c_str());
if(curveindex>-1) {
szBuffer.Format("%10.3f %10.3f %10.3f\r\n",sdep,edep,delta);
WriteShiftMessage(*logio,szBuffer,strLineName);
logio->MoveDepth(curveindex,sdep,edep,delta);
}
else {
int ObjectType=logio->GetObjectType(strLineName.toStdString().c_str());
float sdeps[2],edeps[2];
sdeps[0]=sdep;
edeps[0]=sdep+delta;
sdeps[1]=edep;
edeps[1]=edep+delta;
szBuffer.Format("%10.3f %10.3f\r\n%10.3f %10.3f\r\n",sdeps[0],edeps[0],sdeps[1],edeps[1]);
WriteShiftMessage(*logio,szBuffer,strLineName);
if(ObjectType >CARD_OBJECT||ObjectType==0)
{
int index=logio->OpenTable(strLineName.toStdString().c_str());
if(index>-1)
{
logio->EShiftTableDepth((char*)strLineName.toStdString().c_str(),2,sdeps,edeps);
}
}
else if(ObjectType==CARD_OBJECT) {
logio->EshiftStreamDepth((char *)strLineName.toStdString().c_str(),2,sdeps,edeps);
}
}
delete logio;
//Plot重新加载数据
emit CallManage::getInstance()->sig_ReloadPlot(m_strUuid, strSlfName, strLineName);
}
void MainWindowCurve::slotRun()
{
double depthshift=spinbox3->text().toFloat();
if(depthshift==0) return;
float sdep=spinbox1->text().toFloat();
float edep=spinbox2->text().toFloat();
if(sdep>edep) {
float depp=sdep;
sdep=edep;
edep=sdep;
}
if(m_SelectTableItem.m_iTableType==2)
{
//道
QStringList listLine = getLineList(m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName);
if(listLine.size()>0)
{
for(int i=0; i<listLine.size(); i++)
{
//单条曲线校深
MoveShift(m_SelectTableItem.m_strSlfName, listLine[i], sdep, edep, depthshift);
}
}
else
{
QMessageBox::warning(this, "提示", "道内曲线对象为空,无对象可校正!");
return;
}
}
else if(m_SelectTableItem.m_iTableType==3)
{
//单条曲线校深
MoveShift(m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strLineName, sdep, edep, depthshift);
}
}
void MainWindowCurve::s_MoveShift()
{
if(m_SelectTableItem.m_iTableType==0) {
QMessageBox::warning(this, "提示", "请选择要校正的对象!");
return;
}
if(m_SelectTableItem.m_iTableType==1) {
QMessageBox::warning(this, "提示", "该功能不支持对井次校正,如果需要井次校正请到数据树上进行!");
return;
}
if(m_SelectTableItem.m_iTableType==2 || m_SelectTableItem.m_iTableType==3)
{
//道,曲线
QDialog dialog(NULL);
dialog.setModal(false);
Qt::WindowFlags flags = dialog.windowFlags();
flags |= Qt::WindowStaysOnTopHint;
flags &= ~Qt::WindowContextHelpButtonHint;
dialog.setWindowFlags(flags);
dialog.setWindowTitle("深度分段平移");
QFormLayout form(&dialog);
form.addWidget(new QLabel("输入深度参数:"));
// Value1
QString value1 = QString("起始深度: ");
spinbox1 = new QLineEdit(&dialog);
if(1) {
2026-01-23 18:20:18 +08:00
float yGeoNormal =-m_iY2;
spinbox1->setText(toString(((int)(yGeoNormal*10+0.5))/10.0));
}
else spinbox1->setText("-9999.0");
form.addRow(value1, spinbox1);
value1 = QString("终止深度: ");
spinbox2 = new QLineEdit(&dialog);
form.addRow(value1, spinbox2);
if(1)
{
2026-01-23 18:20:18 +08:00
spinbox2->setText(toString(-m_iY1));
}
else spinbox2->setText("-9999.0");
value1 = QString("移动量(上移-,下移+): ");
spinbox3 = new QLineEdit(&dialog);
form.addRow(value1, spinbox3);
spinbox3->setText("0");
QDialogButtonBox buttonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
Qt::Horizontal, &dialog);
//m_ButtonBox=&buttonBox;
form.addWidget(&buttonBox);
//m_LOGS=logs;
//QObject::connect(spinbox1, SIGNAL(returnPressed()), this, SLOT(slotSetDep()));
//QObject::connect(spinbox2, SIGNAL(returnPressed()), this, SLOT(slotSetDep()));
QObject::connect(buttonBox.button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(slotRun()));
QObject::connect(&buttonBox, SIGNAL(rejected()), &dialog, SLOT(reject()));
buttonBox.button(QDialogButtonBox::Ok)->setAutoDefault(false);
//slotSetDep();
dialog.show();
if (dialog.exec() == QDialog::Accepted) {
// Do something here
}
}
}
2026-01-30 09:47:13 +08:00
//设置/取消标准(目标拼接)曲线
void MainWindowCurve::s_Standard()
{
if(m_SelectTableItem.m_iTableType==0) {
QMessageBox::warning(this, "提示", "请选择要校正的对象!");
return;
}
if(m_SelectTableItem.m_iTableType==1) {
QMessageBox::warning(this, "提示", "该功能不支持对井次校正,如果需要井次校正请到数据树上进行!");
return;
}
if(m_SelectTableItem.m_iTableType==3 && m_SelectTableItem.m_strFormInfoType=="curveObject")
{
//曲线
}
else
{
QMessageBox::warning(this, "提示", "该功能只支持曲线! 请选择要校正的曲线!");
return;
}
2026-01-30 09:47:13 +08:00
//主校(源拼接)曲线中,去掉本条曲线
if(m_RightCurve.m_strSlfName == m_SelectTableItem.m_strSlfName &&
m_RightCurve.m_strWellName == m_SelectTableItem.m_strWellName &&
m_RightCurve.m_strTrackName == m_SelectTableItem.m_strTrackName &&
m_RightCurve.m_strLineName == m_SelectTableItem.m_strLineName)
{
//主校曲线中,切换为不选择
m_RightCurve.m_iTableType=0;
m_RightCurve.m_strUuid = "";
m_RightCurve.m_strWellName = "";
m_RightCurve.m_strSlfName="";
m_RightCurve.m_strTrackName="";
m_RightCurve.m_strLineName="";
m_RightCurve.m_strFormInfoType="";
}
2026-01-30 09:47:13 +08:00
//从校(从拼接)曲线中,去掉本条曲线
for(int i=0; i<m_ShiftCurves.size(); i++)
{
SelectTableItem m_TempCurve = m_ShiftCurves[i];
//当前已经选中为从校曲线
if(m_TempCurve.m_strSlfName == m_SelectTableItem.m_strSlfName &&
m_TempCurve.m_strWellName == m_SelectTableItem.m_strWellName &&
m_TempCurve.m_strTrackName == m_SelectTableItem.m_strTrackName &&
m_TempCurve.m_strLineName == m_SelectTableItem.m_strLineName)
{
//删除从校曲线
m_ShiftCurves.removeAt(i);
break;
}
}
2026-01-30 09:47:13 +08:00
//iSelect=0未知1标准目标拼接曲线2主校源拼接曲线3从校从拼接曲线
//当前有标准(目标拼接)曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
//当前已经选中为标准曲线
if(m_LeftCurve.m_strSlfName == m_SelectTableItem.m_strSlfName &&
m_LeftCurve.m_strWellName == m_SelectTableItem.m_strWellName &&
m_LeftCurve.m_strTrackName == m_SelectTableItem.m_strTrackName &&
m_LeftCurve.m_strLineName == m_SelectTableItem.m_strLineName)
{
//修改当前曲线选择状态 iSelect=0未知
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 0, m_bMerge);
//标准曲线中,切换为不选择
m_LeftCurve.m_iTableType=0;
m_LeftCurve.m_strUuid = "";
m_LeftCurve.m_strWellName = "";
m_LeftCurve.m_strSlfName="";
m_LeftCurve.m_strTrackName="";
m_LeftCurve.m_strLineName="";
m_LeftCurve.m_strFormInfoType="";
}
else
{
//修改原来的标准曲线选择状态 iSelect=0未知
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName, 0, m_bMerge);
//修改当前曲线选择状态 iSelect=1标准曲线
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 1, m_bMerge);
//设置标准曲线
m_LeftCurve = m_SelectTableItem;
}
}
else
{
//当前没有标准曲线
//修改当前曲线选择状态 iSelect=1标准曲线
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 1, m_bMerge);
//设置标准曲线
m_LeftCurve = m_SelectTableItem;
}
}
2026-01-30 09:47:13 +08:00
//设置/取消校正(源拼接)曲线
void MainWindowCurve::s_Correction()
{
if(m_SelectTableItem.m_iTableType==0) {
QMessageBox::warning(this, "提示", "请选择要校正的对象!");
return;
}
if(m_SelectTableItem.m_iTableType==1) {
QMessageBox::warning(this, "提示", "该功能不支持对井次校正,如果需要井次校正请到数据树上进行!");
return;
}
if(m_SelectTableItem.m_iTableType==3 && m_SelectTableItem.m_strFormInfoType=="curveObject")
{
//曲线
}
else
{
QMessageBox::warning(this, "提示", "该功能只支持曲线! 请选择要校正的曲线!");
return;
}
//标准曲线中,去掉本条曲线
//当前有标准曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
//当前已经选中为标准曲线
if(m_LeftCurve.m_strSlfName == m_SelectTableItem.m_strSlfName &&
m_LeftCurve.m_strWellName == m_SelectTableItem.m_strWellName &&
m_LeftCurve.m_strTrackName == m_SelectTableItem.m_strTrackName &&
m_LeftCurve.m_strLineName == m_SelectTableItem.m_strLineName)
{
//标准曲线中,切换为不选择
m_LeftCurve.m_iTableType=0;
m_LeftCurve.m_strUuid = "";
m_LeftCurve.m_strWellName = "";
m_LeftCurve.m_strSlfName="";
m_LeftCurve.m_strTrackName="";
m_LeftCurve.m_strLineName="";
m_LeftCurve.m_strFormInfoType="";
}
}
//从校曲线中,去掉本条曲线
for(int i=0; i<m_ShiftCurves.size(); i++)
{
SelectTableItem m_TempCurve = m_ShiftCurves[i];
//当前已经选中为从校曲线
if(m_TempCurve.m_strSlfName == m_SelectTableItem.m_strSlfName &&
m_TempCurve.m_strWellName == m_SelectTableItem.m_strWellName &&
m_TempCurve.m_strTrackName == m_SelectTableItem.m_strTrackName &&
m_TempCurve.m_strLineName == m_SelectTableItem.m_strLineName)
{
//修改当前曲线选择状态 iSelect=0未知
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 0, m_bMerge);
//删除从校曲线
m_ShiftCurves.removeAt(i);
return;
}
}
//iSelect=0未知1标准曲线2主校曲线3从校曲线
//当前有主校曲线
if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
{
//当前已经选中为主校曲线
if(m_RightCurve.m_strSlfName == m_SelectTableItem.m_strSlfName &&
m_RightCurve.m_strWellName == m_SelectTableItem.m_strWellName &&
m_RightCurve.m_strTrackName == m_SelectTableItem.m_strTrackName &&
m_RightCurve.m_strLineName == m_SelectTableItem.m_strLineName)
{
//修改当前曲线选择状态 iSelect=0未知
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 0, m_bMerge);
//主校曲线中,切换为不选择
m_RightCurve.m_iTableType=0;
m_RightCurve.m_strUuid = "";
m_RightCurve.m_strWellName = "";
m_RightCurve.m_strSlfName="";
m_RightCurve.m_strTrackName="";
m_RightCurve.m_strLineName="";
m_RightCurve.m_strFormInfoType="";
}
else
{
//修改当前曲线选择状态 iSelect=3从校曲线
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 3, m_bMerge);
//设置从校曲线
m_ShiftCurves.append(m_SelectTableItem);
}
}
else
{
//当前没有主校曲线
//修改当前曲线选择状态 iSelect=2主校曲线
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 2, m_bMerge);
//设置主校曲线
m_RightCurve = m_SelectTableItem;
}
}
// quick sort
void qsort(QVector<CurveLine *>&datx,int left,int right,int idx)
{
if(right<left+1) return;
int i,j;
float x,y;
i=left;
j=right;
x=datx[(left+right)/2]->GetLeftDepth();
do
{
if(idx==0)
{
while(datx[i]->GetLeftDepth()<x && i<right) i++;
while(datx[j]->GetLeftDepth()>x && j>left ) j--;
}
else
{
while(datx[i]->GetLeftDepth()>x && i<right) i++;
while(datx[j]->GetLeftDepth()<x && j>left ) j--;
}
if(i<=j)
{
CurveLine *yy=datx[i];
datx[i]=datx[j];
datx[j]=yy;
i++;j--;
}
} while(i<=j);
if(left<j) qsort(datx,left,j,idx);
if(i<right) qsort(datx,i,right,idx);
}
//右键--添加分段线
void MainWindowCurve::s_AddShiftLine(QString strUuid, double left_Low, double right_Hight)
{
if(strUuid != m_strUuid)
{
return;
}
//当前有标准曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择标准曲线!");
return;
}
//当前有主校曲线
if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择校正曲线!");
return;
}
//通知界面,增加一条校深线段
emit CallManage::getInstance()->sig_AddShifLineToPlot(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName, left_Low, right_Hight);
}
//右键--清除当前分段线
void MainWindowCurve::s_DelSelectShiftLine(QString strUuid)
{
if(strUuid != m_strUuid)
{
return;
}
//当前有标准曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择标准曲线!");
return;
}
// //当前有主校曲线
// if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
// {
// }
// else
// {
// QMessageBox::warning(this, "提示", "请先选择校正曲线!");
// return;
// }
//通知界面,清除当前分段线
emit CallManage::getInstance()->sig_DelSelectShiftLineFromPlot(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName);
}
//右键--清除全部分段线
void MainWindowCurve::s_DelAllShiftLine(QString strUuid)
{
if(strUuid != m_strUuid)
{
return;
}
//当前有标准曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择标准曲线!");
return;
}
// //当前有主校曲线
// if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
// {
// }
// else
// {
// QMessageBox::warning(this, "提示", "请先选择校正曲线!");
// return;
// }
//通知界面,清除全部分段线
emit CallManage::getInstance()->sig_DelAllShiftLineFromPlot(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName);
}
//自动对比
void MainWindowCurve::s_autocor()
{
//当前有标准曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择标准曲线!");
return;
}
//当前有主校曲线
if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择校正曲线!");
return;
}
//
static float cmins=0.9;
static float winLength=4;
static float stepLength=2;
static float searchLength=4;
static float stdep=-9999;
static float endep=-9999;
//
QDialog dialog(NULL);
dialog.setModal(false);
Qt::WindowFlags flags = dialog.windowFlags();
flags |= Qt::WindowStaysOnTopHint;
flags &= ~Qt::WindowContextHelpButtonHint;
dialog.setWindowFlags(flags);
dialog.setWindowTitle("自动对比参数");
QFormLayout form(&dialog);
form.addRow(new QLabel("输入窗长:"));
// Value1
QString value1 = QString("窗长: ");
QLineEdit *spinbox1 = new QLineEdit(&dialog);
spinbox1->setText(toString(winLength));
form.addRow(value1, spinbox1);
value1 = QString("步长: ");
QLineEdit *spinbox2 = new QLineEdit(&dialog);
form.addRow(value1, spinbox2);
spinbox2->setText(toString(stepLength));
value1 = QString("搜索长度: ");
QLineEdit *spinbox3 = new QLineEdit(&dialog);
form.addRow(value1, spinbox3);
spinbox3->setText(toString(searchLength));
value1 = QString("最小相关系数: ");
QLineEdit *spinbox4 = new QLineEdit(&dialog);
form.addRow(value1, spinbox4);
spinbox4->setText(toString(cmins));
value1 = QString("起始深度: ");
QLineEdit *spinbox5 = new QLineEdit(&dialog);
form.addRow(value1, spinbox5);
spinbox5->setText(toString(stdep));
value1 = QString("终止深度: ");
QLineEdit *spinbox6 = new QLineEdit(&dialog);
form.addRow(value1, spinbox6);
spinbox6->setText(toString(endep));
QDialogButtonBox buttonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
Qt::Horizontal, &dialog);
form.addWidget(&buttonBox);
QObject::connect(&buttonBox, SIGNAL(accepted()), &dialog, SLOT(accept()));
QObject::connect(&buttonBox, SIGNAL(rejected()), &dialog, SLOT(reject()));
dialog.show();
if (dialog.exec() == QDialog::Accepted) {
// Do something here
}
else return;
winLength=spinbox1->text().toFloat();
stepLength=spinbox2->text().toFloat();
searchLength=spinbox3->text().toFloat();
cmins=spinbox4->text().toFloat();
stdep=spinbox5->text().toFloat();
endep=spinbox6->text().toFloat();
//
float* FirstDep=new float[5000];
float* SecondDep=new float[5000];
float* corc=new float[5000];
*FirstDep=stdep;
*SecondDep=endep;
int num=AutoComp((char *)m_LeftCurve.m_strSlfName.toStdString().c_str(),
(char *)m_RightCurve.m_strSlfName.toStdString().c_str(),
(char *)m_LeftCurve.m_strLineName.toStdString().c_str(),
(char *)m_RightCurve.m_strLineName.toStdString().c_str(),
cmins,
winLength,
stepLength,
searchLength,
FirstDep,
SecondDep,
corc
);
for(int i=0;i<num;i++)
{
CurveLine * pLine = new CurveLine();
pLine->SetLeftDepth(FirstDep[i]);
pLine->SetRightDepth(SecondDep[i]);
m_mergeLineList.append(pLine);
}
delete FirstDep;
delete SecondDep;
delete corc;
qsort(m_mergeLineList,0,m_mergeLineList.size()-1,0);
if(num>0) {
CString szBuffer="";
CString szBuffer1="";
for(int i=0;i<num;i++)
{
float sdep=m_mergeLineList[i]->GetLeftDepth();
float edep=m_mergeLineList[i]->GetRightDepth();
szBuffer1.Format("%g %g\r\n",sdep,edep);
szBuffer+=szBuffer1;
//通知界面,增加一条校深线段
emit CallManage::getInstance()->sig_AddShifLineToPlot(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName, -edep, -sdep);
}
CMemRdWt mem;
if(mem.Open(m_RightCurve.m_strSlfName.toStdString().c_str()))
{
WriteShiftMessage(mem,szBuffer,"Create depths Pairs:","depth_inp");
}
}
}
//执行校正
void MainWindowCurve::s_runcor()
{
//当前有标准曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择标准曲线!");
return;
}
//当前有主校曲线
if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择校正曲线!");
return;
}
//通知界面,执行校正
emit CallManage::getInstance()->sig_RuncorFromPlot(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName);
}
//编辑曲线,框选拉伸/压缩
void MainWindowCurve::s_EShiftDepth(QString strSlfName, QString strLineName, int count, QList<double> left_Low_List, QList<double> right_Hight_List)
{
if(strSlfName=="") return;
float sdeps[2],edeps[2];
sdeps[0]=right_Hight_List[0];
sdeps[1]=left_Low_List[0];
edeps[0]=right_Hight_List[1];
edeps[1]=left_Low_List[1];
CMemRdWt * logio=new CMemRdWt();
if(!logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return;
}
int curveindex=logio->FindObjectName((char*)strLineName.toStdString().c_str());
if(curveindex<0)
{
delete logio;
return;
}
CString szBuffer1="";
CString szBuffer="";
for(int i=0;i<count;i++)
{
szBuffer1.Format("%10.3f %10.3f\r\n",sdeps[i],edeps[i]);
szBuffer+=szBuffer1;
}
WriteShiftMessage(*logio,szBuffer,strLineName);
logio->EShiftDepth((char*)strLineName.toStdString().c_str(),2, sdeps, edeps);
delete logio;
//Plot重新加载数据
emit CallManage::getInstance()->sig_ReloadPlot(m_strUuid, strSlfName, strLineName);
}
//分段线,拉伸/压缩
void MainWindowCurve::s_Runcor_List(QString strUuid, QList<double> left_Low_List, QList<double> right_Hight_List)
{
if(strUuid != m_strUuid)
{
return;
}
//当前有标准曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择标准曲线!");
return;
}
//当前有主校曲线
if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择校正曲线!");
return;
}
m_mergeLineList.clear();
//
int itemCount =left_Low_List.size();
int m_nDepPairsNum=itemCount;
QList<SelectTableItem> ShiftCurvesAll;
ShiftCurvesAll.append(m_RightCurve);
ShiftCurvesAll.append(m_ShiftCurves);
if(ShiftCurvesAll.size()<1) return;
//
for(int i=0;i<itemCount;i++)
{
CurveLine * pLine = new CurveLine();
pLine->SetLeftDepth(left_Low_List[i]);
pLine->SetRightDepth(right_Hight_List[i]);
m_mergeLineList.append(pLine);
}
qsort(m_mergeLineList,0,m_mergeLineList.size()-1,0);
if(itemCount==1) {
int flag = QMessageBox::information(NULL,"确认","确认要执行深度平移校正吗?",QMessageBox::Yes,QMessageBox::No);
if(flag==QMessageBox::No) return;
float m_MoveDep=m_mergeLineList[0]->GetLeftDepth()-m_mergeLineList[0]->GetRightDepth();
for(int i=0;i<ShiftCurvesAll.size();i++) {
SelectTableItem plog2=ShiftCurvesAll[i];
QString Filename1=plog2.m_strSlfName;
CMemRdWt mem;
if(mem.Open(Filename1.toStdString().c_str())) {
QString curve=ShiftCurvesAll[i].m_strLineName;
int iIndex=mem.FindObjectName((char *)curve.toStdString().c_str());
if (iIndex >= 0)
{
CString szBuffer="";
szBuffer=QString::number(m_MoveDep,'f',3)+"\r\n";
WriteShiftMessage(mem,szBuffer,curve);
mem.CorrectObjectDepth(iIndex,m_MoveDep);
mem.Close();
//Plot重新加载数据
emit CallManage::getInstance()->sig_ReloadPlot(m_strUuid, Filename1, curve);
}
else {
mem.Close();
}
}
}
return;
}
else if(itemCount==3) {
QMessageBox box(QMessageBox::Warning,"确认","选择校深方式:");
box.setStandardButtons (QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
box.setButtonText(QMessageBox::Yes,QString("压缩拉伸"));
box.setButtonText (QMessageBox::No,QString("平移"));
box.setButtonText (QMessageBox::Cancel,QString("放弃"));
int ret=box.exec();
if(ret==QMessageBox::Cancel) return;
if(ret==QMessageBox::No) {
float sdep=m_mergeLineList[0]->GetLeftDepth();
float edep=m_mergeLineList[2]->GetLeftDepth();
float m_MoveDep=m_mergeLineList[1]->GetLeftDepth()-m_mergeLineList[1]->GetRightDepth();
for(int i=0;i<ShiftCurvesAll.size();i++) {
SelectTableItem plog2=ShiftCurvesAll[i];
QString Filename1=plog2.m_strSlfName;
CMemRdWt mem;
if(mem.Open(Filename1.toStdString().c_str())) {
QString curve=ShiftCurvesAll[i].m_strLineName;
int iIndex=mem.OpenChannel(curve.toStdString().c_str());
if (iIndex >= 0)
{
Slf_CHANNEL mc;
mem.GetChannelInfo(iIndex,&mc);
if(m_MoveDep) {
CString szBuffer="";
szBuffer.Format("%10.3f %10.3f %10.3f\r\n",sdep,edep,m_MoveDep);
WriteShiftMessage(mem,szBuffer,curve);
}
}
mem.Close();
//单条曲线校深
MoveShift(Filename1, curve, sdep, edep, m_MoveDep);
//Plot重新加载数据
emit CallManage::getInstance()->sig_ReloadPlot(m_strUuid, Filename1, curve);
}
}
return;
}
}
else {
if(m_nDepPairsNum<1)
{
QMessageBox::warning(this, "提示", "无校正深度线或深度移动量!");
return;
}
int flag = QMessageBox::information(NULL,"确认","确认要执行深度校正吗?",QMessageBox::Yes,QMessageBox::No);
if(flag != QMessageBox::Yes) return;
}
float m_MoveDep=0;
CString szBuffer="";
if(m_nDepPairsNum>0) {
CString szBuffer1="";
for(int i=0;i<m_nDepPairsNum;i++)
{
float sdep=m_mergeLineList[i]->GetLeftDepth();
float edep=m_mergeLineList[i]->GetRightDepth()+m_MoveDep;
szBuffer1.Format("%g %g\r\n",sdep,edep);
szBuffer+=szBuffer1;
}
}
else if(m_MoveDep) {
szBuffer=QString::number(-m_MoveDep,'f',3)+"\r\n";
}
for(int i=0;i<ShiftCurvesAll.size();i++) {
SelectTableItem plog2=ShiftCurvesAll[i];
QString curve=plog2.m_strLineName;
QString Filename1=plog2.m_strSlfName;
CMemRdWt mem;
if(mem.Open(Filename1.toStdString().c_str()))
{
int iIndex=mem.FindObjectName((char *)curve.toStdString().c_str());
if (iIndex >= 0) {
WriteShiftMessage(mem,szBuffer,curve,"depth_inp");
WriteShiftMessage(mem,szBuffer,curve);
if(m_MoveDep&&!m_nDepPairsNum) {
mem.CorrectObjectDepth(iIndex,-m_MoveDep);
}
else if(m_nDepPairsNum){
mem.EShiftDepth((char *)curve.toStdString().c_str());
}
}
mem.Close();
//Plot重新加载数据
emit CallManage::getInstance()->sig_ReloadPlot(m_strUuid, Filename1, curve);
}
}
}
2026-02-03 14:40:58 +08:00
//拼接预览
void MainWindowCurve::s_PreMegAc()
{
//当前有标准(目标)曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择目标曲线!");
return;
}
//当前有主校(源拼接)曲线
if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择源拼接曲线!");
return;
}
//通知界面,执行预览
emit CallManage::getInstance()->sig_PreMergeFromPlot(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName);
}
void MainWindowCurve::s_PreMerge_List(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, QList<double> left_Low_List, QList<double> right_Hight_List)
{
if(strUuid != m_strUuid)
{
return;
}
//当前有标准(目标)曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "无目标井!");
return;
}
//当前有主校(源拼接)曲线
if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "缺少目标曲线或目标曲线无效!");
return;
}
m_mergeLineList.clear();
//
int pointnum =left_Low_List.size();
//
for(int i=0;i<pointnum;i++)
{
CurveLine * pLine = new CurveLine();
pLine->SetLeftDepth(left_Low_List[i]);
pLine->SetRightDepth(right_Hight_List[i]);
m_mergeLineList.append(pLine);
}
qsort(m_mergeLineList,0,m_mergeLineList.size()-1,0);
if(pointnum<1) {
QMessageBox::warning(this, "提示", "曲线拼接深度点不存在,无法拼接!请先设置拼接深度点。");
return;
}
if(pointnum>2) {
QMessageBox::warning(this, "提示", "曲线拼接深度点太多最多可设置2点请重新设置拼接深度点。");
return;
}
float SourSdep=0;
float SourEdep=0;
float DectSdep=0;
if(pointnum==1) {
QMessageBox box(QMessageBox::Warning,"提示","拼接深度点仅有1个请您选择拼接部位");
box.setStandardButtons (QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
box.setButtonText(QMessageBox::Yes,QString("拼接上段"));
box.setButtonText(QMessageBox::No,QString("拼接下段"));
box.setButtonText(QMessageBox::Cancel,QString("放弃"));
int flag=box.exec();//QMessageBox::information(NULL,"敬告",pwelllog->GetName()+mess,QMessageBox::Yes,QMessageBox::No,QMessageBox::Cancel);
double sdep_right = 0;
double edep_right = 0;
double rlev_right = 0;
//获取曲线顶深、底深、间隔
int iRet = GetCurvInfo(m_RightCurve.m_strSlfName, m_RightCurve.m_strLineName, sdep_right, edep_right, rlev_right);
if(iRet!=1)
{
QMessageBox::warning(this, "提示", "曲线深度读取失败,无法拼接!");
return;
}
if(flag==QMessageBox::Yes) {
SourSdep=sdep_right;
SourEdep=m_mergeLineList[0]->GetLeftDepth();
DectSdep=SourSdep;
}
else if(flag==QMessageBox::No) {
DectSdep=m_mergeLineList[0]->GetLeftDepth();
SourEdep=edep_right;
SourSdep=m_mergeLineList[0]->GetRightDepth();
}
else return;
}
else if(pointnum==2) {
SourSdep=m_mergeLineList[0]->GetLeftDepth();//+m_RightCurve->GetShiftOffset();
SourEdep=m_mergeLineList[1]->GetLeftDepth();//+m_RightCurve->GetShiftOffset();
DectSdep=m_mergeLineList[0]->GetLeftDepth();
}
//---------------
double sdep_left = 0;
double edep_left = 0;
double rlev_left = 0;
//获取曲线顶深、底深、间隔
int iRet = GetCurvInfo(m_LeftCurve.m_strSlfName, m_LeftCurve.m_strLineName, sdep_left, edep_left, rlev_left);
if(iRet!=1)
{
QMessageBox::warning(this, "提示", "曲线深度读取失败,无法拼接!");
return;
}
//
QList<double> new_DepthList;
QList<double> new_ValueList;
int size1=(SourEdep-SourSdep)/rlev_left+1.5;
if(size1>0) {
float dep=0;
for(int i=0;i<size1;i++) {
dep=SourSdep+i*rlev_left;
new_DepthList.append(0-dep);
}
}
iRet = GetCurvValue(m_RightCurve.m_strSlfName, m_RightCurve.m_strLineName, new_DepthList, new_ValueList);
if(iRet!=1)
{
QMessageBox::warning(this, "提示", "曲线数据读取失败,无法拼接!");
return;
}
//采用右侧数据,执行预览
emit CallManage::getInstance()->sig_PreMerge_FromRightList(m_strUuid, strSlfName, strWellName, strTrackName, strLineName, new_DepthList, new_ValueList);
}
2026-01-30 09:47:13 +08:00
//执行拼接
void MainWindowCurve::s_merge()
{
//当前有标准(目标)曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择目标曲线!");
return;
}
//当前有主校(源拼接)曲线
if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "请先选择源拼接曲线!");
return;
}
2026-02-03 14:40:58 +08:00
//通知界面,执行拼接
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_MergeFromPlot(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName);
}
void MainWindowCurve::s_Merge_List(QString strUuid, QList<double> left_Low_List, QList<double> right_Hight_List)
{
if(strUuid != m_strUuid)
{
return;
}
//当前有标准(目标)曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "无目标井!");
return;
}
//当前有主校(源拼接)曲线
if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
{
}
else
{
QMessageBox::warning(this, "提示", "缺少目标曲线或目标曲线无效!");
return;
}
m_mergeLineList.clear();
//
int pointnum =left_Low_List.size();
//
for(int i=0;i<pointnum;i++)
{
CurveLine * pLine = new CurveLine();
pLine->SetLeftDepth(left_Low_List[i]);
pLine->SetRightDepth(right_Hight_List[i]);
m_mergeLineList.append(pLine);
}
qsort(m_mergeLineList,0,m_mergeLineList.size()-1,0);
if(pointnum<1) {
2026-02-03 14:40:58 +08:00
QMessageBox::warning(this, "提示", "曲线拼接深度点不存在,无法拼接!请先设置拼接深度点。");
2026-01-30 09:47:13 +08:00
return;
}
if(pointnum>2) {
2026-02-03 14:40:58 +08:00
QMessageBox::warning(this, "提示", "曲线拼接深度点太多最多可设置2点请重新设置拼接深度点。");
2026-01-30 09:47:13 +08:00
return;
}
float SourSdep=0;
float SourEdep=0;
float DectSdep=0;
if(pointnum==1) {
QMessageBox box(QMessageBox::Warning,"提示","拼接深度点仅有1个请您选择拼接部位");
box.setStandardButtons (QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
box.setButtonText(QMessageBox::Yes,QString("拼接上段"));
box.setButtonText(QMessageBox::No,QString("拼接下段"));
box.setButtonText(QMessageBox::Cancel,QString("放弃"));
int flag=box.exec();//QMessageBox::information(NULL,"敬告",pwelllog->GetName()+mess,QMessageBox::Yes,QMessageBox::No,QMessageBox::Cancel);
double sdep_right = 0;
double edep_right = 0;
double rlev_right = 0;
//获取曲线顶深、底深、间隔
int iRet = GetCurvInfo(m_RightCurve.m_strSlfName, m_RightCurve.m_strLineName, sdep_right, edep_right, rlev_right);
if(iRet!=1)
{
QMessageBox::warning(this, "提示", "曲线深度读取失败,无法拼接!");
return;
}
if(flag==QMessageBox::Yes) {
SourSdep=sdep_right;
SourEdep=m_mergeLineList[0]->GetLeftDepth();
DectSdep=SourSdep;
}
else if(flag==QMessageBox::No) {
DectSdep=m_mergeLineList[0]->GetLeftDepth();
SourEdep=edep_right;
SourSdep=m_mergeLineList[0]->GetRightDepth();
}
else return;
}
else if(pointnum==2) {
SourSdep=m_mergeLineList[0]->GetLeftDepth();//+m_RightCurve->GetShiftOffset();
SourEdep=m_mergeLineList[1]->GetLeftDepth();//+m_RightCurve->GetShiftOffset();
DectSdep=m_mergeLineList[0]->GetLeftDepth();
}
2026-01-30 09:47:13 +08:00
QString name1=m_LeftCurve.m_strLineName;
QString name2=m_RightCurve.m_strLineName;
2026-01-30 09:47:13 +08:00
QList<SelectTableItem> ShiftCurvesAll;
ShiftCurvesAll.append(m_RightCurve);
ShiftCurvesAll.append(m_ShiftCurves);
if(ShiftCurvesAll.size()<1) {
QMessageBox::warning(this, "提示", "缺少目标曲线或目标曲线无效!");
return;
}
2026-01-30 09:47:13 +08:00
double sdep_left = 0;
double edep_left = 0;
double rlev_left = 0;
//获取曲线顶深、底深、间隔
int iRet = GetCurvInfo(m_LeftCurve.m_strSlfName, m_LeftCurve.m_strLineName, sdep_left, edep_left, rlev_left);
if(iRet!=1)
{
QMessageBox::warning(this, "提示", "曲线深度读取失败,无法拼接!");
return;
}
int size=(SourEdep-SourSdep)/rlev_left+1.5;
QString filename1=m_LeftCurve.m_strSlfName;
QString filename2=m_RightCurve.m_strSlfName;
CMemRdWt mrw1;
CMemRdWt mrw2;
struct INC_STRU Inc={0},Inc1={0};
struct INP_STRU Inp,Inp1;
struct HD_STRU Hd={99999.0,-99999.0,0};
struct HD_STRU Hd1={99999.0,-99999.0,0};
int flag=0;
if(filename1==filename2) {
CMemRdWt mrw4;
if(mrw4.Open(filename1.toStdString().c_str())) {
CMemRdWt mrw3;
QDir aa;
filename2=::GetLogdataPath()+"temp\\temp001";
aa.remove(filename2);
if(mrw3.Open(filename2.toStdString().c_str(),CMemRdWt::modeCreate,1024,1024,0,mrw4.IsWis)) {
mrw3.CopyFromFile(mrw4,(char *)name2.toStdString().c_str());
mrw3.Save();
mrw3.Close();
flag=1;
}
mrw1.Close();
}
}
if (!mrw1.Open(filename1.toStdString().c_str())) {
if(flag) {
QDir aa;
aa.remove(filename2);
}
return;
}
if (!mrw2.Open(filename2.toStdString().c_str())) {
mrw1.Close();
if(flag) {
QDir aa;
aa.remove(filename2);
}
return;
}
mrw1.SetStruct(&Inc,NULL,&Inp,NULL,NULL,NULL,&Hd,NULL);
mrw2.SetStruct(&Inc1,NULL,&Inp1,NULL,NULL,NULL,&Hd1,NULL);
QList<QString> names1,names2;
names1.append(name1);
names2.append(name2);
for(int i=0;i<m_ShiftCurves.size();i++){
names1.append(m_ShiftCurves.at(i).m_strLineName);
names2.append(m_ShiftCurves.at(i).m_strLineName);
}
int ind1,ind2;
QStringList ERRORS;
int j=0;
for(int i=0;i<names1.size();i++)
{
Slf_CHANNEL m_Channel1;
Slf_CHANNEL m_Channel2;
ind1=mrw1.OpenChannel(names1[i].toStdString().c_str());
ind2=mrw2.OpenChannel(names2[i].toStdString().c_str());
if(ind1<0||ind2<0) {
CString cs;
if(ind1<0) {
ERRORS.append(names1[i]+" ");
// cs.Format("源曲线不存在%s",name1.toStdString().c_str());
}
else if(ind2<0) {
ERRORS.append(names2[i]+" ");
// cs.Format("目标曲线不存在%s",name2.toStdString().c_str());
}
else {
ERRORS.append(names1[i]+" "+names2[i]);
// cs.Format("源曲线、目标曲线不存在!");
}
continue;
}
mrw1.GetChannelInfo(ind1,&m_Channel1);
mrw2.GetChannelInfo(ind2,&m_Channel2);
if(ind1&&SourEdep==0) SourEdep=m_Channel1.DimInfo[0].StartVal+m_Channel1.DimInfo[0].Samples*m_Channel1.DimInfo[0].Delta;
mrw1.AddInCurve((char *)names1[i].toStdString().c_str());
mrw2.AddInCurve((char *)names2[i].toStdString().c_str());
mrw1.CopyCurve(mrw2,SourSdep,SourEdep,DectSdep,j,j);
j++;
}
mrw2.Close();
mrw1.Save();
mrw1.Close();
if(flag) {
QDir aa;
aa.remove(filename2);
}
//Plot重新加载数据
emit CallManage::getInstance()->sig_ReloadPlot(m_strUuid, filename1, name1);
2026-02-03 14:40:58 +08:00
//关闭预览框
emit CallManage::getInstance()->sig_PreMerge_Close(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName);
if(ERRORS.size())QMessageBox::warning(this, "提示", "目标曲线不存在:"+ERRORS.join(" "));
2026-01-30 09:47:13 +08:00
}
//清除全部曲线设置
void MainWindowCurve::s_ClearAllSetCurve()
{
//标准曲线中,去掉本条曲线
//当前有标准曲线
if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject")
{
//-----------------------
//通知界面,清除全部分段线
emit CallManage::getInstance()->sig_DelAllShiftLineFromPlot(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName);
//-----------------------
//修改当前曲线选择状态 iSelect=0未知
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName, 0, m_bMerge);
//标准曲线中,切换为不选择
m_LeftCurve.m_iTableType=0;
m_LeftCurve.m_strUuid = "";
m_LeftCurve.m_strWellName = "";
m_LeftCurve.m_strSlfName="";
m_LeftCurve.m_strTrackName="";
m_LeftCurve.m_strLineName="";
m_LeftCurve.m_strFormInfoType="";
}
//主校曲线中,去掉本条曲线
//当前有主校曲线
if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject")
{
//修改当前曲线选择状态 iSelect=0未知
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_RightCurve.m_strSlfName, m_RightCurve.m_strWellName, m_RightCurve.m_strTrackName, m_RightCurve.m_strLineName, 0, m_bMerge);
//主校曲线中,切换为不选择
m_RightCurve.m_iTableType=0;
m_RightCurve.m_strUuid = "";
m_RightCurve.m_strWellName = "";
m_RightCurve.m_strSlfName="";
m_RightCurve.m_strTrackName="";
m_RightCurve.m_strLineName="";
m_RightCurve.m_strFormInfoType="";
}
//从校曲线中,去掉本条曲线
for(int i=m_ShiftCurves.size()-1; i>-1; i--)
{
SelectTableItem m_TempCurve = m_ShiftCurves[i];
//修改当前曲线选择状态 iSelect=0未知
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_TempCurve.m_strSlfName, m_TempCurve.m_strWellName, m_TempCurve.m_strTrackName, m_TempCurve.m_strLineName, 0, m_bMerge);
//删除从校曲线
m_ShiftCurves.removeAt(i);
}
}
//清除全部从曲线设置
void MainWindowCurve::s_ClearSetCurve()
{
//从校曲线中,去掉本条曲线
for(int i=m_ShiftCurves.size()-1; i>-1; i--)
{
SelectTableItem m_TempCurve = m_ShiftCurves[i];
//修改当前曲线选择状态 iSelect=0未知
2026-01-30 09:47:13 +08:00
emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_TempCurve.m_strSlfName, m_TempCurve.m_strWellName, m_TempCurve.m_strTrackName, m_TempCurve.m_strLineName, 0, m_bMerge);
//删除从校曲线
m_ShiftCurves.removeAt(i);
}
}
QStringList MainWindowCurve::insertCol(int nW)
{
QStringList sret;
int column = -1;
QString strSlfName = "";
QString strLeft = m_leftWidgets->getLeftTreeString();
if(strLeft.length() > 0)
{
QStringList list = strLeft.split("#@@#");//QString字符串分割函数
if (list.size() > 3)
{
strSlfName = list[0];
QString strWellName = list[1];
// QString strLineName = list[2];
// QString strType = list[3];
if(!m_listWell.contains(strWellName))
{
//井没创建,创建井+道+曲线
//新建井
s_NewWell(strWellName, strSlfName);
//m_listWell.push_back(strWellName);//重复添加
column= 0;
}
}
}
if(ui->tableWidget_2->columnCount()==0)
{
return sret;
}
int iWidth = 0;
if(column < 0)
{
column = ui->tableWidget_2->currentColumn();//列编号从0开始
iWidth = ui->tableWidget_2->columnWidth(column);
}
if(column<0)
{
//当前没有选中井
return sret;
}
if(column%2==0)
{
}
else
{
//空白列
return sret;
}
QString strWellName = ui->tableWidget_2->item(0, column)->text();
//设置列宽
ui->tableWidget_2->setColumnWidth(column, iWidth+nW+8);
sret << strWellName << strSlfName;
return sret;
}
QStringList MainWindowCurve::getSelectWell_New()
{
QStringList sret;
//没有选中要添加的道
if(m_SelectTableItem.m_iTableType==0)
{
if(ui->tableWidget_2->columnCount()==0)
{
//0井空白视图
QString strLeft = m_leftWidgets->getLeftTreeString();
if(strLeft.length() > 0)
{
QStringList list = strLeft.split("#@@#");//QString字符串分割函数
if (list.size() > 3)
{
QString strSlfName = list[0];
QString strWellName = list[1];
sret << strWellName << strSlfName;
return sret;
}
}
else {
QMessageBox::warning(this, "提示", "请先选中待处理井次!");
return sret;
}
}
else if(ui->tableWidget_2->columnCount()==1)
{
//单井
QString strWellName = ui->tableWidget_2->item(0, 0)->text();
//直接从单井获取data记录slf路径
QString strSlfName = ui->tableWidget_2->item(0, 0)->data(Qt::UserRole+1).toString();
sret << strWellName << strSlfName;
return sret;
}
else
{
//多井
QMessageBox::warning(this, "提示", "请在可视解释视图,选择添加的井或道!");
return sret;
}
}
else if(m_SelectTableItem.m_iTableType==2)
{
//选中道
//不在此处处理
2026-03-08 23:22:36 +08:00
return sret;
}
else
{
//选中井次或曲线
QString strSlfName = m_SelectTableItem.m_strSlfName;
QString strWellName = m_SelectTableItem.m_strWellName;
if(strSlfName=="" || strWellName=="")
{
QMessageBox::warning(this, "提示", "请先选中待处理井次!");
return sret;
}
sret << strWellName << strSlfName;
return sret;
}
2026-03-08 23:22:36 +08:00
return sret;
}
2025-12-30 17:38:11 +08:00
QStringList MainWindowCurve::getSelectWell()
{
QStringList sret;
if(ui->tableWidget_2->columnCount()==0)
{
return sret;
}
int column = ui->tableWidget_2->currentColumn();//列编号从0开始
if(column<0)
{
//当前没有选中井
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return sret;
}
if(column%2==0)
{
}
else
{
//空白列
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return sret;
}
QString strWellName = ui->tableWidget_2->item(0, column)->text();
//直接从选中的井获取data记录slf路径
QString strSlfName = ui->tableWidget_2->item(0, column)->data(Qt::UserRole+1).toString();
sret << strWellName << strSlfName;
return sret;
}
2025-10-29 17:23:30 +08:00
void MainWindowCurve::loadStyle(const QString &qssFile)
{
//加载样式表
QString qss;
QFile file(qssFile);
if (file.open(QFile::ReadOnly)) {
//用QTextStream读取样式文件不用区分文件编码 带bom也行
QStringList list;
QTextStream in(&file);
//in.setCodec("utf-8");
while (!in.atEnd()) {
QString line;
in >> line;
list << line;
}
file.close();
qss = list.join("\n");
QString paletteColor = qss.mid(20, 7);
this->setPalette(QPalette(paletteColor));
//用时主要在下面这句
this->setStyleSheet(qss);
}
}
2026-01-23 14:53:34 +08:00
void MainWindowCurve::s_currtemplite()
{
}
2025-10-29 17:23:30 +08:00
void MainWindowCurve::s_Save()
{
//Logdata
QString folderPath;
folderPath = GetLogdataPath();
folderPath = folderPath + g_prjname;
//folderPath = folderPath + "/multiwell.json";
QString exPortPath = QFileDialog::getSaveFileName(this, "另存为", folderPath, "多井图文件(*.json)");
if (exPortPath.isEmpty() == false)
{
QJsonObject rootObj = makeJson();
// 生成JSON文档
QJsonDocument doc(rootObj);
// 写入文件
QFile file(exPortPath);
if(file.open(QIODevice::WriteOnly)){
file.write(doc.toJson(QJsonDocument::Indented));
file.close();
qDebug() << "JSON文件写入成功";
} else {
qWarning() << "文件打开失败:" << file.errorString();
return;
}
}
}
//校深
void MainWindowCurve::s_ExecuteDepthShift()
{
2026-01-30 09:47:13 +08:00
//当前正在拼接处理
if(m_bMerge)
{
//清理拼接线段
s_ClearAllSetCurve();
}
m_bMerge = false;
ui->toolBar_3->hide();
//
if(ui->toolBar_2->isHidden())
{
ui->toolBar_2->show();
}
else
{
ui->toolBar_2->hide();
}
}
2026-01-30 09:47:13 +08:00
//拼接
void MainWindowCurve::s_ExecuteMerge()
{
//当前正在校深处理
if(!m_bMerge)
{
//清理校深线段
s_ClearAllSetCurve();
}
m_bMerge = true;
ui->toolBar_2->hide();
//
if(ui->toolBar_3->isHidden())
{
ui->toolBar_3->show();
}
else
{
ui->toolBar_3->hide();
}
}
2026-01-16 17:18:41 +08:00
void MainWindowCurve::s_ModuleOpen()
{
QString strSlfName = "";
QString strLeft = m_leftWidgets->getLeftTreeString();
if(strLeft.length() > 0)
{
QStringList list = strLeft.split("#@@#");//QString字符串分割函数
if (list.size() > 3)
{
strSlfName = list[0];
QString strWellName = list[1];
}
}
if (strSlfName.isEmpty())
{
QMessageBox::information(nullptr, "提示", "请先选中待处理井次");
return;
}
CModuleConsole* pModuleConsole = new pai::graphics::CModuleConsole();
CModuleParamers* pDialog = new CModuleParamers(pModuleConsole);//::CreatParamControlWidget();
SetWorkflowConsole(pModuleConsole);
pModuleConsole->g_mModuleParamers = pDialog;
pModuleConsole->m_pWorkflowDataModel = new CWellLogWorkflowDataModel();
pDialog->m_CurrentSLFFileName = strSlfName;
pDialog->CreatParamControlWidget();
2026-01-29 16:57:06 +08:00
QString subStr = strSlfName;
int startPos = strSlfName.indexOf("Logdata");
if (startPos>=0)
{
subStr = subStr.right(strSlfName.length() - startPos - 7);
}
pDialog->setWindowTitle(subStr);
2026-01-16 17:18:41 +08:00
pDialog->show();
return;
}
//void MainWindowCurve::s_Open(QString fileFull)
//{
2025-10-29 17:23:30 +08:00
//}
2025-10-29 17:23:30 +08:00
//显示/隐藏图头
void MainWindowCurve::s_showHeadTable()
{
if(m_dock1->isVisible())
{
m_dock1->hide();
m_dock2->hide();
}
else {
//第一次显示判断是否从json加载
if(m_bHeadLoadJson)
{
m_bHeadLoadJson = false;
QString strHeadOrTail = ""; //Head代表图头 Tail代表成果表
//展示所有图头
strHeadOrTail = "Head"; //Head代表图头 Tail代表成果表
m_formMultiHeads->DisplayHeads(m_headsArray, strHeadOrTail);
//展示所有成果表
strHeadOrTail = "Tail"; //Head代表图头 Tail代表成果表
m_formMultiTails->DisplayHeads(m_tailsArray, strHeadOrTail);
}
m_dock1->show();
m_dock2->show();
}
}
2025-10-29 17:23:30 +08:00
QJsonObject MainWindowCurve::makeJson()
{
// 创建根对象
QJsonObject rootObj;
//
rootObj["prjname"] = g_prjname;
2026-01-23 18:20:18 +08:00
rootObj["iScale"] = m_iScale;
rootObj["iY1"] = m_iY1;
rootObj["iY2"] = m_iY2;
2025-10-29 17:23:30 +08:00
// 创建JSON数组并填充数据
QJsonArray subcaseArray;
//
int columnCount = ui->tableWidget_2->columnCount();//总列数
for(int i=0; i<columnCount; i++)
{
if(i%2==0)
{
}
else
{
//空白列
continue;
}
if( ui->tableWidget_2->cellWidget(1, i) != nullptr )
{
auto myWidget = ui->tableWidget_2->cellWidget(1, i);
//
FormWell *widgetWell = qobject_cast<FormWell*>(myWidget);//获得widget
2025-10-29 17:23:30 +08:00
if(widgetWell)
{
//options
QJsonObject wellObj;
wellObj["id"] = i;
wellObj["info"] = widgetWell->makeJson();
subcaseArray.append(wellObj);
}
}
}
rootObj["wells"]=subcaseArray;
//图头
rootObj["heads"]=m_formMultiHeads->makeJsonArray();
//成果表
rootObj["tails"]=m_formMultiTails->makeJsonArray();
2025-10-29 17:23:30 +08:00
return rootObj;
}
void MainWindowCurve::s_NewWell(QString strWellName, QString strSlfName)
2025-10-29 17:23:30 +08:00
{
//因为tableWidget需要提前规定好行数与列数
int rowcount = 2; //总行数
int columnCount = ui->tableWidget_2->columnCount();//总列数
if(columnCount==0)
{
//增加1列
ui->tableWidget_2->setColumnCount(columnCount+1);
}
else {
//增加1列(空白)
ui->tableWidget_2->setColumnCount(columnCount+1);
//设置列宽
ui->tableWidget_2->setColumnWidth(columnCount, g_iOneWidth);
//
columnCount = ui->tableWidget_2->columnCount();//总列数
//增加1列
ui->tableWidget_2->setColumnCount(columnCount+1);
}
//设置列宽
ui->tableWidget_2->setColumnWidth(columnCount, g_iOneWidth);
//标题
QTableWidgetItem *headerItem = new QTableWidgetItem("");
ui->tableWidget_2->setHorizontalHeaderItem(columnCount, headerItem);
for(int i=0; i<rowcount; i++)
{
if(i==0)
{
//设置高度
ui->tableWidget_2->setRowHeight(i, 100);
2025-10-29 17:23:30 +08:00
//
QTableWidgetItem* item = new QTableWidgetItem(strWellName);
item->setData(Qt::UserRole + 1, strSlfName);
2025-10-29 17:23:30 +08:00
item->setFlags(item->flags() & (~Qt::ItemIsEditable));
item->setTextAlignment(Qt::AlignCenter); //设置文本居中
ui->tableWidget_2->setItem(i, columnCount, item);
}
else
{
double dHight = 0;
2026-01-23 18:20:18 +08:00
dHight = (m_iY2-m_iY1)*100.0/(double)m_iScale * g_dPixelPerCm;
if(g_iShow==1)
{
//显示刻度
dHight = dHight+30;
}
2025-10-29 17:23:30 +08:00
if(dHight>32767)
{
dHight = 32767;
}
dHight = dHight+300+100+10;
//设置高度
ui->tableWidget_2->setRowHeight(i, (int)dHight);//8020
//
FormWell *widgetWell = new FormWell(this, strWellName);
2026-01-23 18:20:18 +08:00
widgetWell->m_iY1 = m_iY1;
widgetWell->m_iY2 = m_iY2;
2025-10-30 11:55:37 +08:00
widgetWell->m_strUuid = m_strUuid;
widgetWell->m_strSlfName = strSlfName;
widgetWell->m_iScale = m_iScale;
2025-10-29 17:23:30 +08:00
ui->tableWidget_2->setCellWidget(i, columnCount, widgetWell);
//
m_listWell.push_back(strWellName);
2025-10-29 17:23:30 +08:00
}
}
2025-10-29 17:23:30 +08:00
//ui->tableWidget_2->resizeColumnsToContents(); // 调整列宽以适应内容
// 设置右键菜单策略
// ui->tableWidget_2->setContextMenuPolicy(Qt::CustomContextMenu);
// connect(ui->tableWidget_2, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
}
void MainWindowCurve::mousePressEvent(QMouseEvent *event)
{
QMainWindow::mousePressEvent(event); // 将事件操作权返回给父类
// 在事件处理中添加一个打印输出,用于显示鼠标在界面上的位置
qDebug()<< "mouse clicked at" << event->pos();
2026-01-23 18:20:18 +08:00
PropertyService()->initWidgetProperty(m_strUuid, m_iScale);
//取消所有选中单元格
emit CallManage::getInstance()->sig_Raise(m_strUuid, "", "", "", "", 0, "");
}
void MainWindowCurve::s_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType, QString strFormInfoType)
{
if(m_strUuid == strUuid)
{
//选中井次
m_SelectTableItem.m_iTableType=iTableType;
m_SelectTableItem.m_strUuid = strUuid;
m_SelectTableItem.m_strWellName = strWellName;
m_SelectTableItem.m_strSlfName=strSlfName;
m_SelectTableItem.m_strTrackName=strTrackName;
m_SelectTableItem.m_strLineName=strLineName;
m_SelectTableItem.m_strFormInfoType=strFormInfoType; //类型curveObject / waveObject / JiegutextObject
}
else
{
m_SelectTableItem.m_iTableType=0;
m_SelectTableItem.m_strUuid = "";
m_SelectTableItem.m_strWellName = "";
m_SelectTableItem.m_strSlfName="";
m_SelectTableItem.m_strTrackName="";
m_SelectTableItem.m_strLineName="";
m_SelectTableItem.m_strFormInfoType="";
}
if(m_strUuid == strUuid &&
iTableType==1)
{
//
}
else {
//选中了曲线置顶
//取消表格选中状态
ui->tableWidget_2->clearSelection();
}
}
void MainWindowCurve::onItemClicked(QTableWidgetItem* item)
{
qDebug() << "MainWindowCurve onItemClicked";
//曲线
QString strWellName = item->text();
2026-01-23 18:20:18 +08:00
QString strSlfName = item->data(Qt::UserRole+1).toString();
2026-01-23 18:20:18 +08:00
PropertyService()->initWellProperty(m_strUuid, strSlfName, strWellName, m_iY1, m_iY2);
//取消所有选中单元格
emit CallManage::getInstance()->sig_Raise(m_strUuid, strSlfName, strWellName, "", "", 0, "");
}
2025-10-29 17:23:30 +08:00
void MainWindowCurve::s_NewTrack()
{
2025-12-30 17:38:11 +08:00
int column = -1;
QString strSlfName = "";
//如果视图为空,则根据左侧选中的井来创建空白道
2025-10-29 17:23:30 +08:00
if(ui->tableWidget_2->columnCount()==0)
{
2025-12-30 17:38:11 +08:00
QString strLeft = m_leftWidgets->getLeftTreeString();
if(strLeft.length() > 0)
{
QStringList list = strLeft.split("#@@#");//QString字符串分割函数
if (list.size() > 3)
{
strSlfName = list[0];
QString strWellName = list[1];
// QString strLineName = list[2];
// QString strType = list[3];
if(!m_listWell.contains(strWellName))
{
//井没创建,创建井+道+曲线
//新建井
s_NewWell(strWellName, strSlfName);
//m_listWell.push_back(strWellName);//重复添加
2025-12-30 17:38:11 +08:00
column= 0;
}
}
}
//return;
}
int iWidth = 0;
if(column < 0)
{
column = ui->tableWidget_2->currentColumn();//列编号从0开始
iWidth = ui->tableWidget_2->columnWidth(column);
2025-10-29 17:23:30 +08:00
}
if(column<0)
{
//当前没有选中井
return;
}
if(column%2==0)
{
}
else
{
//空白列
return;
}
QString strWellName = ui->tableWidget_2->item(0, column)->text();
2025-10-29 17:23:30 +08:00
//新建道
emit CallManage::getInstance()->sig_NewTrack(m_strUuid, strWellName, "", "", "");
2025-10-29 17:23:30 +08:00
//设置列宽
ui->tableWidget_2->setColumnWidth(column, iWidth+g_iOneWidth);
}
void MainWindowCurve::s_NewDepth()
{
int column = -1;
int nW = 100;
2025-12-30 17:38:11 +08:00
QString strSlfName = "";
2025-12-30 17:38:11 +08:00
//如果视图为空,则根据左侧选中的井来创建深度道
if(ui->tableWidget_2->columnCount()==0)
{
2025-12-30 17:38:11 +08:00
QString strLeft = m_leftWidgets->getLeftTreeString();
if(strLeft.length() > 0)
{
QStringList list = strLeft.split("#@@#");//QString字符串分割函数
if (list.size() > 3)
{
strSlfName = list[0];
QString strWellName = list[1];
// QString strLineName = list[2];
// QString strType = list[3];
if(!m_listWell.contains(strWellName))
{
//井没创建,创建井+道+曲线
//新建井
s_NewWell(strWellName, strSlfName);
//m_listWell.push_back(strWellName);//重复添加
2025-12-30 17:38:11 +08:00
column= 0;
}
}
}
//return;
}
int iWidth = 0;
if(column < 0)
{
column = ui->tableWidget_2->currentColumn();//列编号从0开始
iWidth = ui->tableWidget_2->columnWidth(column);
}
if(column<0)
{
//当前没有选中井
2025-12-30 17:38:11 +08:00
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
if(column%2==0)
{
}
else
{
//空白列
2025-12-30 17:38:11 +08:00
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
QString strWellName = ui->tableWidget_2->item(0, column)->text();
//直接从选中的井获取data记录slf路径
2025-12-30 17:38:11 +08:00
if(strSlfName=="")
{
strSlfName = ui->tableWidget_2->item(0, column)->data(Qt::UserRole+1).toString();
}
//设置列宽
ui->tableWidget_2->setColumnWidth(column, iWidth+nW+8);
QStringList dt;
dt << m_strUuid;
dt << strWellName;
dt << strSlfName;
dt << "深度";
dt << "depthObject";
dt << QString::number(nW);
//新建道
emit CallManage::getInstance()->sig_NewCol(dt);
}
2025-12-30 17:38:11 +08:00
//曲线
void MainWindowCurve::s_NewLogs()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建曲线
emit CallManage::getInstance()->sig_AddLine(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "AC");
return;
}
QStringList sret = this->getSelectWell_New();
2025-12-30 17:38:11 +08:00
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "AC", "curveObject");
}
//波列
void MainWindowCurve::s_NewWave()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建波列
emit CallManage::getInstance()->sig_AddWave(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "STAIMAGE");
return;
}
QStringList sret = this->getSelectWell_New();
2025-12-30 17:38:11 +08:00
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "STAIMAGE", "waveObject");
}
//解释结论
void MainWindowCurve::s_NewOGResult()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建表格曲线
emit CallManage::getInstance()->sig_AddTableLine(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "RESULT");
return;
}
QStringList sret = this->getSelectWell_New();
2025-12-30 17:38:11 +08:00
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "RESULT", "tableObject");
}
//固井结论道
void MainWindowCurve::s_NewGujing()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建表格曲线
emit CallManage::getInstance()->sig_AddTableLine(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "GUJING1_RESULT");
return;
}
QStringList sret = this->getSelectWell_New();
2025-12-30 17:38:11 +08:00
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "GUJING1_RESULT", "tableObject");
}
//井壁取心
void MainWindowCurve::s_NewSideCore()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建表格曲线
emit CallManage::getInstance()->sig_AddTableLine(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "SWALL_CORE");
return;
}
QStringList sret = this->getSelectWell_New();
2025-12-30 17:38:11 +08:00
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "SWALL_CORE", "tableObject");
}
//岩心分析
void MainWindowCurve::s_NewCore()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建表格曲线
emit CallManage::getInstance()->sig_AddTableLine(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "CORE_PHYSICS");
return;
}
QStringList sret = this->getSelectWell_New();
2025-12-30 17:38:11 +08:00
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "CORE_PHYSICS", "tableObject");
}
//录井剖面
void MainWindowCurve::s_NewMudlogging()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建表格曲线
emit CallManage::getInstance()->sig_AddTableLine(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "GEO_LITH");
return;
}
QStringList sret = this->getSelectWell_New();
2025-12-30 17:38:11 +08:00
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "GEO_LITH", "tableObject");
}
//岩性描述
void MainWindowCurve::s_NewTxt()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建表格曲线
emit CallManage::getInstance()->sig_AddTableLine(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "WORDS_RELUST");
return;
}
QStringList sret = this->getSelectWell_New();
2025-12-30 17:38:11 +08:00
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "WORDS_RELUST", "tableObject");
}
//岩心照片
void MainWindowCurve::s_NewCoreImage()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建表格曲线
emit CallManage::getInstance()->sig_AddTableLine(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "IMAGE_DATA");
return;
}
QStringList sret = this->getSelectWell_New();
2025-12-30 17:38:11 +08:00
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "IMAGE_DATA", "tableObject");
}
//斜井三图一表
void MainWindowCurve::s_NewSantuyibiao()
{
QStringList sret = this->getSelectWell();
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "Santuyibiao", "SantuyibiaoObject");
}
2026-01-04 16:54:55 +08:00
//裂缝
void MainWindowCurve::s_NewCrack()
{
QStringList sret = this->getSelectWell();
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "FRAC_HOLE.TABLE", "CrackObject");
}
2025-12-30 17:38:11 +08:00
//蝌蚪图
void MainWindowCurve::s_NewShowDip()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建表格曲线
emit CallManage::getInstance()->sig_AddTableLine(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "FRAC_HOLE.TABLE");
return;
}
QStringList sret = this->getSelectWell_New();
2025-12-30 17:38:11 +08:00
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "FRAC_HOLE.TABLE", "tableObject");
}
void MainWindowCurve::s_pinLvAc()
{
2025-12-30 17:38:11 +08:00
int column = -1;
int nW = 160;
2025-12-30 17:38:11 +08:00
if(ui->tableWidget_2->columnCount()==0)
{
return;
}
int iWidth = 0;
if(column < 0)
{
column = ui->tableWidget_2->currentColumn();//列编号从0开始
iWidth = ui->tableWidget_2->columnWidth(column);
}
if(column<0)
{
//当前没有选中井
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
2025-12-30 17:38:11 +08:00
}
if(column%2==0)
{
}
else
{
//空白列
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
QString strWellName = ui->tableWidget_2->item(0, column)->text();
//直接从选中的井获取data记录slf路径
QString strSlfName = ui->tableWidget_2->item(0, column)->data(Qt::UserRole+1).toString();
//设置列宽
ui->tableWidget_2->setColumnWidth(column, iWidth+nW+8);
QStringList dt;
dt << m_strUuid;
2025-12-30 17:38:11 +08:00
dt << strWellName;
dt << strSlfName;
dt << "";
dt << "plObject";
dt << QString::number(nW);
//新建道
emit CallManage::getInstance()->sig_NewCol(dt);
}
2025-12-25 15:10:14 +08:00
void MainWindowCurve::s_NewGanZhuangTu()
{
if(ui->tableWidget_2->columnCount()==0)
{
return;
}
int column = ui->tableWidget_2->currentColumn();//列编号从0开始
if(column<0)
{
//当前没有选中井
2025-12-30 17:38:11 +08:00
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
2025-12-25 15:10:14 +08:00
return;
}
if(column%2==0)
{
}
else
{
//空白列
2025-12-30 17:38:11 +08:00
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
2025-12-25 15:10:14 +08:00
return;
}
QString strWellName = ui->tableWidget_2->item(0, column)->text();
//直接从选中的井获取data记录slf路径
QString strSlfName = ui->tableWidget_2->item(0, column)->data(Qt::UserRole+1).toString();
2025-12-25 15:10:14 +08:00
int iWidth = ui->tableWidget_2->columnWidth(column);
int nW = 320;
//设置列宽
ui->tableWidget_2->setColumnWidth(column, iWidth+nW+8);
//新建道
emit CallManage::getInstance()->sig_NewTrack(m_strUuid, strWellName, strSlfName, "杆状图", "ganzhuangtuObject", nW);
}
void MainWindowCurve::s_roseAc()
{
int nW = 160;
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 << "roseObject";
dt << QString::number(nW);
//新建道
emit CallManage::getInstance()->sig_NewCol(dt);
}
2026-01-17 22:35:34 +08:00
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()
{
if(ui->tableWidget_2->columnCount()==0)
{
return;
}
int column = ui->tableWidget_2->currentColumn();//列编号从0开始
if(column<0)
{
//当前没有选中井
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
if(column%2==0)
{
}
else
{
//空白列
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
QString strWellName = ui->tableWidget_2->item(0, column)->text();
//直接从选中的井获取data记录slf路径
QString strSlfName = ui->tableWidget_2->item(0, column)->data(Qt::UserRole+1).toString();
int iWidth = ui->tableWidget_2->columnWidth(column);
int nW = 320;
//设置列宽
ui->tableWidget_2->setColumnWidth(column, iWidth+nW+8);
//新建道
emit CallManage::getInstance()->sig_NewTrack(m_strUuid, strWellName, strSlfName, "井眼垮塌矢量图", "JyktObject", nW);
}
//井斜方位图
void MainWindowCurve::s_Denv()
{
// QString strSlfName = "";
// QString strLeft = m_leftWidgets->getLeftTreeString();
// if(strLeft.length() > 0)
// {
// QStringList list = strLeft.split("#@@#");//QString字符串分割函数
// if (list.size() > 3)
// {
// strSlfName = list[0];
// }
// }
if(ui->tableWidget_2->columnCount()==0)
{
return;
}
int column = ui->tableWidget_2->currentColumn();//列编号从0开始
if(column<0)
{
//当前没有选中井
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
if(column%2==0)
{
}
else
{
//空白列
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
QString strWellName = ui->tableWidget_2->item(0, column)->text();
//直接从选中的井获取data记录slf路径
QString strSlfName = ui->tableWidget_2->item(0, column)->data(Qt::UserRole+1).toString();
int iWidth = ui->tableWidget_2->columnWidth(column);
int nW = 320;
//设置列宽
ui->tableWidget_2->setColumnWidth(column, iWidth+nW+8);
//新建道
emit CallManage::getInstance()->sig_NewTrack(m_strUuid, strWellName, strSlfName, "井斜方位图", "DenvObject", nW);
}
//图像 成图
void MainWindowCurve::s_DrawImage()
{
// QString strSlfName = "";
// QString strLeft = m_leftWidgets->getLeftTreeString();
// if(strLeft.length() > 0)
// {
// QStringList list = strLeft.split("#@@#");//QString字符串分割函数
// if (list.size() > 3)
// {
// strSlfName = list[0];
// }
// }
if(ui->tableWidget_2->columnCount()==0)
{
return;
}
int column = ui->tableWidget_2->currentColumn();//列编号从0开始
if(column<0)
{
//当前没有选中井
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
if(column%2==0)
{
}
else
{
//空白列
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
QString strWellName = ui->tableWidget_2->item(0, column)->text();
//直接从选中的井获取data记录slf路径
QString strSlfName = ui->tableWidget_2->item(0, column)->data(Qt::UserRole+1).toString();
int iWidth = ui->tableWidget_2->columnWidth(column);
int nW = 320;
//设置列宽
ui->tableWidget_2->setColumnWidth(column, iWidth+nW+8);
//新建道
emit CallManage::getInstance()->sig_NewTrack(m_strUuid, strWellName, strSlfName, "成像", "DrawImageObject", nW);
}
//地质层位道
void MainWindowCurve::s_NewGeoSection()
{
//选中道
if(m_SelectTableItem.m_iTableType==2) {
//新建表格曲线
emit CallManage::getInstance()->sig_AddTableLine(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, "LAYER_DATA");
return;
}
QStringList sret = this->getSelectWell_New();
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "LAYER_DATA", "tableObject");
}
//气测/FMT/射孔/文本
void MainWindowCurve::s_NewJiegutext()
{
QStringList sret = this->getSelectWell();
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "GASLOG", "JiegutextObject");
}
2026-01-06 16:03:55 +08:00
//沉积相
void MainWindowCurve::s_NewLogface()
{
QStringList sret = this->getSelectWell();
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "LITHA", "LogfaceObject");
}
//多臂井径
void MainWindowCurve::s_NewMCals()
{
QStringList sret = this->getSelectWell();
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "FCA2", "MCalsObject");
}
//套管组件
void MainWindowCurve::s_NewTubingstring()
{
QStringList sret = this->getSelectWell();
if(sret.length() <= 0)
return;
//新建井+道+曲线(首条)
NewWellAndTrack(sret.at(0), sret.at(1), "TUBTOOLS", "TubingstringObject");
}
//TDT
void MainWindowCurve::s_NewTDT()
{
int nW = 400;
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 << "tdtObject";
dt << QString::number(nW);
//新建道
emit CallManage::getInstance()->sig_NewCol(dt);
}
void MainWindowCurve::s_NewTrackChangeWidth(QString strWellName, int nW)
2025-10-29 17:23:30 +08:00
{
qDebug() << "MainWindowCurve s_NewTrackChangeWidth";
int column = ui->tableWidget_2->columnCount();
for(int i=0; i<column; i++)
{
if(i%2==0)
{
}
else
{
//空白列
continue;
}
//
QString strWellNameTemp = ui->tableWidget_2->item(0, i)->text();
if(strWellNameTemp==strWellName)
{
int iWidth = ui->tableWidget_2->columnWidth(i);//设置列宽
if(nW<=0)
{
ui->tableWidget_2->setColumnWidth(i, iWidth+g_iOneWidth+6);
}
else
{
ui->tableWidget_2->setColumnWidth(i, iWidth+nW+6);
}
2025-10-29 17:23:30 +08:00
}
}
}
//新建空白道,没有曲线
void MainWindowCurve::s_NewTrack_No_Line(QString strWellName, QString strTrackName)
{
emit CallManage::getInstance()->sig_NewTrack_No_Line(m_strUuid, strWellName, strTrackName);
}
void MainWindowCurve::s_NewTrack_No_Line(QJsonObject topObj, QJsonObject infoObj)
{
emit CallManage::getInstance()->sig_NewTrack_No_Line(m_strUuid, topObj, infoObj);
}
//新建曲线,带属性
void MainWindowCurve::s_AddLine_Property(QString strSlfName, QString strWellName, QString strTrackName, QString strLineName,
double newLeftScale, double newRightScale, QString strScaleType, QColor lineColor, double width, Qt::PenStyle lineStyle, QStringList listOtherProperty)
{
emit CallManage::getInstance()->sig_AddLine_Property(m_strUuid, strSlfName, strWellName, strTrackName, strLineName,
newLeftScale, newRightScale, strScaleType, lineColor, width, lineStyle, listOtherProperty);
}
2025-10-29 17:23:30 +08:00
//新建井+道+曲线(首条)
void MainWindowCurve::NewWellAndTrack(QString strWellName, QString strSlfName, QString strLineName, QString strType)
2025-10-29 17:23:30 +08:00
{
int nW = 0;
if(strType=="SantuyibiaoObject")
{
//斜井三图一表
nW = g_iOneWidth*4;
}
2025-10-29 17:23:30 +08:00
//
if(m_listWell.contains(strWellName))
{
//不在道里,新建道+曲线
//新建道+曲线
emit CallManage::getInstance()->sig_NewTrack(m_strUuid, strWellName, strSlfName, strLineName, strType, nW);
2025-10-29 17:23:30 +08:00
//改变井宽
emit sig_NewTrackChangeWidth(strWellName, nW);
2025-10-29 17:23:30 +08:00
}
else
{
//井没创建,创建井+道+曲线
//新建井
s_NewWell(strWellName, strSlfName);
//m_listWell.push_back(strWellName);//重复添加
2025-10-29 17:23:30 +08:00
//新建道+曲线
emit CallManage::getInstance()->sig_NewTrack(m_strUuid, strWellName, strSlfName, strLineName, strType, nW);
2025-10-29 17:23:30 +08:00
}
}
void MainWindowCurve::dragEnterEvent(QDragEnterEvent* event)
{
qDebug() << "MainWindowCurve dragEnterEvent";
const QMimeData* mimeData = event->mimeData();
// 检查拖拽的数据类型,确定是否接受拖拽
if (event->mimeData()->hasFormat("text/plain")) {
event->acceptProposedAction();
//QApplication::setOverrideCursor(Qt::PointingHandCursor); // 设置鼠标为可添加状态
}
else
{
event->ignore();
//QApplication::setOverrideCursor(Qt::ForbiddenCursor); // 设置鼠标为不可添加状态
2025-10-29 17:23:30 +08:00
}
}
void MainWindowCurve::dragMoveEvent(QDragMoveEvent* event)
{
//qDebug() << "MainWindowCurve dragMoveEvent";
2025-10-29 17:23:30 +08:00
// 可以在这里更新鼠标的位置,根据位置判断是否可以放置
// ...
//dragEnterEvent(event); // 可以使用相同的逻辑
//event->accept();
}
void MainWindowCurve::dropEvent(QDropEvent* event)
{
qDebug() << "MainWindowCurve dropEvent";
// 处理放置动作更新UI或数据
if (event->mimeData()->hasFormat("text/plain")) {
// 获取拖拽的数据
QString strExtern = event->mimeData()->text();
qDebug() << strExtern;
//
QStringList list = strExtern.split("#@@#");//QString字符串分割函数
if (list.size() > 3)
2025-10-29 17:23:30 +08:00
{
QString strSlfName = list[0];
QString strWellName = list[1];
QString strLineName = list[2];
QString strType = list[3];
2025-10-29 17:23:30 +08:00
qDebug() << "strSlfName:" << strSlfName<< " strWellName:" << strWellName << " strLineName:" << strLineName << " strType:" << strType;
2025-10-29 17:23:30 +08:00
if(strType=="curveObject" || strType=="waveObject" || strType=="tableObject")
{
//新建井+道+曲线(首条)
NewWellAndTrack(strWellName, strSlfName, strLineName, strType);
}
2025-10-29 17:23:30 +08:00
}
//QMessageBox::information(this, "提示", strExtern);
// 接受拖拽事件
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
{
// 如果数据格式不正确,不接受拖拽事件
event->ignore();
}
// 恢复鼠标光标
//QApplication::restoreOverrideCursor();
}
void MainWindowCurve::Open(QString fileFull)
{
QString strPrjname = "";
QJsonArray wellsArray;
//清空
m_headsArray.empty();
m_tailsArray.empty();
QJsonParseError jsonError;
// 文件
QFile file(fileFull);
if(file.open(QIODevice::ReadOnly))
{
// 解析JSON
QJsonDocument document = QJsonDocument::fromJson(file.readAll(), &jsonError);
if (!document.isNull() && (jsonError.error == QJsonParseError::NoError))
{
if (document.isObject())
{
QJsonObject object = document.object();
//
if (object.contains("prjname"))
{
QJsonValue value = object.value("prjname");
if (value.isString()) {
strPrjname = value.toString();
qDebug() << "prjname:" << strPrjname;
if(strPrjname != g_prjname)
{
file.close();
qDebug() << "JSON 模板文件项目名称与当前项目不一致!";
return;
}
}
}
//
if (object.contains("iScale"))
{
QJsonValue value = object.value("iScale");
if (value.isDouble()) {
int iScale = value.toInt();
qDebug() << "iScale:" << QString::number(iScale);
//
2026-01-23 18:20:18 +08:00
m_iScale = iScale;
}
}
//
if (object.contains("iY1"))
{
QJsonValue value = object.value("iY1");
if (value.isDouble()) {
int iY1 = value.toInt();
qDebug() << "iY1:" << QString::number(iY1);
//
2026-01-23 18:20:18 +08:00
m_iY1 = iY1;
}
}
//
if (object.contains("iY2"))
{
QJsonValue value = object.value("iY2");
if (value.isDouble()) {
int iY2 = value.toInt();
qDebug() << "iY2:" << QString::number(iY2);
//
2026-01-23 18:20:18 +08:00
m_iY2 = iY2;
}
}
//
if (object.contains("wells"))
{
QJsonValue value = object.value("wells");
if (value.isArray()) {
wellsArray = value.toArray();
qDebug() << "wellsArray number:" << QString::number(wellsArray.size());
//展示所有井
DisplayWells(wellsArray);
}
}
//
if (object.contains("heads"))
{
//true代表从json加载图头、结果表
m_bHeadLoadJson = true;
QJsonValue value = object.value("heads");
if (value.isArray()) {
m_headsArray = value.toArray();
qDebug() << "headsArray number:" << QString::number(m_headsArray.size());
}
}
if (object.contains("tails"))
{
//true代表从json加载图头、结果表
m_bHeadLoadJson = true;
QJsonValue value = object.value("tails");
if (value.isArray()) {
m_tailsArray = value.toArray();
qDebug() << "tailsArray number:" << QString::number(m_tailsArray.size());
}
}
}
}
//
file.close();
qDebug() << "JSON 模板文件读取成功!";
//触发更新
//QTimer::singleShot(2000, this, SLOT(slot_time()));
} else {
qWarning() << "JSON 模板文件打开失败:" << file.errorString();
}
}
2026-01-23 14:53:34 +08:00
//改变道宽
void MainWindowCurve::s_changeWidth(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, int iCurrentCol, int iNewWidth)
{
int columnCount = ui->tableWidget_2->columnCount();//总列数
for(int i=0; i<columnCount; i++)
{
if(i%2==0)
{
}
else
{
//空白列
continue;
}
if( ui->tableWidget_2->cellWidget(1, i) != nullptr )
{
auto myWidget = ui->tableWidget_2->cellWidget(1, i);
if(myWidget)
{
//
FormWell *widgetWell = (FormWell*)myWidget;//获得widget
if(widgetWell)
{
if(widgetWell->m_strUuid==strUuid
&& widgetWell->m_strSlfName==strSlfName
&& widgetWell->m_strWellName==strWellName)
{
int iWellWidth = widgetWell->setColWidth(iCurrentCol, iNewWidth);
//调整井宽
ui->tableWidget_2->setColumnWidth(i, iWellWidth);
2026-01-23 18:20:18 +08:00
break;
2026-01-23 14:53:34 +08:00
}
}
}
}
}
}
void MainWindowCurve::s_changeTrackProperty(QVariantList vlist)
{
QString strUuid = vlist.at(0).toString();
QString strSlfName = vlist.at(1).toString();
QString strWellName = vlist.at(2).toString();
int columnCount = ui->tableWidget_2->columnCount();//总列数
for(int i=0; i<columnCount; i++)
{
if(i%2!=0)
continue;
if( ui->tableWidget_2->cellWidget(1, i) == nullptr )
continue;
auto myWidget = ui->tableWidget_2->cellWidget(1, i);
if(myWidget == nullptr)
continue;
//
FormWell *widgetWell = qobject_cast<FormWell*>(myWidget);//获得widget
if(widgetWell == nullptr)
continue;
if(widgetWell->m_strUuid==strUuid
&& widgetWell->m_strSlfName==strSlfName
&& widgetWell->m_strWellName==strWellName)
{
int iCurrentCol = vlist.at(3).toInt();
QString strProperty = vlist.at(4).toString();
if("道宽(cm)" == strProperty)
{
int iNewWidth = vlist.at(5).toInt();
int iWellWidth = widgetWell->setColWidth(iCurrentCol, iNewWidth);
//调整井宽
ui->tableWidget_2->setColumnWidth(i, iWellWidth);
}
else if("道名称" == strProperty)
{
}
break;
}
}
}
2026-01-23 18:20:18 +08:00
void MainWindowCurve::slot_time()
{
}
2026-01-23 18:20:18 +08:00
//改变缩放比例
void MainWindowCurve::s_changeScale(QString strUuid, int iNewScale)
{
2026-01-23 18:20:18 +08:00
if(m_strUuid==strUuid)
{
}
else
{
return;
}
QProgressBar *progressBar = new QProgressBar(this);
progressBar->setGeometry(100, 100, 500, 30); // 设置进度条的位置和大小
progressBar->setMaximum(100); // 设置最大值为100
progressBar->setValue(0); // 初始值设为0
progressBar->show();
2026-01-23 18:20:18 +08:00
m_iScale = iNewScale;
double dHight = 0;
2026-01-23 18:20:18 +08:00
dHight = (m_iY2-m_iY1)*100.0/(double)m_iScale * g_dPixelPerCm;
if(g_iShow==1)
{
//显示刻度
dHight = dHight+30;
}
if(dHight>32767)
{
dHight = 32767;
}
double dHightOne = dHight+300+100+10;
//设置高度
ui->tableWidget_2->setRowHeight(1, (int)dHightOne);//8020
//--------------------
//
int columnCount = ui->tableWidget_2->columnCount();//总列数
int iSplit = 100 / (columnCount/2+1);
for(int i=0; i<columnCount; i++)
{
if(i%2==0)
{
}
else
{
//空白列
continue;
}
//progressBar->setValue(i*iSplit); // 更新进度条的值
//QCoreApplication::processEvents(); // 让界面更新显示进度条的当前值
if( ui->tableWidget_2->cellWidget(1, i) != nullptr )
{
auto myWidget = ui->tableWidget_2->cellWidget(1, i);
if(myWidget)
{
//
FormWell *widgetWell = (FormWell*)myWidget;//获得widget
if(widgetWell)
{
2026-01-23 18:20:18 +08:00
widgetWell->m_iScale = iNewScale;
widgetWell->setRowHeight(dHight, progressBar, iSplit);
}
}
}
}
//
progressBar->deleteLater();
//update();
}
//改变深度
void MainWindowCurve::s_changeDepth(QString strUuid, QString strSlfName, QString strWellName, int iY1, int iY2)
{
if(m_strUuid==strUuid)
{
}
else
{
return;
}
QProgressBar *progressBar = new QProgressBar(this);
progressBar->setGeometry(100, 100, 500, 30); // 设置进度条的位置和大小
progressBar->setMaximum(100); // 设置最大值为100
progressBar->setValue(0); // 初始值设为0
progressBar->show();
m_iY1 = iY1;
m_iY2 = iY2;
double dHight = 0;
dHight = (m_iY2-m_iY1)*100.0/(double)m_iScale * g_dPixelPerCm;
if(g_iShow==1)
{
//显示刻度
dHight = dHight+30;
}
if(dHight>32767)
{
dHight = 32767;
}
double dHightMax=0;
//--------------------
//
int columnCount = ui->tableWidget_2->columnCount();//总列数
int iSplit = 100 / (columnCount/2+1);
for(int i=0; i<columnCount; i++)
{
if(i%2==0)
{
}
else
{
//空白列
continue;
}
//progressBar->setValue(i*iSplit); // 更新进度条的值
//QCoreApplication::processEvents(); // 让界面更新显示进度条的当前值
if( ui->tableWidget_2->cellWidget(1, i) != nullptr )
{
auto myWidget = ui->tableWidget_2->cellWidget(1, i);
if(myWidget)
{
//
FormWell *widgetWell = (FormWell*)myWidget;//获得widget
if(widgetWell)
{
if(widgetWell->m_strUuid==strUuid
&& widgetWell->m_strSlfName==strSlfName
&& widgetWell->m_strWellName==strWellName)
{
widgetWell->m_iY1 = iY1;
widgetWell->m_iY2 = iY2;
widgetWell->setRowHeight(dHight, progressBar, iSplit);
//break;
}
//
double temp = widgetWell->m_iY2 - widgetWell->m_iY1;
if(dHightMax<temp)
{
dHightMax=temp;
}
}
}
}
}
2026-01-23 18:20:18 +08:00
dHightMax = dHightMax*100.0/(double)m_iScale * g_dPixelPerCm;
double dHightOne = dHightMax+300+100+10;
//设置高度
ui->tableWidget_2->setRowHeight(1, (int)dHightOne);//8020
//
progressBar->deleteLater();
//update();
}
void MainWindowCurve::DisplayWells(QJsonArray wellsArray)
{
QMap<int, int> mapWells;
int id = 0;
int iCount = wellsArray.size();
for(int i=0; i<iCount; i++)
{
QJsonValue wellValue = wellsArray[i];
QJsonObject wellObj = wellValue.toObject();
//
if (wellObj.contains("id"))
{
QJsonValue value = wellObj.value("id");
if (value.isDouble()) {
id = value.toInt();
qDebug() << "id:" << QString::number(id);
//
mapWells.insert(id, i);
}
}
}
for(int id=0; id<iCount; id++)
{
if(mapWells.contains(id*2))
{
int iNum = mapWells.value(id*2);
//按照id顺序展示井
QJsonValue wellValue = wellsArray[iNum];
QJsonObject wellObj = wellValue.toObject();
if (wellObj.contains("info"))
{
QJsonValue value = wellObj.value("info");
if (value.isObject()) {
QJsonObject wellObjInfo = value.toObject();
//展示其中一口井
DisplayWell_One(wellObjInfo);
}
}
}
}
}
//展示其中一口井
void MainWindowCurve::DisplayWell_One(QJsonObject wellObjInfo)
{
QString strWellName = "";
QString strSlfName = "";
QJsonArray tracksArray;
if (wellObjInfo.contains("WellName"))
{
QJsonValue value = wellObjInfo.value("WellName");
if (value.isString()) {
strWellName = value.toString();
qDebug() << "WellName:" << strWellName;
//新建井
//mainWindowCurve->s_NewWell(strWellName);
//s_NewWell(strWellName);
}
}
if (wellObjInfo.contains("SlfName"))
{
QJsonValue value = wellObjInfo.value("SlfName");
if (value.isString()) {
strSlfName = value.toString();
qDebug() << "strSlfName:" << strSlfName;
//新建井
//mainWindowCurve->s_NewWell(strWellName);
//s_NewWell(strWellName);
}
}
//新建井
QString folderPath = GetLogdataPath();
folderPath = folderPath + g_prjname;
strSlfName = folderPath + "/" + "#" + strWellName + "/" + strSlfName;
s_NewWell(strWellName, strSlfName);
//
if (wellObjInfo.contains("formTracks"))
{
QJsonValue value = wellObjInfo.value("formTracks");
if (value.isArray()) {
tracksArray = value.toArray();
qDebug() << "tracksArray number:" << QString::number(tracksArray.size());
//展示所有道
DisplayTracks(tracksArray);
}
}
}
//展示所有道
void MainWindowCurve::DisplayTracks(QJsonArray tracksArray)
{
QMap<int, int> mapTracks;
int id = 0;
int iCount = tracksArray.size();
for(int i=0; i<iCount; i++)
{
QJsonValue trackValue = tracksArray[i];
QJsonObject trackObj = trackValue.toObject();
//
if (trackObj.contains("id"))
{
QJsonValue value = trackObj.value("id");
if (value.isDouble()) {
id = value.toInt();
qDebug() << "id:" << QString::number(id);
//
mapTracks.insert(id, i);
}
}
}
for(int id=0; id<iCount; id++)
{
if(mapTracks.contains(id))
{
int iNum = mapTracks.value(id);
//按照id顺序展示道
QJsonValue trackValue = tracksArray[iNum];
QJsonObject trackObj = trackValue.toObject();
//
QString strTrackName = "";
int nTrackW = 0;
if (trackObj.contains("topinfo") && trackObj.contains("info"))
{
QJsonValue topVal = trackObj.value("topinfo");
QJsonValue infoVal = trackObj.value("info");
if (topVal.isObject() && infoVal.isObject()) {
QJsonObject topObj = topVal.toObject();
QJsonObject infoObj = infoVal.toObject();
//展示其中一道
DisplayTrack_Top(id, topObj, infoObj);
strTrackName = topObj.value("TrackName").toString();
nTrackW = topObj.value("TrackW").toInt();
}
}
// if (trackObj.contains("info"))
// {
// QJsonValue value = trackObj.value("info");
// if (value.isObject()) {
// QJsonObject trackObjInfo = value.toObject();
// //展示其中一道
// DisplayTrack_One(trackObjInfo, strTrackName, nTrackW);
// }
// }
}
}
}
void MainWindowCurve::DisplayTrack_Top(int id, QJsonObject trackTop, QJsonObject trackInfo)
{
//新建道+曲线
s_NewTrack_No_Line(trackTop, trackInfo);//新建空白道,没有曲线
if(id>0)
{
QString strWellName = "";
if (trackTop.contains("WellName"))
{
QJsonValue value = trackTop.value("WellName");
if (value.isString()) {
strWellName = value.toString();
qDebug() << "WellName:" << strWellName;
}
}
int nW = 0;
if (trackTop.contains("TrackW"))
{
QJsonValue value = trackTop.value("TrackW");
nW = value.toInt();
}
//改变井宽
s_NewTrackChangeWidth(strWellName, nW * static_cast<int>(g_dPixelPerCm));
//mainWindowCurve->s_NewTrackChangeWidth(strWellName);
}
}
//展示其中一道
void MainWindowCurve::DisplayTrack_One(QJsonObject trackObjInfo, QString strTrackName, int nW)
{
//
if (trackObjInfo.contains("formInfos"))
{
QJsonValue value = trackObjInfo.value("formInfos");
if (value.isArray()) {
QJsonArray linesArray = value.toArray();
qDebug() << "linesArray number:" << QString::number(linesArray.size());
//展示所有曲线
DisplayLines(linesArray, strTrackName, nW);
}
}
}
//展示所有曲线
void MainWindowCurve::DisplayLines(QJsonArray linesArray, QString strTrackName, int nW)
{
QMap<int, int> mapLines;
int id = 0;
int iCount = linesArray.size();
for(int i=0; i<iCount; i++)
{
QJsonValue lineValue = linesArray[i];
QJsonObject lineObj = lineValue.toObject();
//
if (lineObj.contains("id"))
{
QJsonValue value = lineObj.value("id");
if (value.isDouble()) {
id = value.toInt();
qDebug() << "id:" << QString::number(id);
//
mapLines.insert(id, i);
}
}
}
for(int id=0; id<iCount; id++)
{
if(mapLines.contains(id))
{
int iNum = mapLines.value(id);
//按照id顺序展示曲线
QJsonValue lineValue = linesArray[iNum];
QJsonObject lineObj = lineValue.toObject();
//
if (lineObj.contains("info"))
{
QJsonValue value = lineObj.value("info");
if (value.isObject()) {
QJsonObject lineObjInfo = value.toObject();
//展示其中一条曲线
if(lineObjInfo.value("Type").toString() == "curveObject")
{
DisplayLine_One(lineObjInfo, strTrackName);
}
else
{
DisplayType_One(lineObjInfo, strTrackName, nW);
}
}
}
}
}
}
//展示其中一条曲线
void MainWindowCurve::DisplayLine_One(QJsonObject lineObjInfo, QString strTrackName)
{
QString strSlfName = "";
QString strWellName = "";
// QString strTrackName = "";
QString strLineName = "";
QString strAliasName = "";//显示名称
QString strUnit = "";//单位
//
double newLeftScale = 0;//左刻度
double newRightScale = 500;//右刻度
QString strScaleType;//刻度类型(线性,对数)
//
double width = 3;//线宽
QColor lineColor = QColor(0,0,0);//颜色
Qt::PenStyle lineStyle = Qt::SolidLine;//线形
//岩性填充
QString newHeadFill;//头部图例
QString newTargetLine;//目标曲线
QString newFillType;//填充类型
QString newFillMode;//填充模式
QColor newColor;//填充颜色
QString newLithosImage = "";//岩性图片
float new_vMin;//其他目标曲线
float new_vMax;//其他目标曲线
QString strOtherScaleType;//其他目标曲线,刻度类型(线性,对数)
QColor frontColor(0, 0, 0);//岩性前景色
QColor backColor(255, 255, 255);//岩性背景色
if (lineObjInfo.contains("SlfName"))
{
QJsonValue value = lineObjInfo.value("SlfName");
if (value.isString()) {
strSlfName = value.toString();
2025-11-10 15:51:41 +08:00
//qDebug() << "SlfName:" << strSlfName;
//
QString slffilename=QString("");
int ind=strSlfName.lastIndexOf('\\');
int ind2=strSlfName.lastIndexOf('/');
if(ind2>ind) ind=ind2;
if(ind>-1) {
slffilename = strSlfName.mid(ind+1);
strSlfName = slffilename;
}
}
}
if (lineObjInfo.contains("WellName"))
{
QJsonValue value = lineObjInfo.value("WellName");
if (value.isString()) {
strWellName = value.toString();
2025-11-10 15:51:41 +08:00
//qDebug() << "WellName:" << strWellName;
}
}
// if (lineObjInfo.contains("TrackName"))
// {
// QJsonValue value = lineObjInfo.value("TrackName");
// if (value.isString()) {
// strTrackName = value.toString();
// //qDebug() << "TrackName:" << strTrackName;
// }
// }
if (lineObjInfo.contains("LineName"))
{
QJsonValue value = lineObjInfo.value("LineName");
if (value.isString()) {
strLineName = value.toString();
2025-11-10 15:51:41 +08:00
//qDebug() << "LineName:" << strLineName;
}
}
if (lineObjInfo.contains("AliasName"))
{
QJsonValue value = lineObjInfo.value("AliasName");
if (value.isString()) {
strAliasName = value.toString();
//qDebug() << "strAliasName:" << strAliasName;
}
}
if (lineObjInfo.contains("Unit"))
{
QJsonValue value = lineObjInfo.value("Unit");
if (value.isString()) {
strUnit = value.toString();
//qDebug() << "strUnit:" << strUnit;
}
}
if (lineObjInfo.contains("vmin"))
{
QJsonValue value = lineObjInfo.value("vmin");
if (value.isDouble()) {
newLeftScale = value.toDouble();
2025-11-10 15:51:41 +08:00
//qDebug() << "vmin:" << QString::number(newLeftScale);
}
}
if (lineObjInfo.contains("vmax"))
{
QJsonValue value = lineObjInfo.value("vmax");
if (value.isDouble()) {
newRightScale = value.toDouble();
2025-11-10 15:51:41 +08:00
//qDebug() << "vmax:" << QString::number(newRightScale);
}
}
if (lineObjInfo.contains("ScaleType"))
{
QJsonValue value = lineObjInfo.value("ScaleType");
if (value.isString()) {
strScaleType = value.toString();
2025-11-10 15:51:41 +08:00
//qDebug() << "ScaleType:" << strScaleType;
}
}
if (lineObjInfo.contains("Width"))
{
QJsonValue value = lineObjInfo.value("Width");
if (value.isDouble()) {
width = value.toDouble();
2025-11-10 15:51:41 +08:00
//qDebug() << "Width:" << QString::number(width);
}
}
if (lineObjInfo.contains("lineStyle"))
{
QJsonValue value = lineObjInfo.value("lineStyle");
if (value.isDouble()) {
lineStyle = (Qt::PenStyle)value.toInt();
2025-11-10 15:51:41 +08:00
//qDebug() << "lineStyle:" << QString::number(lineStyle);
}
}
//
if (lineObjInfo.contains("lineColor"))
{
lineColor.setNamedColor(lineObjInfo.value("lineColor").toString());
}
QString folderPath = GetLogdataPath();
folderPath = folderPath + g_prjname;
strSlfName = folderPath + "/" + "#" + strWellName + "/" + strSlfName;
if(strLineName!="")
{
QStringList listOtherProperty;
listOtherProperty.append(strAliasName);
listOtherProperty.append(strUnit);
//新建曲线
s_AddLine_Property(strSlfName, strWellName, strTrackName, strLineName,
newLeftScale, newRightScale, strScaleType, lineColor, width, lineStyle, listOtherProperty);
}
//---------------
if (lineObjInfo.contains("newHeadFill"))
{
QJsonValue value = lineObjInfo.value("newHeadFill");
if (value.isString()) {
newHeadFill = value.toString();
2025-11-10 15:51:41 +08:00
//qDebug() << "newHeadFill:" << newHeadFill;
}
}
if (lineObjInfo.contains("newTargetLine"))
{
QJsonValue value = lineObjInfo.value("newTargetLine");
if (value.isString()) {
newTargetLine = value.toString();
2025-11-10 15:51:41 +08:00
//qDebug() << "newTargetLine:" << newTargetLine;
}
}
if (lineObjInfo.contains("newFillType"))
{
QJsonValue value = lineObjInfo.value("newFillType");
if (value.isString()) {
newFillType = value.toString();
2025-11-10 15:51:41 +08:00
//qDebug() << "newFillType:" << newFillType;
}
}
if (lineObjInfo.contains("newFillMode"))
{
QJsonValue value = lineObjInfo.value("newFillMode");
if (value.isString()) {
newFillMode = value.toString();
2025-11-10 15:51:41 +08:00
//qDebug() << "newFillMode:" << newFillMode;
}
}
//
if (lineObjInfo.contains("newColor"))
{
newColor.setNamedColor(lineObjInfo.value("newColor").toString());
}
if (lineObjInfo.contains("newLithosImage"))
{
QJsonValue value = lineObjInfo.value("newLithosImage");
if (value.isString()) {
newLithosImage = value.toString();
2025-11-10 15:51:41 +08:00
//qDebug() << "newLithosImage:" << newLithosImage;
}
}
if (lineObjInfo.contains("new_vMin"))
{
QJsonValue value = lineObjInfo.value("new_vMin");
if (value.isDouble()) {
new_vMin = value.toDouble();
2025-11-10 15:51:41 +08:00
//qDebug() << "new_vMin:" << QString::number(new_vMin);
}
}
if (lineObjInfo.contains("new_vMax"))
{
QJsonValue value = lineObjInfo.value("new_vMax");
if (value.isDouble()) {
new_vMax = value.toDouble();
2025-11-10 15:51:41 +08:00
//qDebug() << "new_vMax:" << QString::number(new_vMax);
}
}
//
if (lineObjInfo.contains("frontColor"))
{
frontColor.setNamedColor(lineObjInfo.value("frontColor").toString());
}
//
if (lineObjInfo.contains("backColor"))
{
backColor.setNamedColor(lineObjInfo.value("backColor").toString());
}
//
if(newFillMode=="无填充")
{
//emit CallManage::getInstance()->sig_ClearFillMode(m_strUuid, strSlfName, strWellName, strTrackName, strLineName);
}
else //if(newFillMode=="填充")
{
//模板不立刻填充bFillNow=false
emit CallManage::getInstance()->sig_ChangeFillMode(m_strUuid, strSlfName, strWellName, strTrackName, strLineName,
newFillType, newTargetLine, newColor, newLithosImage, newHeadFill,
new_vMin, new_vMax, strOtherScaleType, frontColor, backColor, newFillMode, false);
}
}
void MainWindowCurve::DisplayType_One(QJsonObject lineObjInfo, QString strTrackName, int nW)
{
nW = nW * static_cast<int>(g_dPixelPerCm);
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 << "roseObject";
dt << QString::number(nW);
//新建道
emit CallManage::getInstance()->sig_NewCol(dt);
}
void MainWindowCurve::resizeItem(QString strWellName, double colWidth, double rowHight)
{
int column = ui->tableWidget_2->columnCount();
for(int i=0; i<column; i++)
{
if(i%2==0)
{
}
else
{
//空白列
continue;
}
//
QString strWellNameTemp = ui->tableWidget_2->item(0, i)->text();
if(strWellNameTemp==strWellName)
{
ui->tableWidget_2->setColumnWidth(i, colWidth+8);
}
}
}
void MainWindowCurve::slotContextMenu(QPoint pos)
{
if(ui->tableWidget_2->columnCount()==0)
{
return;
}
int column = ui->tableWidget_2->currentColumn();//列编号从0开始
if(column<0)
{
//当前没有选中井
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
if(column%2==0)
{
}
else
{
//空白列
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
//当前行
int iCurrentRow = ui->tableWidget_2->currentRow();
if(iCurrentRow == 0)
{
QMenu menu(ui->tableWidget_2);
menu.addAction(QIcon(::GetImagePath() + "antialiasing.png"), "删除当前测井图", this, &MainWindowCurve::slotDeleteSelectTrack);
menu.exec(ui->tableWidget_2->mapToGlobal(pos));
}
}
void MainWindowCurve::slotDeleteSelectTrack()
{
int colCount = ui->tableWidget_2->columnCount();
//当前列
int column = ui->tableWidget_2->currentColumn();//列编号从0开始
if(column<0)
{
//当前没有选中井
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
if(column%2==0)
{
}
else
{
//空白列
QMessageBox::warning(this, "提示", "当前没有选中井", "确定");
return;
}
//当前行
int iCurrentRow = ui->tableWidget_2->currentRow();
if(iCurrentRow == 0)
{
if(column==0)
{
if(colCount==1)//只有1口井
{
ui->tableWidget_2->removeColumn(column);
m_listWell.clear();
}
else
{
QString strWellName = ui->tableWidget_2->item(iCurrentRow, column)->text();
m_listWell.removeOne(strWellName);
//
ui->tableWidget_2->removeColumn(column+1);//空白列,注意先删除空白列,否则列号改变
ui->tableWidget_2->removeColumn(column);
}
}
else if(column>1)
{
QString strWellName = ui->tableWidget_2->item(iCurrentRow, column)->text();
m_listWell.removeOne(strWellName);
//
ui->tableWidget_2->removeColumn(column);
ui->tableWidget_2->removeColumn(column-1);//空白列,注意先删除选中列,否则列号改变
}
//resizeWindow();
}
}