Into the Database - Page III
The AutoCad Database does not only consist of entities but also
includes several other sections, such as the Tables Section.
Tables store information about entities that are maintained globally
within the drawing. For example, when you insert a block into a drawing,
how does AutoCAD know what the block looks like? The definition of a block
is stored in the Block Table. What happens, for example, if you need to
create a layer? You have to know if the layer already exist because if you
try to create a layer that already exists your program will crash.
Therefore, you would search the Layers Table first to see if the layer
exists.
There are nine (9) Tables that you can access :
Layer Table "LAYER"
Linetype Table "LTYPE"
Named View Table "VIEW"
Text Style Table "STYLE"
Block Table "BLOCK"
Named UCS Table "UCS"
Named Application ID Table "APPID"
Named Dimension Style Table "DIMSTYLE"
Vport Configuration Table "VPORT"
A Table is split into 2 parts: The 'names' of the entries in the Table
and the 'details' of each entry. For example, in the Layers Table, the
name of the entries would be the names of the layers that exist. The
details of an individual layer would be colour, linetype, on, off, frozen,
thawed, locked, unlocked or current.
To access a Table we would use the (tblsearch) function. Let's have a
look at
an example :
Assume that you want to know whether a layer called STEEL exists in
your drawing. First create the layer STEEL then type the following :
(setq t (tblsearch "LAYER" "STEEL"))
The entity list of the layer STEEL should be returned :
((0 . "LAYER") (2 . "STEEL") (70 . 64) (62 . 7) (6 . "CONTINOUS"))
The first part of the entity list is '0', indicating Associative 0.
In this case it's an entry in the "LAYER" Table.
Associative 2 indicates the name of the layer. STEEL in our case.
Associative 70 is the state of the entity. 1 is Frozen, 2 is Frozen on new
paper space view ports and 4 is locked. These numbers are added to 64. In
this case the layer is neither frozen nor locked.
Associative 62 is the colour of the layer. Ours is white which is colour
number 7. If the colour number is a negative number then the layer is off.
Associative 6 is the linetype of the layer, in this case,
"CONTINUOUS".
If the (tblsearch) had not found the layer then it would have returned
'nil' and you would know that the layer did not exist.
Sometimes you don't know the name of a layer or a block but you need a
list of them. This is when the (tblnext) function comes into play.
Let's assume that 4 layers exist in your drawing. The layer names are
MECH, STEEL, PIPE and TXT. Enter the following :
(tblnext "Layer")
AutoLISP should return something like this :
((0 . "LAYER") (2 . "PIPE") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))
Repeat the same command four additional times. You will get a new
entity
list for each of the layers.
The last time you type the command AutoLISP will return 'nil' because
there are no more additional layers.
Let's have a look at this in action. We are going to design a dialogue
box that displays a drop down list of all the available layers in a
specific drawing. The user can then choose any layer which can then be
used within his routine.
The Dialogue Coding looks like this :
getlay : dialog { //dialog name
label = "Get Layer" ; //give it a label
: popup_list { //define list box
key = "sel1"; //give it a name
value = "0"; //initial value
} //end list
ok_cancel ; //predifined OK/Cancel
} //end dialog
Now the AutoLisp Coding :
(defun c:getlay ( / NAMES SIZ1)
;define funcion
(setvar "cmdecho" 0)
;switch off command echo
(setq siz1 "0")
;initiliase variable
(setq userclick T)
;set flag
(setq f 1)
;rewind pointer
(while
;start while loop
(setq t1 (tblnext "Layer" f))
;get the next layer
(setq f nil)
;reset pointer
(setq b (cdr (assoc 2 t1)))
;get the layer name
(if (/= b "DEFPOINTS")
;if name is not equal to DEFPOINTS
(setq NAMES (append NAMES (list b)))
;Add the layer name to the list
);if
);while
(setq dcl_id (load_dialog "getlay.dcl"))
;load dialogue
(if (not (new_dialog "getlay" dcl_id)
;check for errors
);not
(exit)
;if problem exit
);if
(set_tile "sel1" "0")
;initilise list box
(start_list "sel1")
;start the list
(mapcar 'add_list NAMES)
;add the layer names
(end_list)
;end the list
(action_tile
"cancel"
"(done_dialog) (setq userclick nil)"
);action_tile
;if cancel set flag to nil
(action_tile
"accept"
(strcat
"(progn
(setq SIZ1 (get_tile \"sel1\"))"
" (done_dialog)(setq userclick T))"
);strcat
);action tile
;if OK get the layer selected
(start_dialog)
(unload_dialog dcl_id)
(if userclick
;if flag true
(progn
(setq SIZ1 (nth (atoi SIZ1) NAMES))
;get the name of the layer from the list
(alert (strcat "\nYou Selected Layer " SIZ1))
;display the name
);end progn
);end if
(princ)
);defun C:getlay
(princ)
If you would like the source coding for this AutoLisp Routine then simply Click
Here. Cheers and keep well......
|