cimforreduceloss/cimparser/cimparserbatch.cpp

318 lines
8.1 KiB
C++
Raw Permalink Normal View History

#include "cimparserbatch.h"
#include "derivedqthread.h"
#include <QtDebug>
int callmain(char *arg);
CIMParserBatch::CIMParserBatch()
{
}
void CIMParserBatch::parser(const QString& dir, const QString &scadaDataFilePath)
{
QDir qdir(dir);
QStringList filter;
filter<<"*";
this->mdirList=qdir.entryInfoList(filter,QDir::NoDotAndDotDot | QDir::AllDirs);
this->mite=this->mdirList.constBegin();//后面会用到就是dir文件下的所有文件
this->ReadscadaData(scadaDataFilePath);
//this->ExecuteParserApp(NULL);
//this->GenerateBatchFile("c:/parser.bat");
this->CallFunParser();
}
QString CIMParserBatch::FindXML(const QString& dir)
{
QDir qdir(dir);
QStringList filter;
filter<<"*.xml";
QFileInfoList xmlList;
xmlList=qdir.entryInfoList(filter);
if(xmlList.size()>1)
{
std::cout<<dir.toStdString()<<"has more than one xml file."<<std::endl;
return "";
}
if(xmlList.size()==0)
{
std::cout<<"could not find any xml in "<<dir.toStdString()<<std::endl;
return "";
}
return xmlList.at(0).absoluteFilePath();
}
void CIMParserBatch::ExecuteParserApp(QThread *thread)
{
if(thread!=NULL)
{
thread->deleteLater();
//先把上一次解析得到的文件拷回去
QFileInfoList fileList=this->FindiPsoPrefixedFile("c:/parser");
QFileInfo info;
info=*(this->mite);//原始文件的路径
if(fileList.size()<6)
{
std::cout<<info.baseName().toStdString()<<"parsed, but got fewer files."<<std::endl;
}
QString fileName;
QString desFilePath;
fileName=info.fileName();//原始文件的文件名,其实是文件夹名
desFilePath=info.absoluteFilePath();
desFilePath.replace('/','\\');
QString parseFileName;
QFileInfo parseFileInfo;
QString transNoLoad;
QString parsedFile;//计算文件
for(QFileInfoList::const_iterator ite=fileList.constBegin();
ite!=fileList.constEnd();
ite++
)
{
parseFileInfo=*ite;
parseFileName=parseFileInfo.fileName();
if(parseFileName.contains("TransformerNoLoad"))
{
transNoLoad=desFilePath+"\\iPso_"+fileName+"_TransformerNoLoad.txt";
QFile::remove(transNoLoad);
QFile::copy(parseFileInfo.absoluteFilePath(),transNoLoad);
continue;
}
if(parseFileName.contains("TransformerNoResistance"))
{
continue;
}
if(parseFileName.contains("TransformerInfor"))
{
continue;
}
if(parseFileName.contains("LineInfor"))
{
continue;
}
if(parseFileName.contains("lineZeroResistance"))
{
continue;
}
parsedFile=desFilePath+"\\iPso_"+fileName+".txt";
QFile::remove(parsedFile);
QFile::copy(parseFileInfo.absoluteFilePath(),parsedFile);//TODO:这里会多拷贝一次
//开始安放pqi.txt文件
QFile::remove(desFilePath+"\\pqi.txt");
QFile pqi(desFilePath+"\\pqi.txt");
QString lineName;
if(pqi.open(QIODevice::WriteOnly))
{
lineName=fileName.section('_',0,0);
if(this->mScada.contains(lineName))
{
QTextStream stream(&pqi);
FeederData feederData=this->mScada[lineName];
stream<<feederData.p<<" "<<feederData.q<<" "<<0<<endl;
}
else
{
std::cout<<"pqi of "<<lineName.toStdString()<<" not found."<<std::endl;
}
pqi.close();
}
}
this->mite++;
}
if(this->mite==this->mdirList.constEnd())
{
std::cout<<"job finished."<<std::endl;
return;
}
QString xmlFile;
QString dir;//有xml文件的dir
QFileInfo fileInfo=*(this->mite);
dir=fileInfo.absoluteFilePath();
xmlFile=this->FindXML(dir);
if(xmlFile=="")
{
return;
}
QFile::remove("c:/parser/parser.xml");
QFile::copy(xmlFile,"c:/parser/parser.xml");
std::cout<<"prepare to parse "<<xmlFile.toStdString()<<std::endl;
QFileInfo sizeInfo;
DerivedQThread *_thread;
sizeInfo=QFileInfo(xmlFile);
_thread=new DerivedQThread("E:/lineloss/console/run.bat c:/parser/parser.xml",this);
_thread->connect(_thread,SIGNAL(finishedptr(QThread*)),this,SLOT(ExecuteParserApp(QThread*)));
_thread->start();
}
QFileInfoList CIMParserBatch::FindiPsoPrefixedFile(const QString& dir)
{
QDir qdir(dir);
QStringList filter;
filter<<"iPso_*";
return qdir.entryInfoList(filter);//如果找不到iPso开头的文件返回的QFileInfoList长度为0。
}
void CIMParserBatch::ReadscadaData(const QString& dataPath)
{
QString line;
QStringList sep;
QFile file(dataPath);
if(file.open(QIODevice::ReadOnly))
{
QTextStream stream(&file);
while(!stream.atEnd())
{
line=stream.readLine();
line=line.simplified();
line.trimmed();
sep=line.split(' ');
if(sep.size()<3)
{
std::cout<<"scada file format error!"<<std::endl;
qApp->exit();
}
FeederData feederData;
feederData.p=sep.at(1).toDouble();
feederData.q=sep.at(2).toDouble();
this->mScada.insert(sep.at(0),feederData);
}
file.close();
}
else
{
std::cout<<"scada File not open. This file may not exist."<<std::endl;
}
}
void CIMParserBatch::GenerateBatchFile(const QString& batFilePath)
{
QFile bat(batFilePath);
QString fullFilePath;
QFileInfo info;
QString xmlFile;
if(bat.open(QIODevice::WriteOnly))
{
QTextStream stream(&bat);
while(this->mite!=this->mdirList.constEnd())
{
info=*(this->mite);
fullFilePath=info.absoluteFilePath();
xmlFile=this->FindXML(fullFilePath);
//stream<<"call ";
stream<<"E:/lineloss/console/readxml1.exe ";
stream<<xmlFile<<"\n\r";
this->mite++;
}
bat.close();
}
std::cout<<"job finished."<<std::endl;
}
void CIMParserBatch::CallFunParser()
{
while(this->mite!=this->mdirList.constEnd())
{
QString xmlFile;
QString dir;//有xml文件的dir
QFileInfo fileInfo=*(this->mite);
dir=fileInfo.absoluteFilePath();
xmlFile=this->FindXML(dir);
if(xmlFile=="")
{
return;
}
//QFile::remove("c:/parser/parser.xml");
//QFile::copy(xmlFile,"c:/parser/parser.xml");
std::cout<<"prepare to parse "<<xmlFile.toLocal8Bit().data()<<std::endl;
//qDebug()<<xmlFile<<"\n";
callmain(const_cast<char *>(xmlFile.toStdString().c_str()));
//先把上一次解析得到的文件拷回去
//QFileInfoList fileList=this->FindiPsoPrefixedFile("c:/parser");
QFileInfo info(xmlFile);
// info=*(this->mite);//原始文件的路径
// if(fileList.size()<6)
// {
// std::cout<<info.baseName().toStdString()<<"parserd, but got fewer files."<<std::endl;
// }
// QString fileName;
QString desFilePath;
desFilePath=info.absolutePath();
// fileName=info.fileName();//原始文件的文件名,其实是文件夹名
// desFilePath=info.absoluteFilePath();
desFilePath.replace('/','\\');
// QString parseFileName;
// QFileInfo parseFileInfo;
// QString transNoLoad;
// QString parsedFile;//计算文件
// for(QFileInfoList::const_iterator ite=fileList.constBegin();
// ite!=fileList.constEnd();
// ite++
// )
// {
// parseFileInfo=*ite;
// parseFileName=parseFileInfo.fileName();
// if(parseFileName.contains("变压器无负载"))
// {
// transNoLoad=desFilePath+"\\iPso_"+fileName+"_变压器无负载.txt";
// QFile::remove(transNoLoad);
// QFile::copy(parseFileInfo.absoluteFilePath(),transNoLoad);
// continue;
// }
// if(parseFileName.contains("变压器无阻抗"))
// {
// continue;
// }
// if(parseFileName.contains("变压器信息"))
// {
// continue;
// }
// if(parseFileName.contains("线路信息"))
// {
// continue;
// }
// if(parseFileName.contains("线路零阻抗"))
// {
// continue;
// }
// parsedFile=desFilePath+"\\iPso_"+fileName+".txt";
// QFile::remove(parsedFile);
// QFile::copy(parseFileInfo.absoluteFilePath(),parsedFile);//TODO:这里会多拷贝一次
//开始安放pqi.txt文件
QFile::remove(desFilePath+"\\pqi.txt");
QFile pqi(desFilePath+"\\pqi.txt");
QString lineName;
lineName=info.fileName();
if(pqi.open(QIODevice::WriteOnly))
{
lineName=lineName.section('_',0,0);
if(this->mScada.contains(lineName))
{
QTextStream stream(&pqi);
FeederData feederData=this->mScada[lineName];
stream<<feederData.p<<" "<<feederData.q<<" "<<0<<endl;
}
else
{
std::cout<<"pqi of "<<lineName.toStdString()<<" not found."<<std::endl;
}
pqi.close();
}
this->mite++;
}
std::cout<<"job finished."<<std::endl;
}