1.把负荷文件路径加入CIMParser中。
2.把变压器也处理成双端支路。 Signed-off-by: dmy@lab <dmy@lab.lab>
This commit is contained in:
parent
07cfaef632
commit
8d5fcf9c95
|
|
@ -1,6 +1,6 @@
|
||||||
#include "cimexporter.h"
|
#include "cimexporter.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
CIMExporter::CIMExporter()
|
CIMExporter::CIMExporter(const QHash<QString, BasicElementInfo *> &eleHT, const QString &loadDir):loadDir(loadDir),eleHT(eleHT)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -33,25 +33,78 @@ void CIMExporter::add(const QPair<QString,QString>& fromTo,Transformer* tf)
|
||||||
|
|
||||||
void CIMExporter::exportTo(const QString& path)
|
void CIMExporter::exportTo(const QString& path)
|
||||||
{
|
{
|
||||||
return;
|
|
||||||
//先给所有节点都编号
|
//先给所有节点都编号
|
||||||
this->idToNumber(this->line);
|
this->idToNumber(this->line);
|
||||||
this->idToNumber(this->sw);
|
this->idToNumber(this->sw);
|
||||||
this->idToNumber(this->tf);
|
this->idToNumber(this->tf);
|
||||||
//开始按要求输出
|
//开始按要求输出
|
||||||
//先输出线路
|
//先输出线路
|
||||||
for(QList<CIMExporter::LineStru>::iterator ite=this->line.begin();
|
// for(QList<CIMExporter::LineStru>::iterator ite=this->line.begin();
|
||||||
ite!=this->line.end();
|
// ite!=this->line.end();
|
||||||
|
// ite++)
|
||||||
|
// {
|
||||||
|
// LineStru l=*ite;
|
||||||
|
// std::cout<<l.fromID.toStdString()<<" "<<l.fromNum<<" ";
|
||||||
|
// std::cout<<l.toID.toStdString()<<" "<<l.toNum<<std::endl;
|
||||||
|
// std::cout<<l.line->r<<","<<l.line->x<<","<<l.line->g1<<","<<l.line->g2<<std::endl;
|
||||||
|
// }
|
||||||
|
//输出负荷
|
||||||
|
RecurseDir recurseDir;
|
||||||
|
recurseDir.setDir(this->loadDir);
|
||||||
|
QStringList files;
|
||||||
|
files=recurseDir.getFiles();
|
||||||
|
//转换斜杠
|
||||||
|
for(QStringList::iterator ite=files.begin();ite!=files.end();ite++)
|
||||||
|
{
|
||||||
|
*ite=(*ite).replace("\\","/");
|
||||||
|
}
|
||||||
|
|
||||||
|
// //只取文件名
|
||||||
|
// QStringList baseNames;
|
||||||
|
// foreach(QString file,files)
|
||||||
|
// {
|
||||||
|
// QFileInfo fileInfo(file);
|
||||||
|
// baseNames<<fileInfo.baseName();
|
||||||
|
// }
|
||||||
|
QStringList usedLoad;
|
||||||
|
for(QList<CIMExporter::TransformerStru>::iterator ite=this->tf.begin();
|
||||||
|
ite!=this->tf.end();
|
||||||
ite++)
|
ite++)
|
||||||
{
|
{
|
||||||
LineStru l=*ite;
|
std::cout<<"f"<<std::endl;
|
||||||
std::cout<<l.fromID.toStdString()<<" "<<l.fromNum<<" ";
|
PowerTransformer *tf=ite->tf->getTF();
|
||||||
std::cout<<l.toID.toStdString()<<" "<<l.toNum<<std::endl;
|
QString subID=tf->getEquipmentMemberOf_EquipmentContainer();//所属Substation的ID
|
||||||
std::cout<<l.line->r<<","<<l.line->x<<","<<l.line->g1<<","<<l.line->g2<<std::endl;
|
Substation *sub=static_cast<Substation *>(this->eleHT[subID]);
|
||||||
}
|
if(!sub)
|
||||||
//输出负荷
|
{
|
||||||
|
std::cout<<"CIMExporter:: can not substation of "<<subID.toStdString()<<std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
LoadMapping loadMapping;
|
||||||
|
QVector<QSharedPointer<LoadInfo> > vecLoadInfo=loadMapping.getSubstationLoad(sub->getID());
|
||||||
|
foreach(QSharedPointer<LoadInfo> p,vecLoadInfo)
|
||||||
|
{
|
||||||
|
std::cout<<"match "<<p->getLoadPath().toLocal8Bit().data()<<std::endl;
|
||||||
|
if( files.contains( p->getLoadPath()) )
|
||||||
|
{
|
||||||
|
usedLoad<<p->getLoadPath();
|
||||||
|
|
||||||
|
|
||||||
|
p->getPA();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//列出没有用的负荷文件
|
||||||
|
foreach(QString file, files)
|
||||||
|
{
|
||||||
|
if(!usedLoad.contains(file))
|
||||||
|
{
|
||||||
|
std::cout<<file.toLocal8Bit().data()<<"not used"<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,16 @@
|
||||||
#include "element/transformer.h"
|
#include "element/transformer.h"
|
||||||
#include <QPair>
|
#include <QPair>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QSharedPointer>
|
||||||
|
#include "recursedir.h"
|
||||||
|
#include "substation.h"
|
||||||
|
#include "loadmapping.h"
|
||||||
|
#include "loadinfo.h"
|
||||||
|
#include <QVector>
|
||||||
|
//#include "elementhashtable.h"
|
||||||
|
class Substation;
|
||||||
class CIMExporter
|
class CIMExporter
|
||||||
{
|
{
|
||||||
struct BranchStruc
|
struct BranchStruc
|
||||||
|
|
@ -31,7 +41,7 @@ class CIMExporter
|
||||||
|
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
CIMExporter();
|
explicit CIMExporter(const QHash<QString,BasicElementInfo *>& eleHT,const QString& loadDir);
|
||||||
void add(const QPair<QString,QString>& fromTo,Line* line);
|
void add(const QPair<QString,QString>& fromTo,Line* line);
|
||||||
void add(const QPair<QString,QString>& fromTo,Switch* sw);
|
void add(const QPair<QString,QString>& fromTo,Switch* sw);
|
||||||
void add(const QPair<QString,QString>& fromTo,Transformer* tf);
|
void add(const QPair<QString,QString>& fromTo,Transformer* tf);
|
||||||
|
|
@ -44,6 +54,8 @@ private:
|
||||||
int numberIt(const QString &id);//编号
|
int numberIt(const QString &id);//编号
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void idToNumber(QList<T> &s);//把所有元件的标识进行编号
|
void idToNumber(QList<T> &s);//把所有元件的标识进行编号
|
||||||
|
QString loadDir;
|
||||||
|
const QHash<QString,BasicElementInfo *>& eleHT;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CIMEXPORTER_H
|
#endif // CIMEXPORTER_H
|
||||||
|
|
|
||||||
|
|
@ -24,4 +24,12 @@ void Transformer::extract()
|
||||||
this->g2=g0*length;
|
this->g2=g0*length;
|
||||||
this->b1=b0*length;
|
this->b1=b0*length;
|
||||||
this->b2=b0*length;
|
this->b2=b0*length;
|
||||||
|
//解析负荷
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PowerTransformer *Transformer::getTF()
|
||||||
|
{
|
||||||
|
return this->tf;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,12 @@
|
||||||
#include <QPair>
|
#include <QPair>
|
||||||
#include "branch.h"
|
#include "branch.h"
|
||||||
#include "./../powertransformer.h"
|
#include "./../powertransformer.h"
|
||||||
|
#include "./../loadmapping.h"
|
||||||
class Transformer:public Branch
|
class Transformer:public Branch
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Transformer(const QPair<QString, QString> &fromTo, PowerTransformer *tf,QObject *parent=0);
|
Transformer(const QPair<QString, QString> &fromTo, PowerTransformer *tf,QObject *parent=0);
|
||||||
|
PowerTransformer *getTF();
|
||||||
protected:
|
protected:
|
||||||
virtual void extract();
|
virtual void extract();
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,8 @@ bool ElementHashtable::child(QXmlStreamReader &reader)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool ElementHashtable::GoPath()
|
bool ElementHashtable::GoPath()
|
||||||
{
|
{
|
||||||
const QHash<QString,BasicElementInfo*> &zwht=this->eleHT;//从配网开始找
|
const QHash<QString,BasicElementInfo*> &zwht=this->eleHT;//从配网开始找
|
||||||
|
|
@ -101,9 +103,9 @@ bool ElementHashtable::GoPath()
|
||||||
delete this->tpRecorder;
|
delete this->tpRecorder;
|
||||||
this->tpRecorder=NULL;
|
this->tpRecorder=NULL;
|
||||||
}
|
}
|
||||||
this->tpRecorder=new TopologyRecorder(this->eleHT,this->FDSet);
|
this->tpRecorder=new TopologyRecorder(this->eleHT,this->FDSet,this->loadFilePath);
|
||||||
this->tpRecorder->startWithNode(node);
|
this->tpRecorder->startWithNode(node);
|
||||||
this->tpRecorder->exportTo("");
|
// this->tpRecorder->exportTo("");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -187,3 +189,8 @@ void ElementHashtable::ShowContainerInfo(const QString& fileName)
|
||||||
std::cerr<<"not open"<<relPath.toStdString()<<std::endl;
|
std::cerr<<"not open"<<relPath.toStdString()<<std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ElementHashtable::SetLoadFilePath(const QString &path)
|
||||||
|
{
|
||||||
|
this->loadFilePath=path;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,9 @@ public:
|
||||||
explicit ElementHashtable(QObject *parent = 0);
|
explicit ElementHashtable(QObject *parent = 0);
|
||||||
bool Parse(const QString& xmlPWPath,const QString& xmlZWPath);
|
bool Parse(const QString& xmlPWPath,const QString& xmlZWPath);
|
||||||
bool GoPath();
|
bool GoPath();
|
||||||
|
// void ExportTo(const QString& path);
|
||||||
void SetACLineID(const QString &id);//寻找的线路ID
|
void SetACLineID(const QString &id);//寻找的线路ID
|
||||||
|
void SetLoadFilePath(const QString &path);
|
||||||
void SetFDSet(const QVector<QString> &FDSet);//FeeDer集合
|
void SetFDSet(const QVector<QString> &FDSet);//FeeDer集合
|
||||||
void ShowContainerInfo(const QString& fileName);
|
void ShowContainerInfo(const QString& fileName);
|
||||||
private:
|
private:
|
||||||
|
|
@ -41,6 +43,7 @@ private:
|
||||||
QString lineID;
|
QString lineID;
|
||||||
QVector<QString> FDSet;
|
QVector<QString> FDSet;
|
||||||
TopologyRecorder *tpRecorder;
|
TopologyRecorder *tpRecorder;
|
||||||
|
QString loadFilePath;
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,16 @@ bool LoadMapping::broadcastUpdateByTime(const QTime& time)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QSharedPointer<LoadInfo> LoadMapping::getALoad(const QString& id)
|
||||||
|
{
|
||||||
|
return (*this->loadsToLoadInfo)[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
QVector<QSharedPointer<LoadInfo> > LoadMapping::getSubstationLoad(const QString& id)
|
||||||
|
{
|
||||||
|
return (*this->loads)[id];
|
||||||
|
}
|
||||||
|
|
||||||
bool LoadMapping::load(const QString &loadDir,const QString &matchdDir,const QString &exceptionFile)
|
bool LoadMapping::load(const QString &loadDir,const QString &matchdDir,const QString &exceptionFile)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,9 +24,12 @@ public:
|
||||||
LoadMapping();
|
LoadMapping();
|
||||||
~LoadMapping();
|
~LoadMapping();
|
||||||
bool broadcastUpdateByTime(const QTime& time);
|
bool broadcastUpdateByTime(const QTime& time);
|
||||||
|
QSharedPointer<LoadInfo> getALoad(const QString& id);
|
||||||
|
QVector<QSharedPointer<LoadInfo> > getSubstationLoad(const QString& id);
|
||||||
bool load(const QString& loadDir, const QString &matchdDir, const QString &exceptionFile);
|
bool load(const QString& loadDir, const QString &matchdDir, const QString &exceptionFile);
|
||||||
bool readLoads(const QString& dir);
|
bool readLoads(const QString& dir);
|
||||||
bool readMatch(const QString& dir);
|
bool readMatch(const QString& dir);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class CG // 它的唯一工作就是在析构函数中删除CSingleton的实例
|
class CG // 它的唯一工作就是在析构函数中删除CSingleton的实例
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -54,18 +54,21 @@ void Task::doAgainstTaskFile(ElementHashtable &eleHT)
|
||||||
}
|
}
|
||||||
// //开始解析
|
// //开始解析
|
||||||
sep=line.split(',');
|
sep=line.split(',');
|
||||||
if(sep.length()<3)
|
if(sep.length()<4)
|
||||||
{
|
{
|
||||||
std::cout<<"error: "<<line.toStdString()<<std::endl;
|
std::cout<<"error: "<<line.toStdString()<<std::endl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
QString lineName=sep.at(0);
|
QString lineName=sep.at(0);
|
||||||
QString lineID=sep.at(1);
|
QString lineID=sep.at(1);
|
||||||
|
QString loadDir=sep.at(2);
|
||||||
// std::cout<<lineName.toLocal8Bit().data()<<std::endl;
|
// std::cout<<lineName.toLocal8Bit().data()<<std::endl;
|
||||||
|
eleHT.SetLoadFilePath(loadDir);
|
||||||
eleHT.SetACLineID(lineID);
|
eleHT.SetACLineID(lineID);
|
||||||
eleHT.SetFDSet(setSep.toVector());
|
eleHT.SetFDSet(setSep.toVector());
|
||||||
eleHT.GoPath();
|
eleHT.GoPath();
|
||||||
eleHT.ShowContainerInfo(lineName);
|
eleHT.ShowContainerInfo(lineName);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
file.close();
|
file.close();
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
727揭주땜菉窟,AC-671678,(FD-2096,)
|
727泰林东乙线,AC-671678,D:\Project\佛山项目\数据\搭网架参数文件\泰安\泰安负荷\727泰林东乙线,(FD-2096,),
|
||||||
|
|
||||||
|
|
||||||
709美的甲线,AC-671399,(FD-2003,)
|
709美的甲线,AC-671399,(FD-2003,)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#include "topologyrecorder.h"
|
#include "topologyrecorder.h"
|
||||||
#include <iostream>
|
//#include <iostream>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
TopologyRecorder::TopologyRecorder(const QHash<QString,BasicElementInfo *>& elementHT, const QVector<QString> &FDSet, QObject *parent):eleHT(elementHT),FDSet(FDSet)
|
TopologyRecorder::TopologyRecorder(const QHash<QString,BasicElementInfo *>& elementHT, const QVector<QString> &FDSet,const QString& loadFilePath, QObject *parent):QObject(parent),eleHT(elementHT),FDSet(FDSet),cimExporter(elementHT,loadFilePath)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -141,9 +141,7 @@ bool TopologyRecorder::startWithNode(const QString& node)
|
||||||
{
|
{
|
||||||
// std::cout<<"sw "<<SW->getNamingDescription().toStdString()<<"is close"<<std::endl;
|
// std::cout<<"sw "<<SW->getNamingDescription().toStdString()<<"is close"<<std::endl;
|
||||||
}
|
}
|
||||||
Substation *sbb=static_cast<Substation *>(ht[SW->getEquipmentMemberOf_EquipmentContainer()]);
|
|
||||||
// std::cout<<"sw container"<<sbb->getNamingDescription().toLocal8Bit().data()<<std::endl;
|
|
||||||
// std::cout<<SW->getID().toStdString()<<std::endl;
|
|
||||||
terminalA=SW->getTerminalA();
|
terminalA=SW->getTerminalA();
|
||||||
terminalB=SW->getTerminalB();
|
terminalB=SW->getTerminalB();
|
||||||
// std::cout<<"find"<<SW->getID().toStdString()<<std::endl;
|
// std::cout<<"find"<<SW->getID().toStdString()<<std::endl;
|
||||||
|
|
@ -231,8 +229,7 @@ bool TopologyRecorder::startWithNode(const QString& node)
|
||||||
if(this->isEquipmentNeeded(equipmentContainer))
|
if(this->isEquipmentNeeded(equipmentContainer))
|
||||||
{
|
{
|
||||||
this->tfs.push_back(tfID);
|
this->tfs.push_back(tfID);
|
||||||
// fromTo.first=node;
|
|
||||||
// fromTo.second=tfID;
|
|
||||||
foundEle=tf;
|
foundEle=tf;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -245,23 +242,41 @@ bool TopologyRecorder::startWithNode(const QString& node)
|
||||||
}
|
}
|
||||||
if(foundEle)
|
if(foundEle)
|
||||||
{
|
{
|
||||||
Branch *branch=NULL;
|
|
||||||
QString nextTerminal;
|
|
||||||
nextTerminal=(terminalA==anotherTerminal)?terminalB:terminalA;
|
|
||||||
Terminal *nextTerminalP=static_cast<Terminal *>(ht[nextTerminal]);
|
|
||||||
if(!nextTerminalP)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
//有可能会访问到重复的元件,所以这里判断一下,如果是已经访问过的就不添加了。
|
//有可能会访问到重复的元件,所以这里判断一下,如果是已经访问过的就不添加了。
|
||||||
if(this->hasAdded.contains(foundEle->getID()))
|
if(this->hasAdded.contains(foundEle->getID()))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
this->hasAdded[foundEle->getID()]=0;
|
this->hasAdded[foundEle->getID()]=0;
|
||||||
QString nextNode=nextTerminalP->getConnectivityNode();
|
|
||||||
fromTo.first=node;
|
Branch *branch=NULL;
|
||||||
fromTo.second=nextNode;
|
QString nextTerminal;
|
||||||
|
Terminal *nextTerminalP;
|
||||||
|
QString nextNode;
|
||||||
|
if(typ!=TopologyRecorder::Type::TF)
|
||||||
|
{
|
||||||
|
nextTerminal=(terminalA==anotherTerminal)?terminalB:terminalA;
|
||||||
|
nextTerminalP=static_cast<Terminal *>(ht[nextTerminal]);
|
||||||
|
if(!nextTerminalP)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nextNode=nextTerminalP->getConnectivityNode();
|
||||||
|
fromTo.first=node;
|
||||||
|
fromTo.second=nextNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nextNode="";
|
||||||
|
fromTo.first=node;
|
||||||
|
fromTo.second=foundEle->getID();//用变压器编号做虚拟节点
|
||||||
|
}
|
||||||
|
|
||||||
|
// std::cout<<typ<<" "<<ce.toStdString()<<std::endl;
|
||||||
switch(typ)
|
switch(typ)
|
||||||
{
|
{
|
||||||
case TopologyRecorder::Type::AC:
|
case TopologyRecorder::Type::AC:
|
||||||
|
|
@ -278,13 +293,15 @@ bool TopologyRecorder::startWithNode(const QString& node)
|
||||||
break;
|
break;
|
||||||
case TopologyRecorder::Type::TF:
|
case TopologyRecorder::Type::TF:
|
||||||
branch=new Transformer(fromTo,static_cast<PowerTransformer *>(foundEle),this);
|
branch=new Transformer(fromTo,static_cast<PowerTransformer *>(foundEle),this);
|
||||||
|
// std::cout<<"add tf"<<std::endl;
|
||||||
this->cimExporter.add(fromTo,static_cast<Transformer *>(branch));
|
this->cimExporter.add(fromTo,static_cast<Transformer *>(branch));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// std::cout<<nextNode.toStdString()<<std::endl;
|
// std::cout<<nextNode.toStdString()<<std::endl;
|
||||||
this->startWithNode(nextNode);
|
if(nextNode!="")
|
||||||
|
this->startWithNode(nextNode);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ class TopologyRecorder:public QObject
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TopologyRecorder(const QHash<QString,BasicElementInfo *>& elementHT,const QVector<QString> &FDSet,QObject *parent=0);
|
TopologyRecorder(const QHash<QString,BasicElementInfo *>& elementHT, const QVector<QString> &FDSet, const QString &loadFilePath, QObject *parent=0);
|
||||||
~TopologyRecorder();
|
~TopologyRecorder();
|
||||||
void showContainerInfo(QTextStream &stream);
|
void showContainerInfo(QTextStream &stream);
|
||||||
bool startWithNode(const QString& node);
|
bool startWithNode(const QString& node);
|
||||||
|
|
@ -40,8 +40,8 @@ private:
|
||||||
const QHash<QString,BasicElementInfo *>& eleHT;
|
const QHash<QString,BasicElementInfo *>& eleHT;
|
||||||
QHash<QString,char> reachedTerminal;
|
QHash<QString,char> reachedTerminal;
|
||||||
QVector<QString> tfs;
|
QVector<QString> tfs;
|
||||||
CIMExporter cimExporter;
|
|
||||||
QVector<QString> FDSet;
|
QVector<QString> FDSet;
|
||||||
|
CIMExporter cimExporter;
|
||||||
QHash<QString,char> hasAdded;
|
QHash<QString,char> hasAdded;
|
||||||
bool isEquipmentNeeded(const QString& substatinID);
|
bool isEquipmentNeeded(const QString& substatinID);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue