AutoCad - añadir una lisp dentro de otra (pasando de defun:c a defun

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

añadir una lisp dentro de otra (pasando de defun:c a defun

Publicado por Juanma (157 intervenciones) el 09/03/2025 21:38:25
Buenas, estoy tratando de incluir una lisp bastante buena, que he descargado de internet "PLDiet.lsp".
He intentado adaptarla cambiando "defun c:pld" por "(defun pld (variable1 variable2 variable3).....)" y he borrado donde pide las variables, para luego dárselas directamente en la llamada de la forma "(pld uno dos tres)".
Pero no consigo que funcione.

No se si he borrado algo que no era, o si hay algo que no estoy el errando en la forma de hacerlo.

Subo la lisp original y el intento. (en el intento hay que seleccionar solo polilíneas, aunque no he limitado nada en el código
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

añadir una lisp dentro de otra (pasando de defun:c a defun

Publicado por Gerardo (1013 intervenciones) el 10/03/2025 07:19:55
Hola Juanma

hay un error en la forma como lo modificaste

(defun nombre (parametros) (accion 1) (accion 2) ... (acccion n))

La función "DEFUN" para construir una funcion siempre tomará el primer argumento como nombre, el segundo como lista de argumentos y del tercero en adelante como acciones a procesar.

En cuanto a los argumentos esta puede ser una lista vacía o nil si no los hay, o puede contener parámetros y variables. Los parámetros son variables que el invocante le pasa a la función y las variables son declaraciones de las mismas para que solo existan localmente, en el ámbito de esta función. Si declaramos variables locales debemos separar la lista de argumentos por un / que indicará que los que estén antes son parámetros recibidos y los que están después son variables declaradas como locales.

Lo que sucede en este caso es que separaste ambas listas (parametros y variables)

1
2
3
4
5
6
(defun
    PLD
   (disttemp cidtemp arctemp plsel)
    (/ *error* cmde plinc  pl pldata ucschanged front 10to42 vinc verts vert1 vert2 vert3)
    ...
)

Entonces defun va a crear una función llamada PLD, su segundo argumento que es (disttemp cidtemp arctemp plsel) lo va a interpretar correctamente, como lista de parámetros y espera esos 4 valores en la llamada de la función, pero ya la siguiente lista la asumirá como la primera accón a realizar, y como empieza con / va a tratar de dividir *error* entre cmde y el resultado entre plinc y el resultado entre pl... etc y como esos nombres de fijo no contienen numeros divisibles o divisores ahi te da error.

Supongo que aquí ya comprendiste como debes ponerlo, no hace falta decirlo, pero para que quede completa la respuesta es así:

1
2
3
4
5
(defun
    PLD
   (disttemp cidtemp arctemp plsel  /  *error* cmde plinc  pl pldata ucschanged front 10to42 vinc verts vert1 vert2 vert3)
    ...
)
entonces defun entenderá que los elementos antes del / son parametros de llamada y los de luego son variables y que
(defun *error* (errmsg)...
es realmente la primera accion a ejecutar
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

añadir una lisp dentro de otra (pasando de defun:c a defun

Publicado por Cecil (1 intervención) el 13/03/2025 04:21:25
hmmm, it is hard for me
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
Imágen de perfil de Juanma
Val: 171
Bronce
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

añadir una lisp dentro de otra (pasando de defun:c a defun

Publicado por Juanma (157 intervenciones) el 13/03/2025 13:18:16
Si te interesa el tema de programación de autolisp te recomiendo la web afralisp. Que además está en inglés, y supongo que te resultará más sencillo de entender
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