AutoLISP : Relier des blocs AutoCAD à un point d'insertion de référence

Comment créer un script AutoLISP pour relier des blocs AutoCAD à un point d’insertion de référence, en traçant des lignes individuelles depuis ce point vers les points d’insertion des autres blocs sélectionnés ?

Pour automatiser le traçage de lignes individuelles entre le point d’insertion d’un bloc de référence et les points d’insertion d’autres blocs sélectionnés, vous pouvez utiliser le script AutoLISP suivant. Ce programme permet de désigner un bloc de départ, puis de sélectionner un ensemble de blocs cibles, et il générera une ligne distincte de votre bloc de référence vers chaque bloc cible.

1. Le Script AutoLISP

Voici le code AutoLISP optimisé pour cette tâche :

(defun c:RELIEBLOCS (/ br elst p0 ss i pt)
  (and
    ;; 1. Sélection du bloc de départ
    (setq br (car (entsel "\nSelectionnez le bloc de départ: ")))
    ;; Vérifier que l'entité sélectionnée est bien un bloc (INSERT)
    (setq elst (entget br))
    (= (cdr (assoc 0 elst)) "INSERT")
    ;; Récupération du point d'insertion du bloc de départ en SCG (Système de Coordonnées Général)
    (setq p0 (trans (cdr (assoc 10 elst)) br 1))

    ;; 2. Sélection des blocs à relier
    (princ "\nSélectionnez les blocs à relier.")
    (setq ss (ssget '((0 . "INSERT"))))
    ;; Supprimer le bloc de départ du jeu de sélection si il a été sélectionné par erreur
    (or (ssdel br ss) T)

    ;; 3. Parcours du jeu de sélection et création des lignes
    (repeat (setq i (sslength ss))
      ;; Récupération des données DXF du bloc cible
      (setq elst (entget (ssname ss (setq i (1- i))))
            ;; Récupération du point d'insertion du bloc cible en SCG
            pt   (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 1)
      )
      ;; Construction de la ligne entre p0 et pt
      (command "_.line" p0 pt "")
    )
  )
  (princ)
)

2. Utilisation du Script

  1. Charger le LISP : Enregistrez le code ci-dessus dans un fichier .lsp (par exemple, relieblocs.lsp). Chargez-le dans AutoCAD via la commande APPLOAD.
  2. Lancer la commande : Tapez RELIEBLOCS (ou XXX si vous n’avez pas renommé la fonction c:XXX) dans la ligne de commande et appuyez sur Entrée.
  3. Sélectionner le bloc de départ : Le programme vous invitera à sélectionner le bloc qui servira de point d’ancrage pour toutes les lignes.
  4. Sélectionner les blocs cibles : Ensuite, sélectionnez tous les autres blocs que vous souhaitez relier au bloc de départ. Vous pouvez utiliser une fenêtre de sélection, une sélection par polygone, ou cliquer individuellement sur les blocs.
  5. Valider : Appuyez sur Entrée pour finaliser la sélection. Le script tracera automatiquement une ligne depuis le point d’insertion du bloc de départ vers le point d’insertion de chaque bloc cible.

3. Explication Détaillée du Code

  • c:RELIEBLOCS : Définit une commande AutoCAD nommée RELIEBLOCS.
  • (/ br elst p0 ss i pt) : Déclare les variables locales utilisées dans la fonction pour éviter les conflits avec d’autres variables globales.
  • (entsel "\nSelectionnez le bloc de départ: ") : Demande à l’utilisateur de sélectionner une entité et retourne une liste contenant le nom de l’entité et son point de sélection. (car ...) extrait le nom de l’entité.
  • (entget br) : Récupère la liste des codes DXF (Données d’eXchange de Fichier) de l’entité br (le bloc de départ).
  • (cdr (assoc 0 elst)) "INSERT" : Vérifie que l’entité sélectionnée est bien une insertion de bloc (type DXF 0 est « INSERT »).
  • (cdr (assoc 10 elst)) : Récupère le point d’insertion du bloc (code DXF 10).
  • (trans point entite 1) : Transforme un point d’un système de coordonnées à un autre. Ici, il convertit le point d’insertion du bloc (qui est en OCS - Object Coordinate System du bloc) vers le SCG (Système de Coordonnées Général). br est l’entité de référence pour la transformation du point de départ, et (cdr (assoc 210 elst)) (le vecteur d’extrusion) est utilisé pour le point d’arrivée, garantissant une conversion précise même pour des blocs complexes (rotations, échelles).
  • (ssget '((0 . "INSERT"))) : Demande à l’utilisateur de sélectionner un jeu d’entités, filtrant uniquement les blocs (INSERT).
  • (ssdel br ss) : Supprime le bloc de départ du jeu de sélection ss si l’utilisateur l’a inclus par inadvertance.
  • (sslength ss) : Retourne le nombre d’entités dans le jeu de sélection ss.
  • (repeat (setq i (sslength ss)) ...) : Boucle qui itère sur chaque entité du jeu de sélection.
  • (ssname ss (setq i (1- i))) : Récupère le nom de l’entité à l’index i du jeu de sélection ss.
  • (command "_.line" p0 pt "") : Exécute la commande AutoCAD LIGNE (ou LINE en anglais) pour créer une ligne. p0 est le point de départ, pt est le point d’arrivée, et "" simule l’appui sur Entrée pour terminer la commande.

4. Bonnes Pratiques et Améliorations Possibles

  • Nom de la commande : Il est recommandé de remplacer XXX par un nom de commande plus descriptif, comme RELIEBLOCS, pour une meilleure lisibilité et pour éviter les conflits.
  • Gestion des erreurs : Le script inclut déjà des vérifications de base (bloc de départ, type d’entité). Pour une robustesse accrue, vous pourriez ajouter des vérifications si ss est vide (aucun bloc cible sélectionné).
  • Comptage des blocs : Si vous avez besoin de connaître le nombre de blocs sélectionnés pour une autre opération (par exemple, l’afficher ou l’écrire dans un attribut de bloc), la variable (sslength ss) contient cette information après la sélection des blocs cibles. Vous pouvez l’utiliser directement ou l’assigner à une autre variable pour un usage ultérieur.
  • Propriétés des lignes : Actuellement, les lignes sont créées avec les propriétés du calque courant. Vous pourriez modifier le script pour définir un calque, une couleur ou un type de ligne spécifique pour les lignes créées en utilisant (command "_.-LAYER" ...) ou en modifiant les données DXF de la ligne via entmakex avant de l’ajouter au dessin.