CadXP: Utilisation des commandes - CadXP

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Utilisation des commandes

#1 L'utilisateur est hors-ligne   Tallano 

  • ceinture blanche
  • Groupe : Membres
  • Messages : 3
  • Inscrit(e) : 19-mai 20

Posté 19 mai 2020 - 17:33

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?
0

#2 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11 404
  • Inscrit(e) : 02-septembre 05

Posté 19 mai 2020 - 20:09

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 -
Développements sur mesure pour AutoCAD
Image IPB
0

#3 L'utilisateur est hors-ligne   Tallano 

  • ceinture blanche
  • Groupe : Membres
  • Messages : 3
  • Inscrit(e) : 19-mai 20

Posté 19 mai 2020 - 20:21

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().
0

#4 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11 404
  • Inscrit(e) : 02-septembre 05

Posté 19 mai 2020 - 20:56

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 -
Développements sur mesure pour AutoCAD
Image IPB
0

#5 L'utilisateur est hors-ligne   Tallano 

  • ceinture blanche
  • Groupe : Membres
  • Messages : 3
  • Inscrit(e) : 19-mai 20

Posté 20 mai 2020 - 07:47

ça fonctionne, merci infiniment! :)
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)