AutoCad - Rutina Visual Lisp Atributos a Excel

 
Vista:
sin imagen de perfil
Val: 13
Ha aumentado su posición en 2 puestos en AutoCad (en relación al último mes)
Gráfica de AutoCad

Rutina Visual Lisp Atributos a Excel

Publicado por Skap (5 intervenciones) el 13/06/2018 20:12:35
Hola

Soy novato en Lisp y estoy intentando que me funcione una rutina sacada del Libro "Programación en Autocad con Visual Lisp" de Togores y Otero. Se llama Atributos y se encarga de sacarlos desde un dibujo a una hoja Excel.
Como desde el dibujo que he intentado sacar lo atributos era muy grande y no me funcionaba he cogido parte de uno de los ejemplos de Autocad para simplificar el problema, pero tampoco funciona completamente.
Adjunto rutina y dibujo de ejemplo.
Al ejecutarla consigo crear la hoja excel con el nombre del bloque de atributos, pero éstos no se plasman en las celdas.
En mi rudimentario conocimiento y con ayuda del libro he llegado a detectar que en el IF de la rutina "sel-bloque", "setq ss" siempre vale nil, o eso creo, y no extrae los atributos. No llego a entender porqué.
Agradecería cualquier ayuda.
Uso Autocad 2009

Gracias de antemano.

José Luis
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

Rutina Visual Lisp Atributos a Excel

Publicado por Gerardo (986 intervenciones) el 14/06/2018 01:22:52
Hola amigo

Revisa la funcion "procesa-tabla"

la llamada a dato->celda en el primer ciclo del foreach trata de sumarle 1 a numcol para incrementar su valor, pero en ese momento numcol (como es variable declarada local y no se asignado antes de este punto) es nil, entonces la rutina trata de sumarle 1 a nil y eso da error. Por lo tanto ninguna llamada a dato-celda se efectúa.

Prueba inicializando esa variable con un valor numerico, como así:

1
2
3
4
5
6
7
8
9
10
11
12
13
(defun procesa-tabla  (lista / numfila numcol)
  (setq numfila 1
		  numcol 1
  )
  (foreach campo  (car lista)
    (dato->celda numfila
               (setq numcol (1+ numcol))
               (car campo)))
  (while (setq fila (car lista))
    (setq numfila (1+ numfila)
          lista   (cdr lista))
    (procesa-fila fila numfila))
)
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
sin imagen de perfil
Val: 13
Ha aumentado su posición en 2 puestos en AutoCad (en relación al último mes)
Gráfica de AutoCad

Rutina Visual Lisp Atributos a Excel

Publicado por Skap (5 intervenciones) el 14/06/2018 21:46:55
Hola,

pues parece que no ha surtido efecto, la cosa sigue igual.
¿A alguien le funciona y rellena la hoja excel?.

He detectado, usando el depurador paso a paso, que no pasa por muchas de las funciones.

¿Es importante cargar en algún orden los archivos?

gracias de nuevo por vuestra paciencia.

Nota: agradecería contacto para clases de Lisp en zona Villaviciosa de Odón o alrededores.
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

Rutina Visual Lisp Atributos a Excel

Publicado por Gerardo (986 intervenciones) el 14/06/2018 22:03:24
Hola

El orden de carga en este tipo de rutinas no importa (mientras todo este anidado en defuns)

A mi me funciono bien con ese cambio. Que tal que pasas el archivo en el que estas probando para ver si hay alguna condicion especial en el
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: 13
Ha aumentado su posición en 2 puestos en AutoCad (en relación al último mes)
Gráfica de AutoCad

Rutina Visual Lisp Atributos a Excel

Publicado por Skap (5 intervenciones) el 15/06/2018 00:05:04
Hola,

mi intención era adjuntar el fichero que usaba, pero debí hacer algo mal.

Aquí va.
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

Rutina Visual Lisp Atributos a Excel

Publicado por Gerardo (986 intervenciones) el 15/06/2018 16:42:26
mmmm.... ya veo

La solución temporal: Ejecuta el comando "BLOCKRESET" seleccionando todos los bloques o todo el dibujo y luego vuelve a correr la rutina y verás que ya funciona.


La explicación detallada:

La rutina está bien, pero es sencilla para tu bloque, o el bloque complejo para la rutina,

La rutina selecciona con un filtro sobre la lista DXF de objetos, la cual contiene un par de la forma (0 . "Nombre"), entonces el ssget selecciona todas las inserciones que contengan el nombre del bloque.

El bloque que estás usando es dinámico. Los bloques dinámicos cuando los insertas conservan su nombre, pero una vez que alteras algún parámetro se convierten en bloques anonímos vinculados al bloque original. Es el metodo que usa el autocad para porder mostrar geometrías diferentes para una misma definición de bloques.

Si insertas el bloque llamado "Drawing Block Title", pegas esto en la línea de comandos: (cdr (assoc 2 (entget (car (entsel))))), das intro y seleccional el bloque insertado, veras que te muestra el nombre original, pero si estiras la linea horizontal y vuelves a correr ese codigo verás que ahora te muestra un nombre generico que comienza con un asterisco (eso es un bloque anonimo).

Entonces si corres la rutina sobre bloques estáticos (no dinámicos) verás que ya está bien.

Si quieres modificarla para que también funcione sobre bloques dinámicos, el procedimiento es un poco diferente. Para seguir trabajando con ssget, tendrías que hacer una segunda seleccion de todas las inserciones de bloques anonimos. Para cada elemento de esa seleccion comprobar si se trata de un bloque dinamico, y si lo es obtener el nombre original y si el nombre coincide con el que estás buscando agregar entonces esta inserción al conjunto seleccion. O agregar todos los objetos tipo Insert con atributos al ss, pero en la función que extrae los atributos ir comprobando los nombres y solo listar los que sean tu bloque, tanto si el nombre ssalió en el cod 2, como si el bloque era dinámico y el nombre original te ccoincide. No es tan complicado, porque el objeto visual lisp contiene una propiedad llamada "IsDynamicBlock", una llamada "Name" que muestra el nombre simple y otra "EffectiveName" que muestra el nombre del bloque original.
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: 13
Ha aumentado su posición en 2 puestos en AutoCad (en relación al último mes)
Gráfica de AutoCad

Rutina Visual Lisp Atributos a Excel

Publicado por Skap (5 intervenciones) el 17/06/2018 23:01:49
Mucha gracias Gerardo,

me ha funcionado como me comentas.

Ya me gustaria, pero no controlo lo suficiente para modificar la rutina tal como me dices en tu último párrafo y me surgen otras preguntas por si puedo hacerlo más sencillo:

-¿Puede un bloque forzarse a NO ser dinámico?, de esta forma no necesitaría resetearlo.

-Entiendo que si altero algo del bloque, éste se convierta en anónimo, pero si lo abro por primera vez, sin tocar nada, y ejecuto la rutina tampoco funciona. ¿No debería haberse mantenido el nombre original?.

Adjunto dibujo con los que quiero trabajar, ¿son también dinámicos?.

Perdona tantas dudas y muy agradecido por tu tiempo y sapiencia.
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

Rutina Visual Lisp Atributos a Excel

Publicado por Gerardo (986 intervenciones) el 18/06/2018 07:52:02
El dibujo que adjuntas contiene bloques estáticos por lo que en ellos la rutina trabajará de forma correcta

Lo que me dices de forzar un bloque a no ser dinamico, pues sería más bien modificarlos en el editor de bloques quitando las características dinámicas, pero estas se pusieron por algo y normalmente no se querrá perderlas. Por ejemplo en el primer archivo que pasaste esa característica es la longitud de la línea. Si le quitámos el parámetro y acción dinámicos que permiten estirar la línea, entonces en títulos de variadas longitudes el texto se quedará corto o largo respecto a la línea.

Luego, lo que dices de no modificarlo. El tema es que los bloques no se abren, se insertan. Lo que estás abriendo, según tú por primera vez, es posiblemente un archivo donde ya alguna vez se insertó el bloque, se modificó la longitud de la línea (convirtiéndose este en anónimo) y se guardó el dibujo, entonces ya el bloque está modificado. Si en ese mismo dibujo usas el comando insert e insertas el bloque de nuevo, este que estás agregando si que será el original, con el nombre original y si será contabilizado por la rutina. Por eso te funcionó el "blockreset"
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
sin imagen de perfil
Val: 13
Ha aumentado su posición en 2 puestos en AutoCad (en relación al último mes)
Gráfica de AutoCad

Rutina Visual Lisp Atributos a Excel

Publicado por Skap (5 intervenciones) el 18/06/2018 18:57:57
Todo ok.

Espero que no sólo me hayan ayudado a mí todas las cuestiones que me has resuelto y sean un buen aporte a estos foros.

De nuevo muchas gracias por la ayuda.

Un saludo

José Luis
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
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

Rutina Visual Lisp Atributos a Excel

Publicado por Gerardo (986 intervenciones) el 19/06/2018 06:04:22
Con todo gusto
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