Skip to content

Commit 73835f1

Browse files
committed
improve writeTreeNodesModelXML
1 parent 4fa2177 commit 73835f1

File tree

2 files changed

+39
-13
lines changed

2 files changed

+39
-13
lines changed

include/behaviortree_cpp_v3/xml_parsing.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ class XMLParser: public Parser
4040
void VerifyXML(const std::string& xml_text,
4141
const std::set<std::string> &registered_nodes);
4242

43-
std::string writeTreeNodesModelXML(const BehaviorTreeFactory& factory);
43+
std::string writeTreeNodesModelXML(const BehaviorTreeFactory& factory,
44+
bool include_builtin = false);
4445

4546
}
4647

src/xml_parsing.cpp

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,8 @@ void XMLParser::Pimpl::getPortsRecursively(const XMLElement *element,
789789
}
790790

791791

792-
std::string writeTreeNodesModelXML(const BehaviorTreeFactory& factory)
792+
std::string writeTreeNodesModelXML(const BehaviorTreeFactory& factory,
793+
bool include_builtin)
793794
{
794795
using namespace BT_TinyXML2;
795796

@@ -801,27 +802,51 @@ std::string writeTreeNodesModelXML(const BehaviorTreeFactory& factory)
801802
XMLElement* model_root = doc.NewElement("TreeNodesModel");
802803
rootXML->InsertEndChild(model_root);
803804

805+
std::set<std::string> ordered_names;
806+
804807
for (auto& model_it : factory.manifests())
805808
{
806-
const auto& registration_ID = model_it.first;
807-
const auto& model = model_it.second;
809+
const auto& registration_ID = model_it.first;
810+
if( !include_builtin &&
811+
factory.builtinNodes().count( registration_ID ) != 0)
812+
{
813+
continue;
814+
}
815+
ordered_names.insert( registration_ID );
816+
}
808817

809-
if( factory.builtinNodes().count( registration_ID ) != 0)
810-
{
811-
continue;
812-
}
818+
for (auto& registration_ID : ordered_names)
819+
{
820+
const auto& model = factory.manifests().at(registration_ID);
813821

814-
if (model.type == NodeType::CONTROL)
815-
{
816-
continue;
817-
}
818822
XMLElement* element = doc.NewElement( toStr(model.type).c_str() );
819823
element->SetAttribute("ID", model.registration_ID.c_str());
820824

821-
for (auto& port : model.ports)
825+
std::vector<std::string> ordered_ports;
826+
PortDirection directions[3] = { PortDirection::INPUT,
827+
PortDirection::OUTPUT,
828+
PortDirection::INOUT };
829+
for(int d=0; d<3; d++)
822830
{
831+
std::set<std::string> port_names;
832+
for (auto& port : model.ports)
833+
{
823834
const auto& port_name = port.first;
824835
const auto& port_info = port.second;
836+
if( port_info.direction() == directions[d] )
837+
{
838+
port_names.insert(port_name);
839+
}
840+
}
841+
for (auto& port : port_names)
842+
{
843+
ordered_ports.push_back(port);
844+
}
845+
}
846+
847+
for (const auto& port_name : ordered_ports)
848+
{
849+
const auto& port_info = model.ports.at(port_name);
825850

826851
XMLElement* port_element = nullptr;
827852
switch( port_info.direction() )

0 commit comments

Comments
 (0)