Aller au contenu

Argument pour un dll


PhilBat

Messages recommandés

Bonjour

en lançant depuis autoCAD une commande compilée en dll

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

Merci

Phil

Lien vers le commentaire
Partager sur d’autres sites

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

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))

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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 commande

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

On peut les appeler en LISP avec commmand ou vl-cmdf et leur passer en argument les "options" de la commande

Donc 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 ..

Lien vers le commentaire
Partager sur d’autres sites

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 commande

Si oui y a t-il un exemple de commande avec input ?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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.

 

intellisense.png

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

Lien vers le commentaire
Partager sur d’autres sites

Dans un cas comme, fais toi aider de Visual Studio : clique sur Vector3d et déroule le menu contextuel de l'intellisence

Ok 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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 dialogues

Pourquoi 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 ...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous

Merci pour vos réponses

Mais 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ôt

Phil

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é