Décharger rapidement une Xref ou Image par clic dans AutoCAD (LISP)

Comment décharger rapidement une ou plusieurs références externes (Xrefs) ou images dans AutoCAD par simple sélection graphique, sans passer par le gestionnaire de Xrefs et en évitant les ralentissements sur les fichiers volumineux ?

La gestion des références externes (Xrefs) et des images peut devenir fastidieuse, surtout avec des fichiers volumineux où le gestionnaire classique peut entraîner des ralentissements. Cette solution propose des routines LISP pour décharger ou détacher ces éléments par simple sélection, améliorant ainsi l’efficacité de votre workflow.

Prérequis : Chargement des routines LISP

Pour utiliser les commandes personnalisées ci-dessous, vous devez charger les fichiers LISP (.LSP) dans AutoCAD. La méthode recommandée est de les ajouter à la suite de démarrage pour qu’ils soient disponibles à chaque lancement d’AutoCAD.

  1. Enregistrer le code : Copiez le code LISP fourni dans un éditeur de texte (comme le Bloc-notes) et enregistrez-le avec l’extension .lsp (par exemple, unload_xref.lsp et unload_image.lsp).
  2. Charger le LISP :
    • Tapez APPLOAD dans la ligne de commande et appuyez sur Entrée.
    • Dans la boîte de dialogue « Charger/Décharger des applications », cliquez sur « Contenu… » sous « Suite de démarrage ».
    • Cliquez sur « Ajouter… », naviguez jusqu’à votre fichier .lsp et sélectionnez-le.
    • Cliquez sur « Fermer » puis sur « Fermer » à nouveau.

Solution 1 : Décharger une Xref par sélection unitaire et répétée (Recommandé)

Cette méthode permet de décharger une Xref à la fois, en restant dans la commande pour en décharger plusieurs successivement. Elle est particulièrement efficace pour les Xrefs volumineuses car elle peut être optimisée pour éviter le surlignage.

  1. Code LISP (unload_xref.lsp) :

    (defun c:unload_xref ( / js name_xref)
      (princ "\nSélectionner l'XRef à décharger. ")
      (while (null (setq js (ssget "_+.:E:S" '((0 . "INSERT")))))
        (princ "\nObjets non valable!")
      )
      (cond
        ((eq (boole 1 (cdr (assoc 70 (tblsearch "BLOCK" (setq name_xref (cdr (assoc 2 (entget (ssname js 0)))))))) 4) 4)
          (command "_.-xref" "_Unload" name_xref)
        )
        (T (princ "\nN'est pas une référence externe. "))
      )
      (prin1)
    )
    
  2. Créer une macro de commande :

    • Ouvrez l’éditeur CUI (Commande CUI).
    • Dans la section « Liste des commandes », créez une nouvelle commande.
    • Nommez-la par exemple « Décharger Xref par clic ».
    • Dans la section « Macro », entrez la chaîne suivante : ^C^C_multiple;unload_xref
    • Faites glisser cette nouvelle commande vers une barre d’outils, un ruban ou un menu contextuel de votre choix.
  3. Utilisation : Cliquez sur le bouton de la macro. La commande vous demandera de sélectionner une Xref. Après chaque sélection, l’Xref sera déchargée et la commande restera active pour vous permettre de sélectionner une autre Xref. Appuyez sur Échap pour quitter la commande.

  4. Optimisation (pour Xrefs volumineuses) : Pour éviter le surlignage qui peut ralentir AutoCAD lors de la sélection d’une Xref très grande, vous pouvez modifier le LISP comme suit :

    (defun c:unload_xref ( / js name_xref)
      (setvar "HIGHLIGHT" 0) ; Désactive le surlignage
      (princ "\nSélectionner l'XRef à décharger. ")
      (while (null (setq js (ssget "_+.:E:S" '((0 . "INSERT")))))
        (princ "\nObjets non valable!")
      )
      (cond
        ((eq (boole 1 (cdr (assoc 70 (tblsearch "BLOCK" (setq name_xref (cdr (assoc 2 (entget (ssname js 0)))))))) 4) 4)
          (command "_.-xref" "_Unload" name_xref)
        )
        (T (princ "\nN'est pas une référence externe. "))
      )
      (setvar "HIGHLIGHT" 1) ; Réactive le surlignage
      (prin1)
    )
    

    Note : Cette optimisation est à intégrer dans le LISP unload_xref.lsp avant de le charger.

Solution 2 : Décharger plusieurs Xrefs par sélection groupée (Alternative)

Cette version du LISP permet de sélectionner plusieurs Xrefs en une seule fois (par fenêtre de sélection par exemple) et de les décharger toutes après validation.

  1. Code LISP (unload_xref_multiple.lsp) :
    (defun c:unload_xref_multiple ( / js n name_xref)
      (princ "\nSélectionner les XRefs à décharger. ")
      (while (null (setq js (ssget "_+.:E" '((0 . "INSERT")))))
        (princ "\nObjets non valable!")
      )
      (repeat (setq n (sslength js))
        (cond
          ((eq (boole 1 (cdr (assoc 70 (tblsearch "BLOCK" (setq name_xref (cdr (assoc 2 (entget (ssname js (setq n (1- n)))))))))) 4) 4)
            (command "_.-xref" "_Unload" name_xref)
          )
          (T (princ "\nN'est pas une référence externe. "))
        )
      )
      (prin1)
    )
    
  2. Utilisation : Après avoir chargé ce LISP, tapez UNLOAD_XREF_MULTIPLE dans la ligne de commande. Vous pourrez alors sélectionner une ou plusieurs Xrefs. Appuyez sur Entrée pour valider votre sélection et décharger toutes les Xrefs choisies.

Solution 3 : Détacher des images par sélection unitaire et répétée

Similaire à la méthode pour les Xrefs, cette routine permet de détacher des images insérées dans votre dessin.

  1. Code LISP (unload_image.lsp) :
    (defun c:unload_image ( / *error* str2lst sep pos str aa bb cc lst nom)
      (princ "\nSélectionner l'Image à détacher. ")
      ;;; Gestion d'erreur
      (defun *error* (msg)
        (if (/= msg "Fonction annulée")
          (princ (strcat "\nErreur: " msg))
        )
        (princ)
      )
      ;;; Transformation d'une chaine avec séparateur en liste de chaînes
      (defun str2lst (str sep / pos)
        (if (setq pos (vl-string-search sep str))
          (cons (substr str 1 pos)
                (str2lst (substr str (+ (strlen sep) pos 1)) sep)
          )
          (list str)
        )
      )
      ;;;
      (while
        (setq aa (entget (car (entsel))))
        (setq bb (entget (cdr (assoc 340 aa))))
        (setq cc (cdr (assoc 1 bb)))
        (setq lst (last (str2lst cc "\\")))
        (setq nom (car (str2lst lst ".")))
        (command "_.-image" "D" nom)
      )
      (prin1)
    )
    
  2. Créer une macro de commande (similaire à la Solution 1) :
    • Ouvrez l’éditeur CUI (Commande CUI).
    • Créez une nouvelle commande, nommez-la par exemple « Détacher Image par clic ».
    • Dans la section « Macro », entrez la chaîne suivante : ^C^C_multiple;unload_image
    • Faites glisser cette commande vers une interface utilisateur.
  3. Utilisation : Cliquez sur le bouton de la macro. La commande vous demandera de sélectionner une image. Après chaque sélection, l’image sera détachée et la commande restera active. Appuyez sur Échap pour quitter.

Ces routines LISP offrent une flexibilité et une rapidité accrues pour la gestion de vos références externes et images, en contournant les limitations des méthodes standard d’AutoCAD.