Está en la página 1de 14

TUTORIAL BASE DE DATOS DE ENTIDADES DE AUTOCAD

EN LA BASE DE DATOS

por Kenny Ramage

INTRODUCCIÓN A LA BASE DE DATOS - PARTE 1

Sujétate a tu sombrero porque vamos a bucear directamente aquí.

Inicie AutoCad y trace una línea en cualquier lugar de la pantalla.

Ahora escribe esto y luego presiona Enter:

(setq a (entlast))

Lisp debería devolver algo como esto:

<Entity name: 2680880>

Este es el nombre de entidad de la línea que acaba de dibujar.

Ahora escribe "Borrar", luego! A y presiona Enter dos veces.

La línea debe desaparecer. Escriba "OOPS" para traerlo de vuelta.

Acaba de modificar la base de datos de AutoCAD.

Ahora escribe esto:

(setq b (entget a))

Esto recuperará los datos de la entidad. Debería verse algo como esto:

((-1 . <Entity name: 2680880>) (0 . "LINE") (5 . "270")

(100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbLine")

(10 400.378 621.82 0.0) (11 740.737 439.601 0.0)

(210 0.0 0.0 1.0))


Ahora escribe esta línea:

(setq c (cdr (assoc 10 b)))

Lisp debería regresar:

(400.378 621.82 0.0)

Antes de escribir las siguientes líneas, asegúrese de que su ajuste esté desactivado.

Command: circle

3P/2P/TTR/<Center point>: !c

Diameter/<Radius> <10.0>: 20

Se debe dibujar un círculo al final de la línea.

INTRODUCCIÓN A LA BASE DE DATOS - PARTE 2

Cuando empiezas a profundizar en la base de datos de AutoCAD es, lo admito, bastante


desalentador. Pero, aunque el acceso y la manipulación de las entidades es bastante complejo, se
puede dividir en partes componentes que lo hacen mucho más fácil de entender.

Echemos un vistazo a una rutina de AutoLisp que se puede usar, como una especie de plantilla

que se puede aplicar a numerosas aplicaciones similares. Echa un vistazo de cerca a esta
codificación:

(defun C:CHLAYER ( / a1 a2 n index b1 b2 b3 d1 d2)

(prompt "\nSelect Entities to be Changed : ")

(setq a1 (ssget))

(prompt "\nPoint to Entity on Target Layer : ")


(setq a2 (entsel))

(setq n (sslength a1))

(setq index 0)

(setq b2 (entget (car a2)))

(setq d2 (assoc 8 b2))

(repeat n

(setq b1 (entget (ssname a1 index)))

(setq d1 (assoc 8 b1))

(setq b3 (subst d2 d1 b1))

(entmod b3)

(setq index (1+ index))

);repeat
(princ)
);defun
(princ)

Esta rutina le permite seleccionar cualquier número de objetos y cambiarlos a una capa diferente.
La capa de destino se elige simplemente apuntando a un objeto en la capa deseada. (Para probar
esta rutina, deberá crear un dibujo con objetos en diferentes capas). Veamos línea por línea:

(defun C:CHLAYER ( / a1 a2 n index b1 b2 b3 d1 d2)

Define la función y declara todas las variables como locales.


(prompt "\nSelect Entities to be Changed : ")

(solicite "\ Seleccionar entidades a cambiar:")

Solicita al usuario.

(setq a1 (ssget))

Permite al usuario seleccionar los objetos a cambiar. El conjunto de selección se asigna a la


variable 'a1'.

(prompt "\nPoint to Entity on Target Layer : ")

Solicita al usuario que seleccione la capa de destino.

(setq a2 (entsel))

Este es un tipo especial de declaración de selección que solo le permite

seleccione una entidad.

(setq n (sslength a1))

Cuenta el número de entidades en el conjunto de selección 'a1' y almacena


este número en la variable 'n'.

(setq index 0)

Establece la variable de control de bucle 'índice' a cero.

(setq b2 (entget (car a2)))

Esta declaración recupera la lista de entidades de 'a2' y la asigna a 'b2'.

(setq d2 (assoc 8 b2))


Esto busca el código 8 en la lista de entidades 'a2', y luego asigna la lista secundaria a 'd2'.

(repeat n

Esto comienza el ciclo que las páginas a través del conjunto de selección.

(setq b1 (entget (ssname a1 index)))

Esto obtiene la lista de entidades y la asigna a 'b1'.

(setq d1 (assoc 8 b1))

Obtiene el código de la sublista 8. (La capa)

(setq b3 (subst d2 d1 b1))

Sustituye la nueva capa 'd2' por la capa antigua 'd1' en la lista de entidades 'a1', y la asigna a la
nueva lista de entidades 'b3'.

(entmod b3)

Actualiza la nueva lista de entidades en la base de datos.

(setq index (1+ index))

Aumenta la variable 'índice' en 1, preparándola para el siguiente ciclo.

);repeat

Cierra el bucle de repetición.

(princ)

Terminar limpiamente.

);defun
Cierra la función.
(princ)

Limpieza de carga.

A continuación se incluye otra rutina que le permite cambiar globalmente la


altura del texto sin afectar a otras entidades. Como verá, la única
diferencia es que hemos agregado un filtro condicional a la rutina.

(defun C:CHGTEXT ( / a ts n index b1 b2 b c d)

(setq a (ssget))

(setq ts (getreal "\nEnter New Text Height : "))

(setq n (sslength a))

(setq index 0)

(repeat n

(setq b1 (entget (ssname a index)))

(setq index (index+ 1))

(setq b (assoc 0 b1))

(if (= "TEXT" (cdr b))

(progn

(setq c (assoc 40 b1))


(setq d (cons (car c) ts))

(setq b2 (subst d c b1))

(entmod b2)

);progn
);if
);repeat
(princ)
);defun
(princ)

Pues apuesto a que tu cerebro duele después de mucho !!!

En la página de texto vamos a echar un vistazo rápido a las tablas.

INTRODUCCIÓN A LA BASE DE DATOS - PARTE 3

La base de datos de AutoCad no solo consta de entidades, sino que también incluye varias otras
secciones, como la SECCIÓN DE TABLAS.

Las tablas almacenan información sobre entidades que se mantienen globalmente dentro del
dibujo. Por ejemplo, cuando inserta un bloque en un dibujo, ¿cómo sabe AutoCAD cómo se ve el
bloque? La definición de un bloque se almacena en la tabla de bloques. ¿Qué sucede, por ejemplo,
si necesita crear una capa? Debe saber si la capa ya existe porque si intenta crear una capa que ya
existe, su programa se bloqueará. Por lo tanto, primero debe buscar en la Tabla de capas para ver
si existe la capa.

Hay nueve (9) Tablas a las que puedes acceder:

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"

Una tabla se divide en 2 partes: los 'nombres' de las entradas en la tabla y los 'detalles' de cada
entrada. Por ejemplo, en la Tabla de capas, el nombre de las entradas serían los nombres de las
capas que existen. Los detalles de una capa individual serían color, tipo de línea, encendido,
apagado, congelado, descongelado, bloqueado, desbloqueado o actual.

Para acceder a una tabla usaríamos la función (tblsearch). Echemos un vistazo a un ejemplo:

Suponga que desea saber si existe una capa llamada ACERO en su dibujo. Primero crea la capa
ACERO y luego escribe lo siguiente:

(setq t (tblsearch "LAYER" "STEEL"))

La lista de entidades de la capa ACERO debe devolverse:

((0 . "LAYER") (2 . "STEEL") (70 . 64) (62 . 7) (6 . "CONTINOUS"))

La primera parte de la lista de entidades es '0', que indica 0 asociativo.

En este caso es una entrada en la tabla "LAYER".

Asociativo 2 indica el nombre de la capa. ACERO en nuestro caso.


Asociativo 70 es el estado de la entidad. 1 está congelado, 2 está congelado
en los nuevos puertos de vista de espacio de papel y 4 está bloqueado. Estos
números se agregan a 64. En este caso, la capa no está congelada ni
bloqueada.

Asociativa 62 es el color de la capa. El nuestro es blanco, que es el número


de color 7. Si el número de color es un número negativo, entonces la capa
está desactivada.

Asociativo 6 es el tipo de línea de la capa, en este caso, "CONTINUOUS".

Si (tblsearch) no hubiera encontrado la capa, habría devuelto 'nil' y sabría


que la capa no existía.

A veces no sabes el nombre de una capa o un bloque, pero necesitas una lista
de ellos. Esto es cuando la función (tblnext) entra en juego.

Supongamos que existen 4 capas en su dibujo. Los nombres de las capas son
MECH, ACERO, TUBO y TXT. Introduzca la siguiente :

(tblnext "Layer")

AutoLISP debería devolver algo como esto:

((0 . "LAYER") (2 . "PIPE") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))


Repita el mismo comando cuatro veces adicionales. Obtendrá una nueva lista
de entidades para cada una de las capas. La última vez que escriba el
comando AutoLISP devolverá 'nil' porque no hay más capas adicionales.

Echemos un vistazo a esto en acción. Vamos a diseñar un cuadro de diálogo


que muestra una lista desplegable de todas las capas disponibles en un
dibujo específico. El usuario puede elegir cualquier capa que pueda usarse
dentro de su rutina.

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)

Si desea la codificación de origen para esta rutina de AutoLisp, simplemente haga clic aquí. Saludos
y mantengan bien ...

También podría gustarte