bool EditableModelItemImpl::loadModelFile(const std::string& filename) { BodyPtr newBody; MessageView* mv = MessageView::instance(); mv->beginStdioRedirect(); bodyLoader.setMessageSink(mv->cout(true)); newBody = bodyLoader.load(filename); mv->endStdioRedirect(); if(newBody){ newBody->initializeState(); newBody->calcForwardKinematics(); Link* link = newBody->rootLink(); AbstractBodyLoaderPtr loader = bodyLoader.lastActualBodyLoader(); VRMLBodyLoader* vloader = dynamic_cast<VRMLBodyLoader*>(loader.get()); if (vloader) { // VRMLBodyLoader supports retriveOriginalNode function setLinkTree(link, vloader); } else { // Other loaders dont, so we wrap with inline node VRMLProtoInstance* proto = new VRMLProtoInstance(new VRMLProto("")); MFNode* children = new MFNode(); VRMLInlinePtr inl = new VRMLInline(); inl->urls.push_back(filename); children->push_back(inl); proto->fields["children"] = *children; // first, create joint item JointItemPtr item = new JointItem(link); item->originalNode = proto; self->addChildItem(item); ItemTreeView::instance()->checkItem(item, true); // next, create link item under the joint item LinkItemPtr litem = new LinkItem(link); litem->originalNode = proto; litem->setName("link"); item->addChildItem(litem); ItemTreeView::instance()->checkItem(litem, true); } for (int i = 0; i < newBody->numDevices(); i++) { Device* dev = newBody->device(i); SensorItemPtr sitem = new SensorItem(dev); Item* parent = self->findItem<Item>(dev->link()->name()); if (parent) { parent->addChildItem(sitem); ItemTreeView::instance()->checkItem(sitem, true); } } } return (newBody); }
bool BodyItemImpl::loadModelFile(const std::string& filename) { MessageView* mv = MessageView::instance(); mv->beginStdioRedirect(); bodyLoader.setMessageSink(mv->cout(true)); BodyPtr newBody = bodyLoader.load(filename); mv->endStdioRedirect(); if(newBody){ body = newBody; body->setName(self->name()); body->initializeState(); } initBody(false); return (newBody); }