EX> #==================================== EX> # T U T O R I A L C O M P U T R E E EX> # 10/02/2021 EX> # A. PIBOULE (ONF) EX> # alexandre.piboule@onf.fr EX> #==================================== EX> EX> #================ EX> # L E A R N I N G EX> #================ EX> EX> # Pour lire et comprendre les fichiers de ce tutoriel, l'ordre préconisé est le suivant (header, EX> # puis source) : EX> # 1) plugintutorialfr (ce fichier) EX> # 2) tufr_pluginentry EX> # 3) tufr_pluginmanager EX> # 4) steps/tufr_steptutorial01 EX> # 5) steps/tufr_steptutorial02 EX> # 6) steps/tufr_steptutorial03 EX> # 7) steps/tufr_steptutorial04 EX> # 8) filters/tufr_filtertutorial05 EX> # 9) metrics/tufr_metrictutorial06 EX> # 10) readers/tufr_readertutorial06 EX> # 11) exporters/tufr_exportertutorial06 EX> # 12) items/tufr_itemtutorial06 EX> EX> #========================== EX> # C O N F I G U R A T I O N EX> #========================== EX> EX> # Ce fichier est le point de départ de ce tutoriel. Ce projet est un plugin fonctionnel pour EX> # Computree. Il contient des étapes visant à expliquer les mécanismes de création d'un plugin. EX> # Chaque étape est commentée en détail. EX> EX> # Chaque plugin a un nom qui apparaitra dans l'interface. Dans le code, chaque plugin est par EX> # convention identifié par à un code de 2 à 4 lettres majuscules qui préfixent également les EX> # noms de toutes les classes du plugin. Le présent plugin a pour code TUFR (comme TUtoriel EX> # version FRançaise). Le Plugin Generator gère automatiquement la casse (tufr/TUFR), les noms EX> # et codes doivent ici être en minuscules. EX> CM> PLUGIN_NAME = {{NAME}} CM> PLUGIN_CODE = {{CODE_LOWER}} CM> EX> # Ce fichier est le fichier 'projet Qt'. Ainsi par convention le fichier projet d'un plugin EX> # est nommé pluginnomduplugin.pro. C'est lui qui permet à Qt Creator de connaître les fichiers EX> # du projet. Pour plus d'information sur les fichiers .pro, voir la documentation de Qt. EX> EX> # Un plugin Computree doit contenir en début de son fichier .pro la ligne EX> # 'include(../../computreev6/config/plugin_shared.pri)' EX> # Cela permet d'importer dans le projet les éléments de Computree nécessaires. Afin d'inclure EX> # automatiquement les dépendences nécessaires (via 'include <*>'), il faut ajouter deux choses EX> # avant cette ligne : EX> # 1) les noms des librairies Computree utilisées, EX> # 2) les options d'activation des dépendances externes. EX> EX> # Pour ce tutoriel, nous avons besoin des librairies Computree suivantes (attention à ne pas EX> # en mettre inutilement, cela rallongerait le temps de compilation) : EX> EX> COMPUTREE += ctlibclouds EX> COMPUTREE += ctlibstep EX> COMPUTREE += ctlibstepaddon EX> COMPUTREE += ctlibio EX> COMPUTREE += ctlibfilters EX> COMPUTREE += ctlibaction EX> COMPUTREE += ctlibstdactions EX> COMPUTREE += ctlibmath EX> COMPUTREE += ctliblas NC> #COMPUTREE += ctlibclouds NC> #COMPUTREE += ctlibstep NC> #COMPUTREE += ctlibstepaddon NC> #COMPUTREE += ctlibio NC> #COMPUTREE += ctlibfilters NC> #COMPUTREE += ctlibaction NC> #COMPUTREE += ctlibstdactions NC> #COMPUTREE += ctlibmath NC> #COMPUTREE += ctliblas CM> EX> # De plus, nous avons besoin de dépendences externes, certaines de manière optionnelle (avec EX> # CHECK_CAN_USE_*), et/ou d'autres de manière obligatoire (avec MUST_USE_*). EX> EX> CHECK_CAN_USE_GDAL = 1 EX> #MUST_USE_GDAL = 1 EX> #CHECK_CAN_USE_OPENCV = 1 EX> MUST_USE_OPENCV = 1 EX> CHECK_CAN_USE_PCL = 1 NC> #CHECK_CAN_USE_GDAL = 1 NC> #MUST_USE_GDAL = 1 NC> #CHECK_CAN_USE_OPENCV = 1 NC> #MUST_USE_OPENCV = 1 NC> #CHECK_CAN_USE_PCL = 1 CM> #MUST_USE_PCL = 1 CM> #CHECK_CAN_USE_MUPARSER = 1 CM> #MUST_USE_MUPARSER = 1 CM> #CHECK_CAN_USE_BOOST = 1 CM> #MUST_USE_BOOST = 1 CM> #CHECK_CAN_USE_GSL = 1 CM> #MUST_USE_GSL = 1 CM> #CHECK_CAN_USE_FLANN = 1 CM> #MUST_USE_FLANN = 1 CM> #CHECK_CAN_USE_QHULL = 1 CM> #MUST_USE_QHULL = 1 CM> #CHECK_CAN_USE_DGTAL = 1 CM> #MUST_USE_DGTAL = 1 CM> EX> # Voici la liste des dépendences gérées par défaut (si elles sont déjà installées sur le EX> # système, sinon il faudra modifier/ajouter les fichiers 'user_path_*.pri' nécessaires dans EX> # le dossier 'computreev6/config/' ) : EX> # > EIGEN - C++ template library for linear algebra (https://eigen.tuxfamily.org) EX> # > LIBQGLVIEWER - C++ library based on Qt that eases the creation of OpenGL 3D viewers (http://libqglviewer.com/) EX> # > GDAL - Geospatial Data Abstraction Library (https://gdal.org/) EX> # > OPENCV - Open Compute Vision (https://opencv.org/) EX> # > PCL - Point Cloud Library (https://pointclouds.org/) EX> # > MUPARSER - C++ math expression parser library (https://beltoforion.de/en/muparser/) EX> # > BOOST - Complementary set of libraries for C++ (https://www.boost.org/) EX> # > GSL - GNU Scientific Library (https://www.gnu.org/software/gsl/) EX> # > FLANN - Fast Library for Approximate Nearest Neighbors (https://github.com/mariusmuja/flann) EX> # > QHULL - Quickhull algorithm for computing the convex hull (http://www.qhull.org/) EX> # > DGTAL - Digital Geometry Tools and Algorithms Library (https://dgtal.org/) EX> EX> # Une fois les options choisies, nous importons le fichier pour plugin : EX> CM> include(../../computreev6/config/plugin_shared.pri) CM> EX> # Ensuite le fichier .pro doit contenir la directive suivante. Cela définira le nom de la EX> # librairie du plugin une fois compilée. Ici le nom du plugin est 'tutorialfr', ce qui donne : EX> # TARGET = plug_tutorialfr EX> CM> TARGET = plug_$${PLUGIN_NAME} CM> EX> #========== EX> # F I L E S EX> #========== EX> EX> # On déclare ensuite les fichiers d'entête (*.h), sources (*.cpp) et interface (*.ui). A minima, un EX> # plugin Computree doit contenir deux classes (à la racine) : EX> # > CODE_PluginEntry (tufr_pluginentry.h/.cpp) EX> # > CODE_PluginManager (tufr_pluginmanager.h/.cpp) EX> # La première classe permet à Computree d'utiliser le plugin, et la seconde définit les fonctions du EX> # plugin utilisables. Il faut également faire le lien avec les définitions de Computree via l'API EX> # 'pluginentryinterface.h'. EX> EX> # Ensuite, on ajoute une classe pour chaque étape ou item du plugin, respectivement dans des EX> # repertoires step et itemdrawable, des métriques, des filtres, etc. Dans le cas général la création EX> # d'item n'est pas utile étant donné qu'il est préférable de n'utiliser que des items standard EX> # définis dans l'API. La plupart du temps un plugin ne contient que des étapes. EX> CM> HEADERS += $$CT_PREFIX_LIB/ctlibplugin/pluginentryinterface.h CM> HEADERS += $${PLUGIN_CODE}_pluginentry.h CM> HEADERS += $${PLUGIN_CODE}_pluginmanager.h CM> HEADERS += $$files( actions/$${PLUGIN_CODE}_*.h , true) CM> HEADERS += $$files( exporters/$${PLUGIN_CODE}_*.h , true) CM> HEADERS += $$files( filters/$${PLUGIN_CODE}_*.h , true) CM> HEADERS += $$files( items/$${PLUGIN_CODE}_*.h , true) CM> HEADERS += $$files( metrics/$${PLUGIN_CODE}_*.h , true) CM> HEADERS += $$files( readers/$${PLUGIN_CODE}_*.h , true) CM> HEADERS += $$files( steps/$${PLUGIN_CODE}_*.h , true) CM> HEADERS += $$files(views/actions/$${PLUGIN_CODE}_*.h , true) CM> CM> SOURCES += $${PLUGIN_CODE}_pluginentry.cpp CM> SOURCES += $${PLUGIN_CODE}_pluginmanager.cpp CM> SOURCES += $$files( actions/$${PLUGIN_CODE}_*.cpp, true) CM> SOURCES += $$files( exporters/$${PLUGIN_CODE}_*.cpp, true) CM> SOURCES += $$files( filters/$${PLUGIN_CODE}_*.cpp, true) CM> SOURCES += $$files( items/$${PLUGIN_CODE}_*.cpp, true) CM> SOURCES += $$files( metrics/$${PLUGIN_CODE}_*.cpp, true) CM> SOURCES += $$files( readers/$${PLUGIN_CODE}_*.cpp, true) CM> SOURCES += $$files( steps/$${PLUGIN_CODE}_*.cpp, true) CM> SOURCES += $$files(views/actions/$${PLUGIN_CODE}_*.cpp, true) CM> CM> FORMS += $$files(views/actions/$${PLUGIN_CODE}_*.ui , true) CM> EX> #========== EX> # E X T R A EX> #========== EX> EX> # Pour d'éventuelles traductions, voir la documentation Qt. Cela passe par l'utilisation de des EX> # outils lupdate/lrelease. Les fichiers de traduction pour chaque langue au format *.ts devront EX> # préférablement être placé dans un dossier 'languages'. EX> CM> TRANSLATIONS += languages/plugin$${PLUGIN_CODE}_*.ts CM> EX> # Les éventuelles images, icones et autres documents devront être gérés dans un fichier *.qrc, dont EX> # le chemin sera indiqué via la ligne suivante : EX> CM> RESOURCES += CM> EX> # Les options spécifiques de pré-compilation peuvent être passées via la commande suivante, qui se EX> # comporte comme '#define' : EX> CM> DEFINES += CM> EX> # Les options spécifiques de compilation peuvent être passées via la commande suivante, qui passe EX> # son contenu directement au compilateur : EX> CM> QMAKE_CXXFLAGS += CM> EX> # On peut également modifier la configuration des modules Qt utilisés (par exemple si l'on a besion EX> # de fonctionalités tierces comme le réseau ou les bases de données), via la commande suivante : EX> CM> QT += CM> #QT += concurrent CM> #QT += xml CM> #QT += network CM> #QT += sql CM> EX> # Enfin, on peut personalisé la configuration générale du projet via la commande suivante EX> # (voir documentation Qt : https://doc.qt.io/qt-5/qmake-variable-reference.html#config) : EX> CM> CONFIG +=