sam-123 Posté(e) le 22 mars 2010 Posté(e) le 22 mars 2010 Salut a tous,Je pensais que pour un loadé un programme lisp il fallait étulisé la méthode « SendScommand »Est-ce que je me trompe ? (parce que ca n’a pas l’air de fonctionné!) :mad:
(gile) Posté(e) le 22 mars 2010 Posté(e) le 22 mars 2010 Salut, On peut invoquer une expression LISP avec SendCommand() ou SendStringToExecute(), le problème est que ces méthodes sont asynchrones et donc ne sont exécutées qu'à la fin du code.Comme pour les commandes le seul moyen d'avoir des méthodes synchrone est de faire appel à des méthodes non managées (ARX) via P/Invoke. Dans ce cas, la méthode acedEvaluateLisp, fonctionne bien.Si tu utilises A2010 ou une version 64 bits, il est probable qu'il faille changer la valeur de EntryPoint (voir ce sujet) Exemples avec un fichier LISP : C:\tmp.lsp qui ne contient que l'expression (alert "Lisp chargé").Avec les commandes Test1 et Test2 la boite de dialogue "Fin du code" s'affiche avant "Lisp chargé".Avec Test3 le LISP est bien chargé avant la fin du code. using System; using System.Runtime.InteropServices; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Interop; using Autodesk.AutoCAD.Runtime; namespace CsMgd1 { public class Class1 { // Utilisation de SendCommand [CommandMethod("Test1")] public void Test1() { AcadApplication acadApp = (AcadApplication)Application.AcadApplication; acadApp.ActiveDocument.SendCommand("(load \"C:\\\\tmp.lsp\") "); Application.ShowAlertDialog("Fin du code"); } // Utilisation de SendStringToExecute [CommandMethod("Test2")] public void Test2() { Document doc = Application.DocumentManager.MdiActiveDocument; doc.SendStringToExecute("(load \"C:\\\\tmp.lsp\") ", false, false, true); Application.ShowAlertDialog("Fin du code"); } // Utilisation de acedEvaluateLisp via P/Invoke [system.Security.SuppressUnmanagedCodeSecurity] [DllImport("acad.exe", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acedEvaluateLisp@@YAHPB_WAAPAUresbuf@@@Z")] extern private static int acedEvaluateLisp(string lispLine, out IntPtr result); [CommandMethod("Test3")] public void Test3() { IntPtr rb = IntPtr.Zero; acedEvaluateLisp("(load \"C:\\\\tmp.lsp\")", out rb); Application.ShowAlertDialog("Fin du code"); } } } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sam-123 Posté(e) le 22 mars 2010 Auteur Posté(e) le 22 mars 2010 Salut, gileLe problème c’est les guillemets dans ta procédureOn ne peut pas avoir des guillemets dans des guillemetsOu c’es "etc." et "etc." Mais cela ça bloque a tous les coups "etc. "etc.""Ou alors c’est moi qui dis des bêtises encore une fois !
(gile) Posté(e) le 22 mars 2010 Posté(e) le 22 mars 2010 Quand on veut mettre des guillemets dans un chaîne, il faut les faire précéder du caractère d'échappement : underscore (\). Il en va de même pour le caractère d'échappement lui même. Dans l'expression LISP : (load "C:\\toto.lsp")on utilise la chaîne : C:\toto.lsp qui contient un underscore. Pour que cet underscore soit considéré comme tel dans la chaîne, on le fait précéder par le caractère d'échappement (un underscore) : "C:[surligneur]\[/surligneur]\toto.lsp" Donc pour traduire toute l'expression LISP en chaîne, on fera précéder chaque guillemet et chaque underscore par le caractère d'échappement :"(load [surligneur]\[/surligneur]"C:[surligneur]\[/surligneur]\[surligneur]\[/surligneur]\tmp.lsp[surligneur]\[/surligneur]") " Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 22 mars 2010 Posté(e) le 22 mars 2010 Oupss !... La réponse données ci dessus fonctionne en LISP et en C# mais sûrement pas en VB. En VB le caractère d'échappement est le guillemet ("). Ça devrait donc être (pas testé) : "(load ""C:\\tmp.lsp"") " ou "(load " & chr(34) & "C:\\tmp.lsp" & chr(34) & ")" Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sam-123 Posté(e) le 22 mars 2010 Auteur Posté(e) le 22 mars 2010 Donc si j’ai bien compris dans mon cas ca sera cela ? app.ActiveDocument.SendCommand("(load \"C:\Resources\Vba-Lisp-Dcl\Blindflange.lsp\") ") Parce que même écris comme cela il ne l’accepte pas ?
(gile) Posté(e) le 22 mars 2010 Posté(e) le 22 mars 2010 Non, regarde ma réponse juste au dessus, en LISP il faut faire précéder l'underscore par un underscore et en VB le guillemet par un guillemet : L'expression LISP c'est :(load "C:\\Resources\\Vba-Lisp-Dcl\\Blindflange.lsp") Pour la mettre dans une chaîne en VB, il faut doubler les guillemets à l'intérieur de la chaîne :app.ActiveDocument.SendCommand("(load ""C:\\Resources\\Vba-Lisp-Dcl\\Blindflange.lsp"") ") Mais je ne suis pas sûr, je ne cause pas VB.Il faut que tu te trouves une documentation sur le langage VB.net (MSDN ou autre). Je le répète, on ne peut pas se lancer sérieusement dans la programmation d'AutoCAD en .NET (quel que soit le langage utilisé) sans avoir des bases solides en .NET et dans le langage choisi... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sam-123 Posté(e) le 22 mars 2010 Auteur Posté(e) le 22 mars 2010 Oups, j’ai répondu trop viteMerci, gile
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