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