funkkybebel Posté(e) le 29 septembre 2008 Posté(e) le 29 septembre 2008 Bonjour,Je souhaiterai rajouter un bouton sur une dcl existante.Chose faite, avec attribution de la key : "att" : :button{ label="Choisir le(s) Bloc(s) par Attribut"; [b]key="att";[/b] alignment=left; fixed_width=true; } Dans le lisp correspondant je souhaiterai que l'action sur ce bouton lance un lisp déjà chargé au démarrage "ssatt" : (action_tile "att" "(ssatt)") Mais ça me donne l'erreur suivante :erreur: no function definition: SSATT Quelle est la bonne commande à mettre, a-t-on réellement la possibilité de faire une telle action sur un bouton ? Il y avait bien un lisp sur le forum qui lance tout un tas d'autres lisps de séléctions rapides il me semble mais je n'ai pas réussi à le retrouver... Merci pour votre aide. [Edité le 29/9/2008 par funkkybebel]
bseb67 Posté(e) le 29 septembre 2008 Posté(e) le 29 septembre 2008 Salut funkkybebel! Normalement ca devrai marcher, es-tu sur que la fonction (defun ssatt()...) existe?car le message d'erreur correspond à cela, il ne trouve pas le fonction. Par contre faut faire attention, car dans une dcl, il y a un temps de décalage à l'affichagesur la ligne de commande, ex:si (setq cpt 0)(defun ssatt() (print (setq cpt (1+ cpt)))) en cliquant sur ton bouton une fois, tu n'aura rien dans la ligne de commande, tu cliques une deuxième fois tu aura alors => commande: 1.Si tu fermes ta dcl il y aura alors commande: 2 Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
funkkybebel Posté(e) le 29 septembre 2008 Auteur Posté(e) le 29 septembre 2008 En fait la commande est chargée dans AutoCAD.lsp au démarrage d'autocad.Par contre dans mon lisp il n'y a pas de (defun ssatt()...) car je désire plûtot lancer le lisp correspondant par exemple: (action_tile "att" "(lancer ==> ssatt)")
bseb67 Posté(e) le 29 septembre 2008 Posté(e) le 29 septembre 2008 En fait la commande est chargée dans AutoCAD.lsp au démarrage d'autocad Si je comprend bien, ssatt est une commande (que tu as écrite) pas une fonction ?Donc la modification est simple (action_tile "att" "(c:ssatt)") Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
funkkybebel Posté(e) le 29 septembre 2008 Auteur Posté(e) le 29 septembre 2008 J'ai essayé de faire ce que tu m'as dit, mais ça me retourne la même erreur...
(gile) Posté(e) le 29 septembre 2008 Posté(e) le 29 septembre 2008 Salut, Si bseb67 a raison pour l'appel de la commande ssatt, je crains que l'expression :(action_tile "att" '(c:ssatt)")ne fonctionne pas.ssatt nécessite une intervention de l'utilisateur dans le dessin (sélection d'un attribut) et cette intervention ne peut avoir lieu que si la boite de dialogue est fermée.Il faut donc faire un appel à done_dialog pour fermer la boite de dialogue et exécuter ssatt, mais il faudrait en savoir plus sur le LISP qui commande la boite de dialogue pour savoir comment placer le done_dialog. Il y avait bien un lisp sur le forum qui lance tout un tas d'autres lisps de séléctions rapides il me semble mais je n'ai pas réussi à le retrouver... Le code est ici Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
funkkybebel Posté(e) le 29 septembre 2008 Auteur Posté(e) le 29 septembre 2008 Merci beaucoup gile.Je jette un coup d'oeil demain. Bonne nuit à tous.
funkkybebel Posté(e) le 2 octobre 2008 Auteur Posté(e) le 2 octobre 2008 Franchement ces derniers jours j'ai essayé pas mal de combinaisons mais je ne sais plus quoi faire.Si une âme charitable veut bien se pencher dessus à ses heures perdues.L'outil ssatt marche très bien en lui même c'est juste que je souhaiterai l'integrer à l'intérieur d'une DCL d'un autre lisp (ben voyon !). Le lisp ssatt : SSATT.LSP ;; Sélection par valeur d'attribut (gile) (defun c:ssatt (/ doc att elst tag val name ss1 ss2) (vl-load-com) (and (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (setq att (car (nentsel "\nSélectionnez l'attribut source: "))) (setq att (vlax-ename->vla-object att)) (= (vla-get-ObjectName att) "AcDbAttribute") (setq tag (vla-get-TagString att) val (vla-get-TextString att) blk (vla-ObjectIDToObject doc (vla-get-OwnerId att)) name (if (vlax-property-available-p blk 'EffectiveName) (vla-get-EffectiveName blk) (vla-get-Name blk) ) ss2 (ssadd) ) (princ "\nSélectionnez les blocs ou : ") (or (ssget (list '(0 . "INSERT") '(66 . 1) (cons 2 (strcat name ",`*U*")) ) ) (ssget "_X" (list '(0 . "INSERT") '(66 . 1) (cons 2 (strcat name ",`*U*")) ) ) ) (vlax-for blk (setq ss1 (vla-get-ActiveSelectionSet doc)) (if (= name (if (vlax-property-available-p blk 'EffectiveName) (vla-get-EffectiveName blk) (vla-get-Name blk) ) ) (foreach a (vlax-invoke blk 'GetAttributes) (if (and (= (vla-get-TagString a) tag) (= (vla-get-TextString a) val) ) (ssadd (vlax-vla-object->ename blk) ss2) T ) ) T ) ) (not (vla-delete ss1)) (sssetfirst nil ss2) ) (princ) ) Le lisp sur lequel je souhaite rajouter le code pour lancer ssatt depuis un bouton sur la DCL correspondante : GETBLOCK.LSP (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 ) ;;; 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 "att" "(c:ssatt)") (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 ) (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) ) La DCL sur laquelle je souhaite rajouter un bouton et qui se chargera de lancer simplement la commande "ssatt" déjà chargée au démarrage d'acad : GETBLOCK_2.DCL getblock_2:dialog{ label="Choisir un bloc"; key="box"; :boxed_column{ :row{ :text{ label="Sélectionner"; alignment=left; } :button{ label="Choisir le(s) Bloc(s) par Attribut"; key="att"; alignment=left; fixed_width=true; } :button{ label="Choisir le Bloc >>"; 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=60; } :popup_list{ key="bl"; edit_width=60; } spacer; } ok_cancel; } J'ai quand même un doute sur l'utilité de la DCL car à priori une autre DCL est chargé directement dans le lisp ! Merci à tous pour votre aide...[Edité le 2/10/2008 par funkkybebel] [Edité le 2/10/2008 par funkkybebel]
(gile) Posté(e) le 2 octobre 2008 Posté(e) le 2 octobre 2008 Salut, Excuse moi mais je ne vois vraiment pas l'intérêt d'intégrer un bouton pour lancer ssatt dans getblock, cette dernière routine servant dans de nombreux autres LISP donnés ici et là. Lancer ssb pour cliquer sur un bouton pour lancer ssatt (qui n'a pas grand chose à voir avec la première)... tu as la boite de dialogue "sel" (lien donné ci dessus) qui permet de lancer des routines ssXXX. J'ai quand même un doute sur l'utilité de la DCL car à priori une autre DCL est chargé directement dans le lisp ! Le fichier DCL est indispensable, par contre tu as deux routines getblock, seule la version 2 est utile. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
funkkybebel Posté(e) le 2 octobre 2008 Auteur Posté(e) le 2 octobre 2008 Oui bien sûr, mais c'est par rapport à l'intégration des outils déjà en place, je trouvais ça assez logique pour moi et comme ça on ne rajoute pas encore un autre lisp / fenêtres. Comme je l'ai dit, le plus important c'est que le lisp ssatt fonctionne correctement et qu'il me rende service, pour le reste tant pis. Merci beaucoup de ton aide gile. A+
lili2006 Posté(e) le 2 octobre 2008 Posté(e) le 2 octobre 2008 Bonsoir à toutes et tous, Sur une BD de ce type ? http://images0.hiboox.com/images/4008/6798af20f74a54f0b2022aa6ea852d54.jpg Alors c'est la réponse de (gile) => tu as la boite de dialogue "sel" (lien donné ci dessus) qui permet de lancer des routines ssXXX. J'y ai même intégré la dernière "SSTAG", suite à ce post, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
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