AutoCad - Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

 
Vista:
Imágen de perfil de francisco

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por francisco (7 intervenciones) el 03/07/2023 04:31:16
Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro de otro XREF
Ejemplo, el XREF principal, el que se visualiza en pantalla, se llama ONE, pero dentro del archivo ONE, ya existía un XREF, dentro de ONE, que se llama TWO.
Yo necesito extraer ese nombre de Xref (TWO) a una variable.
Por favor.
Y muchas gracias por la ayuda chicos !!!
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

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por Gerardo (986 intervenciones) el 03/07/2023 15:52:56
hola

pues no das mucha información del contexto, es diferente si el usuario selecciona en pantalla que si la rutina tiene los criterios de busqueda para repasar los bloques del archivo localizando el de interés (y cuales serían esos criterios).

Por ejemplo con una selección en pantalla este código te da el nombre del bloque anidado en el segundo nivel (en tu ejemplo el bloque "Two"

1
2
3
(if (setq tmp (cadr (reverse (last (nentsel)))))
	(setq variable (cdr (assoc 2 (entget tmp))))
)
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
Imágen de perfil de francisco

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por francisco (7 intervenciones) el 03/07/2023 18:39:31
Amigooooooooooo, justo era lo que buscaba !!!!, recontra GRACIAS !!!
Sos grandeeeeee !!!!!
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 francisco

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por francisco (7 intervenciones) el 03/07/2023 18:42:56
Amigo otra pequeña consulta por favor
dónde puedo leer, ojalá en español, algo al estilo de Manual explicativo de cada uno de esos "comandos", que pusiste en la rutina con q me ayudaste ? y en general de todos los comandos ?
Ejemplo:
reverse
last
nentsel
y todos los demás existentes
Para yo aprender qué hacen específicamente cada uno
Gracias !!!!
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

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por Gerardo (986 intervenciones) el 03/07/2023 23:21:42
Con todo gusto

Hay poco en español, incluso la ayuda de autocad cuando la pones en español, esa referencia de autolisp sigue quedando en ingles

En la seccion de manuales de este mismo sitio hay uno que a mi me ayudó mucho cuando estaba aprendiendo. Es muy viejo pero me parece que sigue siendo muy válido y lo mejor que se consigue en español. Te paso el link

https://www.lawebdelprogramador.com/cursos/AutoCad/243-Curso-practico-de-personalizacion-y-programacion-bajo-AutoCA.html


Esa referencia de funciones de autolisp está en el módulo once.

A continuación te voy a explicar un par de cosas sobre mi código
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

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por Gerardo (986 intervenciones) el 03/07/2023 23:22:21
Las xref dentro de autocad se manejan como bloques comunes. El único detalle es que tienen "una banderita" que las marca como referencias externas. Quiere decir que buscar una referencia externa dentro de otra es muy similar a buscar un bloque anidado dentro de otro.

Hay una función llamada "entsel" que seleccionas una entidad y devuelve un nombre de la misma que en realidad es la posicion de memoria donde se aloja temporalmente. La función nentsel es como entsel pero si la usas dentro de objetos complejos que contienen otras entidades no te devuelve el objeto general, sino la entidad interna. Entonces si con nentsel tocas una linea o texto que es parte de un bloque lo que te devuelve es el nombre de entidad de esa linea o texto... y unos cuantos datos más, por ejemplo, en tu xref anidada devolverá algo como esto:

1
2
3
4
5
(	<Entity name: 14717088e40>
	(100.356 77.1685 0.0)
	((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0) (81.3732 49.0 0.0))
	(<Entity name: 14717088eb0> <Entity name: 14717088ee0>)
)
Es una lista de 4 objetos, donde el primero es el nombre de entidad de lo que tocaste que estaba dentro de la xref.
El segundo son las coordenadas en las que picaste al seleccionar
El tercero es una matriz de transformación que sirve para carcular escala, rotación y posición absoluta de las entidades cuando el bloque está rotado o escalado.
Y el cuarto que es el que nos interesa es una lista de los objetos contenedores, en este caso los bloques o xrefs. Está ordenada de más interno a más externo. Por lo tanto <Entity name: 14717088eb0> es ONE y <Entity name: 14717088ee0> es TWO
La primera línea de mi código deja en la variable TMP el penúltimo elemento de esa lista de objetos. Fijate que si hubiera solo una xref sin otra anidada esa lista sería de solo un elemento y entonces no se obtendría nada y el if no se cumpliría.

Lo otro ya lo comprenderás leyendo el manual, pero básicamente el formato DXF trabaja la base de datos del dibujo con listas de pares de datos, donde el primero es un codigo que se refiere al tipo de dato y el segundo es el valor. El dato 2 de un bloque es el nombre. Entonces con entget obtengo la lista de definicion del objeto que hay en TMP, assoc 2 me devuelve el par que contiene el nombre que es de la forma (2 . "TWO"), y cdr me devuelve la segunda parte de ese par, o sea "TWO".
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 francisco

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por francisco (7 intervenciones) el 03/07/2023 23:57:13
Hola de nuevo amigo, existe algo parecido a NENTSEL pero q sea múltiple ?
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

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por Gerardo (986 intervenciones) el 04/07/2023 00:13:25
Pues si. Hay opciones. No como una simple seleccion porque eso no tiene sentido dentro de como trabaja autocad. Es decir, no puedes seleccionar con selecciones de barrido pretendiendo tomar un objeto dentro de un bloque sin tomar el bloque.

Sin embargo hay dos soluciones a la vista.

Una es utilizar la función ssget, que permite selecciones múltiples. SSGET tiene un parámetro de modo, que si eliges este "_:V" selecciona objetos anidados como nentsel (quizás parezca que te hablo en chino, pero cuando leas sobre ssget y veas los parámetros de modo se hará comprensible) Luego el parámetro ":N" podría darte información adicional que te muestre los bloques que anidan. Yo nunca lo he usado de esa forma, pero lee la función en el manual y has tus pruebas y nos cuentas

La otra posible solución es simplemente anidar llamadas consecutivas a nentsel dentro de un bucle, de manera que mientras el usuario siga seleccionando se le siga pidiendo que repita.
Pones
1
2
3
(while (setq seleccion (nentsel))
    cuerpo
)
y lo que está en cuerpo se repetirá para cada objeto seleccionado hasta que el usuario en vez de seleccionar de un intro.
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 francisco

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por francisco (7 intervenciones) el 04/07/2023 00:34:39
Hola de nuevo, voy a revisar las opciones q me diste, porq definitivo, es sí o sí q necesito q sea seleccionar múltiples objetos en un solo intento, no de uno en uno
Gracias bro, luego regreso y te platico cómo me fue
Gracias por tu paciencia !!!
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

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por Gerardo (986 intervenciones) el 04/07/2023 02:34:29
listo

Multiples objetos es muy simple, con ssget. Yo explané mi respuesta porque me preguntaste por "algo como nentsel" y la caractrística de nentsel es que selecciona objetos anidados dentro de bloques.
Pero con solo poner (ssget) ya tomas un conjunto de seleccion con todo lo que el usuario elija. Claro, luego debes recorrer esa seleccion, posiblemente con ssname tomando cada elemento según lo que quieras hacer con ello.

Cuando veas todas las funciones se seleccion se te aclarará el panorama
suerte!
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 francisco

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por francisco (7 intervenciones) el 04/07/2023 05:10:17
Hola de nuevo, pues la idea fundamental, es la misma, extraer el nombre del xref, dentro de otro xref
solo q me sucede mucho de q debo seleccionar siempre más de un objeto, por eso la idea de si existe algo al estilo SSGET, pero q extraiga el nombre de ese bloque, como lo ahce el NENTSEL.
Ya q yo había hecho las pruebas con SSGET y no lo vi, solo lanza el nombre del primer XREF
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

Hola, ayuda por favor, cómo extraer con Lisp, el NOMBRE del archivo de un XREF, pero que está dentro

Publicado por Gerardo (986 intervenciones) el 04/07/2023 14:29:47
dale pues
Si quieres chequea este código, revisa lo que hace cada función que desconozcas para que sea bien comprensible el procedimiento

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(alert
	(vl-princ-to-string
		(if (setq ss (ssget ":N"))
			(vl-remove
				'nil
				(mapcar
					'(lambda(A / nent lent nam)
						(if (and
								 (= (type (setq nent (cadr (reverse A)))) 'ENAME)
								 (= (cdr (assoc 0 (setq lent (entget nent)))) "INSERT")
								 (= (logand (cdr (assoc 70 (tblsearch "BLOCK" (setq nam (cdr (assoc 2 lent)))))) 4) 4)
							)
							nam
						)
					)
					(ssnamex ss)
				)
			)
		)
	)
)

Las 3 condiciones del if, anidadas dentro del And son:
1- La corroboración de que el penúltimo elemento de la información devuelta por ssnamex es un nombre de entidad (tipo ENAME), igual que en el nentsel, eso nos avisa que hay bloque anidado.

2-La corroboración de que esa penultima entidad es una inserción de un bloque

3-La corroboración de que ese bloque sea una referencia externa. El código 70 de las entidades es un entero que suma una serie de valores unicos. En el caso de los bloques, el valor #4 es que se trata de referencias externas, por lo tando si hay un bloque anidado pero que no es xref sino un bloque interno del dibujo, en este caso el bit 4 vale 0, y esta condición no se cumple. Este es el único punto que creo que podria quedar confuso si no eres programador o no conoces la lógica de bits dentro de un byte, pero una vez que veas y domines las funciones podemos profundizar en esto de las banderas que en realidad es bastante sencillo una vez que lo comprendemos.
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