Coucou,
Alors dans un premier temps, je remarque que ton ChatGPT ne connaît pas le principe des commandes/options internationales (ce qui peut poser problème si ton AutoCAD n'est pas anglais...). Pour cela, il suffit de rajouter un underscore _ devant les noms de commandes et/ou options (certaines commandes/options avaient déjà un underscore dans ton programme). Ci-dessous le programme avec les options internationales (j'ai ajouté en commentaire ce que j'ai ajouté dans la ligne) :
(defun c:dxfauto (/ docName docPath dxfName cmd ss layoutName pdfFile allObjects)
;; Sauvegarder la valeur actuelle de CMDECHO
(setq cmd (getvar 'cmdecho))
;; Désactiver l'affichage des commandes
(setvar 'cmdecho 0)
;; Enregistrer le fichier DWG en cours
(command "_.QSAVE")
;; Mettre le calque COTATIONS en arrière-plan
(setq ss (ssget "_X" (list (cons 8 "COTATIONS")))) ;;; _
(if ss
(command "_.DRAWORDER" ss "" "_B") ;;; _
(princ "\nAucun objet trouvé sur le calque COTATIONS.")
)
;; Obtenir le nom et le chemin du fichier DWG ouvert
(setq docName (getvar "DWGNAME"))
(setq docPath (getvar "DWGPREFIX"))
;; Imprimer le layout "AVEC COTES" en PDF en couleur
(setq layoutName "AVEC COTES")
(if (member layoutName (layoutlist))
(progn
(setq pdfFile (strcat docPath (vl-filename-base docName) "_AVEC_COTES.pdf"))
(setvar 'CTab layoutName)
(command "_-PLOT" ;;; _
"_Y" ;;; _
""
"DWG To PDF.pc3"
"ISO_A4_(210.00_x_297.00_MM)"
"_Millimeters" ;;; _
"_LANDSCAPE" ;;; _
"_N" ;;; _
"_E" ;;; _
"_F" ;;; _
"_C" ;;; _
"_Y" ;;; _
"" ;; Aucun style de tracé (pour couleur)
"_Y" ;;; _
"_N" ;;; _
"_N" ;;; _
"_N" ;;; _
pdfFile
"_N" ;;; _
"_Y" ;;; _
)
)
(princ "\nLe layout 'AVEC COTES' n'existe pas.")
)
;; Se positionner sur le calque COUPES BRUTES
(command "_-layer" "_Set" "COUPES BRUTES" "")
;; Supprimer les calques spécifiés avec confirmation automatique
(command "_-laydel" "name" "COTATIONS" "" "_Y") ;;; _ _
(command "_-laydel" "name" "INDICATIONS" "" "_Y") ;;; _ _
(command "_-laydel" "name" "PROLINER" "" "_Y") ;;; _ _
(command "_-laydel" "name" "CADRE" "" "_Y") ;;; _ _
;; Revenir au layout "Model"
(setvar 'CTab "Model")
;; Sélectionner tous les objets visibles
(setq allObjects (ssget "_X"))
;; Exploser tous les objets sélectionnés
(if allObjects
(progn
(foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex allObjects)))
(command "_.EXPLODE" ent "")
)
)
)
;; Créer le nom du fichier DXF
(setq dxfName (strcat docPath (vl-filename-base docName) ".dxf"))
;; Enregistrer le fichier en DXF
(command "_.DXFOUT" dxfName "16")
;; Ajouter un délai pour s'assurer que le fichier est bien enregistré
(vl-cmdf "_.delay" 1000)
;; Ouvrir le fichier DXF dans un nouvel onglet en utilisant l'API ActiveX/COM
(setq acadApp (vlax-get-acad-object))
(setq acadDocs (vla-get-documents acadApp))
(vla-open acadDocs dxfName)
;; Restaurer la valeur initiale de CMDECHO
(setvar 'cmdecho cmd)
;; Afficher un message de confirmation
(princ (strcat "\nFichier enregistré sous : " dxfName))
(princ)
)
;; Appel de la fonction principale
(c:dxfauto)
Ensuite concernant ta demande
A ma connaissance un LISP n'est pas en mesure de s'exécuter d'un fichier à un autre. Donc si tu exécutes ton LISP dans ton DWG, et que tu ouvres un autre fichier pour le rendre courant (via le LISP) alors le programme continuera de s'exécuter dans ton DWG initial il me semble (ou bien il met fin à son exécution, je ne sais pas exactement).
Donc sur le principe, il n'est pas possible de faire ce que tu souhaites en LISP, c'est-à-dire à partir d'un DWG, créer un DXF pour ensuite apporter des modifications dans ce nouveau fichier DXF.
En revanche (bien que je n'y connais rien), je pense que ce genre de choses peuvent se faire via un script (donc externe à AutoCAD) pour ouvrir un DWG, faire les modifications DWG, créer un fichier DXF pour ensuite exécuter la suite du programme sur ce fichier.
Enfin, pour cette demande
si jamais tu as des commandes qui requiert des validations imprévues (cela ne fonctionne pas si tu dois saisir des options différentes cependant), tu peux vérifier la valeur de la variable "CMDACTIVE" (cf. >>ici<<) et l'intégrer dans une boucle comme ceci par exemple :
(command "_.EXPLODE" ent "")
(while (= 1 (logand 1 (getvar "CMDACTIVE")))
(command "")
)
Et si tu veux filtrer ton jeu de sélection pour 3 calques uniquement alors il faut l'intégrer à ton (ssget) via le code DXF 2 comme ceci (tu remarqueras l'utilisation de la virgule , pour séparer 2 éléments au sein d'une chaîne de caractères) :
(setq allObjects (ssget "_X" (list (cons 8 "Calque1,Calque2,Calque3"))))
Désolée je manque de temps pour regarder ton problème plus en détail...
Bisous,
Luna