logplus/DataMgr/src/InDefTableDlg.cpp

1837 lines
56 KiB
C++
Raw Normal View History

2025-10-30 09:50:15 +08:00
#pragma warning(push,0)
#include "DataHelper.h"
// #include "Family.h"
#include <QMessageBox>
#include <QFileDialog>
#include <QTextStream>
#include "InDefTableDlg.h"
#include "ui_InDefTable.h"
#include "CStringType.h"
// #include "ObjWell.h"
#include "TiShiDlg.h"
#include "ui_TiShi.h"
// #include "DataImport.h"
#include <QHBoxLayout>
#include <QListView>
#include "AdaptionComboBox.h"
//////////////////////////////////////////////////////////////////////////
//#include "SigelWellCtl.h"
//#include "MultWellCtl.h"
#include "geometryutils.h"
#include "BaseFun.h"
#pragma execution_character_set("utf-8")
//extern DEFAULTTABLE DefauleTable[DefTabNum];
extern DEFAULTTABLE *DefauleTable;//[DefTabNum];
extern int DefTabNum;
#pragma warning(pop)
// using namespace pai::ios::welllog;
using namespace Ui;
#define MAPPINGTABLENUM 10
#define MNUMBER 3
BEGIN_OSGGRAPHICS_NAMESPACE
CInDefTableDlg::CInDefTableDlg(int curitemType,QWidget * parent, Qt::WindowFlags flags)
: QDialog(parent,flags),m_sigWell(NULL),m_mutlWell(NULL)
{
WellNameCol=0;//1;
CurItemType=curitemType;
m_pUI = new Ui_InDefTable();
m_pUI->setupUi(this);
m_sigWell=new SigelForm;
m_mutlWell=new MultForm;
m_pUI->tableWidget->setMouseTracking(true);
QObject::connect(m_pUI->okbtn, SIGNAL(clicked()), this, SLOT(slotSave()));
QObject::connect(m_pUI->cancelbtn, SIGNAL(clicked()), this, SLOT(slotCancel()));
QObject::connect(m_pUI->pushButtonFind, SIGNAL(clicked()), this, SLOT(slotOpenFile()));
QObject::connect(m_pUI->comboBox_Table, SIGNAL(currentIndexChanged(int)),this, SLOT(changeTabletype()));
QObject::connect(m_pUI->spinBox_Var,SIGNAL(valueChanged(int)),this,SLOT(slotVarLineChanged(int)));
QObject::connect(m_pUI->spinBox_Data,SIGNAL(valueChanged(int)),this,SLOT(slotDataLineChanged(int)));
// QObject::connect(m_pUI->pushButton_PreView, SIGNAL(clicked()), this, SLOT(slotPreView()));
QObject::connect(m_pUI->checkBox_Space, SIGNAL(clicked()), this, SLOT(slotCheckSpace()));
QObject::connect(m_pUI->checkBox_Comma, SIGNAL(clicked()), this, SLOT(slotCheckComma()));
QObject::connect(m_pUI->checkBox_Semicolon, SIGNAL(clicked()), this, SLOT(slotCheckSem()));
QObject::connect(m_pUI->checkBox_Tab, SIGNAL(clicked()), this, SLOT(slotCheckTab()));
QObject::connect(m_pUI->checkBox_Spa_2, SIGNAL(clicked()), this, SLOT(slotCheckDubSpace()));
QObject::connect(m_pUI->tableWidget, SIGNAL(cellClicked(int,int)), this, SLOT(slotRefreshZd(int,int)));
//whp add 2020.4.20
QObject::connect(m_pUI->comboBox_DefStr,SIGNAL(currentIndexChanged(int)),this, SLOT(slotChangeDefValue()));
QObject::connect(m_pUI->comboBox_DefValue,SIGNAL(currentIndexChanged(int)),this, SLOT(slotChangeDefValue()));
if (!CurItemType)
{setWindowTitle(" 多井离散数据导入交互界面");
m_mutlWell->setupUi(m_pUI->showWellPart);
connect(m_mutlWell->pushButton_SelAll, SIGNAL(clicked()), this, SLOT(slotSelAll()));
connect(m_mutlWell->pushButton_NotSelAll, SIGNAL(clicked()), this, SLOT(slotNotSelAll()));
connect(m_mutlWell->pushButton_ReSel, SIGNAL(clicked()), this, SLOT(slotReverseSel()));
}else
{
setWindowTitle(" 单井离散数据导入交互界面");
m_sigWell->setupUi(m_pUI->showWellPart);
}
m_pUI->lineEdit->setText("");
TableType=DefTabNum;
VarLine=0;//变量名所在行
UnitLine=0;//单位所在行
DataLine=1;//数据开始行
TotalLine=0;
IsSpa=IsTab=IsCom=IsSem=DelDubSpa=0;
//m_pUI->okbtn->setStyleSheet("QPushButton:checked{background-color:green}");
//m_pUI->cancelbtn->setStyleSheet("QPushButton:checked{background-color:blue}");
/*this->setStyleSheet("QPushButton{background-color:black;\
color: white; border-radius: 30px; border: 3px groove gray;\
border-style: outset;}"
"QPushButton:hover{background-color:red; color: white;}"
"QPushButton:pressed{background-color:rgb(85, 170, 255);\
border-style: inset; }");*/
//QHeaderView* headerView = m_pUI->tableWidget->horizontalHeader();
//headerView->setHidden(true); //行名隐藏 隐藏后无法改变列宽了????
}
//whp add 2020.4.20
void CInDefTableDlg::slotChangeDefValue()
{
int FirstCol=0;
if(!CurItemType)FirstCol=1;
int colIndex;
int num=m_pUI->tableWidget->columnCount();
for(int col=0;col<m_pUI->tableWidget->columnCount();col++)
{
if(!col&&!CurItemType)continue;// du多井时第一列是井名
QWidget *widget=m_pUI->tableWidget->cellWidget(0,col);
QComboBox *combox=(QComboBox*)widget;
QString ss=combox->currentText();
if(ss!="不导入")continue;
for(int Row=0;Row<m_pUI->tableWidget->rowCount();Row++)
{
QString DataStr;
if(DefauleTable[TableType].tinfo[col-FirstCol].RepCode!=6)DataStr=m_pUI->comboBox_DefValue->currentText();
else DataStr=m_pUI->comboBox_DefStr->currentText();
m_pUI->tableWidget->setItem(Row+1,col,new QTableWidgetItem(DataStr));
}
}
}
void CInDefTableDlg::mRefresh()
{
slotVarLineChanged(VarLine);
slotDataLineChanged(DataLine);
InitList1();
PreView(1);
}
void CInDefTableDlg:: slotCheckSpace(){IsSpa=!IsSpa;mRefresh();}
void CInDefTableDlg:: slotCheckComma(){IsCom=!IsCom;mRefresh();}
void CInDefTableDlg:: slotCheckSem(){IsSem=!IsSem;mRefresh();}
void CInDefTableDlg:: slotCheckTab(){IsTab=!IsTab;mRefresh();}
void CInDefTableDlg:: slotCheckDubSpace(){DelDubSpa=!DelDubSpa;mRefresh();}
void CInDefTableDlg::changeTabletype()
{
TableType=m_pUI->comboBox_Table->currentIndex();
m_pUI->lineEdit_TableAliasName->setText(m_pUI->comboBox_Table->currentText());
if(TableType < DefTabNum)
{
m_pUI->lineEdit_TableName->setText(DefauleTable[TableType].TableName);
m_pUI->lineEdit_des->setText(DefauleTable[TableType].TableName);
}
else if(TableType == DefTabNum)
{
m_pUI->lineEdit_TableName->setText("Custom");
m_pUI->lineEdit_des->setText("");
}
else{
TableType = DefTabNum;
m_pUI->comboBox_Table->setCurrentIndex(DefTabNum);
m_pUI->lineEdit_TableName->setText("Custom");
m_pUI->lineEdit_des->setText("");
}
PreView(0);
}
void CInDefTableDlg::slotSave()
{
if(m_pUI->lineEdit->text().isEmpty()) {
AfxMessageBox("请输入文件名称");
return;
}
FileName = m_pUI->lineEdit->text();
//accept();
slotEnterOk();
}
/**
*@brief
*/
void CInDefTableDlg::slotCancel()
{
reject ();
}
void CInDefTableDlg::slotOpenFile()
{
QString DataFile = QFileDialog::getOpenFileName(NULL,"打开表数据文件",::GetDataPath(),
"表数据文件(*.txt;*.prn;*.csv;*.las)");
if(DataFile=="")return;
FileName=DataFile;
VarLine=0;//变量名所在行
UnitLine=0;//单位所在行
DataLine=1;//数据开始行
TotalLine=0;
IsSpa=IsTab=IsCom=IsSem=DelDubSpa=0;
Init();
this->resize(this->size() - QSize(1,1));
this->resize(this->size() + QSize(1,1));
}
void CInDefTableDlg::PreView(bool RefreshW)//RefreshW是否刷新勾选井名表格
{
if(!TotalLine)
return;//whp add 2020.3.6
m_pUI->tableWidget->clearContents();
if(!DataLine)
return;
//当前选择项是“井”,第一列是井名
int WellNum = 0;
WellNameList.clear();
#pragma region 确定数据列数-->TableCol
int TableCol = 0;
if(TableType < DefTabNum)
{
TableCol = DefauleTable[TableType].ZdNum;
if(!CurItemType)
TableCol += 1;
}
else if(TableType == DefTabNum) //自定义表
{
if(VarLine)
TableCol = VarNameList.size();
else TableCol = VarNameList.size();
}
else{
TableType = DefTabNum;
if(VarLine)
TableCol = VarNameList.size();
}
m_pUI->tableWidget->setColumnCount(TableCol);
#pragma endregion
QStringList header;
if(!CurItemType)
header << "井名";
#pragma region 字段名-->tableWidget
if(TableType < DefTabNum)
{
for(int i = 0; i < DefauleTable[TableType].ZdNum; i++)
header << QString(QLatin1String(DefauleTable[TableType].tinfo[i].Name));
}
else
{
if(!CurItemType)
for(int i = 1; i < VarNameList.size(); i++)
header << VarNameList.at(i);
else
for(int i = 0; i < VarNameList.size(); i++)
header << VarNameList.at(i);
}
m_pUI->tableWidget->setHorizontalHeaderLabels(header);
#pragma endregion
if(TableType<DefTabNum){
if(DefauleTable[TableType].ZdNum < 10)
m_pUI->tableWidget->horizontalHeader()->resizeSections(QHeaderView::Stretch);
else
m_pUI->tableWidget->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
}
else {
m_pUI->tableWidget->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
}
m_pUI->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
#pragma region 生成comboBox内容-->header
header.clear();
int len=DataList.size();
if(VarLine) //若已发现数据中的字段名生成带有字段名的header
{
for(int i = 0; i < VarNameList.size(); i++)
header << "" + QString::number(i + 1) + "列:" + VarNameList[i];
len = VarNameList.size();
}
else //若没有发现字段名根据数据列数生成非字段名的header
for(int i = 0; i < DataList.size(); i++)
header << "" + QString::number(i + 1) + "";//QString::number(i+1);
//whp add 2020.1.8
header<<"不导入"; //额外情况
//whp change 2020.3.6
//m_pUI->tableWidget->setRowCount(TotalLine-DataLine+1+1);
//2020.8.2 for刷新慢
#pragma endregion
#pragma region 设置table行数
int LineNum = MapData.count(); //数据行数
//if(MapData.count()>=100)LineNum=100;
m_pUI->tableWidget->setRowCount(LineNum);//MapData.count()+1);
#pragma endregion
int FirstCol = 0;
if(!CurItemType)
FirstCol = 1;
//首行为字段选择行
#pragma region 初次生成首行的选择框,
for(int i = 0; i < TableCol; i++)
{
AdaptionComboBox *comboBox = new AdaptionComboBox();
//comboBox->setEditable(true);
comboBox->addItems( header ); //每个选择框中的内容相同
if(!i && !CurItemType) //首列且是“井”
{
comboBox->setCurrentIndex(WellNameCol); //指向井名列
}
else
{
int sel = VarNameList.size(); //先指向“不导入”
if(TableType == DefTabNum) //按实际数据字段列顺序即可
sel = i;
#pragma region 确定该字段是数据中的哪一列从0开始
else
{
QString name = QString(QLatin1String(DefauleTable[TableType].tinfo[i-FirstCol].Name));
for(int m = 0; m < VarNameList.size(); m++)
{
if(VarNameList[m].toUpper() == name.toUpper())
{
sel = m;
break;
}
}
}
#pragma endregion
comboBox->setCurrentIndex(sel); //确定初始选择框中的默认内容
}
//信槽链接——当前值改变——》slotComboxSelectChange(int)
connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotComboxSelectChange(int)));
comboBox->setProperty("row", 0);
comboBox->setProperty("col", i);
m_pUI->tableWidget->setCellWidget( 0, i, comboBox );
//slotRefreshZd(0,i);//whp add 2020.1.8
}
#pragma endregion
//whp change 2020.1.8
int colIndex;
#pragma region 将数值填入
for(int Row = 0; Row < LineNum; Row++) //遍历每行数据
{
QStringList List = MapData.find(Row).value();
QString DataStr;
for(int i = 0; i < TableCol; i++)
{
if(!i && !CurItemType) //井的第0列是井名
{
colIndex=WellNameCol;
}
#pragma region 确定该字段是数据中的哪一列从0开始--> colIndex
else
{
int sel = VarNameList.size(); //不导入
if(TableType == DefTabNum)
sel = i;
else
{
QString name = QString(QLatin1String(DefauleTable[TableType].tinfo[i - FirstCol].Name));
for(int m = 0; m < VarNameList.size(); m++)
{
if(VarNameList[m].toUpper() == name.toUpper())
{
sel=m;
break;
}
}
}
colIndex=sel;
}
#pragma endregion
#pragma region 提取该行该列值
if(colIndex>=0&&colIndex < List.size())
DataStr = List[colIndex];
else
{
if(TableType==DefTabNum)
DataStr="";
else{
if(DefauleTable[TableType].tinfo[i-FirstCol].RepCode != 6)
DataStr = m_pUI->comboBox_DefValue->currentText();
else
DataStr = m_pUI->comboBox_DefStr->currentText();
}
}
m_pUI->tableWidget->setItem( Row+1, i, new QTableWidgetItem(DataStr));
#pragma endregion
}
}
#pragma endregion
#pragma region 井名处理
if(RefreshW && !CurItemType)//当前选择项是“井”时,显示所有井名
{
//统计所有井名
/*int num=Mm_pUI->tableWidget->rowCount();//3.6
for(int i=1;i<m_pUI->tableWidget->rowCount();i++)
{
bool flag=0;
QString DataStr=List[WellNameCol];//m_pUI->tableWidget->item(i,0)->text();
for(int j=0;j<WellNameList.size();j++)
{
if(WellNameList.at(j)!=DataStr)continue;
flag=1;break;
}
if(!flag)WellNameList.append(DataStr);
}*/
int num = MapData.count();
for(int i = 0; i < num; i++)
{
QStringList List=MapData.find(i).value();
bool flag=0;
QString DataStr=List[WellNameCol];//m_pUI->tableWidget->item(i,0)->text();
for(int j=0;j<WellNameList.size();j++)
{
if(WellNameList.at(j)!=DataStr)
continue;
flag=1;
break;
}
if(!flag)
WellNameList.append(DataStr);
}
//20191227
m_mutlWell->tableWidget_WellName->clearContents();
m_mutlWell->tableWidget_WellName->setColumnCount(1);
QStringList header;
header<<"导入井名";
m_mutlWell->tableWidget_WellName->setHorizontalHeaderLabels(header);
m_mutlWell->tableWidget_WellName->horizontalHeader()->setStretchLastSection(true);
m_mutlWell->tableWidget_WellName->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
m_mutlWell->tableWidget_WellName->setRowCount(WellNameList.size());
for(int i=0;i<WellNameList.size();i++)
{
m_mutlWell->tableWidget_WellName->setItem(i,0,new QTableWidgetItem(WellNameList.at(i)));
m_mutlWell->tableWidget_WellName->item(i,0)->setCheckState(Qt::Checked);
}
}
#pragma endregion
}
void CInDefTableDlg::slotVarLineChanged(int LineNo)//变量名所在行
{
VarLine=LineNo;
QFile file(FileName);
if(!file.open(QIODevice::ReadOnly )) {
AfxMessageBox("文件无法打开!");
return;
}
char*pLine=new char[5000];
//略过变量名行前的行
for(int i=0;i<LineNo-1;i++){
file.readLine(pLine,50000);
}
#pragma region whp add 自动匹配缺省表(表类型)
file.readLine(pLine,50000);
{
char *p=strstr(pLine,"\r\n");
if(p) *p=0;
}
QByteArray line=pLine;
line=line.toUpper();
VarNameList = GetStringList(line,IsSpa,IsTab,IsCom,IsSem,DelDubSpa);//line.split(",");
for(int i = 0; i < DefTabNum; i++) //遍历所有表类型
{
int num=0;
for(int j = 0; j < DefauleTable[i].ZdNum; j++) //ZdNum暂且猜测是该表类型下拥有的字段数
{
QString zdm = QString(QLatin1String(DefauleTable[i].tinfo[j].Name)).toUpper();
if(line.indexOf(zdm) >= 0) //数据中有该字段
num++;
}
if(num == DefauleTable[i].ZdNum) //该表类型符合当前数据文件
{
TableType = i;
m_pUI->comboBox_Table->setCurrentIndex(i); //修改窗口的表类型显示
break;
}
}
#pragma endregion
if(CurItemType==0)
for(int i=0;i<VarNameList.size();i++)
{
QString str=VarNameList.at(i).toUpper();
if(str.indexOf("WELLNAME")>=0)
{
WellNameCol=i;//+1;
break;
}
}
file.close();
InitList1();
PreView(1);
delete pLine;
}
void CInDefTableDlg::slotDataLineChanged(int LineNo)//数据开始行
{
DataLine=LineNo;
QFile file(FileName);
file.open(QIODevice::ReadOnly );
char*pLine=new char[5000];
for(int i=0;i<LineNo-1;i++){
file.readLine(pLine,50000);
}
file.readLine(pLine,50000);
{
char *p=strstr(pLine,"\r\n");
if(p) *p='\0';
}
QByteArray line=pLine;
DataList = GetStringList(line,IsSpa,IsTab,IsCom,IsSem,DelDubSpa);//line.split(",");
delete pLine;
file.close();
InitList1();
PreView(1);
}
bool CInDefTableDlg::Init()
{
//AfxMessageBox("ddd");
QHBoxLayout *hboxLayout=new QHBoxLayout();
MaxCol=0; ////预览数据最大列数
m_pUI->showWellPart->setLayout(hboxLayout);
QFile file(FileName);
file.open(QIODevice::ReadOnly );
int Row=0;
char*pLine=new char[5000];
QByteArray line, line1 = "";
#pragma region 自动判断需要使用的分隔符并打钩
int DubTab=-1,DubSem=-1,DubCom=-1,DubSpa=-1;//是否有连续的Tab、逗号、分号和空格
int Tab=-1,Sem=-1,Com=-1,Spa=-1;//是否有Tab、逗号、分号和空格分隔符
while(!file.atEnd())
{
file.readLine(pLine,5000);
{
char *p=strstr(pLine,"\r\n");
if(p) *p='\0';
}
line = pLine;
if(Row<100) //仅仅检查前100行是否有连续空格、单空格、Tab、逗号、分号
{
//if(DubTab<0)DubTab=line.indexOf(" ");
//if(DubSem<0)DubSem=line.indexOf(";;");
//if(DubCom<0)DubCom=line.indexOf(",,");
if(DubSpa<0)DubSpa=line.indexOf(" ");
if(Tab<0)Tab=line.indexOf(" ");
if(Sem<0)Sem=line.indexOf(";");
if(Com<0)Com=line.indexOf(",");
if(Spa<0)Spa=line.indexOf(" ");
}
//m_pUI->textEdit->append("Line "+QString::number(Row+1)+":"+line);
Row++;
}//分隔符选择框
if(Tab>=0){
IsTab=1;
m_pUI->checkBox_Tab->setChecked(IsTab);
}
if(Sem>=0){
IsSem=1;
m_pUI->checkBox_Semicolon->setChecked(IsSem);
}
if(Com>=0){
IsCom=1;
m_pUI->checkBox_Comma->setChecked(IsCom);
}
if(Spa>=0){
IsSpa=1;
m_pUI->checkBox_Space->setChecked(IsSpa);
}
if(DubSpa>=0){
DelDubSpa=1;
m_pUI->checkBox_Spa_2->setChecked(DelDubSpa);
}
#pragma endregion
m_pUI->spinBox_Var->setMinimum(0);m_pUI->spinBox_Var->setMaximum(Row);
m_pUI->spinBox_Data->setMinimum(0);m_pUI->spinBox_Data->setMaximum(Row);
m_pUI->comboBox_DefValue->addItem("-99999.");
m_pUI->comboBox_DefValue->addItem("-9999.");
m_pUI->comboBox_DefValue->addItem("-999.25");
m_pUI->comboBox_DefValue->addItem("-32767");
m_pUI->comboBox_DefValue->addItem("0");//whp add 2020.4.9
m_pUI->comboBox_DefStr->addItem("");
m_pUI->comboBox_DefStr->addItem("NULL");
m_pUI->comboBox_DefStr->addItem("NONE");
//初步判断变量行和数据行
file.seek(0);
int pos=Row;
if(Row > 20)
pos = Row - 1;//尽量避开尾部空行*********************************
MaxRow = pos; //总行数
#pragma region 记录最大列数
for(int i = 0; i < pos; i++)
{
file.readLine(pLine,50000);
{
char *p=strstr(pLine,"\r\n");
if(p) *p='\0';
}
QByteArray line=pLine;
DataList=GetStringList(line, IsSpa, IsTab, IsCom, IsSem, DelDubSpa);
if(DataList.size() < 2)continue; //数据量过少的直接抛弃*********************
line1 = line;
if(MaxCol < DataList.size())
MaxCol = DataList.size(); //重置最大列数初始为0
}
if(MaxCol==0)
{
QMessageBox::warning(NULL,"错误"," 无法识别数据文件:\r\n"+FileName);
file.close();
delete pLine;
return 0;
}
#pragma endregion
//保存末行的列数,暂且作为数据列数
DataList = GetStringList(line1,IsSpa,IsTab,IsCom,IsSem,DelDubSpa);//line.split(",");//取数据行
int VarNum=DataList.size();
//if(MaxCol<VarNum)MaxCol=VarNum;
#pragma region 确定字段名起始行,以及数据起始行
file.seek(0);
for(int i = 0; i < pos - 1; i++)//**************************
{
file.readLine(pLine,50000);
{
char *p=strstr(pLine,"\r\n");
if(p) *p='\0';
}
line=pLine;
DataList=GetStringList(line,IsSpa,IsTab,IsCom,IsSem,DelDubSpa);//line.split(",");//取变量名行
//if(MaxCol<DataList.size())MaxCol=DataList.size();
bool NotVarLine=0;
if( VarNum == DataList.size())//找到符合数据行列数要求的行,初步判断为字段名行或者数据行*********************************************
{
for(int j = 0; j < VarNum; j++)
{
if(mIsNumber(DataList[j]))
{
NotVarLine=1; //非字段名行
break;
}
}
if(NotVarLine){ //认为是数据行,跳出(实际数据行数 = i+1
DataLine = i + 1;
break;
}
VarLine=i+1;
DataLine=i+2;
break;
}
}
#pragma endregion
file.close();
delete pLine;
m_pUI->spinBox_Var->setValue(VarLine);
m_pUI->spinBox_Data->setValue(DataLine);
slotVarLineChanged(VarLine);
TotalLine=Row;
if(VarLine || DataLine)
{
InitList1();
PreView(1);
}
return 1;
}
//处理上面的table
void CInDefTableDlg::InitList1()
{
if(!TotalLine)
return;//whp add 2020.3.6
int ZdNum;
if(VarLine)//字段名行数
ZdNum = VarNameList.size(); //列数(字段数)
else
{
if(VarNameList.size()>DataList.size()) ZdNum=VarNameList.size();
else ZdNum = DataList.size();
}
if(ZdNum <= 0)
return;
MapData.clear();
m_pUI->tableWidget_1->clearContents();
m_pUI->tableWidget_1->setColumnCount(MaxCol);//设置表格最大列数MaxCol 最大列数, tableWidget->setRowCount(10);是设置行数
QStringList header;
for(int i = 0; i < MaxCol; i++)//for(int i=0;i<ZdNum;i++)
{
if(VarLine <= 0 || i >= ZdNum) //不确定该列的字段名
header << "" + QString::number(i+1) + "";
else
header << "" + QString::number(i+1) + "\r\n" + VarNameList.at(i);
}
m_pUI->tableWidget_1->setHorizontalHeaderLabels(header); //设置表头
m_pUI->tableWidget_1->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
QFile file(FileName);
file.open(QIODevice::ReadOnly );
m_pUI->tableWidget_1->setRowCount(MaxRow + 10); //设置行数10行作为额外行
int Row = 0, row = 0; //row记录当前待处理行
QByteArray line;
char*pLine=new char[5000];
//所有行遍历开始
while(!file.atEnd())
{
file.readLine(pLine,50000);
{
char *p=strstr(pLine,"\r\n");
if(p) *p='\0';
}
line=pLine;
#pragma region 将该行内容写入tableWidget_1
QStringList List = GetStringList(line,IsSpa,IsTab,IsCom,IsSem,DelDubSpa);
QString DataStr;
//if(row<100) //2020.8.2 for刷新慢
{
for(int i = 0; i < MaxCol; i++)
{
if(i < List.size())
DataStr = List[i];
else
DataStr="";
//将new QTableWidgetItemDataStr作为一个元素值放入对应位置row行i列
m_pUI->tableWidget_1->setItem(row, i, new QTableWidgetItem(DataStr));//List[colIndex[i]]));
}
}
#pragma endregion
row++;
#pragma region 如果是空行就不用再判断是不是数据行了
QString sss;
bool IsNullLine = 1;
for(int kk = 0; kk < List.size(); kk++)
{
sss = List.at(kk);
if(sss != ""){
IsNullLine = 0;
break;
}
}
if(IsNullLine)
continue;
#pragma endregion
#pragma region 将数据行内容写入MapData
//m_pUI->tableWidget_1->setRowCount(Row+1);
if(Row >= DataLine - 1) //DataLine是实际行数因此要减1 判断当前处理行是否属于数据行
MapData.insert(Row - (DataLine - 1), List);//MapData.insert(Row,List);whp change 2020.5.21
#pragma endregion
Row++;
}//while(!textstream.atEnd())
delete pLine;
//2020.8.2 for刷新慢
m_pUI->tableWidget_1->setRowCount(row); //重置table行数
//if(row>=100)m_pUI->tableWidget_1->setRowCount(100);
file.close();
if(!CurItemType)
{
/* m_pUI->comboBox_WellName->clear();
for(int i=0;i<ZdNum;i++)m_pUI->comboBox_WellName->addItem(""+QString::number(i+1)+"");
m_pUI->comboBox_WellName->setCurrentIndex(0);*/
}
}
BOOL CInDefTableDlg::mIsNumber(QString str)//判断字符串是否为数值
{
QByteArray ba = str.toLatin1();//QString 转换为 char*
const char *buf = ba.data();
int len=strlen(str.toStdString().c_str());//str.length();//whp change 2020.3.16
int dig[30];
int DotNum=0;//小数点个数
BOOL IsDigital=1;
for(int i=0;i<len;i++)
{
if(i==0&&buf[i]=='-')continue;//可能是负数
if(buf[i]=='.')DotNum++;
else if(!isdigit(buf[i])){IsDigital=0;break;}
if(DotNum>1){IsDigital=0;break;}
}
if(!IsDigital)return 0;//字符串0
else return 1;//是数值
}
void CInDefTableDlg::slotRefreshZd(int row,int col)
{
//刷新当前字段内容
if(row)return;
QWidget *widget=m_pUI->tableWidget->cellWidget(row,col);
QComboBox *combox=(QComboBox*)widget;
int colIndex=combox->currentIndex();
int FirstCol=0;
if(!CurItemType)FirstCol=1;
for(int Row=0;Row<MapData.count();Row++)
{
QStringList List=MapData.find(Row).value();
QString DataStr;
if(colIndex>=0&&colIndex<List.size())DataStr=List[colIndex];
else
{
if(DefauleTable[TableType].tinfo[col-FirstCol].RepCode!=6)DataStr=m_pUI->comboBox_DefValue->currentText();
else DataStr=m_pUI->comboBox_DefStr->currentText();
}
m_pUI->tableWidget->setItem(Row+1,col,new QTableWidgetItem(DataStr));//List[colIndex[i]]));
if(!CurItemType)//当前选择项是“井”时,统计所有井名
{
if(col==0)
{
bool flag=0;
DataStr=DataStr.toUpper();
for(int j=0;j<WellNameList.size();j++)
{
if(WellNameList.at(j)!=DataStr)continue;
flag=1;break;
}
if(!flag)WellNameList.append(DataStr);
}
}
}
//当前选择项是“井”时,刷新井名列表
//////////////////////////////////////////////////////////////////////////
if(CurItemType==0&&row==0)
{
m_mutlWell->tableWidget_WellName->clearContents();
m_mutlWell->tableWidget_WellName->setColumnCount(1);
QStringList header;
header<<"井名";
m_mutlWell->tableWidget_WellName->setHorizontalHeaderLabels(header);
m_mutlWell->tableWidget_WellName->horizontalHeader()->setStretchLastSection(true);
m_mutlWell->tableWidget_WellName->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
m_mutlWell->tableWidget_WellName->setRowCount(WellNameList.size());
for(int i=0;i<WellNameList.size();i++)
{
m_mutlWell->tableWidget_WellName->setItem(i,0,new QTableWidgetItem(WellNameList.at(i)));
m_mutlWell->tableWidget_WellName->item(i,0)->setCheckState(Qt::Checked);
}
}
}
void CInDefTableDlg::slotSelAll()
{
for(int i=0;i<WellNameList.size();i++)m_mutlWell->tableWidget_WellName->item(i,0)->setCheckState(Qt::Checked);
}
void CInDefTableDlg::slotNotSelAll()
{
for(int i=0;i<WellNameList.size();i++)
m_mutlWell->tableWidget_WellName->item(i,0)->setCheckState(Qt::Unchecked);
}
//mult well
void CInDefTableDlg::slotReverseSel()
{
//////////////////////////////////////////////////////////////////////////
for(int i=0;i<WellNameList.size();i++)
{
Qt::CheckState eState= m_mutlWell->tableWidget_WellName->item(i,0)->checkState();
if (eState==Qt::Checked)m_mutlWell->tableWidget_WellName->item(i,0)->setCheckState(Qt::Unchecked);
else m_mutlWell->tableWidget_WellName->item(i,0)->setCheckState(Qt::Checked);
}
}
void CInDefTableDlg::slotEnterOk()
{
int ResultCol2;
int ResultCol[10] = {-1};
int ResultCol2Map[10] = {-1};
int SpColNum = 0;
bool TranResult = 0;
QStringList tempList;
QStringList ResultList;
map<QString, QString> ResultMap; //文字, 数值
map<QString, QString> GujingMap;
map<QString, QString> CoreOilMap;
map<QString, QString> CoreLithMap;
map<QString, QString> CorecolorMap;
int mappingTable[MAPPINGTABLENUM] = {0};
#pragma region 加载需要的映射表
if(TableType < DefTabNum)
{
//为了多表部分可以运行,暂时留着
if(DefauleTable[TableType].TableName == "RESULT")
{
#pragma region RESULT解释结论表类型
#pragma region 确定result字段所在列数+提取该列comboBox combox
if(CurItemType) //非“井”
ResultCol2 = 4;
else
ResultCol2 = 5;
QWidget *widget = m_pUI->tableWidget->cellWidget(0, ResultCol2);
QComboBox *combox = (QComboBox*)widget;
#pragma endregion
if(combox->currentText() != "不导入")
{
#pragma region TranResult标签值
for(int i = 1; i < m_pUI->tableWidget->rowCount(); i++)
{
QString str = m_pUI->tableWidget->item(i, ResultCol2)->text();
if(DataHelper::StrType(str) == 6)//结论列是文字结论,需要转换(6:文字结论, 4浮点数 1整型)
{
TranResult = 1;
break;
}
}
#pragma endregion
if(TranResult)
{
#pragma region 打开RESULT.ini文件并传入 ResultList
QString ConfigName = ::GetConfPath() + "RESULT.ini";
QFile InFile3(ConfigName);
if( !InFile3.open(QIODevice::ReadOnly ) )
{
QMessageBox::warning(NULL, "提示", "打开解释结论配置文件" + ConfigName + "错误");
}
else
{
QTextStream textstream3( &InFile3 );
QString line;
while(!textstream3.atEnd())
{
line = textstream3.readLine();
if(line.length() <= 1)
continue;
ResultList.append(line);
}
InFile3.close();
}
#pragma endregion
}
}
#pragma endregion
}
//20201126 GZL change
for(int zdc = 0; zdc < DefauleTable[TableType].ZdNum; zdc++)
{
QStringList ress;
ress.append(QString(DefauleTable[TableType].tinfo[zdc].Reserved));
if(ress[0].toFloat() < 1)
continue;
#pragma region 记录特殊字段所在列(标准表中的列数)
if(CurItemType) //非“井”
ResultCol[SpColNum] = zdc;
else
ResultCol[SpColNum] = zdc + 1;
#pragma endregion
int n;
QString mapName;
foreach(QString res, ress){
n = res.toInt() - 1;
if(n >= 0)
ResultCol2Map[SpColNum++] = n + 1;
if(n >= 0 && !mappingTable[n]){ //当前未加载该maptable
#pragma region 加载所需maptable
mappingTable[n] = n + 1;
switch(mappingTable[n]){
case 1:
mapName = "RESULT";
break;
case 2:
mapName = "GujingOrder";
break;
case 3:
mapName = "CoreOil";
break;
case 4:
case 7:
mapName = "CoreLith";
break;
case 5:
mapName = "Corecolor";
break;
}
#pragma region 打开映射文件
QString ConfigMapName = ::GetConfPath() + mapName + ".ini";
QFile InFile(ConfigMapName);
if( !InFile.open(QIODevice::ReadOnly ) )
{
QMessageBox::warning(NULL, "提示", "打开解释结论配置文件" + ConfigMapName + "错误");
}
QString ConfigMapName2;
if(mapName == "Corecolor")
ConfigMapName2 = ::GetConfPath() + "colorind.ini";
else
ConfigMapName2 = ::GetConfPath() + mapName + "ind.ini";
QFile InFile2(ConfigMapName2);
if( !InFile2.open(QIODevice::ReadOnly ) )
{
QMessageBox::warning(NULL, "提示", "打开解释结论配置文件" + ConfigMapName2 + "错误");
}
#pragma endregion
QTextStream textstream( &InFile );
QString line;
tempList.clear();
while(!textstream.atEnd())
{
line = textstream.readLine();
if(line.length() < 1)
continue;
tempList.append(line);
}
InFile.close();
QTextStream textstream2( &InFile2 );
int linekeyNum = 0;
while(!textstream2.atEnd())
{
line = textstream2.readLine();
if(line == "")
continue;
if(linekeyNum >= tempList.count()){
QMessageBox::warning(NULL, "提示", "配置文件" + mapName + "ind.ini可能出错请查看并修改");
break;
}
switch(mappingTable[n]){
case 1:ResultMap.insert(pair<QString, QString>(tempList[linekeyNum++], line));break;
case 2:GujingMap.insert(pair<QString, QString>(tempList[linekeyNum++], line));break;
case 3:CoreOilMap.insert(pair<QString, QString>(tempList[linekeyNum++], line));break;
case 4:
case 7:
CoreLithMap.insert(pair<QString, QString>(tempList[linekeyNum++], line));
break;
case 5:CorecolorMap.insert(pair<QString, QString>(tempList[linekeyNum++], line));break;
}
}
InFile2.close();
#pragma endregion
}
}
}
}
#pragma endregion
{
int ColNum;
#pragma region 单井导入
if(CurItemType)
{
if(TableType < DefTabNum)
ColNum = DefauleTable[TableType].ZdNum;
else
ColNum = VarNameList.count();
CLogIO *logio = new CLogIO();
if(!logio->Open(WellFileName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
delete logio;
QMessageBox::warning(NULL,"提示","打开文件"+WellFileName+"错误\r\n无法导入数据表");
//MapData.clear();
return ;
}
QString TableName = m_pUI->lineEdit_TableName->text();
char tn[100];
strcpy(tn, TableName.toStdString().c_str());
int iIndex = logio->OpenTable(tn);
if(iIndex >= 0)
{//whp 2019.12.28 添加"放弃"选项
#pragma region 已有重名table情况
QMessageBox box(QMessageBox::Warning, "提示","数据表" + TableName + "已存在\r\n是否继续导入?");
box.setStandardButtons (QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel|QMessageBox::Ignore);
box.setButtonText (QMessageBox::Yes,QString("合并"));
box.setButtonText (QMessageBox::No,QString("另存"));//替换
box.setButtonText (QMessageBox::Cancel,QString("放弃"));//另存
box.setButtonText (QMessageBox::Ignore,QString("替换"));//放弃
int flag1 =box.exec ();
if(flag1 == QMessageBox::No)//另存Cancel
{
while(1)
{
TableName += "NEW";
if(strlen(TableName.toStdString().c_str()) > 64)//if(TableName.length()>64)//whp change 2020.3.16
{
QMessageBox::warning(NULL,"提 示","数据表名" + TableName + "过长\r\n无法导入");
//MapData.clear();
delete logio;
return;
}
if(logio->FindSlfObjectIndex(TableName.toStdString().c_str(),0)<0)break;
}
strcpy(tn,TableName.toStdString().c_str());
logio->CloseTable(iIndex);
iIndex=-1;
}
else if(flag1==QMessageBox::Ignore){
logio->DeleteSlfObject(tn);
iIndex = -1;
}//覆盖
else if(flag1==QMessageBox::Yes)//合并
{
if(logio->GetTableFieldCount(iIndex) != ColNum)//DefauleTable[TableType].ZdNum)
{
int flag = QMessageBox::warning(this,tr("警告"),
"数据表"+WellFileName+"已存在\r\n但与要导入的表数据字段数不一致,是否替换掉原数据表,重新生成新表",QMessageBox::Yes,QMessageBox::No);
if(flag == QMessageBox::Yes)
{
logio->DeleteSlfObject(tn);iIndex=-1;
}
else
{
AfxMessageBox("放弃导入");
logio->CloseTable(iIndex);
delete logio;
return;
}
}
}
else //if(flag1==QMessageBox::Cancel)//放弃Ignore
{
logio->CloseTable(iIndex);
delete logio;
AfxMessageBox("放弃导入");//"数据表导入失败");
return;
}
#pragma endregion
}
if (iIndex < 0)
{
#pragma region 没有重名情况
QString name, len, ty, bk, hz,unit,hunit;
if(TableType < DefTabNum)
{
#pragma region 标准表
ColNum = DefauleTable[TableType].ZdNum;
for(int i = 0; i < DefauleTable[TableType].ZdNum; i++) //遍历该table所有字段
{
name +=DefauleTable[TableType].tinfo[i].Name;
len += QString::number(DefauleTable[TableType].tinfo[i].CodeLength);//Length);
ty += QString::number(DefauleTable[TableType].tinfo[i].RepCode);
bk += QString(DefauleTable[TableType].tinfo[i].Reserved).toInt()>0?DefauleTable[TableType].tinfo[i].Reserved:"0";
hz +=DefauleTable[TableType].tinfo[i].HZName;
if(stricmp(DefauleTable[TableType].tinfo[i].Unit,"NONE")==0)
{
unit +="";
}
else unit +=DefauleTable[TableType].tinfo[i].Unit;
hunit +=DefauleTable[TableType].tinfo[i].HZUnit;
if(i < DefauleTable[TableType].ZdNum - 1) {
name+=",";
len+=",";
ty+=",";
bk+=",";
hz+=",";
unit+=",";
hunit+=",";
}
}
#pragma endregion
}
else
{
#pragma region 非标准表
ColNum=VarNameList.count();
int *FieldType=new int[ColNum];
for(int i=0;i<ColNum;i++)FieldType[i]=1;//1-int,2-short,3-long,4-float,5-double,6-string
for(int Row=0;Row<MapData.count();Row++)
{
QStringList List=MapData.find(Row).value();
QString DataStr;
int len=0;
for(int i=0;i<List.count();i++)
{
QString ss=List.at(i);
if(FieldType[i]==1){
if(DataHelper::StrType(ss)!=FieldType[i])
FieldType[i]=DataHelper::StrType(ss);
}
else if(FieldType[i]==4)
{
if(DataHelper::StrType(ss)==6)
FieldType[i]=6;
}
}
}
for(int i=0;i<ColNum;i++)
{
if(FieldType[i]!=6)
FieldType[i]=4;
name+= VarNameList.at(i);
int codeLen=RepSize[FieldType[i]];
if(FieldType[i]==6)
codeLen=64;
len += QString::number(codeLen);
ty += QString::number(FieldType[i]);
bk += "0";
hz += "";
unit += "";
hunit += "";
if(i < ColNum-1) {
name += ",";
len += ",";
ty += ",";
bk += ",";
hz += ",";
unit += ",";
hunit += ",";
}
}
#pragma endregion
}
char cname[500], clen[500],cty[500],cbk[500],chz[500],cunit[500],chunit[500];
strcpy(cname, name.toStdString().c_str());
strcpy(clen, len.toStdString().c_str());
strcpy(cty, ty.toStdString().c_str());
strcpy(cbk, bk.toStdString().c_str());
strcpy(chz, hz.toStdString().c_str());
strcpy(cunit, unit.toStdString().c_str());
strcpy(chunit, hunit.toStdString().c_str());
iIndex = logio->Open_Set_Table(tn, 0, ColNum,
cname,
clen,//字段长度
cty,//字段类型
cbk,
chz,
cunit,
chunit
);//字段备注
//}
#pragma endregion
}
int rec = logio->GetTableRecordCount(iIndex);
int tcount = logio->GetTableFieldCount(iIndex);
Slf_TABLE_FIELD *field=new Slf_TABLE_FIELD[tcount+1];
if(!logio->GetTableFieldInfo(iIndex, field)) {
delete field;
delete logio;
return;
}
int reclen=logio->GetTableRecordLength(iIndex);
char *Buffer=new char[reclen+1];
int *colIndex=new int[tcount];//DefauleTable[TableType].ZdNum];//数据列序号
#pragma region 获取每个comboBox的index colIndex
for(int i=0;i<tcount/*DefauleTable[TableType].ZdNum*/;i++)
{
QWidget *widget=m_pUI->tableWidget->cellWidget(0,i);
QComboBox *combox=(QComboBox*)widget;
colIndex[i]=combox->currentIndex();
}
#pragma endregion
QString DESTinf;
for(int Row = 0; Row < MapData.count(); Row++) //行
{
QStringList List = MapData.find(Row).value(); //第Row行的所有数据——》List
QString DataStr;
int len = 0;
bool isSp = 0;
DESTinf = "";
for(int i = 0; i < tcount/*DefauleTable[TableType].ZdNum*/; i++) //列
{
#pragma region 获取该行该列值 DataStr
if(colIndex[i]>=0&&colIndex[i] < List.size()) //从实际数据中提取值 DataStr
DataStr = List[colIndex[i]];
else //使用默认值DataStr
{
if(field[i].RepCode != 6)
DataStr = m_pUI->comboBox_DefValue->currentText();
else
DataStr = m_pUI->comboBox_DefStr->currentText();
}
#pragma endregion
if(TableType<DefTabNum&& QString(QLatin1String(DefauleTable[TableType].tinfo[i].Name)) == "DEST" && DataStr == m_pUI->comboBox_DefStr->currentText() )
DataStr = DataStr + DESTinf;
#pragma region 文字转换
if(field[i].RepCode != 6)
{
#pragma region 20201126 GZL delete
//将RESULT列中的文字转换为对应数字
/*
if(TranResult && i == ResultCol)//TranResult:结论列是文字结论,需要转换; ResultCol:RESULT字段所在列
{
//文字转数字
int no = ResultList.indexOf(DataStr) + 1;
DataStr = QString::number(no); //替换DataStr值为对应数字
}
float buf = DataStr.toFloat();
*/
#pragma endregion
//20201126 GZL change
#pragma region 将该特殊列进行数值映射
int spn; //记录是第几个特殊字段
for(spn = 0; spn < SpColNum; spn++){ //SpColNum记录当前特殊字段
if(i == ResultCol[spn]){
isSp = 1;
break;
}
}
if(DataHelper::StrType(DataStr) == 6 && isSp){ //需要映射
#pragma region 保留文字信息为DEST字段做备份
DESTinf = DESTinf + DataStr;
#pragma endregion
switch(ResultCol2Map[spn]){
case 1:{
#pragma region 拆分上中下
QStringList vals;
QStringList val1=DataStr.split("");
vals.append(val1);
val1.clear();
vals.removeAll("");
for(int i=0;i<vals.size();i++)
{
val1.append(vals[i].split(""));
}
vals=val1;
vals.removeAll("");
val1.clear();
for(int i=0;i<vals.size();i++) {
val1.append(vals[i].split(""));
}
vals=val1;
vals.removeAll("");
#pragma endregion
DataStr.clear();
if(vals.size() > 1){
for(int j = 0; j < vals.size(); j++) {
#pragma region 不满足组合结论要求
if(ResultMap[vals[j]].toFloat() >= 10){
logio->CloseTable(iIndex);
delete logio;
delete []Buffer;
delete []field;
delete []colIndex;
AfxMessageBox("该结论需不满足组合结论要求,请分开存放");//"数据表导入失败");
return;
}
#pragma endregion
DataStr.append(ResultMap[vals[j]]);
}
break;
}
else{
DataStr.append(ResultMap[vals[0]]);
break;
}
}
case 2:DataStr = GujingMap[DataStr];break;
case 3:DataStr = CoreOilMap[DataStr];break;
case 4:
case 7:
DataStr = CoreLithMap[DataStr];
break;
case 5:DataStr = CorecolorMap[DataStr];break;
}
}
float buf = DataStr.toFloat();
logio->SetData(field[i].RepCode, &Buffer[len], (float *)&buf);
#pragma endregion
isSp = 0;
}
#pragma endregion
else
strncpy(&Buffer[len], DataStr.toStdString().c_str(), field[i].Length);
len += field[i].Length;
}
logio->WriteTable(iIndex, Row + rec + 1, Buffer);
}
//if(lineNo>rec) rec=lineNo;
logio->SetTableRecordCount(iIndex, MapData.count() + rec);
delete []Buffer;
delete []field;
delete []colIndex;
logio->CloseTable(iIndex);
delete logio;
QMessageBox::information(NULL,"标题","数据表导入123完");
// CDataImport::ChangetoSlf(WellFileName,NULL);
//MapData.clear();
return;
}
#pragma endregion
#pragma region 多井导入
#pragma region 获取勾选的井名
QStringList WellNameList;
if(TableType<DefTabNum)ColNum=DefauleTable[TableType].ZdNum;
else ColNum=VarNameList.count()-1;
for(int i=0;i<m_mutlWell->tableWidget_WellName->rowCount();i++)
{
if(m_mutlWell->tableWidget_WellName->item(i,0)->checkState())
{
QString name=m_mutlWell->tableWidget_WellName->item(i,0)->text().toUpper();
if(name==""){
QMessageBox::warning(NULL,"提示","井名不能为空");
return;
}
if(IsValidWellName(name)==0){
QMessageBox::warning(NULL,"提示","'"+name+"'不符合井名命名规则");
return;
}
WellNameList.append(name);
}
}
#pragma endregion 获取勾选的井名
#pragma region 检查数据表是否存在
std::vector<QString> wellNameVec;
std::vector<QString> wellFileNameVec;
std::vector<bool> tableExist;//表是否存在
std::vector<int> mode;//写入方式0-替换1-合并2-另存
QString TableName=m_pUI->lineEdit_TableName->text();
std::vector<int> wellIndex;//已经存在有数据表的井序号
int WellNum=0;
// for(int i=0;i<WellNameList.size();i++)
// {
// CObjWell * pWell =CDataImport::GetWellByName(WellNameList.at(i));
// if(!pWell) continue;
// wellNameVec.push_back(WellNameList.at(i).toUpper());mode.push_back(0);
// if(pWell->GetWellFileName().isEmpty())
// {
// QString fi=GetLogdataPath()+GetProject()->GetName()+"\\#"+WellNameList.at(i);
// CreateDir((char *)fi.toStdString().c_str());
// fi+="\\"+WellNameList.at(i)+".slf";
// pWell->SetWellFileName(fi);
// CLogIO *logio=new CLogIO();
// //logio->Open(fi.toStdString().c_str(),CSlfIO::modeCreate);
// logio->Open(fi.toStdString().c_str(),CSlfIO::modeCreate,1024,1024,MACHINE_TYPE,0);
// Slf_FILE_MESSAGE mssage;
// logio->GetFileMessage(mssage);
// int len=strlen(WellNameList.at(i).toStdString().c_str());
// strncpy(mssage.WellName,WellNameList.at(i).toStdString().c_str(),len);
// mssage.WellName[len]=0;
// logio->SetFileMessage(mssage);
// tableExist.push_back(0);
// delete logio;
// }
// else
// {
// QString fi=pWell->GetWellFileName();
// CLogIO *logio=new CLogIO();
// if(logio->Open(fi.toStdString().c_str(),CSlfIO::modeReadWrite))
// //if(logio->Open(fi.toStdString().c_str(),CSlfIO::modeReadWrite,1024,1024,MACHINE_TYPE,0))
// {
// int iIndex=logio->OpenTable(TableName.toStdString().c_str());
// if(iIndex<0)tableExist.push_back(0);
// else
// {
// tableExist.push_back(1);
// wellIndex.push_back(WellNum);
// logio->CloseTable(iIndex);
// }
// delete logio;
// }
// }
// wellFileNameVec.push_back(pWell->GetWellFileName());
// WellNum++;
// }
#pragma endregion 检查数据表是否存在
#pragma region 提示已存在的数据表处理方式
int n=wellIndex.size();
if(wellIndex.size()==1)
{
QString mes=wellNameVec[wellIndex[0]]+"井中已经存在数据表"+TableName+"\r\n请选择导入方式";
QMessageBox box(QMessageBox::Warning,"提示",mes);
box.setStandardButtons (QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
box.setButtonText (QMessageBox::Yes,QString("合并"));
box.setButtonText (QMessageBox::No,QString("替换"));
box.setButtonText (QMessageBox::Cancel,QString("另存"));
int flag1 =box.exec ();
if(flag1==QMessageBox::Cancel)//另存
{
mode[wellIndex[0]]=2;
}
else if(flag1==QMessageBox::No)mode[wellIndex[0]]=0;//替换
else//合并
{
mode[wellIndex[0]]=1;
}
}
else if(wellIndex.size()>1)
{
CTiShiDlg *pTishiDlg=new CTiShiDlg(NULL);
for(int i=0;i<wellIndex.size();i++)
{
pTishiDlg->namelist.append(wellNameVec[wellIndex[i]]);
pTishiDlg->init();
}
if(pTishiDlg->exec()==QDialog::Accepted)
{
for(int i = 0;i<pTishiDlg->m_pUI->tableWidget->rowCount ();i++)
{
for(int j = 1;j<pTishiDlg->m_pUI->tableWidget->columnCount ();j++)
{
if(pTishiDlg->m_pUI->tableWidget->item (i,j)->checkState ()==Qt::Checked)
{
mode[wellIndex[i]]=j-1;break;
}
}
}
}
else
{
//MapData.clear();
QMessageBox::warning(NULL,"提示","放弃数据表导入");
return;
}
}
#pragma endregion 提示已存在的数据表处理方式
#pragma region 导入数据表
//获取井名列号
QWidget *widget=m_pUI->tableWidget->cellWidget(0,0);//第一列是井名
QComboBox *combox=(QComboBox*)widget;
int colIndex_wellname=combox->currentIndex();
//获取数据表字段对应列号
int *colIndex=new int[ColNum];//DefauleTable[TableType].ZdNum];//数据列序号
for(int i=0;i<ColNum/*DefauleTable[TableType].ZdNum*/;i++)
{
QWidget *widget=m_pUI->tableWidget->cellWidget(0,i+1);//第一列是井名
QComboBox *combox=(QComboBox*)widget;
colIndex[i]=combox->currentIndex();
}
QString mTableName=TableName;
int FailedNum=0;
for(int i=0;i<wellNameVec.size();i++)
{
TableName=mTableName;
QString fi=wellFileNameVec[i];
CLogIO *logio=new CLogIO();
logio->Open(fi.toStdString().c_str(),CSlfIO::modeReadWrite);
int iIndex=logio->OpenTable(TableName.toStdString().c_str());
if(iIndex>=0)//表存在
{
if(mode[i]==0)//替换
{
logio->DeleteSlfObject(TableName.toStdString().c_str());
iIndex=-1;
}
else if(mode[i]==2)//另存
{
while(1)
{
TableName+="NEW";
if(strlen(TableName.toStdString().c_str())>64)//if(TableName.length()>64)//whp change 2020.3.16
{
QMessageBox::warning(NULL,"提 示","数据表名"+TableName+"过长\r\n无法导入");
//MapData.clear();
delete logio;
return;
}
if(logio->FindSlfObjectIndex(TableName.toStdString().c_str(),0)<0)break;
}
logio->CloseTable(iIndex);
iIndex=-1;
}
else
if(mode[i]==3)//放弃导入
{
FailedNum++;
logio->CloseTable(iIndex);
iIndex=-1;
continue;
}
}
if (iIndex < 0)
{
QString name,len,ty,bk,hz;
if(TableType<DefTabNum)
{
ColNum=DefauleTable[TableType].ZdNum;
for(int i=0;i<DefauleTable[TableType].ZdNum;i++)
{
name+= QString(QLatin1String(DefauleTable[TableType].tinfo[i].Name));
len+=QString::number(DefauleTable[TableType].tinfo[i].CodeLength);//Length);
ty+=QString::number(DefauleTable[TableType].tinfo[i].RepCode);
bk+="0";
hz+=QString(QLatin1String(DefauleTable[TableType].tinfo[i].Name));
if(i<DefauleTable[TableType].ZdNum-1) {
name+=",";
len+=",";
ty+=",";
bk+=",";
hz+=",";
}
}
}
else
{
ColNum=VarNameList.count();
int *FieldType=new int[ColNum];
for(int i=0;i<ColNum;i++)FieldType[i]=1;//1-int,2-short,3-long,4-float,5-double,6-string
for(int Row=0;Row<MapData.count();Row++)
{
QStringList List=MapData.find(Row).value();
QString DataStr;
int len=0;
for(int i=0;i<List.count();i++)
{
QString ss=List.at(i);
if(FieldType[i]==1){
if(DataHelper::StrType(ss)!=FieldType[i])FieldType[i]=DataHelper::StrType(ss);
}
else if(FieldType[i]==4){
if(DataHelper::StrType(ss)==6)FieldType[i]=6;
}
}
}
for(int i=1;i<ColNum;i++)
{
if(FieldType[i]!=6)FieldType[i]=4;
name+= VarNameList.at(i);
int codeLen=RepSize[FieldType[i]];
if(FieldType[i]==6)codeLen=64;
len+=QString::number(codeLen);
ty+=QString::number(FieldType[i]);
bk+="0";
hz+=VarNameList.at(i);
if(i<ColNum-1) {
name+=",";
len+=",";
ty+=",";
bk+=",";
hz+=",";
}
}
}
char cname[500],clen[500],cty[500],cbk[500],chz[500];
strcpy(cname,name.toStdString().c_str());
strcpy(clen,len.toStdString().c_str());
strcpy(cty,ty.toStdString().c_str());
strcpy(cbk,bk.toStdString().c_str());
strcpy(chz,hz.toStdString().c_str());
iIndex=logio->Open_Set_Table(TableName.toStdString().c_str(),0,ColNum-1,//DefauleTable[TableType].ZdNum,
cname,
clen,//字段长度
cty,//字段类型
cbk,
chz
);//字段备注
}
int rec=logio->GetTableRecordCount(iIndex);
int tcount=logio->GetTableFieldCount(iIndex);
Slf_TABLE_FIELD *field=new Slf_TABLE_FIELD[tcount+1];
logio->GetTableFieldInfo(iIndex,field);
int reclen=logio->GetTableRecordLength(iIndex);
char *Buffer=new char[reclen+1];
int lineNo=0;
for(int Row=0;Row<MapData.count();Row++)
{
QStringList List=MapData.find(Row).value();
QString DataStr;
QString name=List[colIndex_wellname].toUpper();
if(name!=wellNameVec[i])continue;
int len=0;
for(int i=0;i<tcount/*DefauleTable[TableType].ZdNum*/;i++)
{
if(colIndex[i]>=0&&colIndex[i]<List.size())DataStr=List[colIndex[i]];
else
{
if(field[i].RepCode!=6)
DataStr=m_pUI->comboBox_DefValue->currentText();
else
DataStr=m_pUI->comboBox_DefStr->currentText();
}
if(field[i].RepCode!=6)
{
if(TranResult&&i==ResultCol2-1)
{
int no=ResultList.indexOf(DataStr)+1;
DataStr=QString::number(no);
}
float buf=DataStr.toFloat();
logio->SetData(field[i].RepCode,&Buffer[len],(float *)&buf);
}
else {
strncpy(&Buffer[len],DataStr.toStdString().c_str(),field[i].Length);
}
len+=field[i].Length;
}
logio->WriteTable(iIndex,lineNo+rec+1,Buffer);
lineNo++;
}
//if(lineNo>rec) rec=lineNo;
logio->SetTableRecordCount(iIndex,lineNo+rec);
delete []Buffer;
delete []field;
logio->CloseTable(iIndex);
delete logio;
// CDataImport::ChangetoSlf(wellFileNameVec[i],NULL);
}
QString mes="多井数据表导入成功\r\n共有"+QString::number(wellNameVec.size()-FailedNum)+"口井成功导入数据表"+mTableName;
QMessageBox::warning(this,tr("提示"),mes);
delete []colIndex;
#pragma endregion
#pragma endregion
}
//MapData.clear();
#pragma region 王专家上中下样例
#pragma endregion
}
//comboBox change
void CInDefTableDlg::slotComboxSelectChange(int index)
{
if(! m_pUI->tableWidget->isActiveWindow())
return;
//刷新当前字段内容
//QWidget *widget=m_pUI->tableWidget->cellWidget(row,col);
QComboBox *combox = (QComboBox*)sender();
int row = combox->property("row").toInt();
int col = combox->property("col").toInt();
int colIndex = index;
if(!CurItemType && col == 0)
WellNameList.clear();//whp add 2020.3.6
for(int Row = 0; Row < MapData.count(); Row++)
{
QStringList List = MapData.find(Row).value();
QString DataStr;
int FirstCol = 0;
if(!CurItemType)
FirstCol = 1;
if(colIndex>=0&&colIndex < List.size())
DataStr = List[colIndex];
else
{
if(TableType<DefTabNum)
if(DefauleTable[TableType].tinfo[col-FirstCol].RepCode != 6)
DataStr = m_pUI->comboBox_DefValue->currentText();
else
DataStr = m_pUI->comboBox_DefStr->currentText();
}
m_pUI->tableWidget->setItem(Row+1, col, new QTableWidgetItem(DataStr));
if(!CurItemType && col == 0)//当前选择项是“井”时,统计所有井名 whp change 2020.3.6
{
bool flag=0;
DataStr=DataStr.toUpper();
for(int j=0;j<WellNameList.size();j++)
{
if(WellNameList.at(j)!=DataStr)continue;
flag=1;break;
}
if(!flag)WellNameList.append(DataStr);
}
}
//当前选择项是“井”时,刷新井名列表
if(CurItemType==0&&row==0&&col==0)//if(CurItemType==0&&row==0)whp change 2020.3.6
{
m_mutlWell->tableWidget_WellName->clearContents();
m_mutlWell->tableWidget_WellName->setColumnCount(1);
QStringList header;
header<<"井名";
m_mutlWell->tableWidget_WellName->setHorizontalHeaderLabels(header);
m_mutlWell->tableWidget_WellName->horizontalHeader()->setStretchLastSection(true);
m_mutlWell->tableWidget_WellName->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
m_mutlWell->tableWidget_WellName->setRowCount(WellNameList.size());
for(int i=0;i<WellNameList.size();i++)
{
m_mutlWell->tableWidget_WellName->setItem(i,0,new QTableWidgetItem(WellNameList.at(i)));
m_mutlWell->tableWidget_WellName->item(i,0)->setCheckState(Qt::Checked);
}
}
}
void CInDefTableDlg::accept()
{
//throw std::logic_error("The method or operation is not implemented.");
QDialog::done(Rejected);
}
void CInDefTableDlg::resizeEvent(QResizeEvent *pEvent)
{
QDialog::resizeEvent(pEvent);
2026-03-05 08:10:44 +08:00
//m_pUI->tableWidget->horizontalHeader()->resizeSections(QHeaderView::Stretch);
int visual = m_pUI->tableWidget->horizontalHeader()->visualIndex(1);
if (visual!=-1)
{
m_pUI->tableWidget->horizontalHeader()->setSectionResizeMode(1,QHeaderView::ResizeToContents);
if(m_pUI->tableWidget->columnCount()<10)m_pUI->tableWidget->horizontalHeader()->resizeSections(QHeaderView::Stretch);
else m_pUI->tableWidget->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
}
2025-10-30 09:50:15 +08:00
if(MaxCol<10)m_pUI->tableWidget_1->horizontalHeader()->resizeSections(QHeaderView::Stretch);
else m_pUI->tableWidget_1->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
// m_pUI->tableWidget_1->horizontalHeader()->resizeSections(QHeaderView::Stretch);
}
void CInDefTableDlg::showEvent(QShowEvent * pEvent)
{
QDialog::showEvent(pEvent);
// if(m_bFirstShow)
{
2026-03-05 08:10:44 +08:00
// m_pUI->tableWidget->horizontalHeader()->resizeSections(QHeaderView::Stretch);
int visual = m_pUI->tableWidget->horizontalHeader()->visualIndex(1);
if (visual!=-1)
{
m_pUI->tableWidget->horizontalHeader()->setSectionResizeMode(1,QHeaderView::ResizeToContents);
if(m_pUI->tableWidget->columnCount()<10)m_pUI->tableWidget->horizontalHeader()->resizeSections(QHeaderView::Stretch);
else m_pUI->tableWidget->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
}
2025-10-30 09:50:15 +08:00
if(MaxCol<10)m_pUI->tableWidget_1->horizontalHeader()->resizeSections(QHeaderView::Stretch);
else m_pUI->tableWidget_1->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
//m_pUI->tableWidget_1->horizontalHeader()->resizeSections(QHeaderView::Stretch);
//m_bFirstShow =false;
}
}
END_OSGGRAPHICS_NAMESPACE