Bred Posté(e) le 28 octobre 2006 Posté(e) le 28 octobre 2006 Pour un besoin personnel, j'ai écris des routines permettant de faire des actions sur les Groupes de Calques. Ces routines ne sont pas parfaites : elles ne fonctionnent pas si il n'existe pas dans le plan au moins un Filtre de Groupe (car je le récupère et l'utilise comme base pour toutes les routines...)(Je les retoucherait peut-être un jour, mais j'en ai tellement bavé pour les mettre au point que je prefert passer sur autre chose pour m'aérer la tête !!!) :P Les Routines : [b];;; Routine Récupération Entité "ACLYDICTIONARY"[/b] (defun GRC_Recup () (setq TAB_dxf330 (entget (cdr (assoc 330 (entget (tblobjname "layer" "0")))))) (if (cdr (assoc 360 TAB_dxf330)) (progn (setq DIC_dxf360 (entget (cdr (assoc 360 TAB_dxf330))) Ent_dxf360 (entget (cdadr (member '(3 . "ACLYDICTIONARY") DIC_dxf360))) Ent_dxf360_TRAV Ent_dxf360) ) (progn (Alert "\nPas de Groupe de Calques Existant dans de Plan. \nCommande impossible. \nDésolé.") (quit) ) ) (princ) ) ;;; [b]Routine Liste ( dxf 3. + entité ) Groupe de Calque - list_ent_group -[/b] (defun GRC_Lst () (GRC_Recup) (setq list_ent_group nil) (while (assoc 350 Ent_dxf360_TRAV) (setq list_ent_group (append (list (list (cdr (assoc 3 Ent_dxf360_TRAV)) (cdr (assoc 350 Ent_dxf360_TRAV)))) list_ent_group) Ent_dxf360_TRAV (vl-remove (assoc 350 Ent_dxf360_TRAV) Ent_dxf360_TRAV) Ent_dxf360_TRAV (vl-remove (assoc 3 Ent_dxf360_TRAV) Ent_dxf360_TRAV)) ) ) ;;;[b] Routine Création Liste de Nom Groupe de Calque - Lst_GR -[/b] (defun GRC_Lst_Ex () (GRC_Lst) (setq x 0) (repeat (length list_ent_group) (setq Lst_GR (append (list (cdr (assoc 300 (entget (cadr (nth x list_ent_group)))))) Lst_GR) x (+ x 1)) ) ) ;;; [b]Routine Activation Groupe de Calque[/b] (defun GRC_active (Groupe_a_activer / Ent_GROUPE) (GRC_Lst) (While (null Ent_GROUPE) (if (= Groupe_a_activer (cdr (assoc 300 (entget (cadr (nth 0 list_ent_group)))))) (setq Ent_GROUPE (nth 0 list_ent_group)) (setq list_ent_group (vl-remove (nth 0 list_ent_group) list_ent_group)) ) ) (setq list_ent_Groupe (entget (cadr Ent_GROUPE))) (InsList_Ent_Apres list_ent_Groupe (cons 290 1) '(280 . 1)) (setq Ent_GROUPE_SAUV Ent_GROUPE Ent_GROUPE_ACTIF (entmakex list_rebuild) Ent_GROUPE_ACTIF (cdr (assoc -1 (entmod (subst (cons 350 Ent_GROUPE_ACTIF) (cadr (member (cons 3 (car Ent_GROUPE_SAUV)) Ent_dxf360))Ent_dxf360)))) Ent_GROUPE_ACTIF (cdr (assoc -1 (entmod (append (reverse (cdr (reverse DIC_dxf360))) (list (cons 360 Ent_GROUPE_ACTIF))))))) (if (cdr (assoc 360 TAB_dxf330)) (entmod (subst (cons 360 Ent_GROUPE_ACTIF) (assoc 360 TAB_dxf330) TAB_dxf330)) (entmod (append TAB_dxf330 (list (cons 360 Ent_GROUPE_ACTIF)))) ) (princ) ) ;;;[b] Routine Création et Activation Groupe de Calque (VIDE !)[/b] (defun GRC_creer_act (Groupe_a_creer) (GRC_Recup) (setq Ent (entmakex (list '(0 . "XRECORD") '(102 . "{ACAD_REACTORS") (cons 330 (cdr (assoc -1 Ent_dxf360))) '(102 . "}") (cons 330 (cdr (assoc -1 Ent_dxf360))) '(100 . "AcDbXrecord") '(280 . 1) '(290 . 1) '(1 . "AcLyLayerGroup") '(90 . 1) (cons 300 Groupe_a_creer)) ) ) (setq Ent (cdr (assoc -1 (entmod (append Ent_dxf360 (list (cons 3 "*") (cons 350 Ent)))))) Ent (cdr (assoc -1 (entmod (append (reverse (cdr (reverse DIC_dxf360))) (list (cons 360 Ent))))))) (if (cdr (assoc 360 TAB_dxf330)) (entmod (subst (cons 360 Ent) (assoc 360 TAB_dxf330) TAB_dxf330)) (entmod (append TAB_dxf330 (list (cons 360 Ent)))) ) ) ;;;[b]Routine insertion Entité dans liste[/b] (defun InsList_Ent_Apres (list_ent Ent Apres) (setq fin_list (cdr (member Apres list_ent)) debut_list (reverse (member Apres (reverse list_ent))) fin_list (append (list Ent) fin_list) list_rebuild (append debut_list fin_list)) ) Les Commandes : ;;; [b]Commande pour Créer et Activer un Groupe (VIDE!).[/b] (defun c: [surligneur]Creer-groupe[/surligneur] (/ nom) (setq Nom (getstring T "\n Donner un Nom de Groupe de Calque à Créer :")) (GRC_creer_act Nom) (princ) ) ;;; [b]Commande pour Activer un Groupe Existant.[/b] (defun c:[surligneur]Activer-Groupe[/surligneur] (/ list_ent_group Groupe_a_activer Lst_GR) (GRC_Lst_Ex) (if list_ent_group (progn (while (null Groupe_a_activer) (setq Groupe_a_activer (getstring T "\n Choisir la Référence du Groupe à Activer (?):")) (if (= Groupe_a_activer "?") (progn (command "ECRANTXT") (Princ "\n -------------------------------------") (Princ "\n Nom de Groupes de Calques Existants :") (foreach n Lst_GR (print n)) (princ) (setq Groupe_a_activer (getstring T "\n Choisir la Référence du Groupe à Activer :")) ) ) (if (member Groupe_a_activer Lst_GR) (progn (command "ECRANGRA") (GRC_active Groupe_a_activer) ) (progn (princ (strcat "\n " Groupe_a_activer " n'existe pas dans ce plan ! (taper ? pour voir la liste)")) (setq Groupe_a_activer nil) ) ) ) (princ (strcat "\n Le Goupe de Calque <" Groupe_a_activer "> à été activé !")) ) (Princ "\n Aucun Groupe de Calques dans ce plan !") ) (princ) ) [b];;; Commande pour Lister les noms des calques par groupe - list_calq_gr_final ;;; INUTILE - POUR MEMO -[/b] (defun c:[surligneur]GRC_Grc+Calq[/surligneur] (/ x list_ent nom_g list_calq_gr ent_ap_300 dxf330 ent_dxf330 calq_gr) (setq list_ent_group nil) (GRC_Recup) (while (assoc 350 Ent_dxf360) (setq list_ent_group (append (list (cdr (assoc 350 Ent_dxf360))) list_ent_group) Ent_dxf360 (vl-remove (assoc 350 Ent_dxf360) Ent_dxf360)) ) (setq x 0) (repeat (length list_ent_group) (setq list_ent (entget (nth x list_ent_group)) nom_g (cdr (assoc 300 (entget (nth x list_ent_group)))) list_calq_gr (append (list (strcat "<" nom_g ">")) list_calq_gr) ent_ap_300 (member (assoc 300 list_ent) list_ent)) (while (assoc 330 ent_ap_300) (setq dxf330 (assoc 330 ent_ap_300) ent_dxf330 (entget (cdr dxf330)) calq_gr (cdr (assoc 2 ent_dxf330)) list_calq_gr (append (list calq_gr) list_calq_gr) ent_ap_300 (vl-remove dxf330 ent_ap_300)) ) (setq list_calq_gr (reverse list_calq_gr) List_calq_gr_final (append (list list_calq_gr) list_calq_gr_final) list_calq_gr nil x (+ x 1)) ) (princ List_calq_gr_final) ) (A SUIVRE...) [ [Edité le 30/10/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 30 octobre 2006 Auteur Posté(e) le 30 octobre 2006 J'ai un peu simplifié/nettoyé le code. Par contre un problème persiste : l'activation d'un Groupe ne peut pas se faire si le gestionnaire de Calque n'est pas lancé au moins une fois....... Ce qui fait que je n'arrive pas à activer un groupe au moment du chargement d'un gabarit (ayant par exemple le groupe "Mon Groupe" Existant)... (GRC_active "Mon Groupe") ... ne fonctionne pas en chargement direct...(en fait, ça fonctionne, mais il faut lancer une fois le gestionnaire de calque, puis annuler, et là le groupe s'active....) :casstet: :casstet: :casstet: si queqlu'un connait une manip. pour "lancer" le gestionnaire (en tache de fond ?) pour que le groupe s'active je suis preneur.... merci Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant