salvanorigatore Posté(e) le 22 mai 2013 Posté(e) le 22 mai 2013 Bonjour a tous,je souhaiterais sélectionner des objets dans différentes présentations (pour les changer de calque).:wacko: Existe-t-il une commande AutoCAD "native" qui permette de le faire ?A défaut, existe-t-i un lisp existant qui permette de le faire ? (en cherchant sur le site je n'ai rien trouvé)Et si ça existe pas est-ce que quelqu'un peut élaborer quelque chose (lisp ou autre) qui permette de le faire ?:unsure: Merci bpc d'avance pour toutes vos bonnes volontés.:wub: Ciao. " Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "
bonuscad Posté(e) le 22 mai 2013 Posté(e) le 22 mai 2013 Bonjour, A ma connaissance seule la fonction lisp (ssget) avec l'option "X" permet une sélection dans Tout le dessin (y compris les présentations et les objets de l'espace papier) par exemple pour passer tout les cercles sur le "calque1" quelque soit leur espace.Je te laisse adapter à ton besoin ((lambda ( / js n dxf_ent) (setq js (ssget "_X" '((0 . "CIRCLE")))) (cond (js (repeat (setq n (sslength js)) (setq dxf_ent (entget (ssname js (setq n (1- n))))) (entmod (subst '(8 . "Calque1") (assoc 8 dxf_ent) dxf_ent)) ) ) ) )) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Eric Posté(e) le 22 mai 2013 Posté(e) le 22 mai 2013 Il y a aussi cette astuce sans programmation : http://www.caderix.com/journal/spip.php?article340 Eric est formateur, revendeur sur AutoCAD LT, DraftSight, ZWCAD, SketchUp et PDF2CAD
salvanorigatore Posté(e) le 23 mai 2013 Auteur Posté(e) le 23 mai 2013 Bonjour,merci à tous les deux pour votre contribution, mais je n'y arrive pas quand même :( A ma connaissance seule la fonction lisp (ssget) avec l'option "X" permet une sélection dans Tout le dessin (y compris les présentations et les objets de l'espace papier) par exemple pour passer tout les cercles sur le "calque1" quelque soit leur espace.Je te laisse adapter à ton besoin ((lambda ( / js n dxf_ent) (setq js (ssget "_X" '((0 . "CIRCLE")))) (cond (js (repeat (setq n (sslength js)) (setq dxf_ent (entget (ssname js (setq n (1- n))))) (entmod (subst '(8 . "Calque1") (assoc 8 dxf_ent) dxf_ent)) ) ) ) )) Merci bonuscad, mais où est-ce que on peut trouver le lisp ssget ?j'ai essayé d’utiliser ton code en en faisant un lisp mais je n'ai pas réussi à le faire fonctionner !:huh: excuse mon ignorance. Il y a aussi cette astuce sans programmation :http://www.caderix.c....php?article340Merci Eric pour cette astuce mais je ne vois pas du tout comment l'appliquer dans mon cas puisque le bloc que je veux sélectionner se trouve uniquement dans les présentations et que je ne veux sélectionner que ce bloc !:huh: toi aussi excuse mon ignorance. merci d'avance pour vos réponses. Ciao. " Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "
FormaBois Posté(e) le 23 mai 2013 Posté(e) le 23 mai 2013 Bonjour,Il faut adapter le lisp de Bonuscad :- Créer le Calque1 ou modifier dans le code le nom "Calque1"- Ce n'est plus "CIRCLE" dans le code qui doit être mentionné mais un bloc nommé [ssget "_X"] n'est pas un lisp mais la syntaxe sur la 2ème ligne du code Pour la sélection du bloc avec nom du bloc en utilisant filter Option "Tout", ça ne marche pas chez moi non plusAucune sélection n'est faite Studio Gfilm - Agence de communication par l'image "Le matin tu peux rester couché pour poursuivre ton rêve, ou te lever pour le réaliser"
-Olivier- Posté(e) le 23 mai 2013 Posté(e) le 23 mai 2013 Bonjour,Pour la méthode d'Eric tout comme le lisp de bonuscad, il faut que le bloc ne soit pas dynamique.Dans le cas d'un lisp dynamique il faut passer par un lisp différent car la fonction ssget ne permet pas de filtrer les blocs dynamiques par leurs noms. Olivier
salvanorigatore Posté(e) le 23 mai 2013 Auteur Posté(e) le 23 mai 2013 Il faut adapter le lisp de Bonuscad :- Créer le Calque1 ou modifier dans le code le nom "Calque1"- Ce n'est plus "CIRCLE" dans le code qui doit être mentionné mais un bloc nommé [ssget "_X"] n'est pas un lisp mais la syntaxe sur la 2ème ligne du code Ok j'ai bien compris mais alors comment on lance le lisp ? :blink: Et pour répondre à -Olivier- : mon block n'est pas dynamique. " Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "
-Olivier- Posté(e) le 23 mai 2013 Posté(e) le 23 mai 2013 Dans ce cas il suffit : - de remplacer "Calque1" par ton calque de destination (ne pas oublier les guillemets- de remplacer '((0 . "CIRCLE")) par '((0 . "INSERT") (2 . "nom_de_ton_bloc")) Le lisp est une simple fonction et non une commande. Il suffit de copier/coller le code en ligne de commande ou le placer sur un bouton (comme pour une macro diesel) Olivier PS : Chez moi la méthode d'Eric fonctionne très bien sur les blocs simples.
FormaBois Posté(e) le 23 mai 2013 Posté(e) le 23 mai 2013 PS : Chez moi la méthode d'Eric fonctionne très bien sur les blocs simples.Effectivement j'avais pris un bloc dynamique, ça fonctionne maintenant :) Studio Gfilm - Agence de communication par l'image "Le matin tu peux rester couché pour poursuivre ton rêve, ou te lever pour le réaliser"
salvanorigatore Posté(e) le 23 mai 2013 Auteur Posté(e) le 23 mai 2013 Impeccable, ça marche du tonnerre !!! :D Vous êtes des chefs le gars, merci à tous pour votre contribution. :wub: voici ce que donne ce bout de code en mode final : ((lambda ( / js n dxf_ent) (setq js (ssget "_X" '((0 . "INSERT") (2 . "nom_du_calque_ou_transferer_ton_bloc")))) (cond (js (repeat (setq n (sslength js)) (setq dxf_ent (entget (ssname js (setq n (1- n))))) (entmod (subst '(8 . "nom_de_ton_bloc") (assoc 8 dxf_ent) dxf_ent)) ) ) ) )) On sait jamais ça peut servir à quelqu’un d'autre. Merci encore. Ciao. " Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "
salvanorigatore Posté(e) le 24 mai 2013 Auteur Posté(e) le 24 mai 2013 Bonjour, Le lisp est une simple fonction et non une commande. Il suffit de ... le placer sur un bouton (comme pour une macro diesel)excuse mon ignorance mais comment on fait ? :unsure:je sais appeler un lisp via un bouton mais pas un code comme celui là qui contient plusieurs lignes ! Merci d'avance " Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "
VDH-Bruno Posté(e) le 24 mai 2013 Posté(e) le 24 mai 2013 Bonjour salvanorigatore, A la lecture du post, ce que j’en ai retenu.A défaut, existe-t-i un lisp existant qui permette de le faire ? (en cherchant sur le site je n'ai rien trouvé)Et si ça existe pas est-ce que quelqu'un peut élaborer quelque chose (lisp ou autre) qui permette de le faire ?:unsure: Merci Eric pour cette astuce mais je ne vois pas du tout comment l'appliquer dans mon cas puisque le bloc que je veux sélectionner se trouve uniquement dans les présentations et que je ne veux sélectionner que ce bloc ! Et pour répondre à -Olivier- : mon block n'est pas dynamique. Voici une version un peu plus « clef en main », des versions lisp qui t’ont été présenté.. Si j’ai un peu plus de temps (c’est pas gagné en ce moment) et si cela t’intéresse toujours, j’essaierai de répondre à tes questions sur l’emploie du lambda (qui est une fonction lisp anonyme qui se définie et s’appelle/exécute à l’endroit de sa définition). Le code (taper CHANGE_ALL_INSERT_LAYER sur la ligne de commande) :;;;================= Fonction principale ==============================================;; ;;; Change toutes les références du bloc dans le calque spécifié. (defun c:change_all_insert_layer (/ nom_du_bloc nom_du_calque_ou_transferer_ton_bloc jeu_de_selection dxf_ent n) (and (setq nom_du_bloc (getblock "Référence de bloc à modifier")) (setq nom_du_calque_ou_transferer_ton_bloc (getlayer "Calque de destination")) (setq jeu_de_selection (ssget "_X" (list '(0 . "INSERT") (cons 2 nom_du_bloc)))) (repeat (setq n (sslength jeu_de_selection)) (setq dxf_ent (entget (ssname jeu_de_selection (setq n (1- n))))) (entmod (subst (cons 8 nom_du_calque_ou_transferer_ton_bloc) (assoc 8 dxf_ent) dxf_ent)) ) ) (princ) ) Les routines lisps associés (à charger avant la fonction principal):;;============================================================================;; ;;; Getblock (gile) 03/11/07 ;;; Retourne le nom du bloc entré ou choisi par l'utilisateur ;;; dans une liste déroulante de la boite de dialogue ou depuis la boite ;;; de dialogue standard d'AutoCAD ;;; Argument : le titre (string) ou nil (défaut : "Choisir un bloc") (defun getblock (titre / bloc n lst tmp file what_next dcl_id nom) (while (setq bloc (tblnext "BLOCK" (not bloc))) (setq lst (cons (cdr (assoc 2 bloc)) lst) ) ) (setq lst (acad_strlsort (vl-remove-if (function (lambda (n) (= (substr n 1 1) "*"))) lst ) ) tmp (vl-filename-mktemp "Tmp.dcl") file (open tmp "w") ) (write-line (strcat "getblock:dialog{label=" (cond (titre (vl-prin1-to-string titre)) ("\"Choisir un bloc\"") ) ";initial_focus=\"bl\";:boxed_column{ :row{:text{label=\"Sélectionner\";alignment=left;} :button{label=\">>\";key=\"sel\";alignment=right;fixed_width=true;}} spacer; :column{:button{label=\"Parcourir...\";key=\"wbl\";alignment=right;fixed_width=true;}} :column{:text{label=\"Nom :\";alignment=left;}} :edit_box{key=\"tp\";edit_width=25;} :popup_list{key=\"bl\";edit_width=25;}spacer;} spacer; ok_cancel;}" ) file ) (close file) (setq dcl_id (load_dialog tmp)) (setq what_next 2) (while (>= what_next 2) (if (not (new_dialog "getblock" dcl_id)) (exit) ) (start_list "bl") (mapcar 'add_list lst) (end_list) (if (setq n (vl-position (strcase (getvar "INSNAME")) (mapcar 'strcase lst) ) ) (setq nom (nth n lst)) (setq nom (car lst) n 0 ) ) (set_tile "bl" (itoa n)) (action_tile "sel" "(done_dialog 5)") (action_tile "bl" "(setq nom (nth (atoi $value) lst))") (action_tile "wbl" "(done_dialog 3)") (action_tile "tp" "(setq nom $value) (done_dialog 4)") (action_tile "accept" "(setq nom (nth (atoi (get_tile \"bl\")) lst)) (done_dialog 1)" ) (setq what_next (start_dialog)) (cond ((= what_next 3) (if (setq nom (getfiled "Sélectionner un fichier" "" "dwg" 0)) (setq what_next 1) (setq what_next 2) ) ) ((= what_next 4) (cond ((not (read nom)) (setq what_next 2) ) ((tblsearch "BLOCK" nom) (setq what_next 1) ) ((findfile (setq nom (strcat nom ".dwg"))) (setq what_next 1) ) (T (alert (strcat "Le fichier \"" nom "\" est introuvable.")) (setq nom nil what_next 2 ) ) ) ) ((= what_next 5) (if (and (setq ent (car (entsel))) (= "INSERT" (cdr (assoc 0 (entget ent)))) ) (setq nom (cdr (assoc 2 (entget ent))) what_next 1 ) (setq what_next 2) ) ) ((= what_next 0) (setq nom nil) ) ) ) (unload_dialog dcl_id) (vl-file-delete tmp) nom ) ;;============================================================================;; ;;; GetLayer (gile) 03/11/07 ;;; Retourne le nom du calque entré ou choisi par l'utilisateur ;;; dans une liste déroulante de la boite de dialogue ou en sélectionnant ;;; un objet à l'écran. ;;; Argument : le titre (string) ou nil (défaut : "Choisir un calque") (defun getlayer (titre / lay lst tmp file what_next dcl_id nom) (while (setq lay (tblnext "LAYER" (not lay))) (setq lst (cons (cdr (assoc 2 lay)) lst)) ) (setq lst (acad_strlsort lst) tmp (vl-filename-mktemp "Tmp.dcl") file (open tmp "w") ) (write-line (strcat "getlayer:dialog{label=" (cond (titre (vl-prin1-to-string titre)) ("\"Choisir un calque\"") ) ";initial_focus=\"tp\"; :boxed_column{:row{ :column{:text{label=\"Sélectionner un objet\";alignment=left;}} :column{:button{label=\">>\";key=\"obj\";alignment=right;fixed_width=true;} spacer;}} :edit_box{key=\"tp\";edit_width=25;allow_accept=true;} :popup_list{key=\"lay\";edit_width=25;} spacer;}ok_cancel;}" ) file ) (close file) (setq dcl_id (load_dialog tmp)) (setq what_next 2) (while (>= what_next 2) (if (not (new_dialog "getlayer" dcl_id)) (exit) ) (start_list "lay") (mapcar 'add_list lst) (end_list) (or nom (setq nom (vlax-ldata-get "getLayer" "n")) (setq nom (vlax-ldata-put "getLayer" "n" "0")) ) (if (member nom lst) (set_tile "lay" (itoa (- (length lst) (length (member nom lst)))) ) (set_tile "lay" "0") ) (set_tile "tp" nom) (action_tile "obj" "(done_dialog 3)") (action_tile "tp" "(setq nom $value)") (action_tile "lay" (strcat "(if (or (= $reason 1) (= $reason 4))" "(progn" "(setq nom (nth (atoi $value) lst))" "(set_tile \"tp\" (nth (atoi $value) lst))" "(mode_tile \"tp\" 2)))" ) ) (action_tile "accept" (strcat "(if (tblsearch \"LAYER\" nom)" "(progn (done_dialog 1)" "(vlax-ldata-put \"getLayer\" \"n\" nom))" "(progn" "(alert (strcat \"Le calque \" nom \" est introuvable.\"))" "(setq nom nil) (set_tile \"tp\" (vlax-ldata-get \"getLayer\" \"n\"))" "(mode_tile \"tp\" 2)))" ) ) (setq what_next (start_dialog)) (cond ((= what_next 3) (if (setq nom (car (entsel))) (setq nom (cdr (assoc 8 (entget nom)))) (setq nom nil) ) ) ((= what_next 0) (setq nom nil) ) ) ) (unload_dialog dcl_id) (vl-file-delete tmp) nom ) Salutations Bruno Apprendre => Prendre => Rendre
VDH-Bruno Posté(e) le 24 mai 2013 Posté(e) le 24 mai 2013 Re, Oups, désolé une petite erreur de copié collé dans la fonction principal, que je viens de corriger dans le message précédent, pensez à la recharger.. Apprendre => Prendre => Rendre
salvanorigatore Posté(e) le 27 mai 2013 Auteur Posté(e) le 27 mai 2013 Bonjour salvanorigatore, A la lecture du post, ce que j’en ai retenu. Voici une version un peu plus « clef en main », des versions lisp qui t’ont été présenté.. Bonjour,merci beaucoup pour ton lisp c'est cool mais je crois que tu a oublié que je suis plutôt ignorant dans ce domaine...:unsure:du coup je ne sais pas dans ton lisp ce qu'il faut remplacer pour mettre mes données et ce qu'il ne faut pas toucher !:wacko: Alors si tu peux me mettre des couleurs différentes là où je dois mettre mes données ça m'arrangerait bien... merci beaucoup d'avance.:wub: Ciao. PS. Pour les 2 lisp de (gile) que tu mentionne y pas de problème je les mettrais sur mon poste. " Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "
VDH-Bruno Posté(e) le 27 mai 2013 Posté(e) le 27 mai 2013 Bonjour salvanorigatore, mais je crois que tu a oublié que je suis plutôt ignorant dans ce domaine... du coup je ne sais pas dans ton lisp ce qu'il faut remplacer pour mettre mes données et ce qu'il ne faut pas toucher ! Normalement, il n’y a rien à remplacer, j’ai juste ajouté des boîtes de dialogues au codes (via les routines de (gile)) qui t’avais été précédemment proposé, pour que tu n’aies justement plus qu’à cliquer tes données.. Charge tous les codes de mon post précédemment, puis tape CHANGE_ALL_INSERT_LAYER sur ta ligne de commande AutoCAD et là tout devrait normalement bien se passer, dans le cas contraire fait-le moi savoir, voir si je peux faire autre chose.. A+ Apprendre => Prendre => Rendre
salvanorigatore Posté(e) le 27 mai 2013 Auteur Posté(e) le 27 mai 2013 VDH-Bruno t’es vraiment un chef, c'est exactement ce qu'il me fallait : un lisp simple que je peux lancer sur AutoCAD avec un petit bouton !:(rires forts): Merci bien sur aussi à bonuscad, Eric, FormaBois, -Olivier- pour leur contribution Merci de votre générosité:wub: Bonne soirée à tous. Ciao. " Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "
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