cimforreduceloss/cimparser/cimparserbatch.cpp

318 lines
8.1 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 "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;
}