Goldorak44 Posté(e) le 8 avril 2014 Posté(e) le 8 avril 2014 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 CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
-Olivier- Posté(e) le 8 avril 2014 Posté(e) le 8 avril 2014 Bonjour Goldorak44,Je ne suis pas suffisamment expérimenté en lisp pour répondre directement à la question, mais j'aurais tendance à passer par un chemin détourné. Relire les propriétés du dernier objet créé. Je suis curieux de la réponse... Olivier
Goldorak44 Posté(e) le 8 avril 2014 Auteur Posté(e) le 8 avril 2014 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 CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
-Olivier- Posté(e) le 8 avril 2014 Posté(e) le 8 avril 2014 Désolé, j'ai mal lu la rubrique. Je retourne me coucher. -_-
Maxence DELANNOY Posté(e) le 8 avril 2014 Posté(e) le 8 avril 2014 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 DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
(gile) Posté(e) le 8 avril 2014 Posté(e) le 8 avril 2014 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
Goldorak44 Posté(e) le 9 avril 2014 Auteur Posté(e) le 9 avril 2014 Merci à vous deux, je vais regarder tout ça et je revien poser les questions !! ;) PIRO CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
Goldorak44 Posté(e) le 9 avril 2014 Auteur Posté(e) le 9 avril 2014 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 CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
Goldorak44 Posté(e) le 9 avril 2014 Auteur Posté(e) le 9 avril 2014 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 CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
Goldorak44 Posté(e) le 11 avril 2014 Auteur Posté(e) le 11 avril 2014 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 CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
(gile) Posté(e) le 11 avril 2014 Posté(e) le 11 avril 2014 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
Goldorak44 Posté(e) le 11 avril 2014 Auteur Posté(e) le 11 avril 2014 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 CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
Goldorak44 Posté(e) le 14 avril 2014 Auteur Posté(e) le 14 avril 2014 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 CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
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