Академический Документы
Профессиональный Документы
Культура Документы
ONCE.1. INTRODUCCIN
A parte de todo lo visto en cuestin de personalizacin, AutoCAD 14 ofrece al
usuario la posibilidad de crear programas y aplicaciones verticales totalmente
funcionales. Estos programas podrn ser distribuidos por el creador, eso s, siempre
corrern bajo AutoCAD.
La capacidad para hacer un programa nos lleva mucho ms all de la simple
personalizacin de mens o patrones de sombreado, nos lleva a un mundo
totalmente integrado en AutoCAD desde donde podremos disear nuestros propios
comandos, manipular dibujos o incluso acceder a la Base de Datos interna del
programa.
AutoCAD 14 proporciona diversas interfaces de programacin de aplicaciones que
vamos a comentar ahora de forma somera.
Los lenguajes evaluados AutoLISP estn a caballo entre unos y otros. No son
tan rpidos como los compilados pero son ms flexibles e interactivos que estos. Es
posible, por ejemplo, construir un programa con AutoLISP que sea capaz de
modificarse a s mismo bajo determinadas circunstancia; sta es la base de los
llamados Sistema Expertos.
El mecanismo evaluador de AutoLISP es la propia lista: conjunto de smbolos
separados entre s por, al menos, un espacio blanco y encerrados entre parntesis.
Esto es, desde el momento que existe una expresin encerrada entre parntesis,
AutoLISP la evala e intenta ofrecer un resultado.
AutoLISP es un subconjunto del lenguaje Common LISP. Como ha sido diseado
para trabajar desde AutoCAD, se han seleccionado las caractersticas de LISP ms
adecuadas para este fin y, adems, se han aadido otras nuevas, sobre todo en la
manipulacin de objetos de dibujo, acceso a la Base de Datos de AutoCAD e
interaccin grfica general.
Los programas en AutoLISP son simples archivos de texto ASCII, con la extensin
habitual .LSP. Una vez hecho el programa, habremos de cargarlo desde el propio
editor de dibujo de AutoCAD. Tambin es posible escribir lneas de cdigo AutoLISP
desde la lnea de comandos del programa, como veremos en breve.
Es posible la creacin de rdenes nuevas que llamen a programas en AutoLISP, as
como la redefinicin de comandos propios de AutoCAD, como por
ejemplo LINEA o DESPLAZA. Pero una de las ms importantes potencialidades de
AutoLISP es el acceso directo a la Base de Datos interna de AutoCAD. Toda la
informacin de un dibujo, como deberamos saber, no se guarda como objetos de
dibujo en s, o sea, cuando salvamos un .DWG, en disco no se guardan los crculos,
lneas, etctera, sino una relacin o base de datos donde se dice dnde aparece un
crculo o una lnea, con qu coordenadas de origen y final, con qu radio o
dimetro, tipo de lnea, color... Podremos pues desde AutoLISP acceder a dicha
base de datos para modificarla, editarla o para exportar datos, por ejemplo, a una
base de datos externa.
Lista ---------------------------------- Objeto compuesto de un parntesis de aper--------------------------------------- tura, uno o ms elementos separados por, al
--------------------------------------- menos, un espacio en blanco y un parntesis
--------------------------------------- de cierre. Los elementos de una lista pueden
--------------------------------------- ser smbolos, valores concretos (constantes
--------------------------------------- numricas o cadenas) o listas incluidas. Por
--------------------------------------- ejemplo: (DEFUN seno (x) (SETQ xr (* PI
(/x 180.0))) (SETQ
tipo n> donde n es un nmero que indica cuntos parntesis faltan por cerrar. Se
pueden introducir por teclado esos parntesis y subsanar el error. Por ejemplo:
Comando: (SETQ sx (SIN (* PI (/ x 180.0))
2> ))
0.523599
Tercera:
Tambin es posible evaluar directamente un smbolo (extraer por ejemplo el valor
actual contenido en una variable), introduciendo por teclado el signo de cerrar
admiracin seguido del nombre del smbolo. Esta evaluacin se puede producir
incluso en mitad de un comando. Por ejemplo, para suministrar como ngulo para
un arco el valor contenido en la variable x, se responde a la solicitud
de AutoCAD con !x. Por ejemplo:
Comando: !sx
0.523599
Cuarta:
Quinta:
Los smbolos de variables participan con el valor que contienen (que les est
asociado) en el momento de la evaluacin. Por ejemplo:
!x devuelve 30
!sx devuelve 0.523599
Sexta:
Determinadas funciones de AutoLISP pueden devolver un valor nulo, que se
representa mediante la expresin nil. Por ejemplo:
Comando: (PROMPT "Bienvenido a AutoLISP\n")
Bienvenido a AutoLISP
nil
La funcin PROMPT escribe en la lnea de comando el mensaje especificado y
devuelve nil. El cdigo \n equivale a INTRO.
(+ 23)
devuelve:
23
2 3)
val (- vax vad))
(* 12 2) 24)
(- -10 -5) (* 3 total 23))
(/ 100 5 5)
da como resultado 4, es decir, 100 / 5 = 20 y, luego, 20 / 5 = 4; o lo que es lo
mismo, 100 / (5 * 5) = 4.
Otros dos ejemplos:
(/ 24 (* (+ 10.0 2) 12))
(/ 12 2 1)
Con respecto al cociente debemos realizar las mismas observaciones anteriores,
esto es, si se indica un solo valor se devuelve el mismo valor, si se indica la funcin
sin argumentos se devuelve 0 y si se indican valores enteros slo se devuelven
valores enteros. Esto ltimo cobra especial sentido en el caso de las divisiones, ya
que el cociente entre dos nmeros enteros puede ser un nmero real. Veamos el
siguiente ejemplo:
(/ 15 7)
Si introducimos esta lnea el resultado ser 2. El motivo es que, como hemos
especificado valores enteros, el resultado se muestra en forma de nmero entero,
con la parte decimal o mantisa truncada. Para asegurarnos de recibir una respuesta
correcta (con decimales significativos), deberemos introducir uno de los valores o
todos ellos, pero con uno es suficiente como valor real, de la siguiente forma:
(/ 15 7.0)
Ahora el resultado ser 2.14286. El nmero entero podra haber sido el otro:
(/ 15.0 7)
Esto debemos tenerlo muy en cuenta a la hora de realizar operaciones cuyo
resultado vaya a ser parte integrante de otra operacin o no que puede
devolver decimales. Vemos otros ejemplos de divisiones:
Las dos primeras que veremos son sencillas de entender y utilizar. Ambas se
refieren al incremento, positivo o negativo, de una unidad a un valor numrico.
(1+ valor)
Esta sintaxis corresponde a la funcin de incremento positivo de una unidad al valor
indicado. As, si queremos incrementar en 1 el valor 576, haremos:
(1+ 576)
Esto equivale a (+ 576 1) pero es de una forma ms cmoda; el resultado es 577.
NOTA: La funcin se denomina 1+ en s, por lo que no existe espacio entre 1 y +.
Podemos realizar estos incrementos con nombres de variable:
(1+ n)
lo que incrementar en una unidad el valor de n. Esto puede ser especialmente
necesario para controlar los llamados contadores-suma en programacin, del tipo:
(SETQ sum (1+ sum))
Esto ya lo veremos a la hora de declarar variables.
La siguiente funcin resta (incremento negativo) una unidad al valor numrico
indicado. Equivale a (- valor 1), pero de una forma ms cmoda.
(1- valor)
Por ejemplo:
(1- 32)
suyo resultado es 31.
Otros ejemplos de estas dos funciones:
(1- n)
(1- 67.90)
(1- -23)
(1+
(1+
(1(1-
-34.0)
(+ tuttot 1)
(* 2 2))
(* (/ 32 2) (+ 10 1.0)))
(ABS valor)
Esta funcin ABS devuelve el valor absoluto del nmero indicado o expresin
indicada. De esta forma, la siguiente expresin:
(ABS 23)
devuelve 23.
Las siguientes expresiones tienen el siguiente efecto indicado:
(ABS
(ABS
(ABS
(ABS
(ABS
(ABS
(FIX valor)
FIX trunca un valor a su parte entera (positiva o negativa), es decir, de un nmero
real con decimales devuelve nicamente su parte entera. Pero, cuidado, no se
produce redondeo, slo un truncamiento.
Ejemplos:
(FIX
(FIX
(FIX
(FIX
32.79) devuelve 32
12.45) devuelve 12
(/ 10 3.0)) devuelve 3
(/ 10 3.0)) devuelve 3
1 2)
0 23)
(* 23 2) (- (+ 1 1) 45.5))
54 (* 3 -4))
Pasemos ahora a ver las funciones trigonomtricas, esto es, cmo calcularlas
mediante AutoLISP. La primera sintaxis se refiere al seno de un ngulo y es la
siguiente:
(SIN ngulo)
La funcin SIN devuelve el seno de un ngulo expresado en radianes. Ejemplos:
(SIN 1) devuelve 0.841471
(SIN (/ PI 2)) devuelve 1.0
NOTA: Como sabemos PI es un constante de AutoLISP, por lo que no hace falta
declararla como variable; ya tiene valor propio y es 3.14159. An as, se puede
calcular su valor exacto mediante la expresin: PI = 4 * arctag 1.
(COS ngulo)
COS devuelve el coseno de un ngulo expresado en radianes. Ejemplos:
(COS PI) devuelve 1.0
(COS (* 3 4)) devuelve 0.843854
NOTA: Ntese que PI es un valor real, por lo que el resultado ser real.
(ATAN valor1 [valor2])
Esta funcin ATAN devuelve el arco cuya tangente es valor1 expresada en radianes,
es decir, realiza el arco-tangente de dicho valor. Por ejemplo:
(ATAN 1.5) devuelve 0.98
Si se indica un segundo valor (valor2), ATAN devuelve el arco-tangente
de valor1 dividido porvalor2. Esto permite indicar la razn entre los lados de un
tringulo recto, es decir, escribir la tangente directamente como cociente del seno
entre el coseno. Si valor2 es 0, el valor devuelto ser igual a PI / 2 o a PI / 2
radianes, dependiendo del signo de valor1.
Ejemplos:
(ATAN 1 1)
(ATAN 1 (* 2 -4.5))
Estas son las tres funciones trigonomtricas de AutoLISP. En este punto se nos
plantean un par de problemas: cmo calculo las restantes funciones
trigonomtricas? y cmo convierto grados sexagesimales en radianes y viceversa?
La segunda cuestin es sencilla, ya que basta aplicar al frmula rad = grados * PI /
180 para convertir grados en radianes. La operacin inversa en fcilmente
deducible.
La primera pregunta tiene una respuesta no menos sencilla, y es que en la mayora
por no decir todos de los lenguajes de programacin nicamente nos
proporcionan estas funciones trigonomtricas bsicas y, a partir de ellas, podemos
calcular las funciones trigonomtricas derivadas inherentes. La manera se explica a
continuacin mediante notacin sencilla de una lnea:
Funcin derivada --------- Notacin
------------------------------------------------------------------------------------Secante (sec x) ------------ 1 / cos (x)
Cosecante (cosec x) ------- 1 / sen (x)
Arco-seno (arcsen x) ------- arctag (x / (1 x ^ 2))
Arco-coseno (arccos x) ----- 1.5707633 arctag (x / (1 x ^ 2))
Arco-secante (arcsec x) ---- arctag ( (x ^ 2 1)) + signo (x) 1) * 1.5707633
Arco-cosecante (arccos x) -- arctag (1/ (x ^ 2 1)) + signo (x) 1) * 1.570763
Arco-cotang. (arccotag x) --- 1.5707633 arctag (x)
NOTA: El smbolo ^ significa exponenciacin. es raz cuadrada. signo (x) se
refiere al signo del valor; si ste es positivo signo (x) valdr 1, si es negativo valdr
1 y si es cero valdr 0. No debemos preocuparnos ahora por esto, ya que
aprenderemos en breve o ms adelante con mayor soltura a realizar
exponenciaciones, races cuadradas y operaciones con signos.
Sigamos, pues, ahora con otras diferentes funciones que nos ofrece AutoLISP a la
hora de realizar operaciones matemticas. La siguiente dice referencia a las races
cuadradas; su sintaxis es:
(SQRT valor)
Esta funcin devuelve el resultado de la raz cuadrada del valor indicado, ya sea un
guarismo simple o una expresin matemtica, como siempre. As por ejemplo,
veamos unas expresiones con sus correspondientes evaluaciones:
(SQRT 4) devuelve 2.00
(SQRT 2) devuelve 1.4142
(SQRT (* 2 6)) devuelve 3.4641
La intencin de extraer una raz cuadrada de un nmero negativo produce el
error function undefined for argument de AutoLISP.
Por otro lado, la sintaxis para la funcin exponencial es la siguiente:
(EXPT base exponente)
EXPT devuelve el valor de base elevado a exponente. De esta forma, para elevar 5
al cubo (igual a 125), por ejemplo, escribiremos:
(EXPT 5 3)
Otro ejemplo:
(EXPT 2.3 7.23)
De esta forma, como sabemos, podemos resolver el resto de races (cbicas,
cuartas, quintas...) existentes. Ya que raz cbica de 32 es lo mismo que 32 elevado
a 1 / 3, podemos escribir la siguiente expresin:
(EXPT 32 (/ 1 3))
As tambin:
(EXPT 20 (/ 1 5))
(EXPT 10 (/ (+ 2 4) (- v23 rt sw2))
(EXPT 3 (/ 1 2))
NOTA: El intento de extraer races negativas de cualquier ndice producir el mismo
error explicado en SQRT.
(EXP exponente)
Esta funcin devuelve la constante (nmero) e elevada al exponente indicado. Se
corresponde con el antilogaritmo natural. Por ejemplo:
(EXP 1) devuelve 2.71828
(LOG valor)
LOG devuelve el logaritmo neperiano o natural (en base e) del valor indicado. Por
ejemplo:
(LOG 4.5) devuelve 125.0000
(GCD valor_entero1 valor_entero2)
Esta sintaxis se corresponde con la funcin de AutoLISP GCD, que devuelve el
mximo comn denominador de los dos valores indicados. Estos valores han de ser
obligatoriamente enteros, de no ser as, AutoLISP devuelve bad argument
type como mensaje de error. Veamos unos ejemplos:
(GCD 45 80) devuelve 5
(GCD 80 70) devuelve 10
(GCD (* 10 10) (/ 70 2)) devuelve 5
Si se indica un entero negativo el mensaje de error de AutoLISP es improper
argument.
Las dos ltimas funciones matemticas que veremos pueden sernos de gran ayuda
a la hora de programar. Una de ellas (MAX) devuelve el mayor de todos los nmeros
indicados en la lista. Su sintaxis es:
(=
(=
(=
(=
NOTA: Ntese, como adelanto, que las cadenas literales han de ir encerradas entre
comillas, como en casi todos los lenguajes de programacin.
(<
(<
(<
(<
2 3) devuelve T
3 4 5 89 100) devuelve T
3 4 5 6) devuelve nil
(* 2 2) (/ 5 3)) devuelve nil
"a"
"z"
"A"
"f"
"b") devuelve T
"h") devuelve nil
"a" "b") devuelve T
"S") devuelve nil
Otros ejemplos:
(> saldo divid)
(> pplanta ppiso pcubierta)
(NOT expresin)
La funcin NOT devuelve el NO lgico, es decir, si algo es verdadero devuelve falso y
viceversa. As, cuando el resultado sea distinto de nil (T), devolver nil; cuando
el resultado sea nil, devolver T. Por ejemplo:
(NOT (= 2 2)) devuelve nil
(NOT (/= 2 2)) devuelve T
(EQ expresin1 expresin2)
Esta funcin no es propiamente lgica, sino que se denomina de identidad de
expresiones. An as, la introducimos en este apartado por su similitud con las
anteriores.
EQ compara las dos expresiones (slo dos y ambas obligatorias) indicadas y
devuelve T si ambas son idnticas o nil en caso contrario. Se utiliza sobre todo
para comparar listas y ver si hay igualdad estructural.
La diferencia de EQ con EQUAL es que sta ltima compara los resultados de evaluar
las expresiones, mientras que EQ compara la identidad estructural de las
expresiones sin evaluar. Por ejemplo, y adelantando la funcin SETQ que enseguida
veremos, podemos hacer lo siguiente:
(SETQ list1 (x y z))
(SETQ list2 (x y z))
(SETQ list3 list2)
(EQ list1 list2) devuelve T
(EQ list2 list3) devuelve nil
Se observa que list1 y list2 son exactamente la misma lista por definicin, estn
declaradas con SETQ y por separado, siendo sus elementos iguales. Pero list3 es,
por definicin, igual alist2 y no a list3, aunque sus elementos sean iguales. Es
por ello que, en la segunda evaluacin, EQ devuelve nil.
NOTA: Comprenderemos enseguida el funcionamiento y base de la funcin SETQ, no
hay preocuparse.
http://www.lawebdelprogramador.com/cursos/autocad/once_1.php
presentatiempoejecucion()
(princ)
)
;liberar
(setq *MODELSPACE* nil)
(princ)
)
Dim i
As Integer
Dim tiempo
As Double
Dim promptStr
As String
'
'/* mensaje de consola */
ActiveDocument.Utility.Prompt (vbCrLf & "Prueba de velocidad
[VBA].")
'
'/* inicializar las variables */
'
With centro
'
.X = 0#
.Y = 0#
.Z = 0#
'
End With
'
radio = 1#
'
'/* solicitar el nmero de repeticiones */
'
Err.Clear
'
n = ActiveDocument.Utility.GetInteger(vbCrLf & "Nmero de
repeticiones : ")
'
'/* chequear si se cancel */
If (Err.Number = -2147352567) Then
'
ActiveDocument.Utility.Prompt ("*Cancel*" & vbCrLf)
'
Exit Sub
'
End If
'
If (n <= 0) Then
'
n = 1000
'
End If
'
ActiveDocument.Utility.Prompt (vbCrLf & "Realizando la prueba para
" & _
n & " repeticiones ..." & vbCrLf)
'
'/* tomar el tiempo inicial */
t0 = ActiveDocument.GetVariable("DATE")
'
'/* repetir n veces ... */
For i = 1 To n
'
Call DibujaCirculo(centro, radio)
'
radio = radio + 0.001
'
Next i
'
'/* tomar el tiempo final */
tf = ActiveDocument.GetVariable("DATE")
'
C++ (ObjectARX)
Acad::ErrorStatus appendEntityToModelSpaceBlockTableRecord(AcDbEntity
*pEntity, AcDbObjectId& ID)
{
Acad::ErrorStatus
es;
AcDbBlockTable *pBlockTable;
// obtener un puntero a la BlockTableRecord Modelo Espacio
es = acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable, AcDb::kForRead);
if (es != Acad::eOk)
return es;
AcDbBlockTableRecord *pBlockTableRecord;
es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
AcDb::kForWrite);
pBlockTable->close();
if (es != Acad::eOk)
return es;
// aadir la entidad a la BlockTableRecord
es = pBlockTableRecord->appendAcDbEntity(ID, pEntity);
// se cierra la entidad
pEntity->close();
pBlockTableRecord->close();
}
return es;
}
catch(const std::bad_alloc&)
{
acdbFail("\nError de asignacin de memoria
[DibujaCirculo].");
return;
}
AcDbObjectId ID;
// ... y aadirla a la base de datos de AutoCAD
if
(appendEntityToModelSpaceBlockTableRecord((AcDbEntity*)pCircle, ID) !=
Acad::eOk)
{
if (pCircle)
{
delete pCircle;
}
acdbFail("\nError al aadir la entidad a la Base de
Datos [DibujaCirculo].");
}
return;
return;
}
// This is command 'CONCIRARX'
void TPLDPruebasconcirarx()
{
// mensaje de consola
acutPrintf("\nPrueba de velocidad [ARX].\n");
// inicializar las variables
AcGePoint3d
centro(0, 0, 0);
double
radio = 1.000;
// solicitar el nmero de repeticiones
int n;
if (acedGetInt("\nNmero de repeticiones : ", &n) == RTCAN)
{
acutPrintf("*Cancel*\n");
return;
}
if (n <= 0)
{
n = 1000;
}
acutPrintf("\nRealizando la prueba para %d repeticiones ...",
n);
// tomar el tiempo inicial
radio += 0.001;
return;
Tabla de resultados
Pues aqu est el resultado de la prueba hecho con un P4 a
1.7GHz con 256MB de RAM y bajo AutoCAD 2000. Antes de
presentar la tabla he de decir que personalmente me
esperaba lo siguiente.
AutoLISP sera es ms lento de todos, seguido muy de cerca
por el formato FAS. Posteriormente crea que el formato VLX
ira muy a la par con VBA y no hubiera sabido decidirme entre
uno y otro para la tercera posicin. Y por ltimo me esperaba
una victoria aplastante de ObjectARX. Pero hay sorpresas :
REPETICIONES
Tiempo en milisegundos
LSP
FAS
VLX
VBA
ARX
50
10
10
19
10
500
210
169
221
120
40
1000
431
340
440
250
90
2500
1061
871
1080
631
220
5000
2113
1811
2172
1282
431
10000
4126
3925
4336
2564
871
puede
hacrmela
Un saludo.
David Esquinas.
http://topoligonar.galeon.com/tutoriales/test1/test1.html
Biblioografia.-
llegar
https://sis2430.files.wordpress.com/2009/11/tema-6.pdf