13 auto ret = std::make_shared<WtDataModelRegistry>();
28 std::map<dyno::ObjectId, WtNode*> nodeMap;
34 auto addNodeWidget = [&](std::shared_ptr<Node> m) ->
void
36 auto mId = m->objectId();
38 auto type = std::make_unique<WtNodeWidget>(m);
55 Wt::WPointF posView(m->bx(), m->by());
57 node.nodeGraphicsObject().setHotKey0Checked(m->isVisible());
58 node.nodeGraphicsObject().setHotKey1Checked(m->isActive());
59 node.nodeGraphicsObject().setPos(posView);
63 for (
auto it = scn->begin(); it != scn->end(); it++)
65 addNodeWidget(it.get());
68 auto createNodeConnections = [&](std::shared_ptr<Node> nd) ->
void
70 auto inId = nd->objectId();
72 if (nodeMap.find(inId) != nodeMap.end())
74 auto inBlock = nodeMap[nd->objectId()];
76 auto ports = nd->getImportNodes();
78 for (
int i = 0; i < ports.size(); i++)
83 auto node = ports[i]->getNodes()[0];
86 auto outId = node->objectId();
87 if (nodeMap.find(outId) != nodeMap.end())
89 auto outBlock = nodeMap[node->objectId()];
98 auto&
nodes = ports[i]->getNodes();
100 for (
int j = 0; j <
nodes.size(); j++)
102 if (
nodes[j] !=
nullptr)
104 auto outId =
nodes[j]->objectId();
105 if (nodeMap.find(outId) != nodeMap.end())
107 auto outBlock = nodeMap[outId];
116 auto fieldInp = nd->getInputFields();
117 for (
int i = 0; i < fieldInp.size(); i++)
119 auto fieldSrc = fieldInp[i]->getSource();
120 if (fieldSrc !=
nullptr) {
121 auto parSrc = fieldSrc->parent();
122 if (parSrc !=
nullptr)
128 if (nodeSrc ==
nullptr)
131 if (moduleSrc !=
nullptr)
135 if (nodeSrc !=
nullptr)
140 unsigned int outFieldIndex = 0;
141 bool fieldFound =
false;
142 for (
auto f : fieldsOut)
152 if (nodeMap[outId]->nodeDataModel()->allowExported()) outFieldIndex++;
154 if (fieldFound && nodeMap.find(outId) != nodeMap.end())
156 auto outBlock = nodeMap[outId];
166 for (
auto it = scn->begin(); it != scn->end(); it++)
168 createNodeConnections(it.get());
206 auto model =
dynamic_cast<WtNodeWidget*
>(node->nodeDataModel());
207 if (model !=
nullptr)
209 model->enableEditing();
222 auto model =
dynamic_cast<WtNodeWidget*
>(node->nodeDataModel());
223 if (model !=
nullptr)
225 model->disableEditing();
232 Wt::log(
"info") << NodeName;
235 std::shared_ptr<dyno::Node> new_node(
dynamic_cast<dyno::Node*
>(node_obj));
236 auto dat = std::make_unique<WtNodeWidget>(std::move(new_node));
241 scn->addNode(dat->getNode());
245 Wt::log(
"info") <<
"nullptr";
250 auto addNodeWidget = [&](std::shared_ptr<Node> m) ->
void
254 auto type = std::make_unique<WtNodeWidget>(m);
258 Wt::WPointF posView(m->bx(), m->by());
260 node.nodeGraphicsObject().setPos(posView);
270 for (
auto it = scn->begin(); it != scn->end(); it++)
274 addNodeWidget(it.get());
279 addNodeWidget(dat->getNode());
289 scn->addNode(nodeData->getNode());
298 auto qNodeWidget = std::make_unique<WtNodeWidget>(node);
304 for (
auto const& _node :
_nodes)
311 Wt::WPointF pos = obj.
getPos();
313 y = std::max(y,
float(pos.y() + h));
316 Wt::WPointF posView(0.0f, y + 50.0f);
318 qNode.nodeGraphicsObject().setPos(posView);
329 auto node = nodeData->getNode();
330 node->setVisible(checked);
340 auto node = nodeData->getNode();
341 node->setActive(checked);
352 for (
auto node :
nodes)
354 if (node->id() == n.
id())
356 node->nodeGraphicsObject().setHotKey1Hovered(
true);
361 node->nodeGraphicsObject().setHotKey1Hovered(
false);
374 for (
auto node :
nodes)
387 for (
auto node :
nodes)
389 if (node->id() == n.
id())
391 node->nodeGraphicsObject().setHotKey0Hovered(
true);
396 node->nodeGraphicsObject().setHotKey0Hovered(
false);
409 for (
auto node :
nodes)
411 auto a = node->nodeDataModel();
422 for (
auto node :
nodes)
424 auto dataModel =
dynamic_cast<WtNodeWidget*
>(node->nodeDataModel());
425 if (dataModel !=
nullptr)
427 auto dNode = dataModel->getNode();
428 dNode->setAutoSync(autoSync);
442 ToggleAutoSyncAct(
bool autoSync) { mAutoSync = autoSync; }
444 void process(
Node* node)
override {
449 bool mAutoSync =
true;
452 ToggleAutoSyncAct act(autoSync);
455 if (dataModel !=
nullptr)
457 auto dNode = dataModel->getNode();
458 if (dNode ==
nullptr)
return;
460 scn->traverseForward(dNode, &act);
467 Wt::log(
"info") <<
"Show something about this node";
478 auto constructDAG = [&](std::shared_ptr<Node> nd) ->
void
480 auto inId = nd->objectId();
481 auto ports = nd->getImportNodes();
486 bool NodeConnection =
false;
487 bool FieldConnection =
false;
489 for (
int i = 0; i < ports.size(); i++)
495 auto node = ports[i]->getNodes()[0];
498 auto outId = node->objectId();
507 auto&
nodes = ports[i]->getNodes();
509 for (
int j = 0; j <
nodes.size(); j++)
511 if (
nodes[j] !=
nullptr)
513 auto outId =
nodes[j]->objectId();
523 auto fieldInp = nd->getInputFields();
525 for (
int i = 0; i < fieldInp.size(); i++)
527 auto fieldSrc = fieldInp[i]->getSource();
529 if (fieldSrc !=
nullptr) {
530 auto parSrc = fieldSrc->parent();
532 if (parSrc !=
nullptr)
534 Node* nodeSrc =
dynamic_cast<Node*
>(parSrc);
537 if (nodeSrc ==
nullptr)
540 if (moduleSrc !=
nullptr)
544 if (nodeSrc !=
nullptr)
557 for (
auto it = scn->begin(); it != scn->end(); it++)
559 constructDAG(it.get());
567 std::map<dyno::ObjectId, WtNode*> qtNodeMapper;
568 std::map<dyno::ObjectId, Node*> nodeMapper;
570 for (
auto const& _node :
_nodes)
572 auto const& qtNode = _node.second;
573 auto model = qtNode->nodeDataModel();
577 if (model !=
nullptr)
579 auto node = nodeData->getNode();
582 qtNodeMapper[node->objectId()] = qtNode.get();
583 nodeMapper[node->objectId()] = node.get();
588 float tempOffsetY = 0.0f;
589 float offsetX = 0.0f;
593 auto& xc = layout.
layer(l);
595 float offsetY = 0.0f;
598 for (
size_t index = 0; index < xc.size(); index++)
601 if (qtNodeMapper.find(
id) != qtNodeMapper.end())
603 WtNode* qtNode = qtNodeMapper[id];
606 float w = geo.
width();
609 xMax = std::max(xMax, w);
611 Node* node = nodeMapper[id];
615 offsetY += (h +
mDy);
619 offsetX += (xMax +
mDx);
621 tempOffsetY = std::max(tempOffsetY, offsetY);
628 std::set<dyno::ObjectId>::iterator it;
630 float ofstY = tempOffsetY;
633 for (it = otherVertices.begin(); it != otherVertices.end(); it++)
637 if (qtNodeMapper.find(
id) != qtNodeMapper.end())
639 WtNode* qtNode = qtNodeMapper[id];
644 Node* node = nodeMapper[id];
647 ofstX += width +
mDx;
651 qtNodeMapper.clear();
void setRegistry(std::shared_ptr< WtDataModelRegistry > registry)
std::vector< WtNode * > allNodes() const
WtNode & createNode(std::unique_ptr< WtNodeDataModel > &&dataModel, Wt::WPainter *painter, int selectType)
std::map< dyno::ObjectId, WtNode * > OutNodeMap
std::shared_ptr< WtConnection > createConnection(PortType connectedPort, WtNode &node, PortIndex portIndex, Wt::WPainter *painter)
std::unordered_map< Wt::Guid, std::unique_ptr< WtNode > > const & nodes() const
std::unordered_map< Wt::Guid, UniqueNode > _nodes
void enableRendering(WtNode &n, bool checked)
void fieldUpdated(dyno::FBase *field, int status)
void showContextMenu(WtNode &n, const Wt::WPointF &pos)
void autoSyncAllDescendants(WtNode &n, bool autoSync)
void enablePhysics(WtNode &n, bool checked)
std::shared_ptr< dyno::SceneGraph > mScene
void addNodeByString(std::string NodeName)
void updateNodeGraphView()
Update the view only for the active scene graph, the data model will not be changed.
void autoSyncAllNodes(bool autoSync)
void createNodeGraphView()
create a QT-based view for the active scene graph.
void showThisNodeOnly(WtNode &n)
void createWtNode(std::shared_ptr< dyno::Node > node)
void activateThisNodeOnly(WtNode &n)
void showHelper(WtNode &n)
WtNodeFlowScene(std::shared_ptr< WtDataModelRegistry > registry, Wt::WPainter *painter)
unsigned int width() const
unsigned int height() const
Wt::WPointF getPos() const
WtNodeDataModel * nodeDataModel() const
WtNodeGeometry & nodeGeometry()
Automatic layout for directed acyclic graph Refer to "Sugiyama Algorithm" by Nikola S....
std::set< ObjectId > & getOtherVertices()
std::vector< ObjectId > & layer(size_t l)
Graph class represents a directed graph.
void removeID(ObjectId v=-1, ObjectId w=-1)
void addEdge(ObjectId v, ObjectId w)
void addOtherVertices(ObjectId v)
void setAutoSync(bool con)
Whether the node can be automatically synchronized when its ancestor is updated.
std::vector< FBase * > & getOutputFields()
void setBlockCoord(float x, float y)
static std::map< std::string, ClassInfo * > * getClassMap()
static Object * createObject(std::string name)
static SceneGraphFactory * instance()
std::shared_ptr< SceneGraph > active()