(gile) Posté(e) le 2 novembre 2008 Posté(e) le 2 novembre 2008 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
jalna Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 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 DammeMon forum : http://plexus.forumactif.org/
(gile) Posté(e) le 3 novembre 2008 Auteur Posté(e) le 3 novembre 2008 Merci jalna :) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bseb67 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 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...
(gile) Posté(e) le 3 novembre 2008 Auteur Posté(e) le 3 novembre 2008 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
pascal19 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 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.dllCommande: É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...
lili2006 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 Bonjour à toutes et tous, Pas de problème de mon coté non plus sur une V2008 et MAP 3D 2009, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 3 novembre 2008 Auteur Posté(e) le 3 novembre 2008 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
pascal19 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 Je suis sous windows XP en réseau (avec firewall pour accès internet) Version autocad local je n'ai pas vu la boite de dialogue.
jalna Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 Sur 2006 Message d'erreur:_.netload Nom du fichier d'assemblage: GetFileLisp.dllCommande: ; 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 DammeMon forum : http://plexus.forumactif.org/
Patrick_35 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 3 novembre 2008 Auteur Posté(e) le 3 novembre 2008 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.dllCommande: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
pascal19 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 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.dllCommande:Hello World! je suppose que c'est bon...
Patrick_35 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 3 novembre 2008 Auteur Posté(e) le 3 novembre 2008 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
pascal19 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 Attention le lien ne me télécharge pas GetFileLisp2.dll mais GetFileLisp.dllet même en le renomant ça me fait pareil que la première fois: .netload Nom du fichier d'assemblage: GetFileLisp.dllCommande: Échec de la demande d'autorisation de type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.nil a+
(gile) Posté(e) le 3 novembre 2008 Auteur Posté(e) le 3 novembre 2008 Effectivement le lien n'était pas bon, le code LISP non plus (décidément, les copier/coller...), c'est réparé. Merci encore pour ta patience. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
pascal19 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 désolé toujours pareil: _.netload Nom du fichier d'assemblage: GetFileLisp2.dllCommande: É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...
(gile) Posté(e) le 3 novembre 2008 Auteur Posté(e) le 3 novembre 2008 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
pascal19 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 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.dllCommande: Échec de la demande d'autorisation de type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.nil a+
(gile) Posté(e) le 3 novembre 2008 Auteur Posté(e) le 3 novembre 2008 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
(gile) Posté(e) le 3 novembre 2008 Auteur Posté(e) le 3 novembre 2008 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
pascal19 Posté(e) le 3 novembre 2008 Posté(e) le 3 novembre 2008 ok j'essaie demain en arrivant au bureau
(gile) Posté(e) le 3 novembre 2008 Auteur Posté(e) le 3 novembre 2008 Merci, pense à supprimer les autres DLLs que tu as chargées et enregistrées. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
pascal19 Posté(e) le 4 novembre 2008 Posté(e) le 4 novembre 2008 ok c'était bien ça, maintenant ça marchedésolé de t'avoir ralenti !a+
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