Insertion de blocs AutoCAD aux coordonnées d'autres blocs via attribut (LISP)

Comment insérer automatiquement des blocs spécifiques (définis par un attribut ‹ DESC2 ›) aux coordonnées exactes (position, échelle, rotation, direction Z) d’autres blocs existants (‹ SRVPNO2 ›) dans AutoCAD 2011, notamment pour des relevés topographiques ?

Pour insérer des blocs en se basant sur les informations (nom du bloc à insérer, position, échelle, rotation, direction Z) contenues dans les attributs d’autres blocs existants, une routine LISP est la solution la plus efficace. Ce scénario est courant pour automatiser la représentation graphique de points topographiques ou d’équipements.

1. Compréhension du Problème
Vous disposez de blocs nommés « SRVPNO2 » représentant des points de relevé. Chacun de ces blocs contient un attribut « DESC2 » dont la valeur est le nom d’un autre bloc (ex: « EP-Grille », « EU-Regard ») que vous souhaitez insérer. L’objectif est d’insérer ces nouveaux blocs aux coordonnées précises (point d’insertion, échelle, rotation, direction Z) de chaque bloc « SRVPNO2 » correspondant.

2. Solution LISP Recommandée (VDH-Bruno)
La routine LISP suivante, testée et validée par l’utilisateur, permet d’automatiser cette tâche en parcourant tous les blocs « SRVPNO2 », en lisant leur attribut « DESC2 » et en insérant le bloc correspondant avec les mêmes propriétés géométriques.

Procédure :

  1. Copiez le code LISP ci-dessous dans un éditeur de texte (ex: Bloc-notes) et enregistrez-le avec l’extension .lsp (ex: insDesc2.lsp).
  2. Dans AutoCAD, chargez le LISP via la commande APPLOAD (ou CHARGEAPPLI). Naviguez jusqu’à votre fichier .lsp et chargez-le.
  3. Exécutez la commande insDesc2 dans la ligne de commande d’AutoCAD.
(defun c:insDesc2 (/ ss i e valDesc2 e-dxf)
 
 ;; GetAttribs (gile)
 ;; Retourne une liste de paire pointées (TAG . Value) par attribut contenus dans le bloc
 ;;
 ;; Argument
 ;; ent : le nom d'entité (ENAME) de la référence de bloc
 (defun GetAttribs (ent / elst lst)
 (setq ent (entnext ent))
 (while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent)))))
 (setq lst (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 1 elst))) lst)
 ent (entnext ent)
 )
 )
 (reverse lst)
 )
 
 ;; Programme principal
 (setq ss (ssget "_X" '((0 . "INSERT") (2 . "SRVPNO2"))))
 (repeat (setq i (if ss
 (sslength ss)
 0
 )
 )
 (setq e (ssname ss (setq i (1- i)))
 valDesc2 (cdr (assoc "DESC2" (getattribs e)))
 e-dxf (entget e)
 )
 (if (and valDesc2 (tblsearch "block" valDesc2))
 (entmakex (list '(0 . "INSERT")
 (cons 2 valDesc2)
 (cons 10 (cdr (assoc 10 e-dxf)))
 (cons 41 (cdr (assoc 41 e-dxf)))
 (cons 42 (cdr (assoc 42 e-dxf)))
 (cons 43 (cdr (assoc 43 e-dxf)))
 (cons 50 (cdr (assoc 50 e-dxf)))
 (cons 210 (cdr (assoc 210 e-dxf)))
 )
 )
 )
 )
 (princ)
)

Explication du code :

  • La fonction GetAttribs est une utilité qui extrait les valeurs de tous les attributs d’une référence de bloc donnée.
  • Le programme principal c:insDesc2 sélectionne d’abord toutes les références de bloc nommées « SRVPNO2 » dans le dessin (ssget "_X" ...).
  • Il parcourt ensuite chaque bloc « SRVPNO2 » sélectionné.
  • Pour chaque bloc, il récupère la valeur de l’attribut « DESC2 ».
  • Si cette valeur existe et correspond au nom d’une définition de bloc présente dans le dessin (tblsearch "block" valDesc2), il crée une nouvelle insertion de bloc (entmakex).
  • Les codes DXF 10 (point d’insertion), 41 (échelle X), 42 (échelle Y), 43 (échelle Z), 50 (rotation) et 210 (direction d’extrusion, pour la 3D) du bloc « SRVPNO2 » original sont utilisés pour insérer le nouveau bloc, garantissant ainsi qu’il est placé et orienté exactement comme le bloc source.

3. Considérations et Bonnes Pratiques

  • Définitions de Blocs : Assurez-vous que toutes les définitions de blocs dont les noms sont listés dans l’attribut « DESC2 » (ex: « EP-Grille », « EU-Regard ») existent déjà dans le dessin courant. Si ce n’est pas le cas, le LISP ignorera l’insertion pour ce point.
  • Sensibilité à la Casse : Le nom de l’attribut « DESC2 » et les noms des blocs sont sensibles à la casse dans le LISP. Vérifiez qu’ils correspondent exactement.
  • Performance : Pour les dessins contenant un très grand nombre de blocs « SRVPNO2 », l’exécution du script peut prendre un certain temps.
  • Gestion de l’Annulation : La version LISP fournie insère les blocs un par un. Si vous souhaitez annuler l’opération en une seule étape (UNDO), une approche utilisant l’API ActiveX (comme celle proposée par Patrick_35) avec vla-startundomark et vla-endundomark serait plus appropriée. L’approche entmakex est plus directe mais n’offre pas cette gestion d’annulation groupée nativement.
  • Suppression des Blocs Originaux : La routine ne supprime pas les blocs « SRVPNO2 » originaux. Si vous n’en avez plus besoin après l’insertion des nouveaux blocs, vous devrez les supprimer manuellement ou adapter le LISP pour inclure cette étape (par exemple, en utilisant entdel sur le bloc e après l’insertion).