Welcome to the Southern African Autolisp Website.

Afra-lISP


You are Visitor Number since 2nd June 1999.


Redefining Commands.

Most AutoCAD users know that it is possible to undefine an AutoCAD command
and then redefine it to do something else. But, very few people seem to use
this very useful feature. I find it very handy to stop people changing system
settings that divert from drawing office standards. Let's have a look at
an example of this.
Say we had a block inserted into the drawing that we did not want to be exploded
because it contains attributes. This is how we would go about using AutoLisp
to undefine and then redefine the 'Explode' command.

First, we would create an AutoLisp file called 'Redefs.Lsp'.
Then we would add the following coding :

	(command "UNDEFINE" "EXPLODE")
	'undefine the Explode command

After undefining the explode command we would then redefine it:

(defun C:EXPLODE ( / lst1 en typ)

   (setq lst1 (list "DRGTITLE1" "DRGTITLE2"))
   ;list of block names that must NOT be exploded

   ;If you wish to add additional block names, and want an easy way to
   ;figure out which ones you screened for each release, use this line with
   ;your block names.
   ;(setq lst1 (append lst1 (list "DRGTITLE2" "DRGTITLE3" "DRGTITLE4")))

   (setq en (car (entsel "\n Select block reference,
                  polyline, dimension, or mesh: ")))
   ;gets the block and mimics the explode prompt
 
   (setq typ (entget en))
   ;get the entity data

   (setq typ (cdr (assoc 2 typ)))
   ;get the block name

   (if (member typ lst1)
       ;if the selected block name is a member of our list

         (alert "\nThis Block Cannot be Exploded. 
                 \n    Refer to System Manager")
         ;inform the user
      
         ;if it is not
         (progn
         ;do the following

         (command ^c^c) 
         ;cancel any commands

         (command ".EXPLODE" en)
         ;explode the block

      );progn

   )
   ;if

(princ)
;finish clean

);defun
(princ)
;load clean


We would, of course, load Redefs.Lsp from our Acad.Lsp file to ensure that
it would be available all of the time. Just please note, that because this
routine uses the 'Command' function, we would have to load it from the
S::STARTUP section of the Acad.Lsp file. It would look something like this :

(defun S::STARTUP ()
       (prompt "\nAfraLisp Custom Utilities Loaded....\n")
       (load "REDEFS" "\nREDEFS.LSP not found")
    (princ)
);defun


I'll tell you what we'll do next. Let's create our own Drawing AutoSave.
First of all we need a way to check when a certain amount of time has elapsed.
One of the simplest ways of doing this is to use one of the commonest used
commands as a trigger. We'll use the 'Line' command.
Add the following coding to Redefs.Lsp :

Firstly we need to undefine the 'Line' command:

(command "UNDEFINE" "LINE")
;undefine the Line command

The we need to redefine it:

(defun C:LINE ()
;define the function

    (autosave)
    ;call the Autosave function

    (command ".LINE")
    ;call the line command

  (princ)

);defun


Next we need to write our Autosave function:

(defun AUTOSAVE ( / T1 ECC)
;define the function

      (setq ECC (getvar "CMDECHO"))
      ;get the value of the CMDECHO system variable

      (setvar "CMDECHO" 0)
      ;switch it off

      (if (not T3) (setq T3 (getvar "TDUSRTIMER")))
      ;check if we have the value of the drawing timer
      ;if we haven't got it, then get it.

      (if (not T2) (setq T2 (getreal "\nHow many minute between Saves ??: ")))
      ;check if we have an AutoSave time.
      ;if we haven't got it, then get it.

      (setq T1 (getvar "TDUSRTIMER"))
      ;get the drawing timer again for comparison purposes.

      (if (> (- T1 T3) (/ T2 60.0 24.0))
      ;compare the drawing timer values

      (progn
      ;if it is time to save

            (prompt "\nAutoSaving Drawing..Please Wait...... ")
            ;inform the user

            (command "QSAVE")
            ;save the drawing

            (setq T3 (getvar "TDUSRTIMER"))
            ;reset the timer

      );progn

      );if

      (setvar "CMDECHO" ECC)
      ;reset CMDECHO

   (princ)

);defun


The first time you select the Line command, this function will ask you for
an interval between saves. From then on, every time you use the Line command
the function will check to see if you have exceeded the time interval. If you
haven't, it will do nothing. But if you have, it will first inform you, and
then save your drawing. Handy little thing, Hey...


To download source coding for Redefs.lsp Click Here. (1Kb)


All Tutorials and Code are provided "as-is" for purposes of instruction and
utility and may be used by anyone for any purpose entirely at their own risk.
Please respect the intellectual rights of others.
All material provided here is unsupported and without warranty of any kind.
No responsibility will be taken for any direct or indirect consequences
resulting from or associated with the use of these Tutorials or Code.

Copyright © 1999 by Kenny Ramage
All rights reserved.
Information in this document is subject to change without notice.
Site created and maintained by Kenny Ramage.