Home › Forum › SOFA › Programming with SOFA › [SOLVED] Initialize and read a data
Tagged: 64_bits, Data Component, Linux_other, SOFA_other
- This topic has 3 replies, 3 voices, and was last updated 5 years, 8 months ago by Hugo.
-
AuthorPosts
-
8 April 2019 at 16:28 #13374gaetanBlocked
Bonjour,
Je commence a programmer avec Sofa (v18.12 sous fedora linux), j’ai suivi la doc sur la creation d’un plugin mais j’ai du mal a comprendre l’initialisation d’une donnee. Voici mon code suivi des mes questions. Le plugin contient un composant et un Data.
Dans ma scene python :
rootNode.createObject('MyComponent', myparam='true')
MyComponent.h :
#include "config.h" #include <sofa/core/objectmodel/BaseObject.h> #include <sofa/core/objectmodel/Data.h> class MyComponent : public sofa::core::objectmodel::BaseObject { public: SOFA_CLASS(MyComponent, sofa::core::objectmodel::BaseObject); protected: MyComponent(); virtual ~MyComponent(); private: sofa::core::objectmodel::Data<bool> d_myparam; };
MyComponent.cpp :
#include "MyComponent.h" #include <sofa/core/ObjectFactory.h> MyComponent::MyComponent() : d_myparam(initData(&d_myparam, false, "myparam", "Here should be a short description of myparam.")) { if(d_myparam.getValue()) std::cout << "Resultat affiche : OK" << std::endl; else std::cout << "Resultat affiche : ERREUR" << std::endl; } MyComponent::~MyComponent() { } int MyComponentClass = sofa::core::RegisterObject("This component does nothing.").add<MyComponent>();
– Lorsque le composant est cree depuis la scene, le constructeur
MyComponent()
est appele maisd_myparam
est toujours initialise a la valeur par defaut (ici false). Pourquoi ne prend-t-il la valeur donnee dans la scene ?
– Dans la declaration du parametre, pourquoi suis-je oblige de rajoutersofa::core::objectmodel::
devantData<T>
pour que la methode soit reconnue ? Je ne l’ai pas vu dans les autres fichiers et j’ai importe Data.h ..J’espere que j’ai ete assez clair et merci d’avance pour votre aide,
Gaetan
9 April 2019 at 11:11 #13382Bruno MarquesBlockedBonjour Gaetan,
SOFA initialise ses composants en plusieurs étapes.
Tout d’abord, leconstructeur
de la classe est appelé. Les datafields sont initialisées à leurs valeurs par défaut.
Ensuite, la méthodeparse()
est appelée, et cette méthode va (justement) parser ton fichier de scène XML ou python, ou tonBaseObjectDescription
, en fonction de si ta scène est construite depuis le C++, ou depuis un fichier de scène.Enfin, le composant est ‘initialisé’ càd ses valeurs internes sont mises à jour en fonction des paramètres passés via le mécanisme de DATA.
DONC: tout code dans le constructeur ignorera toujours les valeurs passées à tes data.
Si tu surcharge la méthodeinit()
deBaseObject
, et y déplace le code que tu as actuellement dans le ctor, ca devrait marcher mieux 🙂Bon courage dans tes premiers pas avec SOFA! 🙂
9 April 2019 at 16:20 #13383gaetanBlockedSuper merci beaucoup !
11 April 2019 at 19:01 #13402HugoKeymasterThanks @bmarques for the feedback.
@gaetan, the forum is an international tools used by the entire community. Therefore it’s more convenient for everyone to ask questions and reply in English so that the solutions, advises can benefit our worldwide community.Happy to see you and the Epione team back to simulation business. Never hesitate to ask further SOFA questions. We are always here for you!
Best
Hugo
-
AuthorPosts
- You must be logged in to reply to this topic.