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()