autolisp para principiantes

49
AutoLisp para Principiantes 1380 lectu ras Bienve nid o a es te curso de AutoLisp para Pr inci piant es y Us uar ios Interm edios , en el encontrarás toda la información, recursos y ejemplos disponibles que te ayudarán a aprender a programar en este lenguaje de una forma rápida, fácil, practica y concisa. Después de haber finalizado este curso, habrás conocido y comprendido la estructura de este lenguaje de programación  y podrás ser capaz de crear tus propias rutinas y nuevos comandos para AutoCAD y aplicaciones compatibles. Este curso es desarrollado por: © Mario Torr es Pejerr ey , 2011 © Construcmedia S.A.C., 2011 Este contenido esta protegido por derechos de propiedad intelectual y esta prohibida su reproducción parcial o total del mismo. Advertencia Legal 414 lecturas Todos los derechos de esta obra están reservados a Construcmedia S.A.C y a su autor Mario Torres Pejerrey . El editor prohíbe cualquier tipo de fijación, reproducción, transformación, distribución, ya sea mediante venta y/o alquiler y/o préstamo y/o cualquier otra forma de cesión de uso, y/o comunicación pública de la misma, total o parcialmente, por cualquier sistema o en cualquier soporte, ya sea por fotocopia, medio mecánico o electrónico, incluido el tratamiento informático de la misma, en cualquier lugar del universo. El almacenamiento o archivo de esta obra en un ordenador diferente al inicial está expresamente prohibido, así como cualquier otra forma de descarga (downloading), el único autorizado para visualizar este contenido es el usuario del portal ConstrucGeek que ha adquirido su derecho de visualizar la obra que ha sido puesta a su disposición. La protección de esta obra se extiende al universo, de acuerdo con las leyes y convenios internacionales.  Esta obra está destinada exclusivamente para el uso particular del usuario, quedando expresamente prohibido su uso profesional en empresas, centros docentes o cualquier otro, incluyendo a sus empleados de cualquier tipo, colaboradores y/o alumnos . La vulneración de cualquiera de estos derechos podrá ser considerada como una actividad penal tipificada en Decreto legislativo No. 822 de 1996 de Perú y en otras leyes de otros países. Si usted desea autorización para el uso profesional, puede obtenerla enviando un e-mail a [email protected]  o al teléfono (01)-989-285-745 (Lima-Perú). Si piensa o tiene alguna duda sobre la legalidad de la autorización de la obra, o que la misma ha llegado hasta usted vulnerando lo anterior, le agradeceremos que nos lo comunique al e-mail [email protected]  o al teléfono (01)-989-285-745 (Lima-Perú). Esta comunicación será absolutamente confidencial. Colabore contra el fraude. Si usted piensa que esta obra le ha sido de uti li dad, pe ro no se han abonado los derechos correspondientes, no podremos hacer más obras como ésta. © Mario Torres Pejerrey, 2011

Upload: mario-torres

Post on 01-Jun-2018

258 views

Category:

Documents


12 download

TRANSCRIPT

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 1/49

AutoLisp para Principiantes

1380 lecturas

Bienvenido a es te curso de AutoLisp para Principiantes y Usuarios Intermedios, en el encontrarás toda la información, recursos y ejemplos disponibles que te ayudarán a

aprender a programar en este lenguaje de una forma rápida, fácil, practica y concisa.

Después de haber finalizado este curso, habrás conocido y comprendido la estructura de este lenguaje de programación  y podrás ser capaz de crear tus propias rutinas y

nuevos comandos para AutoCAD y aplicaciones compatibles.

Este curso es desarrollado por:

© Mario Torres Pejerrey, 2011

© Construcmedia S.A.C., 2011

Este contenido esta protegido por derechos de propiedad intelectual y esta prohibida su reproducción parcial o total del mismo.

Advertencia Legal

414 lecturas

Todos los derechos de esta obra están reservados a Construcmedia S.A.C y a su autor Mario Torres Pejerrey .

El editor prohíbe cualquier tipo de fijación, reproducción, transformación, distribución, ya sea mediante venta y/o alquiler y/o préstamo y/o cualquier otra forma de cesión de uso,

y/o comunicación pública de la misma, total o parcialmente, por cualquier sistema o en cualquier soporte, ya sea por fotocopia, medio mecánico o electrónico, incluido el

tratamiento informático de la misma, en cualquier lugar del universo.

El almacenamiento o archivo de esta obra en un ordenador diferente al inicial está expresamente prohibido, así como cualquier otra forma de descarga (downloading), el único

autorizado para visualizar este contenido es el usuario del portal ConstrucGeek que ha adquirido su derecho de visualizar la obra que ha sido puesta a su disposición.

La protección de esta obra se extiende al universo, de acuerdo con las leyes y convenios internacionales.  Esta obra está destinada exclusivamente para el uso particular del

usuario, quedando expresamente prohibido su uso profesional en empresas, centros docentes o cualquier otro, incluyendo a sus empleados de cualquier tipo,

colaboradores y/o alumnos.

La vulneración de cualquiera de estos derechos podrá ser considerada como una actividad penal tipificada en Decreto legislativo No. 822 de 1996 de Perú y en otras leyes de

otros países.

Si usted desea autorización para el uso profesional, puede obtenerla enviando un e-mail a [email protected]  o al teléfono (01)-989-285-745 (Lima-Perú).

Si piensa o tiene alguna duda sobre la legalidad de la autorización de la obra, o que la misma ha llegado hasta usted vulnerando lo anterior, le agradeceremos que nos lo comunique

al e-mail [email protected] o al teléfono (01)-989-285-745 (Lima-Perú). Esta comunicación será absolutamente confidencial.

Colabore contra el fraude. Si usted piensa que esta obra le ha sido de utilidad, pero no se han abonado los derechos correspondientes, no podremos hacer más obras como ésta.

© Mario Torres Pejerrey, 2011

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 2/49

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 3/49

Al final te felicitarás por haber aprendido este potente lenguaje de programación que te será de mucha ayuda, personalmente y profesionalmente.

Acerca del Lenguaje de Programación AutoLisp

601 lecturas

AutoLISP es un lenguaje de alto nivel, potente y flexible, muy apropiado para aplicaciones CAD. Es una adaptación del lenguaje LISP (LISt Processing: Procesado de Listas) que

se desarrolló en los años cincuenta para la investigación de Inteligencia Artificial, basado en listas y símbolos, elementos fundamentales de AutoCAD lo que permite añadir nuevos

comandos de una forma fácil y accesible.

Una de las características principales de AutoLISP es el acceso a la base de datos de un dibujo de AutoCAD. La base de datos de AutoCAD se compone de toda la información

del dibujo en el cual nos encontramos trabajando: ubicaciones de las entidades, capas, estilos de texto, etc.

Mediante AutoLISP se puede obtener datos de esa base de datos o modificarla de acuerdo a nuestras necesidades.

Los programas creados en AutoLISP son archivos de texto con extensión *.LSP que se pueden crear desde el Editor de VisualLisp incorporado en AutoCAD o desde cualquier 

otro editor de textos, ya sea desde el NOTEPAD de WINDOWS u otras aplicaciones gratuitas o de pago para este fin. Personalmente recomiendo Crimson Editor, en su versión

Portable y gratuita, puedes descargar la aplicación desde éste enlace o éste otro.

AutoCAD cuenta con un intérprete interno que es el que se encarga de evaluar los programas escritos por el usuario; para eso se debe cargar el programa en la memoria de

AutoCAD mediante el comando APPLOAD , mediante la carga, el intérprete evalúa la sintaxis del programa escrito y si encuentra un error en él, procede a informarlo mediante

un mensaje que se muestra en la barra de comandos el cual indica el error generado y el bloque de instrucción que lo contiene.

De esta manera le permite al usuario revisar y corregir las instrucciones creadas, hasta que se cargue sin ningún problema, aunque no asegura que el programa en plena ejecución

funcione de una manera correcta por lo que se debe ejecutar utilizando todas las instrucciones posibles.

La carga de una aplicación LISP solo tiene efecto para la sesión actual, si se inicia un nuevo dibujo o se sale de AutoCAD, la aplicación LISP desaparece de la memoria,

debiéndose cargar nuevamente. Debido a esto AutoCAD proporciona la manera de hacer que las aplicaciones se carguen de una manera automática, debiendo para ello adicionar

una instrucción con la función AUTOLOAD, en archivo ACAD.LSP. Ejem: (autoload "milisp" '("milisp")).

En resumen AutoLISP es lenguaje muy potente y versátil que nos permitirá reducir el tiempo empleado en la generación de nuestros dibujos, ya que los nuevos comandos creados

 pueden ser utilizados en cualquier momento.

Estructura de una rutina LISP

718 lecturas

Si estás siguiendo este curso es porque quizá habrás tenido la oportunidad de observar el código de una aplicación lisp y habrás salido más mareado de que cuando empezaste.

Déjame decirte que no tienes nada que temer, programar en AutoLisp es sumamente sencillo y no necesitas tener una inteligencia superior para hacerlo, eso sí, necesitas mucha

constancia, practica y deseo de mejorar tus conocimientos (internet, libros, etc).

En este tema veremos como es una estructura de un programa lisp y cómo trabaja para hacer "lo que deseamos que haga en nuestro CAD".

En primer lugar déjame decirte que para crear un nuevo comando (rutina lisp) debes de ser tu quien escriba todas las llamadas (funciones) que éste necesita, lo menciono porque

en otros lenguajes de programación como por ejemplo Visual Basic, el sistema ayuda a escribir muchos de ellos.

Bien, una rutina lisp es en realidad una función que a su vez tiene muchas otras funciones (depende de la complejidad de la rutina), la estructura de una función básica tiene como

contenedor a dos paréntesis (abertura y cierre), por ejemplo:

(alert "ConstrucGeek")

El código escrito en la línea anterior representa una rutina, un programa, escribe esa línea en la línea de comandos de AutoCAD y habrás creado tu primera rutina siguiendo este

curso.

Como habrás notado la rutina anterior tiene un paréntesis de abertura y otro de cierre, son necesarios ambos, de lo contrario la rutina estaría mal estructura y generaría un error,

 prueba escribiendo la misma rutina omitiendo el paréntesis final (de cierre).

El texto alert es el nombre de una función AutoLisp cuya función, valga la redundancia es mostrar un mensaje de alerta en la pantalla de AutoCAD en forma de cuadro de diálogo.

El texto "ConstrucGeek " es un texto que bien hubiera sido cualquier otro, este texto es necesario para la función ALERT, porque como hemos visto arriba, esta función necesita

un mensaje para mostrar en pantalla. A estos textos necesarios por las funciones se les llama "Argumentos".

En este caso el texto "ConstrucGeek " va entre comillas porque es un argumento con valor de cadena de texto "string", más adelante veremos los diferentes tipos de valores, por 

ahora prueba escribiendo la misma línea de código, pero sin las comillas en el texto "ConstrucGeek " de la siguiente manera:

(alert ConstrucGeek)

AutoCAD te mostrará el siguiente mensaje:

; error: bad argument type: stringp nil

Este mensaje indica que el tipo de argumento que se le ha dado a la función ALERT es erroneo, que está necesitando una cadena de texto (stringp) y no lo encuentra (nil = nulo o

no existe).

En resumen la estructura de una rutina lisp contiene todos estos datos, los cuales iremos viendo a medida que se desarrolla el curso:

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 4/49

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 5/49

(setq valor1 5)(setq valor2 3)(setq resultado (+ valor1 valor2))(princ resultado)(princ)

La transformaremos en esto:

1. (defun minuevafuncion()

2. (setq valor1 5)

3. (setq valor2 3)

4.

5. (setq resultado (+ valor1 valor2))

6. (princ resultado)

7.

8. (princ)

9. )

Del ejemplo anterior observarás que estamos utilizando una nueva función denominada DEFUN, esta nueva función nos permite definir (crear) una nueva función de usuario, esta

función encerrará a otras funciones, aquí es válido escribir en varias línea para un mayor entendimiento de programa, todo lo escrito formará parte de la función principal. Las

demás funciones ya han sido analizadas y por lo tanto conocemos que hace cada una de ellas.

Escribe todo lo anterior en un archivo de texto plano utilizando el bloc de notas u otro editor gratuito de pago y guárdalo con el nombre de " MIPRIMERAFUNCION.LSP " en la

carpeta que desees, por ejemplo "ejemplos de mi curso".

Carga de rutinas en AutoCAD

371 lecturas

Bien, ya tenemos nuestra rutina creada, esta rutina es una función denominada "minuevafuncion" que nos muestra el resultado de la suma de dos variables en la línea de

comandos de AutoCAD y a la cual hemos almacenado en un archivo de texto denominado MIPRIMERAFUNCION.LSP .

Ahora procederemos a cargar la rutina desde AutoCAD para ello deberás de ejecutar el siguiente comando  APPLOAD . Este comando carga un cuadro de diálogo con el cual

deberás de seleccionar el archivo MIPRIMERAFUNCION.LSP  creado, una vez seleccionado puedes hacer doble clic en el para cargarlo o hacer clic en el botón  LOAD(Cargar).

Si la carga fue correcta (AutoCAD evalúa la integridad de la rutina) AutoCAD te mostrará un mensaje en la línea de comandos indicándote que la carga fue satisfactoria, de lo

contrario te indica que la carga no fue correcta y cual pudo haber sido el error, de esta manera te da una luz del error de programación que puedas tener en tu rutina.

Si la carga fue correcta entonces cierra el cuadro de diálogo con el botón CLOSE , de lo contrario abre el archivo y verifica que su contenido sea el mostrado en el ejemplo, de no

estarlo copia nuevamente o escríbela nuevamente tal y como el ejemplo y vuelve a realizar la ejecución del comando  APPLOAD .

Una vez cerrado el cuadro de diálogo digita en la línea de comandos los siguiente, sin las comillas "(minuevafuncion)", podrás observar que AutoCAD te muestra un resultado, es

el número 8, este número ocho el resultado de la suma de las dos variables con valores 5 y 3 respectivamente.

Prueba abriendo el archivo lisp, modificando el 5 y el 3 por otros valores, guarda el archivo y cárgalo nuevamente en AutoCAD con APPLOAD , vuelve a llamar a la función con

 paréntesis y veras que el resultado es otro.

Hasta aquí has creado tu primera función principal que se puede llamar desde AutoCAD, los comandos de AutoCAD también son funciones, pero con carácter de comando, es

decir estas funciones pueden ser llamadas desde AutoCAD pero sin ser necesario el uso de los paréntesis para ello.

Creación de nuevos comandos para AutoCAD

345 lecturas

Ahora veremos cómo crear funciones con carácter de comando de AutoCAD, para ello utilizaremos el ejemplo de la función anterior y le agregaremos un pequeño sufijo al

nombre, con este sufijo AutoCAD reconocerá a la función como un comando más de AutoCAD. Ejemplo

1. (defun c:minuevocomando()

2. (setq valor1 5)

3. (setq valor2 3)

4.

5. (setq resultado (+ valor1 valor2))

6. (princ resultado)

7.

8. (princ)

9. )

 Notarás que antes del nombre de la función "minuevocomando" se ha agregado el sufijo "c:", este sufijo es el que le da carácter de comando a una función, cuando la función

tiene carácter de comando, puede ser llamada fácilmente en AutoCAD con sólo digitar el nombre de la misma.

Escribe el ejemplo anterior en el bloc de notas u otro editor de tu preferencia y guárdalo con el nombre de  MIPRIMERCOMANDO.LSP 

Usa el comando de AutoCAD APPLOAD para cargar el archivo recientemente creado de la manera que se te ha indicado línea arriba, si la carga fue satisfactoria, escribe en la

línea de comando el nombre que le has dado a tu nuevo comando, en el ejemplo: minuevocomando.

El comando te muestra el número 8, que como ya sabes es el resultado de las operaciones internas que realiza este comando.

Con este ejemplo habrás creado tu primer comando en AutoCAD siguiendo este curso, los comando creados pueden tener mucho o poco código, dependiendo de lo que quieras

lograr, si abres un archivo LSP y ves que las líneas de código son innumerables, tranquilo, todo ello se logró escribir línea por línea y con muchos días de dedicación, lo importante

es saber que funciones utilizar y tener la lógica para poder utilizarlas correctamente.

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 6/49

Por lo pronto felicítate porque si antes de empezar este curso no tenías ni idea de cómo programar el AutoLISP, a estas alturas ya has creado un nuevo comando y poco a poco

seguirás avanzado con nuevas funciones que te ayudarán a conseguir lo que desees automatizar.

Aprendizaje práctico de las funciones

711 lecturas

A partir de aquí y con las nociones claras de como programar en AutoLisp, aumentarás tu conocimiento de programación conociendo y usando nuevas funciones, para ello

utilizaremos ejemplos prácticos en los cuales haremos uso de muchas funciones y te explicare cada línea de código para que así quede claro por qué se utilizan las funciones, así

cuando desarrolles tus propios comandos sabrás a que función echar mano para obtener los resultados que buscas.

 

A continuación podrás observar diferentes tipos de funciones, las cuales he ordenado para conocer que puede hacer cada una de ellas, pero después de este capítulo, crearemoscomandos de ejemplo, en los cuales haremos uso de funciones de todo tipo que te permitirán tener una visión más general de cómo lograr crear un nuevo comando de una manera

eficiente.

 

Por lo pronto céntrate en cada uno de los temas siguientes y tratar de practicar al máximo cada uno de los ejemplos que se brindan en ellos.

Funciones con operadores

347 lecturas

¿Recuerdas que tu primer comando sumaba dos valores y te mostraba el resultado en pantalla?, para obtener ese resultado utilizabas un operador, el operador + (suma), que

también es una función de AutoCAD, aunque con una nombre súper corto, además de ese operador, existen todos los demás que te permiten realizar cálculos en tus rutinas, a

continuación veremos cada uno de ellos mediante ejemplos.

Operadores Matemáticos262 lecturas

Los operadores matemáticos son las funciones base en todas las rutinas Lisp, sin estas funciones no se lograría crear ninguna rutina importante o eficaz, afortunadamente estas

funciones son de uso simple, tan simple como realizar cálculos desde una hoja de cálculo.

Por supuesto que estas funciones tienen una manera de escribirse, pero esto es propio del lenguaje AutoLisp, a continuación veremos cuáles son estas funciones de operadores

matemáticos.

Operador + (Suma)

Deja tu comentario

368 lecturas

Como su nombre lo indica este operador nos permite sumar valores, estos valores pueden ser números o variables, el operador devuelve la suma total de los elementos indicados

y si se desea, éste resultado se puede almacenar en una variable.

Ejemplo del operador + (Suma):

1. (defun c:sumar()

2. (setq valor1 5)

3. (setq valor2 3)

4. (setq valor3 4)

5. (setq resultado (+ valor1 valor2 valor3 7))

6. (princ "La suma de los valores es: ")

7. (princ resultado)

8. (princ)

9. )

Explicación:

- (setq valor...): Ya sabemos que la función SETQ nos permite crear variables y asignarles un valor y con esta función estamos creando 4 variables para la rutina sumar, la cuartavariable tiene como nombre resultado y esta almacenando la suma de las tres primeras variables (valor1, valor2 y valor3) más un valor directo que es el número 7, como puedes

ver los operadores como esta función suma, admite variables y valores en sus argumentos.

- Luego con la función PRINC, mostramos un mensaje al usuario indicando que es lo que se va a mostrar a continuación, en este caso mostramos el mensaje: "La suma de los

valores es: " , enseguida llamamos a la variable resultado para mostrar el resultado de las operaciones y posteriormente cerramos con la función (PRINC) sola para limpiar los

mensajes.

Escribe el ejemplo en un archivo con un editor de texto, guárdalo con un nombre que describa el comando, por ejemplo " Sumar valores.lsp" y cárgalo en AutoCAD con el

comando APPLOAD -otra manera rápida de cargar un archivo LSP es copiándolo desde el explorador y pegándolo en la ventana gráfica de AutoCAD-.

Puedes probar a cambiar los valores de las variables o a agregar otros valores dentro de la función +.

Operador - (Resta)

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 7/49

154 lecturas

Este operador al igual que su contraparte el operador + (suma), nos permite realizar operaciones con los valores indicados como argumentos, pero en este caso la operación es

una resta, los criterios son los mismos que para la función +.

Ejemplo del operador - (Resta):

1. (defun c:restar()

2. (setq valor1 15)

3. (setq valor2 5.36)

4. (setq valor3 3.1)

5. (setq resultado (- valor1 valor2 valor3 2.25))

6. (princ "El resultado de la resta de los valores es: ")

7. (princ resultado)

8. (princ)9. )

Explicación:

- (setq valor...): En este ejemplo estamos creando las variables valor... para almacenar los números que serán objeto de las operaciones de resta.

- (setq resultado (- valor1 valor2 valor3 2.25)): Aquí creamos la variable resultado para almacenar el resultado de restar 4 valores, 3 son variables y uno es un numero directo

2.25, como puedes ver los valores que los operadores procesan no solamente son valores enteros, sino reales, es decir con decimales.

Escribe este ejemplo en un archivo con un editor de texto, guárdalo con un nombre que describa el comando, ejemplo " Restar valores.lsp" y cárgalo en AutoCAD con el

comando APPLOAD, llama a tu nuevo comando RESTAR  y obtendrás el resultado.

Operador * (Multiplicación)

140 lecturas

Este operador permite realizar operaciones de multiplicación entre los valores indicados como argumentos, la forma de operar es la misma que la de los operadores + (suma) y -

(resta).

Ejemplo del operador * (Multiplicación):

1. (defun c:multiplicar()

2. (setq valor1 125.25)

3. (setq valor2 -25)

4. (setq resultado (* valor1 valor2 3))

5. (princ "El resultado de la multiplicación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

Explicación:

- (setq resultado (* valor1 valor2 3)): En este ejemplo, la variable resultado almacenará la multiplicación de los 3 valores que se le ha dado, aquí podrás observar que lavariable valor2 almacena un valor negativo -25 con lo cual se demuestra que los operadores también aceptan valores negativos como argumentos.

Escribe este ejemplo en un archivo con un editor de texto, guárdalo con un nombre que describa el comando, ejemplo " multiplicar valores.lsp" y cárgalo en AutoCAD con el

comando APPLOAD, llama a tu nuevo comando MULTIPLICAR  y obtendrás el resultado.

Operador / (División)

138 lecturas

Este operador permite realizar operaciones de división entre los valores indicados como argumentos, la forma de operar es la misma que de los operadores + (suma) y - (resta).

Ejemplo del operador / (División):

1. (defun c:dividir()

2. (setq valor1 1326)

3. (setq resultado (/ valor1 12))

4. (princ "El resultado de la división de los valores es: ")

5. (princ resultado)

6. (princ)

7. )

Explicación:

- (setq resultado (/ valor1 12)): En este ejemplo la variable resultado almacena la división entre una variable (con el valor 1326) y un número entero (12) y posteriormente

se muestra el resultado en pantalla mediante el uso de la función PRINC.

Escribe este ejemplo en un archivo con un editor de texto, guárdalo con un nombre que describa el comando, ejemplo " dividir valores.lsp" y cárgalo en AutoCAD con el

comando APPLOAD, llama a tu nuevo comando DIVIDIR  y obtendrás el resultado.

Otros ejemplos de operadores

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 8/49

160 lecturas

A continuación podrás observar otros ejemplos en los cuales se hace uso de estos operadores pero combinándolos unos con otros.

Ejemplos de operadores matemáticos:

1. (defun c:operacion1()

2. (setq valor1 1326)

3. (setq valor2 32)

4. (setq resultado (* (/ valor1 12) valor2))

5. (princ "El resultado de la división de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

Explicación:

- Como se puede observar ahora la variable resultado almacena el resultado dividir y multiplicar valores, el resultado en este ejemplo es 3536, aquí primero se realizó la división (/

valor1 12) y el valor resultante fue multiplicado por la variable valor2.

En este tipo de operaciones, las reglas son las misma que las matemáticas y se realizará el cálculo de adentro hacia afuera, aquí unos ejemplos:

 

Ejemplo1:

Calcular el resultado de: (-2+6)x(3-8) :

Programar: (* (+ -2 6)(- 3 8))

El resultado sería -20, veamos porque:

Explicación:

- Primero AutoLISP evalúa los valores dentro de los paréntesis más internos que serían en este caso dos al mismo nivel: (+ -2 6)(- 3 8), del primer grupo se obtiene el valor 4 y

del segundo grupo de paréntesis el valor -5.

- Segundo AutoLISP evalúa los paréntesis más externos que son (* (+ -2 6)(- 3 8)), es decir, (* 4 -5), cuyo resultado es -20.

 

Ejemplo2:

Calcular el resultado de: (-2+6)x(3-8)/10 :

Programar: (/ (* (+ -2 6)(- 3 8)) 10)

El resultado sería 2, veamos porque:

Explicación:

- Primero AutoLISP evalúa los valores dentro de los paréntesis más internos que serían en este caso dos al mismo nivel: (+ -2 6) y (- 3 8), del primer grupo se obtiene el valor 4 y

del segundo grupo de paréntesis el valor -5.

- Segundo AutoLISP evalúa los paréntesis intermedios que son (* (+ -2 6)(- 3 8)), es decir, (* 4 -5), cuyo resultado es -20.

- Tercero AutoLISP evalúa los paréntesis más externos que son (/ (* 4 -5) 10), es decir, (/ -20 10), cuyo resultado es -2.

 

Ejemplo3:

Calcular el resultado de: (-2+(6x3))-8 :

Programar: (- (+ -2 (* 6 3)) 8)

El resultado sería 8, veamos porque:

Explicación:

- Primero AutoLISP evalúa los valores dentro de los paréntesis más internos que serían (* 6 3), cuyo valor es 18.

- Segundo AutoLISP evalúa los operadores que están en los paréntesis intermedios (+ -2 (* 6 3)), es decir (+ -2 18), cuyo valor es 16.

- Tercero AutoLISP evalúa los paréntesis más externos que son (- (+ -2 (* 6 3)) 8), es decir (- 16 8), cuyo resultado es 8.

 

Conclusión de este capítulo:

Hasta aquí hemos visto los tipos de operadores matemáticos, copia todos estos ejemplos en un archivo de texto plano o en el editor de tu preferencia, grábalo con un nombre por 

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 9/49

ejemplo ejemplos operadores.lsp y cárgalo en AutoCAD, ejecuta cada uno de ellos y realiza los cambios que creas conveniente y vuelve a cargarlo.

A continuación veremos los tipos de operadores lógicos.

Operadores Lógicos

196 lecturas

Este tipo de operadores a diferencia de los matemáticos nos ayudan a realizar comparaciones entre sus argumentos para así decidir qué hacer ante un determinado resultado.

Estos operadores solo devuelven dos posibles valores, los cuales son T (VERDADERO) y nil (FALSO).

A continuación veremos los operadores en mención.

Operador = (Igual)

128 lecturas

Como su nombre lo indica este operador permite comparar n valores para verificar si son iguales entre ellos, estos valores pueden ser números o variables, el operador devuelve T

(True) si el resultado de la comparación es Verdadera o nil (Falso) si el resultado es falso.

Ejemplo 1 del operador = (Igual):

1. (defun c:igual()

2. (setq valor1 136)

3. (setq valor2 36)

4. (setq resultado (= valor1 valor2))

5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

 

Ejemplo 2 del operador = (Igual):

1. (defun c:igual2()

2. (setq valor1 136)

3. (setq valor2 "136")

4. (setq resultado (= valor1 valor2))

5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

 

Ejemplo 3 del operador = (Igual):

1. (defun c:igual3()

2. (setq valor1 136)

3. (setq valor2 136.0)

4. (setq resultado (= valor1 valor2))

5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

 

Ejemplo 4 del operador = (Igual):

1. (defun c:igual4()

2. (setq valor1 136)

3. (setq valor2 136)

4. (setq valor3 5)5. (setq valor4 5)

6. (setq resultado (= valor1 valor2 valor3 valor4))

7. (princ "El resultado de la comparación de los valores es: ")

8. (princ resultado)

9. (princ)

10. )

 

Ejemplo 5 del operador = (Igual):

1. (defun c:igual5()

2. (setq valor1 "YO")

3. (setq valor2 "YO")

4. (setq resultado (= valor1 valor2))

5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 10/49

8. )

 

Ejemplo 6 del operador = (Igual):

1. (defun c:igual6()

2. (setq valor1 "YO")

3. (setq valor2 "yo")

4. (setq resultado (= valor1 valor2))

5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

 

Explicación:

- En los dos primeros ejemplos el resultado es nil (FALSO), debido a que en el primer ejemplo la variable valor1 que contiene el valor 136 es diferente a la variable valor2 que

tiene un valor de 36, en el segundo ejemplo la variable valor1 que contiene el valor 136 (valor tipo entero) es diferente a la variable valor2 que contiene el valor "136" (un valor de

tipo texto o string).

- En el tercer ejemplo, el resultado es T (VERDADERO), debido a que se han comparado los valores 136 (valor tipo entero) y 136.0 (valor tipo real), en este caso AutoLISP, no

hace distinción de valores cuando se trata de números, enteros o reales (con decimales).

- En el cuarto ejemplo, el resultado es nil (FALSO), debido a que se han comparado todos los valores y al ir comparando uno por uno, el valor3 no cumplió con el anterior,

AutoLISP comparó de esta manera: ¿valor1 (136) es igual a valor2 (136)?, el resultado es T (POSITIVO), ¿valor2 (136) es igual a valor3 (5)?, resultado es nil (FALSO),

¿valor3 (5) es igual a valor4 (5), el resultado es T (VERDADERO) y aunque el ultimo sea verdadero basta que una comparación no cumpla, para que la función = (IGUAL)

califique la comparación completa como nil (FALSO).

- En el ejemplo quinto y sexto los resultados son T (VERDADERO) Y nil (FALSO) respectivamente, la función distingue y asume como diferentes las cadenas mayúsculas y

minúsculas.

Operador /= (Diferente)

129 lecturas

Este operador tiene el mismo criterio de operar que el operador = pero en sentido opuesto, es decir a diferencia del anterior este operador evalúa como T (VERDADERO) si al

comparar dos o más valores estos son diferentes.

Ejemplo del operador /= (Diferente):

1. (defun c:diferente1()

2. (setq valor1 "YO")

3. (setq valor2 "yo")

4. (setq resultado (/= valor1 valor2))5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

Explicación:

- (setq resultado (/= valor1 valor2)): Aquí el operador /= evalúa los valores de las dos variables y si ambos valores son distintos devuelve el valor T (True) y si son iguales

devuelve el valor nil (Falso). El resultado se almacena en la variable resultado, para mostrarla posteriormente con la función PRINC.

Operador < (Menor que)

129 lecturas

El operador < (Menor que) devuelve T (Verdadero) si el argumento izquierdo es menor que el derecho, de lo contrario devuelve nil (Falso).

Ejemplo 1 del operador < (Menor que):

1. (defun c:menorque1()

2. (setq valor1 1)

3. (setq valor2 2)

4. (setq resultado (< valor1 valor2))

5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

 

Ejemplo 2 del operador < (Menor que):

1. (defun c:menorque2()

2. (setq valor1 "a")

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 11/49

3. (setq valor2 "b")

4. (setq resultado (< valor1 valor2))

5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

 

Explicación:

- (setq resultado (< valor1 valor2)): Estos dos ejemplos tienen como resultado un valor T (verdadero), en el ejemplo1, 1 es menor que 2 y en el ejemplo2, "a" es menor que "b"

en orden, por lo tanto verdadero.

Operador <= (Menor o igual que)

114 lecturas

El operador <= devuelve T (Verdadero) si el argumento izquierdo es menor o igual que el derecho, de lo contrario devuelve nil (Falso).

Ejemplo del operador <= (menor o igual que):

1. (defun c:menorigualque1()

2. (setq valor1 2)

3. (setq valor2 2)

4. (setq resultado (<= valor1 valor2))

5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

Explicación:

- (setq resultado (<= valor1 valor2)): El resultado del ejemplo anterior devuelve T (por ser dos numeros iguales), este resultado se almacena en la variable resultado.

Operador > (Mayor que)

111 lecturas

El operador > devuelve T (Verdadero) si el argumento izquierdo es mayor que el derecho, de lo contrario devuelve nil (Falso).

Ejemplo 1 del operador > (mayor que):

1. (defun c:mayorque1()

2. (setq valor1 1)

3. (setq valor2 2)

4. (setq resultado (> valor1 valor2))5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

 

Ejemplo 2 del operador > (mayor que):

1. (defun c:mayorque2()

2. (setq valor1 "a")

3. (setq valor2 "b)

4. (setq resultado (> valor1 valor2))

5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

 

Explicación:

- (setq resultado (> valor1 valor2)): Estos dos ejemplos tienen como resultado un valor nil (falso), en el ejemplo1, 1 es menor que 2 y en el ejemplo2, "a" es menor que "b" en

orden, por lo tanto el resultado en ambos es falso.

Operador >= (Mayor o igual que)

131 lecturas

El operador >= (mayor o igual que) devuelve T (Verdadero) si el argumento izquierdo es mayor o igual que el derecho, de lo contrario devuelve nil (Falso).

Ejemplo del operador >= (mayor o igual que):

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 12/49

1. (defun c:mayorigualque1()

2. (setq valor1 5)

3. (setq valor2 2)

4. (setq resultado (>= valor1 valor2))

5. (princ "El resultado de la comparación de los valores es: ")

6. (princ resultado)

7. (princ)

8. )

Explicación:

- (setq resultado (>= valor1 valor2)): El resultado del ejemplo anterior devuelve T (por ser el primer argumento mayor que el segundo), esta resultado se almacena en la

variable resultado.

 

Conclusión de este capítulo:

Estimado usuario como podrás ver, todos estos operadores te permiten tener un control sobre el flujo de los datos de tu aplicación o rutina, de acuerdo a los posibles resultados

de las comparaciones puedes ejecutar o no un determinado código, esto es muy beneficioso para que la aplicación no ejecute código sin valor.

Como siempre copia el código de cada uno de los ejemplos en un archivo de texto plano o en el editor de VisuaLisp o en otro de tu preferencia y guárdalo con el nombre de

operadoreslogicos.lsp, cárgalo en AutoCAD y ejecuta cada uno de ellos, puedes realizar cambios en los mismos para que puedas observar que implicancia trae esto a los

resultados de las rutinas.

Funciones de Acceso a Variables de AutoCAD

214 lecturas

AutoCAD almacena muchas opciones de su configuración en variables, estas variables también pueden ser accesadas y modificadas manualmente o mediante programación.

Si deseas saber cuáles son todas estas variables a las que me refiero, puedes usar el comando SETVAR , este comando te permite editar el valor de la variable que deseas, si no

estás seguro de saber que variable almacena una determinada información puedes utilizar el comando de la siguiente manera en la línea comandos de AutoCAD:

Command: SETVAR

Enter variable name or [?]: ?

Enter variable(s) to list <*>: (Enter)

El comando SETVAR  te devolverá una lista paginada con todas las variables que tiene AutoCAD y sus valores correspondientes, muchos de estos valores se pueden editar 

desde aquí, pero otros figuran como sólo lectura, no las podemos cambiar desde el comando SETVAR , pero si desde el comando de AutoCAD que ha generado ese valor.

Aquí algunas variables:

- AREA (Sólo lectura): Esta variable almacena el valor de la última área hallada con el comando AREA.

- CTAB : Muestra el nombre de la ficha (TAB) actual, si estas en el espacio modelo el valor será " Model ".

- CECOLOR  : Muestra cual es el color del área de trabajo, si es porcapa te mostrará " BYLAYER" de lo contrario te mostrará otro valor que tenga el color actual.

- CLAYER  : Muestra el nombre de la capa actual.

Como habrás observado son muchas la variables, pero todas ellas de mucho provecho a la hora de la creación de una rutina, por ejemplo si deseas crear una capa mediante

 programación, establecerle un color y dibujar sobre ella, con un poco de código lo puedes hacer, pero que pasa si el usuario tenía con color actual con el cual estaba dibujando?,

cuando el usuario ejecuto tu rutina simplemente se quedó con la capa y el color que creo tu rutina, siendo un poco molesto tener que volver a poner la capa y el color con el que se

estaba trabajando.

En este caso lo recomendable es almacenar en variables los valores actuales que el usuario está trabajando para que después de modificarle estos valores para nuestra rutina,

 podamos devolverle el estado tal y cual lo encontramos, para ello debemos de echar mano a una función que se encargue de esta tarea.

Función GETVAR: Obtener el valor de una variable de AutoCAD

169 lecturas

La función GETVAR , permite obtener el valor de una variable de AutoCAD. Se escribe para ello la función y luego dejando un espacio y entre comillas el nombre de la variable.

La línea de comandos mostrará el valor de dicha variable.

Ejemplo de la función GETVAR :

1. (defun c:mca()

2. (setq ca (GETVAR "cecolor"))

3. (princ ca)

4. (princ)

5. )

 

Explicación:

- (setq ca (GETVAR "cecolor")): Con la función SETQ creamos una variable llamada ca, esta variable almacenará el valor obtenido por la función GETVAR .

Después de que hemos almacenado el valor del color actual, recién podemos modificar ese valor para que le sirva a nuestra rutina, por ejemplo tu rutina creará un cuadro de

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 13/49

coordenadas en una capa llamada "Coordenadas" y tendrá el color "3", el código de tu rutina modificará los valores de 2 variables (entre otros dependiendo de la complejidad de

la misma), la primera de ella la variable "CLAYER" y la segunda "CECOLOR", sino almacenamos estos dos valores actuales antes de modificarlos, después será imposible saber 

cuáles eran.

Para modificar valores de variables mediante programación debes de recurrir a la función SETVAR  (ojo no es el comando de AutoCAD que tiene el mismo nombre).

Función SETVAR: Establecer valor de una variable de AutoCAD

Deja tu comentario

297 lecturas

La función SETVAR  permite establecer el valor de una variable de AutoCAD. Se escribe para ello la función y luego dejando un espacio y entre comillas el nombre de la variabley por último el nuevo valor a establecer.

Ejemplo de la función SETVAR :

1. (defun c:sca()

2. (SETVAR "cecolor" "5")

3. (princ)

4. )

 

Explicación:

- (SETVAR "cecolor" "5") : Aquí nuestra rutina sca, mediante el uso de la función SETVAR  modifica el color por defecto de la capa actual de AutoCAD por el color "5"

(azul)

Como puedes ver la instrucción para modificar el valor de una variable es relativamente sencilla, combinadas las dos funciones anteriores (GETVAR  y SETVAR ) es que

obtenemos un buen habito de programar, es incómodo usar una rutina y que esta modifique nuestros parámetros de trabajo actual, uno de los mayores ejemplos que se presenta

es cuando usamos una rutina y esta cambia los valores de nuestra referencia a entidades (OSNAP).

 

Aquí un ejemplo completo del uso de estas dos funciones :

1. (defun c:vars()

2. ; Almacenamos el valor de la capa actual

3. (setq capaactual (GETVAR "clayer"))

4.

5. ; Almacenamos en valor del color actual

6. (setq coloractual (GETVAR "cecolor"))

7.

8. ; Aquí se escribe el resto de código que nos

9. ; permite crear una capa y establecerla como actual

10. ; (lo veremos más adelante).

11.

12. ; Después de que la rutina ha hecho su trabajo,

13. ; le devolvemos al usuario la capa y el color con los

14. ; que estaba trabajando antes de ejecutar la rutina

15. (SETVAR "clayer" capaactual)

16. (SETVAR "cecolor" coloractual)

17.

18. (princ)

19. )

Escribe los ejemplos en un archivo de texto y guárdalo como ejemplodevariables.lsp y cárgalo en AutoCAD, prueba cada uno de ellos cambiando algunas variables que puedas

encontrar interesantes, ya sabes que mediante el comando SETVAR , puedes tener acceso a todas ellas.

Más adelante veremos en que más nos pueden ayudar estas dos funciones de acceso y edición de variables de AutoCAD.

Funciones de Acceso a Comandos de AutoCAD

241 lecturas

En AutoLISP existe tres formas de crear entidades, la primera y la más fácil es utilizando la función COMMAND, esta función "llama" a un comando de AutoCAD y le da los

argumentos que le damos a la función, la segunda forma es mediante el uso de funciones de VisualLisp, esta funciones son complementarias al lenguaje AutoLISP y las veremos en

otro curso posterior, la tercera es la creación de una entidad, mediante el uso de listas, es decir, se crea el ADN de la entidad y el resultado es el objeto, por ejemplo una línea.

 

La primera opción de creación de entidades es la más fácil y de mayor uso, pero si alguno de los resultados no es el esperado, siempre es bueno echar mano a la segunda o

tercera opción con funciones más potentes que la primera.

 

En esta primera opción de creación de objetos gráficos, utilizaremos la función COMMAND.

Función COMMAND: Acceso a comandos de AutoCAD

214 lecturas

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 14/49

Esta función permite llamar a los comandos de AutoCAD desde el programa. Las instrucciones que se ingresan como argumentos para esta función, son una secuencia de los

datos que va solicitando el comando a medida que avanza su ejecución. Los nombres de los comandos, las opciones (datos) y las variables de AutoCAD deben de ir entre

comillas, pero no las variables creadas en AutoLISP.

Ejemplo 1 de la función COMMAND :

1. (defun c:crearlinea()

2. (COMMAND "line""0,0,0" "10,10,0""")

3. (COMMAND"zoom" "e")

4. (princ)

5. )

Explicación:

- (defun C:crearlinea(): Utilizamos la función DEFUN para crear una nueva función de usuario denominada "crearlinea", esta función tendrá el carácter de comando de AutoCAD

(indicado por el prefijo "C "), es decir se podrá ejecutar desde AutoCAD tan solo con escribir su nombre.

- (COMMAND "line" "0,0,0" "10,10,0" ""): Aquí es donde utilizamos la función COMMAND y le indicamos a AutoCAD que deseamos dibujar una línea, recordemos que

cuando ejecutamos el comando LINE en AutoCAD, el comando nos solicita dos o más puntos, proveyendo esa solicitud es que le damos a la función los datos que nos pedirá el

comando, es decir dos coordenadas, la primera desde la coordenada "0,0,0" hasta la coordenada "10,10,0", para indicar que tan solo deseamos ingresar dos coordenadas,

utilizamos las doble comillas que en AutoLISP significa presionar ENTER.

- (COMMAND "zoom" "e"): Aquí utilizamos la función COMMAND para indicar a AutoCAD que realice un zoom extents en el dibujo.

- (PRINC): Ya sabemos que utilizando esta función limpiamos el dibujo del "eco" del resultado de las funciones.

 

Ejemplo 2 de la función COMMAND :

Explicación:

- (defun c:creartexto(): Utilizamos la función DEFUN para crear una nueva función de usuario denominada creartexto, esta función tendrá el carácter de comando de

AutoCAD (indicado por el prefijo "c"), es decir se podrá ejecutar desde AutoCAD tan solo con escribir su nombre.

- (COMMAND "text" "j" "m" "10,10" "2.5" "0" "CONSTRUCGEEK"): Aquí la función COMMAND indica a AutoCAD que deseamos escribir un texto.

- La opción " j" (Justify), indica que deseamos indicar la justificación (alineación) que tendrá nuestro texto a crear.

- La opción "m" (Middle), indica al comando que deseamos usar la justificación Middle, puede usarse cualquiera de las opciones disponibles.

- La opción "10,10", indica a la función que la coordenada inicial del texto será 10,10, es decir 10 unidades en X y 10 unidades en Y de nuestro sistema de coordenadas.

- La opción "2.5", indicará al comando que el texto a crear tenga una altura de 2.5 unidades de dibujo.

- La opción "0", está indicando que la rotación del nuevo texto a crear tenga un ángulo de rotación de 0 grados.

- La opción "CONSTRUCGEEK ", indica el texto que escribirá el comando en la pantalla de AutoCAD.

- (PRINC): Ya sabemos que utilizando esta función limpiamos el dibujo del "eco" del resultado de las funciones.

 

Ejemplo 3 de la función COMMAND :

En este ejemplo utilizaremos comentarios dentro del código, a medida que los códigos de ejemplo sean más extensos haremos uso de estos comentarios para aclarar que se hace

y porque en determinados bloque de código. Estos comentarios no interfieren con el correcto funcionamiento de la rutina, AutoLISP cuando la compila omite todas las línea de

código que empiezan con punto y coma (";").

1. (defun c:crearcapa()

2. ; Creamos 4 variables de tipo string (texto) con los datos

3. ; que necesitaremos más adelante, para ello utilizamos la función SETQ.

4.

5. ; Variables para la creación de la capa:

6. (setq nombrecapa "minuevacapa")7. (setq colorcapa "5")

8.

9. ; Variables para la creación del texto:

10. (setq puntoinsercion "10,10")

11. (setq alturatexto "2.5")

12. (setq rotaciontexto "0")

13. (setq textoacrear "CONSTRUCGEEK")

14.

15. ; Con la función COMMAND crearemos la capa "minuevacapa" de la

16. ; siguiente manera (si deseas saber las opciones que pide el comando

17. ; LAYER, puedes digitarlo de la siguiente manera en la línea de comandos

18. ; de AutoCAD: -LAYER.

19. (command "layer""m" nombrecapa "c" colorcapa "" "")

20.

21. ; Después de haber creado la capa "minuevacapa" procederemos a crear

22. ; un texto tal igual que en el ejemplo anterior, la diferencia es que

23. ; este texto se creará en la capa creada anteriormente.

24. (command"text" "j""m" puntoinsercion alturatexto rotaciontexto textoacrear)

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 15/49

25.

26. ; Limpiamos la línea de comandos de las repeticiones:

27. (princ)

28. )

Explicación:

- Como habrás podido observar este ejemplo, es un poco más extenso que los anteriores, pero si te das cuenta cada una de las líneas de código son las mismas que los ejemplos

cortos y sencillos que hemos venido viendo a lo largo de este curso, es como si estuviéramos juntando las hojas del libro.

- En este ejemplo usamos variables que almacenan los datos que utilizamos posteriormente con la función COMMAND, de esta manera hemos aprendidos que podemos usar 

variables cuando deseamos ejecutar algún comando de AutoCAD desde nuestra rutina.

- (command "layer" "m" nombrecapa "c" colorcapa "" ""): En esta línea utilizamos la función COMMAND para crear una nueva capa, para ello escribimos el nombre del

comando a usar entre comillas ("layer").

- La opción "m" (Make), le indica al comando LAYER  que deseamos crear una nueva capa (esta capa automáticamente será establecida como actual una vez finalizada la rutina).

- La opción nombrecapa, es la variable que almacena el nombre de la nueva capa a crear, en este caso el valor de esta variable es: minuevacapa.

- La opción "c" indica que deseamos elegir el color que tendrá la capa a crear.

- La opción colorcapa, es la variable que contiene una valor de texto con el color de la capa que deseamos establecer, en este caso es el color "5" (esta variable contiene un valor 

de texto porque los colores en AutoCAD son nombres, por ejemplo RED, pero también se pueden indicar mediante números como textos, ejemplo el color "115").

- Las doble comillas equivalen a presionar ENTER (por defecto) ante la solicitud de una opción del comando LAYER .

 

Conclusión de este capítulo:

Como puedes ver la función COMMAND opera como si fuera un Script (secuencia de comandos), pero de una manera más controlable y avanzada, una buena ayuda para

indicar correctamente las opciones que se necesita, es ejecutando de una manera normal el comando en AutoCAD y observar la línea de comandos, en ella el comando nos irá

solicitando las opciones que necesita y nosotros las iremos programando tal y como las pide en nuestra rutina.

Escribe los ejemplos en un archivo misejemplos.lsp y cárgalo en AutoCAD de la manera que hemos visto anteriormente en este curso, puedes practicar creando otros nuevos

comandos que hagan llamados a otros comandos de AutoCAD, por ejemplo a la creación de círculos, estilos de texto, etc.

Funciones de Solicitud de Datos

210 lecturas

El sentido de crear una rutina Lisp radica en posibilidad de completar nuestras tareas de una manera rápida y precisa, estas tareas casi nunca son iguales y no me refiero a la forma

de la tarea sino a los datos que esta tiene.

Por ejemplo, si deseas crear el perfil de una línea que representa la sección de un terreno natural, puedes crear una rutina que dibuje todo el formato, el formato incluirá progresivas y cotas, quizá pendientes si se trata de una rasante. El dibujo del perfil siempre será el mismo, más no así los datos que este tiene, todos los datos como progresivas y

cotas son variables de acuerdo a la ubicación de la sección del terreno.

Un ejemplo un poco más sencillo, si deseas que tu rutina inserte un texto, este texto no siempre estará situado en la misma ubicación, por ejemplo si estas desarrollando una rutina

que te dibuje un cuadro de coordenadas, los valores serán diferentes de acuerdo a lo que indique la persona que está utilizando la rutina.

En vista de los antes expuesto y para lograr que el usuario de la rutina sea quien defina en donde y como desea manipular sus datos, es que existen unas funciones que se encargar 

de solicitar datos al usuario.

Por ejemplo si deseas crear el contorno de una casa de 4 lados, la rutina deberá de solicitar un punto de inicio del contorno y los valores para el ancho y para el alto, el usuario

que usa la rutina es la que ingresará los valores de acuerdo a sus necesidades, el verá el resultado, es decir el dibujo de un rectángulo, el usuario ni se imagina que sucede al interior

de la rutina, solo la usa y espera el resultado correcto.

Es importante primero observar cuales son los datos necesarios para hacer que una rutina cumpla su función, y se deberán de solicitar los datos más importantes, si se necesitan

otros datos, pero estos se pueden calcular en la rutina ya no se deben de solicitar, en otras palabras solo se deben de solicitar los datos más necesarios para que la rutina haga su

trabajo.

A continuación observaremos las funciones que permiten realizar solicitudes de datos al usuario:

Función GETPOINT: Solicitar la indicación de un punto o coordenada

140 lecturas

La función GETPOINT obtiene y almacena las coordenadas X,Y,Z de un punto, el cual se ingresa mediante el teclado o pikando un punto en pantalla.

Adicionalmente se puede indicar un mensaje para mostrar que se está solicitando el ingreso de un punto, éste mensaje aparecerá en la línea de comandos de AutoCAD.

Ejemplo de la función GETPOINT:

1. (defun c:ip()

2. (setq cmdeactual (getvar "cmdecho"))

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 16/49

3. (setvar "cmdecho" 0)

4. (setq p1 (GETPOINT "Pike un punto para ubicar el centro del círculo:"))

5. (command "circle" p1 "10")

6. (command "zoom" "e")

7. (setvar "cmdecho" cmdeactual)

8. (princ)

9. )

Explicación:

- (setq cmdeactual (getvar "cmdecho")): Aquí la función SETQ está creando una variable que almacenará el valor actual de la variable "cmdecho", para poder restaurarla

 posteriormente.

- (setvar "cmdecho" 0): Aquí la función SETVAR  modifica la variable de AutoCAD "cmdecho", estableciéndole un valor de 0. Esta variable de AutoCAD activa o desactiva la

visualización de los comandos y sus respuestas empleados en una rutina: 0 desactiva y 1 activa.

- (setq p1 (GETPOINT "Pike un punto para ubicar el centro del círculo:")): En esta línea de código la función GETPOINT está solicitando la designación de un punto en

 pantalla o el ingreso de una coordenada (XYZ), esta valor obtenido es almacenado en la variable p1 creada con la función SETQ.

- (command "circle" p1 "10"): Aquí la función COMMAND dibujará un circulo en la coordenada p1 (cualquier coordenada indicada en pantalla) y con un radio de 10

unidades de dibujo.

- (command "zoom" "e"): En esta línea de código la función COMMAND realizará un zoom extents al dibujo para mostrar todo el circulo(s) creados(s).

- (setvar "cmdecho" cmdeactual): Aquí la función SETVAR  establece un nuevo valor para la variable "cmdecho", el valor es el almacenado en la variable cmdeactual (no

sabemos si es 0 o 1, pero lo importante es que la dejamos como estaba.

Función GETINT: Solicitar el ingreso de un número entero

127 lecturas

Esta función obtiene un número entero ingresado por el usuario. En número entero debe estar entre -32768 y 32767; si se ingresa un número no entero, ejm: 321.5 (real) se

visualiza un mensaje de error y se solicita nuevamente el número entero.

Ejemplo de la función GETINT:

1. (defun c:ie()

2. (setq cmdeactual (getvar "cmdecho"))

3. (setvar "cmdecho" 0)

4. (setq p1 (getpoint "Pike un punto para ubicar el centro del círculo:"))

5. (setq radio (GETINT "Ingrese el radio para el círculo: "))

6. (command "circle" p1 radio)

7. (command "zoom" "e")

8. (setvar "cmdecho" cmdeactual)

9. (princ)

10. )

Explicación:

- (setq radio (GETINT "Ingrese el radio para el círculo: ")): Aquí usamos la función GETINT para solicitar al usuario el ingreso del radio que tendrá el círculo a generar, en

el ejemplo anterior generábamos un circulo con radio 10, en esta oportunidad el radio es variable de acuerdo a la necesidad del usuario.

- (command "circle" p1 radio): Aquí es donde generamos el círculo, este será creado en el punto que indiquemos en pantalla y con el radio que se ingrese.

Función GETREAL: Solicitar el ingreso de un número real

138 lecturas

Esta función solicita el ingreso de un número real (con decimales) al usuario y permite almacenarlo en una variable. También se puede ingresar un número entero, pero este se

obtiene con sus decimales, ejm: 25 obtiene 25.0.

Ejemplo de la función GETREAL:

1. (defun c:creartexto()

2. (setq cmdeactual (getvar "cmdecho"))

3. (setvar "cmdecho" 0)

4.

5. (setq p1 (getpoint "Pike un punto de inserción del texto:"))

6. (setq alturatexto (GETREAL "Ingrese la altura del texto: "))

7.

8. (command "text" "j" "m" p1 alturatexto "0" "CONSTRUCGEEK")

9.

10. (setvar "cmdecho" cmdeactual)

11. (princ)

12. )

Explicación:

- (setq alturatexto (GETREAL "Ingrese la altura del texto: ")) : Aquí la función GETREAL, solicita mediante el mensaje que le hemos establecido que se debe de ingresar 

un valor para la altura del texto a crear, el valor podrá ser un valor entero (INTEGER) o decimal (REAL).

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 17/49

- (command "text" "j" "m" p1 alturatexto "0" "CONSTRUCGEEK"): Aquí la función COMMAND crea un texto indicado como punto de inserción el punto p1,

solicitado con la función GETPOINT, además aquí se establece que la altura del texto será la establecida en la variable alturatexto, solicitada anteriormente con la función

GETREAL.

Función GETSTRING: Solicitar el ingreso de una cadena de texto

111 lecturas

Esta función solicita el ingreso de una cadena de texto al usuario; si la cadena tiene más de 132 caracteres solo acepta los primeros 132. Se pueden ingresar cadenas sin o con

espacios, depende de si se ingresa o no un modo (T); si se ingresa un modo se puede ingresar texto con espacios.

Ejemplo de la función GETSTRING:

1. (defun c:creartexto2()

2. ; Establecemos valores de variables

3. (setq cmdeactual (getvar "cmdecho"))

4. (setvar "cmdecho" 0)

5.

6. ; Solicitamos datos al usuario

7. (setq p1 (getpoint "\nPike un punto de inserción del texto:"))

8. (setq alturatexto (getreal "\nIngrese la altura del texto: "))

9. (setq cadenatexto (GETSTRING T "\nIngrese el texto a escribir: "))

10.

11. ; Ejecutamos las acciones para la creación del texto

12. (command "text" "j" "m" p1 alturatexto "0" cadenatexto)

13.

14. ; Devolvemos los valores originales a las variables

15. (setvar "cmdecho" cmdeactual)

16. (princ)

17. )

Explicación:

- (setq cadenatexto (GETSTRING T "\nIngrese el texto a escribir: ")): Aquí mediante la función GETSTRING solicitamos al usuario que ingrese un texto cualquiera, este

texto ingresado se almacena en la variable cadenatexto, para posteriormente ser utilizado.

El caracter "\n" indica que el mensaje aparezca en una nueva línea, para asi evitar que todos los mensajes aparezcan juntos.

- (command "text" "j" "m" p1 alturatexto "0" cadenatexto): Aquí la función COMMAND permite crear un texto con las opciones indicadas, el texto que se creará será el

ingresado mediante la función GETSTRING y almacenado en la variable cadenatexto.

Función INITGET: Establecer modos para las funciones GET

107 lecturas

Especifica el modo en recibirán los datos las funciones GET... y estos son:

1  No admite un Enter como respuesta.

2 No admite valor cero.

4 No admite valores negativos.

8 No verifica límites aunque estén activados.

32  Dibuja la línea o el rectángulo elásticos en forma discontinua.

128 Permite ingresar datos mediante el teclado.

Se puede ingresar uno o se pueden sumar varios de ellos, por ejemplo ingresando un valor de 3 (1+2), le indicaremos a INITGET que la función GET... no admita un ENTER 

como respuesta ni acepte un valor de 0.

Ejemplo de la función INITGET:

1. (defun c:in()

2. (INITGET 1)

3. (setq ne (GETINT "Ingrese un número: "))

4. (princ ne)5. (princ)

6. )

Explicación:

- En este ejemplo (INITGET 1) no permitirá que se ingrese un valor nulo (Enter) como respuesta y se repetirá la solicitud mientras no se ingrese el valor solicitado.

Función GETKWORD: Solicitar elegir una opción

112 lecturas

Esta función permite solicitar al usuario palabras clave o abreviaturas ante una serie de opciones o alternativas. Las respuestas posibles se deben especificar previamente con la

función INITGET, si se ingresa palabras clave diferentes a las establecidas, GETKWORD solicita la palabra otra vez.

Ejemplo de la función GETKWORD:

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 18/49

1. (defun c:ipc()

2. (INITGET 1 "Si No")

3. (setq p (GETKWORD "Le gusta AutoLisp [Sí o No]:"))

4. (princ p)

5. (princ)

6. )

Explicación:

- Este ejemplo sencillo permite obtener una respuesta de usuario ante las opciones que pueda tener un comando, en el ejemplo mediante la función INITGET establecemos dos

valores como opciones a solicitar, pero pueden ser "n" valores de acuerdo a lo que se quiera obtener o brindar con la rutina.

La función INITGET reconocerá que la opción SI si se ingresa: s  ó S  ó si  ó SI

- Posteriormente conoceremos otras funciones que nos permitan controlar las respuestas y qué hacer ante cada una de ellas.

Conclusión de este capítulo:

Como habrás podido observar mediante estos ejemplos, las funciones GET... son unas de las funciones más importantes del lenguaje AutoLISP, todos ellas en su conjunto e

interrelacionadas te permitirán obtener todos los datos necesarios para poder hacer que tus rutinas logren su objetivo.

Más adelante en este curso verás cómo mediante otras funciones que veremos podrás consolidar todo lo aprendido hasta el momento y podrás ya comenzar a modificar rutinas no

muy complejas.

Práctica estos ejemplo lo más que puedas, escríbelos en un archivo de texto y guárdalo como  funciones.lsp, cárgalo en AutoCAD y ejecuta cada uno de las rutinas de ejemplo,

 puedes modificar algunos valores o solicitudes para una mayor claridad.

Funciones de Acceso y Creación de Listas

141 lecturas

Una lista es AutoLISP representa una unidad de programación, es decir es la estructura que permite crear un determinado dato u objeto mediante un array (conjunto) de

elementos. Estos elementos están presentes por ejemplo en una lista de coordenadas, en una lista de operaciones o una lista de elementos de una entidad, en esta oportunidad

evaluaremos a una "lista" como un array (conjunto) de elementos de coordenadas.

A continuación veremos funciones que nos permiten acceder a cada uno de los elementos que se encuentran en una lista (elementos dentro de los paréntesis), por ejemplo, si

nuestra lista es una lista de coordenadas entonces tendríamos en primer lugar la coordenada X, luego la coordenada Y, y por último la coordenada Z.

Ejemplo de una lista de coordenadas:

(10 20 0)

Aquí el primer valor "10" corresponde a la coordenada X, el segundo "20" a la Y, y el tercero "0" a la Z.

A veces es necesario acceder a una de las coordenadas y modificar su valor para realizar operaciones con ella, por ejemplo sumar o restar "x" unidades a la coordenada X o Y.

A continuación observaremos cuales son estas funciones y acceso y creación de listas y como y para que las podemos utilizar:

Función CAR: Obtener el primer elemento de una lista

94 lecturas

Esta función obtiene el primer elemento de una lista, en el caso de una coordenada X,Y,Z obtendrá el valor de X.

Ejemplo de la función CAR :

1. (defun c:corX()

2. (setq cmdeactual (getvar "cmdecho"))

3. (setvar "cmdecho" 0)

4.

5. ; Solicitamos los datos necesarios

6. (setq PuntoCoordenada (getpoint "\nIndique el punto donde insertar la coordenada Este: "))

7. (setq alturatexto (getreal "\nIngrese la altura del texto: "))8.

9. ; Obtenemos el primer elemento de la lista del punto de coordenadas

10. (setq Este (CAR PuntoCoordenada))

11.

12. ; Insertamos el texto con el primer elemento de la lista (coordenada Este=X)

13. (command "text" "j" "m" PuntoCoordenada alturatexto "0" Este)

14.

15. (setvar "cmdecho" cmdeactual)

16. (princ)

17. )

Explicación:

- (setq PuntoCoordenada (getpoint "\nIndique el punto donde insertar la coordenada Este: ")) : Esta línea de código solicita mediante la función GETPOINT que el

usuario indique un punto en pantalla, las coordenadas del punto obtenido (XYZ) se almacenarán en la variable PuntoCoordenada.

- (setq Este (CAR PuntoCoordenada)): Aquí mediante la función CAR , obtenemos sólo el primer elemento de la lista almacenada en la variable PuntoCoordenada, este primer

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 19/49

elemento sería la coordenada X del punto indicado y se almacena en la variable Este.

- (command "text" "j" "m" PuntoCoordenada alturatexto "0" Este): Con la función COMMAND escribimos un texto en pantalla, la ubicación del texto será la misma que

se indicó para obtener las coordenadas, el contenido del texto está almacenado en la variable Este.

Función CADR: Obtener el segundo elemento de una lista

85 lecturas

Obtiene el segundo elemento de una lista, en el caso de una coordenada X,Y,Z obtendrá el valor de Y.

Ejemplo de la función CADR :

1. (defun c:corY()

2. (setq cmdeactual (getvar "cmdecho"))

3. (setvar "cmdecho" 0)

4.

5. ; Solicitamos los datos necesarios

6. (setq PuntoCoordenada (getpoint "\nIndique el punto donde insertar la coordenada Norte: "))

7. (setq alturatexto (getreal "\nIngrese la altura del texto: "))

8.

9. ; Obtenemos el segundo elemento de la lista del punto de coordenadas

10. (setq Norte (CADR PuntoCoordenada))

11.

12. ; Insertamos el texto con el segundo elemento de la lista (coordenada Norte=Y)

13. (command "text" "j" "m" PuntoCoordenada alturatexto "0" Norte)

14.

15. (setvar "cmdecho" cmdeactual)

16. (princ)

17. )

Explicación:

- (setq PuntoCoordenada (getpoint "\nIndique el punto donde insertar la coordenada Este: ")) : Esta línea de código solicita mediante la función GETPOINT que el

usuario indique un punto en pantalla, las coordenadas del punto obtenido (XYZ) se almacenarán en la variable PuntoCoordenada.

- (setq Norte (CADR PuntoCoordenada)) : Aquí mediante la función CADR , obtenemos sólo el segundo elemento de la lista almacenada en la variable PuntoCoordenada, este

segundo elemento es la coordenada Y del punto indicado y se almacena en la variable  Norte.

- (command "text" "j" "m" PuntoCoordenada alturatexto "0" Norte) : Con la función COMMAND escribimos un texto en pantalla, la ubicación del texto será la misma

que se indicó para obtener las coordenadas, el contenido del texto está almacenado en la variable Norte.

Función CADDR: Obtener el tercer elemento de una lista

91 lecturas

Esta función obtiene el tercer elemento de una lista, en el caso de una coordenada X,Y,Z obtendrá el valor de Z.

Ejemplo de la función CADDR :

1. (defun c:corZ()

2. (setq cmdeactual (getvar "cmdecho"))

3. (setvar "cmdecho" 0)

4.

5. ; Solicitamos los datos necesarios

6. (setq PuntoCoordenada (getpoint "\nIndique el punto donde insertar la coordenada Z: "))

7. (setq alturatexto (getreal "\nIngrese la altura del texto: "))

8.

9. ; Obtenemos el tercer elemento de la lista del punto de coordenadas

10. (setq Coorz (CADDR PuntoCoordenada))

11.

12. ; Insertamos el texto con el tercer elemento de la lista (coordenada Z)

13. (command "text" "j" "m" PuntoCoordenada alturatexto "0" Coorz)

14.

15. (setvar "cmdecho" cmdeactual)16. (princ)

17. )

Explicación:

- (setq PuntoCoordenada (getpoint "\nIndique el punto donde insertar la coordenada Z: ")) : Esta línea de código solicita mediante la función GETPOINT que el usuario

indique un punto en pantalla, las coordenadas del punto obtenido (XYZ) se almacenarán en la variable PuntoCoordenada.

- (setq Coorz (CADDR PuntoCoordenada)) : Aquí mediante la función CADDR , obtenemos sólo el tercer elemento de la lista almacenada en la variable PuntoCoordenada,

este tercer elemento es la coordenada Z del punto indicado y se almacena en la variable Coorz.

- (command "text" "j" "m" PuntoCoordenada alturatexto "0" Coorz) : Con la función COMMAND escribimos un texto en pantalla, la ubicación del texto será la misma

que se indicó para obtener las coordenadas, el contenido del texto está almacenado en la variable Coorz.

Función LIST: Creación de una lista de valores

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 20/49

107 lecturas

Esta función permite construir una nueva lista, la función GETPOINT obtiene una lista mediante la designación de un punto, esta lista es una lista de coordenadas, mediante la

función LIST, podemos modificar los valores de las coordenadas XYZ mediante operaciones de suma, resta u otra operación y construir una lista personalizada.

Una lista personalizada puede tener el siguiente formato:

(setq p1 (list 0.00 0.00 0.00))

Aquí estamos creando una variable llamada p1 que contendrá el valor de una lista de coordenadas (XYZ).

A continuación mediante un ejemplo comprenderemos mejor el uso de la función LIST.

Ejemplo de la función LIST:

1. (defun c:cor()

2. (setq cmdeactual (getvar "cmdecho"))

3. (setvar "cmdecho" 0)

4.

5. ; Solicitamos los datos necesarios

6. (setq PuntoCoordenada (getpoint "\nIndique el punto donde insertar las coordenadas: "))

7. (setq alturatexto (getreal "\nIngrese la altura del texto: "))

8.

9. ; Obtenemos el primer elemento de la lista del punto de coordenadas

10. (setq Este (car PuntoCoordenada))

11.

12. ; Obtenemos el segundo elemento de la lista del punto de coordenadas

13. (setq Norte (cadr PuntoCoordenada))

14.

15. ; Obtenemos el tercer elemento de la lista del punto de coordenadas

16. (setq Coorz (caddr PuntoCoordenada))

17.

18. ; Aquí crearemos 3 puntos de inserción para cada texto de las 3 coordenadas a insertar19. ; El punto para la coordenada X es el mismo que el punto solicitado por GETPOINT.

20. (setq px (LIST Este Norte Coorz))

21.

22. ; Crearemos aquí el segundo punto de inserción para la coordenada Y

23. ; (/ alturatexto 4) es la separación que tendrá el texto de la coordenada X con el texto de la coordenada Y

24. (setq py (LIST Este (- Norte alturatexto (/ alturatexto 4)) Coorz))

25.

26. ; Aquí crearemos el tercer punto de inserción para la coordenada Z

27. ; (/ alturatexto 2) es la separación que tendrá el texto de la coordenada X con el texto de la coordenada Z

28. (setq pz (LIST Este (- Norte (* alturatexto 2) (/ alturatexto 2)) Coorz))

29.

30. ; Insertamos el texto con el primer elemento de la lista (coordenada Este=X)

31. (command "text" "j" "m" px alturatexto "0" Este)

32.

33. ; Insertamos el texto con el segundo elemento de la lista (coordenada Norte=Y)

34. (command "text" "j" "m" py alturatexto "0" Norte)

35.

36. ; Insertamos el texto con el tercer elemento de la lista (coordenada Z)

37. (command "text" "j" "m" pz alturatexto "0" Coorz)38.

39. (setvar "cmdecho" cmdeactual)

40. (princ)

41. )

Explicación de la rutina:

- (setq px (LIST Este Norte Coorz)) : Esta línea de código crea un punto de coordenadas mediante la función LIST, este punto px tiene las mismos coordenadas que el punto

que se indicó en la variable PuntoCoordenada, sólo que lo hemos vuelto a construir para ilustrar la función y la creación del punto para la inserción del texto de la coordenada X.

- (setq py (LIST Este (- Norte alturatexto (/ alturatexto 4)) Coorz)) : Aquí estamos creando la variable py que contendrá una lista de coordenadas, esta lista de coordenadas

está siendo creada por la función LIST y tendrá tres valores de datos (XYZ):

- El primer valor "Este", será el mismo del primer elemento de la variable PuntoCoordenada, obtenido con la función CAR , este primer elemento está almacenado en la variable

Este y representa a la coordenada X.

- El segundo elemento "(- Norte alturatexto (/ alturatexto 4))

" será el fruto de la operación indicada, es decir, para ubicar el texto de la coordenada Y, necesitamos que este

texto esté más abajo que el texto de la coordenada X, de lo contrario ambos se superpondrían, para lograr esto necesitamos "restar" a la coordenada Y (Norte) un valor, el valor 

que restaremos será la altura del texto ingresado, como no sabemos cuál es este valor, usamos la variable que almacena dicha altura.

Además restamos otro valor: (/ alturatexto 4), esta operacion nos devuelve la separación que tendrá un texto del otro, porque de lo contrario aunque no se superpongan, estos

textos estarían muy juntos uno del otro, el resultado de la operación anterior es la cuarta parte del valor de la altura del texto.

- El tercer elemento de esta lista "Coorz" tiene la coordenada Z inalterable obtenida desde PuntoCoordenada, al igual que el primer (Norte) no es necesaria su modificación, los

textos son insertados todos en la misma coordenada X y Z.

- (setq pz (LIST Este (- Norte (* alturatexto 2) (/ alturatexto 2)) Coorz)) : Aquí estamos creando la variable pz, que servirá como punto de inserción para el texto que

contendrá el texto con la coordenada Z, los valores son los mismos que la explicación anterior, excepto que al valor Y, ya no solamente le vamos a restar el valor de la variable

alturatexto, sino este valor * 2, por tratarse ya de dos textos que estarán por encima de él. Además ahora adicionalmente también vamos a restar (/ alturatexto 2) en lugar de (/

alturatexto 4), es decir el valor es mayor, porque necesitamos ahora dos espacios de separación entre textos.

 

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 21/49

Conclusión de este capítulo:

Estimado usuario, esta rutina es un poco más extensa que las anteriores, pero como podrás ver, es la suma de cada uno de los ejemplos anteriores, esto prueba de que puedes

desarrollar rutinas complejas línea por línea. Trata de tener claro que hace cada línea de programación en lugar de tratar de entender toda la rutina de una vez, así comprendiendo

cada línea comprenderás que hace toda la rutina completa.

En el caso de las operaciones y tal y como vimos al inicio de curso en la sección de Funciones con Operadores, es mejor tratar de desenrollar el código tomando en cuenta cada

lista de dentro para afuera.

Funciones de Conversión de Datos

148 lecturas

En cualquier lenguaje de programación existe diferentes tipos de datos, cada tipo permite realizar una determinada acción dentro de programa a crear, por ejemplo, un tipo de

dato numérico, como los números, permite realizar operaciones de cálculos matemáticos, como por ejemplo, sumas, restas, incluso operaciones más complejas.

Un tipo de dato de texto, más conocido como dato tipo string, te permite realizar operaciones con cadenas, como por ejemplo mostrar mensajes e incluso concatenar (juntar) un

texto con un número, pero para poder realizar esta concatenación el número primero debe de ser transformado a un valor de texto.

AutoLISP nos permite manejar diferentes tipos de datos, los cuales son idóneos para realizar operaciones entre ellos, el punto que se debe de considerar es de utilizarlos con las

funciones correspondientes para cada tipo, los tipos de datos en el lenguaje AutoLISP son los siguientes:

Lista.- Que contiene: Paréntesis de apertura, espacios y paréntesis de cierre que constituyen el límite de acción de los programas.

Elemento.- Cualquier componente de una lista.

Símbolo.- Elementos sin un valor concreto como una variable.

Enteros.- Valores numéricos sin punto decimal.

Reales.- Valores numéricos con punto decimal.

Cadenas.- Valores de texto que deben de ir entre comillas.

Si no estás seguro, que tipo de dato contiene una variable, puede probar utilizando la función TYPE, esta función tiene la finalidad de verificar el tipo de dato indicado y devuelve

su tipo, puede ser entero, real, string, etc.

Un ejemplo de esta función puede ser la siguiente :

1. (defun c:tp()

2. (setq a 10)

3. (setq b 10.5)

4. (setq c "CONSTRUCGEEK")

5. (setq d (list 0 0))

6.

7. (setq at (TYPE a)) (princ at)(terpri)

8. (setq bt (TYPE b)) (princ bt)(terpri)

9. (setq ct (TYPE c)) (princ ct)(terpri)

10. (setq dt (TYPE d)) (princ dt)(terpri)

11. (princ)

12. )

Los valores que la función de ejemplo anterior muestra son los siguientes :

INT (Integer)(Entero)

REAL (Con decimales)

STR  (String)(Cadena de texto)

LIST (Una lista, como por ejemplo una coordenada)

Las funciones que veremos a continuación nos permitirán convertir los tipos de datos, para utilizarlos con otras funciones que aceptan un tipo de dato predeterminado:

Función FLOAT: Convertir un número ENTERO en valor REAL

97 lecturas

Esta función permite convertir un número entero especificado en número real o con decimales.

Ejemplo de la función FLOAT:

1. (defun c:cf()

2. (setq ne (getint  "\nIngrese un número entero: "))

3. (setq nr (FLOAT ne))

4. (princ nr)

5. (princ)

6. )

Explicación:

- (setq ne (getint "\nIngrese un número entero: ")) : En esta línea de código la función GETINT se encarga de solicitar un número entero y este número se almacena en la

variable ne.

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 22/49

- (setq nr (FLOAT ne)) : Aquí usamos la función FLOAT para transformar el valor entero que tiene la variable ne en un valor real o con decimales, si ingresamos por ejemplo el

número 36, esta rutina nos devolverá un mensaje "36.0".

Función ITOA: Convertir un número ENTERO en valor TEXTO

108 lecturas

Esta función convierte el número especificado en una cadena de texto.

Ejemplo de la función ITOA:

1. (defun c:ci()

2. (setq ne (getint  "\nIngrese un número: "))

3. (setq nr (ITOA ne))

4. (setq cad (strcat "\nEl número es ahora el texto: " nr))

5. (princ cad)

6. (princ)

7. )

Explicación:

- (setq ne (getint "\nIngrese un número entero: ")) : En esta línea de código la función GETINT se encarga de solicitar un número entero y este número se almacena en la

variable ne.

- (setq nr (ITOA ne)) : Aquí usamos la función ITOA para transformar el valor entero que tiene la variable ne en un valor de texto, si ingresamos por ejemplo el número 36, esta

rutina nos devolverá el mensaje "36".

Función RTOS: Convertir un número REAL en valor TEXTO

87 lecturas

Esta función convierte un número real (con decimales) especificado, en una cadena de texto. Además se le debe especificar dos argumentos que son el formato de número y el

número de decimales del nuevo valor.

Ejemplo de la función RTOS:

1. (defun c:corX()

2. (setq cmdeactual (getvar "cmdecho"))

3. (setvar "cmdecho" 0)

4.

5. ; Solicitamos los datos necesarios

6. (setq PuntoCoordenada (getpoint "\nIndique el punto donde insertar la coordenada Este: "))

7. (setq alturatexto (getreal "\nIngrese la altura del texto: "))

8.

9. ; Obtenemos el primer elemento de la lista del punto de coordenadas

10. (setq Este (car PuntoCoordenada))

11.

12. ; Transformamos el valor de la coordenada X obtenido a un valor de texto,

13. ; además especificamos que el formato de la conversión sea a decimales con 3 decimales

14. (setq EsteTexto (RTOS Este 2 3))

15.

16. ; Insertamos el texto con el primer elemento de la lista (coordenada EsteTexto=X)

17. (command "text" "j" "m" PuntoCoordenada alturatexto "0" EsteTexto)

18.

19. (setvar "cmdecho" cmdeactual)

20. (princ)

21. )

Explicación:

- (setq Este (car PuntoCoordenada)) : Esta línea de código mediante la función CAR  obtiene el primer elemento (X) del punto de coordenada obtenido con la función

GETPOINT y almacenado en PuntoCoordenada, este valor obtenido por la función CAR , es un numero con varios decimales, el resultado lo hemos apreciado en unos ejemplos

anteriores.

- (setq EsteTexto (RTOS Este 2 3)) : Aquí mediante el uso de la función RTOS transformamos el valor de la variable este (que almacena un número con varios decimales) a un

valor de texto decimal con 3 decimales. El tipo de unidades que se puede establecer a esta función, se pueden encontrar ejecutando el comando UNITS desde AutoCAD

(opciones Tipo y Precisión).

Función ANGTOS: Convertir un ANGULO en valor TEXTO

68 lecturas

Convierte el ángulo especificado el cual debe estar en radianes o el obtenido mediante la función ANGLE, en una cadena de texto. Además se le debe especificar dos argumentos

que son el formato de modo y los decimales del nuevo valor.

Modos: 0=Degrees, 1=Deg Min Sec, 2=Grads, 3=Radians, 4=Surveyor 

Ejemplo de la función ANGTOS:

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 23/49

1. (defun c:ca()

2. (setq P1Angulo (getpoint "\nIndique el 1er punto del ángulo a obtener: "))

3. (setq P2Angulo (getpoint P1Angulo "\nIndique el 2do punto del ángulo a obtener: "))

4.

5. (princ "Angulo: ")

6. (princ (ANGTOS (angle P1Angulo P2Angulo) 1 3))

7.

8. (princ)

9. )

Explicación:

- (princ (ANGTOS (angle P1Angulo P2Angulo) 1 3)) : Aquí mediante la función PRINC mostramos un mensaje en la línea de comandos de AutoCAD que informa el ángulo

obtenido mediante la indicación de dos puntos por parte del usuario (P1Angulo y P2Angulo), el valor del ángulo fue obtenido por la función ANGLE y transformado a texto por la

función ANGTOS, la cual también seteo el valor al formato grados/minutos/segundos (valor 1) y le estableció una precisión de tres decimales (valor 3).

Función ATOI: Convertir un TEXTO en número ENTERO

93 lecturas

Convierte un texto especificado en número entero. Si el número con valor de texto contiene decimales o adicionalmente otro texto (189.25K&^*%) al convertirse en número

entero estos se truncan (189).

Ejemplo de la función ATOI:

1. (defun c:te()

2. (setq txt (getstring "\nIngrese un número: "))  ;Valor de texto.

3. (setq nr (ATOI txt))

4. (princ nr)

5. (princ)

6. )

Explicación:

- (setq txt (getstring "\nIngrese un número: ")) : Aquí mediante esta línea de código el usuario ingresa un número, pero este número en realidad es almacenado como un valor 

de texto debido a que fue solicitado con la función GETSTRING y se almacena en la variable txt.

- (setq nr (ATOI txt)) : En esta línea ese valor de texto ingresado, mediante el uso de la función ATOI se convierte en un valor numérico entero y se almacena en la variable nr .

Función ATOF: Convertir un TEXTO en número REAL

91 lecturas

Convierte un texto especificado en un número real. Si el número con valor de texto contiene decimales o adicionalmente otro texto (189.2565K&^*%) al convertirse en número

real solo los demás textos se truncan (189.2565).

Ejemplo de la función ATOF:

1. (defun c:tr()

2. (setq txt (getstring "\nIngrese un número: "))  ;Valor de texto.

3. (setq nr (ATOF txt))

4. (princ nr)

5. (princ)

6. )

Explicación:

- (setq txt (getstring "\nIngrese un número: ")) : Aquí mediante esta línea de código el usuario ingresa un número, pero este número en realidad es almacenado como un valor 

de texto debido a que fue solicitado con la función GETSTRING y se almacena en la variable txt.

- (setq nr (ATOF txt)) : En esta línea ese valor de texto ingresado, mediante el uso de la función ATOF se convierte en un valor numérico real o con decimales y se almacena en

la variable nr .

Función ANGTOF: Convertir un TEXTO en ANGULO

74 lecturas

Convierte un texto especificado en un ángulo. Si el número con valor de texto contiene decimales o adicionalmente otro texto (180.25K&^*%) produce un valor de falso (nil),

 pero si solo tiene decimales los acepta.

Ejemplo de la función ANGTOF:

1. (defun c:ta()

2. (setq txt (getstring "\nIngrese un número: "))  ;Valor de texto.

3. (setq nr (ANGTOF txt))

4. (princ nr)

5. (princ)

6. )

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 24/49

El valor devuelto es siempre un ángulo en radianes.

Explicación:

- (setq txt (getstring "\nIngrese un número: ")) : Aquí el usuario ingresa un número, pero este número en realidad es almacenado como un valor de texto debido a que fue

solicitado con la función GETSTRING y se almacena en la variable txt.

- (setq nr (ANGTOF txt)) : En esta línea ese valor de texto ingresado, mediante el uso de la función ANGTOF se convierte en un ángulo y se almacena en la variable nr .

Función CVUNIT: Convertir un valor de un tipo de unidad a otro

86 lecturas

Esta función convierte el valor especificado de un tipo de unidad a otro tipo de unidad especificada.

Las unidades se indican con sus nombres en inglés y como cadenas de texto, es decir entre comillas.

Ejemplo de la función ANGTOF:

1. (defun c:pm ()

2. (princ "\nConvertir Pulgadas a Metros. ")

3. (setq valor (getreal "\nEntre valor en Pulgadas: "))

4. (setq cpm (CVUNIT valor "inches" "meters"))

5. (setq pul (rtos valor 2 4))

6. (setq met (rtos cpm 2 4))

7. (princ pul)(princ " pulgada(s) = ")(princ met)(princ " metros")

8. (princ)

9. )

Explicación:

- (setq valor (getreal "\nEntre valor en Pulgadas: ")) : Aquí mediante la función GETREAL solicitamos al usuario el ingreso en un valor, esta valor será considerado como

una unidad en pulgadas y se almacenará en la variable valor .

- (setq cpm (CVUNIT valor "inches" "meters")) : Aquí utilizamos la función CVUNIT para transformar el valor de pulgadas a metros, también se puede utilizar las siguientes

unidades: "hour" "second", "degree" "radian", "celsius" "kelvin".

- (setq pul (rtos valor 2 4)) : Aquí convertimos el valor ingresado de un valor real a un valor de texto para mostrarlo en pantalla.

 

Conclusión de este capítulo:

Como habrás podido ver estimado usuario, todas estas funciones te permitirán convertir los diferentes tipos de valores para usarlos en una determinada necesidad de

 programación, a medida que sigas avanzando en el curso podrás ver más ejemplos del uso de cada uno de ellos, te invito que revises algunos archivos lisp y busques estas

funciones para que veas en qué contexto están ubicadas.

Escribe cada una de estas rutinas en un archivo sin formato y grábalo con el nombre de conversiondatos.lsp, cárgalo en AutoCAD y comprueba que hace cada una de ellas,modifícalas según a tu gusto para que pruebes diferentes resultados.

Funciones de control de Cadenas de Texto

Deja tu comentario

156 lecturas

Las funciones de cadenas de texto en AutoLISP nos permiten manipular los datos de tipo texto y la función más utilizada es la que nos permite unir variables (de texto) con

cadenas de texto. Además otras funciones nos permiten obtener una parte o parte de un texto completo, otras convierten de mayúsculas a minúsculas y viceversa.

A continuación veremos las funciones más importantes para manipulación de cadenas de texto.

Función STRCAT: Concatenar (unir) cadenas

95 lecturas

Esta función devuelve una cadena que es la suma de todas las cadenas indicadas, éstas deben ser textos o variables con valor de texto de lo contrario se produce un error.

Ejemplo de la función STRCAT:

1. (defun c:corX()

2. (setq cmdeactual (getvar "cmdecho"))

3. (setvar "cmdecho" 0)

4.

5. ; Solicitamos los datos necesarios

6. (setq PuntoCoordenada (getpoint "\nIndique el punto donde insertar la coordenada Este: "))

7. (setq alturatexto (getreal "\nIngrese la altura del texto: "))

8.

9. ; Obtenemos el primer elemento de la lista del punto de coordenadas

10. (setq Este (car PuntoCoordenada))

11.

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 25/49

12. ; Convertimos este primer elemento en un tipo texto

13. (setq Este (rtos Este 2 3))

14.

15. ; Construimos el texto que se insertará

16. (setq TextoEste (STRCAT "Este=" Este))

17.

18. ; Insertamos el texto con el primer elemento de la lista (coordenada Este=X)

19. (command "text" "j" "m" PuntoCoordenada alturatexto "0" TextoEste)

20.

21. (setvar "cmdecho" cmdeactual)

22. (princ)

23. )

Explicación:

- (setq Este (car PuntoCoordenada)) : Aquí obtenemos el primero elemento de la lista que tiene la variable PuntoCoordenada (esta variable contiene tres elementos, X,Y,Z).

- (setq Este (rtos Este 2 3)) : Convertimos el valor numérico de ese elemento en valor de texto con la función RTOS para poder utilizarlo posteriormente con la función

STRCAT.

- (setq TextoEste (STRCAT "Este=" Este)) : Aquí creamos una variable llamada TextoEste que almacenará la unión de dos valores, el primer valor es una cadena de texto

("Este=") y el segundo valor es la variable Este, esta variable almacena el valor de la coordenada X del punto especificado pero en formato de texto.

Función SUBSTR: Subcadena de una cadena

67 lecturas

Esta función devuelve una parte de la cadena especificada, para ello se debe ingresar el número de carácter de inicio y el número de caracteres que contendrá la nueva cadena.

Ejemplo de la función SUBSTR :

1. (defun c:sb()

2. (setq texto (getstring "\nIngrese un texto: "))

3. (setq nt (SUBSTR texto 2 3))

4. (setq ic (strcat "Devuelve: " nt "\nCaracter de inicio 2 y longitud de 3 caracteres." ))

5. (princ ic)

6. (princ)

7. )

Explicación:

- (setq texto (getstring "\nIngrese un texto: ")) : Aquí con la función GETSTRING, obtenemos un texto ingresado por el usuario y la almacenamos en la variable texto.

- (setq nt (SUBSTR texto 2 3)) : Aquí procedemos a obtener una parte del texto, para ello utilizamos la función SUBSTR , indicamos que texto queremos recortar y el caracater

de inicio y cuantos caracteres tendrá esta subcadena. En este ejemplo la nueva cadena empezará desde el segundo caracter de la cadena existente y tendrá una longitud de 3

caracteres. La nueva subcadena se almacenará en la variable nt.

- (setq ic (strcat "Devuelve: " nt "\nCaracter de inicio 2 y longitud de 3 caracteres." ))  : Esta línea de código, concatena (une) los textos de información, con la nuevasubcadena obtenida con la función STRCAT y el resultado se almacena en la variable ic para ser mostrada posteriormente.

Función STRLEN: Longitud de una cadena

60 lecturas

Esta función devuelve un número que es la longitud total (número de caracteres) de una cadena especificada o de varias cadenas concatenadas.

Ejemplo de la función STRLEN:

1. (defun c:sl()

2. (setq txt (getstring "\nIngrese un texto: "))

3. (setq lon (STRLEN txt))

4. (setq lon (itoa lon))

5. (setq lont (strcat "Longitud del texto " txt ": " lon " caracteres."))

6. (princ lont)7. (princ)

8. )

Explicación:

- (setq txt (getstring "\nIngrese un texto: ")) : Aquí solicitamos y obtenemos un texto cualquiera por parte del usuario con la función GETSTRING y lo almacenamos en la

variable txt.

- (setq lon (STRLEN txt)) : En esta línea de código obtenemos con la función STRLEN el número de caracteres que tiene la variable txt y lo almacenamos en la variable lon.

- (setq lon (itoa lon)) : Como la variable lon contiene una tipo de dato numérico entero, en esta línea de código lo convertimos en un valor de texto para concatenarlo con otros

mensajes.

- (setq lont (strcat "Longitud del texto " txt ": " lon " caracteres.")) : Aquí procedemos a crear un mensaje concatenando (uniendo) un mensaje informativo con el número

de caracteres obtenido (lon) transformado a texto y lo almacenamos en la variable lont.

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 26/49

- (princ lont): Aquí mostramos el mensaje en pantalla.

Función STRCASE : Cambiar a Mayúsculas o Minúsculas

62 lecturas

Esta función cambia una cadena especificada en mayúsculas o minúsculas dependiendo del valor de una opción o modo.

Si el modo está presente (T), la cadena de texto se convierte en minúscula o de lo contrario se convierte en mayúscula.

Ejemplo de la función STRCASE:

1. (defun c:mn()

2. (setq tm (getstring "Ingrese un texto: "))

3. (setq tma (STRCASE tm))  ; Convierte a mayúscula

4. (setq tmi (STRCASE tm T))  ; Convierte a minúscula

5. (princ tma)

6. (terpri)

7. (princ tmi)

8. (princ)

9. )

Explicación:

- (setq tm (getstring "Ingrese un texto: ")) : Aquí solicitamos y obtenemos un texto cualquiera por parte del usuario con la función GETSTRING y lo almacenamos en la

variable tm.

- (setq tma (STRCASE tm)) : Aquí la función STRCASE convierte a mayúscula la cadena que se le indica.

- (setq tmi (STRCASE tm T)) : Aquí la función STRCASE convierte a minúscula la cadena que se le indica debido a que se indica un modo ( T).

Función WCMATCH : Comparar una cadena con un patrón o filtro

Deja tu comentario

144 lecturas

Esta función compara una cadena indicada con un filtro y si la cadena cumple con el filtro indicado devuelve T (verdadero), en caso contrario nil.

Para construir un filtro es necesario un conjunto de caracteres especiales o comodines que deberán estar dentro de unas comillas.

Ejemplo de la función WCMATCH:

1. (defun c:wm()

2. (setq txt (getstring "\nIngrese un texto: "))

3. (if (WCMATCH txt "A*,a*")

4. ; Si es verdadero:5. (princ "El texto que escribió inicia con A o a.")

6. ; Si es falso:

7. (princ "El texto que escribió inicia diferente de A o a.")

8. )

9. (princ)

10. )

Explicación:

- En este ejemplo WCMATCH compara la variable txt que contiene el texto ingresado, con el patrón "A*,a*", si el texto empieza con A o con a, devuelve T (verdadero), de lo

contrario nil (FALSO).

- En este ejemplo estamos utilizando una condicional (IF) para ilustrar el ejemplo, posteriormente detallaremos el uso de esta y otras funciones condicionales.

Otros comodines:

# Busca cualquier digito numérico.

@ Busca cualquier carácter alfabético.. Busca cualquier carácter no alfanumérico.

* Busca cualquier secuencia de carácter.

? Indica un caracter.

- Busca si la cadena no contiene una letra especificada. (WCMATCH "Barco" "-*q*") T.

 

Función ALERT: Mostrar un Cuadro de mensaje

80 lecturas

Muestra un cuadro de mensaje en la pantalla de AutoCAD con el texto especificado. Se pueden escribir varias líneas de texto, pero para ello se debe de incluir el código " \n"

antes de la nueva linea.

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 27/49

Ejemplo de la función ALERT:

1. (defun c:al()

2. (ALERT "Bienvenidos al Curso de AutoLISP\n\nWeb:

3. construcgeek.com/curso/autolisp-para-principiantes")

4. (princ)

5. )

 

Conclusión de este capítulo:

Estimado usuario, todas estas funciones de manipulación de cadenas de texto te serán de mucha ayuda especialmente cuando manipules objetos de tipo texto, posteriormente

conocerás más funciones que te permitirán usarlas de una manera óptima, por lo pronto practica escribiendo todos estos ejemplos en un archivo al que le puedes llamar:

cadenasdetexto.lsp y cárgalo en AutoCAD.

Prueba cambiando el código y visualizando los posibles efectos que esto lleva.

Funciones de Condicionales

119 lecturas

Estas funciones potencian grandemente las rutinas creadas con AutoLISP porque manejan los datos de acuerdo a una determinada respuesta o condición, esto nos permite

controlar los flujos de código mientras una condición sea cierta o falsa.

En este curso veremos las funciones condicionales que más se usan en el lenguaje AutoLISP, repasaremos algunos ejemplos y mediante ellos lograremos tener en claro en qué

momento se usa cada una de ellas.

A continuación veremos las siguientes funciones condicionales.

Función IF: Condicional simple

81 lecturas

La función IF evalúa una expresión condicional y si esta cumple dicha condición devuelve verdadero T (Verdadero) y se ejecuta la primera línea o el primer bloque dentro de su

estructura, de lo contrario devuelve nil (falso) y se ejecuta la segunda línea o bloque.

Ejemplo de la función IF:

1. (defun c:dt()

2. (setvar "cmdecho" 0)

3.

4. ; Solicitamos los datos necesarios

5. (setq pb (getpoint "\nIndique el punto base de la línea: "))

6. (setq TL1 (getreal "\nIngrese el talud1 (X) de la línea a dibujar: "))

7. (setq TL2 (getreal "\nIngrese el talud2 (Y) de la línea a dibujar: "))8.

9. ; Obtenemos la coordenada X e Y de la variable pb que almacena el punto de coordenadas designado por el usuario

10. (setq xpb (car pb))

11. (setq ypb (cadr pb))

12.

13. ; SI la variable SentidoDef no existe (null), la creamos con el valor por defecto "Derecha".

14. ; Esto es para evitar sobrescribirla con otro valor que el seleccionado por el usuario

15. (IF (null SentidoDef)

16. (setq SentidoDef "Derecha")

17. )

18.

19. ; Aquí vamos a solicitar mediante la función GETKWORD que el usuario indique el sentido de la línea con pendiente que se

20. ; La función GETKWORD solo tendrá dos opciones válidas que aceptará "Izquierda" y "Derecha"

21. (initget "Izquierda Derecha")

22. (setq Sentido (getkword (strcat "\nIndique el sentido del talud [Izquierda/Derecha] <" SentidoDef ">: ")))

23.

24. ; Si el usuario ante la solicitud anterior de que de indique el talud, no indicó ninguna opción (presiona Enter=Null) la

25. ; almacenará el valor por defecto establecido

26. (IF (null Sentido)27. (setq Sentido SentidoDef)

28. )

29.

30. ; Actualizamos el valor de la variable SentidoDef con el nuevo valor de la variable Sentido.

31. (setq SentidoDef Sentido)

32.

33. ; Evaluamos que sentido eligió el usuario, todo depende del valor de la variable "Sentido"

34. ; y realizamos los cálculos correspondientes para construir el segundo punto de la línea que se dibujará

35. ; Si la variable "Sentido" es igual a "Izquierda" se ejecuta la primera línea, de lo contrario se ejecuta la segunda

36. (IF (= Sentido "Izquierda")

37. (setq p2 (list (- xpb TL1) (+ ypb TL2)))

38. (setq p2 (list (+ xpb TL1) (+ ypb TL2)))

39. )

40.

41. ; Creamos la línea con los dos puntos ya establecidos utilizando la función COMMAND

42. (command "line" pb p2 "")

43.

44. (setvar "cmdecho" 1)

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 28/49

45. (princ)

46. )

La función IF sólo puede tener dos bloques de código, uno en el caso de la condición sea verdadera y el otro en el caso de que la condición sea falsa, pero no necesariamente

estos dos bloques tienen que ser dos líneas de código.

Un bloque puede tener varias líneas de código si estas estan dentro de la función PROGN, función que veremos más adelante.

Función COND: Condicional múltiple

83 lecturas

La función COND, permite evaluar más de una condición, especificando acciones de acuerdo a si se cumplen cada una de ellas. Se pueden establecer múltiples condiciones yacciones como opciones tenga para el usuario.

Ejemplo de la función COND:

1. (defun c:pam ()

2. ; Solicitamos que el usuario ingrese una opción, sólo tiene 2 y

3. ; una por defecto <> (esta opción por defecto siempre será la misma)

4. (initget "Pm Mp")

5. (setq PiesMetros (getkword "\nIndique el tipo de conversión [Pies a metros/Metros a pies] <Pies a metros>: "))

6.

7. ; Aqui solicitamos el valor a convertir

8. (setq valor_ingresado (getdist "\nIngrese el valor a convertir: "))

9.

10. ; Aquí usamos la función COND para evaluar cuál fue la respuesta ingresada por el usuario

11. ; Debemos de prestar especial atención a la estructura del código, se debe de observar cómo

12. ; van los paréntesis de abertura y cierre.

13. (COND

14. ((= PiesMetros "Pm")15. (princ "\nConvertir Pies a Metros.")

16. (setq Valor1 "feet") (setq Valor2 "meters")(setq texto1 "Pies") (setq texto2 "metros")

17. )

18. ((= PiesMetros "Mp")

19. (princ "\nConvertir Metros a Pies.")

20. (setq Valor1 "meters")(setq Valor2 "feet")(setq texto2 "Pie(s)") (setq texto1 "metro(s)")

21. )

22. (t

23. (princ "\nConvertir Pies a Metros.")

24. (setq Valor1 "feet") (setq Valor2 "meters")(setq texto1 "Pie(s)") (setq texto2 "metro(s)")

25. )

26. )

27.

28. ; En ésta línea de código realizamos la conversión de unidades de acuerdo

29. ; a lo especificado por el usuario

30. (setq valor_convertido (cvunit valor_ingresado Valor1 Valor2))

31.

32. ; Mostramos el mensaje con los valores convertidos

33. (princ (strcat "\n" (rtos valor_ingresado 2 4) " " texto1 " = " (rtos valor_convertido 2 4) " " texto2 "."))34.

35. (princ)

36. )

 

Función PROGN: Secuencia consecutiva

96 lecturas

Esta función admite como argumentos todas las expresiones que se indiquen y las evalúa secuencialmente.

Generalmente utilizamos PROGN con la función IF para que pueda ser posible ejecutar varias acciones si se cumple una condición o no.

Ejemplo de la función PROGN:

1. (defun c:dtp()2. (setvar "cmdecho" 0)

3.

4. ; Solicitamos los datos necesarios

5. (setq pb (getpoint "\nIndique el punto base de la línea: "))

6. (setq TL1 (getreal "\nIngrese el talud1 (X) de la línea a dibujar: "))

7. (setq TL2 (getreal "\nIngrese el talud2 (Y) de la línea a dibujar: "))

8.

9. ; Obtenemos la coordenada X e Y de la variable pb que almacena el punto de coordenadas designado por el usuario

10. (setq xpb (car pb))

11. (setq ypb (cadr pb))

12.

13. ; Si la variable SentidoDef no existe (null), la creamos con el valor por defecto "Derecha".

14. ; Esto es para evitar sobrescribirla con otro valor que el seleccionado por el usuario

15. (if (null SentidoDef)

16. (setq SentidoDef "Derecha")

17. )

18.

19. ; Aquí vamos a solicitar mediante la función GETKWORD que el usuario indique el sentido de la línea con pendiente que se

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 29/49

20. ; La función GETKWORD solo tendrá dos opciones válidas que aceptará "Izquierda" y "Derecha"

21. (initget "Izquierda Derecha")

22. (setq Sentido (getkword (strcat "\nIndique el sentido del talud [Izquierda/Derecha] <" SentidoDef ">: ")))

23.

24. ; Si el usuario ante la solicitud anterior de que de indique el talud, no indicó ninguna opción (presiona Enter=Null) la

25. ; almacenará el valor por defecto establecido

26. (if (null Sentido)

27. (setq Sentido SentidoDef)

28. )

29.

30. ; Actualizamos el valor de la variable SentidoDef con el nuevo valor de la variable Sentido.

31. (setq SentidoDef Sentido)

32.

33. ; Evaluamos que sentido eligió el usuario, todo depende del valor de la variable "Sentido"

34. ; y realizamos los cálculos correspondientes para construir el segundo punto de la línea que se dibujará

35. ; Si la variable "Sentido" es igual a "Izquierda" se ejecuta el primer bloque de código encerrado en PROGN, de lo contrar36. (if (= Sentido "Izquierda")

37. (PROGN

38. (princ "\nPendiente con sentido izquierda")

39. (setq p2 (list (- xpb TL1) (+ ypb TL2)))

40. )

41. (PROGN

42. (princ "\nPendiente con sentido derecha")

43. (setq p2 (list (+ xpb TL1) (+ ypb TL2)))

44. )

45. )

46.

47. ; Creamos la línea con los dos puntos ya establecidos utilizando la función COMMAND

48. (command "line" pb p2 "")

49.

50. (setvar "cmdecho" 1)

51. (princ)

52. )

 

Función WHILE: Repetir expresión según condición

85 lecturas

Esta función permite repetir acciones mientras se cumpla una condición dada que sirve como elemento de control de la repetitiva. Mientras la condición se cumpla o sea verdadera

(T) todas las acciones se ejecutan, hasta que la condición resulte falsa (nil).

Ejemplo de la función WHILE:

1. (defun c:corX()

2. (setq cmdeactual (getvar "cmdecho"))

3. (setvar "cmdecho" 0)

4.

5. ; Solicitamos los datos necesarios, primero la altura del texto a insertar y

6. ; posteriormente los puntos en donde se insertará el texto.7. (setq alturatexto (getreal "\nIngrese la altura del texto de la coordenada a insertar: "))

8.

9. ; Como no sabemos cuántas veces el usuario indicará un punto, usamos la función WHILE,

10. ; para indicar que las acciones se ejecuten hasta que el usuario presione Enter ante

11. ; la solicitud de indicar un punto en pantalla (la variable PuntoCoordenada será igual a nil)

12. (WHILE

13. (setq PuntoCoordenada (getpoint "\nIndique el punto donde insertar la coordenada Este: "))

14.

15. ; Obtenemos el primer elemento de la lista del punto de coordenadas

16. (setq Este (CAR PuntoCoordenada))

17.

18. ; Transformamos el valor de la coordenada X obtenido a un valor de texto,

19. ; además especificamos que el formato de la conversión sea a decimales con 3 decimales

20. (setq EsteTexto (RTOS Este 2 3))

21.

22. ; Insertamos el texto con el primer elemento de la lista (coordenada Este=X)

23. (command "text" "j" "m" PuntoCoordenada alturatexto "0" EsteTexto)

24. )

25.26. (setvar "cmdecho" cmdeactual)

27. (princ)

28. )

 

Conclusión de este capítulo:

Estimado usuario, estas han sido las funciones condicionales que más se utilizan en el lenguaje AutoLISP, aquí los ejemplos son un poco amplios, pero como te mencioné

anteriormente, aísla cada línea de código y verás que te son familiares, todas las funciones que se han visto aquí ya las hemos revisado anteriormente y hemos generado ejemplo

 para cada una de ellas, por lo que parte de algunos de estos ejemplos los reconocerás fácilmente.

Practica escribiendo todos estos ejemplos de funciones condicionales en una archivo de texto y guardarlo con el nombre de condicionales.lsp , cárgalo en AutoCAD y observa

que hace cada uno de ellos, puedes modificar algunas línea para que vayas probando que pasa si modificas alguna que otra cosa.

Te vuelvo a hacer hincapié de que observes bien la estructura (orden de los paréntesis) de cada función y de cada ejemplo, es importante que todos estén completos y que el

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 30/49

código tenga un orden, acostúmbrate a realizar sangrías (niveles) de las líneas de acuerdo al nivel o profundidad del código.

Funciones de Selección de Objetos

160 lecturas

En un programa de CAD, una de las operaciones que más se realiza en el trascurso de una sesión de dibujo es la selección de entidades u objetos y esto es debido a que la

esencia del mismo justamente radica en la edición de las entidades existentes. Ya sea copiar, mover, etc, todas estas acciones necesitan que el elemento primero haya sido

seleccionado.

En AutoLISP tampoco es la diferencia y en la mayoría de las rutinas, la acción de seleccionar entidades es una de las más usuales. A continuación veremos algunas funciones que

nos permiten manipular las entidades existentes, primero veremos funciones que nos permiten seleccionarlas y posteriormente veremos funciones que nos permitirán modificar yactualizarlas.

Función ENTSEL: Seleccionar y obtener una sola entidad

113 lecturas

La función ENTSEL nos permite seleccionar una entidad y devuelve dos valores, el primer valor es el nombre de la entidad seleccionada y el segundo es la coordenada del punto

de designación en la entidad. Adicionalmente se puede agregar un mensaje para el usuario, al solicitar la designación de la entidad.

Es importante obtener el nombre del objeto para poder luego manipularlo, recuerda que en una sesión de dibujo puede haber miles de objetos o entidades y con el nombre nos

 podemos referir a una de ellos en particular.

Ejemplo de la función ENTSEL:

1. (defun c:br()

2. (setvar "cmdecho" 0)

3. (setq ent (entsel "\nSeleccione la entidad a cortar: "))

4. (setq pco (getpoint "\nIndique el punto de corte: "))

5.

6. (command "_break" ent "_f" pco pco)

7. (setvar "cmdecho" 1)

8. (princ)

9. )

Rutina que corta una línea selecionada por un punto indicado

Explicación:

- (setq ent (entsel "\nSeleccione la entidad a cortar: ")) : Mediante esta línea de código se le pide al usuario que designe una sola entidad, la función ENTSEL permite

obtener la entidad y almacena su contenido en la variable ent.

- (setq pco (getpoint "\nIndique el punto de corte: ")) : Aquí solicitamos que el usuario designe un punto en la entidad, en la ubicación de ese punto es que se partirá la línea o

 polilinea.

- (command "_break" ent "_f" pco pco) : Aquí mediante la función COMMAND usamos el comando "break " de AutoCAD para partir la entidad por el punto indicado.

Tomamos la opción FIRTS ("_f") para indicar un primer punto y segundo punto en el mismo sitio.

Función ENTLAST: Obtiene última entidad creada

102 lecturas

Esta función devuelve el nombre de la última entidad creada en el dibujo, así no este visible en la pantalla o este en una capa desactivada.

Ejemplo de la función ENTLAST:

La siguiente es una función externa que dibuja una línea.

1. (defun lin()

2. (setvar "cmdecho" 0)

3. (setq p1 (getpoint "Primer punto:"))

4. (setq p2 (getpoint p1 "\nSegundo punto:"))

5. (command "line" p1 p2 "")

6. (setvar "cmdecho" 1)

7. )

Se crea una nueva función: rutina uent.

1. (defun c:uent()

2. (lin)

3. (setvar "cmdecho" 0)

4. (setq ent (ENTLAST))

5. (command "change" ent "" "p" "c" "6" "")

6. (setvar "cmdecho" 1)

7. (princ)

8. )

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 31/49

Explicación:

- El primer bloque de código permite dibujar una línea que sirve para el ejemplo del segundo bloque de código, este primer bloque es una función externa, la función " lin" es una

rutina, pero no funciona como comando de AutoCAD, recordemos que para que sea reconocido como tal, el nombre de la rutina debe de tener el prefijo " c:", es decir debería de

ser así: (defun c:lin(). Pero en este caso no es necesario, porque esta función lin será llamada desde la rutina siguiente.

- En el segundo de código estamos creando la función UENT que a su vez será reconocida como comando de AutoCAD, en ella lo primero que hacemos es llamar a la función

externa (lin), esa función como ya hemos mencionado permite dibujar una línea.

- (setq ent(ENTLAST)) : Aquí le indicamos a AutoCAD que seleccione la última entidad creada en el dibujo, esta función no tiene argumentos y almacena la entidad

seleccionada en la variable ent.

- (command "change" ent "" "p" "c" "6" "" ) : Aquí cambiamos el color de la última línea creada mediante la función COMMAND y el comando de AutoCAD

CHANGE.

Función ENTNEXT: Obtiene entidades por orden de creación

Deja tu comentario

118 lecturas

Esta función obtiene el nombre de la primera entidad dibujada que sigue a aquella cuyo nombre se especifica. Si no se especifica ningún nombre devuelve la primera entidad

dibujada.

También podemos usar esta función para averiguar si existen entidades en el dibujo antes de iniciar las acciones de nuestra rutina.

Ejemplo 1 de la función ENTNEXT:

1. (setq ExisteEntidades (ENTNEXT))

2. (if (not (null ExisteEntidades))3. (progn

4. (princ "\nAquí procedemos a ejecutar las acciones de la rutina")

5. (princ "...")

6. )

7. (progn

8. (Alert "No se encontraron entidades que modificar en el dibujo")

9. )

10. )

Explicación:

- (setq ExisteEntidades (ENTNEXT)) : Aquí la función ENTNEXT, busca entidades en el dibujo, si existe la almacena en la variable ExisteEntidades.

- (if (not (null ExisteEntidades)) : Si no el contenido de la variable ExisteEntidades no es nula (es decir existen entidades), entonces se procede con las acciones, de lo contrario

se muestra un mensaje indicando que no se encontró entidades en el dibujo.

 

Ejemplo 2 de la función ENTNEXT:

La función externa "dl" nos permite dibujar varias líneas.

1. (defun dl()

2. (setvar "cmdecho" 0)

3. (setq p1(list 0 0))

4. (princ "Dibuje líneas que serán cambiadas de color.")

5.

6. (while p1

7. (if (setq p1 (getpoint "\nPunto inicial [ENTER para terminar]: "))

8. (progn

9. (setq p2 (getpoint p1 "\nPunto final: "))

10. (command "Line" p1 p2 "")

11. (setvar "cmdecho" 1)

12. )

13. )

14. )15. )

El nuevo comando "enx" obtiene el nombre de la primera entidad creada y luego obtiene el resto por orden de creación y les cambia de color.

1. (defun c:enx()

2. (dl) 

3. (setvar "cmdecho" 0)

4.

5. (setq ent (ENTNEXT))

6. (command "change" ent "" "p" "c" "6" "")

7.

8. (while ent

9. (if (setq ent (ENTNEXT ent))

10. (command "change" ent "" "p" "c" "6" "")

11. )

12. )

13.

14. (setvar "cmdecho" 1)

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 32/49

15. (princ)

16. )

Explicación:

- El primer bloque de código (dl) es una función que nos permite crear líneas, ya sabemos que como el nombre de dicha función no tiene el prefijo " c:" entonces no es tratado

como un comando de AutoCAD.

- (setq ent (ENTNEXT)) : Usamos la función ENTNEXT para capturar el primer elemento creado en el dibujo, en este caso la primera línea creada.

- (command "change" ent "" "p" "c" "6" "") : Aquí usamos la función COMMAND para llamar al comando CHANGE y cambiar el color a la primera entidad creada.

- Con la función While recorremos todas las demás entidades que se crearon después de la primera entidad que se cambió el color, la variable ent se va actualizando tomando el

valor de la última entidad seleccionada, por lo tanto se sigue avanzando hasta llegar a la última entidad creada.

Función ENTDEL: Borrar o recuperar entidad

85 lecturas

 Nos permite borrar una entidad indicada o recuperarla en cualquier momento después de haber sido borrada. No se podrá recuperar si es que se sale de la sesión del dibujo.

Ejemplo 1 de la función ENTDEL:

1. (defun c:entd()

2. (lin)

3. (setq ent (entlast))

4. (ENTDEL ent)

5. (princ "Se borró")

6. (princ)

7. )

Explicación:

- En esta rutina nuevamente llamamos a la función lin que hemos creado anteriormente para dibujar una línea.

- (setq ent (entlast)) : Aquí con ENTLAST seleccionamos la última entidad creada (la línea) y la almacenamos en la variable ent.

- (ENTDEL ent) : Borramos la línea, el nombre de la entidad estaba contenido en la variable ent.

 

Ejemplo 2 de la función ENTDEL:

1. (defun c:entd2()

2. (ENTDEL ent)

3. (Princ "Recuperó")

4. (princ)

5. )

Explicación:

- (ENTDEL ent) : Nuevamente usando la función ENTDEL recuperamos la entidad que se eliminó en la anterior rutina.

 

Conclusión de este capítulo:

Estimado usuario, todas estas funciones que hemos visto en este capítulo son una parte de las que nos permiten seleccionar entidades mediante programación, otras funciones con

las mismas caracterísiticas las veremos en el capitulo siguiente.

Como puedes ver seguimos avanzando y conociendo más funciones, sigue practicando ecribiendo tus ejemplos, trata en lo posible de escribirlos y no copiarlos, así apredenderás

mucho más rápido cada una de las funciones y además reconocerás posibles errores que puedas cometer al escribirlos.

Guarda el archivo con con nombre referencial como por ejemplo seleccion1.lsp y cargalo en AutoCAD, observa que hace cada uno de ellos.

Recuerda que debes de dejar los ejemplos tal y como los muestro en el curso, con sus tabs (sangrias), espacios etc.

Funciones de Acceso a la Base de Datos de las Entidades

178 lecturas

Como habrás podido observar en AutoCAD, un dibujo está lleno de entidades gráficas (líneas, círculos, textos, etc) y no gráficas (capas, estilos de texto, de cotas, etc).

AutoCAD guarda la información de cada una de las entidades, para posteriormente mostrarlas en cada edición del trabajo y además mostrarte las características o propiedades de

cada una de ellas mediante el cuadro de diálogo Properties.

El lugar en que AutoCAD almacena esta información es en una base de datos del dibujo, en esta base de datos esta almacenada la información de cada entidad en forma de una

Lista (elementos entre paréntesis) con Sublistas por cada propiedad del elemento o entidad, es como si fuera el ADN de las personas, AutoLISP brinda funciones que nos

 permiten acceder a las listas de las entidades, obtener información de una propiedades en particular de una entidad o modificarla.

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 33/49

Cada propiedad de la entidad es una sublista de la lista principal y contiene dos valores separados por un punto, el primer valor contiene el tipo de propiedad, y el segundo el valor 

de dicha propiedad. El primer elemento es como si fuera la dirección de lo que buscamos obtener y así fácilmente obtenemos los valores con tan solo llamar al tipo de propiedad.

Por ejemplo, la lista, ADN o estructura de una línea es esta:

 ((-1 . <Entity name: 7ffffb05a40>) (0 . "LINE") (330 . <Entity name: 7ffffb039f0>) (5 . "21C") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .

"AcDbLine") (10 1562.56 757.637 0.0) (11 1891.48 897.88 0.0) (210 0.0 0.0 1.0))

Como puedes ver una línea es una lista delimitada por paréntesis y la cual contiene sublistas también delimitadas por paréntesis, dentro de cada sublista existen dos elementos

separados por un punto (.), como te mencioné anteriormente el primer elemento es el tipo de propiedad y el segundo es el valor de la propiedad, por ejemplo:

 

- (0 . "LINE") : El código 0 indica el tipo de la entidad y después del punto vine su valor, la entidad es del tipo "LINE".

 - (8 . "0") : Esta sublista tiene como primer código el número 8, que indica la capa de la entidad y después del punto tiene su valor, el valor es "0", es decir se encuentra en la

capa "0".

A continuación te muestro un cuadro en el que podrás ver algunos códigos más comunes de las entidades de AutoCAD:

Otro ejemplo de una lista de datos es la siguiente, pero esta vez no es una lista de una entidad gráfica sino de un objeto no gráfico:

((0 . "LAYER") (2 . "Muros") (70 . 0) (62 . 5) (6 . "Continuous"))

Esta es la lista que conforma una capa, donde 0 es el tipo de objeto, 2 es el nombre del objeto, 62 es el color, 6 es el tipo de línea.

A continuación veremos las funciones que nos permiten obtener la estructura de una entidad gráfica o no gráfica.

Función ENTGET: Obtener estructura de una entidad gráfica

116 lecturas

Esta función es la más importante para obtener la estructura de una entidad gráfica y el valor obtenido es una lista con sublistas asociadas que conforman la estructura de una

entidad seleccionada con ENTLAST, ENTSEL, etc.

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 34/49

Ejemplo de la función ENTGET:

1. (defun c:Sen()

2. (setq sel (entsel "\nSeleccione una entidad: "))

3. (setq noment (car sel)) ;Obtenemos el nombre de la entidad.

4. (setq ent (ENTGET noment))

5. (princ "\nLa estructura de la entidad seleccionada es\n:")

6. (princ ent)

7. (princ)

8. )

Explicación:

- (setq sel (entsel "\nSeleccione una entidad: ")) : Aquí con la función ENTSEL seleccionamos una entidad y el resultado de la selección (nombre de la entidad y punto de

designación) lo almacenamos en la variable sel.

- (setq noment (car sel)) : Como por ahora sólo nos interesa el nombre, entonces obtenemos el primer elemento de la lista (el nombre) con la función CAR  y lo almacenamos en

la variable noment.

- (setq ent (ENTGET noment)) : En esta línea de código usamos la función ENTGET para obtener la estructura (listas) del objeto indicado (el nombre del objeto está indicado

en la variable noment), una vez obtenida la estructura la almacenamos en la variable ent.

- Con la función PRINC posteriormente mostramos información de la estructura de la entidad seleccionada.

Función TBLSEARCH: Leer estructura de entidad no gráfica

82 lecturas

Devuelve la estructura de las entidad no gráficas (Tablas de símbolos) especificada, pero una en particular especificando el nombre. Los tipos deben ser los mismos que para

TBLNEXT y adicional un nombre que identifica al tipo.

Ejemplo de la función TBLSEARCH:

1. (defun c:esim()

2. (setq simb (TBLSEARCH "Layer" "Muros"))

3. (princ "\nLa estructura de la capa indicada es\n:")

4. (princ simb)

5. (princ)

6. )

Explicación:

- (setq simb (TBLSEARCH "Layer" "Muros")) : Aquí la función TBLSEARCH obtiene la estructura de la capa indicada, primero se le indica el tipo de estructura a leer y

luego se indica el nombre, recordar que sólo permite obtener las estructuras de las entidades no gráficas. El resultado se almacena en la variable simb.

- (princ simb) : Con la función PRINC mostramos la estructura de la capa Muros.

Función TBLNEXT: Leer estructura de entidades no gráficas

102 lecturas

Esta función al igual que la anterior, obtiene la estructura de las entidad no gráficas (Tablas de símbolos), especificadas pero la diferencia está en que la función devuelve la primera

entidad no gráfica del tipo especificado, luego devuelve el resto a medida que nuevamente se le invoca.

El tipo debe ser " LAYER", " LTYPE ", "STYLE ", " BLOCK ", "VIEW ", "UCS ", "VPORT ", " DIMSTYLE ", que son los únicos admitidos. Para ver el contenido de un número

determinado de capas se llama se llama a TBLNEXT  las veces que sea necesario, si nos existen más capas que mostrar devuelve nil.

Ejemplo de la función TBLNEXT:

1. (defun c:esim2()

2. (while

3. (setq simb2 (TBLNEXT "Layer"))

4. (princ "\n\nLa estructura de la capa indicada es\n:")5. (princ simb2)

6. )

7. (princ)

8. )

Explicación:

- Esta rutina ejecutará una acción (leer capa por capa) siempre y cuando la variable simb2 sea verdadera (mientras existan capas que leer) y mostrará un mensaje con la estructura

de cada capa.

 

Conclusión de este capítulo:

Estimado usuario como has observado, todas estas funciones te permiten acceder a la base de datos de las entidades del dibujo, ellas por si solas no realizan ninguna acción con la

 base de datos, sólo te permiten obtener toda la estructura (lista y sublistas), para manipular estas listas, existen otras funciones que veremos en el siguiente capítulo, con los

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 35/49

respectivos ejemplos podrás tener más claro en que te ayuda acceder a estas base de datos.

Como ya es costumbre debes de escribir estos ejemplos en un archivo de texto plano (sin formato) y guardarlo con el nombre de accesoadatos.lsp, carga este archivo en

AutoCAD y ejecuta cada uno de estos ejemplos, practícalos tantas veces como sea necesario, en diferentes tipos de archivos que tengas de dibujo para que veas cuales son los

resultados que obtienes de ellos.

Funciones para Manipular la Base de Datos de las Entidades

155 lecturas

En el capítulo anterior conocimos las funciones que nos permitían acceder a la estructura de la base de datos de una entidad o símbolo y descubrimos que esta estructura es una

lista con sublistas, cada sublista contiene un par de elementos, el primer elemento es un código y el segundo elemento es un valor o propiedad de ese código.

En esta oportunidad conoceremos cuales son las funciones que nos permiten manipular la base de datos, con estas funciones podremos acceder a un valor determinado, agregar,

reemplazar o actualizar valores de la base de datos. Por ejemplo podemos acceder mediante el código 62 al color de una entidad (siempre y cuando su color sea diferente a

 porCapa) y establecerle un color nuevo.

A continuación veremos cuáles son estas funciones de manipulación de base de datos.

Función ASSOC: Obtener una sublista asociada de una lista

83 lecturas

La función ASSOC nos permite obtener una sublista de una lista que lo contiene, el valor obtenido es el código con el valor del mismo todo entre paréntesis.

Ejemplo de la función ASSOC:

1. (defun c:Sen()

2. (setq sel (entsel "\nSeleccione una entidad: "))

3. (setq noment (car sel))

4. (setq ent (entget noment))

5. (setq listacapa (ASSOC 8 ent))

6. (princ "\nLa sublista de la capa de la lista de la entidad seleccionada es:\n")

7. (princ listacapa)

8. (princ)

9. )

Devuelve la lista asociada al código 8 que es la capa en la que se encuentra la entidad seleccionada.

Explicación:

- (setq sel (entsel "\nSeleccione una entidad: ")) : Mediante la función ENTSEL obtenemos el nombre de la entidad + la coordenada del punto de designación y

almacenamos los datos en la variable sel.

- (setq noment (car sel)) : Con la función CAR  obtenemos sólo el nombre (1er elemento) de la entidad y lo almacenamos en la variable noment.

- (setq ent (ENTGET noment)) : Obtenemos la estructura (lista) de la base de datos de la entidad y la almacenamos en la variable ent.

- (setq listacapa (ASSOC 8 ent)) : Mediante la función ASSOC obtenemos la sublista cuyo código es el número 8 y la almacenamos en la variable listacapa.

- Mostramos la información en la línea de comandos utilizando la función PRINC.

Función CDR: Obtener el segundo elemento de una sublista

76 lecturas

La función CDR  nos permite obtener el segundo elemento de una sublista, este segundo elemento constituye el valor o propiedad del código especificado. Si se trata de otro tipo

de lista que contiene más de 2 elementos, los obtiene todos menos el primero.

Ejemplo de la función CDR :

1. (defun c:Sen2()

2. (setq sel (entsel "\nSeleccione una entidad: "))

3. (setq noment (car sel))

4. (setq ent (entget noment))

5. (setq listacapa (assoc 8 ent))

6. (setq nombrecapa (CDR listacapa))

7. (setq msg (strcat "\nEl valor de la sublista (8) especificada es: " nombrecapa))

8. (princ msg)

9. (princ)

10. )

Devuelve el nombre de la capa de la entidad seleccionada.

Explicación:

- La explicación de la función anterior aplica para la función CDR .

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 36/49

- (setq nombrecapa (CDR listacapa)) : En esta línea de código la función CDR  nos permite obtener todos los elementos de la sublista especificada menos el primero, como la

lista especificada sólo tiene dos elementos, obtiene el segundo elemento de la sublista y los almacena en la variable nombrecapa.

- Creamos una variable denominada msg, que contendrá un mensaje informando en nombre de la capa obtenido.

Función CONS: Construir una nueva lista o sublista

77 lecturas

Esta función construye una nueva sublista con los elementos indicados, una característica de esta nueva lista es que es construida de manera especial por dos elementos separados

 por un punto, que hace que ocupe menos memoria.

Ejemplo de la función ASSOC:

1. (defun c:co()

2. (setq pa (CONS 8 0))

3. (Princ pa)

4. (princ)

5. )

Explicación:

- (setq pa (CONS 8 0)) : Aquí mediante la función CONS se construye un sublista y se almacena en la variable pa.

- Con la función PRINC mostramos la lista creada.

Función SUBST: Sustituir elemento de una lista

82 lecturas

La función SUBST reemplaza una sublista especificada por otra construida generalmente con la función CONS, función SUBST necesita tres argumentos que son los siguientes: E

 primer elemento es la nueva sublista, el segundo argumento es la sublista actual o existente a reemplazar que se accede mediante la función ASSOC y el tercer argumento es la lista

total de la entidad a modificar, el valor devuelto es la nueva lista actualizada.

Aquí hay que aclarar que sólo se actualiza la lista de la entidad seleccionada, pero los cambios no se visualizan en pantalla, debido a que para que esto suceda es necesario

usar la función ENTMOD.

Ejemplo de la función SUBST:

1. (defun c:rt()

2. (setq textobase (entsel "\nSeleccione el texto origen:"))

3.

4. (if (not (null textobase))

5. (progn

6. (setq nombretexto (car textobase))

7. (setq basedatosnombretexto (entget nombretexto))8. (setq valortextobase (cdr (assoc 1 basedatosnombretexto)))

9.

10. (setq textoareemplazar (entsel "\nSeleccione el texto a reemplazar: "))

11. (setq nombretextoareemplazar (car textoareemplazar))

12. (setq basedatosnombretextoreemplazar (entget nombretextoareemplazar))

13.

14. (setq listNueva (SUBST (cons 1 valortextobase)(assoc 1 basedatosnombretextoreemplazar) basedatosnombretex

15. )

16. )

17. (princ)

18. )

Explicación:

- (setq textobase (entsel "\nSeleccione el texto origen:")) : En esta línea de código solicitamos al usuario mediante la función ENTSEL seleccione el texto desde el cual se

obtendrá el contenido del texto de origen, es decir el contenido de texto que suplantará al segundo texto seleccionado. Esta entidad (texto) se almacenará en la variable textobase.

- (if (not (null ent)) : Aquí mediante la función IF, verificamos que efectivamente el usuario haya seleccionado un texto, es decir que la variable textobase no este null, si es asíentonces se ejecutan todas las acciones encerradas en PROGN.

- (setq nombretexto (car textobase)) : Aquí mediante la función CAR  obtenemos el nombre del objeto texto seleccionado anteriormente y lo almacenamos en la variable

nombretexto.

- (setq basedatosnombretexto (entget nombretexto)) : Con la función ENTGET obtenemos la base de datos de la entidad indicada en la variable nombretexto y la

almacenamos en la variable basedatosnombretexto.

- (setq valortextobase (cdr (assoc 1 basedatosnombretexto))) : Aquí mediante la función CDR  obtenemos el valor de la sublista que empieza con el código 1 (sublista

obtenida con la función ASSOC), este código tiene como propiedad el contenido del texto seleccionado. El contenido del texto se almacena en la variable valortextobase.

- (setq textoareemplazar (entsel "\nSeleccione el texto a reemplazar: ")) : Indicamos al usuario que seleccione el segundo texto y almacenamos el valor de la selección en la

variable textoareemplazar .

- (setq nombretextoareemplazar (car textoareemplazar)) : Con la función CAR  obtenemos el nombre de la segunda entidad seleccionada (texto a reemplazar) y lo

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 37/49

almacenamos en la variable nombretextoareemplazar .

- (setq basedatosnombretextoreemplazar (entget nombretextoareemplazar)) : Con la función ENTGET obtenemos la base de datos del segundo texto seleccionado,

indicado en la variable nombretextoareemplazar  y la almacenamos en la variable basedatosnombretextoreemplazar .

- (setq listNueva (SUBST (cons 1 vtextactual)(assoc 1 basedatosnombretextoreemplazar) basedatosnombretextoreemplazar)) : Aquí mediante la función SUBST

reemplazamos una sublista con otra, la primera sublista (cons 1 vtextactual), es una sublista creada con el valor del contenido del primer texto que hemos seleccionado, la segunda

sublista (assoc 1 basedatosnombretextoreemplazar), es la sublista del segundo texto seleccionado obtenida con la función ASSOC, el tercer argumento de la función SUBST es la

 base de datos a reemplazar, es decir la base de datos del segundo texto seleccionado. La nueva lista reemplazada se almacena en la variable listNueva.

Hasta aquí se modificó la estructura de la base de datos del segundo texto, pero el texto no se actualiza debido a que es necesario el uso de la función ENTMOD para ello,

función que veremos a continuación.

Función ENTMOD: Actualizar una lista en pantalla

Deja tu comentario

246 lecturas

Esta función actualiza en pantalla una entidad después de haber sido objeto de una sustitución de listas mediante la función SUBST. EL único argumento necesario para esta

función es indicar cuál es la lista a modificar. Para graficar mejor esta función tomaremos el ejemplo de la función SUBST y lo completaremos con esta función.

Ejemplo 1 de la función ENTMOD:

1. (defun c:rte()

2. (setq textobase (entsel "\nSeleccione el texto origen:"))

3.

4. (if (not (null textobase))

5. (progn

6. (setq nombretexto (car textobase))

7. (setq basedatosnombretexto (entget nombretexto))

8. (setq valortextobase (cdr (assoc 1 basedatosnombretexto)))

9.

10. (setq textoareemplazar (entsel "\nSeleccione el texto a reemplazar: "))

11. (setq nombretextoareemplazar (car textoareemplazar))

12. (setq basedatosnombretextoreemplazar (entget nombretextoareemplazar))

13.

14. (setq listNueva (subst (cons 1 valortextobase)(assoc 1 basedatosnombretextoreemplazar) basedatosnombretex

15. (ENTMOD listNueva)

16. )

17. )

18. (princ)

19. )

Esta rutina obtiene el valor de un texto seleccionado y "lo copia" en otro texto seleccionado posteriormente reemplazándolo.

Explicación:

- La explicación de la función anterior aplica para esta función.

- (ENTMOD listNueva) : Aquí mediante la función ENTMOD actualizamos en pantalla el cambio que hicimos a la lista del segundo texto seleccionado, el resultado será que el

contenido del primer texto se copiará en el contenido del segundo texto seleccionado.

 

Ejemplo 2 de la función ENTMOD:

1. (defun c:mod()

2. (setq nuevaalturatexto (getreal "\nIngrese la nueva altura para el texto seleccionado: "))

3. (if (not (null nuevaalturatexto))

4. (progn

5. (setq ent (entsel "Seleccione el texto a cambiar la altura: "))

6. (setq ent (entget (car ent)))

7. (setq nent (subst (cons 40 nuevaalturatexto)(ASSOC 40 ent)ent))

8. (ENTMOD nent)

9. )

10. )11. (princ)

12. )

El ejemplo anterior cambia la altura actual del texto por la altura indicada.

Explicación:

- (setq nuevaalturatexto (getreal "\nIngrese la nueva altura para el texto seleccionado: ")) : Aquí solicitamos al usuario que ingrese un valor que reemplazará a la altura

del texto que se seleccionará después. Este valor se almacenará en la variable nuevaalturatexto.

- (if (not (null nuevaalturatexto)) : Si se ingresó un valor y la variable nuevaalturatexto no es nula, entonces se ejecutan las acciones delimitadas por PROGN.

- (setq ent (entsel "Seleccione el texto a cambiar la altura: ")) : Aquí la función ENTSEL solicita al usuario que designe un texto, los datos del objeto seleccionado se

almacenará en la variable ent.

- (setq ent (entget (car ent))) : Aquí mediante la función ENTGET obtenemos la base de datos de la entidad y la almacenamos nuevamente en la variable ent actualizando su

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 38/49

valor.

- (setq nent (subst (cons 40 nuevaalturatexto)(ASSOC 40 ent)ent)) : Con la función SUBST actualizamos la sublista del segundo texto seleccionado que corresponde a la

altura del texto (código 40), esta nueva lista de la entidad la almacenamos en la variable nent.

- (ENTMOD nent) : Con ENTMOD actualizamos la lista (estructura) del segundo texto seleccionado y se puede apreciar el cambio de altura.

Función NTH: Obtener elemento enésimo de una lista

111 lecturas

 NTH examina el número indicado que lo considera como una posición en la lista y devuelve el elemento que encuentra en dicha posición. El primer elemento lo considera como el

elemento 0, es decir el quinto elemento lo considera en la posición nº4. Si el número especificado es mayor que el número de elementos devuelve nil.

Ejemplo de la función NTH:

1. (defun c:nt()

2. (setq ent (entsel "Seleccione una entidad: "))

3. (setq ent (entget (car ent)))

4. (setq ne (NTH 1 ent))

5. (princ "\nEl elemento indicado es:\n")

6. (princ ne)

7. (princ) 

8. )

Explicación:

- (setq ne (NTH 1 ent)) : Aquí con la función NTH obtenemos el segundo elemento de la lista de la base de datos de la entidad seleccionada y lo almacenamos en la variable ne.

- Luego con la función PRINC mostramos en pantalla cuál es ese segundo elemento.

 

Conclusión de este capítulo:

Estimado usuario las funciones que acabamos de ver son las funciones de manipulación de base de datos que se utilizan con más frecuencia, escribe cada ejemplo en un archivo de

texto plano y guárdalo con el nombre de funcionesmapbasedatos.lsp y cargarlo en AutoCAD, prueba cada uno de ellos y observa los resultados.

Prueba modificando los códigos de referencia de las sublistas a la base de datos de los ejemplos así podrás conocer mejor cada uno de ellos, más adelante podrás ver ejemplos

mucho más complejos del uso de estas funciones, por ahora preocúpate en saber que lo que has aprendido aquí te va a ayudar mucho en tu desarrollo de programación con

AutoLISP.

Funciones de Selección de Objetos Múltiples

203 lecturas

En un anterior capítulo habíamos aprendido cuales eran las funciones que nos permitían seleccionar elementos gráficos, esas funciones nos permitieron conocer que la mayoría de

las rutinas Lisp dependen considerablemente de la selección y manipulación de las entidades de AutoCAD, en esta oportunidad conoceremos cuales son las funciones que te

 permitirán seleccionar varios objetos al mismo tiempo.

Una principal característica de estas funciones es no siempre solicitarán al usuario la designación de las entidades, porque estas funciones podrán seleccionar automáticamente

objetos con tan sólo especificar algunas características o valores de las base de datos de las entidades, es por esa razón que las estamos viendo después de las funciones que nos

 permitían operar con base de datos.

Aprenderemos como seleccionar objetos mediante filtros y especificaciones particulares, todas estas funciones en combinación con todas las demás antes vistas nos permitirán

crear rutinas muy potentes y sencillas, como te repito lo único que debes de tener es la idea clara de que es lo que desearías que haga tu rutina.

A continuación te muestro cuales son estas funciones.

Función SSGET: Seleccionar un conjunto de entidades

Deja tu comentario

316 lecturas

Esta función es una de las principales de selección de entidades, solicita la designación de un conjunto de entidades y almacena cada uno de ellos en una matriz de elementos. Si no

se especifica un modo se solicita al usuario una designación completa.

Ejemplo 1 de la función SSGET:

1. (defun c:ss()

2. (setvar "cmdecho" 0)

3. (setq ents (SSGET))

4. (if (not (null ents))

5. (progn

6. (command "change" ents "" "p" "c" "5" "")

7. (Alert "Se cambió el color de los objetos por azul.")

8. )

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 39/49

9. (Alert "No se seleccionó entidades.")

10. )

11. (setvar "cmdecho" 1)

12. (princ)

13. )

Esta rutina cambia el color de los objetos seleccionados a "5" azul.

Explicación:

- (setvar "cmdecho" 0) : Como vamos a usar la función COMMAND para invocar a un comando de AutoCAD, establecemos la visualización de los ecos de los comandos a 0

- (setq ents (SSGET)) : Aquí mediante la función SSGET solicitamos al usuario la designación de un conjunto de entidades.

- (if (not (null ents)) : Si el usuario realizó la selección de entidades entonces se ejecuta todo lo que está incluido dentro de la función PROGN.

- (setvar "cmdecho" 1) : Devolvemos la normal visualización de los mensajes de los comandos.

 

Con esta función también se puede crear un filtro de elementos mediante el modo "X", este modo evalúa una condición dada y selecciona las entidades que cumplan con esa

condición.

Ejemplo 2 de la función SSGET:

1. (defun c:ssx()

2. (if (setq ents (SSGET "X" (list(cons 0 "CIRCLE"))))

3. (command "change" ents "" "p" "c" "3" "")

4. )

5. (if (setq ents (SSGET "X" (list(cons 0 "TEXT")(cons 62 1))))

6. (command "change" ents "" "p" "c" "4" "")

7. )

8. (princ)

9. )

Explicación:

- (if (setq ents (SSGET "X" (list(cons 0 "CIRCLE")))) : Aquí mediante la función SSGET buscamos entidades cuyo tipo (código 0 de la base de datos) sea "CIRCLE ", es

decir seleccionará todos los círculos del dibujo. Esta selección se almacena en la variable ents.

- (command "change" ents "" "p" "c" "3" "") : Si existen este tipo de entidades se le cambia el color a "3" (verde).

- (if (setq ents (SSGET "X" (list(cons 0 "TEXT")(cons 62 1))))  : Aquí la función SSGET busca todos los objetos del tipo texto pero que además tengan el color "1" (rojo),

esta selección se almacena en la variable ents, si encuentra los objetos almacena todo el conjunto de lo contrario ents tomará el valor de nil.

- (command "change" ents "" "p" "c" "4" "") : Aquí la función COMMAND cambia el color de las entidades seleccionadas a "4" (cyan).

 

Con la función SSGET también se puede crear un filtro con operadores.

Ejemplo 3 de la función SSGET:

1. (defun c:ssx3()

2. (if (setq ents (SSGET "X" (list (cons 0 "TEXT") (cons -4 "<=") (cons 40 5))))

3. (command "change" ents "" "p" "c" "6" "")

4. )

5. (princ)

6. )

Explicación:

- (SSGET "X" (list (cons 0 "TEXT") (cons -4 "<=") (cons 40 5)))  : Aquí la función SSGET busca entidades del tipo texto (cons 0 "TEXT"), que tengan una altura (cons -4 "

<="), menor o igual a 5 (cons 40 5). Para indicar el operador se utiliza el código "-4".

- (command "change" ents "" "p" "c" "6" "") : Si existen entidades seleccionadas con ese criterio entonces se les cambia el color a "6" (magenta).

Función SSNAME: Nombre de entidad en conjunto de selección

80 lecturas

Esta función devuelve el nombre de una entidad en particular de un conjunto de selección especificado, para referirse a la entidad se debe de ingresar un número que será tomando

como un índice. Este índice empieza desde 0, es decir que para referirse a la 5ta entidad seleccionada se debe ingresar el índice 4.

Ejemplo de la función SSNAME:

1. (defun c:ba()

2.

3. (setq altura (getreal "\nIngrese la nueva altura que tendrán los textos: "))

4.

5. (if (not (null altura))

6. (progn

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 40/49

7.

8. ; Opciones permitidas para GETKWORD

9. (initget "Seleccionar Todos")

10.

11. ; La línea de código a continuación solicita al usuario que elija entre

12. ; seleccionar los textos a cambiar o indicar que sean todos los textos los

13. ; que se modificarán, por defecto (presionando ENTER) se modificarán todos

14. (setq opcion (getkword "Textos a cambiar la altura [Seleccionar o Todos]<Todos>:"))

15.

16. ; Verificamos el valor de la variable opción y ejecutamos las acciones de acuerdo

17. ; a ese valor "t" significa que se ha presionado ENTER.

18. (cond

19. ((= opcion "Seleccionar")

20. (setq ents (ssget))

21. )

22. ((= opcion "Todos")23. (setq ents (ssget "X" (list(cons 0 "TEXT"))))

24. )

25. (t

26. (setq ents (ssget "X" (list(cons 0 "TEXT"))))

27. )

28. )

29.

30. ; Si variable ents contiene un valor entonces...

31. (if (not (null ents))

32. (progn

33. ; Se establece el índice a 0, es decir se cambiará desde la primera

34. ; entidad seleccionada

35. (setq n 0)

36.

37. ; Se ejecutan las acciones mientras la variable ent sea diferente de nil

38. ; o mientras hayas entidades dentro del conjunto de selección

39. (while

40. (setq ent (SSNAME ents n))

41. (setq baseent (entget ent))42. (setq nent (subst (cons 40 altura )(assoc 40 baseent) baseent))

43. (entmod nent)

44. (setq n(+ n 1))

45. )

46. (alert (strcat "\nSe actualizaron " (itoa n) " textos."))

47. ); Cierre del 2do progn

48. ) ; Cierre del 2do if

49.

50. ) ; Cierre del 1er progn

51. ) ; Cierre del 1er if

52.

53. (princ)

54. )

Esta rutina cambia la altura de los textos indicados.

Explicación:

- (setq ent (SSNAME ents n)) : Aquí mediante la función SSNAME obtenemos el nombre de la entidad del conjunto cuyo índice es el valor establecido en la variable n, es

decir, se obtendrá el nombre de la n entidad + 1, por defecto hemos establecido que el valor de este índice empiece desde el valor 0 (primera entidad).

- (setq ent (entget ent)) : Aquí obtenemos la base de datos de la entidad indicada en ent y la almacenamos en la variable baseent.

- (setq nent (subst (cons 40 altura )(assoc 40 baseent) baseent))  : Aquí reemplazamos el valor del código 40 (altura) de la base de datos por el valor ingresado por el usuario

y guardamos la nueva base de datos actualizada en la variable nent.

- (entmod nent) : Actualizamos la entidad (texto).

- (setq n(+ n 1)) : Incrementamos en 1 el valor del índice, para que cuando inicie nuevamente el bucle inicie con la siguiente entidad del conjunto de selección.

Función SSADD: Añadir una entidad a un conjunto

73 lecturas

Esta función adiciona una entidad especificada a un conjunto de selección existente.

Ejemplo de la función SSADD:

1. (defun c:ad()

2. (if (setq ents (SSGET "X" (list(cons 0 "CIRCLE"))))

3. (progn

4. (setvar "cmdecho" 0)

5. (command "line" "0,0" "400,400" "")

6. (setq ents2 (SSADD (entlast) ents))

7. (command "change" ents2 "" "p" "c" "3" "")

8. (setvar "cmdecho" 1)

9. )

10. )

11. (princ)

12. )

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 41/49

Explicación:

- Con SSGET "X", se seleccionó automáticamente todos los círculos del dibujo y se almacenaron en la variable ents.

- (command "line" "0,0" "400,400" "") : Con la función COMMAND dibujamos una línea en las coordenadas indicadas.

- (setq ents2 (SSADD (entlast) ents)) : Agregamos esa última línea dibujada a la selección de entidades existente (variable ents) y almacenamos el nuevo conjunto de selección

en la variable ents2.

- (command "change" ents2 "" "p" "c" "3" "") : Cambiamos el color de todas las entidades especificadas en el conjunto de selección ents2.

Función SSDEL: Quitar de la selección una entidad

70 lecturas

Esta función remueve una entidad indicada de la selección, para eso se debe indicar el nombre. Si la entidad no existe devuelve nil.

Ejemplo de la función SSDEL:

1. (defun c:rm()

2. (if (setq ents (ssget "X" (list(cons 0 "CIRCLE"))))

3. (progn

4. (setvar "cmdecho" 0)

5. (setq ents2 (SSDEL (entlast) ents))

6. (command "change" ents2 "" "p" "c" "5" "")

7. (setvar "cmdecho" 1)

8. )

9. )

10. (princ)

11. )

Explicación:

- (setq ents (ssget "X" (list(cons 0 "CIRCLE")))) : Aquí la función SSGET, selecciona todas las entidades del tipo CIRCLE  y almacena el conjunto de selección en la

variable ents.

- (setq ent (SSDEL (entlast) ents)) : Aquí la función SSDEL selecciona la última entidad creada, no necesariamente es un circulo, pero si se dibujó una serie de círculos,

SSDEL selecciona el ultimo y lo remueve del conjunto de selección actual (ents). Es nuevo conjunto de selección se almacena en la variable ents2.

- (command "change" ents2 "" "p" "c" "5" "") : Cambiamos el color de todas las entidades especificadas en el conjunto de selección ents2.

 

Conclusión de este capítulo:

Estimado usuario como habrás observado todas estas funciones te permiten controlar la selección múltiple de entidades, estas funciones trabaja de una manera muy eficiente con

las funciones de base de datos, por lo que la hace tan versátil como códigos tenga la base de datos de las entidades seleccionadas.

Por lo tanto es importante recordar y practicar bien todas las funciones vistas hasta este capítulo, de esa manera será más fácil comprender cada nueva función que vamos

aprendiendo en el camino.

Como siempre, debemos de escribir todas estas funciones en un archivo de texto plano o en Crimson Editor, guardar el archivo con el nombre de seleccionmultiple.lsp y

cargarlo en AutoCAD, de salir algún error debes de revisar que las rutinas estén correctamente escritas, debes de revisar línea por línea del código para cerciorarte de su estado o

revisar cual es el mensaje de error que indica AutoCAD.

Funciones de Acceso a Archivos Externos

107 lecturas

Las funciones que veremos a continuación nos habilitan la posibilidad de realizar operaciones con archivos externos como por ejemplo, hojas de cálculo, archivos de texto u otro

tipo de archivo en el que se pueda escribir o leer datos.

Usamos estas funciones por ejemplo, para leer un archivo de coordenadas e importar los datos en el área de dibujo de AutoCAD o quizá exportar a un archivo el número de

veces que se encuentra insertado un bloque o bloques para hacer un inventario del dibujo.

Son muchos los motivos por los cuales se necesita acceder a un archivo y eso depende de la necesidad de cada usuario, tal igual como en las funciones que hemos visto hasta el

momento.

A continuación te muestro cuales son las funciones más importantes para acceder a archivos.

Función OPEN: Abrir un archivo

92 lecturas

La función OPEN abre un archivo para leer o escribir datos. Se le debe de indicar a OPEN la ruta completa en caso de que el archivo no esté en un directorio de trabajo de

AutoCAD, el nombre del archivo y la extensión del mismo y luego un modo que indicará una manera de abrirlo.

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 42/49

Estos modos s on:

"r" Abre el archivo especificado como solo lectura. Si el archivo no existe devuelve nil.

"w" Abre el archivo especificado para escritura. Si el archivo no existe la función OPEN primero lo crea.

"a" Abre el archivo y se sitúa en el final para ir añadiendo datos. Si el archivo no existe se crea.

 

Ejemplo de la función OPEN:

1. (defun c:ar()

2. (setq ar (OPEN "c:\\temp\\construcgeek.xls" "w"))

3. (princ)

4. )

Explicación:

- (setq ar(OPEN "c:\\temp\\construcgeek.xls" "w")) : Usamos la función OPEN para hacer conexión con el archivo indicado, este archivo abierto es almacenado en la

variable ar . Aquí hemos indicado que el archivo ha sido abierto para escritura y si el archivo no existe primero lo crea antes de abrirlo.

Función CLOSE: Cerrar un archivo

76 lecturas

La función CLOSE cierra un archivo abierto por la instrucción OPEN, es necesario cerrar un archivo abierto para que se actualice (guarde) los cambios generados (escritura).

Ejemplo de la función CLOSE:

1. (defun c:ac()

2. (setq ar (open "c:\\temp\\construcgeek.xls" "w"))3. (CLOSE ar)

4. (princ)

5. )

Explicación:

- (CLOSE ar) : Cierra el archivo abierto por la función OPEN y almacenado en la variable ar .

Función FINDFILE: Buscar un archivo

77 lecturas

Esta función busca un archivo especificado, en las rutas de los archivos de soporte de AutoCAD, especificados en el cuadro de diálogo Options. Si no lo encuentra devuelve nil,

de lo contrario devuelve la ruta completa de ese archivo.

Si se desea averiguar si existe o no un archivo en una ruta especificada basta con ingresar FINDFILE seguido de la ruta de acceso.

Ejemplo de la función FINDFILE:

1. (defun c:fn()

2. (setq bs (FINDFILE "construcgeek.xls"))

3. (princ bs)

4. (princ)

5. )

Explicación:

- (setq bs (FINDFILE "construcgeek.xls")) : Aquí la función FINDFILE busca el archivo llamado construcgeek.xls, en las rutas de soporte especificadas en el cuadro de

diálogo Opciones  de AutoCAD, para que busque en otras rutas, se deberán de especificar éstas en el cuadro de diálogo mencionado.

Función GETFILED: Cuadros de diálogo para gestión de archivos

89 lecturas

Carga un cuadro de diálogo del entorno Windows para recuperar el valor de una ruta señalada. Seguido del nombre de la función GETFILED se debe especificar el título del

cuadro de diálogo, el nombre de archivo por defecto, luego la extensión por defecto de los archivos a buscar y por último el modo correspondiente.

Estos modos s on:

"1" Cuadro de diálogo para guardar un archivo. El archivo ingresado deberá ser nuevo. Si ya existe, se mostrará un mensaje de advertencia y en caso de aceptar el archivo

se sobrescribirá.

"4" Permite abrir un archivo con extensión diferente a la especificada como por defecto.

"8" Abre un archivo y se le indica un archivo con otra extensión a la especificada en por defecto no lo acepta.

 

Ejemplo de la función GETFILED:

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 43/49

1. (defun c:gf()

2. (if (null archivodefecto)

3. (setq archivodefecto "construcgeek")

4. )

5.

6. (setq archivoobtenido (GETFILED "Capturar ruta"  archivodefecto "xls" 8))

7.

8. (if (not (null archivoobtenido))

9. (setq archivodefecto archivoobtenido)

10. )

11.

12. (princ archivoobtenido)

13. (princ)

14. )

Explicación:

- (if (null archivodefecto) : Aquí indicamos que si la variable archivodefecto es nula o no existe entonces la creamos con el valor "construcgeek", la razón es que deseamos

especificar el nombre de un archivo por defecto al cuadro de diálogo.

- (se tq archivoobtenido (GETFILED "Capturar ruta" archivodefecto "xls" 8)) : Aquí usamos la función GETFILED para mostrar un cuadro de diálogo de apertura de un

archivo (modo 8), indicamos un título para el cuadro de diálogo ("Capturar ruta"), luego indicamos un archivo por defecto a mostrar, seguida la extensión que deberá de tener el

archivo a abrir ("XLS") y por último el modo de apertura.

La ruta del archivo elegido se almacena en la variable archivoobtenido, si no se selecciona algún archivo o se presiona el botón Cancelar entonces GETFILED devuelve nil, de lo

contrario devuelve toda la ruta y la almacenamos en la variable archivoobtenido.

- (if (not (null archivoobtenido))(setq archivodefecto archivoobtenido)) : Aquí actualizamos el valor de la variable archivodefecto siempre y cuando el valor resultante de la

variable archivoobtenido sea diferente de nil (se canceló el cuadro de diálogo).

- (princ archivoobtenido) : Mostramos la ruta del archivo obtenido.

Función WRITE-LINE: Escribir una línea de texto

86 lecturas

Esta función escribe una nueva línea en el archivo especificado. Se debe de tener cuidado en utilizar esta función porque de existir datos en el archivo especificado estos son

reemplazados por los nuevos, para evitar esa acción se debe de especificar el modo "a" a la función OPEN en lugar de "w".

Ejemplo de la función WRITE-LINE:

1. (defun c:wl()

2. (if (null archivodefectowl)

3. (setq archivodefectowl "construcgeek")

4. )

5.

6. (setq archivoobtenido (GETFILED "Abrir y escribir datos"  archivodefectowl "txt" 8))

7.8. (if (not (null archivoobtenido))

9. (progn

10. (setq archivodefectowl archivoobtenido)

11. (setq ar (open archivoobtenido "a"))

12. (WRITE-LINE "\nCurso de AutoLisp" ar)

13. (WRITE-LINE "para principiantes" ar)

14. (WRITE-LINE "y usuarios en general" ar)

15. (close ar)

16. )

17. )

18.

19. (princ)

20. )

Explicación:

- (if (null archivodefectowl)(setq archivodefectowl "construcgeek")) : Aquí si la variable archivodefectowl de la ruta por defecto no existe, la creamos con el valor 

"construcgeek".

- (se tq archivoobtenido (GETFILED "Abrir y escribir datos" archivodefectowl "txt" 8)) : Aquí mediante la función GETFILED solicitamos al usuario que indique la ruta

del archivo a abrir, esta ruta se almacena en la variable archivoobtenido.

- (if (not (null archivoobtenido)) : Si el usuario especificó una ruta de archivo, entonces se ejecutan todas las acciones encerradas en PROGN.

- (setq archivodefectowl archivoobtenido) : Actualizamos la variable de la ruta del archivo por defecto con la nueva ruta del archivo obtenida, de tal manera que la próxima vez

que ejecutemos la rutina, GETFILED mostrará la ruta del ultimo archivo seleccionado.

- (setq ar(open archivoobtenido "a")) : Abrimos el archivo especificado en la variable archivoobtenido, la apertura mediante el modo "a" permitirá situarnos en el último

caracter del archivo (si lo hubiera). El archivo abierto se almacenará en el variable ar .

- (WRITE-LINE "\nCurso de AutoLisp" ar) : Mediante la función WRITE-LINE comenzamos a escribir caracteres en el archivo "\n" es para establecer una nueva línea en

caso de que el archivo ya tenga un contenido, seguimos usando WRITE-LINE, por cada línea nueva que deseamos escribir.

- (close ar) : Cerramos el archivo para que se graben los cambios.

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 44/49

Función READ-LINE: Leer una línea de texto de archivo

120 lecturas

Esta función al contrario de las anteriores permite leer una línea de texto desde un archivo y devuelve el valor obtenido. Si se sigue llamando a READ-LINE, continúa leyendo las

líneas siguientes.

Ejemplo de la función READ-LINE:

1. (defun c:el()

2. (if (null archivodefecto)

3. (setq archivodefecto "construcgeek")

4. )5.

6. (setq archivoobtenido (getfiled "Abrir y leer datos" archivodefecto "txt" 8))

7.

8. (if (not (null archivoobtenido))

9. (progn

10. (setq archivodefecto archivoobtenido)

11. (setq ar (open archivoobtenido "r"))

12. (while

13. (setq ln (READ-LINE ar))

14. (princ ln)

15. (terpri)

16. )

17. (close ar)

18. )

19. (Alert "Se canceló la selección del archivo.")

20. )

21.

22. (princ)

23. )

Explicación:

- (setq ln (READ-LINE ar)) : Aquí mediante la función READ-LINE leemos línea por línea el contenido del archivo indicado, cada valor lo almacenamos en la variable ln y

luego la mostramos con la función PRINC.

Esta acción se repetirá mientras (while) la variable ln sea diferente de nil, es decir, mientras haya una línea que leer.

 

Conclusión de este capítulo:

Estimado usuario, mediante todas estas funciones que hemos visto en este capítulo podrás tener acceso a archivos externos para poder intercambiar los datos que creas

necesarios, sólo bastará que tengas la necesidad y tendrás la solución para ello.

Debes de escribir estas funciones en un archivo de texto y guardarlo con el nombre de archivos.lsp, practica cambiando algunos de los valores de los ejemplos para que observe

cuales son los resultados de hacerlo.

Creación de Nuevos Comandos y Explicación del Código

322 lecturas

Después de haber estudiado las funciones más importantes de AutoLISP y de haber realizado todos los ejemplos, nos encontramos ahora en capacidad de poder "discernir"

muchos de los nuevos comandos y rutinas que se han compartido en ConstrucGeek, existen otras rutinas que aún no podemos analizar debido a que en ellas hay funciones de

VisualLISP y funciones exclusivas de las utilidades Express.

A pesar de ello con todo lo aprendido es suficiente para que tú mismo puedas crear tus propias rutinas cada vez que lo necesites, sólo recuerda que primero debes de tener bien

en claro, cuál es tu necesidad, es decir, ¿qué deseas que haga tu comando o el trabajo que deseas abreviar, una vez que lo tengas en claro, deberás de hacer tu borrador con

todos los datos que necesitas recopilar para que tu rutina pueda ayudarte a hacer el trabajo por ti.

Para reconocer que función es la que necesitas es necesario reconocer que dato deseas conseguir, por ejemplo si deseas hallar un área de una figura irregular para insertarla en

 pantalla, primero debes de saber cuál es el área hallar y para ello una de los métodos es indicar un punto en pantalla.

Para obtener un punto en pantalla ya sabemos que la función GETPOINT nos lo permite hacer, ese mismo punto nos puede servir para crear un contorno y para el crear el

contorno ya sabemos que lo podemos hacer en AutoCAD con el comando BOUNDARY, en AutoLISP invocamos a ese comando con la función COMMAND y así

sucesivamente. En AutoLISP preguntándote que necesitas y te respondes con las funciones AutoLISP que sean necesarias.

Para reforzar aún más lo que hemos aprendido a continuación veremos algunos ejemplos, los cuales tal y como te comente en las primeras líneas, son rutinas compartidas aquí,

 pero la diferencia que este curso esta cada línea debidamente comentada, es decir sabrás paso a paso lo que hace cada rutina.

Como todas las secciones en este curso, tienes la oportunidad de realizar todas las preguntas relacionadas con el tema de tal manera que quede bien claro cada paso que se dan

en los ejemplos, no dudes en preguntar y practicar lo más que puedas.

A continuación los ejemplos completos:

Rutina explicación 1

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 45/49

201 lecturas

Rutina que cambia la altura de texto de acuerdo a un porcentaje ingresado.

Ver post de orígen aquí:

1. ; Comentarios acerca de la autoría de la rutina.

2. ; Todos los comentarios deben de estar predecedidos por el punto y coma (;)

3. ; para ser reconocidos como tal.

4.

5. ; Desarrollado por Mario Torres Pejerrey

6. ; http://www.construcgeek.com/

7. ; ConstrucGeek 2011

8.

9. (defun c:CH()10.

11. ;El código siguiente se usa para evitar que en caso de que se cancele la ejecución

12. ;de la rutina, apararezca el mensaje “; error: Function cancelled”

13. (setq old_err *error*)(defun *error* ( a / )(princ "")

14. (setq *error* old_err)(princ))

15.

16. ;Solicitamos que el usuario ingrese el valor de cual será el porcentaje a cambiar

17. ;de la altura del texto, por ejemplo si es un valor de 0.5 el texto se reducirá

18. ;a la mitad, si es un valor de 2, la altura del texto ó textos seleccionados se

19. ;incrementará al doble

20. (setq porcAlturaOrigen (getreal "\nIngrese el porcentaje a modificar del texto: "))

21.

22. ;Aquí mostramos un mensaje indicando el porqué que se solicita la

23. ;designación de los textos

24. (princ "\nSeleccione los textos a reemplazar")

25.

26. ;Posteriormente se invoca a la función SSGET y mediante un filtro se

27. ;seleccionarán todos los objetos del tipo texto. El código 0, indica la

28. ;referencia al TIPO de entidad en una base de datos29. (setq conj (ssget (list (0 . "TEXT"))))

30.

31. ;Creamos una variable con valor de 0. Usaremos esta variable para incrementar

32. ;el número de los objetos procesados (actualizados)

33. (setq n 0)

34.

35. ;Aquí usamos la función WHILE para ejecutar acciones mientras un condición

36. ;sea cierta

37. (while

38. ;Esta es la condición, mientras se encuentren entidades dentro del conjunto,

39. ;la entidad se almacena en la variable nt, de lo contrario el bucle termina

40. (setq nt (ssname conj n))

41.

42. ;Aquí obtenemos la altura actual del texto indicado (codigo 40) y

43. ;la almacenamos en la variable AlturaTexto

44. (setq AlturaTexto (cdr (assoc 40 (entget nt))))

45.

46. ;A esta altura obtenida le multiplicamos el porcentaje a modificar,

47. ;este valor fue solicitado al usuario al inicio de la rutina y el48. ;nuevo valor lo almacenamos en la variable nuevaAlturaTexto

49. (setq nuevaAlturaTexto (* porcAlturaOrigen AlturaTexto))

50.

51. ;Aquí reemplazaremos la altura actual del texto seleccionado, por la

52. ;nueva altura creada, para ello usamos las funciones CONS (para crear

53. ;una nueva sublista), ASSOC (para hacer referencia a una sublista actual)

54. ;y SUBST (para reemplazar una lista por otra en la base de datos)

55. ;y la nueva lista la almacenamos en la variable listNueva

56. (setq listNueva (subst (cons 40 nuevaAlturaTexto)(assoc 40 (entget nt))(entget nt)))

57.

58. ;Aquí con la función ENTMOD actualizamos en pantalla la lista (base de datos) del

59. ;texto seleccionado

60. (entmod listNueva)

61.

62. ;Incrementamos el contador en uno más, para realizar las mismas operaciones

63. ;con el siguiente texto.

64. (setq n (1+ n))

65.

66. )67.

68. ;Una vez finalizada la actualización de todos los textos del conjunto de

69. ;selección se muestra un mensaje indicando cuantos textos fueron procesados.

70. ;Para ello primero convertimos el valor entero de la variable "n" en un

71. ;valor de texto y luego la concatenamos con unos textos informativos

72. (princ (strcat "Se actualizaron " (itoa n) " textos"))

73.

74. (princ)

75.

76. )

77.

78. (SETVAR "modemacro" "http://www.construcgeek.com/")

 

Rutina explicación 2

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 46/49

156 lecturas

Adjunto Tamaño

  bloques.rar  54.93 KB

Rutina que inserta cotas en las curvas de nivel a partir de su elevación

Ver post de origen aquí.

1. ; Comentarios acerca de la autoría de la rutina.

2. ; Todos los comentarios deben de estar predecedidos por el punto y coma (;)

3. ; para ser reconocidos como tal.

4.5. ; Desarrollado Mario Torres Pejerrey

6. ; http://www.construcgeek.com/

7. ; ConstrucGeek 2011

8.

9. (defun c:cpe (/ P VAL scl)

10. ;Aquí usamos la función SETVAR para establecer el valor de variable "cmecho" a 0

11. ;para evitar que aparezcan los ecos de los comandos al usar la función "COMMAND"

12. (setvar "cmdecho" 0)

13.

14. ;Aquí usamos la función COMMAND para invocar al comando de AutoCAD WIPEOUT

15. ;y establecer que no se vean sus contornos en pantalla

16. (command "_wipeout" "_f" "_off")

17.

18. ;Si la variable escala no existe (null) entonces la creamos con el valor de 1

19. (if (null escala)(setq escala 1))

20.

21. ;Aquí solicitamos al usuario que ingrese la escala de la cota que se insertará

22. ;este valor ingresado se almacenará en la variable scl

23. (setq scl (getreal (strcat "\nIngrese la escala de la cota <" (rtos escala 2 3) ">: ")))24.

25. ;SI el usuario presionó la tecla ENTER (ningun valor se estableción e scl)

26. ;entonces la variable scl toma el valor de la variable escala

27. (if (null scl)(setq scl escala))

28.

29. ;Actualizamos el valor de la variable escala por el valor de scl

30. (setq escala scl)

31.

32. ;Aquí creamos la variable om con el valor de la variable de AutoCAD OSMODE

33. ;obtenida con GETVAR.

34. (setq om (getvar "osmode"))

35.

36. ;Le establecemos un nuevo valor de la variable de AutoCAD OSMODE

37. ;este valor equivale al modo NEAREST

38. (setvar "osmode" 512)

39.

40. ;Con la función WHILE repetimos las acciones mientras el usuario indique

41. ;un punto sobre una polilinea de contorno

42. (while43. (setq p (getpoint"\nSeleccione un punto en la linea de contorno: "))

44.

45. ;Aquí mediante la función CADR obtenemos el valor de la coordenada Y

46. ;del punto "p", con la función RTOS convertimos el valor real en un

47. ;valor de texto decimal con dos decimales, este nuevo valor lo

48. ;almacenamos en la variable val

49. (setq val (rtos (cadr p) 2 3))

50.

51. ;Aquí usamos la función WCMATCH para comparar el valor de la

52. ;vraible val, si el valor es parecido a .00, es decir es una

53. ;cota entera, entonces se inserta el bloque llamado

54. ;el_tag, de lo contrario se inserta el otro bloque

55. (if (wcmatch val "*.00*")

56. (progn

57. (setq val (rtos (cadr p) 2 0))

58. (command "_insert" "el_tag" p scl scl pause val)

59. )

60. (progn

61. (setq val (rtos (cadr p) 2 1))

62. (command "_insert" "el_tag2" p scl scl pause val)

63. )

64. )

65. )

66.

67. ;Aqui reestablecemos el valor de la variable OSMODO a su valor original

68. ;almacenado en la variable om, igual con la variable CMDECHO

69. (setvar "osmode" om)

70. (setvar "cmdecho" 1)

71. (princ)

72. )

73.

74.

75. (setvar "modemacro" "http://www.construcgeek.com/")

 

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 47/49

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 48/49

81. (close fh) 

82. ) 

83. ) 

84. )

85. )

86.

87. ;Si se procesaron entidades entonces se muestra un mensaje indicándolo

88. (if (> itm 0)

89. (setq msg (strcat "\nListo, se exportaron " (itoa itm) " puntos."))

90. (setq msg (strcat "\nNo se exportó punto alguno."))

91. )

92. (Alert msg)

93.

94. (princ) 

95. ) 

96.97. (setvar "modemacro" "http://www.construcgeek.com/")

98. (princ)

 

Rutina explicación 4

128 lecturas

Rutina que exporta los vértices de una polilinea a un archivo delimitado por comas (csv).

Ver post de origen aquí.

1. ; Comentarios acerca de la autoría de la rutina.

2. ; Todos los comentarios deben de estar predecedidos por el punto y coma (;)

3. ; para ser reconocidos como tal.4.

5. ; Desarrollado por Mario Torres Pejerrey

6. ; http://www.construcgeek.com/

7. ; ConstrucGeek 2011

8.

9.

10. (defun c:plexportxt ()

11.

12. ;De todas las entidades seleccionadas, filtramos sólo las del tipo

13. ;LWPOLYLINE con SSGET y almacenamos ese conjunto de selección en

14. ;la variable sset

15. (setq sset (ssget (list (cons 0 "LWPOLYLINE"))))

16.

17. ;Si existen entidades en ese conjunto de selección se ejecutan

18. ;las acciones despues del PROGN

19. (if sset

20. (progn

21. ;Si es que aún no se ha indicado ninguna ruta a un archivo

22. ;entonces se crear un nombre de archivo por defecto23. (if (null fn)(setq fn "construcgeek"))

24.

25. ;Aquí mediante la función GETFILED se solicita al usuario

26. ;que indique una ruta y un nombre del nuevo archivo que

27. ;almacenará las coordenadas exportadas

28. (setq fn (getfiled "Archivo a exportar las coordenadas" fn "csv" 1)) 

29.

30. ;Si se indicó la ruta y ésta es diferente de null

31. (if (/= fn nil) 

32. (progn

33.

34. ;Establecemos las variables contadores en 0

35. (setq itm 0)

36. (setq converticetotal 0)

37.

38. ;Mediante la función OPEN, abrimos el archivo de la ruta

39. ;indicada en modo escritura (w) y lo almacenamos en la

40. ;variable fh

41. (setq fh (open fn "w"))42.

43. ;Antes de escribir las coordenadas de las entidades

44. ;seleccionadas, escribimos un encabezado para las mismas

45. (write-line "PUNTO, NORTE, ESTE, COTA" fh) 

46.

47. ;Luego con la función WHILE ejecutamos una acción

48. ;mientras existan entidades en el conjunto de selección

49. (while

50. ;Aquí obtenemos el nombre del elemento "n" de la selección

51. ;el elemento será el indicado de acuerdo a la variable itm.

52. ;El nombre se almacena en la variable hnd

53. (setq hnd (ssname sset itm))

54.

55. ;Luego obtenemos la base de datos de la entidad

56. ;especificada en la variable hnd y esta base de

57. ;datos la almacenamos en al variable ent

58. (setq ent (entget hnd))

59.

8/9/2019 AutoLisp para Principiantes

http://slidepdf.com/reader/full/autolisp-para-principiantes 49/49

60. ;En el caso de que la base de datos no tenga una sublista con el

61. ;código 38, entonces se establece un valor de z 0.00

62. ;de lo contrario se obtiene ese valor de la sublista

63. (if (= (cdr (assoc 38 ent)) nil)

64. (setq elv 0.0)

65. (setq elv (cdr (assoc 38 ent)))

66. )

67.

68. ;Aquí reseteamos el contador de los vertices por cada entidad procesada

69. (setq contvertice 1)

70.

71. ;Con la función FOREACH creamos una variable que recorrerá todas las

72. ;sublistas que tengan el código 10

73. (foreach rec ent

74. (if (= (car rec) 10)

75. (progn76. ;Aquí se obtiene el valor del código 10 (coordenada)

77. (setq pnt (cdr rec))

78.

79. ;Escribimos en e archivo la coordenada dándole el formato

80. (write-line (strcat (itoa contvertice) "," (rtos (cadr pn

81. (rtos (car pnt) 2 8) "," (rtos elv 2 8)) fh)

82.

83. ;Incrementamos el contador del número de vértice actual

84. (setq contvertice (1+ contvertice))

85.

86. ;Incrementamos el contador del número de vértice total

87. (setq converticetotal (1+ converticetotal))

88. )

89. )

90. )

91.

92. ;Incrementamos el contador del número de entidad seleccionada

93. (setq itm (1+ itm)) 

94. )95.

96. ;Cerramos el archivo abierto

97. (close fh)

98. )

99. )

100. )

101. )

102.

103. ;Si se procesaron entidades entonces se muestra un mensaje indicándolo

104. (if (> itm 0)

105. (setq msg (strcat "\nListo, se exportaron " (itoa converticetotal) " vértices de " (itoa itm) " polilineas."))

106. (setq msg (strcat "\nNo se exportó punto alguno."))

107. )

108. (Alert msg)

109.

110. (princ)

111. )

112.

113. (princ "\nExportar vertices de Polilineas, escriba PLEXPORTXT para ejecutar el comando.") 114. (princ) 

115.

116. (setvar "modemacro" "http://www.construcgeek.com/")