// TODO inefficient // have a look to how to directlry bind sparse Eigen matrices extern "C" PyObject * BaseMapping_getJs(PyObject * self, PyObject * /*args*/) { BaseMapping* mapping = ((PySPtr<Base>*)self)->object->toBaseMapping(); const helper::vector<sofa::defaulttype::BaseMatrix*>* Js = mapping->getJs(); PyObject* Jspython = PyList_New(Js->size()); for( size_t i=0 ; i<Js->size() ; ++i ) { sofa::defaulttype::BaseMatrix* J = (*Js)[i]; PyObject* Jpython = PyList_New(J->rows()); for( sofa::defaulttype::BaseMatrix::Index row=0 ; row<J->rows() ; ++row ) { PyObject* Jrowpython = PyList_New(J->cols()); for( sofa::defaulttype::BaseMatrix::Index col=0 ; col<J->cols() ; ++col ) PyList_SetItem( Jrowpython, col, PyFloat_FromDouble( J->element(row,col) ) ); PyList_SetItem( Jpython, row, Jrowpython ); } PyList_SetItem( Jspython, i, Jpython ); } return Jspython; }
bool BaseMultiMappingElement::initNode() { using namespace core::objectmodel; using namespace core; bool result = ObjectElement::initNode(); if( result ) { BaseMapping* multimapping = this->getTypedObject()->toBaseMapping(); NodeElement* currentNodeElement = dynamic_cast<NodeElement *>(getParent()); simulation::Node* currentNode = dynamic_cast<simulation::Node* >( currentNodeElement->getTypedObject() ); helper::vector<core::BaseState*> inputStates = multimapping->getFrom(); helper::vector<core::BaseState*> outputStates = multimapping->getTo(); helper::vector<core::BaseState*>::iterator iterState; helper::vector<simulation::Node*> inputNodes, outputNodes; /* get the Nodes corresponding to each input BaseState context */ for( iterState = inputStates.begin(); iterState != inputStates.end(); ++iterState) { simulation::Node* node = dynamic_cast< simulation::Node* >((*iterState)->getContext()); inputNodes.push_back(node); } /* */ /* get the Nodes corresponding to each output BaseState context */ for( iterState = outputStates.begin(); iterState != outputStates.end(); ++iterState) { simulation::Node* node = dynamic_cast< simulation::Node* >((*iterState)->getContext()); outputNodes.push_back(node); } helper::vector<simulation::Node*>::iterator iterNode; BaseNode* currentBaseNode; /* filter out inputNodes which already belong to the currentNode ancestors */ helper::vector<simulation::Node*> otherInputNodes; helper::vector<simulation::Node*> ancestorInputNodes; iterNode = inputNodes.begin(); currentBaseNode = currentNode; for( iterNode = inputNodes.begin(); iterNode != inputNodes.end(); ++iterNode) { if( !currentBaseNode->hasAncestor(*iterNode) ) { otherInputNodes.push_back(*iterNode); } else { ancestorInputNodes.push_back(*iterNode); } } updateSceneGraph(multimapping, ancestorInputNodes, otherInputNodes, outputNodes ); } return result; }
extern "C" PyObject * BaseMapping_applyJ(PyObject * self, PyObject * /*args*/) { BaseMapping* mapping = ((PySPtr<Base>*)self)->object->toBaseMapping(); mapping->applyJ(MechanicalParams::defaultInstance(),VecDerivId::velocity(),ConstVecDerivId::velocity()); Py_RETURN_NONE; }
extern "C" PyObject * BaseMapping_apply(PyObject * self, PyObject * /*args*/) { BaseMapping* mapping = ((PySPtr<Base>*)self)->object->toBaseMapping(); mapping->apply(MechanicalParams::defaultInstance(),VecCoordId::position(),ConstVecCoordId::position()); Py_RETURN_NONE; }
extern "C" PyObject * BaseMapping_getTo(PyObject * self, PyObject * /*args*/) { BaseMapping* mapping = ((PySPtr<Base>*)self)->object->toBaseMapping(); helper::vector<BaseState*> to = mapping->getTo(); PyObject *list = PyList_New(to.size()); for (unsigned int i=0; i<to.size(); ++i) PyList_SetItem(list,i,sofa::PythonFactory::toPython(to[i])); return list; }
extern "C" PyObject * BaseMapping_setTo(PyObject * self, PyObject * args) { BaseMapping* mapping = ((PySPtr<Base>*)self)->object->toBaseMapping(); PyObject* pyTo; if (!PyArg_ParseTuple(args, "O",&pyTo)) Py_RETURN_NONE; BaseState* to=((PySPtr<Base>*)pyTo)->object->toBaseState(); if (!to) { PyErr_BadArgument(); Py_RETURN_NONE; } mapping->setTo( to ); Py_RETURN_NONE; }
extern "C" PyObject * BaseMapping_setFrom(PyObject * self, PyObject * args) { BaseMapping* mapping = ((PySPtr<Base>*)self)->object->toBaseMapping(); PyObject* pyFrom; if (!PyArg_ParseTuple(args, "O",&pyFrom)) { SP_MESSAGE_ERROR( "BaseMapping_setFrom: a BaseState* is required" ); Py_RETURN_NONE; } BaseState* from=((PySPtr<Base>*)pyFrom)->object->toBaseState(); if (!from) { SP_MESSAGE_ERROR( "BaseMapping_setFrom: is not a BaseState*" ); PyErr_BadArgument(); Py_RETURN_NONE; } mapping->setFrom( from ); Py_RETURN_NONE; }