"Initialize from name, parent id and placement wrt parent joint."))
.def(bp::init<conststd::string&,constJointIndex,constFrameIndex,constSE3_fx&,FrameType>((bp::arg("name (string)"),bp::arg("index of parent joint"),bp::args("index of parent frame"),bp::arg("SE3 placement"),bp::arg("type (FrameType)")),
"Initialize from name, parent joint id, parent frame id and placement wrt parent joint."))
.def_readwrite("name",&Frame::name,"name of the frame")
.def_readwrite("parent",&Frame::parent,"id of the parent joint")
.def_readwrite("previousFrame",&Frame::previousFrame,"id of the previous frame")
.add_property("placement",
&FramePythonVisitor::getPlacementWrtParentJoint,
&FramePythonVisitor::setPlacementWrtParentJoint,
"placement in the parent joint local frame")
.def_readwrite("type",&Frame::type,"type of the frame")
bp::return_internal_reference<>()),"Vector of subtrees. subtree[j] corresponds to the subtree supported by the joint j.")
.add_property("names",
bp::make_function(&ModelPythonVisitor::names,
bp::return_internal_reference<>()))
.def("addJoint",&ModelPythonVisitor::addJoint,bp::args("parent_id","joint_model","joint_placement","joint_name"),"Adds a joint to the kinematic tree. The joint is defined by its placement relative to its parent joint and its name.")
.def("appendBodyToJoint",&ModelPythonVisitor::appendBodyToJoint,bp::args("joint_id","body_inertia","body_placement","body_name"),"Appends a body to the joint given by its index. The body is defined by its inertia, its relative placement regarding to the joint and its name.")
.add_property("effortLimit",bp::make_function(&ModelPythonVisitor::effortLimit),"Joint max effort")
.def("addFrame",(bool(*)(ModelHandler&,conststd::string&,constJointIndex,constSE3_fx&,constFrameType&))&ModelPythonVisitor::addFrame,bp::args("name","parent_id","placement","type"),"Add a frame to the vector of frames. See also Frame for more details. Returns False if the frame already exists.")
.def("addFrame",(bool(*)(ModelHandler&,constFrame&))&ModelPythonVisitor::addFrame,bp::args("frame"),"Add a frame to the vector of frames.")
.add_property("frames",bp::make_function(&ModelPythonVisitor::frames,bp::return_internal_reference<>()),"Vector of frames contained in the model.")
.def("existFrame",&ModelPythonVisitor::existFrame,bp::args("name"),"Returns true if the frame given by its name exists inside the Model.")
.def("getFrameId",&ModelPythonVisitor::getFrameId,bp::args("name"),"Returns the index of the frame given by its name. If the frame is not in the frames vector, it returns the current size of the frames vector.")
.add_property("subtrees",
bp::make_function(&ModelPythonVisitor::subtrees,
bp::return_internal_reference<>()),"Vector of subtrees. subtree[j] corresponds to the subtree supported by the joint j.")
.def("addJoint",&ModelPythonVisitor::addJoint,bp::args("parent_id","joint_model","joint_placement","joint_name"),"Adds a joint to the kinematic tree. The joint is defined by its placement relative to its parent joint and its name.")
// ADD addJoint with limits ? See boost::python overloading/default parameters
.def("addJointFrame",&ModelPythonVisitor::addJointFrame,bp::args("jointIndex","frameIndex"),"add the joint at index jointIndex as a frame to the frame tree")
.def("appendBodyToJoint",&ModelPythonVisitor::appendBodyToJoint,bp::args("joint_id","body_inertia","body_placement"),"Appends a body to the joint given by its index. The body is defined by its inertia, its relative placement regarding to the joint and its name.")
.def("addBodyFrame",&ModelPythonVisitor::addBodyFrame,bp::args("body_name","parentJoint","body_plaement","previous_frame(parent frame)"),"add a body to the frame tree")
.def("getBodyId",&ModelPythonVisitor::getBodyId,bp::args("name"),"Return the index of a frame of type BODY given by its name")
.def("existBodyName",&ModelPythonVisitor::existBodyName,bp::args("name"),"Check if a frame of type BODY exists, given its name")
.def("getJointId",&ModelPythonVisitor::getJointId,bp::args("name"),"Return the index of a joint given by its name")
.def("existJointName",&ModelPythonVisitor::existJointName,bp::args("name"),"Check if a joint given by its name exists")
.def("getFrameId",&ModelPythonVisitor::getFrameId,bp::args("name"),"Returns the index of the frame given by its name. If the frame is not in the frames vector, it returns the current size of the frames vector.")
.def("existFrame",&ModelPythonVisitor::existFrame,bp::args("name"),"Returns true if the frame given by its name exists inside the Model.")
.def("addFrame",(bool(*)(ModelHandler&,conststd::string&,constJointIndex,constFrameIndex,constSE3_fx&,constFrameType&))&ModelPythonVisitor::addFrame,bp::args("name","parent_id","placement","type"),"Add a frame to the vector of frames. See also Frame for more details. Returns False if the frame already exists.")
.def("addFrame",(bool(*)(ModelHandler&,constFrame&))&ModelPythonVisitor::addFrame,bp::args("frame"),"Add a frame to the vector of frames.")