Guigues Posté(e) le 14 août 2009 Posté(e) le 14 août 2009 Bonjour tout le monde. Je profite de mes congés pour me lancer dans l'apprentissage de la programmation en Lisp + interface avec fichiers DCL. Si qqun peut prendre 2 minutes pour m'expliquer ce qui cloche dans mes tentatives je pourrai continuer l'exercice ! Mon but était de lier une boite dcl à un choix entre différents blocs à insérer. Le codage du fichier DCL semble ok mais je bloque dans le fichier Lisp après l'attribution d'une valeur à la variable "choix". Le but est d'insérer le bloc "blocA.dwg" si je choisis le bloc A ou le "blocB.dwg" si je choisis le bloc B.... Je débute et je pense que cela se voit ! Fichier DCL (B2D.DCL) : B2D : dialog { label = "MENU PERSO" ; : boxed_radio_column { label = "Blocs" ; : radio_button { key = "BA" ; label = "Bloc A" ; value = "1" ; } : radio_button { key = "BB" ; label = "Bloc B" ; } } ok_cancel ; : paragraph { : text_part { label = "GUIGUES ENVT" ; } } } Fichier LISP (B2D.Lsp) : (defun C:B2D () (setq dcl_id (load_dialog "B2D.dcl")) (if (not (new_dialog "B2D" dcl_id))(exit)) (action_tile "BA" "(setq Choix \"1\")") (action_tile "BB" "(setq Choix \"2\")") (action_tile "accept" "(done_dialog) (setq userclik T)") (action_tile "cancel" "(done_dialog) (setq userclik nil)") (start_dialog) (unload_dialog dcl_id) (If userclick (progn (If (= choix 1) (progn (command "-inserer" "BlocA" "1" "1" "0") ) ) (If (= choix 2) (progn (command "-inserer" "BlocB" "1" "1" "0") ) ) ) ) (princ) ) Merci beaucoup (d'avance) à celui qui aura la patience de répondre ! P.S : coucou usegomme ! [Edité le 14/8/2009 par Guigues]
bseb67 Posté(e) le 14 août 2009 Posté(e) le 14 août 2009 Salut Guigues, l'erreur est dans le (command "-inserer"):il y a dans l'ordre:- nom du bloc- position (point 3D => '(0.0 0.0 0.0) par ex- échelle X- échelle Y- angle de rotation il te manque le point d'insertion,l'échelle en X et Y ceux sont des réels donc pas de ""et pour l'angle idem Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
bseb67 Posté(e) le 14 août 2009 Posté(e) le 14 août 2009 J'oubliais, tu fais un (setq choix \"X\") => donc choix vaudra "X" et non X pour compléter le lisp, moi je mettrai un cond: (cond ((= userclick nil) ; annulé ) ((= choix "1") (command "-inserer" "BlocA" '(0.0 0.0 0.0) 1 1 0) ) ((= choix "2") (command "-inserer" "BlocB" '(0.0 0.0 0.0) 1 1 0) ) ) Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Guigues Posté(e) le 14 août 2009 Auteur Posté(e) le 14 août 2009 J'ai "fabriqué" un lisp de "formatage" de plan avec initialisation de variables et insertion de blocs il y a pas mal de temps et j'utilisai la même construction sans probleme ! Je reviens sur le soucis de mon lisp ... le chargement du lisp et du DCL se font sans probleme mais lors de l'execution je ne dépasse pas la fermeture du DCL .... la boucle IF > Action = inserer un bloc ne se lance pas.... Si la commande "insérer" se lancait, je pense qu'un message d'erreur interviendrait dans le processus.
Guigues Posté(e) le 14 août 2009 Auteur Posté(e) le 14 août 2009 Réponses en même temps >.< .... je teste ta solution immédiatement !
bseb67 Posté(e) le 14 août 2009 Posté(e) le 14 août 2009 J'ai "fabriqué" un lisp de "formatage" de plan avec initialisation de variables et insertion de blocs il y a pas mal de temps et j'utilisai la même construction sans probleme ! Je reviens sur le soucis de mon lisp ... le chargement du lisp et du DCL se font sans probleme mais lors de l'execution je ne dépasse pas la fermeture du DCL .... la boucle IF > Action = inserer un bloc ne se lance pas.... Si la commande "insérer" se lancait, je pense qu'un message d'erreur interviendrait dans le processus. justement, les deux (if (= choix ...) ) ne marchent pas à cause de la réponse donnée plus haut Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Guigues Posté(e) le 14 août 2009 Auteur Posté(e) le 14 août 2009 Même topo ... l'execution ne dépasse pas la fermeture du DCL et la boucle (cond n'est pas lancée.
bseb67 Posté(e) le 14 août 2009 Posté(e) le 14 août 2009 Je suis une quiche :P , il faut inverser le (setq userclick t) et le (done_dialog) car le done_dialog t'éjectes de la dcl et tout le code qui suit dans les " " ne sera pas exécuté et il y a erreur de frappe pour la variable userclick != userclik de plus, il faut initialiser choix au début, car si l'utilisateur ne cliques que sur ok,choix ne vaut rien ou une valeur non valide [Edité le 14/8/2009 par bseb67] Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Guigues Posté(e) le 14 août 2009 Auteur Posté(e) le 14 août 2009 Un pas en avant ! Il dépasse la fermeture du DCL mais qque soit mon choix dans le DCL il veut insérer le bloc B.dwg :o
vincentp010 Posté(e) le 14 août 2009 Posté(e) le 14 août 2009 Salut, Là il y a des guillemets :(action_tile "BA" "(setq Choix \"1\")") Et là il n'y en a pas :(If (= choix 1) je mettrai plutôt(If (= choix "1") Aide au téléchargement du cadastre dgfip-download-helper Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0 Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js
Guigues Posté(e) le 14 août 2009 Auteur Posté(e) le 14 août 2009 Nous avons testé avec la variable entre guillemets .... on reste toujours bloqué sur l'insertion du bloc B qque soit notre choix dans le DCL :(
vincentp010 Posté(e) le 14 août 2009 Posté(e) le 14 août 2009 Avec cette syntaxe ça marche :(defun C:B2D () (setq Choix 1) (setq dcl_id (load_dialog "B2D.dcl")) (if (not (new_dialog "B2D" dcl_id))(exit)) (action_tile "BA" "(setq Choix 1)") (action_tile "BB" "(setq Choix 2)") (action_tile "accept" "(setq userclik T) (done_dialog)") (action_tile "cancel" "(setq userclik nil) (done_dialog)") (start_dialog) (unload_dialog dcl_id) (cond ((= userclik nil) ; annulé ) ((= choix 1) (command "-inserer" "BlocA" "0,0" 1 1 0) ) ((= choix 2) (command "-inserer" "BlocB" "0,0" 1 1 0) ) ) (princ) ) Aide au téléchargement du cadastre dgfip-download-helper Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0 Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js
(gile) Posté(e) le 14 août 2009 Posté(e) le 14 août 2009 Guigues, Au delà des corrections faites ci-dessus, tu peux simplifier ton code :Si tu donnes une clé au contrôle boxed_radio_column, un get_tile sur cette clé retourne la clé du radio_button activé.Si tu donnes comme clé aux radio_button les noms des blocs tu peux directement attribuer ceux ci à une variable (result).Il suffit ensuite de faire cette attribution dans une expression action_tile sur le contrôle accept pour récupérer le nom du bloc et contrôler si l'utilisateur a cliqué OK ou Annuler (à condition de déclare la variable result pour qu'elle soit remise à nil à chaque lancement de la routine. Le code DCL :B2D : dialog { label = "MENU PERSO" ; : boxed_radio_column { label = "Blocs" ; key = "bloc" ; : radio_button { key = "BlocA" ; label = "Bloc A" ; value = "1" ; } : radio_button { key = "BlocB" ; label = "Bloc B" ; } } ok_cancel ; : text { label = "GUIGUES ENVT" ; } } Le LISP :(defun C:B2D (/ dcl_id result ins) (setq dcl_id (load_dialog "B2D.dcl")) (if (not (new_dialog "B2D" dcl_id)) (exit) ) (action_tile "accept" "(setq result (get_tile\"bloc\")) (done_dialog)") (start_dialog) (unload_dialog dcl_id) (if result (if (setq ins (getpoint "\nPoint d'insertion: ")) (command "_insert" result ins 1 1 0) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lili2006 Posté(e) le 15 août 2009 Posté(e) le 15 août 2009 Bonjour à toutes et tous, Salut Gilles, J'ai testé vite fait ton lisp réponse précédente. J'ai créé un fichier "BlocA" ainsi qu'un ""BlocB"", l'ensemble dans un dossier des chemins de recherche. AutoCAD me renvoi : Commande: b2d; erreur: quitter / sortir abandonCommande: Une idée ? Merci d'avance, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 15 août 2009 Posté(e) le 15 août 2009 Salut, Il est probable que ce message soit dû au fait que le fichier DCL n'a pas été trouvé (il doit être dans les chemins de recherche. L'expression :(if (not (new_dialog "B2D" dcl_id)) (exit) )fait quitter le programme si le fichier n'est pas trouvé, ce qui est considéré comme une erreur par AutoCAD (comme un Echap pendant un LISP). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lili2006 Posté(e) le 15 août 2009 Posté(e) le 15 août 2009 Re, Merci Gilles Mauvais recopiage du DCL en fait,... Désolé du dérangement,.. PS: Je profite de ce post comme petit exercice,... @+, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
Guigues Posté(e) le 1 septembre 2009 Auteur Posté(e) le 1 septembre 2009 Bonjour Je reviens juste d'un déplacement donc une réponse un peu tardive aprés la résolution du probleme par (Gile). Je t'adresse un grand MERCI car primo la démarche est trés simplifiée et du coup beaucoup plus efficace ! et secondo je vais pouvoir coder et finaliser mes petits projets sous 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