Créer étiquette automatique polyligne (largeur, longueur, sens) avec LISP

Comment créer une étiquette dynamique pour une polyligne 2D dans AutoCAD, affichant sa largeur (ConstantWidth), sa longueur et un indicateur de sens, avec un positionnement et une orientation automatiques, et un masque d’arrière-plan, en l’absence de fonctionnalité native dans Covadis ?

Bien que les outils d’étiquetage natifs de Covadis ne permettent pas d’extraire directement la propriété ConstantWidth d’une polyligne 2D ni d’orienter dynamiquement les étiquettes le long d’un segment avec des flèches directionnelles, une solution robuste et flexible peut être mise en œuvre via un script Visual LISP.

Cette approche permet de générer des étiquettes MText intelligentes qui s’adaptent aux propriétés de la polyligne et à son orientation.

Solution LISP experte : Label_Cana

Le script LISP ci-dessous, nommé Label_Cana, répond précisément aux besoins exprimés en combinant les fonctionnalités de base d’AutoCAD avec des champs dynamiques et une logique de positionnement avancée.

Fonctionnalités clés :

  1. Extraction de données dynamiques : Récupère la ConstantWidth (largeur/diamètre) et la Length (longueur) de la polyligne sélectionnée via des champs AutoCAD (%<\AcObjProp...%>). Ces champs garantissent que l’étiquette se met à jour automatiquement si les propriétés de la polyligne sont modifiées.
  2. Positionnement automatique : L’étiquette est insérée au point le plus proche de la polyligne par rapport au clic de l’utilisateur, puis décalée pour éviter le chevauchement avec la polyligne elle-même (en utilisant la ConstantWidth).
  3. Orientation alignée : Le texte est automatiquement pivoté pour s’aligner avec la tangente de la polyligne au point d’insertion, assurant une lisibilité optimale le long des segments droits ou courbes.
  4. Indicateur de sens : L’utilisateur est invité à choisir une direction (< ou >), et une flèche (<-- ou -->) est ajoutée au début ou à la fin de l’étiquette en conséquence.
  5. Masque d’arrière-plan : L’étiquette MText est créée avec un masque d’arrière-plan pour améliorer sa visibilité sur des fonds complexes.
  6. Gestion des calques et styles : Le script crée automatiquement un calque dédié (« Label-Canalisation ») et un style de texte (« Texte-Canalisation ») s’ils n’existent pas, assurant une cohérence graphique.

Code LISP (Label_Cana.lsp) :

(vl-load-com)
(defun c:Label_Cana ( / AcDoc Space nw_style js htx ent_sel ent pt_sel param deriv rtx dir nw_obj)
 (setq
 AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
 Space
 (if (= 1 (getvar "CVPORT"))
 (vla-get-PaperSpace AcDoc)
 (vla-get-ModelSpace AcDoc)
 )
 )
 (cond
 ((null (tblsearch "LAYER" "Label-Canalisation"))
 (vlax-put (vla-add (vla-get-layers AcDoc) "Label-Canalisation") 'color 96)
 )
 )
 (cond
 ((null (tblsearch "STYLE" "Texte-Canalisation"))
 (setq nw_style (vla-add (vla-get-textstyles AcDoc) "Texte-Canalisation"))
 (mapcar
 '(lambda (pr val)
 (vlax-put nw_style pr val)
 )
 (list 'FontFile 'Height 'ObliqueAngle 'Width 'TextGenerationFlag)
 (list (strcat (getenv "windir") "\\fonts\\arial.ttf") 0.0 (/ (* 15.0 pi) 180) 1.0 0.0)
 )
 )
 )
 (princ "\nSélectionnez une polyligne.")
 (while
 (setq js
 (ssget "_+.:E:S"
 '(
 (0 . "*POLYLINE")
 (-4 . "\n<NOT\n")
 (-4 . "\n&\n") (70 . 112)
 (-4 . "\nNOT\n>\n")
 )
 )
 )
 (if (not htx)
 (progn
 (initget 6)
 (setq htx (getdist (getvar "VIEWCTR") (strcat "\nSpécifiez la hauteur du champ <" (rtos (getvar "TEXTSIZE")) ">: ")))
 (if htx (setvar "TEXTSIZE" htx) (setq htx (getvar "TEXTSIZE")))
 )
 )
 (setq ent_sel (ssnamex js 0))
 (if (not (eq ent (cadar ent_sel)))
 (progn
 (setq dir nil)
 (while (not (member dir '(">" "<" ""))) (setq dir (getstring "\nDirection d'écoulement \"< >\"?\(>\): ")))
 (if (eq dir "") (setq dir ">"))
 )
 )
 (setq
 ent (cadar ent_sel)
 pt_sel (cadar (cdddar ent_sel))
 obj (vlax-ename->vla-object ent)
 pt_sel (vlax-curve-getClosestPointTo obj pt_sel)
 param (vlax-curve-getparamatpoint obj pt_sel)
 deriv (vlax-curve-getFirstDeriv obj param)
 rtx (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR")))
 )
 (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5)))) (setq rtx (+ rtx pi)))
 (setq nw_obj
 (vla-addMtext Space
 (vlax-3d-point (polar pt_sel (- rtx (* 0.5 pi)) (vlax-get obj 'ConstantWidth)))
 (getvar "TEXTSIZE")
 (strcat
 (if (eq dir ">") "Ø=" "<-- Ø=")
 "%<\\AcObjProp.16.2 Object(%<\\_ObjId "
 (itoa (vla-get-ObjectID obj))
 ">%)."
 "ConstantWidth"
 " \\f \"%lu2%pr0%ct8[1000]\">%"
 " L="
 "%<\\AcObjProp.16.2 Object(%<\\_ObjId "
 (itoa (vla-get-ObjectID obj))
 ">%)."
 "Length"
 " \\f \"%lu2%pr2\">%"
 "ml"
 (if (eq dir ">") " -->" "")
 )
 )
 )
 (mapcar
 '(lambda (pr val)
 (vlax-put nw_obj pr val)
 )
 (list 'AttachmentPoint 'DrawingDirection 'StyleName 'Layer 'Rotation 'Width 'BackgroundFill)
 (list 2 5 "Texte-Canalisation" "Label-Canalisation" rtx 0.0 -1)
 )
 )
 (prin1)
)

Instructions d’utilisation :

  1. Enregistrer le code : Copiez le code ci-dessus et collez-le dans un éditeur de texte (comme le Bloc-notes) ou dans l’éditeur Visual LISP (VLIDE). Enregistrez le fichier sous un nom significatif, par exemple Label_Cana.lsp.
  2. Charger le LISP : Dans AutoCAD, tapez APPLOAD à la ligne de commande. Dans la boîte de dialogue « Charger/Décharger des applications », naviguez jusqu’à l’emplacement de votre fichier Label_Cana.lsp, sélectionnez-le et cliquez sur « Charger ». Vous pouvez également l’ajouter au « Contenu du démarrage » pour qu’il soit chargé automatiquement à chaque lancement d’AutoCAD.
  3. Exécuter la commande : Une fois le LISP chargé, tapez Label_Cana à la ligne de commande et appuyez sur Entrée.
  4. Sélectionner la polyligne : Le programme vous invitera à sélectionner une polyligne. Cliquez sur la polyligne (ou le segment de polyligne) que vous souhaitez étiqueter.
  5. Définir la hauteur du texte : Saisissez la hauteur souhaitée pour le texte de l’étiquette.
  6. Choisir la direction : Indiquez la direction du flux en tapant < ou >.
  7. Résultat : Une étiquette MText sera automatiquement créée et positionnée le long de la polyligne, affichant la largeur, la longueur et la flèche de direction.

Bonnes pratiques et personnalisation :

  • Unités et formatage : Les champs %lu2%pr0%ct8[1000] pour la largeur et %lu2%pr2 pour la longueur contrôlent le formatage. %pr0 signifie 0 décimale, %pr2 signifie 2 décimales. [1000] est un facteur d’échelle (utile si votre ConstantWidth est en mètres et que vous voulez l’afficher en millimètres, par exemple).
  • Style de texte et calque : Vous pouvez modifier les noms « Texte-Canalisation » et « Label-Canalisation » ainsi que la couleur du calque (96 pour le cyan) directement dans le code LISP pour correspondre à vos standards de CAO.
  • Flèches : Les symboles de flèche (<-- et -->) peuvent être remplacés par d’autres caractères ou symboles Unicode si nécessaire.

Cette solution LISP offre une flexibilité et une automatisation bien supérieures aux capacités natives de Covadis pour ce cas d’usage spécifique, tout en s’intégrant parfaitement dans l’environnement AutoCAD.