harksin Posté(e) le 22 novembre 2012 Posté(e) le 22 novembre 2012 Bonjour, je souhaite lancé un lisp toute les 10 minute environ cela est il possible en lisp? si oui par quel procédé? Si'il ne le permet pas, le C# en est il capable? Je cherche a écrire un petit daemon qui ferai un sauvegarde incrementale adapté a mes besoin. Merci d'avance pour vos conseil ou idée Cordialement Harksin
krunch Posté(e) le 23 novembre 2012 Posté(e) le 23 novembre 2012 En Lisp il n'y a pas de réacteur qui assure ce genre de déclenchement. Perso j'utiliserais le réacteur :vlr-commandEnded pour comparer une variable basée sur le timer .. mais sachant que le programme ne sera pas déclenché tant que l''utilisateur n'utilise pas de commande.
Patrick_35 Posté(e) le 23 novembre 2012 Posté(e) le 23 novembre 2012 Salut Je cherche a écrire un petit daemon qui ferai un sauvegarde incrementale adapté a mes besoin.Tu peux te servir du réacteur vlr-dwg-reactor avec l'évenement vlr-saveComplete.Cela fonctionne-t-il aussi avec l'enregistement automatique ? A voir. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
harksin Posté(e) le 27 novembre 2012 Auteur Posté(e) le 27 novembre 2012 Bonsoir, donc a partir de vos remarques, j'ai tenté cette ebauche maleureusement non concluente. ma fonction lisp semble ne pas se lancer. Avez vous des conseils à me donner pour rendre ce code efficient? note @patric_35 le but de cet essaiserai de pouvoir vérifier que la commende s'execute AUSSI lors de la sauvegarde automatique d'autocad. Merci d'avance HK ;autosave (vl-load-com) (vlr-dwg-reactor "Save Complete" '((:vlr-savecomplete . I-save ))) ;procedure de sauvegarde (defun I-save () (setvar "filedia" 0) (setq REP_FS "C:/Z_ISAVE/") (VL-CMDF "sauvegrd" (strcat REP_FS (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 4) ) (menucmd "M=$(edtime,$(getvar,date), YYYY-MO-DD-HH-MM-SS)") ;transforme la date et la compile et anné anné mois jour heure mis seconde ".dwg" ) ) (setvar "filedia" 1) )
(gile) Posté(e) le 27 novembre 2012 Posté(e) le 27 novembre 2012 Salut, On ne peut pas appeler les fonctions command ou vl-cmdf depuis la fonction de retro action (callback) d'un réacteur.Une solution pourrait être de renommer le fichier .bak créé à chaque sauvegarde en s'assurant que la variable ISAVEBAK soit à 1 (faisable avec l'évènement :vlr-beginSave). (vl-load-com) (vlr-dwg-reactor nil '((:vlr-beginSave . beginSave) (:vlr-saveComplete . saveComplete) ) ) (defun beginSave (rea lst) (setvar 'isavebak 1) ) (defun saveComplete (rea lst) (setq base (strcat (getvar 'dwgprefix) (vl-filename-base (cadr lst)))) (vl-file-rename (strcat base ".bak") (strcat base (menucmd "M=$(edtime,$(getvar,date),_YYYY-MO-DD-HH-MM-SS)") ".dwg" ) ) ) Dans tous les cas, la sauvegarde automatique ne déclenche pas l'évènement :vlr-saveComplete.J'ai un peu essayé de voir en .NET pour utiliser un Timer mais pour l'instant je n'ai pas réussi à faire quelque chose de stable (conflit entre le thread sur lequel s'exécute AutoCAD et celui sur lequel s'exécute le Timer). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bryce Posté(e) le 27 novembre 2012 Posté(e) le 27 novembre 2012 Bonjour, Dans tous les cas, la sauvegarde automatique ne déclenche pas l'évènement :vlr-saveComplete.Apparemment si, chez moi le code suivant fonctionne : ;autosave (vl-load-com) (vlr-dwg-reactor "Save Complete" '((:vlr-savecomplete . I-save ))) ;procedure de sauvegarde (setq REP_FS "C:/Z_ISAVE/") (defun I-save ( reac data / fichier ) (setq fichier (cadr data)) (if (= (strcase (vl-filename-extension fichier)) ".SV$") (progn (or *acdoc* (setq *acdoc* (vla-get-activedocument (vlax-get-acad-object)))) (setq fichier (vl-filename-base (getvar 'dwgname))) (if (= "-" (substr fichier (- (strlen fichier) 2) 1)) (setq fichier (substr fichier 1 (- (strlen fichier) 20))) ) (vla-saveas *acdoc* (strcat REP_FS fichier (menucmd "M=$(edtime,$(getvar,date),_YYYY-MO-DD-HH-MM-SS)") ".dwg" ) ) ) ) ) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
(gile) Posté(e) le 27 novembre 2012 Posté(e) le 27 novembre 2012 Effectivement, j'avais regardé un peu vite...Il y a donc là une piste en LISP 'pur'. Je donne quand même ce que j'ai fini par arriver à faire en .NET qui essaye d'être plus polyvalent. Il s'agit de deux fonctions LISP (AutoCAD 2011 à 2013): gc-TimerOn lance un Timer qui exécutera la fonction LISP spécifiée à intervalles réguliers en fonction du temps spécifié.Requiert deux arguments : le nom de la fonction* sous forme de chaîne et le nombre de secondes de l'intervalle auquel exécuter la fonction.gc-TimerOff arrête le Timer.* la fonction ne doit avoir aucun argument et être soit préfixée avec 'c:' ; soit être enregistrée avec vl-acad-defun. Exemple :;; La fonction à exécuter : (defun c:foo () (alert "DRRRING!!!") (princ)) ;; Expression pour exécuter la fonction toutes les 20 secondes : (gc-TimerOn "c:foo" 20)ou :;; La fonction à exécuter : (defun foo () (alert "DRRRING!!!") (princ)) (vl-acad-defun 'foo) ;; Expression pour exécuter la fonction toutes les 20 secondes : (gc-TimerOn "foo" 20) LispTimer.zip contient LispTimer_2011.dll (A2011 et A2012) et lispTimer_2013.dll (A2013) Pour la demande de harksin, avec un lancement automatique dans chaque document, il faudrait copier dans un fichier de chargement automatique (acaddoc.lsp ou mnl) les expressions suivantes :;; Charger la dll (command "netload" "LispTimer_2011.dll") ;; Lancer le Timer pour exécuter autosave toutes les 10mn (gc-timeron "autosave" 600) ;; Fonction de sauvegarde (renomme et déplace les fichiers bak créés à chaque sauvegarde) (defun autosave (/ dir base files index filename isavebak) (vl-load-com) (if (< 0 (getvar 'dbmod)) (progn (setq isavebak (getvar 'isavebak)) (setvar 'isavebak 1) (vla-Save (vla-get-ActiveDocument (vlax-get-acad-object))) (or (vl-file-directory-p "C:\\Z_ISAVE\\") (vl-mkdir "C:\\Z_ISAVE\\")) (setq base (vl-filename-base (getvar 'dwgname)) bak (strcat (getvar 'dwgprefix) base ".bak") filename (strcat "C:\\Z_ISAVE\\" base (menucmd "M=$(edtime,$(getvar,date),_YYYY-MO-DD-HH-MM-SS)") ".dwg" ) ) (vl-file-rename bak filename) (alert (strcat "Fichier enregistré sous :\n" filename)) ) ) ) (vl-acad-defun 'autosave) Le code C# et un autre exemple (futile) d'utilisation ici. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
harksin Posté(e) le 28 novembre 2012 Auteur Posté(e) le 28 novembre 2012 La proposition de bryce marche effectivement, néanmoins celle de gille corespond plus a mon besoin dans le sens ou elle effectue une sauvegarde discrete.(je l'esserai ce soir) pour le code de bryce, est il possible de remplace le Vl-saveas par une autre commande semblable a "sauvegrd"? Petite question pourquoi "vl-saveas" placé dans l'aide autocad ne renvoie aucun resultat? Bonne journée et merci pour vos proposition HK
VDH-Bruno Posté(e) le 28 novembre 2012 Posté(e) le 28 novembre 2012 Bonjour, Petite question pourquoi "vl-saveas" placé dans l'aide autocad ne renvoie aucun resultat?Problème de syntaxe avec vla-saveas cela devrait aller mieux sinon..Aide aux développeurs d'AutoCAD -> ActiveX and VBA Reference -> Methods -> SaveAs Method pour le code de bryce, est il possible de remplace le Vl-saveas par une autre commande semblable a "sauvegrd"?Cela n'est pas possible, confère la réponse numéro 6 de (gile) : On ne peut pas appeler les fonctions command ou vl-cmdf depuis la fonction de retro action (callback) d'un réacteur. A+ Apprendre => Prendre => Rendre
bryce Posté(e) le 28 novembre 2012 Posté(e) le 28 novembre 2012 Bonjour, pour le code de bryce, est il possible de remplace le Vl-saveas par une autre commande semblable a "sauvegrd"? Je me suis basé sur ce que tu as fait dans ton code.Qu'est-ce qui change entre vla-saveas et sauvegrd ? :unsure: Concernant (command) ou (vl-cmdf), on ne peut pas les utiliser.Par contre on peut utiliser (vla-sendcommand), s'il n'y a pas d'autre méthode applicable. Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
harksin Posté(e) le 28 novembre 2012 Auteur Posté(e) le 28 novembre 2012 Re, "Sauvegrd" permet d'enregistrer une copie du dessin sans quiter le dessin actif saveas enregistre sous un nouveau nom, ferme le fichier de base et ouvre le nouveau.
Patrick_35 Posté(e) le 28 novembre 2012 Posté(e) le 28 novembre 2012 Salut Non, c'est le dessin qui change de destination (enregistrer sous)Tu peux utiliser la fonction lisp vl-file-copy à la place de vla-saveas @+ 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 28 novembre 2012 Posté(e) le 28 novembre 2012 Ou faire comme dans la routine autosave ci-dessus : utiliser vla-save (équivalent SAUVRAP / _QSAVE) et renommer le fichier .bak (vl-file-rename permet de renommer/déplacer un fichier en changeant le chemin). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bryce Posté(e) le 28 novembre 2012 Posté(e) le 28 novembre 2012 "Sauvegrd" permet d'enregistrer une copie du dessin sans quiter le dessin actif saveas enregistre sous un nouveau nom, ferme le fichier de base et ouvre le nouveau. Ok, j'étais un peu perdu...En ce moment je suis sur une LT durant la journée, et là-dessus SAUVEGRD correspond à _SAVEAS, alors que ça correspond à _SAVE sur une version complète... :blink: Voici donc 2 possibilités qui semblent fonctionner:- en utilisant vl-file-copy pour copier le sv$(defun I-save ( reac data / fichier ) (setq fichier (cadr data)) (if (= (strcase (vl-filename-extension fichier)) ".SV$") (vl-file-copy fichier (strcat REP_FS (vl-filename-base (getvar 'dwgname)) (menucmd "M=$(edtime,$(getvar,date),_YYYY-MO-DD-HH-MM-SS)") ".dwg" ) ) ) ) - en utilisant (vla-sendcommand) en remplacement de (command) ou (vl-cmdf), "pour le fun"(defun I-save ( reac data / fichier ) (setq fichier (cadr data)) (if (= (strcase (vl-filename-extension fichier)) ".SV$") (progn (or *acdoc* (setq *acdoc* (vla-get-activedocument (vlax-get-acad-object)))) (vla-sendcommand *acdoc* (strcat "filedia 0 sauvegrd \"" REP_FS (vl-filename-base (getvar 'dwgname)) (menucmd "M=$(edtime,$(getvar,date),_YYYY-MO-DD-HH-MM-SS)") ".dwg\"" (chr 10) "filedia 1 " ) ) ) ) ) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
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