Aller au contenu

Sélection de tous les objets d\'un calque


Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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 Damme

Posté(e)

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

Posté(e)

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 Damme

  • 7 mois après...
Posté(e)

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]

Posté(e)

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

Posté(e)

(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

Posté(e)
(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.

Posté(e)

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

Posté(e)

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

Posté(e)

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/

Posté(e)

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.

Posté(e)

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

Posté(e)

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. ;)

Posté(e)

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

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é