TheSwamp
CAD Forums => CAD General => Topic started by: ribarm on January 29, 2018, 05:35:13 AM
-
Greetings...
I have a question about seeing or exporting complete list of commands that are built in, or that are added as custom ones inside active AutoCAD session... I know how to review loaded lisp definitions through (atoms-family) function, but I don't know how to inspect built in or added commandmethods C# dll definitions which are loaded through NETLOAD command... Any insight or thought is welcome...
-
for C# you can use reflection, here might be a good place to start https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/accessing-attributes-by-using-reflection
for the host application I think you would need to use ARX to get hold of the command stack as I don't think this is exposed in .net (it's been a while so it might be now??)
-
You can read the acad.pgp and compare against an OOTB AutoCAD installation?
-
You can read the acad.pgp and compare against an OOTB AutoCAD installation?
Maybe dummy question, but are all built-in commands listed in pgp file no matter what ACAD vertical/vanilla is used?
Still I don't know how to get NETLOAD and other definitions defined outside (atoms-family), but never mind for that - I am searching for answer on my just asked question...
-
Try these;
Read the prompts ...
C:\Program Files\Autodesk\AutoCAD 2018\Express\lspdata.lsp
C:\Program Files\Autodesk\AutoCAD 2018\Express\acadinfo.lsp
-
You can read the acad.pgp and compare against an OOTB AutoCAD installation?
Maybe dummy question, but are all built-in commands listed in pgp file no matter what ACAD vertical/vanilla is used?
...
I need an answer to my question - Yes or No...
-
You can read the acad.pgp and compare against an OOTB AutoCAD installation?
Maybe dummy question, but are all built-in commands listed in pgp file no matter what ACAD vertical/vanilla is used?
...
I need an answer to my question - Yes or No...
If you want a clear answer: No, the PGP file does not contain a list of alle available commands.
As far as I know there is also not something available that shows a list of all internal commands, all aliases, every loaded Lisp, .NET and ARX function.
Why do you need that list anyway?
-
Why do you need that list anyway?
To learn what ACAD can do and to study and research perhaps other possibilities of CAD while programming...
-
Well, if you want a full list of all AutoCAD commands, you can download the contents of each page listed here:
http://www.cadforum.cz/cadforum_en/command.asp
-
I don't know if this will help you, but run the ARX command, "C" option.
For best results:
1. Run LOGFILEON
2. Seq QAFLAGS to 2
3. Run ARX, option "C".
4. Run LOGFILEOFF
5. Set QAFLAGS back to 0
6. Open the logfile.
-
I don't know if this will help you, but run the ARX command, "C" option.
For best results:
1. Run LOGFILEON
2. Seq QAFLAGS to 2
3. Run ARX, option "C".
4. Run LOGFILEOFF
5. Set QAFLAGS back to 0
6. Open the logfile.
Fantastic, thanks many many thanks...
Incredible trick...
-
Nice tip RK. Quick code to exploit:
(defun c:commands ( / :setvars :main )
;;==========================================================================
;; Commands.lsp
;;--------------------------------------------------------------------------
;; \|// 1.02 2018-03-07
;; |Oo| © 2018 Michael Puckett Some Rights Reserved.
;; |- | mp@cadanalyst.org
;;--------------------------------------------------------------------------
;; 1.01 2018-03-05. MP. Initial code.
;; 1.02 2018-03-07. MP. Modularized.
;;--------------------------------------------------------------------------
(defun :setvars ( lst )
;; Send a cons-pair or cons-pairs lists of (varname . varvalue).
;; eg (setq restore (ue2-setvars '((CMDECHO . 0)(REGENMODE 0))))
;; Returns original values in the same cons-pair construct.
;; >> ((CMDECHO . 1) (REGENMODE . 1))
(mapcar
(function
(lambda ( p / k r )
(setq r (cons (setq k (car p)) (vl-catch-all-apply 'getvar (list k))))
(vl-catch-all-apply 'setvar (list k (cdr p)))
r
)
)
(if (vl-list-length lst)
lst
(list lst)
)
)
)
(defun :main ( / restore flag handle stream lst name )
(setq restore
(:setvars
'( (cmdecho . 0)
(logfilemode . 1)
(qaflags . 2)
)
)
)
(setq flag (strcat "START CAPTURE: " (rtos (getvar 'cdate) 2 8)))
(princ (strcat "\n" flag))
(command ".arx" "_commands")
(setq handle (open (getvar 'logfilename) "r"))
(while (setq stream (read-line handle))
(setq lst (cons stream lst))
)
(close handle)
(:setvars restore)
(setq lst (cddr (member flag (reverse lst))))
(while (eq "" (vl-string-trim " \t\n" (car lst)))
(setq lst (cdr lst))
)
(setq
name (vl-filename-mktemp "commands.txt")
handle (open name "w")
)
(foreach x lst (princ (strcat x "\n") handle))
(close handle)
(startapp "notepad.exe" name)
(princ)
)
(:main)
)
Cheers.
-
And the predictable:
(defun c:Vars ( / :pad :matching-vars :get-spec :main )
;;==========================================================================
;; Vars.lsp
;;--------------------------------------------------------------------------
;; \|// 1.07 2018-03-07
;; |Oo| © 2018 Michael Puckett Some Rights Reserved.
;; |- | mp@cadanalyst.org
;;--------------------------------------------------------------------------
;; 1.01 2018-03-05. MP. Initial code.
;; 1.02 2018-03-05. MP. Apply constant width to var name column.
;; 1.03 2018-03-05. MP. Use getvar instead of capturing screen; no truncation.
;; 1.04 2018-03-06. MP. Improve speed: only initial run abuses the log file.
;; 1.05 2018-03-06. MP. Add undocumented vars.
;; 1.06 2018-03-06. MP. Flag vars in :undocumented that return nil.
;; 1.07 2018-03-07. MP. Fixed a missing local declaration.
;;--------------------------------------------------------------------------
(if
(null
(vl-every
(function (lambda (x) (eq 'str (type x))))
(if (eq 'list (type *getvar-names*)) *getvar-names* '(0))
)
)
;; Function get-var-names is defined locally but has and needs global
;; scope. Don't understand why? <trump> Sad! </trump>.
(defun get-var-names ( / :car-str :unique :undocumented :setvars :main )
(defun :car-str ( text / lst )
(substr
(setq text (strcase (vl-string-trim " \t\r\n" text)))
1
(- (length (setq lst (vl-string->list text)))
(length (member 32 lst))
)
)
)
(defun :unique ( lst / result )
(foreach x lst
(or
(member x result)
(setq result (cons x result))
)
)
(reverse result)
)
;; Thanks to Owen Wengerd & the internet ...
(defun :undocumented ( )
'( "_LINFO" ;; Returns nil in 2018, may remove.
"_PKSER"
"_SERVER"
"_VERNUM"
"ADCSTATE"
"AECENABLEASSOCANCHOR"
"AECENABLESECTIONCLEANUP"
"AECVCOMPAREIGNOREHATCH"
"AECVCOMPAREIGNORETEXT"
"AECVCOMPARENEWCOLOR"
"AECVCOMPAREOLDCOLOR"
"AECVCOMPAREUNCHANGEDCOLOR"
"APBOX"
"AUXSTAT"
"AXISMODE" ;; Returns nil in 2018, may remove.
"AXISUNIT"
"BS_BITS" ;; Returns nil in 2018, may remove.
"CLEARTYPE"
"CPUTICKS"
"DBCSTATE"
"DBGLISTALL" ;; Returns nil in 2018, may remove.
"EDITDELETIONEFFECT" ;; Returns nil in 2018, may remove.
"ENTEXTS"
"ENTEXTS"
"ENTMODS"
"FILETABVISIBLE"
"FLATLAND"
"FORCE_PAGING"
"FORCE_PAGING"
"GLOBCHECK"
"ISFLIPARC"
"JWDEBUG" ;; Returns nil in 2018, may remove.
"KESDEBUG" ;; Returns nil in 2018, may remove.
"LAZYLOAD"
"LAZYLOAD"
"LENGTHENTYPE"
"MILLISECS"
"NFWSTATE"
"NODENAME"
"NOMUTT"
"OPMSTATE"
"OSNAPNODELEGACY"
"PHANDLE"
"POINTCLOUDEVENTLOG"
"POINTCLOUDPERFTRACK"
"POINTCLOUDPROGRESSIVEUPDATE"
"PRESELECTIONEFFECTTEST"
"PRESELECTIONNOTIFICATION"
"PRODUCT"
"PROGRAM"
"QAFLAGS"
"QAUCSLOCK"
"SHORTCUTMENU"
"SMJOURNAL"
"SMTHREADHOTMODE"
"SMUNFIXEDTRANSFORM"
"SPACESWITCH"
)
)
(defun :setvars ( lst )
;; Send a cons-pair or cons-pairs lists of (varname . varvalue).
;; eg (setq restore (ue2-setvars '((CMDECHO . 0)(REGENMODE 0))))
;; Returns original values in the same cons-pair construct.
;; >> ((CMDECHO . 1) (REGENMODE . 1))
(mapcar
(function
(lambda ( p / k r )
(setq r (cons (setq k (car p)) (vl-catch-all-apply 'getvar (list k))))
(vl-catch-all-apply 'setvar (list k (cdr p)))
r
)
)
(if (vl-list-length lst)
lst
(list lst)
)
)
)
(defun :main ( / restore flag handle stream lst )
(setq restore
(:setvars
'( (cmdecho . 0)
(logfilemode . 1)
(qaflags . 2)
)
)
)
(setq flag (strcat "START CAPTURE: " (rtos (getvar 'cdate) 2 8)))
(princ (strcat "\n" flag))
(command ".setvar" "_?" "*")
(setq handle (open (getvar 'logfilename) "r"))
(while (setq stream (read-line handle))
(setq lst (cons stream lst))
)
(close handle)
(:setvars restore)
(setq lst (cdr (member flag (reverse lst))))
(while (eq "" (vl-string-trim " \t\n" (car lst)))
(setq lst (cdr lst))
)
(mapcar 'cadr
(vl-sort
(mapcar
(function (lambda (x) (list (strcase x t) x)))
(:unique
(append
;; add any vars AutoCAD may not normally include
(:undocumented)
(mapcar ':car-str lst)
)
)
)
(function (lambda (a b) (< (car a) (car b))))
)
)
)
;; The following is tempting but lisp cries because of the size of
;; the list.
;;
;; (eval (list 'defun 'get-var-names symbol nil (:main)))
;;
;; The following isn't sexy but it's reliable as long as no one
;; abuses the global:
(setq *getvar-names* (:main))
(defun get-var-names ( ) *getvar-names*)
*getvar-names*
)
)
(defun :pad ( text len )
(while (< (strlen text) len)
(setq text (strcat text " "))
)
text
)
(defun :matching-vars ( spec )
(vl-remove-if-not
(function (lambda (x) (wcmatch x spec)))
(get-var-names)
)
)
(defun :get-spec ( / spec )
(if
(eq ""
(setq spec
(strcase
(getstring "\nEnter search pattern <*>: ")
)
)
)
"*"
spec
)
)
(defun :main ( / spec vars len name handle )
(cond
( (null (setq vars (:matching-vars (setq spec (:get-spec)))))
(princ (strcat "\nNo variables matched pattern '" spec "'."))
)
( (setq
len (1+ (apply 'max (mapcar 'strlen vars)))
name (vl-filename-mktemp "vars.txt")
handle (open name "w")
)
(princ (strcat "Variables matching pattern '" spec "':\n\n") handle)
(foreach var vars
(princ
(strcat
(:pad var len)
(vl-prin1-to-string (getvar var))
"\n"
)
handle
)
)
(close handle)
(startapp "notepad.exe" name)
)
)
(princ)
)
(:main)
)
Cheers.
-
Very nice as always Michael :)
-
Very nice as always Michael :)
Ditto that!
-
Cool :mrgreen:
-
Thanks guys! :-)
PS: Both updated (why in code comments).
-
Very nice as always Michael :)
Ditto that!
1+ :)
-
If you like c:vars may like what i did to abuse it in version 2.02.
(not posted yet)
O.o
-
Of all the long things I've every tried --
-- this is the most recent.
Too long to post; attached.
-
Of all the long things I've every tried --
-- this is the most recent.
Too long to post; attached.
Awesome
Could this be modified to get only global setq vars?
-
Got this to work...
(defun VARLISTIT ()
(textpage)
(foreach
n '(ARCH#LOGO ARCH#YEAR ARCH#LTYP ARCH#UNIT ARCH#DECI ARCH#DDEC ARCH#ALDR ARCH#SYMS
ARCH#ANNO ARCH#TEXT ARCH#PROJ ARCH#DIAL ARCH#CMDN ARCH#POSX ARCH#POSY ARCH#DIAP
ARCH#LOOP ARCH#CLAY ARCH#LREA ARCH#MECH ARCH#CIVL ARCH#_CMM ACAD#PATH ARCH#BROW
ARCH#DIRL ARCH#CUSN ARCH#LOGF ARCH#CUSF ARCH#MASF ARCH#CSTF ARCH#BLKF ARCH#FONF
ARCH#HELF ARCH#IMAF ARCH#PATF ARCH#PROF ARCH#SUPF ARCH#FILF ARCH#LAYF ARCH#DRAF
ARCH#BLOF ARCH#DIMF ARCH#SYMF ARCH#ANNF ARCH#UTIF ARCH#SCAL ARCH#SCID ARCH#SCDS
ARCH#SLTS ARCH#LTSD ARCH#PLTS ARCH#UNID ARCH#LUID ARCH#_SCF ARCH#SFIL ARCH#SLAY
ARCH#SDRA ARCH#SBLO ARCH#SDIM ARCH#SSYM ARCH#SANN ARCH#SUTI ARCH#SARC ARCH#SSTR
ARCH#SMEC ARCH#SELE ARCH#SCIV ARCH_XDPC ARCH#XDCN ARCH#XDAD ARCH#XDTP ARCH#XDWW
ARCH#XDPR ARCH#PIDF ARCH#DPRE ARCH#FMSG ARCH#LMSG ARCH#WMSG ARCH#BMSG ARCH#DMSG
ARCH#LMSG ARCH#AMSG ARCH#UMSG ARCH#NLAY ARCH#NPLT ARCH#LAYL ARCH#LAYR ARCH#IWID
ARCH#PWID ARCH#ENTL ARCH#ENTN ARCH#HPSC ARCH#HPGP ARCH#HFAC ARCH#VHAT ARCH#PHAT
ARCH#UNIT ARCH#CLAY ARCH#LTSS ARCH#DDEC ARCH#DECI ARCH#LTYP ARCH#LOOP ARCH#ALDR
ARCH#TEXT ARCH#ANNO ARCH#SYMS ARCH#LREA ARCH#TXSD ARCH#TXSN ARCH#TXST ARCH#TXSS
ARCH#TXSC ARCH#TXSA ARCH#TXNW ARCH#TXTW ARCH#TXNH ARCH#TXTH ARCH#TXTS ARCH#TXVS
ARCH#TXFD ARCH#TXFN ARCH#TXFT ARCH#TXFS ARCH#TXFC ARCH#TXFA ARCH#SIZE ARCH#ANGL
ARCH#JAMB ARCH#SILL ARCH#RPDX ARCH#WWID ARCH#CPNT ARCH#GPNT ARCH#STEP ARCH#SRIS
ARCH#STRD ARCH#SCNT ARCH#SJST ARCH#SREQ ARCH#STEQ ARCH#STPT ARCH#DECK ARCH#CABW
ARCH#BLKX ARCH#RDPX ARCH#F_ID ARCH#F_OD ARCH#DTLN ARCH#SHTN ARCH#REV# ARCH#LINI
ARCH#LIBF ARCH#LCMD ARCH#LSLD ARCH#LACT ARCH#LCLR ARCH#_ADC ARCH#DVAR ARCH#PAUS
ARCH#TEMP ARCH#TNUM ARCH#DOSD ARCH#DSNP ARCH#DBRK ARCH#DECP ARCH#DSTP ARCH#DALN
ARCH#DSTP ARCH#_NIC ARCH#SSET ARCH#ELVH ARCH#ELVW ARCH#BORD ARCH#BLKN ARCH#STRG
ARCH#UDLR ARCH#VIEW ARCH#RTOS ARCH#_STR ARCH#_DIS ARCH#_NB_ ARCH#_VH_ ARCH#NVAL
ARCH#PROJ ARCH#PNAM ARCH#DATE ARCH#PNUM)
(progn (print n) (princ (eval n)))))
(VARLISTIT)
(princ)
[code/]
-
atoms-family != sysvars
That said perhaps this ...
(defun c:Globals ( / :varz :get-var-spec :get-val-spec :pad :matching-vars :matching-vals :setvars :ntos :substr :main )
;;==========================================================================
;; Globals.lsp
;;--------------------------------------------------------------------------
;; \|// 1.01 2018-03-28
;; |Oo| © 2018 Michael Puckett Some Rights Reserved.
;; |- | mp@cadanalyst.org
;;--------------------------------------------------------------------------
;; 1.01 2018-03-28. MP. Initial code.
;;--------------------------------------------------------------------------
(defun :globals ( )
(vl-sort (atoms-family 1) '<)
)
(defun :get-var-spec ( / spec )
(if
(eq ""
(setq spec
(strcase
(getstring "\nEnter variable NAME search pattern <*>: ")
)
)
)
"*"
spec
)
)
(defun :get-val-spec ( / spec )
(if
(eq ""
(setq spec
(strcase
(getstring "\nEnter variable VALUE search pattern <*>: ")
)
)
)
"*"
spec
)
)
(defun :pad ( text len )
(while (< (strlen text) len)
(setq text (strcat text " "))
)
text
)
(defun :matching-vars ( spec )
(vl-remove-if-not
(function (lambda (x) (wcmatch x spec)))
(:globals)
)
)
(defun :matching-vals ( vars spec )
(vl-remove-if-not
(function (lambda (p) (wcmatch (strcase (cadr p)) spec)))
(mapcar
(function
(lambda ( v / v$ v! )
(list v
(vl-prin1-to-string
(if (member
(setq v! (type (setq v$ (eval (read v)))))
'(exrxsubr file pagetb subr usubr vla-object)
)
v!
v$
)
)
)
)
)
vars
)
)
)
(defun :setvars ( lst )
;; Pass the function a cons-pair or a list of cons-pairs:
;; >> (setq restore (:setvars '((CMDECHO . 0)(REGENMODE 0))))
;; Returns original values in the same construct:
;; >> ((CMDECHO . 1) (REGENMODE . 1))
;; So you can do this later:
;; >> (:setvars restore)
(mapcar
(function
(lambda ( p / k r )
(setq r (cons (setq k (car p)) (vl-catch-all-apply 'getvar (list k))))
(vl-catch-all-apply 'setvar (list k (cdr p)))
r
)
)
(if (vl-list-length lst)
lst
(list lst)
)
)
)
(defun :ntos ( x / r s )
(setq
r (:setvars '((dimzin . 8)))
s (if (eq 'real (type x)) (rtos x 2 15) (itoa x))
r (:setvars r)
)
s
)
(defun :substr ( text a b / result n )
(setq result (substr text a b))
(cond
( (not (< (setq n (strlen result)) (strlen (substr text a))))
result
)
( (wcmatch (substr text a) "(*)")
(strcat (substr result 1 (- n 5)) " ..." (chr 41))
)
(
(strcat (substr result 1 (- n 4)) " ...")
)
)
)
(defun :main ( / restore var-spec val-spec vars-vals var val len name handle )
(cond
( (null (setq vars (:matching-vars (setq var-spec (:get-var-spec)))))
(princ (strcat "\nNo variables matched pattern '" var-spec "'."))
)
( (null (setq vars-vals (:matching-vals vars (setq val-spec (:get-val-spec)))))
(princ (strcat "\nNo values matched pattern '" val-spec "'."))
)
( (setq
restore (:setvars '((dimzin . 0)(luprec . 8)(auprec . 8)))
len (1+ (apply 'max (mapcar 'strlen (mapcar 'car vars-vals))))
name (vl-filename-mktemp "vars.txt")
handle (open name "w")
)
(princ
(strcat
"ACADVER: " (rtos (atof (getvar 'acadver)) 2 1)
": Global variables matching (name|value) pattern ('" var-spec "'|'" val-spec "'):\n\n"
)
handle
)
(foreach lst vars-vals
(princ
(strcat
(:pad (setq var (car lst)) len)
(cond
((null (setq val (eval (read var)))) "nil")
((numberp val) (:ntos val))
((:substr (cadr lst) 1 80))
)
"\n"
)
handle
)
)
(:setvars restore)
(close handle)
(startapp "notepad.exe" name)
)
)
(princ)
)
(:main)
)
-
Thanks
-
ur welcome
-
atoms-family != sysvars
That said perhaps this ...
-
Hanhphuc @cadtutor.net has come up with a different, more direct way, to retrieve these 'ARX' commands:
http://www.cadtutor.net/forum/showthread.php?103760-AutoCAD-built-in-command-list-with-AutoLISP&p=701145&viewfull=1#post701145
The code does not work on BricsCAD BTW. But I notice that not all commands are listed. So 'inspecting all defined commands', as per the tittle of this topic, is not possible with this approach it seems.
-
Thanks, interesting thread too.