Bonjour,
Mon objectif de Lisp est via une commande d'envoyer en arrière plan tous objets se trouvant dans tous les Layers "bylayer" ayant pour couleur le 13.
Après quelques recherches de mon côté, j'ai quelques briques de moyens pour y arriver. Toutefois, je ne vois pas comment créer une liste de tous les noms de layers (couleur 13) de mon dwg
J'ai vu comment trouver le chiffre de la couleur bylayer d'un objet via (CADaSchtroumpf) :
((lambda ( / e dxf_ent)
(while (null (setq e (entsel))))
(setq dxf_ent (entget (car e)))
(cond
((null (assoc 62 dxf_ent))
(cdr (assoc 62 (tblsearch "LAYER" (cdr (assoc 8 dxf_ent)))))
)
(T
(cdr (assoc 62 dxf_ent))
)
)
))
J'ai également vu que je peux plus tard créer une sélection de tous les objets se trouvant dans plusieurs Layers via :
(sssetfirst nil (ssget "_X" '((8 . "Layer1,Layer2,Layer3,Layer4"))))
Il me suffirait ensuite d'utiliser cette sélection pour envoyer tous les objets en arrière plan.
Quelqu'un peut-il m'aider à créer le Lisp en question ?
Merci d'avance
Résolu ! Accéder à la solution.
Résolu par lewis185. Accéder à la solution.
Bonjour,
je ne comprends pas. Tu veux sélectionner tous les objets ayant la couleur forcée 13, ou bien tu veux sélectionner tous les objets ayant la couleur Ducalque et dont le calque a la couleur 13?
Olivier
Olivier Eckmann
Bonjour,
Il s'agit du second choix. J'ai à peu près 1200 Layers dans un dwg, dont 140 (environs) ont la couleur 13, je souhaites sélectionner tous les objets de ces 140 Layers afin de les envoyer en arrière plan.
De mon côté, j'ai commencé à coder quelque chose qui me semble prometteur. Mais je ne suis pas contre les suggestions.
Merci encore.
Bonjour,
Voici mon début de code, j'ai un problème avec la dernière action du lisp (draworder).
Aucune erreur ne s'affiche mais l'action ne se fait pas.
(defun c:Test16 (/ count lst layer ss)
(setvar "ctab" "Model")
(setq count 0)(setq lst "")
(foreach layer (Table "layer")
(if (= (cdr (assoc 62 (tblsearch "LAYER" layer))) 13)
(progn
(setq count (1+ count))
(setq lst (strcat lst layer ","))
)
)
)
(if (/= lst "")
(progn
(setq ss (ssget "_X" (list (cons 8 lst))))
(command "draworder" ss "" "B")
(command "regenall")
(prompt (strcat (rtos count) " layers"))
)
)
(princ))
; *******************
; by *Piercey, Jason
(defun Table (s / d r)
(while (setq d (tblnext s (null d)))
(setq r (cons (cdr (assoc 2 d)) r))))
;(Table "layer")
Si tu utilises une version française d'AutoCAD tu ne peux pas utiliser les nom US des commandes, il faut les préfixer avec un caractère souligné "_"
(command "draworder" ss "" "B")
devient
(command "_draworder" ss "" "_B")
Olivier
Olivier Eckmann
Solution trouvée. Il suffisait que je fasse un Audit Yes.
Et mon code complet fonctionne. Je le partage pour ceux qui veulent.
(defun c:stb13 (/ count lst layer ss)
(command "audit" "y")
(setvar "ctab" "Model")
(setq count 0)
(foreach layer (Table "layer")
(if (= (cdr (assoc 62 (tblsearch "LAYER" layer))) 13)
(progn
(setq count (1+ count))
(if (= lst nil)(setq lst layer)(setq lst (strcat lst "," layer)))
)
)
)
(if (/= lst nil)
(progn
(setq ss (ssget "_X" (list (cons 8 lst))))
(command "draworder" ss "" "B")
(command "regenall")
)
)
(command "regenall")
(prompt (strcat (rtos count) " layers"))
(princ))
; *******************
; by *Piercey, Jason
(defun Table (s / d r)
(while (setq d (tblnext s (null d)))
(setq r (cons (cdr (assoc 2 d)) r))))
;(Table "layer")
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.