logplus/ConvertorManager/src/WisTableTran.cpp

605 lines
22 KiB
C++
Raw Normal View History

2025-10-29 17:23:30 +08:00
/*#include "MyDlisLib.h"
#include "MyLisLib.h"
#include "MyXtfLib.h"*/
#pragma once
#include "WisTableTran.h"
#include "BaseFun.h"
//#include "log.h"
//void AppendConsole(pai::log::Priority priority,const QString &output);
WisTableTran::WisTableTran()
{
m_TranNum=0;
WisDefTable=NULL;
SlfDefTable=NULL;
outinf=NULL;
}
WisTableTran::~WisTableTran()
{
if(m_TranNum)
{
//for(int i=0;i<m_TranNum;i++)delete []m_TTI[i].tinfo;
delete []m_TTI;
if(WisDefTable)delete []WisDefTable;
if(SlfDefTable)delete []SlfDefTable;
if(outinf)delete []outinf;
}
}
void WisTableTran::GetTTI(TRANTABLEINF &m_TTI,QStringList temp)
{
m_TTI.ZdNum=0;
m_TTI.tinfo=new ZdInf[temp.size()];
for(int i=0;i<temp.size();i++)
{
QString line=temp.at(i);
QStringList DataList=GetStringList(line,1,1,1,1,1);
if(DataList.count()<2)continue;
m_TTI.tinfo[m_TTI.ZdNum].OutZd=DataList.at(0);//logplus
m_TTI.tinfo[m_TTI.ZdNum].InZd=DataList.at(1);//wis
if(DataList.count()>2)m_TTI.tinfo[m_TTI.ZdNum].ZdType=DataList.at(2);
if(DataList.count()>3)m_TTI.tinfo[m_TTI.ZdNum].ZdLen=DataList.at(3);
if(DataList.count()>4)m_TTI.tinfo[m_TTI.ZdNum].ZdAlias=DataList.at(4);
m_TTI.ZdNum++;
}
}
bool WisTableTran::GetTranTableInf()
{//读TableTran.ini
m_TranNum=0;
QString ConfigName = GetConfPath()+"TableTran.ini";
QFile InFile(ConfigName);
if( !InFile.open(QIODevice::ReadOnly ) )return 0;
QTextStream textstream( &InFile );
QString line;
while(!textstream.atEnd())
{
line=textstream.readLine();
if(line.indexOf("//")>=0)continue;
if(line.indexOf("#")>=0)m_TranNum++;
}
if(!m_TranNum){
InFile.close();
return 0;
}
InFile.seek(0);
m_TTI=new TRANTABLEINF[m_TranNum];
int num=-1;
QStringList temp;
while(!textstream.atEnd())
{
line=textstream.readLine();
if(line.indexOf("//")>=0)continue;
line=line.toUpper();
if(line.indexOf("#")>=0)
{
if(num>=0)
{
GetTTI(m_TTI[num],temp);
temp.clear();
}
num++;
line=line.replace("#","");
QStringList DataList=GetStringList(line,1,1,1,1,1);
m_TTI[num].OutName=DataList.at(0);
m_TTI[num].InName=DataList.at(1);
if(DataList.count()>2)m_TTI[num].AliasName=DataList.at(2);
}
else temp.append(line);
}
GetTTI(m_TTI[num],temp);
InFile.close();
for(int i=0;i<m_TranNum;i++)
{
m_TTI[i].InNameList.clear();
for(int j=0;j<m_TTI[i].ZdNum;j++)
{
QString tempName=m_TTI[i].tinfo[j].InZd;
if(tempName.indexOf("+")>0)tempName=tempName.replace("+",",");
if(tempName.indexOf("-")>0)tempName=tempName.replace("-",",");
QStringList tempList=tempName.split(",");
for(int m=0;m<tempList.count();m++)m_TTI[i].InNameList.append(tempList.at(m));
}
}
return 1;
}
bool WisTableTran::ReadDefTable(DEFAULTTABLE *&WisDefTable,QString table_inf)
{
WisDefTable=new DEFAULTTABLE[m_TranNum];
for(int i=0;i<m_TranNum;i++)
{
WisDefTable[i].TableName="";
WisDefTable[i].ZdNum=0;
}
QString ConfigName = ::GetConfPath();
int iswis=0;
if(table_inf.indexOf("wis_",0,Qt::CaseInsensitive)>-1) {
ConfigName+=GetOilFieldName();
iswis=1;
}
ConfigName+=table_inf;
QFile InFile(ConfigName);
if( !InFile.open(QIODevice::ReadOnly ) )
{
QMessageBox::warning(NULL,"提示","打开缺省表配置文件"+ConfigName+"错误");
return 0;
}
QTextStream textstream( &InFile );
QString line;
QString TableName,TableAliasName;
//int ZdNum;
QStringList ZdName,HzName,ZdUnit,ZdLen,ZdType,ZdRes,DataList;
while(!textstream.atEnd())
{
line=textstream.readLine();
line=line.toUpper();
while(line.indexOf("#")>=0)
{
line=line.replace("#","");
DataList=GetStringList(line,1,1,1,1,1);
if(DataList.count()<2)continue;
TableName=DataList.at(0);
TableAliasName=DataList.at(1);
QString menuinfo[50];
for(int m=0;m<m_TranNum;m++)
{
QString name;
if(!iswis) name=m_TTI[m].OutName;
else name=m_TTI[m].InName;
if(TableName==name)
{
while(!textstream.atEnd())
{
line=textstream.readLine();
if(line.indexOf(",")>=0)
{
QString str=line;
str.trimmed();
int len=str.length();
if(len>-1&&str.at(len-1)==',')
{
while(!textstream.atEnd())
{
line=textstream.readLine();
str+=line;
str.trimmed();
int len=str.length();
if(len>-1&&str.at(len-1)!=',') break;
}
}
int ind=ZdName.size()-1;
if(ind>-1) menuinfo[ind]=str;
continue;//枚举行
}
line=line.toUpper();
if(line.indexOf("#")>=0)
{
break;
}
DataList=GetStringList(line,1,1,1,1,1);
if(DataList.count()<5)continue;
ZdName.append(DataList.at(0));
HzName.append(DataList.at(1));
ZdUnit.append(DataList.at(2));
bool IsZdType=0;
for(int j=0;j<11;j++)
{
if(DataList.at(3)==QString(Rep_STR[j]))
{
ZdType.append(QString::number(j+1));
IsZdType=1;
break;
}
}
if(!IsZdType)QMessageBox::warning(NULL,"提示","defauletable.ini文件中表"+TableName+"的字段名"+DataList.at(0)+"类型不正确");
ZdLen.append(DataList.at(4));
if(DataList.count()>5) {
if(DataList.at(5).toInt()>0)
{
QString filename=GetConfPath();
switch(DataList.at(5).toInt())
{
case 1:
filename+="RESULT.ini";
break;
case 2:
filename+="GujingOrder.ini";
break;
case 3:
filename+="CoreOil.ini";
break;
case 4:
filename+="CoreLith.ini";
break;
case 5:
filename+="Corecolor.ini";
break;
case 6:
filename+="colorind.ini";
break;
case 7:
filename+="GeoLith.ini";
break;
}
FILE *fp1=fopen(filename.toStdString().c_str(),"r+t");
QString str;
if(fp1) {
char buf1[100];
int flag=0;
str="MENU=";
while(!feof(fp1)) {
int ret=fscanf(fp1,"%s",buf1);
if(ret<1) break;
if(flag) str+=",";
else flag=1;
str+=buf1;
}
fclose(fp1);
}
int ind=ZdRes.size();
menuinfo[ind]=str;
}
ZdRes.append(DataList.at(5));
}
else ZdRes.append("0");
}
WisDefTable[m]=SetTableInf(TableName,TableAliasName,ZdName.count(),ZdName,HzName,ZdUnit,ZdType,ZdLen,ZdRes,menuinfo);
ZdName.clear();
ZdLen.clear();
ZdType.clear();
HzName.clear();
ZdUnit.clear();
ZdRes.clear();
for(int i=0;i<50;i++)
{
menuinfo[i]="";
}
break;
}
}
}
}
InFile.close();
if(iswis){
//检查输出匹配表名是否在系统定义的缺省表中
int nn=0,mm=0;
QString mes="TableTran.ini中定义的输出表名\r\n";
QString ZdMes="";
for(int i=0;i<m_TranNum;i++)
{
if(WisDefTable[i].TableName==""||WisDefTable[i].ZdNum<=0)
{
nn++;
mes+=m_TTI[i].InName+"\r\n";
WisDefTable[i].TableName="";
WisDefTable[i].ZdNum=0;
continue;
}
//检查输出匹配表m_TTI[i].InName中要匹配的字段名是否都存在于WisDefTable[i]中
QStringList FieldNameList;
for(int k=0;k<WisDefTable[i].ZdNum;k++)FieldNameList.append(QString(WisDefTable[i].tinfo[k].Name));
for(int n=0;n<m_TTI[i].InNameList.count();n++)
{
int find=-1;
for(int k=0;k<FieldNameList.count();k++)
{
if(m_TTI[i].InNameList.at(n)==FieldNameList.at(k))
{
find=k;
break;
}
}
if(find<0)
{
mm++;
ZdMes+="数据表"+m_TTI[i].InName+"的字段"+m_TTI[i].InNameList.at(n)+"\r\n";
WisDefTable[i].ZdNum=0;//字段定义不全的表不匹配
WisDefTable[i].TableName="";
}
}
}
mes+="不是系统定义的缺省表\r\n请在Wis_DefTable.ini配置文件中进行定义";
if(!nn)mes="";
if(mm)mes+="\r\nTableTran.ini文件中下列字段没有在wis_deftable.inf中定义\r\n";
if(mm)mes+=ZdMes;
if(nn+mm==0)return 1;
// AppendConsole(pai::log::PAI_INFO,mes);
// QMessageBox::warning(NULL,"提示",mes);
//如果所有匹配表信息都不全返回0主程序中就不需要再做工作
int num=0;
for(int i=0;i<m_TranNum;i++)
{
if(WisDefTable[i].ZdNum)num++;
}
if(num)return 1;
else {
delete WisDefTable;
WisDefTable=NULL;
return 0;
}
}
else {
//检查输出匹配表名是否在系统定义的缺省表中
int nn=0,mm=0;
QString mes="TableTran.ini中定义的输出表名\r\n";
QString ZdMes="";
for(int i=0;i<m_TranNum;i++)
{
if(WisDefTable[i].TableName==""||WisDefTable[i].ZdNum<=0)
{
nn++;
mes+=m_TTI[i].OutName+"\r\n";
continue;
}
//检查输出匹配表m_TTI[i].OutName中要匹配的字段名是否都存在于SlfDefTable[i]中
QStringList FieldNameList;
for(int k=0;k<WisDefTable[i].ZdNum;k++)FieldNameList.append(QString(WisDefTable[i].tinfo[k].Name));
for(int n=0;n<m_TTI[i].ZdNum;n++)
{
int find=-1;
for(int k=0;k<FieldNameList.count();k++)
{
if(m_TTI[i].tinfo[n].OutZd==FieldNameList.at(k))
{
find=k;
break;
}
}
if(find<0)
{
mm++;
ZdMes+="数据表"+m_TTI[i].OutName+"的字段"+m_TTI[i].tinfo[n].OutZd+"\r\n";
}
}
}
mes+="不是系统定义的缺省表\r\n请在SlfDefTable.ini配置文件中进行定义";
if(!nn)mes="";
if(mm)mes+="\r\nTableTran.ini文件中下列字段没有在SlfDefTable.ini中定义\r\n";
if(mm)mes+=ZdMes;
if(nn+mm==0)return 1;
// AppendConsole(pai::log::PAI_INFO,mes);
// QMessageBox::warning(NULL,"提示",mes);
//如果所有匹配表信息都不全返回0主程序中就不需要再做工作
int num=0;
for(int i=0;i<m_TranNum;i++)
{
if(WisDefTable[i].ZdNum)num++;
}
if(num)return 1;
else {
delete WisDefTable;
WisDefTable=NULL;
return 0;
}
}
}
bool WisTableTran::HaveTranTable(QString wistype)//QStringList TableList)
{
//读数据表匹配与转换配置文件TableTran.ini
if(!GetTranTableInf())return 0;
//读wis缺省表Wis_deftable.inf从Forward\system\deftable.inf拷贝到LogPlus\bin\conf\Wis_deftable.inf
if(!ReadDefTable(WisDefTable,"wis_deftable.inf"))return 0;
//读slf缺省表WisDefTable.ini
if(!ReadDefTable(SlfDefTable,"DefauleTable.ini"))return 0;
return 1;
}
int WisTableTran::GetTranTableNo(QString TableName,int fieldNum,Slf_TABLE_FIELD* tableFieldInfo,bool IsS2W)
{
DEFAULTTABLE *DefTab;
int TranTable=-1;
for(int m=0;m<m_TranNum;m++)
{
#pragma region 相同表名
if(m_TTI[m].InName==TableName)//检查转换字段是否都存在
{
TranTable=m;
QStringList FieldNameList;
for(int k=0;k<fieldNum;k++)FieldNameList.append(QString(tableFieldInfo[k].Name));
// 检查输出字段名是否存在
for(int n=0;n<m_TTI[m].InNameList.count();n++)
{
int find=-1;
for(int k=0;k<FieldNameList.count();k++)
{
if(m_TTI[m].InNameList.at(n)==FieldNameList.at(k))
{
find=k;
break;
}
}
if(find<0)
{
TranTable=-1;
break;
}
}
}
#pragma endregion 相同表名
if(TranTable>=0)break;
#pragma region 相同字段
//如果没有和缺省表名相同的表检查是否有同结构的表如要把GEOSTRATUM转成LAYER_DATA的表
if(!IsS2W)DefTab=&WisDefTable[m];
else DefTab=&SlfDefTable[m];
if(fieldNum==DefTab->ZdNum)//m_TTI[m].OutName==TableName)
{
TranTable=m;
// 检查字段名、字段类型是否完全一致
for(int k=0;k<fieldNum;k++)
{
if(strcmp(DefTab->tinfo[k].Name,tableFieldInfo[k].Name)!=0
||DefTab->tinfo[k].RepCode!=tableFieldInfo[k].RepCode
||DefTab->tinfo[k].CodeLength!=tableFieldInfo[k].Length)
{
TranTable=-1;
break;
}
}
if(TranTable>=0)break;
}
#pragma endregion 相同字段
}
return TranTable;
}
void WisTableTran::GetOutInf(int TranTable)
{
if(outinf)delete []outinf;
outinf=new OUTINF[m_TTI[TranTable].ZdNum];
for(int n=0;n<m_TTI[TranTable].ZdNum;n++)
{
strcpy(outinf[n].OutName,m_TTI[TranTable].tinfo[n].OutZd.toStdString().c_str());
for(int j=0;j<SlfDefTable[TranTable].ZdNum;j++)
{
if(m_TTI[TranTable].tinfo[n].OutZd==WisDefTable[TranTable].tinfo[j].Name)
{
SlfDefTable[TranTable].toName[j]=m_TTI[TranTable].tinfo[n].InZd;
break;
}
}
for(int j=0;j<WisDefTable[TranTable].ZdNum;j++)
{
if(m_TTI[TranTable].tinfo[n].InZd==WisDefTable[TranTable].tinfo[j].Name)
{
WisDefTable[TranTable].toName[j]=m_TTI[TranTable].tinfo[n].OutZd;
break;
}
}
QString tempName=m_TTI[TranTable].tinfo[n].InZd;
QStringList tempNameList;
outinf[n].Sep="";
int varnum=1;
outinf[n].CodeType=0;
if(tempName.indexOf("+")>0||tempName.indexOf("-")>0)
{
if(tempName.indexOf("+")>0)outinf[n].Sep="+";
if(tempName.indexOf("-")>0)outinf[n].Sep="-";
tempNameList=tempName.split(outinf[n].Sep);
varnum=tempNameList.count();
}
if(varnum==1)strcpy(outinf[n].InName1,tempName.toStdString().c_str());
else
{
strcpy(outinf[n].InName1,tempNameList[0].toStdString().c_str());
strcpy(outinf[n].InName2,tempNameList[1].toStdString().c_str());
}
}
}
//
DEFAULTTABLE WisTableTran::SetTableInf(QString TableName,QString TableHzName,int num,QStringList ZdName,QStringList HzName,QStringList ZdUnit,QStringList ZdType,QStringList ZdLen,QStringList ZdRes,QString *menu)
{
DEFAULTTABLE DefTable;
memset(&DefTable.tinfo,0,sizeof(DefTable.tinfo));
DefTable.TableName=TableName;
DefTable.TableAliasName=TableHzName;
DefTable.ZdNum=num;
for(int i=0;i<num;i++)
{
strcpy(DefTable.tinfo[i].Name,ZdName[i].toStdString().c_str());
strcpy(DefTable.tinfo[i].HZName,HzName[i].toStdString().c_str());
strcpy(DefTable.tinfo[i].Unit,ZdUnit[i].toStdString().c_str());
strcpy(DefTable.tinfo[i].HZUnit,"");
DefTable.tinfo[i].RepCode=ZdType[i].toInt();
DefTable.tinfo[i].CodeLength=ZdLen[i].toInt();
DefTable.tinfo[i].Sequence=0;//2是否连续控制
DefTable.tinfo[i].Start=1;//4字段起始值
DefTable.tinfo[i].End=99999;//4字段起始值
DefTable.tinfo[i].Rlev=1;//4字段采样间隔
DefTable.tinfo[i].SamplePoint=1;//4一个阵列的横向采样样本点数
DefTable.tinfo[i].ArrayNum=1;//4阵列数
DefTable.tinfo[i].Vmin=-99999;//4字段最大值
DefTable.tinfo[i].Vmax=99999;//4字段最小值
DefTable.tinfo[i].DefVal=9999;//4缺省值
*(DWORD *)&DefTable.tinfo[i].Reserved=ZdRes[i].toInt();
if(menu)DefTable.menuinfo[i]=menu[i];
}
return DefTable;
}
void WisTableTran::InitDefauleTable(bool IsWis)
{
QString ConfigName = ::GetConfPath();
if(IsWis)ConfigName+="wis_deftable.inf";
else ConfigName+="DefauleTable.ini";
QFile InFile(ConfigName);
if( !InFile.open(QIODevice::ReadOnly ) )
{
QMessageBox::warning(NULL,"提示","打开缺省表配置文件"+ConfigName+"错误");
return ;
}
QTextStream textstream( &InFile );
QString line;
QString TableName,TableAliasName;
//int ZdNum;
QStringList ZdName,HzName,ZdUnit,ZdLen,ZdType,ZdRes,DataList;
while(!textstream.atEnd())
{
line=textstream.readLine();line=line.toUpper();
while(line.indexOf("#")>=0)
{
line=line.replace("#","");
DataList=GetStringList(line,1,1,1,1,1);
if(DataList.count()<2)continue;
TableName=DataList.at(0);
TableAliasName=DataList.at(1);
for(int m=0;m<m_TranNum;m++)
{
QString TTName;
if(IsWis)TTName=m_TTI[m].InName;
else TTName=m_TTI[m].OutName;
if(TableName==TTName)
{
while(!textstream.atEnd())
{
line=textstream.readLine();
if(line.indexOf(",")>=0)continue;//枚举行
line=line.toUpper();
if(line.indexOf("#")>=0)
{
break;
}
DataList=GetStringList(line,1,1,1,1,1);
if(DataList.count()<5)continue;
ZdName.append(DataList.at(0));HzName.append(DataList.at(1));ZdUnit.append(DataList.at(2));
bool IsZdType=0;
for(int j=0;j<11;j++)
{
if(DataList.at(3)==QString(Rep_STR[j]))
{
ZdType.append(QString::number(j+1));
IsZdType=1;
break;
}
}
if(!IsZdType)QMessageBox::warning(NULL,"提示","defauletable.ini文件中表"+TableName+"的字段名"+DataList.at(0)+"类型不正确");
ZdLen.append(DataList.at(4));
if(DataList.count()>5)ZdRes.append(DataList.at(5));
else ZdRes.append("0");
}
DEFAULTTABLE DefTable=SetTableInf(TableName,TableAliasName,ZdName.count(),ZdName,HzName,ZdUnit,ZdType,ZdLen,ZdRes,NULL);
if(IsWis)
{
//WisDefTable[m].tinfo=new Slf_OBJECT_FIELD[DefTable.ZdNum+1];
memcpy(&WisDefTable[m],&DefTable,sizeof(DefTable));
}
else
{
//SlfDefTable[m].tinfo=new Slf_OBJECT_FIELD[DefTable.ZdNum+1];
memcpy(&SlfDefTable[m],&DefTable,sizeof(DefTable));
}
ZdName.clear(),ZdLen.clear(),ZdType.clear(),HzName.clear();ZdUnit.clear();
break;
}
}
}
}
InFile.close();
return ;
}