Leaderboard
Popular Content
Showing content with the highest reputation on 09/29/2025 in all areas
-
******************************************************************** When I use lisp commands, I always wish the developers all the best. Thank you so much for your hard work and enthusiasm. Thanks to your programs, routine work turns into pleasure. And it takes much less time to create drawings. ********************************************************************2 points
-
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)2 points
-
Not sure if this is useful it tracks all commands used in a session Productivity_Analysis_Tool.lsp2 points
-
Another - (defun c:sf ( ) (setvar 'ucsfollow (- 1 (getvar 'ucsfollow))) (princ) )2 points
-
Or this, for toggle (defun c:SF ( / ) (if (zerop (boole 1 (getvar "UCSFOLLOW") 1)) (progn (setvar "UCSFOLLOW" (1+ (getvar "UCSFOLLOW"))) (princ "\nUCS Follow Activado") ) (progn (setvar "UCSFOLLOW" (1- (getvar "UCSFOLLOW"))) (princ "\nUCS Follow Desactivado") ) ) (prin1) )2 points
-
Another way, taking advantage of @Lee Mac's idea and condensing an output message for the user (defun c:sf (/ v) (princ (strcat "\n*** " (setq v "UCSFOLLOW") (nth (setvar v (- 1 (getvar v))) '(" desactivado" " activado")))) (princ) )1 point
-
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.1 point
-
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 seem1 point
-
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 point
-
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).1 point
-
@Nikon PS: I think it’s better if you copy the code into "acad2021.lsp" and not into "acad2021Doc.lsp" because the content of the latter is loaded afterwards.1 point
-
Yes I know. 'vlr-remove-all' is executed during loading so that any reactor created with the previous code is erased. It was a quick solution. Additionally, it runs when the drawing is exited or at startup before any other application loads, so it would only affect those reactors that should remain between drawings. I assumed that Nikon does not use these reactors. But it is probably a risky assumption. So I guess I am "obliged" to fix it. Below, a solution that keeps the reactors even if the drawing closure is canceled, that respects any reactor created by another application, and that regenerates them in each drawing. (defun fota (/ arch cad cmd mens etq letq n er lx) (defun pregunta (a b / cad) (cond ((member (strcase (car b)) '("CLOSE" "_CLOSE" "QUIT" "_QUIT" "EXIT" "_EXIT")) (if (and *lstCmds* (setq mens (cmdsCargados)) (= (vlax-invoke-method (vlax-create-object "wscript.shell") 'popup "Print commands on screen?" 0 "Save commands name" 4) 6) ) (progn (vla-AddMText (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point (getpoint "\nInsertion point...")) 100 mens) (vlax-invoke-method (vlax-get-acad-object) 'Update) ) ) ) ((= (type a) 'VLR-Lisp-Reactor) (if (not (member (setq cad (substr (car b) 4 (- (strlen (car b)) 4))) *lstCmds*)) (setq *lstCmds* (cons (substr (car b) 4 (- (strlen (car b)) 4)) *lstCmds*)) ) ) ) ) (setq letq '("Nikon1" "Nikon2") *afI* nil) (foreach r (vlr-reactors) (foreach er (cdr r) (if (member (setq etq (vlr-data er)) letq) (if (wcmatch etq "Nikon1,Nikon2") (setq lx (cons er lx)) ) ) ) ) (if lx (foreach r lx (vlr-remove r))) (foreach sim (atoms-family 0) (if (wcmatch (setq cmd (strcase (vl-princ-to-string sim) T)) "c:*") (setq *afI* (cons sim *afI*)) ) ) (setq *r* (vlr-command-reactor "Nikon1" '((:vlr-commandwillStart . pregunta)))) (setq *r1* (vlr-lisp-reactor "Nikon2" '((:vlr-lispwillstart . pregunta)))) ) (defun cmdsCargados (/ cad) (setq *cadCmds* nil) (foreach sim (atoms-family 0) (if (not (member sim *afI*)) (if (and (wcmatch (setq cad (strcase (vl-princ-to-string sim) T)) "c:*") (member (strcase (substr cad 3)) *lstCmds*) ) (setq *cadCmds* (strcat (if *cadCmds* (strcat *cadCmds* "\n") "\\C1Comandos utilizados durante la sesi贸n:\\C256\n") (substr cad 3))) ) ) ) *cadCmds* ) (fota)1 point
-
The probable answer is CVPORT but how are you making the animation ? You can in a lisp change layouts and viewports use the DELAY command to slow down the changing between layouts etc.1 point
-
There are no commands - just load it, use a few LISP commands, and then save your drawing.1 point
-
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.1 point
-
Maybe this might help: Lee Macs option at the end might give you a start. Do you want it to open the viewports automatically or with the user perhaps pressing say 'space' bar?1 point
-
'repeat 100...'? Changing the same variable 100 times...why? I guess that's a mistake. Something simple: every time the command sf is called, UCSFOLLOW changes state, without asking (defun c:sf (/ act) (setvar "UCSFOLLOW" (if (setq act (= (getvar "UCSFOLLOW") 0)) 1 0)) (princ (strcat "\n*** Variable UCSFOLLOW " (if act "activada" "desactivada"))) (princ) )1 point
