Sustraer y crear lista
3 participantes
Página 1 de 1.
Sustraer y crear lista
Hola muchachos como han estado.
Quería ver si me pueden sacar de algunas dudas.
Tengo la siguiente variable.
O puede ser de esta manera la lista.
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
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.
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
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.
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 : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Re: Sustraer y crear lista
Primero: tienes mal definida la lista principal.
Sería así:
Repuesta a la nueva lista:
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")
)
))
- 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))
)))
Re: Sustraer y crear lista
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.
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.
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 : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Re: Sustraer y crear lista
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:
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.
- 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)))
- 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.
Re: Sustraer y crear lista
Hola hermano.
Muchísimas gracias por la información.
Un saludo y aquí estoy a la orden.
Saludos.
Muchísimas gracias por la información.
Un saludo y aquí estoy a la orden.
Saludos.
carlosmgilp- Mensajes : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Re: Sustraer y crear lista
O utilizando el mapcar y el lambda sobre la lista
Primero sacamos una lista sencilla
Sacar un valor
Luego añadir o modificar
Y finalmente, la mas sencilla que es la de borrar
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:
Otro saludo
Primero sacamos una lista sencilla
- Código:
(setq lista (cdr(cadr lst-dxf-panel2)))
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))))
))
- 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))))
))
- 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)
)
- 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)
))
- Código:
(setq cuantos (max_de "Poly ref"))
Otro saludo
nolo- Mensajes : 182
Fecha de inscripción : 17/03/2016
Re: Sustraer y crear lista
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.
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 : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Re: Sustraer y crear lista
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
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 : 182
Fecha de inscripción : 17/03/2016
Re: Sustraer y crear lista
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.
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 : 149
Fecha de inscripción : 17/03/2016
Edad : 42
Localización : Venezuela
Temas similares
» Sustraer valor de una lista y después sustituirlo
» Crear Rutina Lisp para Crear Tipo de Linea
» Transponer una lista
» Elemento lista
» Ordenar lista
» Crear Rutina Lisp para Crear Tipo de Linea
» Transponer una lista
» Elemento lista
» Ordenar lista
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|