Aller au contenu

Calque : Filtre de groupe


Messages recommandés

Posté(e)

Salut,

 

Je cherche une routines lisp me permettant d'acceder au "filtre de groupe" des calques. - pour 2006 ou 2007 -

(ceci pour me permettre de gérer les groupes dès l'ouverture d'un nouveau plan d'après un gabarit)

 

merci d'avance.

 

[Edité le 17/10/2006 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

mmmmmmmm... j'ai beau cherché, que neni.... même dans des forums anglais, j'ai l'impression que le sujet est une impasse....

 

Serait t'on arrivé à une limite ??? :casstet:

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut,

 

J'ai une piste mais je n'arrive pas à aboutir.

 

Pour un filtre de propriétés, le code suivant retourne le pointeur vers le filtre "Nom_du_filtre" (vla-object)

 

(vla-item
 (vla-item
   (vla-getextensionDictionary
     (vla-get-Layers
(vla-get-ActiveDocument
  (vlax-get-acad-object)
  )
)
     )
   "ACAD_LAYERFILTERS"
   )
 "Nom_du_filtre"
 ) 

 

Mais pour un filtre de groupe, je n'arrive pas à retrouver son nom, j'arrive seulement à récupérer les noms des XRecord des filtres (de groupe ou de propriétés) dans une liste, mais ce sont des noms du type *A1, *A2, *A3 ...

 

(vlax-for n	(vla-item
	  (vla-getExtensionDictionary
	    (vla-get-Layers
	      (vla-get-ActiveDocument
		(vlax-get-acad-object)
	      )
	    )
	  )
	  "ACLYDICTIONARY"
	)
     (setq lst (cons (vla-get-Name n) lst))
   ) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Hé! hé! hé!

 

je savais bien que

Serait t'on arrivé à une limite ???

 

... aurait titillé ces deux là !!! :cool:

 

... merci de vos réponse, je reprend (un peu) espoir !

 

(gile) : mes recherches sur internet m'avait fait aussi arrivé au filtre, mais j'ai l'impression que le fait d'atteintdre les groupes est une gageure ! (ç'est français ça ?...)

 

 

Patrick_35 : .... mon niveau en anglais est limité (voir néant), mais je vais m'y pencher !

 

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

OK, alors, 1ère étape (je n'en suis que là), grâce a la proposition de (gile) j'ai réussis à récupérer :

- le nom des groupe

- le groupe actif

- les calques par groupe

 

(ne pas faire à la manière dont c'est écris, c'est un code de travail)...

 

 (setq obj (vla-item
    (vla-getExtensionDictionary
      (vla-get-Layers (vla-get-ActiveDocument
			(vlax-get-acad-object))))"ACLYDICTIONARY"))

(setq entité (vlax-vla-object->ename obj))
(setq list_entité (entget entité))

;; travail
(setq list_ent_group nil
     list_nom_g nil
     list_gr_act nil
     list_calq_gr nil
     list_calq_gr_final nil)

; liste les entités contenant un groupe (dxf350) - list_ent_group
(while (assoc 350 list_entité)
(setq dxf350 (assoc 350 list_entité))
(setq list_ent_group (append (list (cdr dxf350)) list_ent_group))
(setq list_entité (vl-remove dxf350 list_entité))
 )

[b] ; Trouver le groupe actif - (290 . 1) nom_gr_act[/b]
(setq x 0)
(repeat (length list_ent_group)
 (setq gr_act (cdr (assoc 290 (entget (nth x list_ent_group)))))
 (if gr_act (setq  [surligneur] nom_gr_act[/surligneur] (cdr (assoc 300 (entget (nth x list_ent_group))))))
 (setq x (+ 1 x))
 )

[b] ; liste les nom de groupes - list_nom_g[/b]
(setq x 0)
(repeat (length list_ent_group)
 (setq nom_g (cdr (assoc 300 (entget (nth x list_ent_group)))))
 (setq  [surligneur] list_nom_g[/surligneur] (append (list nom_g) list_nom_g)
x  (+ x 1))
 )

[b] ; Trouver les noms des calques par groupe[/b]
(setq x 0)
(repeat (length list_ent_group)

 (setq list_ent (entget (nth x list_ent_group)))
 (setq nom_g (cdr (assoc 300 (entget (nth x list_ent_group)))))
 (setq list_calq_gr (append (list nom_g) list_calq_gr))

 (setq ent_ap_300 (member (assoc 300 list_ent) list_ent))
 
 (while (assoc 330 ent_ap_300)
   (setq dxf330 (assoc 330 ent_ap_300))
   (setq ent_dxf330 (entget (cdr dxf330)))
   (setq calq_gr (cdr (assoc 2 ent_dxf330)))
   (setq list_calq_gr (append (list calq_gr) list_calq_gr))    
   (setq ent_ap_300 (vl-remove dxf330 ent_ap_300))
   )
 (setq  [surligneur] list_calq_gr_final[/surligneur] (append (reverse (list list_calq_gr)) list_calq_gr_final))
 (setq list_calq_gr nil)	 
 (setq x (+ x 1))  
 )

 

La suite sera d'en faire une routine bien écrite....

 

[Edité le 20/10/2006 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Alors, plus propre :

 

Routines permettants d'Extraire :

- Les noms des groupes de Calques

- Les noms des groupes de Calques avec leur Calque

- Le goupe de Calque Actif.

 

COMMANDES :

;;; [b]Afficher Groupes[/b]
(defun c:[surligneur]Groupe_Calques[/surligneur] (/ list_nom_g)
 (Liste_Nom_Groupe_Calque)
 (if list_nom_g
   (princ list_nom_g)
   (princ "Pas de Groupe de Calques dans ce plan")
   )
 (princ)
)
;;; [b]Afficher Groupes et Calques[/b]
(defun c:[surligneur]Groupes_et_calques[/surligneur] (/ List_calq_gr_final)
 (Liste_Calques_par_Groupe)
 (if List_calq_gr_final
   (princ List_calq_gr_final)
   (princ "Pas de Groupe de Calques dans ce plan")
   )
 (princ)
)
;;; [b]Afficher Groupe Actif[/b]
(defun c:[surligneur]Groupe_Calque_Actif[/surligneur] (/ nom_gr_act)
 (Recup_Groupe_Calque_Actif)
 (if nom_gr_act
   (princ (strcat "\n Groupe Calques Actif: " nom_gr_act))
   (princ "\n Pas de Groupe de Calques Actif")
   )
 (princ)
)

 

Les Routines :

;;; Récupérer les Groupes de Calque Existant - list_ent_group
(defun Recup_Groupe_Calque (/ obj ent list_ent)
 (setq list_ent_group nil
obj (vla-item
    (vla-getExtensionDictionary
      (vla-get-Layers (vla-get-ActiveDocument
			(vlax-get-acad-object))))"ACLYDICTIONARY")
ent (vlax-vla-object->ename obj)
list_ent (entget ent))
 
 (while (assoc 350 list_ent)
   (setq list_ent_group (append (list (cdr (assoc 350 list_ent))) list_ent_group)
  list_ent (vl-remove (assoc 350 list_ent) list_ent))
   )
)
;;; Récupérer le groupe actif - (290 . 1) nom_gr_act
(defun Recup_Groupe_Calque_Actif (/ x gr_act)
 (Recup_Groupe_Calque)
 (setq x 0)
 (repeat (length list_ent_group)
   (setq gr_act (cdr (assoc 290 (entget (nth x list_ent_group)))))
   (if gr_act (setq nom_gr_act (cdr (assoc 300 (entget (nth x list_ent_group))))))
   (setq x (+ 1 x))
   )
)
; lister les Noms de groupes - list_nom_g
(defun Liste_Nom_Groupe_Calque (/ x nom_g)
 (Recup_Groupe_Calque)
 (setq x 0)
 (repeat (length list_ent_group)
   (setq nom_g (cdr (assoc 300 (entget (nth x list_ent_group))))
  list_nom_g (append (list nom_g) list_nom_g)
  x  (+ x 1))
   )
)
; Lister les noms des calques par groupe - list_calq_gr_final
(defun Liste_Calques_par_Groupe (/ x list_ent nom_g list_calq_gr ent_ap_300
			 dxf330 ent_dxf330 calq_gr)
 (Recup_Groupe_Calque)	
 (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 "Groupe: " 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))  
 )
)

 

 

Par contre je suis coincé.... je voulais créer des commandes permettant d'activer ou desactiver un groupe, et ça ne fonctionne pas.....

Ma méthode : en passant par (entmake...)

Ce qui ne fonctionne pas :

;;; [b]Activer un groupe de Calque[/b]
(defun c:Activ_GR_Calque (/ List_GR Nom)  
 (setq Nom (getstring "\n Donner un Nom de Groupe de Calque à Activer :"))
 (Activer_Groupe_Calque Nom)
 (princ)
)
;;; [b]Désactiver un groupe de Calque[/b]
(defun c: Desactiv_GR_Calque ()  
 (Desactiver_Groupe_Calque)
 (princ)
)
;;; [b]Routine Désactiver le groupe de Calque actif[/b] 
(defun Desactiver_Groupe_Calque ()
 (Recup_Groupe_Calque)
 (setq x 0)
 (repeat (length list_ent_group)
   (setq gr_act (cdr (assoc 290 (entget (nth x list_ent_group)))))
   (if gr_act (entmake (vl-remove (assoc 290 (entget (nth x list_ent_group)))
		  (entget (nth x list_ent_group)))))
   (setq x (+ 1 x))
   )
)
;;; [b]Routine Activer un groupe de Calque[/b] 
(defun Activer_Groupe_Calque (Nom_Groupe)
 (Recup_Groupe_Calque)
 (setq x 0)
 (repeat (length list_ent_group)
   (if (equal (cdr (assoc 300 (entget (nth x list_ent_group)))) Nom_Groupe)
     (entmake (append (entget (nth x list_ent_group)) (list (cons 290 1)))) 
     (setq x (+ x 1))
     )
   )
 )

 

.... si vous avez des conseils, merci d'avance !!!....

 

[Edité le 20/10/2006 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Bon, là, j'appel à l'aide !!!!

J'ai éssayé de reconstruire les entités afin d'activé un groupe, mais ça ne fonctionne pas !!!!

 

Si vous avez une solution.... moi je m'épuise !!!

(en fait, je pense que l'on peut y arriver, car le lisp cité ci-dessus permet de créer un groupe, et l'active en même temp !!!!...)

 

J'en suis là :

 

(setq TAB_dxf330 (entget (cdr (assoc 330 (entget (tblobjname "layer" "0"))))))

(setq DIC_dxf360 (entget (cdr (assoc 360 TAB_dxf330))))

(setq Ent_dxf360 (entget (cdadr (member '(3 . "ACLYDICTIONARY") DIC_dxf360))))

(setq list_ent_group nil)

(setq Ent_dxf360_TRAV Ent_dxf360)

(while (assoc 350 Ent_dxf360_TRAV)
   (setq list_ent_group (append (list (cdr (assoc 350 Ent_dxf360_TRAV))) list_ent_group)
  Ent_dxf360_TRAV (vl-remove (assoc 350 Ent_dxf360_TRAV) Ent_dxf360_TRAV))
   )

(setq Groupe_a_activer "groupe1")

(setq x 0)
(repeat (length list_ent_group)
 (if (/= Groupe_a_activer (cdr (assoc 300 (entget (nth x list_ent_group)))))
 (setq Ent_GROUPE (vl-remove (nth x list_ent_group) list_ent_group))
 (setq x (+ x 1))
   )
 )

(setq fin_list nil
     290.1fin_list nil
     Ent_GROUPE_ACTIF nil)

(setq list_ent_Groupe (entget (car Ent_GROUPE)))
(setq fin_list (cdr (member '(280 . 1) list_ent_Groupe)))
(setq debut_list (reverse (member '(280 . 1) (reverse list_ent_Groupe))))
(setq 290.1fin_list (append (list (cons 290 1)) fin_list))
(setq Ent_GROUPE_ACTIF (append debut_list 290.1fin_list))

(setq Ent_dxf350 (cons 350 (cdr (assoc -1 (entmod Ent_GROUPE_ACTIF)))))
(setq Ent_dxf360 (cons 360 (cdr (assoc -1 (entmod (subst Ent_dxf350 Ent_dxf350 Ent_dxf360))))))

(setq DIC_dxf360 (entmod (subst Ent_dxf360 (cadr (member '(3 . "ACLYDICTIONARY") DIC_dxf360)) DIC_dxf360)))

 

... Au secours !!!!

merci .... :(

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

OK... réussis...

 

... Manque plus que le mettre au propre, et je le mettrais dans le forum Routine :

(defun c:[b]Activer-Groupe[/b] ()
 (setq Groupe_a_activer "[i]Nom_du_Groupe[/i]")
 (activ_group Groupe_a_activer)
 )

;;; Routine Récupération Entité "ACLYDICTIONARY"
(defun GRC_Recup ()
 (setq TAB_dxf330 (entget (cdr (assoc 330 (entget (tblobjname "layer" "0")))))
DIC_dxf360 (entget (cdr (assoc 360 TAB_dxf330)))
Ent_dxf360 (entget (cdadr (member '(3 . "ACLYDICTIONARY") DIC_dxf360))))
)
;;; Routine Liste ( dxf 3. + entité ) Groupe de Calque
(defun GRC_Lst (Ent_dxf360_TRAV)
 (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))
   )
)
;;; Routine Création Liste de Groupe Possible :
(defun GRC_Lst_Ex ()
 (GRC_Recup)
 (Setq Ent_dxf360_TRAV Ent_dxf360)  
 (GRC_Lst Ent_dxf360_TRAV)
 (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 activ_group (Groupe_a_activer / list_ent_group fin_list 290.1fin_list Ent_GROUPE_ACTIF)
 (GRC_Recup)
 (Setq Ent_dxf360_TRAV Ent_dxf360)  
 (GRC_Lst Ent_dxf360_TRAV)
 (if list_ent_group (progn
 ; Ressort entité correspondant au groupe à activer
 (if (> (length list_ent_group) 1)
   (progn
     (setq x 0)
     (repeat (length list_ent_group)
(if (= Groupe_a_activer (cdr (assoc 300 (entget (cadr (nth x list_ent_group))))))
  (setq Ent_GROUPE (nth x list_ent_group))
  (setq list_ent_group (vl-remove (nth x list_ent_group) list_ent_group))	  
  )
)
     )
   (setq Ent_GROUPE list_ent_group)
   )  
 (setq Ent_GROUPE_SAUV Ent_GROUPE
list_ent_Groupe (entget (cadr Ent_GROUPE))
fin_list (cdr (member '(280 . 1) list_ent_Groupe))
debut_list (reverse (member '(280 . 1) (reverse list_ent_Groupe)))
290.1fin_list (append (list (cons 290 1)) fin_list)
Ent_GROUPE_ACTIF (entmakex (append debut_list 290.1fin_list))
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 (strcat "\n Le Goupe de Calque " Groupe_a_activer " à été activé !"))
 )
   (princ "\n Pas de Groupe de Calques dans ce Plan !")
   )
 (princ)
 )

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité