#include "topologyrecorder.h" #include #include TopologyRecorder::TopologyRecorder(const QHash& elementHT, const QVector &FDSet, const QString& loadFilePath, const QString &rootID, QObject *parent):QObject(parent),eleHT(elementHT),FDSet(FDSet),cimExporter(elementHT,loadFilePath),rootID(rootID) { } TopologyRecorder::~TopologyRecorder() { } bool TopologyRecorder::addDG(const QString& substationID, const QString &fromNodeID) { // std::cout<<"sub id"< > DGs=dgMapping.getDGBySubstationID(substationID); foreach(QSharedPointer _DG,DGs) { double capacity=_DG->getCapacity(); QPair fromTo; fromTo.first=fromNodeID; fromTo.second=_DG->getName();//虚拟节点 if(this->usedDG.contains(_DG->getName())) { break;//这个Substation下面已经添加过DG,不用再添加了。 } // std::cout<<"from node"<getName(),this); this->cimExporter.add(fromTo,DGP); std::cout<<"add "<<_DG->getName().toStdString()<<" to "<usedDG[_DG->getName()]=0;//用过了,做个记号 } return true; } bool TopologyRecorder::isEquipmentNeeded(const QString& substatinID) { const QHash &ht=this->eleHT; Substation *sfd=static_cast(ht[substatinID]); if(sfd==NULL) { // std::cout<<"can not find"<getSubstationMemberOf_Feeder(); return this->FDSet.contains(feederID) ||sfd->getNamingDescription()=="V馈线站"; } return false; } void TopologyRecorder::exportTo(const QString& path) { this->cimExporter.exportTo(path,this->rootID); } void TopologyRecorder::showContainerInfo(QTextStream &stream) { const QHash &ht=this->eleHT; // stream<<"total tf"<tfs.length()<<"\n"; //统计一下每个Container下有多少个变压器 QHash > s; for(QVector::iterator ite=this->tfs.begin(); ite!=this->tfs.end(); ite++) { PowerTransformer *pf=static_cast(ht[*ite]); QString container; container=pf->getEquipmentMemberOf_EquipmentContainer(); s[container].push_back(*ite); } // std::cout<<"container "< keys=s.keys(); for(QList::iterator ite=keys.begin(); ite!=keys.end(); ite++) { QString k=*ite; stream<(ht[k]); stream<<"("<getNamingDescription()<<")"; stream<<"#####"; QVector v=s[k]; foreach (QString n, v) { stream<<", "<(ht[n]); stream<<"("<getNamingDescription()<<")"; } stream<<"\n"; } } bool TopologyRecorder::startWithNode(const QString& node) { if(node=="") { return true; } const QHash &ht=this->eleHT; QString anotherTerminal; QVector anotherTerminalVector; anotherTerminalVector=this->nodeToTerminal.value(node);//一个Node可以找到多个与之相连的Terminal // std::cout<<"find "<reachedTerminal.contains(anotherTerminal)) { continue; } // std::cout<reachedTerminal[anotherTerminal]=0; Terminal *anotherTerminalP=static_cast(ht[anotherTerminal]); QString ce; ce=anotherTerminalP->getConductingEquipment(); QPair fromTo; QString terminalA; QString terminalB; //通过ACSegmentLine的ID来找Terminal。下同。 if(ce.startsWith("AC")) { QString acID=ce; // fromTo.first=node; // fromTo.second=acID; ACLineSegment *AC=static_cast(ht[acID]); if(!AC) { continue; } // std::cout<getLength()<getID().toStdString()<getTerminalA(); terminalB=AC->getTerminalB(); foundEle=AC; typ=TopologyRecorder::Type::AC; } if(ce.startsWith("SW")) { BasicElementInfo *bi=ht[ce]; if(bi!=NULL) { if(bi->getName()=="Breaker") { // std::cout<getName().toStdString()<(ht[swID]); if(!SW) { continue; } //显示开关状态 if(SW->getOpenState()==true) { // std::cout<<"sw "<getNamingDescription().toStdString()<<"is open"<getNamingDescription().toStdString()<<"is close"<getTerminalA(); terminalB=SW->getTerminalB(); // std::cout<<"find"<getID().toStdString()<getName()=="Disconnector") { // std::cout<getName().toStdString()<(ht[disConID]); //先判断一下是不是需要的Disconnector QString container=Dis->getEquipmentMemberOf_EquipmentContainer(); if(!this->isEquipmentNeeded(container)) { // std::cout<<"Dissw not belong "<getOpenState()==true) { // std::cout<<"Dissw "<getNamingDescription().toStdString()<<"is open"<getNamingDescription().toStdString()<<"is close"<getTerminalA(); terminalB=Dis->getTerminalB(); // std::cout<<"find"<getID().toStdString()<(ht[ce]); if(bs==NULL) { // std::cout<<"not find bussection"<getEquipmentMemberOf_EquipmentContainer(); Substation *sfd=static_cast(ht[container]); if(sfd==NULL) { // std::cout<<"can not find"<getNamingDescription().toLocal8Bit().data()<isEquipmentNeeded(container)) { // std::cout<<"not belong"<(ht[tfID]); // std::cout<<"TF"<getNamingDescription().toStdString()<getEquipmentMemberOf_EquipmentContainer(); if(this->isEquipmentNeeded(equipmentContainer)) { this->tfs.push_back(tfID); foundEle=tf; } else { // std::cout<getNamingDescription().toStdString()<<"not belong"<hasAdded.contains(foundEle->getID())) { continue; } this->hasAdded[foundEle->getID()]=0; Branch *branch=NULL; QString nextTerminal; Terminal *nextTerminalP; QString nextNode; if(typ!=TopologyRecorder::Type::TF) { nextTerminal=(terminalA==anotherTerminal)?terminalB:terminalA; nextTerminalP=static_cast(ht[nextTerminal]); if(!nextTerminalP) { continue; } else { nextNode=nextTerminalP->getConnectivityNode(); fromTo.first=node; fromTo.second=nextNode; if(nextNode=="") { fromTo.second=foundEle->getID();//用虚拟节点 } } } else { nextNode=""; fromTo.first=node; fromTo.second=foundEle->getID();//用变压器编号做虚拟节点 } // std::cout<(foundEle),this); this->cimExporter.add(fromTo,static_cast(branch)); break; case TopologyRecorder::Type::BREAKER: branch=new Switch(fromTo,foundEle->getID(),this); this->cimExporter.add(fromTo,static_cast(branch)); break; case TopologyRecorder::Type::DISCONNECTOR: branch=new Switch(fromTo,foundEle->getID(),this); this->cimExporter.add(fromTo,static_cast(branch)); break; case TopologyRecorder::Type::TF: branch=new Transformer(fromTo,static_cast(foundEle),this); this->cimExporter.add(fromTo,static_cast(branch)); //把DG接在变压器旁边 this->addDG(static_cast(foundEle)->getEquipmentMemberOf_EquipmentContainer(),fromTo.first); if(this->usedDG.keys().length()>0) { std::cout<<"contained DG"<rootID.toStdString()<startWithNode(nextNode); } else { // std::cout<<"not found cate "<