Mettre à jour l'altitude de blocs AutoCAD via attribut LISP

Comment attribuer la valeur d’un attribut (par exemple ‹ Alt ›) à la coordonnée Z d’insertion de blocs AutoCAD (comme les blocs ‹ Tcpoint › issus de levés topographiques), lorsque ces blocs sont insérés à une altitude nulle (Z=0) ou incorrecte ?

Pour mettre à jour l’altitude Z d’insertion de blocs AutoCAD à partir de la valeur d’un attribut spécifique, vous pouvez utiliser une routine LISP. Cette méthode est particulièrement utile pour les points topographiques importés où l’altitude est stockée dans un attribut mais le bloc est inséré en 2D (Z=0) ou à une altitude erronée.

Voici une solution LISP efficace et rapide, testée et validée pour ce cas :

  1. Chargement de la routine LISP :

    • Copiez le code LISP ci-dessous dans un fichier texte et enregistrez-le avec l’extension .lsp (par exemple, update_z_from_att.lsp).
    • Dans AutoCAD, tapez APPLOAD (ou _APPLOAD) et chargez ce fichier LISP.
  2. Code LISP (c:tcpointz) :

(defun c:tcpointz (/ jeusel n ent altval pospt tempo)
(setq jeusel (ssget (list (cons 0 « INSERT »)
(cons 2 « TCPOINT »)
)))
(setq n 0)
(repeat (sslength jeusel)
(setq ent (ssname jeusel n))
(if (= « ALT » (cdr (assoc 2 (entget (entnext (entnext ent))))))
(progn
(setq altval (cdr
(cons 1 (cdr (assoc 1 (entget (entnext (entnext ent)))))))
pospt (cdr (assoc 10 (entget ent)))
tempo (subst (cons 10 (list (car pospt) (cadr pospt) (atof altval)))
(cons 10 pospt)
(entget ent)
)
)
(entmod tempo)
(entupd ent)
(setq n (+ 1 n))
)
)
)
(princ)
)
```
* Fonctionnement : Cette routine sélectionne tous les blocs nommés TCPOINT. Pour chaque bloc, elle recherche l’attribut dont l’étiquette est ALT. Si trouvé, elle récupère la valeur de cet attribut (convertie en nombre) et met à jour directement la coordonnée Z du point d’insertion du bloc avec cette valeur.

  1. Utilisation :
    • Après avoir chargé le LISP, tapez TCPOINTZ dans la ligne de commande AutoCAD et appuyez sur Entrée.
    • La routine s’exécutera automatiquement sur tous les blocs TCPOINT présents dans le dessin.

Alternative (basée sur le code initial avec correction de déplacement relatif) :

Si vous préférez une approche utilisant les fonctions vlax- pour manipuler les objets ActiveX (plus moderne et parfois plus robuste pour certaines opérations), voici une version modifiée du LISP initial qui gère correctement le déplacement relatif :

(defun c:bloc-alt (/ ins att name tag)
  (vl-load-com)
  (and
    (setq name "TCPOINT") ; Nom du bloc à traiter
    (setq tag "ALT")     ; Étiquette de l'attribut contenant l'altitude
    (ssget "_X" (list '(0 . "INSERT") (cons 2 name)))
    (vlax-for b (vla-get-ActiveSelectionSet
                  (vla-get-ActiveDocument (vlax-get-acad-object)))
      (setq ins (vlax-get b 'InsertionPoint)
            att (vlax-invoke b 'getAttributes)
      )
      (foreach a att
        (if (and (= (vla-get-TagString a) (strcase tag))
                 (numberp (setq alt (read (vla-get-TextString a))))
            )
          (vla-Move b
                    (vlax-3d-point (list 0 0 (caddr ins))) ; Point de base (Z actuel)
                    (vlax-3d-point (list 0 0 alt))         ; Point de destination (Z de l'attribut)
          )
        )
      )
    )
  )
  (princ)
)
  • Fonctionnement : Cette routine sélectionne également les blocs TCPOINT. Elle calcule le déplacement nécessaire pour amener le Z actuel du bloc à la valeur de l’attribut ALT. La fonction vla-Move est utilisée avec le Z actuel comme point de base et la nouvelle altitude comme point de destination.

Bonnes Pratiques :

  • Sauvegarde : Avant d’exécuter une routine LISP modifiant des données, il est toujours recommandé de sauvegarder votre dessin.
  • Test : Testez la routine sur un petit échantillon de blocs ou sur une copie de votre dessin avant de l’appliquer à un grand nombre de données.
  • Compréhension : Si vous utilisez régulièrement des routines LISP, prendre le temps de comprendre leur fonctionnement vous permettra de les adapter à vos besoins spécifiques et de débugger d’éventuels problèmes.