static void do_node_add(bContext *C, bNodeTemplate *ntemp) { Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); SpaceNode *snode = CTX_wm_space_node(C); ScrArea *sa = CTX_wm_area(C); ARegion *ar; bNode *node, *node_new; /* get location to add node at mouse */ for (ar = sa->regionbase.first; ar; ar = ar->next) { if (ar->regiontype == RGN_TYPE_WINDOW) { wmWindow *win = CTX_wm_window(C); int x = win->eventstate->x - ar->winrct.xmin; int y = win->eventstate->y - ar->winrct.ymin; if (y < 60) y += 60; UI_view2d_region_to_view(&ar->v2d, x, y, &snode->cursor[0], &snode->cursor[1]); } } /* store selection in temp test flag */ for (node = snode->edittree->nodes.first; node; node = node->next) { if (node->flag & NODE_SELECT) node->flag |= NODE_TEST; else node->flag &= ~NODE_TEST; } node_new = node_add_node(snode, bmain, scene, ntemp, snode->cursor[0], snode->cursor[1]); /* select previous selection before autoconnect */ for (node = snode->edittree->nodes.first; node; node = node->next) { if (node->flag & NODE_TEST) node->flag |= NODE_SELECT; } /* deselect after autoconnection */ for (node = snode->edittree->nodes.first; node; node = node->next) { if (node->flag & NODE_TEST) node->flag &= ~NODE_SELECT; } /* once this is called from an operator, this should be removed */ if (node_new) { char undostr[BKE_UNDO_STR_MAX]; BLI_snprintf(undostr, sizeof(undostr), "Add Node %s", nodeLabel(node_new)); BKE_write_undo(C, undostr); } snode_notify(C, snode); snode_dag_update(C, snode); }
void Track::loadFromFile(const string& filename) { TiXmlDocument doc( filename.c_str() ); bool loadOkay = doc.LoadFile(); if(!loadOkay) { cerr << "Unable to open file." << endl; return; } TiXmlElement* root = doc.FirstChildElement(); TiXmlElement* elem; TiXmlElement* innerElem; if(!root) return; //block: Nodes { nodes.clear(); for(elem = root->FirstChildElement("Nodes")->FirstChildElement("Node"); elem; elem = elem->NextSiblingElement("Node")) { string label(elem->Attribute("label")); NodeFlags flags = parseNodeFlags(elem->Attribute("flags")); //if(label == "" || flags == NODE_NONE) // continue; nodes.push_back(new Node(label, flags)); } } //block: Edges { for(elem = root->FirstChildElement("Nodes")->FirstChildElement("Node"); elem; elem = elem->NextSiblingElement("Node")) { string nodeLabel(elem->Attribute("label")); Node* node = getNodes(nodeLabel)[0]; for(innerElem = elem->FirstChildElement("Edge"); innerElem; innerElem = innerElem->NextSiblingElement("Edge")) { string label(innerElem->Attribute("label")); EdgeFlags flags = parseEdgeFlags(innerElem->Attribute("flags")); Direction dir = parseDirection(innerElem->Attribute("direction")); string endpointLabel(innerElem->Attribute("endpoint")); Node* otherNode = getNodes(endpointLabel)[0]; node->makeEdge(*otherNode, flags, dir, label); } } } //block: Constraints { for(elem = root->FirstChildElement("Nodes")->FirstChildElement("Node"); elem; elem = elem->NextSiblingElement("Node")) { string nodeLabel(elem->Attribute("label")); Node* node = getFirstNode(nodeLabel); for(innerElem = elem->FirstChildElement("Constraint"); innerElem; innerElem = innerElem->NextSiblingElement("Constraint")) { Constraint* c = parseConstraint(innerElem, this, node); vector<Node*> nodes = c->getAffectedNodes(); for(size_t x = 0; x < nodes.size(); ++x) { nodes[x]->addConstraint(c); } } } } }