EX> // Inclusion du fichier d'entête EX> #include "{{CODE_LOWER}}_step{{NAME_LOWER}}.h" EX> EX> // Pour afficher des messages à la console EX> #include EX> EX> // Pour inclure certaines fonctions mathématiques EX> #include EX> EX> // Constructeur : appel du constructeur de la classe mère EX> // et initialisation des paramètres (valeurs par défaut) EX> {{CODE_UPPER}}_Step{{NAME}}::{{CODE_UPPER}}_Step{{NAME}}() : SuperClass() EX> { EX> _n = 10000; EX> _xmin = -10; EX> _xmax = 10; EX> _ymin = -10; EX> _ymax = 10; EX> _zmin = -1; EX> _zmax = 20; EX> } EX> EX> // Destructeur EX> {{CODE_UPPER}}_Step{{NAME}}::~{{CODE_UPPER}}_Step{{NAME}}() EX> { EX> } EX> EX> // Description de l'étape (tooltip du menu contextuel) EX> QString {{CODE_UPPER}}_Step{{NAME}}::description() const EX> { EX> return QString(tr("Génère une scène")); EX> } EX> EX> // Description détaillée de l'étape (dans le menu de description) EX> QString {{CODE_UPPER}}_Step{{NAME}}::detailledDescription() const EX> { EX> return QString(tr("Génère une scène très détaillée")); EX> } EX> EX> // Méthode de recopie de l'étape EX> CT_VirtualAbstractStep* {{CODE_UPPER}}_Step{{NAME}}::createNewInstance() const EX> { EX> // créée une copie de cette étape EX> return new {{CODE_UPPER}}_Step{{NAME}}(); EX> } EX> EX> // Création et affiliation des modèles IN EX> void {{CODE_UPPER}}_Step{{NAME}}::declareInputModels(CT_StepInModelStructureManager& manager) EX> { EX> // Pas de résultat d'entrée nécessaire EX> manager.setNotNeedInputResult(); EX> } EX> EX> // Création et affiliation des modèles OUT EX> void {{CODE_UPPER}}_Step{{NAME}}::declareOutputModels(CT_StepOutModelStructureManager& manager) EX> { EX> // Création des résultats de sortie (copie des résultats d'entrée ou non) EX> manager.addResult(_outResult); EX> // Déclaration et création du modèle de groupe de référence EX> manager.setRootGroup(_outResult, _outGroup, tr("Scène générée")); EX> // On ajoute le modèle d'item au modèle du groupe racine (le type d'item sera automatiquement déduit) EX> manager.addItem(_outGroup, _outScene, tr("Points générés")); EX> } EX> EX> // Création semi-automatique de la boite de dialogue de paramétrage de l'étape EX> void {{CODE_UPPER}}_Step{{NAME}}::fillPostInputConfigurationDialog(CT_StepConfigurableDialog* postInputConfigDialog) EX> { EX> // Ajout de contrôles unitaires de paramètrages à la boite (un par paramètre en général) EX> postInputConfigDialog->addInt("Nombre de points aléatoires à générer", "", 1, 1000000, _n); EX> postInputConfigDialog->addDouble("X minimum :", "m", -10000, 10000, 2, _xmin); EX> postInputConfigDialog->addDouble("X maximum :", "m", -10000, 10000, 2, _xmax); EX> postInputConfigDialog->addDouble("Y minimum :", "m", -10000, 10000, 2, _ymin); EX> postInputConfigDialog->addDouble("Y maximum :", "m", -10000, 10000, 2, _ymax); EX> postInputConfigDialog->addDouble("Z minimum :", "m", -10000, 10000, 2, _zmin); EX> postInputConfigDialog->addDouble("Z maximum :", "m", -10000, 10000, 2, _zmax); EX> } EX> EX> // Etape de calcul, créant les données des résultats de sortie EX> void {{CODE_UPPER}}_Step{{NAME}}::compute() EX> { EX> // Récupération de la liste des résultats de sortie EX> // L'ordre dans cette liste est celui des ajouts successifs EX> for (CT_ResultGroup* outResult : _outResult.iterateOutputs()) EX> { EX> if(isStopped()) EX> return; EX> EX> // Création du nuage de points et du vecteur d'index pour la nouvelle scène EX> CT_NMPCIR pcir = PS_REPOSITORY->createNewPointCloud(_n); EX> CT_MutablePointIterator itPM(pcir); EX> EX> // Vérification du bon ordonnencement des coordonnées min et max EX> double tmp; EX> if (_xmin > _xmax) {tmp = _xmin; _xmin = _xmax; _xmax = tmp;} EX> if (_ymin > _ymax) {tmp = _ymin; _ymin = _ymax; _ymax = tmp;} EX> if (_zmin > _zmax) {tmp = _zmin; _zmin = _zmax; _zmax = tmp;} EX> EX> // Génération aléatoire des points EX> size_t i = 0; EX> EX> // On applique la translation a tous les points du nuage EX> while (itPM.hasNext()) EX> { EX> if(isStopped()) EX> return; EX> EX> CT_Point point = itPM.currentPoint(); EX> EX> point.setX((rand()/(double)RAND_MAX ) * (_xmax-_xmin) + _xmin); EX> point.setY((rand()/(double)RAND_MAX ) * (_ymax-_ymin) + _ymin); EX> point.setZ((rand()/(double)RAND_MAX ) * (_zmax-_zmin) + _zmin); EX> EX> itPM.replaceCurrentPoint(point); EX> itPM.next(); EX> EX> // On fait avancer le % de progression (ici par rapport au nombre de points traités sur le total) EX> setProgress(float(100.0 * i++ / _n)); EX> } EX> EX> // Création de la scène EX> CT_Scene *newScene = new CT_Scene(pcir); EX> EX> // Création de la boite englobante avec les limites de la scène EX> newScene->setBoundingBox(_xmin, _ymin, _zmin, _xmax, _ymax, _zmax); EX> EX> // Création du groupe contenant le(s) item(s) EX> CT_StandardItemGroup* rootGroup = new CT_StandardItemGroup(); EX> EX> // Ajout du groupe au résultat (AVANT d'ajouter l'item !) EX> outResult->addRootGroup(_outGroup, rootGroup); EX> EX> // Ajout de l'item au groupe EX> rootGroup->addSingularItem(_outScene, newScene); EX> } EX> }