Les unités de grandeurs physiques sont essentielles pour les scientifiques et les ingénieurs. Elles permettent une communication riche, mais peuvent malheureusement engendrer des erreurs importantes et coûteuses. Un module complémentaire a été développé pour faciliter la gestion des unités dans JMP et réduire ces erreurs. Ce module tire parti de la nouvelle intégration Python de JMP 18 pour réaliser facilement des opérations qui étaient difficiles à effectuer dans JMP 17. Cette présentation détaille les fonctionnalités de ce module, ainsi que son processus de développement, notamment l'utilisation de Python, le contrôle de version, les tests, la documentation et les systèmes de compilation.
Bonjour, je m'appelle Evan McCorkle. Je suis développeur chez JMP et je suis ici aujourd'hui pour vous parler d'un module complémentaire que j'ai développé grâce à la nouvelle intégration Python de JMP 18. Ce module permet la conversion d'unités physiques. Je vais vous expliquer pourquoi je l'ai développé, comment j'ai procédé, les techniques utilisées et vous donner quelques détails sur l'intégration Python de JMP 18.
Ma formation et le début de ma carrière se sont déroulés dans le domaine de l'ingénierie. Durant cette période, j'ai été amené à manipuler fréquemment différents systèmes d'unités, principalement le système d'unités américain et le système métrique. Je suis certain que nombre d'entre vous sont confrontés à la même situation, et je suis également conscient des nombreuses erreurs coûteuses et retentissantes dues à des problèmes de conversion d'unités. C'est pourquoi j'ai toujours utilisé un outil pour vérifier mes conversions.
J'utilise souvent la bibliothèque Python Pint pour cela. En examinant la nouvelle intégration Python de JMP 18, je me demandais s'il était possible de l'intégrer à la fonctionnalité existante de JMP permettant d'annoter les colonnes avec leurs unités. L'idée est de pouvoir ajouter une unité à une colonne et d'utiliser cette fonctionnalité pour effectuer des conversions d'unités, valider les unités, etc.
C’est ce qui a motivé le développement de ce module complémentaire. Lorsqu’un tableau est importé, ce module détecte les unités entre parenthèses dans les colonnes, attribue automatiquement la propriété d’unité et valide ces unités. Il permet de visualiser en un coup d’œil l’ensemble du tableau et ses unités, d’effectuer des modifications d’unités en masse, de s’assurer que le système comprend les unités et les abréviations utilisées, et de déterminer les unités des colonnes contenant des formules simples.
La principale force de ce module complémentaire réside dans la conversion d'unités de colonnes, par exemple des pouces aux millimètres. Vous pouvez effectuer cette conversion directement ou en créant une nouvelle colonne. La conversion des données s'applique également aux propriétés de la colonne, telles que les lignes de référence, les paramètres d'accès, les limites de spécification, etc.
Outre ces fonctionnalités, une base de données consultable répertorie toutes les unités prises en charge et leurs combinaisons possibles. Une API JSL est également disponible. Si cela vous intéresse, vous pouvez scanner le code QR affiché à l'écran ou consulter la communauté et rechercher l'extension de conversion d'unités.
Voilà pour les fonctionnalités de l'extension. Je vais maintenant vous expliquer son développement. Pour la gestion des versions, j'ai utilisé Git et une instance GitLab interne. Pour la compilation et le déploiement, j'ai utilisé une solution personnalisée composée d'un fichier JSL d'extension et d'un fichier JSL manifeste, que je détaillerai dans un instant. Pour les tests, j'utilise le framework JSL Hamcrest, disponible sur GitHub. Je suis co-développeur de ce framework. Nous l'utilisons en interne chez JMP pour tester JMP lui-même, et je l'utilise également pour tester cette extension.
Pour la documentation, on utilise principalement des fichiers Markdown, convertis en HTML avec Pandoc, puis intégrés à l'extension et affichés via le navigateur web intégré de JMP. L'ensemble est développé en JSL et Python, avec la bibliothèque pint. Parmi les autres outils utilisés, citons JMP, VS Code, Git, Pandoc et Google Material Icons.
La structure du module complémentaire à la racine est la suivante : un dossier de compilation, la documentation, le dossier source, les tests et les fichiers Markdown « Lisez-moi ». Les tests sont donc séparés. Le dossier de compilation contient le module complémentaire de compilation, le fichier manifeste et le sous-dossier « artifacts », qui contient le code HTML et le module JMP lui-même une fois compilé. La documentation comprend principalement des captures d'écran. Le dossier source contient plusieurs sous-dossiers, des icônes et un menu. Ce dernier contient des fichiers JSL d'action très simples, utilisés comme point d'entrée par le fichier JMPcust et par le fichier source, qui contient la majeure partie du code. On trouve ensuite la définition de JMPcust et le fichier JSL d'ajout et de chargement.
Le fichier manifeste contient la liste de tous les fichiers de la structure indiquée à gauche, qui seront inclus dans l'archive du module complémentaire JMP, lequel sera ensuite installé. Le script JSL de génération du module complémentaire effectue la conversion du Markdown en HTML avec Pandoc, lit le fichier manifeste et utilise l'API d'archivage ZIP de JSL pour rassembler tous les fichiers et les placer dans un fichier de module complémentaire JMP situé dans le répertoire des artefacts de compilation.
Chaque fois que je voulais ajouter une nouvelle fonctionnalité, je créais une icône dans le répertoire des icônes sources. J'y insérais un petit bout de code, puis le reste du code était ajouté au répertoire source. Je prenais ces trois fichiers, je les ajoutais au manifeste, et je modifiais le fichier Cust de l'extension JMP pour qu'il fasse référence à ce petit bout de code dans le répertoire des icônes sources. Ensuite, je pouvais compiler l'extension, commencer à développer cette fonctionnalité et enfin ajouter des tests à la suite de tests dans les fichiers de tests.
La sous-routine du menu source effectuerait une validation de base, comme la vérification de la présence d'une table de données. Elle inclurait ensuite le fichier source principal, puis lancerait l'interface graphique. Cette séparation permet d'intégrer facilement le fichier source principal au test et de tester la fonctionnalité sans afficher l'interface graphique. Il s'agit d'une distinction claire entre le menu source, qui s'affiche de manière interactive lorsqu'on clique dessus, et les fichiers de test ; les deux sont exécutés via le processus source-source.
Enfin, étant donné que cette extension utilise en grande partie la nouvelle intégration Python de JMP 18, je voulais détailler son fonctionnement. Cela se compose essentiellement de trois parties. Premièrement, dans le fichier de chargement de l'extension. À chaque chargement, le système tente d'installer les packages Python, dont pint. Installez-le et assurez-vous qu'il est bien installé. Ensuite, j'ai un fichier com_jmp_unitconversion.py installé avec l'extension. Je vais l'importer en utilisant son nom complet.
En gros, ce fichier Python ne contient que des définitions de fonctions, toutes utilisant la bibliothèque pint. Mais il n'y a pas de traitement spécifique : juste les définitions. Dans le code JSL principal, j'encapsule ces appels Python dans une fonction JSL en utilisant le nom complet et l'intégration Python. Ensuite, dans le reste du module complémentaire, je peux simplement utiliser les fonctions JSL situées à droite. Les unités sont-elles convertibles (pieds en kilomètres ? Oui. Pieds en millilitres ? Non). Il s'agit d'utiliser des fonctions JSL classiques, mais en interne, elles sont intégrées au code Python via l'intégration Python. Tout est configuré au chargement du module complémentaire, et tout mon code Python est bien contenu dans ce seul package, ce qui évite de polluer l'espace de noms Python.
C’est ainsi que j’ai utilisé la nouvelle intégration Python de JMP 18 pour développer ce module complémentaire de conversion d’unités physiques. Merci.