#include "cimexporter.h" #include CIMExporter::CIMExporter(const QHash &eleHT, const QString &loadDir):loadDir(loadDir),eleHT(eleHT) { } void CIMExporter::add(const QPair& fromTo,Line* line) { LineStru lineStru; lineStru.line=line; lineStru.fromID=fromTo.first; lineStru.toID=fromTo.second; lineStru.id=line->ac->getID(); lineStru.isZeroBranch=std::fabs(line->length)<1e-5; lineStru.dispose=false; lineStru.type="AC"; lineStru.length=line->length; this->line.push_back(lineStru); } void CIMExporter::add(const QPair& fromTo,Switch* sw) { SwitchStru switchStru; switchStru.sw=sw; switchStru.fromID=fromTo.first; switchStru.toID=fromTo.second; switchStru.id=sw->id; switchStru.isZeroBranch=true; switchStru.dispose=false; switchStru.type="SW"; this->sw.push_back(switchStru); } void CIMExporter::add(const QPair& fromTo,Transformer* tf) { TransformerStru tfStru; tfStru.tf=tf; tfStru.fromID=fromTo.first; tfStru.toID=fromTo.second; tfStru.isZeroBranch=false; tfStru.dispose=false; tfStru.id=tf->getTF()->getID(); tfStru.type="TF"; this->tf.push_back(tfStru); } void CIMExporter::add(const QPair& fromTo,DG* dg) { DGStru dgStru; dgStru.dg=dg; dgStru.fromID=fromTo.first; dgStru.toID=fromTo.second; dgStru.isZeroBranch=false; dgStru.dispose=false; dgStru.id=dg->id; dgStru.type="DG"; this->dg.push_back(dgStru); } void CIMExporter::exportTo(const QString& path,const QString &rootID) { char seperator='\t'; QString endLine="\r\n"; //输出到文件 QFile fd(path); if(fd.open(QFile::WriteOnly)) { //消减元件 QList elements; for(int i=0;iline.length();i++) { // std::cout<line[i].fromID.toStdString()<<" "<line[i].id.toStdString()<<" "<line[i].toID.toStdString()<line[i]) ); } for(int i=0;isw.length();i++) { // std::cout<sw[i].fromID.toStdString()<<" "<sw[i].id.toStdString()<<" "<sw[i].toID.toStdString()<sw[i]) ); } for(int i=0;itf.length();i++) { // std::cout<tf[i].fromID.toStdString()<<" "<tf[i].id.toStdString()<<" "<tf[i].toID.toStdString()<tf[i]) ); } for(int i=0;idg.length();i++) { // std::cout<dg[i].fromID.toStdString()<<" "<dg[i].id.toStdString()<<" "<dg[i].toID.toStdString()<dg[i]) ); } ElementReduction elementReduction(elements); elementReduction.doIt(rootID);//消除0阻抗支路,把几段线路连成一段 //先给所有节点都编号 this->idToNumber(this->line); this->idToNumber(this->sw); this->idToNumber(this->tf); this->idToNumber(this->dg); //开始按iPso格式要求输出 QTextStream writer(&fd); //iPso 第一行 writer<number.keys().length()<line ) { if(l.id==rootID) { balanceNum=l.fromNum; break; } } // std::cout<<"line number "<line.first().fromNum<<" "<line.first().toNum<<" "<line.first().isZeroBranch<line.first().dispose <::iterator ite=this->line.begin(); ite!=this->line.end(); ite++) { LineStru l=*ite; if(l.dispose) { continue; } writer<r<x<b1<b2<::iterator ite=this->sw.begin(); ite!=this->sw.end(); ite++) { if(ite->dispose) { continue; } writer<fromNum<toNum<sw->r<sw->x<sw->b1<sw->b2<::iterator ite=this->dg.begin(); ite!=this->dg.end(); ite++) { if(ite->dispose) { continue; } writer<fromNum<toNum<dg->r<dg->x<dg->b1<dg->b2<loadDir); QStringList files; files=recurseDir.getFiles(); //只取文件名 QStringList baseNames; foreach(QString file,files) { QFileInfo fileInfo(file); if(fileInfo.suffix().toLower()!="csv") { continue; } baseNames< groudBranch;//first is g, second is b. QList nodePQ;//节点注入功率,也就是负荷或者发电机 QStringList usedLoad; //电容器补偿量 QHash capacitor; for(QList::iterator ite=this->tf.begin(); ite!=this->tf.end(); ite++) { if(ite->dispose) { continue; } PowerTransformer *tf=ite->tf->getTF(); QString subID=tf->getEquipmentMemberOf_EquipmentContainer();//所属Substation的ID Substation *sub=static_cast(this->eleHT[subID]); if(!sub) { std::cout<<"CIMExporter:: can not substation of "<getID().toStdString()<fromNum<toNum<tf->r<tf->x<tf->ratio<fromNum, ite->tf->g1,ite->tf->b1));//都只用g1,b1的数据 //保存补偿量 capacitor[ite->toNum]=ite->tf->capacityMVA*.3;//30% 容性 // std::cout<<"cap "<tf->capacityMVA<< ite->id.toStdString()<toNum] < > vecLoadInfo=loadMapping.getSubstationLoad(sub->getID()); foreach(QSharedPointer p,vecLoadInfo) { QFileInfo targetBasename(p->getLoadPath()); // std::cout<<"search for "<toNum,p->get3PhP(),p->get3PhQ())); // writer<<"type"<<"\t"; // writer<id<<"\t"; // writer<getMVA()<<"\r\n"; //加到LoadExport中 LoadExporter loadExporter; loadExporter.add(targetBasename.baseName(),p); break; } } } writer<<0<::iterator ite=this->dg.begin(); ite!=this->dg.end(); ite++) { //保存到节点注入功率中 nodePQ.push_back(CIMExporter::NodePQ(ite->toNum,-ite->dg->getPG(0.95)/1000*0.7,-ite->dg->getQG(0.95)/1000*0.7) );//capapcity的单位是kVA // writer<fromNum<<"\t"; // writer<toNum<<"\t"; // writer<dg->capacity<<"\r\n"; } //iPso 开始输出注入功率 CIMExporter::NodePQ *nodePQPointer=new CIMExporter::NodePQ[this->number.keys().length()]; foreach(CIMExporter::NodePQ n,nodePQ) { int nodeNum=n.nodeNum; if(nodeNum>this->number.keys().length()) { std::cout<<"number of nodePQ is beyond node number."<number.keys().length();i++) { writer<topologyTest(); fd.close(); } } template void CIMExporter::idToNumber(QList &s)//把所有元件的标识进行编号 { for(typename QList::iterator ite=s.begin(); ite!=s.end(); ite++ ) { if(ite->dispose) { // std::cout<id.toStdString()<<" dispose"<numberIt(_t.fromID); _t.toNum=this->numberIt(_t.toID); // std::cout<<"id "<<_t.id.toStdString()<<" "<<_t.fromNum<<" "<<_t.toNum<number.contains(id)) { return this->number.value(id); } else { int n=this->number.keys().length()+1; this->number[id]=n; // std::cout< > linkage; for(QList::iterator ite=this->line.begin(); ite!=this->line.end(); ite++) { if(ite->dispose) { continue; } linkage.push_back(QPair(ite->fromNum,ite->toNum)); } for(QList::iterator ite=this->sw.begin(); ite!=this->sw.end(); ite++) { if(ite->dispose) { continue; } linkage.push_back(QPair(ite->fromNum,ite->toNum)); } for(QList::iterator ite=this->tf.begin(); ite!=this->tf.end(); ite++) { if(ite->dispose) { continue; } linkage.push_back(QPair(ite->fromNum,ite->toNum)); } for(QList::iterator ite=this->dg.begin(); ite!=this->dg.end(); ite++) { if(ite->dispose) { continue; } linkage.push_back(QPair(ite->fromNum,ite->toNum)); } TopologyTest tpTest(this->number.keys().length()); if(tpTest.start(linkage)) { std::cout<<"topoloty ok!"<