Aller au contenu

selection multiple des objets par nom de calque


gaetan

Messages recommandés

Bonjour,

 

J'ai besoin de selectionner les objets de différents calques mais je ne trouve pas de fonction pour faire cela.

Actuellement je fait une selection rapide avec les selections suivantes

Appliquer à : Dessin entier

Type d'objet : Multiple

Propriétés : Calque

Opérateur : = Egal à

Valeur : Nom de mon calque

Mode d'application : Inclure dans le nouveau jeu de sélection

Ajouter au jeu de séléction courant

Et je répète cette opération une dizaine de fois pour séléctionner le contenu des différents calques.

 

J'ai cette opération à faire sur une centaine de plans (avec malheureusement des noms de calques différents selon les plans).

 

Je souhaiterais savoir si quelqu'un peut m'aider, je n'ai pas trouvé de lisp existante me permettant de faire ça et je n'ai jamais cherché à faire de lisp moi même (manque de temps).

 

J'aimerai savoir si quelqu'un peut m'aider.

 

Gaëtan

Lien vers le commentaire
Partager sur d’autres sites

Sinon, un petit truc vite fait avec les routines du "coin des lispeurs" (commande : SSLS).

 

;; GETLAYERS (gile) 02/12/07
;; Retourne la liste des calques cochés dans la boite de dialogue
;;
;; arguments
;; titre : le titre de la boite de dialogue ou nil (defaut = Choisir les calques)
;; lst1 : la liste des calques à pré-cochés ou nil
;; lst2 : la liste des calques non cochables (grisés) ou nil

(defun getlayers (titre	   lst1	    lst2     /	      sublist
	  toggle_column	    tmp	     file     lay      layers
	  len	   dcl_id   lst
	 )

 (defun sublist (lst start leng / n r)
   (if	(or (not leng) (< (- (length lst) start) leng))
     (setq leng (- (length lst) start))
   )
   (setq n (+ start leng))
   (repeat leng
     (setq r (cons (nth (setq n (1- n)) lst) r))
   )
 )

 (defun toggle_column (lst)
   (apply 'strcat
   (mapcar
     (function
       (lambda (x)
	 (strcat ":toggle{key="
		 (vl-prin1-to-string x)
		 ";label="
		 (vl-prin1-to-string x)
		 ";}"
	 )
       )
     )
     lst
   )
   )
 )

 (setq	tmp  (vl-filename-mktemp "tmp.dcl")
file (open tmp "w")
 )
 (while (setq lay (tblnext "LAYER" (not lay)))
   (setq layers (cons (cdr (assoc 2 lay)) layers))
 )
 (setq	layers (vl-sort layers '<)
len    (length layers)
 )
 (write-line
   (strcat
     "GetLayers:dialog{label="
     (cond (titre (vl-prin1-to-string titre))
    ("\"Choisir les calques\"")
     )
     ";:boxed_row{:column{"
     (cond
((< len 12) (toggle_column layers))
((< len 24)
 (strcat (toggle_column (sublist layers 0 (/ len 2)))
	 "}:column{"
	 (toggle_column (sublist layers (/ len 2) nil))
 )
)
((< len 45)
 (strcat (toggle_column (sublist layers 0 (/ len 3)))
	 "}:column{"
	 (toggle_column (sublist layers (/ len 3) (/ len 3)))
	 "}:column{"
	 (toggle_column (sublist layers (* (/ len 3) 2) nil))
 )
)
(T
 (strcat (toggle_column (sublist layers 0 (/ len 4)))
	 "}:column{"
	 (toggle_column (sublist layers (/ len 4) (/ len 4)))
	 "}:column{"
	 (toggle_column (sublist layers (/ len 2) (/ len 4)))
	 "}:column{"
	 (toggle_column (sublist layers (* (/ len 4) 3) nil))
 )
)
     )
     "}}spacer;ok_cancel;}"
   )
   file
 )
 (close file)
 (setq dcl_id (load_dialog tmp))
 (if (not (new_dialog "GetLayers" dcl_id))
   (exit)
 )
 (foreach n lst1
   (set_tile n "1")
 )
 (foreach n lst2
   (mode_tile n 1)
 )
 (action_tile
   "accept"
   "(setq lst nil)
   (foreach n layers
   (if (= (get_tile n) \"1\")
   (setq lst (cons n lst))))
   (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 lst
)

;; gc:lst2str
;; Concatène une liste de chaînes et un séparateur en une chaine
;;
;; Arguments
;; lst : la liste
;; sep : le séparateur
(defun gc:lst2str (lst sep)
 (apply 'strcat
 (cons (car lst)
       (mapcar (function (lambda (x) (strcat sep x))) (cdr lst))
 )
 )
)

(defun c:SSLS (/ l)
 (if (setq l (getlayers nil nil nil))
   (sssetfirst nil (ssget "_X" (list (cons 8 (gc:lst2str l ",")))))
 )
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup Gile

 

J'ai réussi avec la commande filtrer.

 

Par contre pour le lisp j'ai unne erreur retournée par AutoCAD.

 

Je travaille sur AutoCAD 2014.

J'ai copié les lignes de code dans un bloc note et j'ai changé l'extansion du fichier par lsp.

 

En tapant la commande ssls AutoCAD me retourne :

 

"; erreur: no function definition: SUBLIST"

 

Autant pour moi, je viens de refaire la manip et ça fonctionne trés bien.

Encore merci.

Lien vers le commentaire
Partager sur d’autres sites

(defun c:laysel (/ SS FILTRE I E LAY)
 (setq SS (ssget))
 (if SS
   (progn
     (setq FILTRE '((-4 . "OR>")) )
     (setq I 0)
     (while (< I (sslength SS))
       (setq E (entget (ssname SS  I)))
       (setq LAY (assoc 8 E))
       (setq FILTRE (cons LAY FILTRE))
       (setq I (+ I 1))
     )
     (setq FILTRE (cons '(-4 . "<OR") FILTRE))
     (setq SS (ssget "_X" FILTRE))
     (sssetfirst SS SS)
   )
 )
 (princ)
)

 

un lisp tout simple qui permet de sélectionner par désignation. L'idée est de pouvoir désigner plusieurs objets (avec ssget) sur différents calques et que cela sélectionne tous les éléments de tous les calques désignés par un de leur représentant.

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

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é