/// Generic list of objects access, possibly searching up or down from the current context /// /// Note that the template wrapper method should generally be used to have the correct return type, void DAGNode::getObjects(const sofa::core::objectmodel::ClassInfo& class_info, GetObjectsCallBack& container, const sofa::core::objectmodel::TagSet& tags, SearchDirection dir) const { if (dir == SearchRoot) { if (!getParents().empty()) { getRootContext()->getObjects(class_info, container, tags, dir); return; } else dir = SearchDown; // we are the root, search down from here. } if (dir != SearchParents) for (ObjectIterator it = this->object.begin(); it != this->object.end(); ++it) { core::objectmodel::BaseObject* obj = it->get(); void* result = class_info.dynamicCast(obj); if (result != NULL && (tags.empty() || (obj)->getTags().includes(tags))) container(result); } { switch(dir) { case Local: break; case SearchParents: case SearchUp: { // WORK IN PROGRESS // TODO: manage diamond setups to avoid multiple getObjects() calls on a Node... Parents parents = getParents(); for (Parents::iterator it = parents.begin(); it!=parents.end(); it++) dynamic_cast<Node*>(*it)->getObjects(class_info, container, tags, SearchUp); } break; case SearchDown: for(ChildIterator it = child.begin(); it != child.end(); ++it) { if ((*it)->isActive()) (*it)->getObjects(class_info, container, tags, dir); } break; case SearchRoot: std::cerr << "SearchRoot SHOULD NOT BE POSSIBLE HERE!\n"; break; } } }
/// Generic list of objects access, possibly searching up or down from the current context /// /// Note that the template wrapper method should generally be used to have the correct return type, void GNode::getObjects(const sofa::core::objectmodel::ClassInfo& class_info, GetObjectsCallBack& container, const sofa::core::objectmodel::TagSet& tags, SearchDirection dir) const { if (dir == SearchRoot) { if (parent() != NULL) { if (parent()->isActive()) { parent()->getObjects(class_info, container, tags, dir); return; } else return; } else dir = SearchDown; // we are the root, search down from here. } if (dir != SearchParents) for (ObjectIterator it = this->object.begin(); it != this->object.end(); ++it) { core::objectmodel::BaseObject* obj = it->get(); void* result = class_info.dynamicCast(obj); if (result != NULL && (tags.empty() || (obj)->getTags().includes(tags))) container(result); } { switch(dir) { case Local: break; case SearchParents: case SearchUp: if (parent()) parent()->getObjects(class_info, container, tags, SearchUp); break; case SearchDown: for(ChildIterator it = child.begin(); it != child.end(); ++it) { if ((*it)->isActive()) (*it)->getObjects(class_info, container, tags, dir); } break; case SearchRoot: std::cerr << "SearchRoot SHOULD NOT BE POSSIBLE HERE!\n"; break; } } }