Aller au contenu

Boites de dialogues Autocad


Messages recommandés

Bonjour,

 

Voici le contexte :

je suis dans autocad, je charge ma dll (faite en c#). Je tape ma commande et une boite de dialogue perso s'ouvre. Dans cette boite de dialogue, il y a un bouton.

 

Ce que je souhaiterai :

Lorsque je clique sur le bouton, je souhaite lancer une commande native d'autocad et une fois la commande terminée, revenir à ma boite de dialogue.

 

Pour exemple :

je clique sur le bouton, la commande "_MTEXT" se lance dans l'espace objet (avec toutes les fonctionnalitées habituelles) et lorsque je clique sur "OK", je revien sur ma boite de dialogue perso avec le contenu du Mtext enregistré dans une variable.

 

Je vois très bien comment créer une entité MTEXT mais lancer une commande Autocad et en récupérer la valeur, je sèche :( . La seule solution que j'ai, est de passer par LispFonction. Est-ce la seule ??

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

Lien vers le commentaire
Partager sur d’autres sites

j'aurais tendance à passer par un chemin détourné. Relire les propriétés du dernier objet créé.

 

 

Salut Olivier,

 

en lisp, c'est ce que je ferai mais en C#, je me demande s'il n'y a pas des possibilités plus directes. :)

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

Lien vers le commentaire
Partager sur d’autres sites

Pour lancer la commande, tu dois utiliser SendCommand (API COM) en positionnant le drapeau CommandFlags.Session sur ta commande C# pour que l'exécution soit synchrone.Ou tu peux P/Invoker acedCmd :

 

[DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int acedCmd(IntPtr resbuf);

public static PromptStatus Command(params object[] args)
{    
   if (Application.DocumentManager.IsApplicationContext)
       throw new ApplicationException("La commande ne peut pas être exécutée dans le contexte de l'application.");

   int stat;

   using (var buffer = new ResultBuffer())
   {
       foreach (object o in args)
       {
           if (o is ObjectId)
               buffer.Add(new TypedValue((int) LispDataType.ObjectId, o));
           else if (o is Point2d)
               buffer.Add(new TypedValue((int) LispDataType.Point2d, o));
           else if (o is Point3d)
               buffer.Add(new TypedValue((int) LispDataType.Point3d, o));
           else if (o is Int32)
               buffer.Add(new TypedValue((int) LispDataType.Int32, o));
           else
               buffer.Add(new TypedValue((int) LispDataType.Text, o));
       }
       stat = acedCmd(buffer.UnmanagedObject);
   }

   return (PromptStatus) stat;
}

 

Pour accéder ensuite à ton objet MText, dans l'espace de nom Autodesk.AutoCAD.Internal.Utils, il y a une méthode EntLast qui te renvoie l'ID du dernier objet créé.

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

J'ajouterais juste à ce que dit Maxence, qu'on peut aussi, depuis A2011 je crois, utiliser la méthode non documentée RunCommand() pour appeler une commande de manière synchrone.

Tony Tanzillo propose un wrapper pour cette methode qui fonctionne un peu comme la fonction LISP command (accepte un nombre indéterminé d'arguments de tous types y compris les jeux de sélection.

Cette méthode (ou une très similaire) est désormais accessible nativement avec AutoCAD 2015.

 

// From Tony Tanzillo
// http://www.theswamp.org/index.php?topic=44191.msg494502#msg494502
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
using System.Reflection;
using Autodesk.AutoCAD.ApplicationServices;

namespace Autodesk.AutoCAD.EditorInput
{
 public static class EditorInputExtensionMethods
 {
    public static PromptStatus Command( this Editor editor, params object[] args )
    {
       if( editor == null )
          throw new ArgumentNullException( "editor" );
       return runCommand( editor, 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();
    }
 }
}

 

Exemple d'utilisation :

Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
PromptPointResult ppr = ed.GetPoint("\nCentre du cercle: ");
if (ppr.Status == PromptStatus.OK)
   ed.Command("_circle", ppr.Value, 0.5 / Math.PI);

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bon, après analyse l'approche RunCommand(), que tu propose (Gile), correspond à ce que je souhaite faire. ;)

 

Maintenant, pour aller un peu plus loin, est-ce possible de ne pas rester dans la ligne de commande ?

Pour prendre un exemple :

Dans la boite de dialogue ATTDEF, lorsque l'on coche la case "ligne multiple" et que l'on clique sur le bouton "..." (situé à coté de la textbox "Par defaut"). la commande "MTEXT" s'execute dans l'espace objet avec une barre d'outils simplifiée.

 

Comment s'y prendre s'y je souhiatais refaire excatement la même chose ?

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

Lien vers le commentaire
Partager sur d’autres sites

J'ai avancé sur le sujet et si je positionne le drapeau CommandFlags.ActionMacro sur ma commande ça fonctionne :

 

[CommandMethod("addMtext", CommandFlags.ActionMacro)]
       static public void AddMtext()
       {
           Document acadAdoc = acadAppl.DocumentManager.MdiActiveDocument;
           Database adocData = acadAdoc.Database;
           Editor adocEdit = acadAdoc.Editor;

           using (Transaction dataTran = adocData.TransactionManager.StartOpenCloseTransaction())
           {
               adocEdit.Command("mtext");
               dataTran.Commit();
           }
       }

 

:)

 

Pour continuer dans mes questions !!! Comment obtenir la barre d'outils simplifiée (voir message ci dessus pour y accéder) de la commande "mtext" ?

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

Lien vers le commentaire
Partager sur d’autres sites

Encore un pb avec cette fameuse commande MTEXT !!

Avec le code que j'ai mis ci dessus, lorsque je lance la commande, le programme continu alors que l'utilisateur est encore dans l'éditeur de texte.

J'ai essayé plusieurs méthodes (isquiescent ou cette methode) pour lui dire d'attendre que la commande MTEXT soit terminée pour continuer le programme mais rien ne fonctionne correctement.

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Difficile de dire quoi que ce soit avec aussi peu d'informations. Tu parles depuis le début de boite de dialogue et le seul bout de code que tu montres est celui d'une commande.

Tu ne dis pas si la boite est modale ou modeless (ce que j'imagine).

Tu ne montres pas le contexte dans lequel la méthode qui appelle la commande MTEXT est lancée, ni comment elle est lancée, ni ce qui se passe après...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Oui, je comprend !

 

En fait, au départ j'avais créé une boite de dialogue modale (peut être une erreure ?) identique à celle d'AutoCAD (ATTDEF). Le but étant de récréer une boite de dialogue AutoCAD pour en comprendre les différents aspects.

 

J'ai recréé cette boite de dialogue mais je ne lui ai pas associé de code. J'ai créé une commande séparée pour recréer tous les cas possible de la création d'attributs. Chose réussit à 90%.

La seule chose que je n'arrive pas à recréer c'est la commande associée au bouton "texte multiple". Voilà le contexte.

 

J'espère que c'est assez clair. :) Merci.

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

Lien vers le commentaire
Partager sur d’autres sites

Pour compléter ce que je disais précedemment, voici ma boite de dialogue avec le code associé.

 

Comme dit précédemment, ce que je n'arrive à faire c'est les boutons : Mtext et champ. qui sont en face de la Textbox Defaut.

 

Merci d'avance. :)

CreateAttributes.zip

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

Lien vers le commentaire
Partager sur d’autres sites

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é