Patrick_35 Posté(e) le 25 octobre 2006 Posté(e) le 25 octobre 2006 Bonjour à vous tous Je n'arrive pas pour l'instant à faire charger correctement un lisp pour l'ouverture d'un dessin :( (setq doc (vla-get-documents (vlax-get-acad-object))) (setq des (vla-open doc "Un_Dessin")) (vla-sendcommand des "(load \"Un_Lisp\") ") Le SendCommand transmet bien le load mais c'est un fonctionnement surprenant :casstet:Le SendCommand me met sur le dessin ouvert, mais je ne vois rien qui se passe, pas de load. Je bascule sur le dessin dans lequel j'ai lancé mon lisp pour voir si tout c'est bien passé et apparemment c'est Ok. Je Rebascule sur le dessin qui a été ouvert et oh surprise, le lisp a été lancé et exécuté :o Après plusieurs essais, il faut que je bascule d’un dessin à l’autre pour que ça fonctionne. Gênant quand on souhaite faire un traitement par lot de fichiers. Il y a bien la possibilité de passer par le AutoCAD.LSP ou encore d’écrire dans les registres pour _appload avec un lancement automatique, mais je souhaiterai éviter ces extrémités.Toute sujétion est la bienvenue @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 25 octobre 2006 Posté(e) le 25 octobre 2006 Bonjour, Quand on reste dans le même fichier, sendcommand marche bien. (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) "_-insert ") et peut remplacer (command ...) du lisp. Sinon, dans ton cas, le fonctionnement est effectivement surprenant. On dirait que sendcommand est "asynchrone" et qu'il ne s'exécute que quand tout est bien terminé, c'est à dire quand tu reviens au fichier de départ ??? J'ai eu un jour un problème du même ordre et je suis passé par un fichier script (qui contient la commande open et le load) créé par le lisp et lancé à la fin du lisp. Un peu lourd, mais c'est tout ce que j'ai trouvé. (defun openlisp () (setq SCRFILE (strcat (getvar "TEMPPREFIX") "temp.scr")) (setq F (open SCRFILE "w")) (princ (strcat "_open \"c:\\temp\\toto.dwg\"") F) (princ "\n(load \"mon_lisp\")" F) (princ "\nmon_lisp " F) (close F) (command "_script" SCRFILE) ) Notez que tempprefix renvoie"C:\\Documents and Settings\\USERNAME\\Local Settings\\Temp\\"et existe dans la version 2004. Pas forcément les précedentes. Amicalement Zebulon_ C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Patrick_35 Posté(e) le 25 octobre 2006 Auteur Posté(e) le 25 octobre 2006 Merci de ta réponse Zebulon_ Quand on reste dans le même fichier, sendcommand marche bien.Oui et peut remplacer (command ...) du lisp.Et son avantage par rapport au command et qu'il peut être appliqué sur n'importe quel dessin ouvert dans Autocad, sans pour autant avoir activé ce dessin c'est à dire quand tu reviens au fichier de départ ??? Ben oui. je suis passé par un fichier script C'est quand même dommage d'avoir accès a la table des documents et de passer par ce biais :( Sinon, comme je le disais, il me reste la solution du AutoCAD.lsp avec la variable acadlspasdoc, ou encore dans les registres avec _appload mais j'attends un peu pour voir si quelqu'un à une solution plus perspicace @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Didier-AD Posté(e) le 29 novembre 2006 Posté(e) le 29 novembre 2006 Le comportement me semble tout à fait normal (setq des (vla-open doc "Un_Dessin"))ouvre le dessin "Un_dessin" qui, naturellement prend la main ; le dessin original n'a plus la main et donc la ligne suivante (vla-sendcommand des "(load \"Un_Lisp\") ")nest pas exécutée et reste en attente dans l'éditeur du dessin originalquand tu reviens dans le dessin original le lisp se poursuitpour bien comprendre, tu peux essayer cecitu ouvres deux dessins et tu les affiches en mozaiquetu peux très bien commencer une ligne dans le premier dessin, cliquer dans le second, y tracer un cercle puis cliquer à nouveau dans le premier pour finir ta ligne.pour les lisp c'est pareil. je crois que le script est une bonne idée, effectivement il y a aussi le blackboard qui serait un espace commun à tous les dessins mais je n'ai pas pratiqué.bon courage
Patrick_35 Posté(e) le 29 novembre 2006 Auteur Posté(e) le 29 novembre 2006 Merci de ta réponseEffectivement le black board pourrait être une solution, mais il ne stocke que des variables, hors l'idée était à partir d'un lisp, faire plusieurs opérations sur d'autres dessins, comme pour un script @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Didier-AD Posté(e) le 6 décembre 2006 Posté(e) le 6 décembre 2006 Une idée comme çà mais c'est un peu tiré par les cheveuxdans AutoCAD.LSP tu peux avoir une ligne comme celle ci (if (findfile "mylisp.lsp") (load "mylisp.lsp") ) dans ton appli principale, - tu génères le fichier "mylisp.lsp" (il doit fermer le fichier à la fin)- tu lances tous les vla-open que tu veux- à la fin tu effaces le fichier "mylisp.lsp" c'est un peu tiré par les cheveux mais çà doit marcher
Patrick_35 Posté(e) le 6 décembre 2006 Auteur Posté(e) le 6 décembre 2006 C'est bien ce que disais, sans passer par le AutoCAD.lsp, ni par les registres.Car à ce stade, c'est plus de la bidouille qu'autre chose :( , mais si on n'a pas le choix, c'est le résultat qui compte. Tant pis pour la forme @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 7 décembre 2006 Posté(e) le 7 décembre 2006 Bonjour, Le comportement me semble tout à fait normal (setq des (vla-open doc "Un_Dessin"))ouvre le dessin "Un_dessin" qui, naturellement prend la main ; le dessin original n'a plus la main et donc la ligne suivante (vla-sendcommand des "(load \"Un_Lisp\") ")nest pas exécutée et reste en attente dans l'éditeur du dessin originalquand tu reviens dans le dessin original le lisp se poursuit Si ce comportement est normal, alors à quoi peut bien servir vla-sendcommand ? Si c'est juste pour remplacer (command ...) dans le fichier en cours, c'est un peu dommage. Je pencherai plutôt à dire qu'il s'agit d'un comportement anormal, voire d'un bug. C'est quand même rageant de ne pas arriver à faire avec vlisp ce qu'un vulgaire script sait faire sans problème. Amicalement Zebulon_ [Edité le 7/12/2006 par zebulon_] C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Didier-AD Posté(e) le 8 décembre 2006 Posté(e) le 8 décembre 2006 Peut-être peut on voir çà comme un bugmais il faut peut-être aussi se souvenir que vla-sendcommand n'est pas une fonction LISP, c'est une utilisation détournée par le biais des ActiveX de la méthode VBA sendcommand et que cette méthode sert, si je traduis bien ce qu'en dit l'aide VBA Envoie une chaine sur la ligne de commande du document à partir d'une application VB ou VBA.En fait, ce n'est pas SendCommande qui bugue c'est juste l'exécution du LISP dans le document initial qui est arrêtée au moment du Vla-Open ; la preuve, çà fonctionne dès qu'on retourne dans le document d'origine
BTO Posté(e) le 2 février 2007 Posté(e) le 2 février 2007 Après plusieurs essais, il faut que je bascule d’un dessin à l’autre pour que ça fonctionne. Gênant quand on souhaite faire un traitement par lot de fichiers. Bonjour Patrick,pour effectuer un traitement par lot (en ouvrant les fichiers dans AutoCAD) le principe le plus utilisé est le suivant :- créer un script qui sera répété sur chaque fichier, ça peut être : [b] exemple 1 :[/b] (if (= 0 (getvar "tilemode")) (command "espacep")) zoom _e purger to n [b] exemple 2 :[/b] ssx E wipeout _erase _p (load "DeleteBlockWipeouts.lsp") DeleteBlockWipeouts Tu remarques que finalement le fait de passer par un script n'est pas génant puisqu'on peut faire appel à tout ce qu'on veut via un (load....) - créer un moteur.lsp dont les taches sont : * établir la liste des fichiers à traiter * sélection du script1(voir au dessus) à répéter * création d'un megascript.scr de la forme suivante : ouverture du fichier1.dwg exécution de script1 save fichier1.dwg ouverture du fichier2.dwg exécution de script1 save fichier2.dwgetc. ça donne par exemple pour megascript.scr : _qnew _open "D:/_traitement/5eme.dwg" (if (= 0 (getvar "tilemode")) (command "espacep")) zoom _e purger to n _qsave _open "D:/_traitement/coupe AA.dwg" (if (= 0 (getvar "tilemode")) (command "espacep")) zoom _e purger to n _qsave _open "D:/_traitement/etage courant.dwg" (if (= 0 (getvar "tilemode")) (command "espacep")) zoom _e purger to ... .... .. _qnew filedia 1 cmdecho 1 et enfin ton moteur.lsp devra finir par le lancement de l'exécution megascript.scr. C'est plus impressionant que compliqué, et ce message et plus long que le moteur.lsp à créermais dsl je ne peux pas diffuser ma version. Pour ce qui est des quelques lsp que je charge au début ( très peu car je préfère faire un (load... dans mes menus), je les place dans les fichiers .mnl de mes menus personnalisés, on peut en créer un par .cui et c'est fait pour :) Bruno Toniutti [Edité le 2/2/2007 par BTO]
Patrick_35 Posté(e) le 2 février 2007 Auteur Posté(e) le 2 février 2007 Merci BTO, mais cela je sais le faire ;)Ce que je recherchais, c'est d'éviter de passer par un script et de reussir un traitement par lot. L'idée était de se servir de la table documents et de lancer les différentes fonctions vlisp/lisp voir quelques commands @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
stephan35 Posté(e) le 14 février 2007 Posté(e) le 14 février 2007 Bonjour, J'avais gardé cet article sous le coude en attente d'utilisation,je suis donc maintenant confronté au même problème que vous tous ... Mon cas:dans mon pseudo explorateur de folio autocad, je visualise mes dwg, et donc je lance des traitements de fond, et mon cas pose problème dès le début,patrick_35 , certifie que les lisp sont chargé (voir acad2006doc.lsp) ? certain ? (ou alors il y a du filtrage ?) Petite suggestion:Pourquoi ne pas executer une commande lisp avec l'équivalent (load xxxx) en vlisp ou autre (que je ne maitrise pas ...) :P Vous pourriez me la donner cette commande .... ? Bon ben voilà ! c'était pour faire avancé le s.....c Merci
Patrick_35 Posté(e) le 14 février 2007 Auteur Posté(e) le 14 février 2007 patrick_35 , certifie que les lisp sont chargé (voir acad2006doc.lsp) ? certain ? (ou alors il y a du filtrage ?) Ah bon ??? Sinon, il reste cette méthode @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
stephan35 Posté(e) le 15 février 2007 Posté(e) le 15 février 2007 Autant, pour moi ... mea culpa !J'ai lu trop vite .... ou j'avais envie d'y croire ... ;) Bref, Peut-on forcer avec DBX le chargement de routines lisp et avec quelle commande SVP ? Merci beaucoup ...
Patrick_35 Posté(e) le 15 février 2007 Auteur Posté(e) le 15 février 2007 ou j'avais envie d'y croire ... ;)C'est une invitation à une embauche ;) Tu fais ce que tu veuxLa seul différence avec objectDbx, c'est au lieu de pointer sur (setq doc (vla-get-activedocument (vlax-get-acad-object)) ou (setq doc (vla-item (vla-get-documents (vlax-get-acad-object)) "Un_Dessin.dwg")) s'il est déjà ouvert dans Autocad, tu as la même chose avec la fonction (setq doc (ouvrir_dessin_dbx "c:/Un_dessin.dwg"))Il ne reste plus qu'à utiliser les fonctions vlisp uniquement. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
stephan35 Posté(e) le 15 février 2007 Posté(e) le 15 février 2007 aîe aîe aîe , communiquer , compendre et se faire comprendre , toute une affaire .... J'avais bien assimilé le principe d'ouverture de fichier autocad en DBX ... Le but de ma demande était d'obtenir le code pour effectuer le chargement d'un fichier LISP en vlisp ou autre méthode dbx ? :D l'équivalent à (load "prout.lsp") ... Merci patrick_35 ...
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