Aller au contenu

Messages recommandés

Posté(e)

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:

Posté(e)

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

Posté(e)

Salut, gile

Le problème c’est les guillemets dans ta procédure

On ne peut pas avoir des guillemets dans des guillemets

Ou 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 !

 

Posté(e)

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

Posté(e)

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

Posté(e)

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 ?

 

Posté(e)

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

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é