diff --git a/testHasttable/aclinesegment.cpp b/testHasttable/aclinesegment.cpp index d2cd1d0..a87ed96 100644 --- a/testHasttable/aclinesegment.cpp +++ b/testHasttable/aclinesegment.cpp @@ -10,7 +10,7 @@ bool ACLineSegment::derivedParse(QXmlStreamReader &reader) { QString terminal; terminal=reader.attributes().value("rdf:resource").toString(); - this->terminalA=terminal.replace("#","").leftRef(-1);//返回整个字符串的Ref + this->terminalA=terminal.replace("#","").leftRef(-1).toString();//返回整个字符串的Ref qDebug()<<"got "<<"ConductingEquipment.Terminals "<terminalA<<"\n"; this->isTerminalA=false; } @@ -18,19 +18,28 @@ bool ACLineSegment::derivedParse(QXmlStreamReader &reader) { QString terminal; terminal=reader.attributes().value("rdf:resource").toString(); - this->terminalB=terminal.replace("#","").leftRef(-1);//返回整个字符串的Ref + this->terminalB=terminal.replace("#","").leftRef(-1).toString();//返回整个字符串的Ref qDebug()<<"got "<<"ConductingEquipment.Terminals "<terminalB<<"\n"; } if("ConductingEquipment.Substation"==reader.name() && reader.attributes().hasAttribute("rdf:resource")) { QString ss; ss=reader.attributes().value("rdf:resource").toString(); - this->containsOfSubstation=ss.replace("#","").leftRef(-1);//返回整个字符串的Ref + this->containsOfSubstation=ss.replace("#","").leftRef(-1).toString();//返回整个字符串的Ref qDebug()<<"got "<<"ConductingEquipment.Substation "<containsOfSubstation<<"\n"; } return true; } +QString ACLineSegment::getTerminalA() +{ + return this->terminalA; +} +QString ACLineSegment::getTerminalB() +{ + return this->terminalB; +} + bool ACLineSegment::parse(QXmlStreamReader &reader) { return this->parseBasicInfo(reader); diff --git a/testHasttable/aclinesegment.h b/testHasttable/aclinesegment.h index 5721d4b..ebc07ea 100644 --- a/testHasttable/aclinesegment.h +++ b/testHasttable/aclinesegment.h @@ -6,10 +6,12 @@ class ACLineSegment:public BasicElementInfo public: explicit ACLineSegment(QObject *parent = 0); virtual bool parse(QXmlStreamReader &reader); + QString getTerminalA(); + QString getTerminalB(); protected: - QStringRef terminalA; - QStringRef terminalB; - QStringRef containsOfSubstation; + QString terminalA; + QString terminalB; + QString containsOfSubstation; virtual bool derivedParse(QXmlStreamReader &reader); private: bool isTerminalA; diff --git a/testHasttable/breaker.cpp b/testHasttable/breaker.cpp index 5fe8f63..103efbf 100644 --- a/testHasttable/breaker.cpp +++ b/testHasttable/breaker.cpp @@ -1,6 +1,6 @@ #include "breaker.h" - -Breaker::Breaker(QObject *parent):BasicElementInfo(parent) +#include +Breaker::Breaker(QObject *parent):BasicElementInfo(parent),isTerminalA(true) { } @@ -31,6 +31,15 @@ bool Breaker::derivedParse(QXmlStreamReader &reader) return true; } +QString Breaker::getTerminalA() +{ + return this->terminalA; +} +QString Breaker::getTerminalB() +{ + return this->terminalB; +} + bool Breaker::parse(QXmlStreamReader &reader) { return this->parseBasicInfo(reader); diff --git a/testHasttable/breaker.h b/testHasttable/breaker.h index 9d1ea96..5fe6d2c 100644 --- a/testHasttable/breaker.h +++ b/testHasttable/breaker.h @@ -1,12 +1,15 @@ #ifndef BREAKER_H #define BREAKER_H #include +#include #include "BasicElementInfo.h" class Breaker:public BasicElementInfo { public: explicit Breaker(QObject *parent = 0); virtual bool parse(QXmlStreamReader& reader); + QString getTerminalA(); + QString getTerminalB(); protected: QString terminalA; QString terminalB; diff --git a/testHasttable/disconnector.cpp b/testHasttable/disconnector.cpp index a01acc4..39c4c62 100644 --- a/testHasttable/disconnector.cpp +++ b/testHasttable/disconnector.cpp @@ -1,6 +1,6 @@ #include "disconnector.h" -Disconnector::Disconnector(QObject *parent):BasicElementInfo(parent) +Disconnector::Disconnector(QObject *parent):BasicElementInfo(parent),isTerminalA(true) { } diff --git a/testHasttable/elementhashtable.cpp b/testHasttable/elementhashtable.cpp index c4b742d..1799161 100644 --- a/testHasttable/elementhashtable.cpp +++ b/testHasttable/elementhashtable.cpp @@ -1,7 +1,7 @@ #include "elementhashtable.h" #include ElementHashtable::ElementHashtable(QObject *parent) : - QObject(parent) + QObject(parent),currentHT(NULL) { } @@ -60,40 +60,45 @@ bool ElementHashtable::child(QXmlStreamReader &reader) if(pointer && id!="") { - this->eleHT[id]=pointer; + QHash *hash=this->currentHT; + (*hash)[id]=pointer; } return true; } -bool ElementHashtable::goPath() +bool ElementHashtable::GoPath() { - const QHash &ht=this->eleHT; + const QHash &zwht=this->eleHT;//从配网开始找 QList keys; - keys=ht.keys(); + keys=zwht.keys(); std::cout<::Iterator ite=keys.begin(); ite!=keys.end(); ite++) { - BasicElementInfo *p=ht[*ite]; - if(p->getName()=="BusbarSection") + BasicElementInfo *p=zwht[*ite]; +// if(p->getName()=="ACLineSegment"){ +// std::cout<getID().toStdString()<getName()=="ACLineSegment" && p->getID()=="AC-456432") { -// std::cout<<"BusbarSection"<<"\n"; - BusbarSection *foo=static_cast(p); - QString terminal=foo->getTerminal(); + ACLineSegment *ac=static_cast(p);//BusbarSection也就是线路头节点 + QString acTerminal=ac->getTerminalB(); //找Terminal的东西 - Terminal *terminalP=static_cast(ht[terminal]); - std::cout<getID().toStdString()<(zwht[acTerminal]); + std::cout<getID().toStdString()<getConnectivityNode(); + node=acTerminalP->getConnectivityNode(); + if(node=="") + { + continue;//有些Terminal是没有Node的 + } std::cout<nodeToTerminal.value(node); -// std::cout<<"anotherTerminal"<(ht[anotherTerminal]); - std::cout<getConductingEquipment().toStdString()<eleHT); + tpRecorder.startWithNode(node); } } + return true; } @@ -131,3 +136,17 @@ bool ElementHashtable::parse(const QString& xmlPath) } return true; } + +bool ElementHashtable::setCurrentHashTable(QHash *t) +{ + this->currentHT=t; + return true; +} + +bool ElementHashtable::Parse(const QString& xmlPWPath,const QString& xmlZWPath){ + this->setCurrentHashTable(&this->eleHT); + this->parse(xmlPWPath); +// this->setCurrentHashTable(&this->mainStationHT); +// this->parse(xmlZWPath); + return true; +} diff --git a/testHasttable/elementhashtable.h b/testHasttable/elementhashtable.h index 01b3174..b06b2e8 100644 --- a/testHasttable/elementhashtable.h +++ b/testHasttable/elementhashtable.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "BasicElementInfo.h" #include "subcontrolarea.h" #include "busbarsection.h" @@ -17,18 +18,22 @@ #include "disconnector.h" #include "powertransformer.h" #include "synchronousmachine.h" -#include "nodetoterminal.h" +#include "topologyrecorder.h" class ElementHashtable : public QObject { Q_OBJECT public: explicit ElementHashtable(QObject *parent = 0); - bool parse(const QString& xmlPath); - bool goPath(); + bool Parse(const QString& xmlPWPath,const QString& xmlZWPath); + bool GoPath(); private: bool child(QXmlStreamReader &reader); + bool setCurrentHashTable(QHash *t); + bool parse(const QString& xmlPath); QHash eleHT; + QHash mainStationHT;//记录主站的元素 NodeToTerminal nodeToTerminal; + QHash *currentHT; signals: public slots: diff --git a/testHasttable/main.cpp b/testHasttable/main.cpp index 663ae95..ad42b0c 100644 --- a/testHasttable/main.cpp +++ b/testHasttable/main.cpp @@ -6,9 +6,9 @@ int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); ElementHashtable eleReader; - eleReader.parse("D:/Project/佛山项目/佛山收资/exportmodel_pw/df8003/df8600/exportfiles/exportmodel_pw.xml"); + eleReader.Parse("D:/Project/佛山项目/佛山收资/exportmodel_pw/df8003/df8600/exportfiles/exportmodel_pw.xml","D:/Project/佛山项目/佛山收资/exportmodel_zwyth20141204/exportmodel_zwyth.xml"); // eleReader.parse("D:/Project/佛山项目/佛山收资/按元素分/BusbarSectionb.xml"); - eleReader.goPath(); + eleReader.GoPath(); // RegexExtract regexExt; // regexExt.extract("D:/Project/佛山项目/佛山收资/exportmodel_pw/df8003/df8600/exportfiles/exportmodel_pw.xml"); // regexExt.exportBlocks("ThermalGeneratingUnit.xml"); diff --git a/testHasttable/nodetoterminal.cpp b/testHasttable/nodetoterminal.cpp index ace622f..6717666 100644 --- a/testHasttable/nodetoterminal.cpp +++ b/testHasttable/nodetoterminal.cpp @@ -1,19 +1,23 @@ #include "nodetoterminal.h" #include -QHash *NodeToTerminal::ht=NULL; +QHash > *NodeToTerminal::ht=NULL; NodeToTerminal::NodeToTerminal() { if(!NodeToTerminal::ht) { // std::cout<<"create"<; + NodeToTerminal::ht=new QHash >; // std::cout<value("").toStdString()<contains(key)) +// { +// std::cout<<"duplicat"<contains(key); } -QString NodeToTerminal::value(const QString& key) +QVector NodeToTerminal::value(const QString& key) { // if(NodeToTerminal::ht) // { diff --git a/testHasttable/nodetoterminal.h b/testHasttable/nodetoterminal.h index bea771c..2f98473 100644 --- a/testHasttable/nodetoterminal.h +++ b/testHasttable/nodetoterminal.h @@ -3,6 +3,7 @@ //一个通过Node检索Terminal的表,做成单例形式 #include #include +#include class NodeToTerminal { public: @@ -10,7 +11,7 @@ public: ~NodeToTerminal(); void add(const QString& key,const QString& value); bool contains(const QString& key); - QString value(const QString& key); + QVector value(const QString& key); private: class CG // 它的唯一工作就是在析构函数中删除CSingleton的实例 { @@ -22,7 +23,7 @@ private: } }; static CG Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数 - static QHash *ht; + static QHash > *ht; }; diff --git a/testHasttable/powertransformer.cpp b/testHasttable/powertransformer.cpp index 02149fb..deb6649 100644 --- a/testHasttable/powertransformer.cpp +++ b/testHasttable/powertransformer.cpp @@ -1,6 +1,6 @@ #include "powertransformer.h" -PowerTransformer::PowerTransformer(QObject *parent):BasicElementInfo(parent) +PowerTransformer::PowerTransformer(QObject *parent):BasicElementInfo(parent),isTerminalA(true) { } diff --git a/testHasttable/testHasttable.pro b/testHasttable/testHasttable.pro index e053269..b6ca7e2 100644 --- a/testHasttable/testHasttable.pro +++ b/testHasttable/testHasttable.pro @@ -29,7 +29,8 @@ SOURCES += main.cpp \ disconnector.cpp \ powertransformer.cpp \ synchronousmachine.cpp \ - nodetoterminal.cpp + nodetoterminal.cpp \ + topologyrecorder.cpp HEADERS += \ elementhashtable.h \ @@ -44,7 +45,8 @@ HEADERS += \ disconnector.h \ powertransformer.h \ synchronousmachine.h \ - nodetoterminal.h + nodetoterminal.h \ + topologyrecorder.h #release{ DEFINES += QT_NO_DEBUG_OUTPUT diff --git a/testHasttable/topologyrecorder.cpp b/testHasttable/topologyrecorder.cpp new file mode 100644 index 0000000..dce99f3 --- /dev/null +++ b/testHasttable/topologyrecorder.cpp @@ -0,0 +1,109 @@ +#include "topologyrecorder.h" +#include +TopologyRecorder::TopologyRecorder(const QHash& elementHT):eleHT(elementHT) +{ +} + +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 + for(int atI=0;atIreachedTerminal.contains(anotherTerminal)) + { + std::cout<reachedTerminal[anotherTerminal]=0; + std::cout<<"anotherTerminal"<(ht[anotherTerminal]); + QString ce; + ce=anotherTerminalP->getConductingEquipment(); + std::cout< fromTo; + fromTo.first=node; + fromTo.second=acID; + this->branch.push_back(fromTo); + //通过ACSegmentLine的ID来找Terminal。下同。 + ACLineSegment *AC=static_cast(ht[acID]); + if(!AC) + { + std::cout<<"can not find "<getTerminalA(); + terminalB=AC->getTerminalB(); + QString nextTerminal; + nextTerminal=(terminalA==anotherTerminal)?terminalB:terminalA; + std::cout<<"new Terminal"<(ht[nextTerminal]); + if(!nextTerminalP) + { + std::cout<<"can not terminal "<getConnectivityNode(); + std::cout<<"next node"<startWithNode(nextNode); + } + if(ce.startsWith("SW")) + { + foundCate=true; + QString swID=ce; + QPair fromTo; + fromTo.first=node; + fromTo.second=swID; + this->branch.push_back(fromTo); + Breaker *SW=static_cast(ht[swID]); + if(!SW) + { + std::cout<<"can not SW "<getTerminalA(); + terminalB=SW->getTerminalB(); + std::cout<<"terminalA"<(ht[nextTerminal]); + if(!nextTerminalP) + { + std::cout<<"can not terminal "<getConnectivityNode(); + std::cout<<"next node"<startWithNode(nextNode); + + } + if(ce.startsWith("BS")) + { + continue; + } + if(!foundCate) + { + std::cout<<"not found cate "< +#include +#include +#include +#include "BasicElementInfo.h" +#include "breaker.h" +#include "aclinesegment.h" +#include "nodetoterminal.h" +#include "terminal.h" + +class TopologyRecorder +{ +public: + TopologyRecorder(const QHash& elementHT); + bool startWithNode(const QString& node); +private: + NodeToTerminal nodeToTerminal; + const QHash& eleHT; + QVector > branch; + QHash reachedTerminal; +}; + +#endif // TOPOLOGYRECORDER_H