| 264 | |
| 265 | |
| 266 | AbsBehaviorTree BuildTreeFromScene(const QtNodes::FlowScene *scene, |
| 267 | QtNodes::Node* root_node) |
| 268 | { |
| 269 | if(!root_node ) |
| 270 | { |
| 271 | root_node = findRoot( *scene ); |
| 272 | } |
| 273 | if( !root_node ) |
| 274 | { |
| 275 | if( scene->nodes().size() != 0) |
| 276 | { |
| 277 | qDebug() << "Error: can not create a tree from a scene unless it has a single root node "; |
| 278 | } |
| 279 | return AbsBehaviorTree(); |
| 280 | } |
| 281 | |
| 282 | AbsBehaviorTree tree; |
| 283 | |
| 284 | std::function<void(AbstractTreeNode*, QtNodes::Node*)> pushRecursively; |
| 285 | |
| 286 | pushRecursively = [&](AbstractTreeNode* parent, QtNodes::Node* node) |
| 287 | { |
| 288 | AbstractTreeNode abs_node; |
| 289 | |
| 290 | auto bt_model = dynamic_cast<BehaviorTreeDataModel*>(node->nodeDataModel()); |
| 291 | |
| 292 | abs_node.model = bt_model->model(); |
| 293 | abs_node.instance_name = bt_model->instanceName(); |
| 294 | abs_node.pos = scene->getNodePosition(*node) ; |
| 295 | abs_node.size = scene->getNodeSize(*node); |
| 296 | abs_node.graphic_node = node; |
| 297 | abs_node.ports_mapping = bt_model->getCurrentPortMapping(); |
| 298 | |
| 299 | auto added_node = tree.addNode( parent, std::move(abs_node) ); |
| 300 | |
| 301 | auto children = getChildren( *scene, *node, true ); |
| 302 | |
| 303 | for(auto& child_node: children ) |
| 304 | { |
| 305 | pushRecursively( added_node, child_node ); |
| 306 | } |
| 307 | }; |
| 308 | |
| 309 | pushRecursively( nullptr, root_node ); |
| 310 | |
| 311 | return tree; |
| 312 | } |
| 313 | |
| 314 | AbsBehaviorTree BuildTreeFromXML(const QDomElement& bt_root, const NodeModels& models ) |
| 315 | { |