Tallano Posté(e) le 19 mai 2020 Posté(e) le 19 mai 2020 Bonjour à tous, J'ai énormément de mal, malgré mes recherches, à comprendre le fonctionnement d'un appel à une commande Autocad en utilisant les TypedValues.N'ayant pas accès à Editor.Command(), j'utilise: [DllImport("accore.dll", EntryPoint = "acedCmd", CallingConvention = CallingConvention.Cdecl)] private static extern int acedCmd(IntPtr vlist); Et du coup, je peux faire des choses simples comme: ResultBuffer rb = new ResultBuffer(); rb.Add(new TypedValue(5005, "ZOOM")); rb.Add(new TypedValue(5005, "E")); rb.Add(new TypedValue(5005, "")); acedCmd(rb.UnmanagedObject); J'ai également la liste des codes: //RT CODES #define RTNONE 5000 /* No result #define REAL 5001 /*Real number #define RTPOINT 5002 /* 2D point X and Y only #define RTSHORT 5003 /* Short integer #define RTANG 5004 /* Angle #define RTSTR 5005 /* String #define RTENAME 5006 /* Entity name #define RTPICKS 5007 /* Pick set #define RTORINT 5008 /* Orientation #define RT3DPOINT 5009 /* 3D point - X, Y, and Z #define RTLONG 5010 /* Long integer #define RTVOID 5014 /* Blank symbol #define RTLB 5016 /* list begin #define RTLE 5017 /* list end #define RTDOTE 5018 /* dotted pair #define RTNIL 5019 /* nil #define RTDXF0 5020 /* DXF code 0 for ads_buildlist only #define RTT 5021 /* T atom #define RESBUF 5023 /* resbuf #define RTMODELESS 5027 /* interrupted by modeless dialog Mais je ne comprends toujours pas comment cela marche.Concrètement, j'aimerais par exemple lancer une commande PLINE, où le premier point serait d'office indiqué via le code. Mais comment faire?
(gile) Posté(e) le 19 mai 2020 Posté(e) le 19 mai 2020 Salut, Depuis AutoCAD 2015, il n'est plus nécessaire d'utiliser P/Invoke avec acedCmd. La classe Editor fournit deux méthodes Editor.Command() et Editor.CommandAsync() qui acceptent comme arguments des valeur typées comma string, int double, Point3d, SelectionSet, etc. ed.Command("_PLINE", new Point2d(10.0, 5.0)); Voir ce sujet et celui-ci. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tallano Posté(e) le 19 mai 2020 Auteur Posté(e) le 19 mai 2020 Merci pour votre réponse, mais je précisais justement dans mon post que je n'ai pas accès à Editor.Command() (je suis sous Autocad 2013). C'est pour cela que j'utilise le palliatif acedCmd().
(gile) Posté(e) le 19 mai 2020 Posté(e) le 19 mai 2020 Au temps pour moi, j'avais mal lu. Tu peux utiliser la méthode d'extension suivante écrite par Tony Tanzillo. Elle "expose" la méthode non publique RunCommand et fonctionne comme Editor.Command. // Tony Tanzillo (reflection free) // http://www.theswamp.org/index.php?topic=44191.msg494502#msg494502 // <summary> // Appelle une commande de manière synchrone. // </summary> // <param name="ed">L'instance de Editor à laquelle s'applique la méthode.</param> // <param name="args">Le nom de la commande suivi des options.</param> // <returns>Le statut de l'exécution de la commande.</returns> // <exception cref="System.ArgumentNullException">Lancée si l'instance à laquelle s'applique la méthode est null.</exception> public static PromptStatus Command(this Editor ed, params object[] args) { if (ed == null) throw new ArgumentNullException("ed"); return runCommand(ed, args); } static Func<Editor, object[], PromptStatus> runCommand = GenerateRunCommand(); static Func<Editor, object[], PromptStatus> GenerateRunCommand() { MethodInfo method = typeof(Editor).GetMethod( "RunCommand", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); ParameterExpression instance = Expression.Parameter(typeof(Editor), "ed"); ParameterExpression args = Expression.Parameter(typeof(object[]), "args"); return Expression.Lambda<Func<Editor, object[], PromptStatus>>( Expression.Call(instance, method, args), instance, args) .Compile(); } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour 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