logplus/DataMgr/src/UnitConvertDlg.cpp
jinyuan a9a432a6d2 新波列实现,适配linux
DataMgr,新功能适配linux
2026-05-27 11:04:24 +08:00

443 lines
17 KiB
C++

#pragma warning(push,0)
// #include "Family.h"
#include <QMessageBox>
#include "UnitConvertDlg.h"
#include "ui_UnitConvert.h"
#include "CStringType.h"
#include "geometryutils.h"
#include <QTextStream>
#include "DataImport.h"
// #include "ObjProject.h"
#pragma warning(pop)
using namespace pai::ios::welllog;
BEGIN_OSGGRAPHICS_NAMESPACE
CUnitConvertDlg::CUnitConvertDlg(QWidget * parent, Qt::WindowFlags flags)
: QDialog(parent,flags)
{
m_pUI = new Ui_UnitConvert();
m_pUI->setupUi(this);
QObject::connect(m_pUI->okbtn, SIGNAL(clicked()), this, SLOT(slotSave()));
QObject::connect(m_pUI->cancelbtn, SIGNAL(clicked()), this, SLOT(slotCancel()));
QObject::connect(m_pUI->buttonGroup, SIGNAL(buttonClicked (int)), this, SLOT(slotbuttonJudge(int)) );
QObject::connect(m_pUI->comboBoxDataType, SIGNAL(currentIndexChanged(int)),this, SLOT(slotChangeUnitType()));
QObject::connect(m_pUI->comboBoxConvertType, SIGNAL(currentIndexChanged(int)),this, SLOT(slotChangeConvertType()));
QObject::connect(m_pUI->checkBox, SIGNAL(clicked()), this, SLOT(slotCheckChangeValue()));
QObject::connect(m_pUI->checkBox_Curve, SIGNAL(clicked()), this, SLOT(slotCheckCurve()));
QObject::connect(m_pUI->checkBox_Wave, SIGNAL(clicked()), this, SLOT(slotCheckWave()));
QObject::connect(m_pUI->pushButton_SelAll, SIGNAL(clicked()), this, SLOT(slotSelAll()));
QObject::connect(m_pUI->pushButton_NotSelAll, SIGNAL(clicked()), this, SLOT(slotNotSelAll()));
QObject::connect(m_pUI->pushButton_ReSel, SIGNAL(clicked()), this, SLOT(slotReverseSel()));
m_pUI->buttonGroup->setId(m_pUI->radioButton,0);
m_pUI->buttonGroup->setId(m_pUI->radioButton_2,1);
m_pUI->radioButton->setChecked(1);
m_pUI->tableWidget->setColumnCount(6);
QStringList header;
header<<"曲线名称"<<"曲线单位"<<"起始深度"<<"结束深度"<<"采样间隔"<<"深度单位";
m_pUI->tableWidget->setHorizontalHeaderLabels(header);
m_pUI->tableWidget->horizontalHeader()->setStretchLastSection(true);
m_pUI->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
//m_pUI->tableWidget->horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents);
//m_pUI->tableWidget->horizontalHeader()->setResizeMode(2, QHeaderView::ResizeToContents);
CurveCheck=1;WaveCheck=1;
CurrentType=-1;
}
void CUnitConvertDlg::slotSave()
{
SelCurve.clear();
if(CurrentType<0||CurrentType>=UnitTypeNum)
{
QMessageBox::warning(this,"提示","请选择单位类型");return;
}
if(CurrentConvert<0||CurrentConvert>=UnitType.find(UnitTypeName.at(CurrentType)).value())
{
QMessageBox::warning(this,"提示","请选择转换类型");return;
}
iConvertFlag=m_pUI->buttonGroup->checkedId();
float muti=1.,adding=0.;
if(m_pUI->checkBox->checkState()==Qt::Unchecked)
{
muti=m_pUI->lineEditMul->text().toFloat();
adding=m_pUI->lineEditAdd->text().toFloat();
}
QString strUnit=m_pUI->lineEditName->text();
QString strUnitAlias=m_pUI->lineEditAlias->text();
CMemRdWt *mrw=new CMemRdWt();
mrw->Open(FileName.toStdString().c_str(),CSlfIO::modeReadWrite);
for(int i=0;i<m_pUI->tableWidget->rowCount();i++)
{
Qt::CheckState eState= m_pUI->tableWidget->item(i,0)->checkState();
if (eState==Qt::Unchecked)continue;
QString cvname = m_pUI->tableWidget->item(i,0)->text();
SelCurve.append(cvname);////2020.8.2 for刷新数据查看
//////////////////////////////////////////////////////////////////////////
int index = mrw->FindObjectIndex( cvname.toStdString().c_str() );
short Attribute,SubAttribute;
mrw->GetObjectAttribute( index , &Attribute , &SubAttribute );
if ( SubAttribute == CURVE_OBJECT )//0x0001
{
Slf_CURVE curveInfo;
mrw->GetCurveInfo( index , &curveInfo );
if (iConvertFlag == CONVERT_CURVE_UNIT)
{
strcpy( curveInfo.Unit , strUnit.toStdString().c_str() );//Reset curve unit
strcpy( curveInfo.AliasUnit , strUnitAlias.toStdString().c_str() );
mrw->SetCurveInfo( index ,&curveInfo ) ;
float *oldData,*newData;
//whp change 2018.10.15 保证读写一致
int iPointNum = ( curveInfo.EndDepth - curveInfo.StartDepth ) / curveInfo.DepLevel + 1.5;//0.5 ;
oldData = new float[iPointNum];
newData = new float[iPointNum];
mrw->ReadCurve( index , curveInfo.StartDepth , iPointNum ,oldData );
for (int m= 0 ; m < iPointNum ; m ++ )
{
newData[m] = muti * oldData[m] + adding ;
}
mrw->WriteCurve( index , curveInfo.StartDepth , iPointNum ,newData );
mrw->CloseCurve(index);
delete oldData ;
delete newData ;
m_pUI->tableWidget->item(i,1)->setText(strUnit);
}
else// Depth unit convert
{
strcpy( curveInfo.DepthUnit , strUnit.toStdString().c_str() );//reset depth unit
strcpy( curveInfo.DepthHZUnit , strUnitAlias.toStdString().c_str() );
mrw->SetCurveInfo( index ,&curveInfo ) ;
//whp change 2018.10.15 保证读写一致
int iPointNum = ( curveInfo.EndDepth - curveInfo.StartDepth ) / curveInfo.DepLevel + 1.5;//0.5 ;
Slf_OBJECT_FIELD curveFieldInfo[2];// = new Slf_OBJECT_FIELD[2];
mrw->GetSlfTableFieldInfo(index,&curveFieldInfo[0]);
curveFieldInfo[0].Start=curveFieldInfo[0].Start*muti+adding;
curveFieldInfo[0].Rlev=curveFieldInfo[0].Rlev*muti+adding;
curveFieldInfo[0].End=m_pUI->tableWidget->item(i,3)->text().toFloat()*muti+adding;//curveFieldInfo[0].Start+iPointNum*curveFieldInfo[0].Rlev;//curveInfo.EndDepth;
mrw->SetSlfTableFieldInfo(index,&curveFieldInfo[0]);
mrw->CloseCurve(index);
m_pUI->tableWidget->item(i,2)->setText(QString::number(curveFieldInfo[0].Start));
m_pUI->tableWidget->item(i,3)->setText(QString::number(curveFieldInfo[0].End));
m_pUI->tableWidget->item(i,4)->setText(QString::number(curveFieldInfo[0].Rlev));
m_pUI->tableWidget->item(i,5)->setText(strUnit);
}
}
else//WAVE_OBJECT 0x0002
{
Slf_WAVE waveInfo;
mrw->GetWaveInfo(index , &waveInfo );
if (iConvertFlag == CONVERT_CURVE_UNIT)
{
#ifdef WIN32
strcpy_s( waveInfo.Unit , 32 , strUnit.toStdString().c_str() );
strcpy_s( waveInfo.AliasUnit , 32 , strUnitAlias.toStdString().c_str() );
#else
strncpy(waveInfo.Unit, strUnit.toStdString().c_str(), 32);
strncpy( waveInfo.AliasUnit , strUnitAlias.toStdString().c_str(), 32);
#endif
mrw->SetWaveInfo( index ,&waveInfo ) ;
//float **oldValue,**newValue;
//whp change 2018.10.15 保证读写一致
int iPointNum = ( waveInfo.EndDepth - waveInfo.StartDepth ) / waveInfo.DepLevel + 1.5;//0.5 ;
int iSamplesNum = waveInfo.TimeSamples*waveInfo.ArrayNum;
//allocate space
/* oldValue = new float*[ iPointNum ] ;
newValue = new float*[ iPointNum ];
for ( i = 0 ; i < iPointNum ; i ++ )
{
oldValue[i] = new float [ iSamplesNum +1 ] ;
newValue[i] = new float [ iSamplesNum +1 ] ;
} */
float *oldValue=new float [ iSamplesNum +1 ],*newValue=new float [ iSamplesNum +1 ];
//operate data
//进度提示
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
// ::GetProgressBar()->setVisible(true);
// ::GetProgressBar()->setRange(0,iPointNum);
for ( int m = 0 ; m < iPointNum ; m ++ )
{
// ::GetProgressBar()->setValue(m+1);
//read
mrw->ReadWave( index , waveInfo.StartDepth + waveInfo.DepLevel * m , 1 , &oldValue[0] );//&oldValue[i][0] );
//calcuate using coefficient :muti and adding
for ( int j = 0 ;j < iSamplesNum ; j ++ )
{
newValue[j] = muti * oldValue[j] + adding ;//newValue[i][j] = muti * oldValue[i][j] + adding ;
}
//write back
mrw->WriteWave( index , waveInfo.StartDepth + waveInfo.DepLevel * m , 1 ,&newValue[0] );//&newValue[i][0] );
}
mrw->CloseWave(index);
QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor));
// ::GetProgressBar()->setVisible(false);
//free space
/* for ( i = 0; i < iPointNum ; i ++ )
{
delete oldValue[i];
delete newValue[i];
}*/
delete []oldValue ;
delete []newValue ;
m_pUI->tableWidget->item(i,1)->setText(strUnit);
}
else//Depth unit convert
{
#ifdef WIN32
strcpy_s( waveInfo.DepthUnit , 32 , strUnit.toStdString().c_str() );//reset depth unit
strcpy_s( waveInfo.DepthHZUnit , 32 , strUnitAlias.toStdString().c_str() );//reset depth unit
#else
strncpy(waveInfo.DepthUnit, strUnit.toStdString().c_str(), 32);
strncpy( waveInfo.DepthHZUnit , strUnitAlias.toStdString().c_str(), 32);
#endif
mrw->SetWaveInfo( index ,&waveInfo ) ;
//whp change 2018.10.15 保证读写一致
int iPointNum = ( waveInfo.EndDepth - waveInfo.StartDepth ) / waveInfo.DepLevel + 1.5;//0.5 ;
Slf_OBJECT_FIELD waveFieldInfo[3];// = new Slf_OBJECT_FIELD [3];
mrw->GetSlfTableFieldInfo(index,&waveFieldInfo[0]);
waveFieldInfo[0].Start=waveFieldInfo[0].Start*muti+adding;
waveFieldInfo[0].Rlev=waveFieldInfo[0].Rlev*muti+adding;
waveFieldInfo[0].End=m_pUI->tableWidget->item(i,3)->text().toFloat()*muti+adding;//waveFieldInfo[0].Start+iPointNum*waveFieldInfo[0].Rlev;//waveInfo.EndDepth;
mrw->SetSlfTableFieldInfo(index,&waveFieldInfo[0]);
mrw->CloseWave(index);
m_pUI->tableWidget->item(i,2)->setText(QString::number(waveFieldInfo[0].Start));
m_pUI->tableWidget->item(i,3)->setText(QString::number(waveFieldInfo[0].End));
m_pUI->tableWidget->item(i,4)->setText(QString::number(waveFieldInfo[0].Rlev));
m_pUI->tableWidget->item(i,5)->setText(strUnit);
}
}
}
delete mrw;
QMessageBox::warning(this,"提示","转换完成!");
}
/**
*@brief 取消槽函数
*/
void CUnitConvertDlg::slotCancel()
{
MapUnit.clear();
UnitType.clear();
reject ();
}
void CUnitConvertDlg::init()
{
m_pUI->checkBox_Curve->setCheckState(Qt::Checked);
m_pUI->checkBox_Wave->setCheckState(Qt::Checked);
CMemRdWt *mrw=new CMemRdWt();
mrw->Open(FileName.toStdString().c_str(),CSlfIO::modeReadWrite);
int ObjectNumber=mrw->GetObjectCount();
int CurveCount=0,WaveCount=0;
char Name[200];
for(int i=0;i<ObjectNumber;i++)
{
if(mrw->GetObjectStatus(i)!=OBJECT_NORMAL)
{
continue;
}
mrw->GetObjectName(i,Name);
short Attribute,SubAttribute;
Attribute=mrw->GetObjectType(i);
if(Attribute==CURVE_OBJECT)
{
//CUR_INFO mInfo;
Slf_CURVE cInfo;
int index=mrw->OpenCurve(Name);
if(index<0) continue;
mrw->GetCurveInfo(index,&cInfo);
/*mInfo.name=QString(QLatin1String(Name));
mInfo.strCurveUnit=QString(QLatin1String(cInfo.Unit));
mInfo.strDepthUnit=QString(QLatin1String(cInfo.DepthUnit));
mInfo.sdep=cInfo.StartDepth;
mInfo.edep=cInfo.EndDepth;
mInfo.DepInterval=cInfo.DepLevel;
Curve_Info.push_back()*/
Curve_Info.push_back(cInfo);
}
else if(Attribute==WAVE_OBJECT)
{
Slf_WAVE cInfo;
int index=mrw->OpenWave(Name);
if(index>-1) {
mrw->GetWaveInfo(index,&cInfo);
Wave_Info.push_back(cInfo);
}
}
}
delete mrw;
ReadConfig();
for(int i=0;i<UnitTypeName.size();i++)
m_pUI->comboBoxDataType->addItem(UnitTypeName[i]);
RebrushList();
}
void CUnitConvertDlg::ReadConfig()
{
QString ConfigName = ::GetConfPath()+"UnitConvert.ini";
QFile InFile(ConfigName);
if( !InFile.open(QIODevice::ReadOnly ) )
{
QMessageBox::warning(NULL,"提示","打开单位转换配置文件"+ConfigName+"错误");
return ;
}
QTextStream textstream( &InFile );
QString line;
while(!textstream.atEnd())
{
line=textstream.readLine();
if(line.indexOf("<BEGIN>")>=0)break;
}
line=textstream.readLine();
line=line.right(line.length()-line.indexOf("=")-1);
UnitTypeNum=line.toInt();
for(int i=0;i<UnitTypeNum;i++)
{
line=textstream.readLine();
QStringList StrList=line.split(" ");
UnitTypeName.append(StrList[1]);
int ItemNum=StrList.at(2).toInt();
UnitType.insert(StrList[1],ItemNum);
vector<ConvertUnit> temp;
temp.reserve(ItemNum);
MapUnit.insert(StrList[1],temp);
}
QString name;
while(!textstream.atEnd())
{
line=textstream.readLine();
if(line.indexOf("<END>")>=0)break;
if(line.indexOf("#")>=0)
{
line.replace("#","");
line.replace(" ","");
name=line;
continue;
}
if(line.indexOf("==")>=0)
{
while(line.indexOf(" ")>-1)line.replace(" "," ");
while(line.indexOf(" ")>-1)line.replace(" "," ");
line=line.trimmed();
QStringList StrList=line.split(" ");
ConvertUnit mUnit;
mUnit.No=StrList.at(0).toInt();
mUnit.Type=StrList.at(1);
mUnit.NewUnit=StrList.at(2);
mUnit.UnitAlias=StrList.at(3);
mUnit.MutiCoefficient=StrList.at(4);//.toFloat();
mUnit.AddingCoefficient=StrList.at(5);//.toFloat();
MapUnit.find(name).value().push_back(mUnit);
}
}
}
void CUnitConvertDlg::slotCheckCurve()
{
CurveCheck=!CurveCheck;
RebrushList();
}
void CUnitConvertDlg::slotCheckWave()
{
WaveCheck=!WaveCheck;
RebrushList();
}
void CUnitConvertDlg::slotSelAll()
{
for(int i=0;i<m_pUI->tableWidget->rowCount();i++)m_pUI->tableWidget->item(i,0)->setCheckState(Qt::Checked);
}
void CUnitConvertDlg::slotNotSelAll()
{
for(int i=0;i<m_pUI->tableWidget->rowCount();i++)m_pUI->tableWidget->item(i,0)->setCheckState(Qt::Unchecked);
}
void CUnitConvertDlg::slotReverseSel()
{
for(int i=0;i<m_pUI->tableWidget->rowCount();i++)
{
Qt::CheckState eState= m_pUI->tableWidget->item(i,0)->checkState();
if (eState==Qt::Checked)m_pUI->tableWidget->item(i,0)->setCheckState(Qt::Unchecked);
else m_pUI->tableWidget->item(i,0)->setCheckState(Qt::Checked);
}
}
void CUnitConvertDlg::slotCheckChangeValue()//仅改变单位名称,不做数值转换
{
slotChangeConvertType();
}
void CUnitConvertDlg::slotbuttonJudge(int id)
{
iConvertFlag=id;
if(iConvertFlag==CONVERT_DEPTH_UNIT)
{
for(int i=0;i<UnitTypeNum;i++)
{
if(UnitTypeName[i]=="Length")
{
m_pUI->comboBoxDataType->setCurrentIndex(i);
m_pUI->comboBoxDataType->setEnabled(0);
return;
}
}
}
else m_pUI->comboBoxDataType->setEnabled(1);
}
void CUnitConvertDlg::slotChangeUnitType()
{
CurrentType=m_pUI->comboBoxDataType->currentIndex();
m_pUI->comboBoxConvertType->clear();
std::vector<ConvertUnit> mUnit=MapUnit.find(UnitTypeName.at(CurrentType)).value();
for(int i=0;i<UnitType.find(UnitTypeName.at(CurrentType)).value();i++)
{
m_pUI->comboBoxConvertType->addItem(mUnit[i].Type);
}
}
void CUnitConvertDlg::slotChangeConvertType()
{
CurrentConvert=m_pUI->comboBoxConvertType->currentIndex();
if(CurrentConvert<0)return;
std::vector<ConvertUnit> mUnit=MapUnit.find(UnitTypeName.at(CurrentType)).value();
CurrentUnit=mUnit.at(CurrentConvert);
m_pUI->lineEditName->setText(CurrentUnit.NewUnit);
m_pUI->lineEditAlias->setText(CurrentUnit.UnitAlias);
m_pUI->lineEditMul->setText(CurrentUnit.MutiCoefficient);//QString::number(CurrentUnit.MutiCoefficient));
m_pUI->lineEditAdd->setText(CurrentUnit.AddingCoefficient);
if(m_pUI->checkBox->checkState()==Qt::Checked)m_pUI->lineEditMode->setText("NewValue=1.0*OldValue+0.0");
else
{
if(CurrentUnit.AddingCoefficient.indexOf("-")>=0)m_pUI->lineEditMode->setText("NewValue="+CurrentUnit.MutiCoefficient+"*OldValue"+CurrentUnit.AddingCoefficient);
else m_pUI->lineEditMode->setText("NewValue="+CurrentUnit.MutiCoefficient+"*OldValue+"+CurrentUnit.AddingCoefficient);
}
}
void CUnitConvertDlg::RebrushList()
{
m_pUI->tableWidget->clearContents();//clear();whp change 2020.3.6
int row=CurveCheck*Curve_Info.size()+WaveCheck*Wave_Info.size();
m_pUI->tableWidget->setRowCount(row);
if(CurveCheck)
{
for(int i=0;i<Curve_Info.size();i++)
{
m_pUI->tableWidget->setItem(i,0,new QTableWidgetItem(QString(QLatin1String(Curve_Info[i].Name))));
m_pUI->tableWidget->setItem(i,1,new QTableWidgetItem(QString(QLatin1String(Curve_Info[i].Unit))));
m_pUI->tableWidget->setItem(i,2,new QTableWidgetItem(QString::number(Curve_Info[i].StartDepth)));
m_pUI->tableWidget->setItem(i,3,new QTableWidgetItem(QString::number(Curve_Info[i].EndDepth)));
m_pUI->tableWidget->setItem(i,4,new QTableWidgetItem(QString::number(Curve_Info[i].DepLevel)));
m_pUI->tableWidget->setItem(i,5,new QTableWidgetItem(QString(QLatin1String(Curve_Info[i].DepthUnit))));
m_pUI->tableWidget->item(i,0)->setCheckState(Qt::Checked);
}
}
if(WaveCheck)
{
for(int i=0;i<Wave_Info.size();i++)
{
m_pUI->tableWidget->setItem(i+CurveCheck*Curve_Info.size(),0,new QTableWidgetItem(QString(QLatin1String(Wave_Info[i].Name))));
m_pUI->tableWidget->setItem(i+CurveCheck*Curve_Info.size(),1,new QTableWidgetItem(QString(QLatin1String(Wave_Info[i].Unit))));
m_pUI->tableWidget->setItem(i+CurveCheck*Curve_Info.size(),2,new QTableWidgetItem(QString::number(Wave_Info[i].StartDepth)));
m_pUI->tableWidget->setItem(i+CurveCheck*Curve_Info.size(),3,new QTableWidgetItem(QString::number(Wave_Info[i].EndDepth)));
m_pUI->tableWidget->setItem(i+CurveCheck*Curve_Info.size(),4,new QTableWidgetItem(QString::number(Wave_Info[i].DepLevel)));
m_pUI->tableWidget->setItem(i+CurveCheck*Curve_Info.size(),5,new QTableWidgetItem(QString(QLatin1String(Wave_Info[i].DepthUnit))));
m_pUI->tableWidget->item(i+CurveCheck*Curve_Info.size(),0)->setCheckState(Qt::Checked);
}
}
}
END_OSGGRAPHICS_NAMESPACE