logplus/ConvertorManager/src/WisTableTran.cpp
2025-10-29 17:23:30 +08:00

605 lines
22 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*#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 ;
}