acad hispano
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Extraer contenido de comando LIST en un .txt

4 participantes

Página 1 de 2. 1, 2  Siguiente

Ir abajo

Extraer contenido de comando LIST en un .txt Empty Extraer contenido de comando LIST en un .txt

Mensaje por BPP Miér Nov 29, 2017 2:18 am

Hola a todos

Me encuentro realizando una tarea rutinaria y quería saber si existe una forma de automatizar este procedimiento. Me explico: Para obtener la información que genera el comando LIST de una cantidad de objetos seleccionados, lo que hago actualmente es habilitar el registro de comandos en el archivo temporal con LOGFILEON, selecciono todos los objetos deseados y tengo que apretar varias veces ENTER para que se vayan generando los datos del comando. Luego con la ayuda de LOGFILENAME me dirijo a la ruta donde se genero el archivo txt y lo copio y pego a un archivo excel para procesar esos datos.
El problema es que tengo muchos objeto de los cuales generar la lista y se hace moroso tener que apretar el botón ENTER mil veces (dependiendo de la cantidad de objetos).

Lo ideal seria tener una rutina LISP que active el el comando LOGFILEON, me permita seleccionar los objetos deseados y realice los ENTER's necesarios, me de la opción de guardar ese archivo txt en una ruta y con un nombre especifico y finalmente apague el comando con LOGFILEOFF para no seguir registrando nada.

No se si esto sea posible, espero que puedan ayudarme.

De antemano muchas gracias por la colaboración.

BPP

Mensajes : 14
Fecha de inscripción : 27/11/2017

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por carlosmgilp Miér Nov 29, 2017 5:17 am

Hola como estas.
Que clase de información necesitas extraer y de que objetos.
También debes especificar en que formato necesitas eso datos extraídos.
Tal vez sea mas fácil extraer solo lo que necesitas directamente del objeto y seria mas rápido y mejor.
Saludos.

carlosmgilp

Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por BPP Jue Nov 30, 2017 2:41 am

Quetal Carlos, gracias por responder.

Los objetos con los que trabajo son lineas o polígonos que están dibujados con polilinea o polilinea 3D, y la información que necesito (coordenadas, nombre de la capa, largo, o área) la extraigo y ordeno en tablas (dependiendo la situación) de todo el historial de comandos que obtengo con LIST en Autocad mediante una macro en excel que tengo. Pero para poder usar esa macro necesito tener generada en un archivo .txt toda la información tal cual me la da autocad al ejecutar el comando LIST de los objetos deseados.
Es en esa tarea que resulta lo moroso, ya que una vez seleccionados los 100 objetos (por ejemplo) para que autocad vaya generando los datos requeridos de cada objeto me solicita dar ENTER un montón de veces y luego copiar todo desde la ventana de comandos (F2), o activar el LOGFILEON y copiarlo del archivo txt generado en la ruta que indica LOGFILENAME.

Saludos.

BPP

Mensajes : 14
Fecha de inscripción : 27/11/2017

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por nolo Jue Nov 30, 2017 10:39 pm

A ver BPP, si quieres ayuda para pasar datos de acad a excel, tendrías que subirnos un ejemplo para poder desarrollar un código.
Si lo que pretendes es seguir utilizando el procedimiento del archivo de texto (tal cual lo da el comando list) y luego tratarlo con el excel, me temo que no es útil redactar un lisp que liste las cosas igual que el comando list solo que no te obligue a dar al intro cuando se llene la pantalla.
Yo no se como hacer para que se ignore el hecho del llenado de pantalla o aumentar las líneas consecutivas de la pantalla de texto, pero si que se puede hacer una macro en lisp que teclee por ti el intro después de cada entidad listada, lo cual te ahorra algunos intros aunque tendrás que seguir tecleándolo cuando, por ejemplo, tengas una polilínea con muchos, muchos vértices .
Algo así
Código:
(defun c:lista2()
(princ "\nSeleccione objetos :")
(setq ss (ssget))
(while (> (sslength ss) 0)
(command "_list" (ssname ss 0)"")
(command)
(ssdel (ssname ss 0) ss)
)
(princ)
)

Ahora, seguro que es mucho mejor prepararse un lisp que te deje encolumnados los datos que necesitas pasar al excel
Un saludo

nolo

Mensajes : 182
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por carlosmgilp Vie Dic 01, 2017 10:10 am

Hola como están.
Haber BPP como dice nolo duplicar el comando list no vale la pena, es trabajar en algo que existe.
También hay rutinas que extraen valores de los objetos, por ahí debo tener una del Sr Togores. Ya de Excel si no se nada.
Hola nolo como estas. Hay una variable que cambia la cantidad de líneas que muestra, pero no recuerdo cuál es y estoy de viaje, hasta el domingo que vuelvo busco el nombre y se las paso, tal vez así no es necesario hacer otra rutina sino trabajar sólo con el macro.
Saludos.

carlosmgilp

Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por BPP Dom Dic 03, 2017 4:15 am

Saludos a todos.

Ya que seria mas fácil hacer una rutina lisp que extraiga directamente los datos requeridos y lo ordene en una tabla, prosigo a explicar por pasos las operaciones que realizo para obtener los datos deseados.
Teniendo dibujados y seleccionados todos los objetos (ya sea con linea, polilinea o polilinea 3D) ejecuto el comando LIST y copio todo el texto tal cual esta a una hoja de excel y ejecuto una macro que filtra la información de las coordenadas de cada vértice del objeto, longitud y nombre de la capa, ademas que le asigna a cada coordenada un orden, por ejemplo si el objeto tiene dos vértices, le asigna el numero 1 al punto inicial, 2 al primer vértice, 3 al segundo y 4 al punto final, también le asigna un numero de objeto y los ordena en una tabla como se muestra en la imagen a continuación:

Extraer contenido de comando LIST en un .txt Ejempl11

Con la macro puedo generar la tabla del CASO 1 asi como la del CASO 2 en función a lo que requiera.

Espero haberme explicado bien con lo que deseo hacer.

BPP

Mensajes : 14
Fecha de inscripción : 27/11/2017

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por nolo Dom Dic 03, 2017 7:37 pm

A ver, o es que sea sencillo preparar la rutina, sino que no merece la pena repetir algo que ya hace Autocad directamente en un lisp.
Por otro lado, creo que las tablas son tan sencillas que podrías hacerlo perfectamente con data extraction como en este vídeo

No obstante, como este foro va de programación voy a proponer una solución basada en el portapapeles según la rutina de topowar que dejé por aqui
<rutinas memoria temporal>
con una nueva en vlisp para extraer los datos de las entidades y aprovechando otra de YMG para eliminar duplicados.
Así, al ejecutar la rutina te deja la tabla como texto en el portapapeles para que la pegues en excel debajo de sus títulos
Con esto se puede preparar un lisp condicional que dependa de un flag para llevar al portapapeles las coordenadas de los puntos o la de las longitudes.
Le he puesto capon porque así esta hecha
Código:
(defun capon ( CFLAG / old 2clip distinc listap ss sl capas i datos dato )
;;pasa tabla datos líneas y polilineas al portapapeles
;; by Nolo en http://acadhispano.foroargentina.net
(VL-LOAD-COM)
(setq old (getvar 'dimzin))
(setvar 'dimzin 0)

(defun 2clip(pasar / portapa)
;mardar el dato al portapapeles Original de Topoward
;;;;(print (strlen pasar))
  (vlax-invoke (vlax-get (vlax-get
         (setq portapa (vlax-create-object "htmlfile"))
 'PARENTWINDOW)  'CLIPBOARDDATA)
 'setdata "Text"
  pasar)
  (vlax-release-object portapa )
(if (< (strlen pasar)1000)
 (alert (strcat "Los datos \n"pasar"\nse han cargado en el portapapeles" ))
 (alert "Los datos se han cargado en el portapapeles")
)
)

(defun distinct(l) ; duplicados por YMG
(if l (cons (car l) (distinct (vl-remove (car l) l) )))
)

(defun listap( theobj / i l lt flag thelist) ;; por Nolo para lineas y polilineas 2d y 3d
;; lista con capa, puntos, longitud
(if (= (type theobj) 'ename) (setq theobj (vlax-ename->vla-object theobj)))

(list (vlax-get-property theobj 'Layer)
(if (setq flaG (member (vlax-get-property theobj 'ObjectName) '("AcDb3dPolyline""AcDbPolyline")))
(progn
 (setq flag (1+ (length flag)) i 0 l '() lt '()
 thelist(vlax-get-property theobj 'coordinates)
 thelist (vlax-safearray->list  (variant-value thelist))
 )
 (foreach a thelist (setq l (append l (list a)))
 (if (zerop (rem (setq i (1+ i)) flag))
 (setq lt (append lt (list l)) l '())
 ))
 (if (= flag 2)
 (mapcar '(lambda(a)(append a (list(vlax-get-property theobj 'Elevation))) ) lt)
 lt
 )
)
 (mapcar '(lambda(a)(vlax-safearray->list(variant-value
 (vlax-get-property theobj a))))
 '(StartPoint EndPoint))
)
(vlax-get-property theobj 'Length)
))


(princ (strcat (chr 10)"Seleccionar lineas o polilineas : "))
(if (setq ss (ssget '((0 . "LINE,LWPOLYLINE,POLYLINE"))))
(progn
(setq sl (vl-remove-if-not '(lambda(a)(=(type a)'ename)) (apply 'append (ssnamex ss)))
 ss (mapcar 'listap sl)
 capas (distinct(mapcar 'car ss))
 I 0
)

(2clip(APPLY 'STRCAT (apply 'append
(apply 'append
(mapcar '(lambda(x)  
 (setq datos (vl-remove-if '(lambda(a)(/=(car a) x)) ss))
 (MAPCAR '(LAMBDA(DATO  / n) (setq n 0 I (1+ I))
 (mapcar '(lambda(a)
 (apply 'strcat (append
 (list(chr 10)(car dato) (chr 9))
 (IF (= CFLAG 1)
 (append
 (mapcar '(lambda(b)(strcat (rtos b 2 4)(chr 9) ) )a)
 (list (ITOA (setq n (1+ n))) (chr 9)) )
 (LIST(strcat (rtos (LAST DATO) 2 4)(chr 9) ))
 )
 (LIST (ITOA I))
 ))
 )(cadr dato))
 )DATOS)
) capas)
)
)))
) (princ (strcat (chr 10)"No hay líneas o polilineas en la selección ...."))
)
(setvar 'dimzin old)
(princ)
)
Para llamar a esta rutina tendrías que escribir (capon 1) o (capon 2) o cargar también estas otras dos y llamadas como caso1 o caso2, dependiendo que tipo de tabla quieras
Código:
(DEFUN C:CASO1()
(CAPON 1)
)

(DEFUN C:CASO2()
(CAPON 2)
)
Como desconozco la cantidad de objetos con los que trabajas (deberías haber subido también un ejemplo en dwg acad10), la rutina hace una presentación previa de lo que hay en el portapapeles sólo si tiene menos de 1000 caracteres

De todas formas yo me miraría el data extraction para casos similares, aunque igual te sirve esto para este caso concreto

Un saludo

>>>>Editado y corregida numeración de objetos en la rutina capon


Última edición por nolo el Lun Dic 04, 2017 10:34 am, editado 1 vez

nolo

Mensajes : 182
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por Luis Alberto Benitez Dom Dic 03, 2017 10:35 pm

Nolo aquí tengo una rutina que exporta los vértices de una polilinea
en un archivo CSV lo que quiero con la ayuda de los que mas saben
es que envíe los datos al portapapeles.
Desde ya Gracias por los Aportes al Foro.
Un Saludo
Luis
Código:

;;;;______________________ Rutina creada por Antonio Lancho ___________________
;;;____________________________________ pto __________________________________
;;;________________________________ Versión 1.0 ______________________________
(DEFUN c:pto1 ()
(SETQ cont 0) ;para poner el contador a 0  
  (PRINC "\nSelecciona la polilinea.:") ;para que aparezca antes de designe objetos y asi saber que debemos designar
  (SETQ conj (SSGET '((0 . "LWPOLYLINE")))) ;realizamos la seleccion de entidades
  (SETQ ent (SSNAME conj cont)) ;devuelve el nombre de la polilinea ya que solo hemos seleccionado una entidad el contador es 0
  (SETQ bd (ENTGET ent)) ;nos devuelve la base de datos de la entidad con nombre bd
  (WHILE
    (SETQ sublista (ASSOC 10 bd)) ;saco el punto de la bd con su indicativo es decir 10 . 0.0 0.0 (x,y)
    (SETQ lista-pol (CONS (TRANS(CDR sublista) 0 1) lista-pol)) ;saco el punto y lo añado a lista-pol y Trans de SCU a SCP
    (SETQ bd  (CDR (MEMBER sublista bd))) ;me devuelve la bd apartir de sublista y lo guardo otra vez como bd
  ) ;fin del WHILE
  (SETQ lista-pol (REVERSE lista-pol)) ;invertimos el lista-pol, para que de en su orden correcto.
 
  ;;----- EXPORTAR DATOS A EXCEL -----
  (SETQ ar (OPEN "D:\\Ptos_polilinea.csv" "w")) ;creo un fichero que se llama Ptos_polilinea.csv en el disco D:
  (PRINC "    X,    Y\n" ar)
  ;;pongo el encabezamiento de que es cada dato para que me salga en Excel

  (SETQ cont 0
   vert 1)
  (REPEAT (VL-LIST-LENGTH lista-pol)
    (PRINC (STRCAT
    (RTOS (CAR (NTH cont lista-pol)) 2 2)"," ;coordenada X del punto
        (RTOS (CADR (NTH cont lista-pol)) 2 2)    ;coordenada Y del punto
           ) ;fin del STRCAT
           ar) ;fin del PRINC
    (PRINC "\n" ar) ;Coloca un espacio para que salga en columna los valores

    (SETQ cont (1+ cont))
    ) ;fin REPEAT

  (close ar) ;cierro el archivo que habia abierto
  (PROMPT "\nLos Datos en Archivo D:Ptos_polilinea.csv\n")
  (PRINC) ;evita que salga el ultimo resultado en pantalla
) ;fin del DEFUN  
(PROMPT "\nPuntos de una polilinea:(pto1)")
(PRIN1)

Luis Alberto Benitez

Mensajes : 112
Fecha de inscripción : 29/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por nolo Lun Dic 04, 2017 12:34 am

A ver, Luis Alberto, hay que crease una lista de los puntos de la polilinea  que se pueda convertir con strcat y append en un slo texto para pasarlo a la rutina c2clip.
Con mapcar es más fácil de lograr y como lo haces con una sola poli, pues mas fácil todavía ...
Código:
(defun c:lp2clip( / old 2clip ss sl)
;; puntos lwpolilinea al portapapeles
;; by nolo Nov 2017 en http://acadhispano.foroargentina.net/
(VL-LOAD-COM)
(setq old (getvar 'dimzin))
(setvar 'dimzin 0)
(defun 2clip(pasar / portapa)
;mardar el dato al portapapeles Original de Topoward
  (vlax-invoke (vlax-get (vlax-get
         (setq portapa (vlax-create-object "htmlfile"))
 'PARENTWINDOW)  'CLIPBOARDDATA)
 'setdata "Text"
  pasar)
  (vlax-release-object portapa )
(if (< (strlen pasar)500)
 (alert (strcat "Los datos \n"pasar"\nse han cargado en el portapapeles" ))
 (alert "Los datos se han cargado en el portapapeles")
)
)

(if (progn (princ(strcat(chr 10) "Seleccionar una polilínea : "))
 (setq ss (ssget "_+.:S:E"'((0 . "LWPOLYLINE"))))
 )
 (2clip(APPLY 'STRCAT (apply 'append
 (setq sl (entget (ssname ss 0))
 sl (mapcar 'cdr (vl-remove-if '(lambda(a) (/= (car a) 10)) sl))
 sl (mapcar '(lambda(a) (cons (chr 10)
 (mapcar '(lambda(b)(strcat (rtos b 2 4)(chr 9) ) ) a))
 )sl)
 ))))
 (princ (strcat (chr 10)"No ha seleccionado una polilinea ...."))
)
(setvar 'dimzin old)
(princ)
)
El dimzin en 0 es para que no se pierdan decimales que los he puesto con el rtos en 4
Espero te sirva
Un saludo

nolo

Mensajes : 182
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por BPP Lun Dic 04, 2017 12:41 am

Muchas gracias nolo, todo corre perfecto, a excepción de la columna correspondiente al numero de objeto, ya que la rutina los enumera a todos como 1 y no indica que coordenadas pertenecen al objeto 1, 2 o 3. tomando como ejemplo la imagen adjunta.
Espero que puedas ayudarme con esa corrección ya que por el momento no entiendo nada de lisp.

BPP

Mensajes : 14
Fecha de inscripción : 27/11/2017

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por nolo Lun Dic 04, 2017 10:42 am

Editado y corregido, copia de nuevo la rutina capon.
Esto ocurre por falta de ejemplo ya que solo me planteaba cambiar de numeración al objeto cuando cambiaba de capa.

De nada, me alegro de que te sirva aunque la rutina puede tener un problema si utilizas un excel no sajón con la coma en vez del punto para los decimales.
Me queda corregir eso para futuras rutinas similares ....
Un saludo

nolo

Mensajes : 182
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por Luis Alberto Benitez Lun Dic 04, 2017 3:57 pm

Nolo antes que nada gracias por responder a la requisitoria.
La rutina funciona muy bien pero para el sistema de coordenadas
Universal si podrías realizar para SCP , muy agradecido.
un Saludo
Luis

Luis Alberto Benitez

Mensajes : 112
Fecha de inscripción : 29/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por nolo Lun Dic 04, 2017 8:42 pm

Siempre me hago un lío con los términos UCS SCD y DCS
Mira a ver si es así como lo quieres
Código:

(defun c:lp2clip2( / old 2clip ss sl)
;; puntos lwpolilinea al portapapeles
;; corregido para que de coordenadas del ucs actual
;; by nolo Dicv 2017 en http://acadhispano.foroargentina.net/
(VL-LOAD-COM)
(setq old (getvar 'dimzin))
(setvar 'dimzin 0)
(defun 2clip(pasar / portapa)
;mardar el dato al portapapeles Original de Topoward
  (vlax-invoke (vlax-get (vlax-get
         (setq portapa (vlax-create-object "htmlfile"))
 'PARENTWINDOW)  'CLIPBOARDDATA)
 'setdata "Text"
  pasar)
  (vlax-release-object portapa )
(if (< (strlen pasar)500)
 (alert (strcat "Los datos \n"pasar"\nse han cargado en el portapapeles" ))
 (alert "Los datos se han cargado en el portapapeles")
)
)

(if (progn (princ(strcat(chr 10) "seleccionar una polilínea : "))
 (setq ss (ssget "_+.:S:E"'((0 . "LWPOLYLINE"))))
 )
 (2clip(APPLY 'STRCAT (apply 'append
 (setq sl (entget (ssname ss 0))
 sl (mapcar 'cdr (vl-remove-if '(lambda(a) (/= (car a) 10)) sl))
 sl (mapcar '(lambda(a) (cons (chr 10)
 (mapcar '(lambda(b)(strcat (rtos b 2 4)(chr 9) ) ) a))
 )(mapcar '(lambda(x)(trans x 0 1))sl));; aquí está la corrección
 ))))
 (princ (strcat (chr 10)"No ha seleccionado una polilinea ...."))
)
(setvar 'dimzin old)
(princ)
)

Por lo que veo, tu excel también es sajón, con los puntos como separador de decimales ??
Un saludo

nolo

Mensajes : 182
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por BPP Mar Dic 05, 2017 12:44 am

Una vez mas, mil gracias por todo NOLO.

Saludos

BPP

Mensajes : 14
Fecha de inscripción : 27/11/2017

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por Luis Alberto Benitez Mar Dic 05, 2017 2:19 am

Nolo. Gracias nuevamente por el inestimable
aporte.
La rutina funciona muy bien para el propósito
solicitado.
Un Saludo
Luis

Luis Alberto Benitez

Mensajes : 112
Fecha de inscripción : 29/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por Luis Alberto Benitez Mar Dic 05, 2017 2:09 pm

Nolo.
Estoy tratando de completar mas la rutina
para que realice con una polilinea Escala en Y
Aquí el que uso:
Código:
(DEFUN c:pto2 ()

  ; obtengo la polilinea
(PRINC "\nSeleccionar Perfil 2d : ")

(setq lista-pol nil)

(while
    (/=
        (setq ent (entsel "\nSeleccionar Perfil 2d : ")
              entidad (car ent)
              tipo (if entidad (cdr (assoc 0 (entget entidad))))
        )
        "LWPOLYLINE"
    )
(alert "No Selec. Perfil 2d : ")
);fin del WHILE

(setq bd (entget entidad))
  (WHILE
    (SETQ sublista (ASSOC 10 bd)) ;saco el punto de la bd con su indicativo es decir 10 . 0.0 0.0 (x,y)
    (SETQ lista-pol (CONS (TRANS(CDR sublista) 0 1) lista-pol)) ;saco el punto y lo añado a lista-pol y Trans de SCU a SCP =0 1
    (SETQ bd  (CDR (MEMBER sublista bd))) ;me devuelve la bd apartir de sublista y lo guardo otra vez como bd
  ) ;fin del WHILE
  (SETQ lista-pol (REVERSE lista-pol)) ;invertimos el lista-pol, para que de en su orden correcto.
 
  ;;----- EXPORTAR DATOS A EXCEL -----
(SETQ ar (OPEN "D:\\Ptos_polilinea.csv" "w")) ;creo un fichero que se llama Ptos_polilinea.csv en el disco D:
(PRINC " Progresiva,    Cota\n" ar)
  ;;pongo el encabezamiento de que es cada dato para que me salga en Excel
(PRINC "\nColocar Plano de Comparación : ")
(setq cmdact0 (getvar "cmdactive"))
(if (not linep_incl0) (setq linep_incl0 50.0))
(if (setq incl (getreal (strcat "\nColocar Plano de Comparación : <" (rtos linep_incl0) ">: ")))
(setq linep_incl0 incl)
(setq incl linep_incl0)
)


  (SETQ cont 0
   vert 1)
  (REPEAT (VL-LIST-LENGTH lista-pol)
    (PRINC (STRCAT
    (RTOS (CAR (NTH cont lista-pol)) 2 2)"," ;coordenada X del punto Escala 1:1
        (RTOS (+(/(-(CADR (NTH cont lista-pol)) incl)25)incl) 2 2)                ;coordenada Y del punto Escala 1:25=25,Escala1:10=10
           ) ;fin del STRCAT
           ar) ;fin del PRINC
    (PRINC "\n" ar) ;Coloca un espacio para que salga en columna los valores

    (SETQ cont (1+ cont))
    ) ;fin REPEAT

  (close ar) ;cierro el archivo que habia abierto
  (PROMPT "\nLos Datos en Archivo D:Ptos_polilinea.csv\n")
  (PRINC) ;evita que salga el ultimo resultado en pantalla
) ;fin del DEFUN
Dentro de tu rutina necesito separar la coordenada X (CAR) Y (CDR).
Desde ya Gracias
Saludos

Luis Alberto Benitez

Mensajes : 112
Fecha de inscripción : 29/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por nolo Mar Dic 05, 2017 7:59 pm

Veo que te pierdes con el mapcar y lamdda(x)
A ver si con este desmenuzado del lisp te aclaras un poco
Código:
(defun c:pto2( / );; detras de la barra irian las variables usadas
;; para que no se confundan con las de otra rutina cargada
;; no las pongas hasta que este funcionando todo bien

;; la definicion de subfunciones (la rutina c2clip completa)
(defun 2clip(pasar / portapa)
;mardar el dato al portapapeles Original de Topoward
  (vlax-invoke (vlax-get (vlax-get
         (setq portapa (vlax-create-object "htmlfile"))
 'PARENTWINDOW)  'CLIPBOARDDATA)
 'setdata "Text"
  pasar)
  (vlax-release-object portapa )
(if (< (strlen pasar)500)
 (alert (strcat "Los datos \n"pasar"\nse han cargado en el portapapeles" ))
 (alert "Los datos se han cargado en el portapapeles")
))

;; la entrada
(while
    (/=
        (setq ent (entsel "\nSeleccionar Perfil 2d : ")
              entidad (car ent)
              tipo (if entidad (cdr (assoc 0 (entget entidad))))
        )
        "LWPOLYLINE"
    )
(alert "No Selec. Perfil 2d : ")
)

;; las variables
(if (not linep_incl0) (setq linep_incl0 50.0))
(if (setq incl (getreal (strcat "\nColocar Plano de Comparación : <" (rtos linep_incl0) ">: ")))
 (setq linep_incl0 incl)
 (setq incl linep_incl0)
)

;; guardar estado variables que se modifican
(setq old (getvar 'dimzin))

;; lista con los puntos
(setq sl (mapcar'cdr ;;eliminamos código 10
 (vl-remove-if '(lambda(a) (/= (car a) 10)) ;; eliminamos todo lo que no tenga codigo 10
 (entget entidad))) ;; del entget de la poli
;; los puntos en coordenadas ucs
 sl (mapcar '(lambda(a) (trans a 0 1)) sl)
;; lo que creo que buscas
 slb (mapcar '(lambda(a)(list
 (car a);coordenada X del punto Escala 1:1
 (+(/(-(CADR a) incl)25)incl) ;coordenada Y del punto Escala 1:25=25,Escala1:10=10
 )) sl)
)
;; pasarlo al portapapeles
;; primero convertir cada lista de pares en string
;; separados por un tabulador (ascii 9) o \t y
;; retorno de carro al final (el 10 o el 13 en algunos programas) o \n
(setq slbs (mapcar '(lambda(a)(strcat
 (rtos (car a)2 4)(chr 9)(rtos(cadr a) 2 4)(chr 10)
 ))slb)
;; añadir encabezado
 slbs (cons(strcat "Progresiva"(chr 9)"Cota"(chr 10)) slbs)
;; encadenarlo todo en un string
 slbs (apply 'strcat slbs)
)

;pasarlo al portapapeles
(2clip slbs)
;; finalizar
;; variables como estaban
(setvar 'dimzin old)
;; final mudo
(princ)
);Parentesis final
Se trata únicamente de operar lista completas con el mapcar aplicando una función genérica '(lambda(x) (lo que sea a cada x de la lista))lista) que finalmente nos devuelve otra lista.
Es muy cómodo, luego puedes aplicar un operador 'strcat con el apply a toda la lista y así obtienes un solo string.
Yo utilizo agregar (chr n) en vez de barra n o barra t porque la barra invertida la pierde el editor del foro en muchas ocasiones, aunque en tu caso me han llegado todas ?????

Un saludo

nolo

Mensajes : 182
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por Luis Alberto Benitez Miér Dic 06, 2017 11:23 am

Nolo muy agradecido la rutina funciona de maravilla.
Un Saludo

Luis Alberto Benitez

Mensajes : 112
Fecha de inscripción : 29/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por BPP Sáb Dic 09, 2017 5:38 am

Hola nuevamente.

En el proceso de aplicar la rutina CAPON mediante el lisp CASO1 y CASO2, obtuve resultados un poco diferentes a lo esperado. En el archivo .DWG adjunto explico en que consiste la variación de lo obtenido vs lo que pretendo lograr.

Espero puedas ayudarme una vez mas con ese asunto amigo NOLO

De antemano muchas gracias

PD. Dejo el link del archivo, porque no pude adjuntar el archivo directamente

https://drive.google.com/open?id=1kk-RQxNV-cwxteeffyokrWTSE4cy9Z14

BPP

Mensajes : 14
Fecha de inscripción : 27/11/2017

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por nolo Sáb Dic 09, 2017 5:02 pm

Bueno, hay varias formas de hacerlo. La pregunta es ¿Como lo hacías antes?

Se puede hacer que calcule caso1, pare para pegar portapapeles y con los resultados caso1 continúe con caso2 hasta que encuentre la intersección de las entidades de la capa ancho con las de caso1. Sería un nuevo capon y una única rutina c:caso12 pero hay que saber con anticipación cual es la capa que tiene las entidades que van a cortar a las otras para caso2.

También que al hacer la tabla de caso1 deje las entidades con el código de numeración asociado a la entidad. Así primero se hace caso1 apagando la capa ancho y luego caso2 dejando solo la capa ancho. Eso solo nos obliga a hacer primero caso1 y después caso2 pero cada vez que añadamos una nueva entidad hay que volver a repetir caso1 y luego caso2 o nos daría un resultado erróneo. Parece mas ágil así y se resuelve con añadir unas líneas a la rutina capon.

¿Cómo lo hacías antes en la rutina del excel?
Lo mejor sería traspasar ese criterio a el lisp

Un saludo

Por cierto, hay mas de una entidad en ancho que cortan a una entidad en otra cada. Supongo que las dos entidades de ancho llevarían el mimo número de objeto de la otra capa. Correcto ?

nolo

Mensajes : 182
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por BPP Mar Dic 12, 2017 3:52 am

Hola a todos

Me disculpo por responder de varios días. En cuanto a tus preguntas nolo, la verdad que nunca utilice la rutina del excel para hacer este caso, siempre use la generación de caso1 y caso2 por separado. Ante este nuevo caso, lo que hice fue apagar la capa "ancho" y usar la rutina CASO1, obteniendo las coordenadas y nro de objeto en un determinado orden dado por la misma rutina, seguidamente apague todas las capas y deje prendida solo la capa "ancho" y asumí, que como cada linea de la capa ancho esta en la misma posición u orden que las del caso1, la rutina ordenaría los objetos de la misma forma que lo hizo al ejecutar CASO1 y solo tendría que relacionar los números de objetos para obtener una nueva tabla en la que se encuentren las lineas de CASO1 con sus coordenadas, orden y numero de objeto fusionadas con el largo de las lineas de la capa ancho, pero me tope con los ordena de manera distinta.
La rutina excel que tengo depende de lo que arroje el comando LIST, solo filtra la información tal cual viene, pero en este caso tampoco funciona porque con ese comando igual se ordenan los objetos de diferente forma.
En cuanto a la segunda pregunta, siempre existe el mismo numero de lineas con la capa "ancho" que el de los de CASO1, tal como se muestra en el archivo EJEMPLO.

Espero que sea posible modificar la rutina como dijiste para obtener el resultado deseado.
Saludos

BPP

Mensajes : 14
Fecha de inscripción : 27/11/2017

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por Luis Alberto Benitez Mar Dic 12, 2017 11:53 am

Nolo.
Quisiera saber cual es la Rutina para el caso 1 ya que la
rutina que está solo aplica el CASO 2.
Un Saludo

Luis Alberto Benitez

Mensajes : 112
Fecha de inscripción : 29/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por nolo Mar Dic 12, 2017 11:48 pm

BPP, 356 objetos 1811 líneas que serían unos cuantos intros por tu sistema
Utiliza esta nueva rutina capon  de manera que si apagas la capa anchos y haces capon1, aparte de ponerte el listado de puntos, se crea una lista temporal con la numeración de los objetos.
Si seguidamente haces capon2, te crea la lista de anchos?? con la misma numeración de cada objeto tal y como apareció en capon1

Un poco chapuza pero creo que te valdrá para ahorrarte tiempo.
Para hacer algo mas profesional habría que empezar de nuevo y llevaría su tiempo ..

Código:
(defun capon ( CFLAG / old cp 2clip distinc listap ss sl capas i datos dato )
;;pasa tabla datos líneas y polilineas al portapapeles
;; vrsion 2
;; utilizar (capon 1) para cargar puntos y numerar objetos
;; apagar las capas con los objetos numerados, encender la de los cruces
;; y ejecutar (capon 2) para obtener longitudes de los objetos que cruzan
;; by Nolo en
;;  http://acadhispano.foroargentina.net/t159-extraer-contenido-de-comando-list-en-un-txt
(VL-LOAD-COM)
(setq old (getvar 'dimzin))
(setvar 'dimzin 0)

(defun cp (p) (list (car p)(cadr p)))
(defun 2clip(pasar / portapa)
;mardar el dato al portapapeles Original de Topoward
  (vlax-invoke (vlax-get (vlax-get
         (setq portapa (vlax-create-object "htmlfile"))
 'PARENTWINDOW)  'CLIPBOARDDATA)
 'setdata "Text"
  pasar)
  (vlax-release-object portapa )
(if (< (strlen pasar)1000)
 (alert (strcat "Los datos \n"pasar"\nse han cargado en el portapapeles" ))
 (alert "Los datos se han cargado en el portapapeles")
)
)

(defun distinct(l) ; duplicados por YMG
(if l (cons (car l) (distinct (vl-remove (car l) l) )))
)

(defun listap( theobj / i l lt flag thelist) ;; por Nolo para lineas y polilineas 2d y 3d
;; lista con capa, puntos, longitud
(if (= (type theobj) 'ename) (setq theobj (vlax-ename->vla-object theobj)))

(list (vlax-get-property theobj 'Layer)
(if (setq flaG (member (vlax-get-property theobj 'ObjectName) '("AcDb3dPolyline""AcDbPolyline")))
(progn
 (setq flag (1+ (length flag)) i 0 l '() lt '()
 thelist(vlax-get-property theobj 'coordinates)
 thelist (vlax-safearray->list  (variant-value thelist))
 )
 (foreach a thelist (setq l (append l (list a)))
 (if (zerop (rem (setq i (1+ i)) flag))
 (setq lt (append lt (list l)) l '())
 ))
 (if (= flag 2)
 (mapcar '(lambda(a)(append a (list(vlax-get-property theobj 'Elevation))) ) lt)
 lt
 )
)
 (mapcar '(lambda(a)(vlax-safearray->list(variant-value
 (vlax-get-property theobj a))))
 '(StartPoint EndPoint))
)
(vlax-get-property theobj 'Length)
))

(princ (strcat (chr 10)"Seleccionar lineas o polilineas : "))
(if (setq ss (ssget '((0 . "LINE,LWPOLYLINE,POLYLINE"))))
(progn
(setq sl (vl-remove-if-not '(lambda(a)(=(type a)'ename)) (apply 'append (ssnamex ss)))
 ss (mapcar 'listap sl)
 capas (distinct(mapcar 'car ss))
 I 0
 lnobj (if (= CFLAG 1) '() (if lnobj lnobj '()))
)

(2clip(APPLY 'STRCAT (apply 'append

(if (and (= CFLAG 2)(/= lnobj nil))
(progn
(princ (strcat (chr 10) "Calculando Intersecciones ..."))
(setq sl (vl-remove nil (mapcar 'car
 (mapcar '(lambda(a)(apply 'append
 (mapcar '(lambda(b)(vl-remove nil
 (mapcar '(lambda(x y)
 (if (inters (cp(caadr a))(cp(cadadr a))(cp x)(cp y) t)
 (cons (car b)(vl-remove-if 'listp a)))
 ) (cadr b)(cdadr b) ))
 )lnobj))
 ) ss)) )
 lnobj '()
 sl (vl-sort sl '(lambda(a b) (< (car a)(car b))))
 sl (mapcar '(lambda(a)
 (list(strcat (cadr a)(chr 9)(rtos (last a) 2 4)(chr 9)(itoa(car a))(chr 10) ))
 ) sl)
))

(apply 'append
(mapcar '(lambda(x)
 (setq datos (vl-remove-if '(lambda(a)(/=(car a) x)) ss) )
 (MAPCAR '(LAMBDA(DATO  / n) (setq n 0 I (1+ I))
 (setq lnobj (cons (cons i (cdr dato)) lnobj))
 (mapcar '(lambda(a)
 (apply 'strcat (append
 (list(chr 10)(car dato) (chr 9))
 (IF (= CFLAG 1)
 (append
 (mapcar '(lambda(b)(strcat (rtos b 2 4)(chr 9) ) )a)
 (list (ITOA (setq n (1+ n))) (chr 9)) )
 (LIST(strcat (rtos (LAST DATO) 2 4)(chr 9) ))
 )
 (LIST (ITOA I))
 ))
 )(cadr dato))
 )DATOS)
) capas))

)

)))
) (princ (strcat (chr 10)"No hay líneas o polilineas en la selección ...."))
)
(setvar 'dimzin old)
(princ (strcat (chr 10) "Terminado ..."))
(princ)

)

Luis Alberto, no entiendo tu pregunta, la rutina capón es una rutina que se utiliza con un flag para variar su propósito (no tiene nada que ver con la que te preparé a ti) que era lo mas fácil de hacer cuando  BPP planteó su ayuda (mira los gráficos que acompañaba). Ahora con la dependencia de capas quizás fuera mejor hacerlo de otra forma mas secuencial.
El caso es que capon es una subrutina que habrá que llamar escribiendo (capon flag) y que he siplificado con dos definiciones de función ejecutable con el c: delante
(defun c:capon1 () (capon 1)) ;; lista capas, puntos, número de puntos y numera objetos
(defun c:capon2 () (capon 2));; lista capa, longitud del objeto y si se ha ejecutado capon1 con anterioridad busca la intersección del nuevo objeto con el antigua y si existe numera el objeto como en capon1, si no se ha ejecutado, la numeración será arbitraria

Con esa dependencia y esa cantidad de objetos, quizás no merezca la pena utilizar el portapapeles y conociendo cual es la capa sobre la que se utilizaría capon2, mejor mandar las dos tablas directamente a un csv para después abrirlo con excel.

Un saludo

nolo

Mensajes : 182
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por Luis Alberto Benitez Miér Dic 13, 2017 11:26 am

Nolo.
Mi propósito es conseguir simplemente copiar una polilinea 3d
con  valores de los vértices x, y, z . y estos valores al portapapeles.
Nuevamente Gracias.
Un Saludo

Luis Alberto Benitez

Mensajes : 112
Fecha de inscripción : 29/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por Luis Alberto Benitez Mar Dic 19, 2017 8:55 pm

Nolo.
Esta es la rutina que utilizo para exportar los valores de los vértices
X,Y,Z de una polilinea 3d.
Código:
(defun c:ERR (S)
(if (= S "Function cancelled")
(princ "\ NVERTEXT - cancelado: ")
(progn (princ "\nVERTEXT - Error: ") (princ S) (terpri)) ;_ programa
) ;_ if
(RESETTING)
(princ "VARIABLES DEL SISTEMA se han restablecido \ n")
(princ)
) ;_ err
(defun SETV (SYSTVAR NEWVAL)
(setq X (read (strcat SYSTVAR "1")))
(set X (getvar SYSTVAR))
(setvar SYSTVAR NEWVAL)
) ;_ setv
(defun SETTING ()
(setq OERR *ERROR*)
(setq *ERROR* ERR)
(SETV "CMDECHO" 0)
(SETV "BLIPMODE" 0)
) ;_ end of setting
(defun RSETV (SYSTVAR)
(setq X (read (strcat SYSTVAR "1")))
(setvar SYSTVAR (eval X))
) ;_ restv
(defun RESETTING ()
(RSETV "CMDECHO")
(RSETV "BLIPMODE")
(setq *ERROR* OERR)
) ;_ end of resetting

(defun DXF (CODE ENAME) (cdr (assoc CODE (entget ENAME)))) ;_ dxf

(defun VERTEXT (/ EN VLIST)
(setq EN (GET-EN))
(if (= (DXF 0 EN) "LWPOLYLINE")
(setq VLIST (GET-LWVLIST EN))
(setq VLIST (GET-PLVLIST EN))
) ;_ if
(WRITE-IT VLIST EN)
) ;_ vertext

(defun GET-EN (/ NO-ENT EN MSG1 MSG2)
(setq NO-ENT 1
EN NIL
MSG1 "\nSeleccionar una polilínea: "
MSG2 "\nNo Polyline seleccionada, intente de nuevo."
) ;_ setq
(while NO-ENT
(setq EN (car (entsel MSG1)))
(if (and EN
(or (= (DXF 0 EN) "LWPOLYLINE") (= (DXF 0 EN) "POLYLINE")) ;_ or
) ;_ and
(progn (setq NO-ENT NIL)) ; programa
(prompt MSG2)
) ;_ if
) ;_ while
EN
) ;_ get-en

(defun GET-LWVLIST (EN / ELIST NUM-VERT VLIST)
(setq ELIST (entget EN)
NUM-VERT (cdr (assoc 90 ELIST))
ELIST (member (assoc 10 ELIST) ELIST)
VLIST NIL
) ;_ setq
(repeat NUM-VERT
(setq VLIST (append VLIST (list (cdr (assoc 10 ELIST)))) ; adjuntar

) ;_ setq
(setq ELIST (cdr ELIST)
ELIST (member (assoc 10 ELIST) ELIST)
) ;_ setq
) ;_ repeat
VLIST
) ;_ get-lwvlist

(defun GET-PLVLIST (EN / VLIST)
(setq VLIST NIL
EN (entnext EN)
) ;_ setq
(while (/= "SEQEND" (DXF 0 EN))
(setq VLIST (append VLIST (list (DXF 10 EN))))
(setq EN (entnext EN))
) ;_ while
VLIST
) ;_ get-plvlist

(defun WRITE-IT (VLST EN / NEWVLIST MSG3 FNAME)
(setq NEWVLIST (mapcar '(lambda (X) (trans X EN 0)) ;_ lambda
VLST
) ;_ mapcar
MSG3 "Polyline vertex file"
FNAME (getfiled MSG3 "" "csv" 1)
F1 (open FNAME "w")
) ;_ setq
(WRITE-HEADER)
(WRITE-VERTICES NEWVLIST)
(setq F1 (close F1))
) ;_ write-it

(defun WRITE-HEADER (/ STR)
(setq STR " PUNTOS VERTICES DE POLYLINE")
(write-line STR F1)
(setq STR (strcat " X " "," " Y " "," " Z") ;_ Ecabezamiento separador de Espacios para Columnas en CSV
) ;_ setq
(write-line STR F1)
) ;_ write-header

(defun WRITE-VERTICES (NEWVLIST / XSTR YSTR ZSTR STR)
(foreach ITEM NEWVLIST
(setq XSTR (rtos (nth 0 ITEM) 2 4)
YSTR (rtos (nth 1 ITEM) 2 4)
ZSTR (rtos (nth 2 ITEM) 2 4)
STR (strcat XSTR (SPACES XSTR) YSTR (SPACES YSTR) ZSTR);_ strcat
) ;_ Fin setq
(write-line STR F1)
) ;_ foreach
) ;_ write-vertices

(defun SPACES (STR / FIELD NUM CHAR SPACE)
(setq FIELD 15
NUM (- FIELD (strlen STR))
CHAR " "
SPACE "," ;Para Separar en Columnas en el Archivo CSV
) ;_ setq
(repeat NUM (setq SPACE (strcat SPACE CHAR))) ;_ repeat
) ;_ spaces

(defun C:VTX1 ()
(SETTING)
(VERTEXT)
(RESETTING)
(princ)
) ;_ c:vtx

(prompt "\nIntroduzca VTX1 para iniciar")
Estos valores quisiera pasar al portapapeles.
Desde ya gracias
Un Saludo

Luis Alberto Benitez

Mensajes : 112
Fecha de inscripción : 29/03/2016

Volver arriba Ir abajo

Extraer contenido de comando LIST en un .txt Empty Re: Extraer contenido de comando LIST en un .txt

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Página 1 de 2. 1, 2  Siguiente

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.