PhilBat Posté(e) le 29 novembre 2012 Posté(e) le 29 novembre 2012 Bonjouren lançant depuis autoCAD une commande compilée en dllexemple TOTO.dll suivant le code Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Namespace Toto Public Class Toto <CommandMethod("Toto")> _ Public Sub Toto() ..... End Sub End Class End Namespace je voudrais passer des arguments supplémentaires de type Boolean ou String depuis AutoCAD.Est ce possible et comment faire ?MerciPhil
Maxence DELANNOY Posté(e) le 29 novembre 2012 Posté(e) le 29 novembre 2012 Tu ne peux pas passer d'argument à une commande. Tu dois demander des saisies à l'utilisateur via les différentes méthodes Get* de la classe Editor : GetKeywords pour un booléen (avec Oui/Non comme mots clés) ou GetString pour une chaîne de caractères. Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
bazoul Posté(e) le 29 novembre 2012 Posté(e) le 29 novembre 2012 Tu peux éventuellement te saisir d'un lisp pour demander les paramètres nécessaire a ta fonction ... <Autodesk.AutoCAD.Runtime.LispFunction("Toto")> _ Public Function Toto(ByVal rb As Autodesk.AutoCAD.DatabaseServices.ResultBuffer) As String Dim args() As TypedValue 'Traitement args = rb.AsArray return "Test" End Function et dans le lisp tu appel la fonction de ta dll avec les paramètres : (setq Result (Toto Param1 Param2)) 1
krunch Posté(e) le 30 novembre 2012 Posté(e) le 30 novembre 2012 Sinon j'utilisais une autre méthode pour passer des arguments au VBA : en passant par une variable USER (par contre je ne sais pas comment on la récupère en C# ..) Je suis arrivé ici pour le même problème, donc pour confirmation :Tu ne peux pas passer d'argument à une commandeContrairement à une commande native on ne peut pas passer d'argument à une commande compilée et l'appeler avec (command) ou (vl-cmdf) c'est bien ça ?Du coup dans le cas où je ne peux pas faire un appel de commande Lisp il n'y a plus de solution ?
(gile) Posté(e) le 30 novembre 2012 Posté(e) le 30 novembre 2012 Contrairement à une commande native on ne peut pas passer d'argument à une commande compilée et l'appeler avec (command) ou (vl-cmdf) c'est bien ça ?Du coup dans le cas où je ne peux pas faire un appel de commande Lisp il n'y a plus de solution ? Non les commandes définies en .NET sont comme les commandes natives. On peut les appeler en LISP avec commmand ou vl-cmdf et leur passer en argument les "options" de la commande.Tout comme on peut les appeler en .NET avec SendstringToExecute() (dans ce cas, le nom de la commande et les options doivent être contenues dans une seule chaine) ou en utilisant P/invoke avec la méthode non managée acedCmd (dans ce cas nom de commande et options doivent être contenues dans un ResultBuffer). Par contre, la méthode qui définit une commande ne peut pas avoir d'arguments, de même, cette méthode doit toujours retourner void (être une Sub en VB). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Maxence DELANNOY Posté(e) le 30 novembre 2012 Posté(e) le 30 novembre 2012 Sinon j'utilisais une autre méthode pour passer des arguments au VBA : en passant par une variable USER (par contre je ne sais pas comment on la récupère en C# ..) string user1 = Application.GetSystemVariable("USER1"); Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
krunch Posté(e) le 30 novembre 2012 Posté(e) le 30 novembre 2012 On peut les appeler en LISP avec commmand ou vl-cmdf et leur passer en argument les "options" de la commandeDonc pour revenir à la question de PhilBat on peut faire ?(command "toto")(command arg)(command "") ou (command "toto arg ") Sinon j'ai bien compris que dans le cas où la dll décrit une commande Lisp on peut aussi faire :(command "(toto arg)")Mais je suis dans un (rare) cas où l'appel d'une fonction Lisp avec command est impossible (depuis un interface OpenDCL). string user1 = Application.GetSystemVariable("USER1");Merci. Pour le moment j'essaie de simplifier car dans le cas où l'argument est une liste d'objets c'est moins simple ..
krunch Posté(e) le 30 novembre 2012 Posté(e) le 30 novembre 2012 Finalement je n'ai pas compris si on pouvait ou pas .. Tu ne peux pas passer d'argument à une commande.Non les commandes définies en .NET sont comme les commandes natives. On peut les appeler en LISP avec commmand ou vl-cmdf et leur passer en argument les "options" de la commandeSi oui y a t-il un exemple de commande avec input ?
(gile) Posté(e) le 30 novembre 2012 Posté(e) le 30 novembre 2012 Il suffit que dans la méthode il y ait un (ou plusieurs) PromptResult. Exemple. Une commande définie en .NET qui demande à l'utilisateur un point et une distance et crée un cercle avec le point comme centre et le distance comme rayon.La méthode Test ne peut pas avoir d'arguments (et ne retourne rien). [CommandMethod("Test")] public void Test() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; PromptPointResult ppr = ed.GetPoint("\nCentre: "); if (ppr.Status != PromptStatus.OK) return; PromptDistanceOptions pdo = new PromptDistanceOptions("\nRayon: "); pdo.UseBasePoint = true; pdo.BasePoint = ppr.Value; PromptDoubleResult pdr = ed.GetDistance(pdo); if (pdr.Status != PromptStatus.OK) return; using (Transaction tr = db.TransactionManager.StartTransaction()) { using (Circle c = new Circle(ppr.Value.TransformBy(ed.CurrentUserCoordinateSystem), Vector3d.ZAxis, pdr.Value)) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); btr.AppendEntity(c); tr.AddNewlyCreatedDBObject(c, true); } tr.Commit(); } } On peut appeler cette commande en LISP avec command ou vl-cmdf en lui passant les valeurs pour le centre et le rayon sous forme d'expressions LISP :(command "test" '(10 20) 40)On peut aussi l'appeler en .NET avec SendStringToExecute() (ou en COM avec SendCommand) en lui passant une chaîne contenant les entrées (scripting) :Application.DocumentManager.MdiActiveDocument.SendStringToExecute("test 10,20 40 ", false, false, false); Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 30 novembre 2012 Posté(e) le 30 novembre 2012 Sinon j'ai bien compris que dans le cas où la dll décrit une commande Lisp on peut aussi faire :(command "(toto arg)")Mais je suis dans un (rare) cas où l'appel d'une fonction Lisp avec command est impossible (depuis un interface OpenDCL). Si tu as défini une fonction LISP en .NET, tu n'as pas besoin d'utiliser la fonction LISP command, tu l'appeler comme n'importe quelle autre fonction LISP.(toto arg) Comme pour les commandes définies en .NET, les fonctions LISP définies en .NET sont vues par AutoCAD comme des fonction natives. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
krunch Posté(e) le 30 novembre 2012 Posté(e) le 30 novembre 2012 Merci (gile) je vais voir comment je peux utiliser ça. Tel quel j'ai juste une erreur "Le nom 'Vector3d' n'existe pas dans le contexte actuel" (il manque un using ou est-ce à cause de 2010 ?) mais ça devrait me permettre de décortiquer le input. Si tu as défini une fonction LISP en .NET, tu n'as pas besoin d'utiliser la fonction LISP command, tu l'appeler comme n'importe quelle autre fonction LISP.(toto arg) Bien sûr, mais là c'est pour un cas très spécifique : j'essaie de faire marcher le highlight_nested (toujours le même) depuis une fenêtre modale OpenDCL.Or avec un appel Lisp normal ça ne marche pas (tant que je ne ferme pas la fenêtre), mais je constate qu'un redraw normal peut quand même marcher (si non-nested) .. Alors je voudrais faire un essai rapide avec un appel (command ..) au cas où ... Voilà, c'est spécifique.
(gile) Posté(e) le 30 novembre 2012 Posté(e) le 30 novembre 2012 Tel quel j'ai juste une erreur "Le nom 'Vector3d' n'existe pas dans le contexte actuel" (il manque un using ou est-ce à cause de 2010 ?) mais ça devrait me permettre de décortiquer le input. L'espace de nom est : autodes..AutoCAD.Geometry Dans un cas comme, fais toi aider de Visual Studio : clique sur Vector3d et déroule le menu contextuel de l'intellisence, il te proposera d'ajouter l'espace de nom ou de mettre le nome complet. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
krunch Posté(e) le 1 décembre 2012 Posté(e) le 1 décembre 2012 Dans un cas comme, fais toi aider de Visual Studio : clique sur Vector3d et déroule le menu contextuel de l'intellisenceOk compris J'arrive à faire marcher les appels.D'après ce que je comprends c'est le return qui remplace le GetXX effectif par les arguments, mais pour autant on ne peut pas se passer du prompt/GetXX dans ce cas.. Donc ça marche bien avec un appel (command "toto" arg), on peut toujours mettre un NOMUTT pour éviter le message du GetXX ("" au minimum). Par contre depuis une boite modale (DCL/oDCL) le GetXX perturbe trop le système, ça fait des trucs pas catholiques et ça bloque le système ... Merci pour tes réponses
(gile) Posté(e) le 1 décembre 2012 Posté(e) le 1 décembre 2012 J'essayais juste de répondre à PhilBat (qui ne donne pas de nouvelles) et aux commentaires qui ont suivi et là, j'ai l'impression qu'on s'éloigne et je ne vois plus trop quelle est la demande. Dans tous les cas, krunch, tu me sembles emprunter des chemins bien tortueux : LISP + ODCL + .NET, mélange d'appels de commandes et de fonctions LISP... À mon avis, si touches un peu au .NET, tu devrais assez vite pouvoir te passer d'ODCL pour tes dialogues (et donc te libérer des curieuses contraintes que tu décris) et les définir en .NET dans des fonctions LISP, puis finalement ne presque plus utiliser le LISP. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
krunch Posté(e) le 1 décembre 2012 Posté(e) le 1 décembre 2012 Ma demande correspondait à la demande initiale et tu y as répondu. À mon avis, si touches un peu au .NET, tu devrais assez vite pouvoir te passer d'ODCL pour tes dialoguesPourquoi pas effectivement, j'ai regardé le module Application Windows Forms et l'aide en ligne est plutôt bien faite pour les débutants, ça peut être une entrée ...
PhilBat Posté(e) le 3 décembre 2012 Auteur Posté(e) le 3 décembre 2012 Bonjour à tousMerci pour vos réponsesMais je suis un peu perdu.En attendant, j'ai adopté une solution simple mais efficace.Comme mon programme utilise un fichier pour s'initialiser, qui est d'ailleur ecrit en lisp.je l'exploite pour passer des données d'un dll à un autre.Je pensais qu'il était possible de lancer facilement une commande dll sous autocad avec passage d'arguments, mais je vois que non.A bientôtPhil
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