Die Einheiten physikalischer Größen sind für Wissenschaftler und Ingenieure von entscheidender Bedeutung. Sie vermitteln viele Informationen, können aber leider zu schwerwiegenden und kostspieligen Fehlern führen. Um die Einheitenverwaltung in JMP zu vereinfachen und diese Fehler zu reduzieren, wurde ein Add-in entwickelt. Dieses Add-in nutzt die neue Python-Integration von JMP 18 und ermöglicht so Funktionen, die in JMP 17 nur schwer umsetzbar waren. Diese Präsentation zeigt die Möglichkeiten des Add-ins sowie dessen Entwicklung, einschließlich der Verwendung von Python, der Versionskontrolle, der Tests, der Dokumentation und der Build-Systeme.
Hallo, mein Name ist Evan McCorkle. Ich bin Entwickler bei JMP und möchte Ihnen heute ein Add-in vorstellen, das ich mit der neuen Python-Integration von JMP 18 entwickelt habe. Dieses Add-in dient der Umrechnung physikalischer Einheiten. Ich werde erläutern, warum und wie ich dieses Add-in entwickelt habe, welche Techniken ich dabei angewendet habe und einige Details zur verwendeten Python-Integration von JMP 18.
Meine Ausbildung und meine ersten Berufsjahre verbrachte ich als Ingenieur. Dabei hatte ich viel mit verschiedenen Einheitensystemen und -arten zu tun, hauptsächlich mit US-amerikanischen und metrischen Einheiten. Ich bin sicher, viele von Ihnen kennen das, und ich bin mir auch sicher, dass viele wissen, wie viele kostspielige Fehler durch falsche Einheitenumrechnungen entstanden sind. Deshalb habe ich immer versucht, ein Tool zur Überprüfung meiner Einheitenumrechnungen zu verwenden.
Oft nutze ich dafür die Python-Bibliothek Pint. Ich habe mir die neue Python-Integration von JMP 18 angesehen und wollte wissen, ob wir diese mit der bestehenden JMP-Funktion zur Annotation von Spalten mit ihren Einheiten kombinieren könnten. Wenn man eine Spalte auswählt, kann man ihr eine Einheit zuweisen. Könnten wir diese Funktion dann für Einheitenumrechnungen, Validierungen usw. verwenden?
Das war der Anstoß für die Entwicklung dieses Add-Ins. Es erkennt beim Import einer Tabelle Klammerangaben in Spalten, weist automatisch die Einheiten zu und validiert diese. So haben Sie Ihre gesamte Tabelle und die zugehörigen Einheiten auf einen Blick im Blick, können Massenänderungen an Einheiten vornehmen und sicherstellen, dass das System die verwendeten Einheiten und Abkürzungen erkennt. Außerdem lassen sich die Einheiten für einfache Formelspalten ermitteln.
Die Hauptfunktion des Add-Ins ist die Konvertierung von Spalten zwischen verschiedenen Einheiten, beispielsweise von Zoll in Millimeter. Dies kann entweder direkt in der bestehenden Spalte oder in einer neuen Spalte erfolgen. Bei der Datenkonvertierung werden auch die Spalteneigenschaften wie Referenzlinien, Zugriffseinstellungen, Spezifikationsgrenzen usw. angepasst.
Zusätzlich zu diesen Funktionen gibt es eine durchsuchbare Datenbank aller unterstützten Einheiten und ihrer Zusammensetzungsmöglichkeiten sowie eine JSL-API. Bei Interesse können Sie den QR-Code hier auf dem Bildschirm sehen oder in der Community nach dem Add-on zur Einheitenumrechnung suchen.
Das war alles, was ich zu den Funktionen des Add-ins sagen wollte. Jetzt gehe ich auf die Entwicklung des Add-ins ein. Für die Versionskontrolle habe ich Git und eine interne GitLab-Instanz verwendet. Zum Erstellen und Bereitstellen des Add-ins nutze ich eine eigene Lösung mit einer Build-Add-in-JSL-Datei und einer Manifest-JSL-Datei, auf die ich gleich noch genauer eingehen werde. Zum Testen verwende ich das JSL-Framework Hamcrest, das Sie auf GitHub finden. Ich bin Mitentwickler dieses Frameworks. Wir nutzen es intern bei JMP, um JMP selbst zu testen, und ich verwende es auch zum Testen dieses Add-ins.
Zur Dokumentation werden hauptsächlich Markdown-Dateien verwendet, die anschließend mit Pandoc in HTML konvertiert und in das Add-in eingebunden werden. Dort werden sie mithilfe des in JMP integrierten Webbrowsers angezeigt. Die Implementierung erfolgt vollständig über JSL und Python mit der pint-Bibliothek. Weitere Tools sind JMP, VS Code, Git, Pandoc und Google Material Icons.
Die Struktur des Add-Ins auf oberster Ebene sieht folgendermaßen aus: Es gibt einen Build-Ordner, Dokumentation, Quellcode, Tests und die Readme-Markdown-Dateien. Die Tests sind also separat. Der Build-Ordner enthält das Build-Add-In, die Manifestdatei und den Unterordner „Artefakte“. Dort werden die HTML-Dateien und das JMP-Add-In selbst nach dem Build abgelegt. Die Dokumentation besteht hauptsächlich aus Screenshots und ähnlichem. Der Quellcode-Ordner enthält mehrere Unterordner, Symbole und das Menü. Das Menü enthält sehr einfache JSL-Dateien für Aktionen. Diese dienen der JMPcust-Datei als Ausgangspunkt, ebenso wie der Quellcode, der den Großteil des Codes ausmacht. Außerdem gibt es die Definition von JMPcust und die JSL-Datei zum Laden der hinzugefügten Dateien.
Die Manifestdatei ist im Grunde eine Auflistung aller Dateien aus der hier links dargestellten Struktur, die im JMP-Add-in-Archiv landen und anschließend installiert werden. Das JSL-Skript für den Add-in-Build führt den Pandoc-Schritt zur Konvertierung von Markdown in HTML aus, liest die Manifestdatei und verwendet die JSL Zip Archive API, um alle Dateien zu sammeln und in einer JMP-Add-in-Datei im Verzeichnis der Build-Artefakte abzulegen.
Immer wenn ich eine neue Funktion hinzufügen wollte, habe ich ein Symbol in den Quellcode-Symbolen platziert. Dort habe ich einen kurzen Code-Stub abgelegt, und der Hauptteil des Codes kam in den Quellcode. Ich habe alle drei Dateien dem Manifest hinzugefügt und die JMP-Add-in-Benutzerdatei so bearbeitet, dass sie auf den Code-Stub im Quellcode-Menü verweist. Dann konnte ich das Add-in erstellen, mit der Entwicklung der Funktion beginnen und anschließend Tests in den Testdateien hinzufügen.
Der Unterpunkt im Quellmenü führt lediglich grundlegende Validierungen durch, beispielsweise die Suche nach einer vorhandenen Datentabelle. Anschließend wird die Hauptquelldatei eingebunden und die grafische Benutzeroberfläche (GUI) aufgerufen. Diese Trennung ermöglicht es uns, die Hauptquelldatei einfach in den Test einzubinden und die entsprechende Funktion zu testen, ohne die GUI aufzurufen. Es handelt sich um eine sinnvolle Aufteilung zwischen dem Quellmenü, das interaktiv durch Anklicken des Menüs aufgerufen wird, und den Testdateien. Beide werden über die Quellcode-Integration ausgeführt.
Da ein Großteil dieses Add-ins die neue Python-Integration von JMP 18 nutzt, möchte ich nun detailliert auf deren Funktionsweise eingehen. Diese besteht im Wesentlichen aus drei Teilen. Zunächst in der Ladedatei des Add-ins. Immer wenn das Add-in geladen wird, versuchen wir, die Python-Pakete zu installieren. Eines davon ist pint. Installieren Sie dieses Paket und stellen Sie sicher, dass es installiert ist. Dann gibt es die Datei com_jmp_unitconversion.py, die mit dem Add-in installiert wird. Ich importiere sie nun mit ihrem vollqualifizierten Namen.
Im Grunde besteht die gesamte Python-Datei nur aus Funktionsdefinitionen, die alle die Pint-Bibliothek verwenden. Es ist aber keine wirkliche Arbeit nötig. Es sind nur die Funktionsdefinitionen. Im JSL-Kerncode umschließe ich diese Python-Aufrufe dann mit dem vollqualifizierten Namen und der Python-Integration innerhalb einer JSL-Funktion. Im restlichen Add-in kann ich dann einfach die JSL-Funktionen hier rechts verwenden. Sind Einheiten umrechenbar, Fuß in Kilometer? Ja. Fuß in Milliliter? Nein. Es werden lediglich reguläre JSL-Funktionen verwendet, die intern aber mithilfe der Python-Integration in den Python-Code gelangen. Alles wird beim Laden des Add-ins eingerichtet, und mein gesamter Python-Code ist übersichtlich in diesem einen Paket gekapselt, sodass ich den Python-Namensraum nicht unnötig belaste.
So habe ich die neue Python-Integration in JMP 18 genutzt, um dieses Add-in zur Umrechnung physikalischer Einheiten zu entwickeln. Vielen Dank.