Comment créer des hyperliens dans AutoCAD à partir du texte d’une entité, en vérifiant au préalable l’existence d’un fichier portant le même nom dans un dossier spécifié et ses sous-dossiers, via une routine LISP ?
L’objectif est d’automatiser la création d’hyperliens dans AutoCAD, mais de manière conditionnelle : le lien ne doit être créé que si un fichier (par exemple, un PDF) dont le nom correspond au contenu de l’entité texte est trouvé dans un répertoire spécifié et ses sous-répertoires.
Voici une démarche experte, intégrant les fonctions LISP fournies par Olivier Eckmann, pour construire une routine complète :
-
Comprendre les fonctions LISP pour la recherche de fichiers/dossiers
Les fonctions suivantes sont les briques essentielles pour parcourir les répertoires et lister les fichiers :(defun GetFolders (path / folders) (if (member "." (setq folders (vl-directory-files path nil -1))) (cddr folders) folders ) ) (defun GetFiles (path pat / ) (vl-directory-files path pat 1) ; pat = "*.pdf" ou autre extension ) (defun CreateListePdf (path / lsFiles sFileName lsFolders sFolderName path2) (setq *lsPdfFiles* nil) ; Variable globale pour stocker les noms de fichiers (en majuscules) (setq *lsPdfPath* nil) ; Variable globale pour stocker les chemins des dossiers correspondants ; Traite les fichiers du dossier racine (if (setq lsFiles (GetFiles path "*.pdf")) (foreach sFileName lsFiles (setq *lsPdfFiles* (append *lsPdfFiles* (list (strcase sFileName)))) (setq *lsPdfPath* (append *lsPdfPath* (list path))) ) ) ; Boucle sur les sous-dossiers (récursivité simple, un niveau) ; Pour une récursivité 'infinie', une approche plus complexe serait nécessaire. (if (setq lsFolders (GetFolders path)) (foreach sFolderName lsFolders (setq path2 (strcat path "\\" sFolderName)) (if (setq lsFiles (GetFiles path2 "*.pdf")) (foreach sFileName lsFiles (setq *lsPdfFiles* (append *lsPdfFiles* (list (strcase sFileName)))) (setq *lsPdfPath* (append *lsPdfPath* (list path2))) ) ) ) ) (princ (strcat "\n" (itoa (length *lsPdfFiles*)) " fichiers PDF trouvés")) (princ) )GetFolders (path): Retourne une liste des noms de sous-dossiers dans lepathdonné, en excluant les entrées système.et...GetFiles (path pat): Retourne une liste des noms de fichiers correspondant aupat(pattern, ex: « *.pdf ») dans lepathspécifié. Le1indique de ne retourner que les noms de fichiers.CreateListePdf (path): Utilise les deux fonctions précédentes pour parcourir un dossier et ses sous-dossiers (actuellement sur un niveau d’imbrication simple) afin de lister tous les fichiers PDF. Elle peuple deux variables globales,*lsPdfFiles*(noms de fichiers en majuscules) et*lsPdfPath*(chemins des dossiers correspondants).
-
Intégration dans une routine LISP complète pour la création d’hyperliens
Pour rendre ces fonctions utilisables comme une commande AutoCAD, il faut les encapsuler et ajouter la logique de sélection et de création d’hyperliens :(defun C:GENEREHYPERLIENSCONDITIONNELS (/ sPath sTextEntite ss i entite sNomFichier sCheminFichier index) (vl-load-com) ; Charger les fonctions Visual LISP pour les objets ActiveX (princ "\n--- Génération d'hyperliens conditionnels ---") ; 1. Demander à l'utilisateur le dossier racine à scanner (setq sPath (getstring T "\nEntrez le chemin du dossier à scanner (ex: C:\\Projets\\Docs): ")) (if (and sPath (vl-file-directory-p sPath)) ; Vérifier si le chemin est valide (progn ; 2. Créer la liste des fichiers PDF et leurs chemins dans les variables globales (CreateListePdf sPath) (if *lsPdfFiles* ; Si des fichiers ont été trouvés (progn ; 3. Sélectionner les entités texte à traiter (princ "\nSélectionnez les entités texte pour créer les hyperliens.") (if (setq ss (ssget '((0 . "*TEXT")))) ; Sélectionne TEXT et MTEXT (progn (setq i 0) (repeat (sslength ss) (setq entite (vlax-ename->vla-object (ssname ss i))) (setq sTextEntite (vla-get-textstring entite)) ; 4. Rechercher le fichier correspondant dans les listes globales ; On ajoute ".pdf" au texte de l'entité pour correspondre au format de la liste *lsPdfFiles* (setq index (vl-list-position (strcase (strcat sTextEntite ".pdf")) *lsPdfFiles*)) (if index ; Si le fichier est trouvé (index non nul) (progn ; Reconstruire le chemin complet du fichier (setq sCheminFichier (strcat (nth index *lsPdfPath*) "\\" (nth index *lsPdfFiles*))) ; 5. Créer l'hyperlien sur l'entité (vla-addhyperlink entite sCheminFichier sTextEntite sTextEntite) ; Objet, Chemin, Nom affiché, Description (princ (strcat "\nHyperlien créé pour: " sTextEntite)) ) (princ (strcat "\nFichier non trouvé pour: " sTextEntite)) ) (setq i (1+ i)) ) (princ "\nProcessus terminé.") ) (princ "\nAucune entité texte sélectionnée.") ) ) (princ (strcat "\nAucun fichier PDF trouvé dans le dossier: " sPath)) ) ) (princ "\nChemin de dossier invalide ou non spécifié.") ) (princ) ) -
Explication des éléments clés et bonnes pratiques
vl-load-com: Cette fonction est essentielle pour charger les bibliothèques Visual LISP nécessaires à l’interaction avec les objets ActiveX d’AutoCAD, notamment pour la création d’hyperliens (vla-addhyperlink).getstring T: L’argumentTpermet à l’utilisateur d’entrer une chaîne de caractères contenant des espaces, ce qui est courant pour les chemins de dossiers.vl-file-directory-p: Vérifie si le chemin fourni par l’utilisateur correspond bien à un répertoire existant.ssget '((0 . "*TEXT")): Cette fonction de sélection permet de cibler à la fois les objets de typeTEXT(texte simple) etMTEXT(texte multiligne), couvrant ainsi la plupart des cas d’utilisation.vla-get-textstring: Récupère le contenu textuel de l’entité AutoCAD sélectionnée.vl-list-position: Recherche l’index d’un élément dans une liste. Ici, il est utilisé pour trouver le nom de fichier correspondant dans*lsPdfFiles*. L’utilisation destrcaseassure une comparaison insensible à la casse, et l’ajout de".pdf"est crucial pour faire correspondre le texte de l’entité au nom de fichier tel qu’il est stocké dans la liste.vla-addhyperlink: La méthode ActiveX pour ajouter un hyperlien à un objet. Elle prend l’objet AutoCAD, le chemin complet du fichier cible, le texte à afficher pour le lien, et une description optionnelle.- Gestion des erreurs : La routine inclut des vérifications pour le chemin du dossier et la sélection des entités, améliorant sa robustesse.
- Généralisation : La fonction
CreateListePdfest actuellement spécifique aux fichiers PDF. Pour d’autres types de fichiers (DWG, DOCX, JPG, etc.), vous devrez modifier le pattern"*.pdf"dans(GetFiles path "*.pdf")ou créer une version plus générique deCreateListePdfqui prend le pattern en argument.
-
Comment lancer la routine LISP
- Enregistrement : Copiez l’intégralité du code LISP (incluant
GetFolders,GetFiles,CreateListePdfetC:GENEREHYPERLIENSCONDITIONNELS) dans un fichier texte et enregistrez-le avec l’extension.lsp(ex:GenererHyperliens.lsp). - Chargement : Dans AutoCAD, utilisez la commande
APPLOADpour charger votre fichier.lsp. - Exécution : Une fois le fichier chargé, tapez
GENEREHYPERLIENSCONDITIONNELSsur la ligne de commande AutoCAD et suivez les instructions.
- Enregistrement : Copiez l’intégralité du code LISP (incluant