Sustraer y crear lista

Ver el tema anterior Ver el tema siguiente Ir abajo

Sustraer y crear lista

Mensaje por carlosmgilp el Vie Oct 21, 2016 5:07 am

Hola muchachos como han estado.

Quería ver si me pueden sacar de algunas dudas.

Tengo la siguiente variable.

Código:
(setq lst-dxf-panel '(-3 ("MELIAR_MPANEL" (1000 . "Edge = Weft") (1000 . "Panel ID = 1.1"))))

O puede ser de esta manera la lista.

Código:
(setq lst-dxf-panel2 '(-3 ("MELIAR_MPANEL" (1000 . "Edge = Warp") (1000 . "Description = created by mesh to panel, panel 1") (1000 . "Shear Strain =0.393%") (1000 . "Panel ID = 1.1"))))

De esa lista necesito tres ejemplos
como sustraer la lista (1000 . "Panel ID = 1.1")
como sustraer el texto "Panel ID = 1.1"
como sustraer el valor de panel id en este caso "1.1" ese valor puede variar.

Ahora suponiendo que tengo el valor del id guardado en una variable como puedo construir una nueva lista.

De ejemplo digamos que el valor id es 3.5

Código:
(setq valor-id "3.5")

Esta es la lista que quiero construir, osea como debería quedar.
En este caso para que se me guarde en la variable como lista lo precedí del apostrofe (Quote)
Pero si elimino el apostrofe y lo coloco todo con la función list no me funciona y no se porque.
Pero es con esto, porque si hago una prueba como (list 1 2 3) ahí si funciona.

Código:
(setq lst-dxf-truncar '(-3 ("MELIAR_MPANEL" (1000 . "* = Truncate") (1000 . "Panel ID = 3.5") (1000 . "Poly ref = 3.5"))))

Tendría que ser algo así. Este no funciona es de ejemplo.
Metería en la lista la variable valor-id Claro con el strcat para que quede todo el texto unido, pero lo que quiero es poder meter el valor y cuando necesite modificarlo, solo lo haría en el valor de la variable

Código:
(setq lst-dxf-truncar (list -3 ("MELIAR_MPANEL" (1000 . "* = Truncate") (1000 . (strcat "Panel ID = " valor-id)) (1000 . (strcat "Poly ref = " valor-id)))))

Por ultimo necesito saber el valor de Poly ref originalmente este valor es un numero entero pero debe extraerse de las xdata,
En el ejemplo de arriba lo coloque como si fuera el mismo valor del id pero lo hice así para entender como anexarlo a la lista.
Quiero saber cual fue el ultimo valor que se agrego al dibujo para yo sumarle 1 para que no sea repetido su valor.
Por ejemplo si el ultimo valor encontrado fue 1128 el próximo que colocaría seria (+ 1128 1) osea 1129

Aquí adjunto un dwg donde aparece ese valor de Poly ref

https://www.dropbox.com/s/ljm953bifa3gf40/Poly%20ref.dwg?dl=0

Bueno espero puedan ayudarme.
Y de antemano muchas gracias.

Saludos.

carlosmgilp

Mensajes : 65
Fecha de inscripción : 17/03/2016
Edad : 34
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer y crear lista

Mensaje por robierzo el Vie Oct 21, 2016 8:22 pm

Primero: tienes mal definida la lista principal.
Sería así:
Código:
(setq lst-dxf-panel2 (list -3 (list "MELIAR_MPANEL"
           '(1000 . "Edge = Warp")
           '(1000 . "Description = created by mesh to panel, panel 1")
           '(1000 . "Shear Strain =0.393%")
           '(1000 . "Panel ID = 1.1")
           )
            ))
Respuesta a las tres primeras preguntas:
Código:
(setq pregunta1 (last (cadr lst-dxf-panel2)))
(setq pregunta2 (cdr pregunta1))
(setq pregunta3 (substr pregunta2 12))

Repuesta a la nueva lista:
Código:
(setq nueva_lista (list -3 (list "MELIAR_MPANEL"
             '(1000 . "* = Truncate")
             (cons 1000 (strcat "Panel ID = " nuevo_ID))
             (cons 1000 (strcat "Poly ref = " nuevo_ID))
           )))
El resto no entiendo muy bien lo que quieres decir.

robierzo

Mensajes : 35
Fecha de inscripción : 17/03/2016
Localización : La Coruña

Ver perfil de usuario http://www.selmotopografia.es

Volver arriba Ir abajo

Re: Sustraer y crear lista

Mensaje por carlosmgilp el Vie Oct 21, 2016 9:44 pm

Hola robierzo, como has estado.

Gracias por tu ayuda.

Con respecto a la pregunta de sustracción de los valores funciona bien, pero si varia de posición Panel ID el resultado es erróneo, no se si sabes de otra forma como pueda localizar ese valor.

En este ejemplo que coloco moví de posición Panel ID porque no lo devuelve en la misma posición siempre, fue algo que no vi sino hasta ahorita.

Código:
(setq lst-dxf-panel '(-3 ("MELIAR_MPANEL" (1000 . "Edge = Warp") (1000 . "Panel ID = 1.1") (1000 . "Description = created by mesh to panel, panel 1") (1000 . "Shear Strain =0.393%") )))

Lo de crear la lista, si pude hacerlo esta mañana y lo compare y esta igual a la tuya.

Con respecto al final que seria el valor de Poly ref
En este caso que fue el dwg que adjunte anteriormente, son grupos que contiene entidades con polilineas (No necesariamente tiene que estar en grupo o ser solo polilineas)
Ellos tienen asociados en los códigos dxf el -3 que es donde registran las entidades con valores necesarios para posteriormente utilizarlo.
De ahí sale la variable que coloque para sustraer el valor id en las preguntas anteriores. pero en este caso fue seleccionando una entidad.
Y yo necesito saber cual fue el ultimo o el mayor valor de Poly ref que se utilizo en todo el dibujo, para que a la próxima entidad que dibuje y le asocie los datos no me quede repetido.
Algo que me imagino seria revisar todas las entidades creadas y extraer el valor -3 y comprobar si contiene Poly ref y si tiene pues ir comparando cual tiene el valor mayor.

Espero me hayas entendido ahora.

Nuevamente mil gracias.

Saludos.

carlosmgilp

Mensajes : 65
Fecha de inscripción : 17/03/2016
Edad : 34
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer y crear lista

Mensaje por robierzo el Vie Oct 21, 2016 10:56 pm

Lo más sencillo sería meter el texto "MELIAR_MPANEL" también en un par punteado. Y además, poner distintos códigos a cada par punteado. Tal como esto:
Código:
(setq lst-dxf-panel2 '(-3
       ((1000 . "MELIAR_MPANEL")
 (1001 . "Edge = Warp")
           (1002 . "Description = created by mesh to panel, panel 1")
           (1003 . "Shear Strain =0.393%")
           (1004 . "Panel ID = 1.1")
                 )
            ))

Código:
(setq sublista (cadr lst-dxf-panel2)))
De esta forma, con un simple:
Código:
(setq lista_ID (cdr (assoc 1004 sublista)))

Hallarías el valor asociado al código 1004, esté donde esté dentro de la lista. Lo mismo para buscar el resto de códigos.

Si no te vale así, tendrías que tirar de foreach, supongo.

robierzo

Mensajes : 35
Fecha de inscripción : 17/03/2016
Localización : La Coruña

Ver perfil de usuario http://www.selmotopografia.es

Volver arriba Ir abajo

Re: Sustraer y crear lista

Mensaje por carlosmgilp el Sáb Oct 22, 2016 6:35 am

Hola hermano.

Muchísimas gracias por la información.

Un saludo y aquí estoy a la orden.

Saludos.

carlosmgilp

Mensajes : 65
Fecha de inscripción : 17/03/2016
Edad : 34
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer y crear lista

Mensaje por nolo el Sáb Oct 22, 2016 5:45 pm

O utilizando el mapcar y el lambda sobre la lista
Primero sacamos una lista sencilla
Código:
(setq lista (cdr(cadr lst-dxf-panel2)))
y luego, lo mejor sería crear una función para cada caso

Sacar un valor
Código:
(defun valor_de ($name lista / v)
(setq v (car(vl-remove-if-not '(lambda(a)(wcmatch a (strcat $name "*")))(mapcar 'cdr lista)))
 v(if v (substr v(+ 2(vl-string-position (ascii "=") v))))
))
prueba
Código:
(setq v (valor_de "Description" lista))

Luego añadir o modificar
Código:
(defun lnew  ($name v lista )
 (if (valor_de $name lista)
 (mapcar '(lambda(a)
 (if (wcmatch (cdr a)(strcat $name "*"))
 (cons 1000 (strcat $name " = " v))
 a
 )
 )lista)
 (append lista (list(cons 1000 (strcat $name " = " v))))
))
Prueba
Código:
(setq new_lista (lnew "Description" "jauna" lista))
o
(setq new_lista (lnew "Dscorchon" "jauna" lista))

Y finalmente, la mas sencilla que es la de borrar
Código:
(defun ldel ($name lista)
 (vl-remove-if '(lambda(a)(wcmatch (cdr a)(strcat $name "*"))) lista)
)
Prueba
Código:
(ldel "Description" lista)

Un saludo
Edito porque ya he visto el dwg .....

Para conocer el máximo de los valores Poly ref que llevas creados puedes utilizar esta función:
Código:
(defun max_de($name / sel sell)
(if (and
 (setq sel (ssget "_x" '((-3 ("MELIAR_MPANEL")))))
 (setq sell (vl-remove nil
 (mapcar '(lambda(a)
 (if (setq a (entget a '("MELIAR_MPANEL"))
 a (assoc -3 a)
 a (cdr(cadr a)) )
 (if (setq a (valor_de $name a))
 (distof a)
 )
 )
 )(mapcar 'cadr (ssnamex sel)))
 ))
 )
(apply 'max sell)
))
Así :
Código:
(setq cuantos (max_de "Poly ref"))

Otro saludo

nolo

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer y crear lista

Mensaje por carlosmgilp el Dom Oct 23, 2016 9:29 pm

Hola nolo, como has estado.

Muchas gracias por tu ayuda también, ya me guarde las funciones para cada vez que las necesite. Jejeje.
Están buenas también, mil gracias.

nolo otra pregunta, tu que sabes para buscar el valor máximo de Poly ref en todo el dibujo.
Viendo ya todo esto, puedo hacer una selección total de todo el dibujo y por medio de un foreach puedo extraer el valor con alguna función que me facilitaste y ya por ultimo escoger el máximo. Ya con esto lo podría solucionar.
Pero viene el problema es cuando las entidades están dentro de un bloque o cosas así.

Viendo que esto es como trabajar con capas, diccionarios y cosas así, pues entiendo que debería irme por (tblsearch "appid" "MELIAR_MPANEL") y tratar de sacar los valores por ahí y así no tocar las entidades.

Pero no logro dar con el método para hacerlo.
Bueno si sabes de algo por esa parte te lo agradezco.

Un saludo.

carlosmgilp

Mensajes : 65
Fecha de inscripción : 17/03/2016
Edad : 34
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer y crear lista

Mensaje por nolo el Lun Oct 24, 2016 12:23 am

Esto se ha desfasado, te he respondido al final del anterior mensaje.
Lo edité y le añadí una función para extrer el máximo después de analizar el dwg que solo tiene grupos, no bloques.Habría que añadir a la rutina la selección de todos los bloques y la busqueda de sus subentidades.

También habría que prever unos reactor para cuando se borran, copian o se convierten en bloques.
El tema se puede liar todo lo que se quiera.

Un saludo

nolo

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer y crear lista

Mensaje por carlosmgilp el Lun Oct 24, 2016 1:47 am

Hola hermano como estas.

Si se que no habían bloques pero uno piensa en todo lo que pueda surgir. Jejeje.
Pensé que seria mas fácil como cuando se trabaja con las colecciones y cosas así. Jejeje.
Pero por lo visto se complica mas de la cuenta.
Todo funciona muy bien mil gracias por la ayuda.

Se les quiere y muchas gracias a todos.

carlosmgilp

Mensajes : 65
Fecha de inscripción : 17/03/2016
Edad : 34
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Re: Sustraer y crear lista

Mensaje por Contenido patrocinado Hoy a las 11:05 pm


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

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