Aller au contenu

Lancer un lisp depuis un lisp (+dcl)


Messages recommandés

Posté(e)

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]

Posté(e)

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'affichage

sur 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...

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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]

Posté(e)

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

Posté(e)

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+

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é