gaetan Posté(e) le 21 janvier 2016 Posté(e) le 21 janvier 2016 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 suivantesAppliquer à : Dessin entierType d'objet : MultiplePropriétés : CalqueOpérateur : = Egal àValeur : Nom de mon calqueMode d'application : Inclure dans le nouveau jeu de sélectionAjouter au jeu de séléction courantEt 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
(gile) Posté(e) le 21 janvier 2016 Posté(e) le 21 janvier 2016 Salut, Sans LISP, avec la commande FILTRER on peut choisir plusieurs calques dans le filtre. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 21 janvier 2016 Posté(e) le 21 janvier 2016 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
gaetan Posté(e) le 22 janvier 2016 Auteur Posté(e) le 22 janvier 2016 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.
(gile) Posté(e) le 22 janvier 2016 Posté(e) le 22 janvier 2016 Salut, J'avais réparé cet oubli mais tu as dû copier le code avant la correction. Refais ton copier/coller, ça devrait marcher maintenant. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
gaetan Posté(e) le 22 janvier 2016 Auteur Posté(e) le 22 janvier 2016 Salut, J'avais réparé cet oubli mais tu as dû copier le code avant la correction. Refais ton copier/coller, ça devrait marcher maintenant. Oui j'ai réédité mon message précédent, ça fonctionne parfaitement. Merci à vous
zebulon_ Posté(e) le 22 janvier 2016 Posté(e) le 22 janvier 2016 (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. AmicalementVincent 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)
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