Aller au contenu

Messages recommandés

Posté(e)

Salut,

 

Je débute en .NET (C#) et j'essaye de créer de nouvelles fonctions LISP avec "LispFunction".

 

Mais j'aurais voulu connaître les compatibilités/incompatibilités avec les différentes versions d'AutoCAD, je propose donc à ceux qui le veulent bien de tester une fonction sur des versions autre que 2007 (sur laquelle ça fonctionne). Je crains que ça ne marche pas sur les versions antérieures...

 

Il s'agirait de télécharger ce fichier : GetFilesLisp.dll, de l'enregistrer dans un répertoire du chemin de recherche et de tester l'expression LISP suivante.

Si tout va bien vous devriez avoir une boite de dialogue qui s'ouvre dans la quelle vous pourrez sélectionnez plusieurs fichiers et après validation (OK) la liste des fichiers devrait s'afficher sur la ligne de commande.

Si ça ne marche pas ça devrait se limiter à message d'erreur sur la ligne de commande.

 

(if (findfile "GetFileLisp.dll")
 (progn
   (vl-cmdf "_.netload" "GetFileLisp.dll")
   (getfiles "C:\\" "Tous les fichiers|*.*" T)
 )
 (progn
   (princ "\nLe fichier \"GetFileLisp.dll\" est introuvable.")
   (princ)
 )
) 

 

Pour les lispeurs,

 

cette fonction essaye de combler une lacune de getfiled qui ne permet pas de sélectionner plusieurs fichiers.

Elle requiert 2 ou 3 arguments :

 

(getfiles repertoire filtre [multiple])

 

repertoire : le chemin du répertoire initial (un chemin non valide ou une chaîne vide ouvre sur le dernier répertoire utilisé)

 

filtre : La chaîne de filtre doit contenir une description du filtre, suivie d'une barre verticale (|) et du modèle du filtre. Les chaînes pour les différentes options de filtre doivent également être séparées par la barre verticale. Exemple : "Fichiers texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"

 

multiple : si spécifié et non nil permet des choix multiples.

 

 

Pour les DOTNETeurs (débutants)

 

Je donne le code (sûrement pas très brillant)

 

using System.Windows.Forms;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;

namespace GetFileLisp
{
   public class myClass
   {
       /* 
        * Fonction LISP getfiles
        * Ouvre une boite de dialogue permettant de choisir un ou plusieurs fichier
        * (getfiles repertoire filtre [multiple])
        *Exemple : 
        * (getfiles "C:\\" "Dessin (*.dwg)|*.dwg|Tous (*.*)|*.*" T)
        */

       [LispFunction("getfiles")]
       public static ResultBuffer GetFileDialog(ResultBuffer buff)
       {
           Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
           ResultBuffer result = new ResultBuffer();

           try
           {
               if (buff == null)
               {
                   ed.WriteMessage("Erreur: nombre d'arguments insuffisants\n");
                   return null;
               }

               TypedValue[] args = buff.AsArray();

               if (args.Length                 {
                   ed.WriteMessage("Erreur: nombre d'arguments insuffisants\n");
                   return null;
               }

               if (args.Length > 3)
               {
                   ed.WriteMessage("Erreur: nombre d'arguments trop important\n");
                   return null;
               }

               if (args[0].TypeCode != (int)LispDataType.Text)
               {
                   ed.WriteMessage("Erreur: type d'argument incorrect: stringp {0}\n", args[0].Value);
                   return null;
               }

               if (args[1].TypeCode != (int)LispDataType.Text)
               {
                   ed.WriteMessage("Erreur: type d'argument incorrect: stringp {0}\n", args[1].Value);
                   return null;
               }

               bool mult = ((args.Length == 3) && (args[2].TypeCode != (int)LispDataType.Nil)) ? true : false;

               OpenFileDialog openDialog = new OpenFileDialog();

               openDialog.InitialDirectory = (string)args[0].Value;
               openDialog.Filter = (string)args[1].Value;
               openDialog.FilterIndex = 1;
               openDialog.Multiselect = mult;

               if (openDialog.ShowDialog() == DialogResult.OK)
               {
                   if (mult)
                   {
                       string[] fileNames = openDialog.FileNames;

                       foreach (string file in fileNames)
                       {
                           result.Add(new TypedValue((int)LispDataType.Text, file));
                       }
                   }
                   else
                   {
                       string file = openDialog.FileName;
                       result.Add(new TypedValue((int)LispDataType.Text, file));
                   }

                   return result;
               }
               else return null;
           }

           catch (System.Exception ex)
           {
               ed.WriteMessage(ex.Message + "\n");
               return null;
           }
       }
   }
} 

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

Posté(e)

Salut Gile

 

Pas de soucis sous 2008

 

Bonne journée

"Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."

J-C Van Damme

Posté(e)

Ben idem pour ma mep2008,

on n'a plus de 2006 d'installée, et la 2009 je ne l'ai pas activée, donc elle ne marche plus.

 

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Merci bseb67,

 

Normalement, ça devrait donc fonctionner avec les versions 2007, 2008, 2009 (même format dwg, même compatibilité ObjectARX).

 

Reste à savoir si ça fonctionne avec les versions antérieures, et si ça fonctionnera toujours avec 2010 (probablement un nouveau format dwg et nouveau objectARX)...

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

Posté(e)

bonjour

 

moi sous 2007 j'ai ça:

 

Commande: (if (findfile "GetFileLisp.dll")

(_> (progn

((_> (vl-cmdf "_.netload" "GetFileLisp.dll")

((_> (getfiles "C:\\" "Tous les fichiers|*.*" T)

((_> )

(_> (progn

((_> (princ "\nLe fichier \"GetFileLisp.dll\" est introuvable.")

((_> (princ)

((_> )

(_> )

_.netload Nom du fichier d'assemblage: GetFileLisp.dll

Commande: Échec de la demande d'autorisation de type

'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0,

Culture=neutral, PublicKeyToken=b77a5c561934e089'.

nil

 

J'ai peut être pas fait comme il faut...

Posté(e)

Merci pascal 119, merci lili2006,

 

pascal119,

 

Ça semble être un problème d'autorisation d'accès aux fichiers, c'est pas gagné :casstet:

Pourrais tu donner quelques précisions :

- Vista ou XP ?

- Local ou réseau ?

- L'erreur est-elle survenue après le choix des fichiers ou n'as tu même pas vu la boite de dialogue ?

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

Posté(e)

Sur 2006

 

Message d'erreur:

_.netload Nom du fichier d'assemblage: GetFileLisp.dll

Commande: ; erreur: no function definition: GETFILES

"Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."

J-C Van Damme

Posté(e)

Bonjour

 

(gile), ta fonction fonctionne bien sur une 2009.

Je vois que tu as créé ta propre dll. Tu as pensé à regarder du coté de comdlg32.dll ?

 

Sinon, j'avais bien réussi quelque chose.

(setq she (vlax-create-object "userAccounts.CommonDialog"))
(setq a "Fichiers Texte|*.txt|Tous les fichiers|*.*")
(vlax-put-property she 'filter (vlax-make-variant a))
(vlax-put-property she 'filterindex 2)
(vlax-put-property she 'flags 512); --> (vlax-put-property she 'flags (+ 4 8 512 2048 4096 131072 524288 2097152))
(vlax-put-property she 'initialdir (getvar "dwgprefix"))
(if (eq (vlax-invoke she 'showopen) -1)
 (setq f (vlax-get-property she 'filename))
 (setq f nil)
)
(vlax-release-object she)

Mais cela ne m'a jamais donné entière satisfaction :casstet:

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci encore à tous pour m'avoir consacré un peu de temps.

 

Première conclusion :

"LispFunction" ne fonctionne qu'à partir de la version 2007 (je viens de le lire aussi sur un autre forum).

 

pascal19

 

Je te propose un nouvel essai avec une autre dll : LspHelloWorld.dll (la fonction LISP ne présente cette fois vraiment aucun intérêt), mais ça me permettrait de voir si l'erreur est au chargement de la dll ou à son exécution.

 

Même manip avec l'expression suivante :

(if (findfile "GetFileLisp.dll")
 (progn
   (vl-cmdf "_.netload" "LspHelloWorld.dll")
   (hello)
 )
 (progn
   (princ "\nLe fichier \"GetFileLisp.dll\" est introuvable.")
   (princ)
 )
) 

 

Sur la ligne de commande, tu devrais avoir ça:

Commande: (if (findfile "GetFileLisp.dll")

(_> (progn

((_> (vl-cmdf "_.netload" "LspHelloWorld.dll")

((_> (hello)

((_> )

(_> (progn

((_> (princ "\nLe fichier \"GetFileLisp.dll\" est introuvable.")

((_> (princ)

((_> )

(_> )

_.netload Nom du fichier d'assemblage: LspHelloWorld.dll

Commande:

Hello World!

 

 

Patrick_35,

 

J'avais déjà vu et utilisé ta "FileBox", mais comme tu dis les résultats pour une sélection multiple sont très moyens, tant du point de vue de l'interface que du retour.

De plus j'ai lu que cette méthode ne fonctionne pas avec Vista.

C'était donc pour moi autant un exercice que d'une réelle utilité, les problèmes de compatibilité restant présents.

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

Posté(e)

ok là j'ai

 

Commande: (if (findfile "GetFileLisp.dll")

(_> (progn

((_> (vl-cmdf "_.netload" "LspHelloWorld.dll")

((_> (hello)

((_> )

(_> (progn

((_> (princ "\nLe fichier \"GetFileLisp.dll\" est introuvable.")

((_> (princ)

((_> )

(_> )

_.netload Nom du fichier d'assemblage: LspHelloWorld.dll

Commande:

Hello World!

 

je suppose que c'est bon...

Posté(e)

Re

 

(gile)

Avec ces flags, l'interface est plus sympa

(vlax-put-property she 'flags (+ 4 8 512 2048 4096 131072 524288 2097152))

 

Mais les résultats :o

 

Tu as aussi la possibilité d'utiliser doslib avec la fonction getfilem, ou encore avec la fonction des express-tools

(acet-ui-getfile "Choix du fichier texte" "un_fichier" "txt;*" "" 4096), mais son résultat n'est pas probant.

 

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci Patrick_35,

 

Les express semble utiliser le même ActiveX, avec les mêmes résultats :(

 

Doslib présente les mêmes inconvénients de compatibilité, même s'il y a des possibilités avec les versions antérieures à 2007.

 

Et de toutes façon, je suis têtu comme un breton ;) , je veux arriver à apprendre un peu de C#.

 

 

pascal19,

 

je te propose, si tu as le temps, un nouvel essai.

J'ai essayé d'ajouter une "permission" pour l'accès aux fichiers, une nouvelle dll, donc : GetFileLisp2.dll avec la même procédure que la première fois :

 

(if (findfile "GetFileLisp2.dll")
(progn
(vl-cmdf "_.netload" "GetFileLisp2.dll")
(getfiles "C:\\" "Tous les fichiers|*.*" T)
)
(progn
(princ "\nLe fichier \"GetFileLisp2.dll\" est introuvable.")
(princ)
)
) 

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

Posté(e)

Attention le lien ne me télécharge pas GetFileLisp2.dll mais GetFileLisp.dll

et même en le renomant ça me fait pareil que la première fois:

 

.netload Nom du fichier d'assemblage: GetFileLisp.dll

Commande: Échec de la demande d'autorisation de type

'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0,

Culture=neutral, PublicKeyToken=b77a5c561934e089'.

nil

 

a+

Posté(e)

désolé toujours pareil:

 

_.netload Nom du fichier d'assemblage: GetFileLisp2.dll

Commande: Échec de la demande d'autorisation de type

'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0,

Culture=neutral, PublicKeyToken=b77a5c561934e089'.

nil

 

Mais ça doit venir de chez nous...

Posté(e)

Une dernière tentative, avant d'appeler au secours :P

 

Il y a sûrement sur ton poste un paramétrage qui empêche l'accès aux fichiers, je cherche juste à lire leur chemin complet.

 

GetFileLisp3.dll

 

(if (findfile "GetFileLisp3.dll")
(progn
(vl-cmdf "_.netload" "GetFileLisp3.dll")
(getfiles "C:\\" "Tous les fichiers|*.*" T)
)
(progn
(princ "\nLe fichier \"GetFileLisp3.dll\" est introuvable.")
(princ)
)
) 

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

Posté(e)

Vraiement désolé mais tjs pareil:

 

Commande: (if (findfile "GetFileLisp3.dll")

(_> (progn

((_> (vl-cmdf "_.netload" "GetFileLisp3.dll")

((_> (getfiles "C:\\" "Tous les fichiers|*.*" T)

((_> )

(_> (progn

((_> (princ "\nLe fichier \"GetFileLisp3.dll\" est introuvable.")

((_> (princ)

((_> )

(_> )

_.netload Nom du fichier d'assemblage: GetFileLisp3.dll

Commande: Échec de la demande d'autorisation de type

'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0,

Culture=neutral, PublicKeyToken=b77a5c561934e089'.

nil

 

a+

Posté(e)

C'est pas grave, merci beaucoup pour ta patience.

 

Je voulais faire tout seul, comme un grand, mais je suis décidément trop débutant, je vais demander de l'aide...

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

Posté(e)

D'après les retours que j'ai pu avoir, le problème semblerait venir du fait que tu es en réseau.

 

As tu mis les DLL sur le serveur ou sur ton poste ?

 

Si tu les a mis sur le serveur, le problème pourrait venir de là. Il faudrait alors paramétrer le réseau pour autoriser leur lancement.

 

Sinon, tu peux enregistrer la DLL sur ton poste (où tu veux mais en local), entre NETLOAD à la ligne de commande, ouvrir le fichier depuis la boite de dialogue et enfin essayer :

 

(getfiles "C:\\" "Tous les fichiers|*.*" T)

 

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

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é