Aller au contenu

Selectionner des objets dans differentes presentations


Messages recommandés

Posté(e)

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 "

Posté(e)

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

Posté(e)

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?article340

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 !

: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 "

Posté(e)

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 plus

Aucune 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"

Posté(e)

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

Posté(e)

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 "

Posté(e)

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.

Posté(e)

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 "

Posté(e)

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 "

Posté(e)

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

Posté(e)

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

Posté(e)

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 :rolleyes:

 

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 "

Posté(e)

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

Posté(e)

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 "

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é