kclement Posté(e) le 20 février 2007 Posté(e) le 20 février 2007 Bonjour, J'ai vu dans une petite appli (Smartools) une fonction qui, en cliquant sur un objet, selectionne tous les objets du même calque. Seulement c'est le seul élément de Smartools qui m'interesse (voire qui fonctionne sur Autodesk Architectural Desktop 2007) et je voulais savoir si quelqu'un connaitrait une routine qui permet de faire ça sans passer par l'outil de sélection rapide d'Autocad ou l'outil filter... Merci d'avance... ;) Kclement
(gile) Posté(e) le 20 février 2007 Posté(e) le 20 février 2007 Salut, (defun c:ssl (/ ent) (if (setq ent (car (entsel "\nSélectionnez un objet sur le calque cible: ") ) ) (sssetfirst nil (ssget "_X" (list (assoc 8 (entget ent))))) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
kclement Posté(e) le 20 février 2007 Auteur Posté(e) le 20 février 2007 Hi hi :D , c'est génial merci beaucoup ! En plus je ne pensais pas qu ce serait aussi court ! Merci encore !
jalna Posté(e) le 20 février 2007 Posté(e) le 20 février 2007 Salut et merci kclement pour avoir lancé ce post et merci à (gile) d'y avoir répondu!!!... "Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."J-C Van DammeMon forum : http://plexus.forumactif.org/
(gile) Posté(e) le 20 février 2007 Posté(e) le 20 février 2007 On peut le faire aussi pour d'autre propriétés. Sélectionner toutes les entités du même type : (defun c:sse (/ ent) (if (setq ent (car (entsel))) (sssetfirst nil (ssget "_X" (list (assoc 0 (entget ent))))) ) (princ) ) Sélectionner toutes les entités de la même couleur : (defun c:ssc (/ ent col) (and (setq ent (car (entsel))) (or (setq col (assoc 62 (entget ent))) (setq col (cons 62 256)) ) (sssetfirst nil (ssget "_X" (list col))) ) (princ) ) Sélectionner toutes les entités ayant le même type de ligne : (defun c:sstl (/ ent tl) (and (setq ent (car (entsel))) (or (setq tl (assoc 6 (entget ent))) (setq tl (cons 6 "BYLAYER")) ) (sssetfirst nil (ssget "_X" (list tl))) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
jalna Posté(e) le 20 février 2007 Posté(e) le 20 février 2007 B :P en Merci beaucoup :D (tres utile!!!) :D "Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."J-C Van DammeMon forum : http://plexus.forumactif.org/
funkkybebel Posté(e) le 4 octobre 2007 Posté(e) le 4 octobre 2007 Bonjour,je voulais savoir s'il existait la même fonction mais pour sélectionner tous les objets du même nom.Attention, pour corser le tout, je voudrais pouvoir choisir dans la liste des bloc (et non pas rentrer le nom du bloc à la main. En gros un truc du genre (réalisé avec trucage) : http://www.rhodes-tunes.com/misc/selectrapbloc.jpg Je clique sur mon bouton qui lance un lisp ou vba ou quoi que ce soit.Une fenêtre du genre du dessus apparait alors.Je n'ai plus qu'à choisir le nom de mon bloc. En effet quand je dois traiter une multitude de blocs, l'outil selection rapide devient ennuyeux (car il faut constamment naviguer dans les listes afin de tomber sur la configuration de l'image ci-dessus. Merci de votre aide ! [Edité le 4/10/2007 par funkkybebel]
(gile) Posté(e) le 4 octobre 2007 Posté(e) le 4 octobre 2007 Vite fait avec des routines données ici et là Le fichier DCL de la boite de dialogue à enregistrer dans un chemine de recherche des fichiers de support sous Getblock.dcl. getblock:dialog{ label="Choisir un bloc"; key="box"; :boxed_column{ :row{ :column{ spacer; :text{ label="Nom :"; alignment=left; } } :column{ :button{ label="Parcourir..."; key="wbl"; alignment=right; fixed_width=true; } spacer; } } :edit_box{ key="tp"; edit_width=25; } :popup_list{ key="bl"; edit_width=25; } spacer; } ok_cancel; } Le fichier LISP (entrer ssb pour lancer la commande).Comme pour les autres routines, si la variable PICKFIRST est à 1 et qu'une référence de bloc est déjà sélectionnée avant le lancement de la commande toutes les références du même bloc sont sélectinnées sans avoir à utiliser la boite de dialogue. (defun c:ssb (/ ss name) (and (or (and (setq ss (cadr (ssgetfirst))) (= 1 (sslength ss)) (= "INSERT" (cdr (assoc 0 (entget (ssname ss 0))))) (setq name (cdr (assoc 2 (entget (ssname ss 0))))) ) (and (sssetfirst nil nil) (setq name (getblock nil)) ) ) (sssetfirst nil (ssget "_X" (list '(0 . "INSERT") (cons 2 name)))) ) (princ) ) ;;; Getblock 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 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 '(lambda (n) (= (substr n 1 1) "*")) lst) ) ) (setq dcl_id (load_dialog "Getblock.dcl")) (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 titre (set_tile "box" titre) ) (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 "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 0) (setq nom nil) ) ) ) (unload_dialog dcl_id) nom ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
funkkybebel Posté(e) le 4 octobre 2007 Posté(e) le 4 octobre 2007 Truc de fou !MERCI ENORMEMENT !!!!!!!!!!!!! T'es vraiment trop fort Gile.Tu vas me permettre de gagner beaucoup beaucoup de temps !(temps = argent)
(gile) Posté(e) le 4 octobre 2007 Posté(e) le 4 octobre 2007 (temps = argent) Pour ton patron (si tu en as un) : très certainement.Pour toi : je te le souhaite.Pour moi : rien, si ce n'est du plaisir (et ça me va bien) Alors puisqu'il est question d'argent, pourquoi pas une petite donnation à CADxp (dans lequel je n'ai aucun intérêt, si ce n'est, encore une fois, le plaisir) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
funkkybebel Posté(e) le 4 octobre 2007 Posté(e) le 4 octobre 2007 (temps = argent) Pour ton patron (si tu en as un) : très certainement.Pour toi : je te le souhaite.Pour moi : rien, si ce n'est du plaisir (et ça me va bien) Alors puisqu'il est question d'argent, pourquoi pas une petite donnation à CADxp (dans lequel je n'ai aucun intérêt, si ce n'est, encore une fois, le plaisir) C'est fait. Merci encore.
(gile) Posté(e) le 4 octobre 2007 Posté(e) le 4 octobre 2007 C'est fait. Merci pour Patrick J'ai modifié la routine GetBlock, prévue au départ pour récupéere un nom de bloc pas forcément present dans le dessin.On peut désormais choisir de sélectionner une référence dans le dessin à partir de la boite de dialogue. Le DCL à enregistre sous GetBlock_2.dcl getblock_2:dialog{ label="Choisir un bloc"; key="box"; :boxed_column{ :row{ :text{ label="Sélectionner"; alignment=left; } :button{ label=">>"; key="sel"; alignment=right; fixed_width=true; } } spacer; :row{ :column{ spacer; :text{ label="Nom :"; alignment=left; } } :column{ :button{ label="Parcourir..."; key="wbl"; alignment=right; fixed_width=true; } spacer; } } :edit_box{ key="tp"; edit_width=25; } :popup_list{ key="bl"; edit_width=25; } spacer; } ok_cancel; } La nouvelle routine Getblock qui va avec ;;; Getblock (version 2) ;;; Retourne le nom du bloc sélectionné à l'écran, 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 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 '(lambda (n) (= (substr n 1 1) "*")) lst) ) ) (setq dcl_id (load_dialog "Getblock_2.dcl")) (setq what_next 2) (while (>= what_next 2) (if (not (new_dialog "getblock_2" dcl_id)) (exit) ) (start_list "bl") (mapcar 'add_list lst) (end_list) (if titre (set_tile "box" titre) ) (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) nom ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lili2006 Posté(e) le 4 octobre 2007 Posté(e) le 4 octobre 2007 Bonsoir à toutes et tous, (gile), comment lance t-on cette routine ? J'ai essayé "ssb" AutoCAD ne reconnait pas (version GetBlock_2). J'ai du faire une boulette, mais j'vois pas (dossiers supports ok !). Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 4 octobre 2007 Posté(e) le 4 octobre 2007 Salut, Dans le message juste au dessus il n'y a que la "sous routine" GetBlock et son DCL.Je dis "sous routine" parceque c'est une fonction qui n'est pas prévue pour être lancée comme une commande mais qui est appelée par d'autres routines (comme une fonction LISP prédéfinie).Le LISP est un langage dit fonctionnel, à partir de fonctions prédéfinies on peut créer une infinité de fonctions (defun MaFonction ...) qu'on appelle des routines ou sous routines.AutoLISP permet d'appeler directement de la ligne de commande des fonctions LISP comme on le fait avec les commandes prédéfinies -dans ce cas c'est un (defun c:MaCommande ...). La commande ssb est definie dans le message qui est plus haut (defun c:ssb ...) elle fait appel à la fonction GetBlock. Si tu as chargé getblock (Version 2) copie et charge juste ssb dans l'autre message. Si tu avais déjà l'ancienne version de getblock met la à la poubelle, la dernière est plus polyvalente. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lili2006 Posté(e) le 4 octobre 2007 Posté(e) le 4 octobre 2007 Re, Ok (gile). Merci de ta réponse et des explications détaillées qui vont avec. Une fois de plus, c'est trés chaleureux de ta part et ne t'en remerierai jamais assez. Mais je sais que tu le fais pour le plaisir et cela me réjouit de pouvoir le partager avec toi et les autres cadxpiens intéressés. Je suis donc tes conseils et teste cela de suite. Bonne nuit [Edité le 4/10/2007 par lili2006] Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
fanlou Posté(e) le 4 octobre 2007 Posté(e) le 4 octobre 2007 BonsoirOuai ca m´interesse aussi.Super Gile, merci.Bonne nuit.
funkkybebel Posté(e) le 5 octobre 2007 Posté(e) le 5 octobre 2007 Magnifique, c'est génial. Par contre est-il possible de garder la sélection courante si on lui demande => genre une case à cocher en plus qui laisse l'utilisateur choisir si les blocs sélectionnés restent dans la sélection, et le lisp inclue avec les sélections suivantes.De ce fait, il faudrait que lorsque je fais une sélection, l'outil reste actif pour que je puisse immédiatement choisir un autre bloc etc... Si c'est pas possible c'est déjà énorme comme ça. Merci beaucoup.
lili2006 Posté(e) le 5 octobre 2007 Posté(e) le 5 octobre 2007 Bonjour à toutes et tous, Merci encore (gile). Pratique pour corriger les projets d'étudiants,... Avis à ceux qui me lise,.... Bonne journée. Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 5 octobre 2007 Posté(e) le 5 octobre 2007 Salut, funkkybebel,Je n'ai pas envie de modifier GetBlock plus que ce que j'ai déjà fait, comme dit plus haut cette routine est appelée par différent LISP dont certains n'ont rien à voir avec une sélection.Je te propose donc une autre petite routine ssbm, qui ajoute au filtre de sélection les blocs spécifiés avec la boite de dialogue jusqu'à ce que tu clique "Annuler". (defun c:ssbm (/ sel ss name) (setq str "") (while (setq name (getblock nil)) (setq str (strcat str name ",")) ) (sssetfirst nil (ssget "_X" (list '(0 . "INSERT") (cons 2 str))) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
oran Posté(e) le 5 octobre 2007 Posté(e) le 5 octobre 2007 :) :) :) .........magnifique Gile.Merci,Oran
lili2006 Posté(e) le 5 octobre 2007 Posté(e) le 5 octobre 2007 Re, (gile). Dans la selection, serait-il possible de méler des blocs et aussi des entités quelconques appartenant à un calque ?? Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
funkkybebel Posté(e) le 5 octobre 2007 Posté(e) le 5 octobre 2007 Merci énormément.C'est exactement ce qu'il me fallait. Je vais juste essayer d'adopter le dernier code afin d'activer cette fonction uniquement avec le bouton >>.Et que quand on clique sur ok (au lieu de annuler) ça me donne la sélection globale. UN GROS MERCI. ;)
lili2006 Posté(e) le 5 octobre 2007 Posté(e) le 5 octobre 2007 Re, Et que quand on clique sur ok (au lieu de annuler) ça me donne la sélection globale. Ah bon ? Moi, ça ne fait rien,... Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
lili2006 Posté(e) le 5 octobre 2007 Posté(e) le 5 octobre 2007 Re, (Gile) As-tu une réponse à me donner sur le message précédent et sur cette interrogation : Dans la selection, serait-il possible de méler des blocs et aussi des entités quelconques appartenant à un calque ?? Merci d'avance. Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 5 octobre 2007 Posté(e) le 5 octobre 2007 Oui, ça serait possible, mais à vouloir trop rajouter d'options, on va perdre l'intérêt de ces routines de sélection par propriété et finir par refaire la Sélection rapide. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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