Développer des extensions pour Jedicut

Des extensions pour plus de compatibilité

Une extension (ou plugin) est un module additionnel s’intégrant dans l’écosystème d’un logiciel, permettant d’ajouter une ou plusieurs fonctionnalités à ce dernier. Les extensions offrent donc à tout le monde la possibilité de faire évoluer Jedicut.

Les extensions de Jedicut sont publiées en open source sous licence LGPL, et elles sont centralisées sur le dépôt GitHub de Jedicut. Tout contributeur est le bienvenue 😉

Il y a actuellement 2 types d’extension dans Jedicut :

  • Les extensions de fichier : ces extensions permettent à Jedicut de lire des fichiers dans différents formats (DXF, DAT, PRF…).
  • Les extensions de communication : ces extensions permettent à Jedicut de communiquer avec différents type de carte de contrôle CNC (carte de contrôle CNC sur port parallèle, Arduino sur port USB, Génération de GCode…)

L’objectif de cette page est de présenter la structure de ces extensions afin que tout le monde puisse participer au projet.

Pré requis

Des logiciels de programmation en Pascal gratuit (Delphi)

Jedicut est un logiciel développé avec Delphi 7 (édition personnelle gratuite), et la JVCL (bibliothèque open source de composants Delphi). Il est possible d’utiliser d’autres EDI tel que Lazarus (gratuit) et les nouvelles versions de Delphi éditées par Embarcadero (gratuit ou payant).

Autres langages de programmation : C++, Visual Basic…

Théoriquement, un plugin devrait pouvoir être développé dans n’importe quel langage de programmation. Les passionnés de C++ ou de Visual basic peuvent développer leur plugin pour Jedicut. Les types de données sont compatibles avec de nombreux langages de programmation.

Si des personnes souhaitent participer au développement des plugins avec un autre langage de programmation, qu’elles me contactent via le forum de Jedicut.

Informations communes aux 2 types d’extension

Les fonctions communes

Déterminer le type d’extension

Jedicut supporte actuellement 2 types d’extensions. Chaque type d’extension possède des sous-types permettant de qualifier plus précisément l’extension utilisée et ses capacités.

[pastacode lang= »cpp » manual= »function%20GetDllFamily%20%3A%20byte%3B%20export » message= » » highlight= » » provider= »manual »/]

Les valeurs que doit renvoyer cette fonction pour les extensions de communication :

  • 0 : extension de communication envoyant des ordres de rotation pas à pas (exemple : communication sur port parallèle).
  • 7 : extension de communication envoyant des groupes de pas (exemple : génération de fichier GCode).

Les valeurs que doit renvoyer cette fonction pour les extensions de fichier :

  • 1 : extension permettant d’ouvrir et de sauvegarder des fichiers de profils.
  • 2 : extension permettant de uniquement ouvrir un fichier de profil.
  • 3 : extension permettant de uniquement sauvegarder un profil dans un format donné.
  • 4 : extension permettant d’ouvrir et de sauvegarder un fichier de découpe (profils, réglages et options de la découpe).
  • 5 : extension permettant uniquement de lire un fichier de découpe.
  • 6 : extension permettant uniquement d’écrire un fichier de découpe.

Par défaut : Si cette fonction n’est pas implémentée, Jedicut considèrera que le plugin est de type 0.

Afficher la description de l’extension

Jedicut utilise la description de l’extension dans 2 cas de figure :

  • Pour les extension de communication, Jedicut affiche la description de l’extension lorsqu’elle est sélectionnée dans les options de Jedicut.
  • Pour les extensions de fichier, Jedicut affiche la description de l’extension lorsque l’utilisateur.

[pastacode lang= »java » manual= »procedure%20GetDescription(Cible%20%3A%20PChar%3B%20tailleCible%3A%20integer)%3B%20export » message= » » highlight= » » provider= »manual »/]

Les extensions de communication

Les types de données

Jedicut et les extensions de communication doivent utiliser les mêmes types de données pour pouvoir se comprendre.

[pastacode lang= »cpp » manual= »%7B%20Caract%C3%A9ristique%20d’un%20mat%C3%A9riaux%20%7D%0A%7B%20%7D%0Atype%0A%20%20PMateriau%20%3D%20%5ETMateriau%3B%0A%20%20TMateriau%20%3D%20packed%20record%0A%20%20%20%20vitesse1%20%3A%20double%3B%0A%20%20%20%20pourcentage1%20%3A%20double%3B%0A%20%20%20%20vitesse2%20%3A%20double%3B%0A%20%20%20%20pourcentage2%20%3A%20double%3B%0A%20%20end%3B%0A%0A%7B%20Type%20d’identification%20d’un%20registre%20du%20port%20parall%C3%A8le%20%7D%0A%7B%20-%200%20%3A%20registre%20de%20donn%C3%A9es%0A%20%20-%201%20%3A%20registre%20de%20statut%20%2F!%5C%20LECTURE%20SEULE%20%2F!%5C%0A%20%20-%202%20%3A%20registre%20de%20commande%20%7D%0A%7B%20%7D%0Atype%0A%20%20TBitPort%20%3D%20packed%20record%0A%20%20%20%20adresseBase%2C%20iRegistre%2C%20iBit%20%3A%20integer%3B%0A%20%20end%3B%0A%0A%7B%20Caract%C3%A9ristique%20de%20la%20communication%20%7D%0A%7B%20%7D%0Atype%0A%20%20TParametreCommunication%20%3D%20packed%20record%0A%20%20%20%20BitModeChauffe%2C%20BitHorlogeExterne%2C%20BitEmissionChauffe%2C%20BitReceptionChauffe%2C%20BitAlimMoteur%20%3A%20TBitPort%3B%0A%20%20%20%20synchroniserMoteurAvecTimerExterne%20%3A%20boolean%3B%20%2F%2F%20true%20si%20un%20timer%20externe%20est%20utilis%C3%A9%20pour%20g%C3%A9rer%20le%20mouvement%20des%20moteurs%0A%09frequenceTimer%20%3A%20double%3B%20%2F%2F%20Fr%C3%A9quence%20en%20kHz%0A%20%20end%3B%0A%0A%7B%20Caract%C3%A9ristique%20de%20la%20chauffe%20%7D%0A%7B%20%7D%0Atype%0A%20%20TParametreChauffe%20%3D%20packed%20record%0A%20%20%20%20chauffeActive%2C%20chauffeMode%2C%20chauffeDynamique%20%3A%20boolean%3B%0A%20%20%20%20chauffeUtilisateur%20%3A%20boolean%3B%20%2F%2F%20parametre%20utile%20lors%20du%20pilotage%20manuel%20de%20la%20machine%20pour%20activer%2Fd%C3%A9sactiver%20la%20chauffe%0A%20%20end%3B%0A%0A%0A%7B%20Informations%20n%C3%A9cessaires%20pour%20UNE%20rotation%20moteur%20%7D%0A%7B%20%7D%0Atype%0A%20%20TOrdreMoteur%20%3D%20packed%20record%0A%20%20%20%20bitRotation%20%3A%20Byte%3B%20%2F%2F%20Bit%20de%20rotation%20moteur%0A%20%20%20%20bitSens%20%3A%20Byte%3B%20%20%20%20%20%2F%2F%20Bit%20de%20sens%20moteur%0A%20%20%20%20vitesse%20%3A%20integer%3B%20%20%2F%2F%20Dur%C3%A9es%20d’impulsion%20(vitesse)%0A%20%20%20%20chauffe%20%3A%20double%3B%20%20%20%2F%2F%20Pourcentage%20de%20chauffe%0A%20%20%20%20keyPoint%20%3A%20boolean%3B%0A%20%20end%3B%0A%0A%7B%20Tableau%20d’ordres%20moteurs%20%7D%0A%7B%20%7D%0Atype%0A%20%20TArrayOrdresMoteur%20%3D%20packed%20record%0A%20%20%20%20ArrayOrdres%20%3A%20array%20of%20TOrdreMoteur%3B%0A%20%20end%3B%0A%0A%7B%20D%C3%A9finition%20des%20constantes%20communes%20aux%20dll%20%7D%0Aconst%20DLL_FAMILY_COM%20%3D%200%3B%20%2F%2F%20Jedicut%20calculate%20and%20send%20steps%0Aconst%20DLL_FAMILY_COM_SEGMENT%20%3D%207%3B%20%2F%2F%20Jedicut%20calculate%20segment%20(cutting%20wizard%20needed).%20Another%20software%20have%20to%20interpolate%20this%0Aconst%20DLL_FAMILY_FILE_PROFIL%20%3D%201%3B%0Aconst%20DLL_FAMILY_FILE_PROFIL_READ_ONLY%20%3D%202%3B%0Aconst%20DLL_FAMILY_FILE_PROFIL_WRITE_ONLY%20%3D%203%3B%0Aconst%20DLL_FAMILY_FILE_CUT%20%3D%204%3B%0Aconst%20DLL_FAMILY_FILE_CUT_READ_ONLY%20%3D%205%3B%0Aconst%20DLL_FAMILY_FILE_CUT_WRITE_ONLY%20%3D%206%3B%0A%0A%7B%20D%C3%A9finition%20des%20constantes%20sp%C3%A9cifiques%20aux%20dll%20de%20communication%7D%0Aconst%20NO_ERROR%20%3D%200%3B%0Aconst%20ERROR_TIME_OUT%20%3D%20-1%3B%0Aconst%20ERROR_ON_SENDING%20%3D%20-2%3B%0A%0A » message= » » highlight= » » provider= »manual »/]

Les fonctions

Activer la carte de contrôle CNC

Certaines cartes CNC nécessitent d’être « activée ». Généralement ça déclenche la mise sous tension des moteurs (la carte de contrôle CNC doit être mise sous tension au préalable).

[pastacode lang= »cpp » manual= »procedure%20MoteurOnOff(moteurOn%20%3A%20boolean)%3B%20export%3B » message= » » highlight= » » provider= »manual »/]

Initialiser les paramètres de communication du plugin

Cette fonction permet à Jedicut de configurer l’extension de communication en fonction des réglages fait dans Jedicut.

Elle prend en paramètre :

  • L’adresse de base du port parallèle,
  • La configuration de la chauffe du fil,
  • La configuration des moteurs,
  • Les paramètres du matériau sélectionné pour cette découpe.

[pastacode lang= »cpp » manual= »procedure%20InitialiserChauffeEtCommunication(portBase%20%3A%20word%20%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ParamChauffe%20%3A%20TParametreChauffe%20%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ParamCommunication%20%3A%20TParametreCommunication%20%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Materiau%20%3A%20TMateriau)%3B%20export%3B » message= » » highlight= » » provider= »manual »/]

Envoyer un ordre de rotation à la machine

Cette fonction permet d’envoyer un ordre à la carte de contrôle CNC.

Elle prend en paramètre :

  • Numéro du ou des bits de rotation,
  • Valeur de la vitesse de déplacement (temps de pause),
  • Valeur de la chauffe.

[pastacode lang= »cpp » manual= »function%20EmettreBit(bitRotation%2C%20bitSens%20%3A%20byte%20%3B%20vitesse%20%3A%20integer%20%3B%20chauffe%20%3A%20double)%20%3A%20integer%3B%20export%3B » message= » » highlight= » » provider= »manual »/]

Libérer la mémoire en fin de déplacement

Après avoir mis la machine à « Off », il faut appeler cette méthode pour libérer la mémoire de l’ordinateur en fin de découpe.

[pastacode lang= »cpp » manual= »procedure%20LibererRessources%3B%20export%3B » message= » » highlight= » » provider= »manual »/]

Les extensions de fichier

Les types de données

Jedicut et les extensions de fichier doivent utiliser les mêmes types de données pour pouvoir se comprendre.

[pastacode lang= »cpp » manual= »%7B%20D%C3%A9finition%20des%20constantes%20communes%20aux%20dll%20%7D%0Aconst%20DLL_FAMILY_COM%20%3D%200%3B%0Aconst%20DLL_FAMILY_FILE_PROFIL%20%3D%201%3B%0Aconst%20DLL_FAMILY_FILE_PROFIL_READ_ONLY%20%3D%202%3B%0Aconst%20DLL_FAMILY_FILE_PROFIL_WRITE_ONLY%20%3D%203%3B%0Aconst%20DLL_FAMILY_FILE_CUT%20%3D%204%3B%0Aconst%20DLL_FAMILY_FILE_CUT_READ_ONLY%20%3D%205%3B%0Aconst%20DLL_FAMILY_FILE_CUT_WRITE_ONLY%20%3D%206%3B%0A%0A%7B—%20D%C3%A9finition%20des%20constantes%20sp%C3%A9cifiques%20aux%20dll%20de%20fichier%20—%7D%0A%0A%7B%20D%C3%A9finition%20d’un%20point%20d’un%20profil%20%7D%0Atype%0A%20%20TPointProfil%20%3D%20record%0A%20%20%20%20X%20%3A%20double%3B%0A%20%20%20%20Y%20%3A%20double%3B%0A%20%20%20%20keyPoint%20%3A%20boolean%3B%0A%20%20%20%20valChauffe%20%3A%20double%3B%0A%20%20end%3B%0A%0A%7B%20D%C3%A9finition%20des%20coordonn%C3%A9es%20d’un%20profil%20%7D%0Atype%0A%20%20TCoordonneesProfil%20%3D%20record%0A%20%20%20%20coordonneesExDecoupe%20%3A%20array%20of%20TPointProfil%3B%0A%20%20%20%20coordonneesInDecoupe%20%3A%20array%20of%20TPointProfil%3B%0A%20%20end%3B%0A » message= » » highlight= » » provider= »manual »/]

Les fonctions

Indiquer quel extension de fichier est gérée par l’extension

Jedicut utilise cette fonction lorsqu’un utilisateur souhaite ouvrir ou enregistrer un fichier (dans la boîte de dialogue).

[pastacode lang= »cpp » manual= »procedure%20GetFileExtension(Format%20%3A%20PChar%3B%20tailleCible%3A%20integer)%3B%20export » message= » » highlight= » » provider= »manual »/]

Ouvrir un fichier

Jedicut utilise cette fonction pour ouvrir et lire un fichier. Attention, l’objectif ici est de charger en mémoire toutes les informations contenu dans le profil et qui pourrait intéresser Jedicut. Ces données seront récupérées ensuite.

[pastacode lang= »cpp » manual= »function%20OpenFileDll(Src%20%3A%20PChar%20%3B%20var%20nbEx%2C%20nbIn%20%3A%20integer)%20%3A%20smallInt%3B%20export » message= » » highlight= » » provider= »manual »/]

Récupérer le nom du profil

Après avoir ouvert et lu un fichier, Jedicut appelle cette fonction pour récupérer le nom du profil

[pastacode lang= »cpp » manual= »procedure%20GetProfileName(Cible%20%3A%20PChar%3B%20tailleCible%3A%20integer)%3B%20export » message= » » highlight= » » provider= »manual »/]

Récupérer les points du profils dans Jedicut

Après avoir ouvert et lu le fichier vient la fonction précédente, Jedicut appelle cette fonction pour récupérer tous les points qui ont été lus.

[pastacode lang= »cpp » manual= »function%20LoadFileDll(var%20Profil%20%3A%20TCoordonneesProfil)%20%3A%20smallInt%3B%20export » message= » » highlight= » » provider= »manual »/]

Récupérer la description du profil

Après avoir ouvert et lu le fichier, Jedicut appelle cette fonction pour récupérer une éventuelle description du profil. Certains formats de fichier permettent d’associer un commentaire ou un descriptif, c’est toujours pratique.

[pastacode lang= »cpp » manual= »procedure%20GetProfileDescription(Cible%20%3A%20PChar%3B%20tailleCible%3A%20integer)%3B%20export » message= » » highlight= » » provider= »manual »/]

Sauvegarder un profil

Jedicut utilise cette fonction pour enregistrer le profil modifié dans Jedicut

[pastacode lang= »cpp » manual= »function%20SaveFileDll(Dest%20%3A%20PChar)%20%3A%20smallInt%3B%20export » message= » » highlight= » » provider= »manual »/]

 

Cette documentation n’est pas parfaite, mais elle donnera les bases pour les plus curieux qui se repèreront plus facilement dans le code des extensions.

Je complèterai cette documentation en fonction des retours que j’aurai. J’ai également prévu de développer des Starter Kit pour proposer des squelettes de programme et ainsi faciliter le développement de nouvelles extensions.

Si vous avez des questions, utilisez le forum 😉