Comment créer ou modifier des types de ligne complexes (avec texte ou formes) programmatiquement en utilisant LISP dans AutoCAD, et gérer les styles de texte associés ?
La création et la modification de types de ligne complexes (ceux incluant du texte ou des formes) via LISP dans AutoCAD est un processus qui nécessite de contourner certaines limitations directes d’AutoLISP et de l’API ActiveX. Voici une démarche experte pour y parvenir :
-
Comprendre les limitations de la création directe par
entmake- Il est important de noter que l’API AutoCAD (et par extension AutoLISP via
entmake) ne permet pas de créer directement des définitions de types de ligne complexes (avec texte ou formes intégrées) en manipulant les entités de la tableLTYPE. La méthodeAddde la collectionLinetypes(ActiveX) et la fonctionentmakepour lesLTYPEsont principalement conçues pour les types de ligne simples (tirets, points, espaces). - Pour les types de ligne complexes, la définition doit impérativement provenir d’un fichier de définition de type de ligne (
.lin).
- Il est important de noter que l’API AutoCAD (et par extension AutoLISP via
-
Méthode recommandée : Génération d’un fichier .LIN et chargement
La solution la plus robuste consiste à utiliser LISP pour générer dynamiquement un fichier.lincontenant la définition de votre type de ligne complexe, puis à le charger dans le dessin.-
Étape 2.1 : Définition du style de texte (si nécessaire)
Si votre type de ligne complexe utilise du texte, il doit faire référence à un style de texte existant dans le dessin. Ce style peut être créé ou vérifié par LISP. Il est recommandé de créer un style dédié ou de s’assurer que le style référencé existe avec la bonne police.(defun CreateOrCheckTextStyle (styleName fontFile /) (if (not (tblsearch "STYLE" styleName)) (entmake (list '(0 . "STYLE") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbTextStyleTableRecord") '(2 . styleName) ; Nom du style de texte '(70 . 0) '(40 . 0.0) ; Hauteur fixe (0.0 pour variable) '(41 . 1.0) ; Facteur de largeur '(50 . 0.0) ; Angle oblique '(71 . 0) ; Orientation '(42 . 1.0) ; Dernière hauteur utilisée '(3 . fontFile) ; Nom du fichier de police (ex: "Simplex.shx" ou "Arial.ttf") '(4 . "") ; Bigfont (vide si non utilisé) ) ) ) ) ;; Exemple d'appel pour créer un style 'AEP' avec Simplex.shx (CreateOrCheckTextStyle "AEP" "Simplex.shx") -
Étape 2.2 : Génération du fichier .LIN
Utilisez LISP pour écrire la définition de votre type de ligne complexe dans un fichier.lintemporaire ou dans un dossier de support AutoCAD. La définition doit suivre la syntaxe standard des fichiers.lin.(defun GenerateAndLoadComplexLinetype (ltName ltDescription ltDefinition / f_pat ltFilePath) ;; Assurez-vous que le style de texte 'AEP' existe ou créez-le (CreateOrCheckTextStyle "AEP" "Simplex.shx") ; Adapter au besoin ;; Définir le chemin du fichier .lin (dans le dossier support par exemple) (setq ltFilePath (strcat (getvar "ROAMABLEROOTPREFIX") "support\\" ltName ".lin")) ;; Écrire le contenu du fichier .lin (setq f_pat (open ltFilePath "w")) (write-line (strcat "*" ltName "," ltDescription) f_pat) (write-line ltDefinition f_pat) (close f_pat) ;; Charger le type de ligne dans le dessin (if (not (tblsearch "LTYPE" ltName)) (progn (command "_.-linetype" "_load" ltName ltFilePath "") (princ (strcat "\nType de ligne '" ltName "' chargé avec succès.")) ) (princ (strcat "\nType de ligne '" ltName "' déjà existant. Non rechargé.")) ) (princ) ) ;; Exemple d'appel pour un type de ligne 'AEP' (GenerateAndLoadComplexLinetype "AEP" "AEP ----AEP----AEP----AEP----AEP----AEP----AEP--" "A,20,-1.3,[\"AEP\",AEP,S=1.3,R=0.0,X=-0.65,Y=-0.65],-3" )Note : La définition
A,20,-1.3,[\"AEP\",AEP,S=1.3,R=0.0,X=-0.65,Y=-0.65],-3est un exemple tiré de la discussion. Adaptez-la à vos besoins. Les\"sont nécessaires pour échapper les guillemets dans la chaîne LISP. -
Étape 2.3 : Chargement du type de ligne
La commande_.-linetype(avec le préfixe.-pour la version en ligne de commande et_pour l’internationalisation) est utilisée pour charger le type de ligne depuis le fichier.lingénéré. Le(tblsearch "LTYPE" ltName)permet de vérifier si le type de ligne existe déjà avant de tenter de le charger, évitant ainsi les erreurs.
-
-
Bonnes pratiques
- Gestion des chemins : Utilisez
(getvar "ROAMABLEROOTPREFIX")pour localiser le dossiersupportde l’utilisateur, assurant la portabilité de votre code. - Vérification d’existence : Toujours vérifier si un style de texte ou un type de ligne existe déjà avant de tenter de le créer ou de le charger, pour éviter les erreurs et les doublons.
- Nommage : Utilisez des noms de styles de texte et de types de ligne clairs et, si possible, préfixés pour éviter les conflits avec d’autres dessins ou normes.
- Gestion des chemins : Utilisez
Cette approche permet de gérer la création et la modification de types de ligne complexes de manière programmatique et fiable dans AutoCAD.