AutoCad - Como cargar una funcion autolisp dentro de otra?

 
Vista:
Imágen de perfil de Alain Oanes
Val: 11
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Como cargar una funcion autolisp dentro de otra?

Publicado por Alain Oanes (5 intervenciones) el 10/07/2017 17:32:12
Me explico, tengo una funcion definida como:

1
2
3
4
5
6
7
8
(defun c:acotado (/ pt1 pt2)
      (setq pt1 ("Primer Punto:")
            pt2 ("Segundo Punto:")
            pt3 (polar pt1 (* pi 0.50) 0.50)
       )
      (command "_dimlinear" pt1 pt2 pt3 "")
      (princ "")
)


Y tengo otra que trabaja en otro archivo y requerie llamar a la anterior para trabajar ok

1
2
3
4
5
6
7
8
9
10
11
12
(defun c:prueba (/ p1 p2)
 
    (setq p1 (getpoint "Inicio de la linea:")
	  p2 (getpoint "Fin de la Linea")
	)
    (command "_linea" p1 p2 "")
 
;;**********AQUI DEBE LLAMAR A LA FUNCION c:acotado y acotar la linea creada***************
;;**********definiendo como los puntos de acotacion el inicio y fin de la linea ***********
    (setq pt1 p1
	pt2 p2
	);;*****aqui coloco como variables pt1 el punto p1 de la linea pero como abrir y cargar el archivo con la funcion c:acotado?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Como cargar una funcion autolisp dentro de otra?

Publicado por Gerardo (986 intervenciones) el 10/07/2017 19:17:23
La forma de llamar una función dentro de otra es simplemente escribir su nombre entre paréntesis
Por ejemplo
1
2
3
4
5
6
7
8
9
(defun c:prueba (/ p1 p2)
 
	(setq	p1	(getpoint "Inicio de la linea:")
		p2	(getpoint "Fin de la Linea")
	)
	(command "_linea" p1 p2 "")
 
	(c:acotado)
)

Si la rutina "acotado" no estuviera cargada, además habría que agregar un
(load "nombredelarchivodelaotrarutina")
al principio del archivo de esta que invoca la otra

Ahora bien, a ti no te basta con llamar a la otra, ya que si solo lo haces, por la forma en que funciona te va a pedir de nuevo los puntos para acotar. Si la función acotado recibiera como parametros pt1 y pt2, es decir, si su definicion fuera de la forma
(defun acotado (pt1 pt2 / pt3)...
entonces si se podria porque solo pones en la otra funcion una llamada de la forma
(acotado p1 p2)
y ya,
Si fueran rutinas grandes se redefine acotar de esa forma, pero siendo tan diminutas lo mas simple es tomar la parte del codigo de acotado que necesitas en prueba y escribirlo dentro de la misma. Esto seria, ignorar la parte que pide pt1 y pt2 al usuario, y dejarse la que calcula pt3 y la que dibuja la cota.

La función híbrida resultante sería esta:
1
2
3
4
5
6
7
8
9
(defun c:prueba (/ p1 p2 p3)
	(setq	p1	(getpoint "Inicio de la linea:")
		p2	(getpoint "Fin de la Linea")
		p3 (polar p1 (* pi 0.50) 0.50)
	)
	(command "_linea" p1 p2 "")
	(command "_dimlinear" p1 p2 p3 "")
	(princ)
)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Alain Oanes
Val: 11
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Como cargar una funcion autolisp dentro de otra?

Publicado por Alain Oanes (5 intervenciones) el 13/07/2017 01:35:38
No cubre la respuesta pero gracias por el aporte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Como cargar una funcion autolisp dentro de otra?

Publicado por Gerardo (986 intervenciones) el 10/07/2017 19:25:53
Y aunque ahi la tienes ya solucionada, te muestro este otro ejemplo, que sería el caso de modificar la función que acota para que reciba como parametros los puntos p1 y p2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defun acota (pt1 pt2 / pt3)
	(setq	pt3 (polar pt1 (* pi 0.50) 0.50))
	(command "_dimlinear" pt1 pt2 pt3 "")
)
 
(defun c:acotado (/ pt1 pt2)
	(setq	pt1 ("Primer Punto:")
		pt2 ("Segundo Punto:")
	)
	(acota pt1 pt2)
	(princ)
)
 
(defun c:prueba (/ p1 p2)
	(setq	p1	(getpoint "Inicio de la linea:")
		p2	(getpoint "Fin de la Linea")
	(command "_linea" p1 p2 "")
	(acota p1 p2)
	(princ)
)

Como vez el nombre de la funcion acota no se precede por la particula "c:" lo que significa que no puede ser invocada desde linea de comandos si no es de la forma (acota pt1 pt2). Esta es una funcion de servicio para las otras dos funciones. Esto se debe que que las funciones definidas como comandos, es decir, que comienzan con c: no pueden recibir parametros.

Espero que te ayude a comprender la logica de esto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Alain Oanes
Val: 11
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Como cargar una funcion autolisp dentro de otra?

Publicado por Alain Oanes (5 intervenciones) el 13/07/2017 01:52:51
Muchas gracias Gerardo esta si es la respuesta. Tambien lo habia pensado pero me obliga a crear 03 archivos para cumplir el esquema: 01 archivo para el modulo base "acotar" (defun acotar)
01 archivo para cuando se llame solo a la funcion acotado para que reciba las variables y haga trabajar a acotar
01 archivo para dibujar la linea y que tambien llame a la funcion (acotar p1 p2)

Tenia la idea que podia existir una forma directa como invocar a la funcion tipo command:
(command "acotar" pt1 pt2 "")
de tal forma que solo trabajo con 02 archivos y cuando haga falta invoco al archivo y coloco sus variables

Aclaracion: He puesto un codigo simple para modelar el concepto; el codigo verdadero al que quiero aplicar es mas extenso y adjunta funciones q solo confundirian la pregunta. Obviamente, seria mucho mas practico y sencillo colocar todo junto como lo muestras en la primera respuesta pero no responderia la pregunta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Como cargar una funcion autolisp dentro de otra?

Publicado por Gerardo (986 intervenciones) el 13/07/2017 04:05:25
Recuerda que no existe una relación de unicidad entre archivos y funciones. Puedes tener muchas funciones en un solo archivo.

En la solución que te di la funcion acota y c:acotado irian normalmente en un mismo archivo y no es exceso de codigo para nada, simplemente dividi tu funcion acotado en 2 partes (dentro del mismo archivo .lsp), para que una tenga el procedimiento y la otra la interfaz con el usuario, así el usuario puede llamarla desde un comando y seleccionar los 2 puntos y otra función puede invocarla pasandole los puntos previamente calculados. Generalmente cuando se hace esto la función de servicio suele ser tan extensa como el procedimiento lo necesite y la de comando (c:) suele ser muy pequeña, apenas recoge algunos datos iniciales al usuario para invocar la de servicio con los parametros necesarios.

Si necesariamente ocuparas solo 2 funciones puedes colocar los puntos en variables globales en vez de locales y hacer que la funcion prueba revise si existen y si es así los utilice desde las variables y de lo contrario se los pida al usuario.

De hecho el tema del ámbito de variables es muy importante y te abre un abanico de posibilidades. Mira este otro ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(defun c:acotado nil
  (if (not
        (and
             v:p1
             v:p2
             (listp v:p1)
             (listp v:p2)
             (vl-every 'numberp (append v:p1 v:p2))
        )
      )
      (setq v:p1 (getpoint "\nPrimer Punto:")
            v:p2 (getpoint "\nSegundo Punto:" v:p1)
      )
  )
  (command "_dimaligned" v:p1 v:p2 "_none" (polar v:p1 (+ (angle v:p1 v:p2) 1.5708) 0.5) "" )
  (setq v:p1 nil
        v:p2 nil
  )
  (princ)
)

(defun c:prueba (/ v:p1 v:p2)
  (setq v:p1 (getpoint "\nInicio de la linea:")
        v:p2 (getpoint "\nFin de la Linea" v:p1)
  )
  (command "_line" v:p1 v:p2 "")
  (c:acotado)
  (princ)
)
En el la función acotado revisa si existen las variables de los puntos, si existen usa los que están definidos y si no los solicita al usuario. Como la función prueba tiene variables de ámbito local con el mismo nombre, cada vez que se invoque (c:acotado) desde el cuerpo de prueba, las variables existirán y serán las que se usaron para trazar la linea, por lo que acotado trabajará sobre esos puntos. Estos métodos son menos ortodoxos que lo que te ofrecí en las respuestas anteriores pero igual válidos si llegas al resultado deseado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar
Imágen de perfil de Alain Oanes
Val: 11
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Como cargar una funcion autolisp dentro de otra?

Publicado por Alain Oanes (5 intervenciones) el 21/07/2017 09:39:51
Gracias Gerardo, buen aporte. Como te mencione, puse un secuencia sencilla para entender el concepto, el codigo que vengo escribiendo es mas amplio y colocarlo directamente aqui resultaria tedioso. La solucion que planteas responde mi inquietud.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.285
Oro
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Como cargar una funcion autolisp dentro de otra?

Publicado por Gerardo (986 intervenciones) el 21/07/2017 19:17:03
con gusto
que bueno que te sirviera
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar