Aller au contenu

[Résolu] Charger une fonction si elle ne l'est pas.


Messages recommandés

Posté(e)

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!

Posté(e)

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

Posté(e) (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é par VDH-Bruno

Apprendre => Prendre => Rendre

Posté(e)

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

Posté(e)

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!

Posté(e)

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

Posté(e)

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

Posté(e)

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. :rolleyes:

 

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

Posté(e)

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

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é