alala Posté(e) le 11 février 2013 Posté(e) le 11 février 2013 Bonjour, mon petit soucis du jour est simple, mais je ne trouve pas la solution. J'ai créer un menu, et ce menu fait appel à un certain nombre de LISP. Je souhaiterais que ces LISp ne soient chargés que si il est vraiment nécessaire.Je ne les ait donc pas mis dans les applications chargés au démarage. J'ai tenté :(if (not (c:MonAppli)) (load 'MonAppli) )Puis de "capturer" l'erreur :(if (vl-catch-all-error-p(vl-catch-all-apply 'MonAppli '())) (load 'MonAppli) ) mais je reçoit dans tous les cas l'erreur :erreur: fonction incorrecte: Avec vous une solution à cela? Sachant que je fait cela autant pour réduire le temps de chargement d'un plan sur Autocad que pour être sur que l'utilisateur ne s'embéte pas à gérer les appli chargés ou non. Merci d'avance. C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
vincentp010 Posté(e) le 11 février 2013 Posté(e) le 11 février 2013 Salut, regarde dans l'aide autocad, la commande autoload The following causes AutoCAD to load the bonusapp.lsp file the first time the APP1, APP2, or APP3 commands are entered at the Command prompt: (autoload "BONUSAPP" '("APP1" "APP2" "APP3")) A mettre dans un lisp perso chargé au démarrage, ou dans acaddoc.lsp Aide au téléchargement du cadastre dgfip-download-helper Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0 Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js
alala Posté(e) le 11 février 2013 Auteur Posté(e) le 11 février 2013 Superbe!Merci beaucoup! C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
VDH-Bruno Posté(e) le 11 février 2013 Posté(e) le 11 février 2013 (modifié) Bonjour, Pour compléter la réponse de vincentp010 qui a été le plus rapide ;) Le code lisp de la fonction autoload, tel qu’elle est définit dans le fichier acadxxxdoc.lsp dans le répertoire support d’AutoCAD (si cela n’a pas changé depuis la version 2007). Extrait du fichier acadxxxdoc.lsp: (defun ai_ffile (app) (or (findfile (strcat app ".lsp")) (findfile (strcat app ".exp")) (findfile (strcat app ".exe")) (findfile (strcat app ".arx")) (findfile app) ) ) (defun ai_nofile (filename) (princ (strcat "\nLe fichier" filename "(.lsp/.exe/.arx) n'a pas été trouvé dans les dossiers du chemin de recherche." ) ) (princ "\nVérifiez l'installation des fichiers de support et réessayez.") (princ) ) (defun _autoload (app) ; (princ "Auto:(load ") (princ app) (princ ")") (terpri) (load app) ) (defun _autoqload (quoi app cmdliste / qapp symnam) (setq qapp (strcat "\"" app "\"")) (setq initstring "\nInitialisation...") (mapcar '(lambda (cmd / nom_cmd) (progn (setq nom_cmd (strcat "C:" cmd)) (if (not (eval (read nom_cmd))) (eval (read (strcat "(defun " nom_cmd "( / rtn)" "(setq m:err *error* *error* *merrmsg*)" "(if (ai_ffile " qapp ")" "(progn (princ initstring)" "(_auto" quoi "load " qapp ") (setq rtn (" nom_cmd ")))" "(ai_nofile " qapp "))" "(setq *error* m:err m:err nil)" "rtn)" )))))) cmdliste) nil ) (defun autoload (app cmdliste) (_autoqload "" app cmdliste) ) A+ (Ps: Edit ajouté fonction _autoload) Modifié le 11 février 2013 par VDH-Bruno Apprendre => Prendre => Rendre
bryce Posté(e) le 11 février 2013 Posté(e) le 11 février 2013 Bonjour, J'ai tenté :(if (not (c:MonAppli)) (load 'MonAppli) ) Il faudrait plutôt ceci : (if (not c:MonAppli) (load "MonAppli"))ou(or c:MonAppli (load "MonAppli")) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
VDH-Bruno Posté(e) le 11 février 2013 Posté(e) le 11 février 2013 Bonjour, Il faudrait plutôt ceci : (if (not c:MonAppli) (load "MonAppli"))ou(or c:MonAppli (load "MonAppli")) Oui bien vu la correction, mais la tu charges systématiquement la fonction en mémoire même si elle n’est jamais lancé.. Si on voulait faire sans autoload, il faudrait (comme pour ce dernier qui le fait de manière générique) écrire le chargement de la fonction dans sa définition… Comme ceci par exemple : (defun c:MonAppli () (princ "\nInitialisation...") (cond ((eq "" (load "MonAppli" "")) (princ "\nAbandon: Echec au chargement de la fonction MonAppli!!!") (princ) ) ((c:MonAppli)) ) ) A+ Apprendre => Prendre => Rendre
alala Posté(e) le 11 février 2013 Auteur Posté(e) le 11 février 2013 Bonjour, Il faudrait plutôt ceci : (if (not c:MonAppli) (load "MonAppli"))ou(or c:MonAppli (load "MonAppli"))Alors la je suis tout perturbé!Mour moi "c:MonAppli" est une fonction.Et une fonction se place entre parenthéses.D'ou mon (not(c:MonAppli)) et pas (not c:MonAppli) Très intéressant sinon le acadxxxdoc.lsp Merci à vous tous. C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
VDH-Bruno Posté(e) le 11 février 2013 Posté(e) le 11 février 2013 Alors la je suis tout perturbé!Mour moi "c:MonAppli" est une fonction.Et une fonction se place entre parenthéses.D'ou mon (not(c:MonAppli)) et pas (not c:MonAppli) Re,Prenons un exemple concret définissons mon appli comme suit :(defun c:MonAppli () (alert "Bonjour..")) Lorsque cette fonction est chargé, j’affecte au nom de symbole c:MonAppli une définition de fonction au moyen de defun, comme on le ferait avec setq pour une variable .Donc (not c:MonAppli) évalue si le symbole est affecté d’une valeur comme tu le ferai pour une variable et (c:MonAppli) lance la fonction. Avant chargement de la fonction vaut nil_$ c:MonAppli nil Après chargement l’évaluation de son symbole est : _$ c:MonAppli #<USUBR @0f75a564 C:MONAPPLI> A+ Apprendre => Prendre => Rendre
bryce Posté(e) le 11 février 2013 Posté(e) le 11 février 2013 Oui bien vu la correction, mais la tu charges systématiquement la fonction en mémoire même si elle n’est jamais lancé.. D'après l'énoncé du problème, je pense que c'est destiné à être lancé depuis un menu, ou une macro de bouton du genre: (if (or c:MonAppli (load "MonAppli")) (c:MonAppli) ) et dans ce cas le lisp est chargé si besoin lors de l'utilisation du menu ou du bouton. ;) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
VDH-Bruno Posté(e) le 11 février 2013 Posté(e) le 11 février 2013 D'après l'énoncé du problème, je pense que c'est destiné à être lancé depuis un menu, ou une macro de bouton du genre: Bah ! Comme quoi a un problème donné, il y a plusieurs niveau de lecture, personnellement j’avais plus en tête un fichier mnl pour le chargement des lisp associés au menu. alala Sinon pour ton questionnement sur les affectations et nom de symbole, si ça peut aider un lien dans lequel, j’essayai de démontrer qu’il n’y avait pas de différence dans les mécanismes d’affectations entre setq et defun (ou defun-q) .http://cadxp.com/index.php?/topic/31173-programmer-sans-defun/ A+ Apprendre => Prendre => Rendre
Patrick_35 Posté(e) le 11 février 2013 Posté(e) le 11 février 2013 Salut Et pour compléter ce qu'indique Bruno, un petit tour sur defun-q D'après l'énoncé du problème, je pense que c'est destiné à être lancé depuis un menu, ou une macro de bouton du genre: (if (or c:MonAppli (load "MonAppli")) (c:MonAppli) ) et dans ce cas le lisp est chargé si besoin lors de l'utilisation du menu ou du bouton. ;)Sauf si tu lances la commande directement depuis le clavier. Alors, Autoload est la solution. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
alala Posté(e) le 11 février 2013 Auteur Posté(e) le 11 février 2013 Merci beaucoup pour toutes ces réponses très intéressantes.Je vais allez étudier un peu les liens que vous avez mis. Pour mon cas particulier Autoload fonctionne à la perfection, que ce soit pour l'appel des fonctions en ligne de commande ou via le menu. Mon menu est un MNS généré par une routine qui le charge à chaque plan ouvert pour mettre tout le menu à jour systématiquement et ceux sur tous les postes qui utilisen le lisp qui crée ce menu.C'est un poil lourd mais je planche sur une méthode de contrôle de la version du menu pour palier à cela. Pour les autres proposition elle fontionnent également, mais uniquement dans un des deux cas (menu), ce qui est bien, mais finalement moins adapté à l'utilisation que l'on pourrait avoir. Encore merci, grâce à vous j'en apprend tous les jours un peu plus sur ce langage qui, me parrais de plus en plus spécial, mais également de plus en plus intéressant. C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
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