You are on page 1of 24

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.

htm, agradecimientos a KENNY por


permitir esta traduccin.

REFERENCIA DCL
Si entra en la carpeta Support de AutoCAD, encontrar un archivo llamado Base.dcl. Este archivo
contiene las definiciones bsicas DCL y definiciones para los prototipos comnmente usados.
Tambin encontrar en la carpeta el archivo Acad.dcl. Este archivo contiene las definiciones
estndar de todos los cuadros de dilogos usados por AutoCAD.
Como trabaja el DCL.
Primero crearemos un nuevo archivo DCL llamado incluir.dcl:
incluir : dialog {
label = Elija un punto:;
ok_cancel;
}
Ahora, crearemos un nuevo archivo de AutoLISP llamado incluir.lsp con el siguiente cdigo:
(defun c:incluir () ;_define la funcin
(setq dcl_id (load_dialog "incluir.dcl")) ;_carga el archivo dcl
(if (not (new_dialog "incluir" dcl_id)) ;_carga el cuadro de dilogo
(exit) ;_si no esta cargado sale
)
(action_tile
"cancel"
"(done_dialog)
(setq resultado nil)"
) ;_si selecciona el botn Cancel, el cuadro se cierra.
(action_tile
"accept"
"(done_dialog)
(setq resultado t)"
) ;_si selecciona el botn OK fue aceptado
(start_dialog) ;_comienza el cuadro de dilogo
(unload_dialog dcl_id) ;_descarga el cuadro de dilogo
(princ)
) ;_defun
(princ) ;_carga limpia
Ahora, abra AutoCAD, cargue la rutina y luego ejectela.
Deber aparecer un cuadro de dilogo muy simple, como el siguiente:

Ahora, supongamos que tenemos un logo de una empresa, o algo parecido, y queremos que
aparezca en todos los cuadros de dilogos personales. Podramos poner el cdigo del logo en todos
nuestros archivos DCL. Pero que pasa si cambiamos nuestro nmero de telfono?. Tendramos
que editar todos nuestros cdigos de los cuadro de dilogos que contienen nuestro logo. Pero hay
una forma de evitar eso. Crearemos otro archivos DCL para nuestro logo, e incluiremos este

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

archivo en nuestro archivo DCL original. Hacindolo de la siguiente manera, slo tendremos que
cambiar el archivo DCL principal si queremos hacer la revisin para nuestro logo.
Vamos a crear nuestro primer archivo DCL para el logo.
Crearemos un nuevo archivo DCL llamado logo.dcl:
logo : boxed_column {
:paragraph {
:text_part {
label = Traido a;
}
:text_part {
label = Usted por;
}
:text_part {
label = AfraLisp;
}
:text_part {
label = 063-235837;
}
}
}
Ahora edite el archivo incluir.dcl y agregue lo siguiente:
@include logo.dcl y deber quedar de la siguiente forma:
@include logo.dcl
incluir : dialog {
label = Elija un punto:;
ok_cancel;
logo;
}
Vuelva a cargar y ejecute el archivo incluir.lsp y deber aparecer lo siguiente:

Ok, el logo no es de lo mejor, pero estoy seguro que se le ocurrir una idea mucho mejor.
Puede incluir dos o ms referencias para archivos DCL si lo desea.
Permtame mostrarle otro ejemplo. Primero crearemos un nuevo archivo DCL llamado gpunto.dcl
con el siguiente cdigo:
gpunto : boxed_column {
label = Ejemplo de punto;
:button {

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
label = Seleccione Punto >>;
key = ocultar;
width = 12;
fixed_width = true;
mnemonic = S;
}
:edit_box {
key = eb1;
label = &X:;
width = 8;
fixed_width = true;
}
:edit_box {
key = eb2;
label = &Y:;
width = 8;
fixed_width = true;
}
:edit_box {
key = eb3;
label = &Z:;
width = 8;
fixed_width = true;
}
}
Ahora crearemos un nuevo archivo DCL llamado punto.dcl y escribiremos lo siguiente:
@incluide gpunto.dcl
@include logo.dcl
punto : dialog {
label = Elija un punto:;
gpunto;
ok_cancel;
logo;
}
Ahora crearemos un archivo AutoLISP llamado punto.lsp y el cdigo ser el siguiente:
(defun c:gpunto
() ;_define la funcin
(setq
ptx "1.000"
pty "0.000"
ptz "0.000"
flag 4
) ;_asignamos por defecto los valores para ptx, pty, ptz y flag
(setq dcl_id (load_dialog "punto.dcl")) ;_carga el archivo DCL
(while (> flag 2)
;;se comprueba el valor de flag y corre en el ciclo si es mayor a 2
(if
(not (new_dialog "punto" dcl_id)) ;_carga el cuadro de dilogo
(exit) ;_si no lo carga sale
)
(set_tile "eb1" ptx) ;_asigna el valor x
(set_tile "eb2" pty) ;_asigna el valor y
(set_tile "eb3" ptz) ;_asigna el valor z
(mode_tile "eb1" 2) ;_asigna el foco al cuadro de texto para el valor x

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
(mode_tile "eb1" 3) ;_selecciona el contenido
(action_tile
"cancel"
"(done_dialog)
(setq resultado nil)"
) ;_si se selecciona el botn Cancel. Se cierra el cuadro
;;esta accin asigna a flag el valor 0
(action_tile
"accept"
"(setq ptx (get_tile \"eb1\"))
(setq pty (get_tile \"eb2\"))
(setq ptz (get_tile \"eb3\"))
(done_dialog)
(setq resultado t)"
) ;_si el botn OK se selecciona, se obtienen los valores de los cuadros de
textos,
;;cierra el cuadro.
;;esta accin asigna a flag el valor 1
(action_tile
"ocultar"
"(done_dialog 4)"
) ;_if se selecciona el botn Seleccione punto,
;;oculta el cuadro de dilogo a asigna el valor 4 a flag
(setq flag (start_dialog)) ;_comienza el cuadro de dilogo y asigna el valor a
flag del star_dialog
(if (= flag 4) ;_si el botn Seleccione punto es seleccionado
(progn ;_hace lo siguiente
(setq selpunto (getpoint "\nPunto de insercin: ")) ;_obtenemos el punto
(setq ptx (rtos (car selpunto) 2 4)) ;_obtenemos el valor de x
(setq pty (rtos (cdar selpunto) 2 4)) ;_obtenemos el valor de y
(setq ptz (rtos (cddar selpunto) 2 4)) ;_obtenemos el valor de z
) ;_progn
) ;_if
) ;_while
(unload_dialog dcl_id) ;_descarga el cuadro de dilogo
(princ)
) ;_defun
(princ) ;_carga limpia

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

Su cuadro de dilogo deber ser como el siguiente:

Si lo desea, podra crear una biblioteca entera de archivos DCL que contienen las definiciones
modificadas para requisitos particulares del cuadro de dilogo que usted podra incluir como
referencia en todos sus archivos DCL.

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

DATOS POR DEFECTO EN CUADROS DE DILOGOS


Cuando un usuario trabaja con cuadros de dilogos, ingresa los datos requeridos y luego cierra el
cuadro de dilogo. Al volver al cuadro de dilogo, los datos contenidos en el cuadro se deben
actualizar para mostrar los datos anteriores ingresados por los usuarios. La mayora de los usuarios
tienden a reutilizar el mismo sistema de datos repetidas veces, y puede ser frustrante tener que
escribir el mismo dato repetidas veces cuando se reabre un cuadro de dilogo.
Para crear valores por defecto en un cuadro de dilogo, es un paso de 5 procesos:
?? Recuperar las variables globales que contienen los datos por defecto.
?? Si no existen, cree un mismo dato por defecto.
?? Muestre los datos por defecto al usuario.
?? Permita que el usuario cambie los datos.
?? Cuando el usuario salga del cuadro de dilogo, almacene por defecto esos datos.
La siguiente aplicacin nos mostrar como hacer esto:
Cdigo DCL:
test1 : dialog {
label = Defectos del Dilogo;
:row {
//define una fila
:toggle {
key = tog1;
label = On o Off;
}
:toggle {
key = tog2;
label = Izquierda o Derecha;
}
}
//final de la fila
spacer;
//poner un espacio
:edit_box {
key = eb2;
label = &Ingrese un par de letras;
}
spacer;
//poner un espacio
:edit_box {
key = eb1;
label = &Valor del desplazamiento;
edit_width = 6;
}
:slider {
key = mislider;
max_value = 100;
min_value = 0;
value = 50;
small_increment = 2;
big_increment = 5;
}
spacer;
ok_cancel;
}

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
Cdigo AutoLISP:
(defun c:test1 () ;_define la funcin
(if (not lngth) ;_si no hay valores por defecto
(setq lngth "50.0") ;_fija un valor por defecto
) ;_if
(if (not letras)
(setq letras "ABC")
) ;_if
(if (not toggle1)
(setq toggle1 "1")
) ;_if
(if (not toggle2)
(setq toggle2 "0")
) ;_if
(setq dcl_id (load_dialog "test1.dcl")) ;_carga el cuadro
(if (not (new_dialog "test1" dcl_id))
(exit)
) ;_if
;;esta seccin fija los valores por defecto del cuadro de dilogo
(set_tile "tog1" toggle1)
(set_tile "tog2" toggle2)
(set_tile "eb2" letras)
(set_tile "eb1" lngth)
(set_tile "mislider" lngth)
;;esta seccin recupera los valores del cuadro de dilogo
(action_tile
"mislider" ;_si el usuario mueve el slider
"(slider_action $value $reason)"
) ;_pasa argumentos a slider_action
(action_tile
"eb1" ;_si el usuario ingresa una longitud
"(ebox_action $value $reason)"
) ;_pasa argumento a ebox_action
(defun slider_action (val por) ;_define la funcin con argumentos
(if
(or (= por 2) (= por 1)) ;_chequear valores
(set_tile "eb1" val)
)
)
(defun ebox_action (val por) ;_define la funcin con argumentos
(if
(or (= por 2) (= por 1)) ;_chequear valores
(set_tile "mislider" val)
)
) ;_actualiza el slider
(action_tile
"tog1"
"(setq toggle1 $value)"
)
(action_tile
"tog2"
"(setq toggle2 $value)"
)
(action_tile
"accept"
"(progn
(setq lngth (get_tile \"eb1\"))
(setq letras (get_tile \"eb2\"))

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

(done_dialog) (setq clicusuario t)


)"
)
(action_tile
"cancel"
"(done_dialog) (setq clicusuario nil)"
)
(start_dialog)
(unload_dialog dcl_id)
(if clicusuario ;_chequea si Ok fue seleccionado
(alert (strcat "Usted seleccion: " lngth " y " letras))
) ;_if clicusuario
(princ)
) ;_defun
(princ)
Ahora cargue y ejecute la rutina en AutoCAD. Ingrese algunos datos nuevos y salga del cuadro de
dilogo. Ejecute la rutina de nuevo. Se dar cuanta que el cuadro de dilogo ah mantenido los
datos que ingreso la ltima vez.
Esto es bueno cuando se trabaja en un mismo dibujo, pero si usted comienza un nuevo dibujo, o
cierra AutoCAD los valores se perdern. Vamos a rescribir la rutina para tener permanentemente
esos valores. Para hacer eso usaremos Application Data:
Cdigo DCL:
test2 : dialog {
label = Defectos del Dilogo;
:row {
//define una fila
:toggle {
key = tog1;
label = On o Off;
}
:toggle {
key = tog2;
label = Izquierda o Derecha;
}
}
//final de la fila
spacer;
//poner un espacio
:edit_box {
key = eb2;
label = &Ingrese un par de letras;
}
spacer;
//poner un espacio
:edit_box {
key = eb1;
label = &Valor del desplazamiento;
edit_width = 6;
}
:slider {
key = mislider;
max_value = 100;
min_value = 0;
value = 50;
small_increment = 2;
big_increment = 5;

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
}
spacer;
ok_cancel;
}
Cdigo AutoLISP
(defun c:test2 ()
;;Esta seccin recupera los datos por defecto del archivo *.CFG
(setq lngth (getcfg "AppData/CadKen/default1"))
(if (= lngth nil) ;_si esto es nil
(progn
(setcfg "AppData/CadKen/default1" "50.0")
(setq lngth (getcfg "AppData/CadKen/default1"))
) ;_progn
) ;_if
(setq letras (getcfg "AppData/CadKen/default2"))
(if (= letras nil)
(progn
(setcfg "AppData/CadKen/dafault2" "ABC")
(setq letras (getcfg "AppData/CadKen/default2"))
) ;_progn
) ;_if
(setq toggle1 (getcfg "AppData/CadKen/default3"))
(if (= toggle1 nil)
(progn
(setcfg "AppData/CadKen/default3" "1")
(setq toggle1 (getcfg "AppData/CadKen/defautl3"))
) ;_progn
) ;_if
(setq toggle2 (getcfg "AppData/CadKen/default4"))
(if (= toggle2 nil)
(progn
(setcfg "AppData/CadKen/default4" "0")
(setq toggle2 (getcfg "AppData/CadKen/defautl4"))
) ;_progn
) ;_if
(setq dcl_id (load_dialog "test2.dcl"))
(if (not (new_dialog "test2" dcl_id))
(exit)
) ;_if
;;esta seccin fija los valores por defecto del cuadro de dilogo
(set_tile "tog1" toggle1)
(set_tile "tog2" toggle2)
(set_tile "eb2" letras)
(set_tile "eb1" lngth)
(set_tile "mislider" lngth)
;;esta seccin recupera los valores por del cuadro de dilogo
(action_tile
"mislider" ;_si el usuario mueve el slider
"(slider_action $value $reason)"
) ;_pasa argumentos a slider_action
(action_tile
"eb1" ;_si el usuario ingresa una longitud
"(ebox_action $value $reason)"
) ;_pasa argumento a ebox_action

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

10

(defun slider_action (val por) ;_define la funcin con argumentos


(if
(or (= por 2) (= por 1)) ;_chequear valores
(set_tile "eb1" val)
)
)
(defun ebox_action (val por) ;_define la funcin con argumentos
(if
(or (= por 2) (= por 1)) ;_chequear valores
(set_tile "mislider" val)
)
) ;_actualiza el slider
(action_tile
"tog1"
"(setq toggle1 $value)"
)
(action_tile
"tog2"
"(setq toggle2 $value)"
)
(action_tile
"accept"
"(progn
(setq lngth (get_tile \"eb1\"))
(setq letras (get_tile \"eb2\"))
(done_dialog) (setq clicusuario t))"
)
(action_tile
"cancel"
"(done_dialog) (setq clicusuario nil)"
)
(start_dialog)
(unload_dialog dcl_id)
(if clicusuario
(progn
(setcfg "AppData/CadKen/default1" lngth)
(setcfg "AppData/CadKen/default2" letras)
(setcfg "AppData/CadKen/default3" toggle1)
(setcfg "AppData/CadKen/default4" toggle2)
(alert (strcat "Usted ingreso: " lngth " y " letras))
) ;_progn
) ;_if clicusuario
(princ)
) ;_defun
(princ)
Ahora cargue y ejecuta la rutina. De nuevo, agregue algunos valores y cierre el cuadro de dilogo.
Ahora cierre AutoCAD. Abra AutoCAD cargue y ejecute la rutina de nuevo. Se han conservado sus
valores...

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

11

UNA BARRA DE PROGRESO EN DCL


(C) 1999 by Nir sullam & anySOFT
Este pequeo tutorial le enseara a crear una pequea barra de progreso en un cuadro de dilogo.
Esto es necesario cuando su programa informe al usuario sobre alguna operacin cuando
generalmente toma cierto tiempo. Un ejemplo es cuando usted selecciona una gran cantidad de
objetos y el programa genera algn cambio en ellos.
Primero crearemos un cuadro de dilogo para este ejemplo: esto contendr un edit_box para
ingresar el numero mximo, y un botn start para comenzar el ciclo de la funcin. El cuadro de la
imagen es el cuadro donde se mostrara la barra de progreso.
dcltut

}
}

: dialog {
fixed_width = true;
label = "Barra de Progreso DCL";
key = "br-label";
: row {
: button {
key
= "start";
label
= "Start";
mnemonic = "S";
}
: edit_box {
key
= "max";
label
= "Max:";
mnemonic = "M";
}
}
: image {
key
= "progbar";
fixed_width = 50;
height = 1;
}
: row {
: button {
label = "OK";
mnemonic = "O";
key = "ok";
}
: button {
label = "Cancel";
mnemonic = "C";
key = "cancel";
is_cancel = true;
}
}
: row {
: errtile {
label = "";
key = "error";
width = 26;
}

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
El resultado del cuadro de dilogo es como el siguiente: (la imagen fue capturada mientras
trabajaba).

El cdigo en AutoLISP es el siguiente:


;;;
;;;
;;;
;;;

DCL Tutorial
Subject: Creating a ProgressBar in DCL.
This Tutorial is CopyRighted by Nir sullam and anySOFT 1999.
It is free to use and free for distribution

(defun C:PROGRESS (/ loopmax dcltut_dat)


(setq dcltut_dat (load_dialog "dcltut.dcl"))
(new_dialog "dcltut" dcltut_dat)
;;si no es fijado el valor mximo, se fija por defecto a 100.
(if (null loopmax)
(setq loopmax 100)
)
;;color de la imagen
(setq fillx (dimx_tile "progbar"))
(setq filly (dimy_tile "progbar"))
(start_image "progbar")
(fill_image 0 0 fillx filly -15)
(end_image)
;;Fija el valor de edit_box
(set_tile "max" (itoa loopmax))
;;Asigna el loop al boton de partida
(action_tile "start" "(loopfunc)")
(action_tile "ok" "(done_dialog)")
(action_tile "cancel" "(done_dialog)")
(start_dialog)
(UNLOAD_DIALOG dcltut_dat)
)
;;;---------------------------------------------(defun loopfunc
(/ fillx filly loopfunc loopmax loop-counter)
;;Obtenemos la longitud horizontal del "progbar"
(setq fillx (dimx_tile "progbar"))
;;Obtenemos la longitud vertical del "progbar"
(setq filly (dimy_tile "progbar"))
(start_image "progbar")
(fill_image 0 0 fillx filly -15)
(end_image)
;;Contador a 0
(setq loop-counter 0)
(setq loopmax (atoi (get_tile "max")))
(while (<= loop-counter loopmax)
(start_image "progbar")

12

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

13

(fill_image 0 0 (/ (* loop-counter fillx) loopmax) filly 5)


(end_image)
(set_tile "error" (rtos loop-counter))
(setq loop-counter (1+ loop-counter))
)
)
Nota: Para obtener una Barra de Progreso Vertical modifique el FILLY en vez del FILLX!
ATRIBUTOS Y CUADROS DE DILOGOS
Cuando se quiere editar atributos en AutoCAD necesitamos usar el comando _attedit. En primer
lugar, necesitamos seleccionar los atributos que queremos editar. Luego, el cuadro de dilogo Edit
Attribute aparecer para que nosotros podamos agregar o cambiar valores de los atributos. No
puede modificar el cuadro de ninguna manera, y muestra todos los atributos quiera o no. Tambin,
si tiene muchos atributos, necesitar cambiar la pgina del cuadro para cambiar el atributo
deseado.
En este tutorial vamos a ver como extraer datos de atributos desde un bloque, mostrando los datos
en un cuadro de dilogo personalizado, y actualizaremos los datos de los atributos al salir del
cuadro.
Qu necesitamos hacer?
1.
2.
3.
4.

Buscar el bloque que contiene los datos con atributos.


Extraer los datos de los atributos del bloque y mostrarlos en el cuadro de dilogo.
Permitir al usuario cambiar datos si l lo desea.
Actualizar los valores de los atributos con los nuevos datos ingresados en el cuadro.

Ok, ahora descargue el siguiente archivo desde http://www.afralisp.com/zip1/attab.zip, el archivo


tiene el cdigo fuente y el dwg que deber tener lo siguiente:

Bien, admito que el cuadro con atributos no es lo mas sofisticado, pero es bastante para darle una
idea general.
Ahora, el archivo *.lsp y *.dcl gurdelo dentro de la carpeta de AutoCAD y luego en la lnea de
comandos escriba (load addat) y de un enter. Luego escriba en la lnea de comandos de AutoCAD
addat y de un enter.

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

14

Deber aparecer el siguiente cuadro:

Cambie algunos datos y presione Ok. Los datos debern actualizarse al momento de salir del
cuadro.
Usted puede ampliar la rutina para dejarla a sus necesidades, usando el cdigo como plantilla.
Nota: No tiene porque mostrar todos los atributos de un bloque. Slo muestre los que desea
modificar. Tambin puede crear cuadros de dilogos para distintos datos, por ejemplo: Uno para el
titulo de un bloque, uno para revisin, etc. Aunque todos los datos estn contenidos en un atributo.
Cdigo DCL:
attab : dialog {
label = Ttulo del dibujo;
: edit_box {
label = &Nmero dibujo;
key = eb1;
edit_width = 30;
}
: edit_box {
label = &Revisin;
key = eb2;
edit_width = 30;
}
: edit_box {
label = &Dibujado por;
key = eb3;
edit_width = 30;
}
: edit_box {
label = &Fecha;
key = eb4;
edit_width = 30;
}
: edit_box {
label = &Ttulo;
key = eb5;
edit_width = 30;
}
ok_cancel;
: text_part {

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
label = Afralisp http://www.afralisp.com;
}
}
Cdigo AutoLISP, con varios comentarios para guiarle:
;;;CODING STARTS HERE
;;;
;;;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.
;;;*******************************************************************************
;;;
AfraLisp
;;;
http://www.afralisp.com
;;;
afralisp@afralisp.com
;;;
afralisp@mweb.com.na
;;;*******************************************************************************
;;;This application will extract attributes from a block and display them in a
;;;dialog box. The attributes will then be updated. Attab.dcl and Attab.dwg are
;;;required and must be within the AutoCAD search path.
;;;
;;;Usage : Open Attab.dwg then load and run Attab.lsp.
;;;*******************************************************************************
(prompt "\nATTAB cargado... ")
(defun c:attab ()
;;buscar todos los bloques con atributos en el dibujo
(setq ss1 (ssget "_x" '((0 . "INSERT") (66 . 1))))
;;si son bloques
(if ss1
;;haga lo siguiente
(progn
;;contar los bloques
(setq contar 0
emax
(sslength ss1)
)
;;extraer el nombre del bloque
(while (< contar emax)
(setq en
(ssname ss1 contar)
ed
(entget en)
blkn (dxf 2 ed)
)
;;Verificar si es nuestro bloque
(if (= "attab-info" blkn)
;;si es as, apaga el contador y pone encontro a t
(setq
contar emax
encontro t
)
;;si no es nuestro bloque, se incrementa en contador
(setq contar (1+ contar))
) ;_if
) ;_while
;;si encontr nuestro bloque

15

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
(if encontro
;;muestra el cuadro de dilogo
(ddisplay)
;;si no encontr nuestro bloque
(alert "\nEl dibujo no contiene atributos")
) ;_if
) ;_progn
;;si no hay bloques en el dibujo
(alert "\nDibujo incorrecto")
) ;_if
(princ)
) ;_defun
(defun ddisplay
()
;;carga el cuadro de dilogo
(setq dcl_id (load_dialog "attab.dcl"))
;;varificar si existe
(if (not (new_dialog "attab" dcl_id))
(exit)
) ;_if
;;obtener datos del bloque
(setq edata (entget en))
;;obtener el primer atributo de la lista
(setq edata (entget (entnext (dxf -1 edata))))
;;obtener el numero de dibujo
(setq eb1 (dxf 1 edata))
;;obtener el segundo atributo de la lista
(setq edata (entget (entnext (dxf -1 edata))))
;;obtener la revisin
(setq eb2 (dxf 1 edata))
;;obtener el tercer atributo de la lista
(setq edata (entget (entnext (dxf -1 edata))))
;;obtener el nombre
(setq eb3 (dxf 1 edata))
;;obtener el cuarto atributo de la lista
(setq edata (entget (entnext (dxf -1 edata))))
;;obtener la fecha
(setq eb4 (dxf 1 edata))
;;obtener el quinto atributo de la lista
(setq edata (entget (entnext (dxf -1 edata))))
;;obtener el titulo
(setq eb5 (dxf 1 edata))
;;poner la informacin en el cuadro de dilogo
(set_tile "eb1" eb1)
(set_tile "eb2" eb2)
(set_tile "eb3" eb3)
(set_tile "eb4" eb4)
(set_tile "eb5" eb5)
;;dar el enfoque al numero de dibujo
(mode_tile "eb1" 2)
;;si se presiona cancel salir
(action_tile
"cancel"
"(done_dialog) (setq clicusuario nil)"
)
;;si se presiona OK, recupera los valores
(action_tile

16

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
"accept"
(strcat
"(progn
(setq eb1a (get_tile \"eb1\"))"
"(setq eb2a (get_tile \"eb2\"))"
"(setq eb3a (get_tile \"eb3\"))"
"(setq eb4a (get_tile \"eb4\"))"
"(setq eb5a (get_tile \"eb5\"))"
"(done_dialog) (setq clicusuario t))"
)
) ;_action_tile
;;empezar el cuadro
(start_dialog)
;;descargar el cuadro
(unload_dialog dcl_id)
;;si se selecciono OK
(if clicusuario
(progn
;;obtener los datos del bloque
(setq edata (entget en))
;;obtener el primer atributo de la lista
(setq edata (entget (entnext (dxf -1 edata))))
;;cambiar la lista con los nuevos valores, si es que hay
(setq el (subst (cons 1 eb1a) (assoc 1 edata) edata))
;;actualizar el atributo
(entmod el)
;;obtener el segundo atributo de la lista
(setq edata (entget (entnext (dxf -1 edata))))
;;cambiar la lista con los nuevos valores, si es que hay
(setq el (subst (cons 1 eb2a) (assoc 1 edata) edata))
;;actualizar el atributo
(entmod el)
;;obtener el tercer atributo de la lista
(setq edata (entget (entnext (dxf -1 edata))))
;;cambiar la lista con los nuevos valores, si es que hay
(setq el (subst (cons 1 eb3a) (assoc 1 edata) edata))
;;actualizar el atributo
(entmod el)
;;obtener el cuarto atributo de la lista
(setq edata (entget (entnext (dxf -1 edata))))
;;cambiar la lista con los nuevos valores, si es que hay
(setq el (subst (cons 1 eb4a) (assoc 1 edata) edata))
;;actualizar el atributo
(entmod el)
;;obtener el quinto atributo de la lista
(setq edata (entget (entnext (dxf -1 edata))))
;;cambiar la lista con los nuevos valores, si es que hay
(setq el (subst (cons 1 eb5a) (assoc 1 edata) edata))
;;actualizar el atributo
(entmod el)
;;regenerar el dibujo
(command "_.regen")
) ;_progn
) ;_if
(princ)
) ;_defun

17

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

18

(defun dxf (code elist)


(cdr (assoc code elist))
) ;_defun
(princ)
Observe que no hay tratamiento de errores en la rutina y se han dejado todas las variables como
globales con el fin de que pueda comprobar los valores mientras analiza la rutina.

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
DCL SIN EL ARCHIVO DCL
Alguna vez a tenido deseos de cargar un cuadro de dilogo sin el archivo DCL?
Que es lo que esta diciendo kenny?
Fcil, el siguiente cdigo AutoLISP escribir el cdigo DCL para nosotros.
Cdigo AutoLISP:
(prompt "\nEscriba TEST_DCL3 para correr el programa...")
(defun c:TEST_DCL3 (/ dcl_id fn fname)
(vl-load-com)
(crear-dialogo)
(setq dcl_id (load_dialog fname))
(if (not (new_dialog "temp" dcl_id))
(exit)
) ;_if
(set_tile "nombre" "Ingrese el nombre aqu")
(mode_tile "nombre" 2)
(action_tile "nombre" "(setq nombre $value)")
(action_tile "edad" "(setq edad $value)")
(action_tile "accept" "(val1)")
(start_dialog)
(unload_dialog dcl_id)
(alert (strcat "Tu nombre es "
nombre
"\ny tu tienes "
edad
" aos de edad."
)
)
(vl-file-delete fname)
(princ)
) ;_defun
(defun val1 ()
(if (= (get_tile "nombre") "Ingrese el nombre aqu")
(progn
(set_tile "error" "Debes ingresar un nombre!")
(mode_tile "nombre" 2)
) ;_progn
(val2)
) ;_if
) ;_defun
(defun val2 ()
(if (< (atoi (get_tile "edad")) 1)
(progn
(set_tile "error"
"Edad invalida - Por favor intente de nuevo!!"
)
(mode_tile "edad" 2)
) ;_progn
(done_dialog)
) ;_if
) ;_defun

19

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

20

(defun crear-dialogo ()
(setq fname (vl-filename-mktemp "dcl.dcl"))
(setq fn (open fname "w"))
(write-line
"temp : dialog { label = \"Test Dilogo N 3\";
: edit_box { label = \"Ingrese su nombre :\"; mnemonic = \"N\";
key = \"nombre\"; alignment = centered; edit_limit = 30;
edit_width = 30; } : edit_box { label = \"Ingrese su edad :\";
mnemonic = \"A\"; key =\"edad\"; alignment = centered;
edit_limit = 3; edit_width = 3; value = \"22\";
} : button { key = \"accept\"; label = \"OK\";
is_default = true; fixed_width = true; alignment = centered;
} : errtile { width = 34; } }"
fn
)
(close fn)
) ;_defun
(princ)
Note que no hay archivo DCL esta vez. Cargue el archivo y luego ejectelo. Deber desplegarse un
cuadro parecido al siguiente:

Y al presionar OK deber aparecer el siguiente cuadro:

Hemos cargado y ejecutado un archivo DCL aunque no tenemos uno. Ahora podr compilar esto en
un archivo FAS si lo desea. (Hey, un archivo FAS con DCL genial!).
En la prxima pgina, veremos ms de cerca este fenmeno que es verdaderamente asombroso. Al
mismo tiempo disearemos una Variable-auto-self-sizing-Dialog-Box-without-a-DCL-file, es decir,
un cuadro de dilogo auto-variable sin un archivo DCL.

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

21

Variable-auto-self-sizing-Dialog-Box-without-a-DCL-file
En este tutorial crearemos una aplicacin para extraer atributos de un bloque y mostraremos los
atributos en un cuadro de dilogo. El cuadro de dilogo ser creado on-the-fly y el nmero de
cuadros de textos de atributos se determinar por el nmero de atributos que contenga el bloque.
Usaremos mucho cdigo de Visual LISP con estas rutinas, y tambin deseo demostrar un mtodo
para extraer y actualizar atributos usando Visual LISP.
No hay ms explicacin, toda la explicacin necesaria esta en el cdigo.
Cdigo AutoLISP:
;;;DCLATT.LSP
;;;This program is for demonstration and tutorial purposes only.
;;;-------------------------------------------;;;This program, using Visual Lisp will extract attributes from
;;;a block and display them in a dialog box.
;;;The dialog box will be created "on the fly" with the relevant
;;;number of edit boxes to suit the number of attributes within
;;;the block.
;;;The new attribute data will then be retrieved from the dialog
;;;and the block updated.
;;;Written by Kenny Ramage - May 2002
;;;afralisp@mweb.com.na
;;;http://www.afralisp.com
;;;------------------------------------------;;;Usage :
;;;Load by typing (load "DCLATT") at the command prompt.
;;;Type DCLATT at the command prompt to run.
;;;Select any block containing attributes.
;;;Replace any of the values in the text boxes to updated
;;;the attributes.
;;;-------------------------------------------;;;Dependencies : None that I know of.
;;;Not much in the way of error checking I'm afraid.
;;;--------------------------------------------;;;Limitations : Will only edit a certain number of attributes.
;;;System dependent.
;;;I don't recommend more than 10.
;;;I've had up to 14 on my display.
;;;---------------------------------------------;;;---------------------------------------------(prompt "\nEscriba DCLATT para correr la rutina...")
(defun c:dclatt (/
theblock
thelist n
taglist
txtlist lg
fname
fn
nu
dcl_id
l
relist
)
;;Cargar las extensiones de Visual Lisp
(vl-load-com)
;;obtener la entidad y su nombre
(setq theblock (car (entsel)))
;;Convertir el objeto a vl
(setq theblock (vlax-ename->vla-object theblock))
;;Verificar si es un bloque
(if (= (vlax-get-property theblock 'objectname)

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
"AcDbBlockReference"
)
(progn
;;Verificar si tiene atributos
(if (= (vlax-get-property theblock 'hasattributes) :vlax-true)
(progn
;;Obtener los atributos
(getatt theblock)
;;Crear el cuadro de dilogo
(crear-dialogo)
;;Ejecutar el cuadro de dilogo
(run-cuadro)
;;Actualizar los atributos
(upatt)
) ;_progn
;;Si no contiene atributos, se informa al usuario
(alert
"El bloque no contiene atributos!! - Por favor intntelo de nuevo."
)
) ;_if
) ;_progn
;;Si la entidad seleccionada no es un bloques, se informa al usuario
(alert
"La entidad no es un bloque!! - Por favor intntelo de nuevo."
)
) ;_if
(princ)
) ;_defun
(defun getatt (enam)
;;Recuperar atributos
(setq thelist (vlax-safearray->list
(variant-value (vla-getattributes enam))
)
)
;;Proceso para cada atributo
(foreach n thelist
;;Obtiene el nombre de la etiqueta del atributo
(setq taglist (cons (vla-get-tagstring n) taglist)
;;Obtiene el texto del atributo
txtlist (cons (vla-get-textstring n) txtlist)
) ;_setq
) ;_foreach
;;Cuantos atributos son?
(setq lg (length taglist))
;;Invertir las listas
(setq taglist (reverse taglist)
txtlist (reverse txtlist)
)
) ;_defun
(defun crear-dialogo ()
;;Crear un archivo DCL temporal
(setq fname (vl-filename-mktemp "dcl.dcl"))
;;Abrir el archivo para escribir
(setq fn (open fname "w"))
;;Escribir el cdigo de cabecera del cuadro de dilogo

22

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.
(write-line
"temp : dialog { label = \"Edicin de atributos\";"
fn
)
(setq nu 0)
;;Comenzar el ciclo para crear los cuadros de textos
(repeat lg
;;Crear los cuadros de textos
(write-line ": edit_box {" fn)
(setq l (strcat "\"" "eb" (itoa nu) "\"" ";"))
(write-line (strcat "key = " l) fn)
(setq l (nth nu taglist))
(write-line (strcat "label = " "\"" l "\"" ";") fn)
(setq l (nth nu txtlist))
(write-line (strcat "value = " "\"" l "\"" ";") fn)
(write-line "alignment = centered; edit_width = 20; }" fn)
;;Incrementar la cuenta
(setq nu (1+ nu))
) ;_repeat
;;Boton Ok y Cancel
(write-line "ok_cancel; }" fn)
;;Cerrar el archivo temp
(close fn)
) ;_defun
(defun run-cuadro ()
;;Cargar el cuadro de dilogo
(setq dcl_id (load_dialog fname))
(if (not (new_dialog "temp" dcl_id))
(exit)
) ;_if
(mode_tile "eb0" 2)
;;Si el boton OK es seleccionado
(action_tile "accept" "(retatt)")
;;Dar comienzo al cuadro de dilogo
(start_dialog)
;;Descargar el cuadro de dilogo
(unload_dialog dcl_id)
;;Borrar el archivo temp del DCL
(vl-file-delete fname)
) ;_defun
(defun retatt ()
;;Resetear el conteo
(setq nu 0)
;;Comenzar el ciclo
(repeat lg
;;Recuperar el valor
(setq l (get_tile (strcat "eb" (itoa nu))))
;;aadirlo a una lista
(setq relist (cons l relist))
;;Incrementar el conteo
(setq nu (1+ nu))
) ;_repeat
(setq relist (reverse relist))
(done_dialog)
) ;_defun

23

Traduccin por SpeedCAD desde http://www.afralisp.com/lispa/lisp47.htm, agradecimientos a KENNY por


permitir esta traduccin.

24

(defun upatt ()
(setq nu 0)
;;Comenzar el ciclo
(repeat lg
;;actualizar el atributo
(vla-put-textstring (nth nu thelist) (nth nu relist))
;;Incrementar el conteo
(setq nu (1+ nu))
) ;_repeat
;;Actualizar el bloque
(vla-update theblock)
) ;_defun
(princ)
Ahora cree dos bloques que contengan diferentes numero de atributo, por ejemplo:

Cargue el archivo DCLATT.LSP y luego seleccione el primer bloque.


Su cuadro de dilogo deber aparecer con 3 cuadros de textos, que son los correspondientes al
numero de atributos que contiene el bloque:

Ejecute de nuevo la rutina y ahora seleccione el otro bloque:

El cuadro volver aparecer, pero esta vez con 2 atributos. Que tal eh?
Muchas gracias a Stig Madsen por ayudar con el cdigo de este proyecto.

You might also like