Nikon Posted 3 hours ago Author Posted 3 hours ago 5 hours ago, GLAVCVS said: Can anyone else on this forum say that the same thing is happening to them? I have ACADLSPASDOC=0. I have another question: Is it possible to use your code as a separate reactor without adding it to the acad20##.lsp file? Quote
GLAVCVS Posted 3 hours ago Posted 3 hours ago 23 minutes ago, Nikon said: I have ACADLSPASDOC=0. I have another question: Is it possible to use your code as a separate reactor without adding it to the acad20##.lsp file? The code needs to be loaded before any other code you need to memorize. For this reason, saving it at the beginning of the "acad2021.lsp" file allows the code to control other programs loaded later from the same "acad2021.lsp" or "acad2021Doc.lsp." If you load it after other files, it will discard any previously loaded Lisp commands and only consider those loaded later. Therefore, yes, you can save it in a separate file and load it whenever you need, but you must be aware of this condition. Are you willing to accept it? 1 Quote
GLAVCVS Posted 3 hours ago Posted 3 hours ago 6 hours ago, Lee Mac said: The acad20##.lsp and acad20##doc.lsp files should not be modified - these are reserved for the application. Instead, you should create your own acad.lsp and acaddoc.lsp files. Note that, by default, acad.lsp will be loaded once per session, and acaddoc.lsp will be loaded per document (unless ACADLSPASDOC=1, in which case acad.lsp will also be loaded per document). To settle this matter I must say yes: it is better to write the code in "acad.lsp" provided that there is not already custom lisp code in "acad####.lsp" or "acad####DOC.lsp", because if so, that code would escape the control of the "fota" function. I must say that I have the bad habit of writing code both in "acad####.lsp" and in "acad####DOC.lsp". Simply as a matter of economy. Lastly, the "ACADLSPASDOC" variable affects only "acad.lsp" but not "acad####.lsp", as it might seem 1 Quote
Steven P Posted 2 hours ago Posted 2 hours ago Did he say earlier to only record commands that the user initiates rather than any automatically running on opening a drawing? In which case maybe save it in a file "ZZZ.LSP" or something similar so it is loaded last (Assuming here that custom LISP files load alphabetically this will load last - I am not sure if they do or not though), and put the file in the trusted files location. Quote
Lee Mac Posted 1 hour ago Posted 1 hour ago 2 hours ago, Nikon said: I can't understand why your code (defun init ( )... it doesn't work for me. Is there a problem with the localization of Autocad? Do I need to change this line?: ( (not (wcmatch (setq arg (strcase (car arg))) "SAVE,QSAVE,SAVEAS"))) to ( (not (wcmatch (setq arg (strcase (car arg))) "SAVE,QSAVE,SAVEAS,_SAVE,_QSAVE,_SAVEAS"))) Or something else? Can anyone check the code? Are you issuing some LISP commands during the session before saving? Quote
Lee Mac Posted 59 minutes ago Posted 59 minutes ago 18 hours ago, Lee Mac said: Yes I suppose if the log is to be maintained continuously, existing content could be parsed and updated accordingly - if more than just the OP are using this code, I'll look to update it. Update to aggregate the logs - (defun init ( ) (foreach grp (vlr-reactors :vlr-command-reactor :vlr-lisp-reactor) (foreach rtr (cdr grp) (if (= "lisp-commands" (vlr-data rtr)) (vlr-remove rtr) ) ) ) (setq lisp-command-list nil) (vlr-command-reactor "lisp-commands" '((:vlr-commandwillstart . onsave))) (vlr-lisp-reactor "lisp-commands" '((:vlr-lispwillstart . onlisp))) (princ) ) (defun onsave ( rtr arg / ent enx idx lyr mts sel str ) (setq lyr "lisp-commands") (cond ( (not arg)) ( (not (wcmatch (setq arg (strcase (car arg))) "SAVE,QSAVE,SAVEAS"))) ( lisp-command-list (if (setq sel (ssget "_X" (list (cons 8 lyr)))) (repeat (setq idx (sslength sel)) (setq idx (1- idx) ent (ssname sel idx) enx (entget ent) ) (if (= "MTEXT" (cdr (assoc 0 enx))) (setq mts (cdr (assoc 1 enx))) ) (entdel ent) ) ) (if mts (setq lisp-command-list (mergelists (parsetext mts) lisp-command-list))) (setq str "") (foreach itm (vl-sort lisp-command-list '(lambda ( a b ) (> (cdr a) (cdr b)))) (setq str (strcat str "\\P" (car itm) "\t\t" (itoa (cdr itm)))) ) (makelayer lyr) (entmakex (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") '(010 0.0 0.0) (cons 1 (substr str 3)) (cons 8 lyr) ) ) (setq lisp-command-list nil) ) ) (princ) ) (defun onlisp ( rtr arg / fun itm ) (cond ( (not arg)) ( (wcmatch (setq arg (strcase (car arg))) "~(C:*)")) ( (setq fun (substr arg 4 (- (strlen arg) 4)) itm (assoc fun lisp-command-list) ) (setq lisp-command-list (subst (cons (car itm) (1+ (cdr itm))) itm lisp-command-list)) ) ( (setq lisp-command-list (cons (cons fun 1) lisp-command-list))) ) (princ) ) (defun makelayer ( lay ) (if (not (tblobjname "layer" lay)) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(070 . 0) (cons 2 lay) '(062 . 8) '(290 . 0) ) ) ) ) (defun parsetext ( str / pos ) (cond ( (setq pos (vl-string-search "\\P" str)) (append (parsetext (substr str 1 pos)) (parsetext (substr str (+ pos 3)))) ) ( (setq pos (vl-string-position 9 str)) (list (cons (substr str 1 pos) (atoi (substr str (+ pos 3))))) ) ) ) (defun mergelists ( ls1 ls2 / ass ) (if (< (length ls1) (length ls2)) (mapcar 'set '(ls1 ls2) (list ls2 ls1)) ) (foreach itm ls2 (if (setq ass (assoc (car itm) ls1)) (setq ls1 (subst (cons (car itm) (+ (cdr ass) (cdr itm))) ass ls1)) (setq ls1 (cons itm ls1)) ) ) ls1 ) (vl-load-com) (init) 1 Quote
Nikon Posted 25 minutes ago Author Posted 25 minutes ago (edited) 59 minutes ago, Lee Mac said: Are you issuing some LISP commands during the session before saving? I issuing several commands in LISP during the session before saving. *** I've started the last reactor. Thanks a lot, the code works! Edited 15 minutes ago by Nikon Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.