AutoCad - ¿Cómo obtener el nombre original de un bloque anónimo en autolisp?

 
Vista:
Imágen de perfil de Jorge Alberto
Val: 14
Ha aumentado 1 puesto en AutoCad (en relación al último mes)
Gráfica de AutoCad

¿Cómo obtener el nombre original de un bloque anónimo en autolisp?

Publicado por Jorge Alberto (8 intervenciones) el 07/02/2018 20:06:03
Tengo un problema que consiste en obtener el nombre original de un bloque que al copiarlo se combirtio en anónimo.
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

¿Cómo obtener el nombre original de un bloque anónimo en autolisp?

Publicado por Gerardo (986 intervenciones) el 20/02/2018 17:36:49
Hola

Supongo que te refieres a un bloque dinámico. (Porque hay bloques anónimos que nacen siendo anónimos y no tienen "una versión original", o mas bien su nombre "anónimo" -*@###- es su nombre original. Por ejemplo los puntos de control de las cotas, elementos importados entre versiones de CAD no compatibles 100% o bloques que desde una rutina uno decide crearlos anónimos)

bien, la forma mas simple es con visual lisp, utilizando la propiedad EffectiveName de los bloques
Puedes hacer una comprobación de que se trate de bloques dinámicos, y si da positiva obtener esa propiedad:
1
2
3
4
(setq obj (vlax-ename->vla-object (car (entsel))))
(if (= (vlax-get-property obj 'IsDynamicBlock) :vlax-true)
	(setq name (vlax-get-property obj 'EffectiveName))
)
Con autolisp puro también se puede, esa información está en diccionarios de extensión de las inserciones o referencias a bloques, por lo que debes buscar dentro del diccionario de extension del objeto tipo "INSERT" el diccionario AcDbBlockRepresentation y dentro de este el xrecord AcDbRepData, y en su lista de definición DXF, la entidad en el codigo 340 contiene los datos de definicion del bloque original.

Parece complicado? No lo es tanto, solo llegue a eso con un poquito de ingenieria inversa dibujando un bloque dinamico y revisando sus componentes con la funcion entget. Con eso salio la segunda de dos funciones que te dejo a continuacion, la primera lo resuelve con visuallisp y la segunda con autolisp puro desde los diccoinarios


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
(defun c:test1 nil
	(alert
		(strcat
			"Nombre original: "
			(vlax-get-property
				(vlax-ename->vla-object (car (entsel)))
				'EffectiveName
			)
		)
	)
)

(defun c:test2 ( / inlent extdict BlkRep RepData namedat)
	(alert
		(strcat
			"Nombre original: "
			(cdr
				(assoc
					2
					(if
						(and
							(setq inlent (entget (car (entsel))))
							(setq extdict (cdadr (member '(102 . "{ACAD_XDICTIONARY") inlent ) ) )
							(setq BlkRep (cdr (assoc -1 (dictsearch extdict "AcDbBlockRepresentation") ) ) )
							(setq RepData (dictsearch BlkRep "AcDbRepData") )
							(setq namedat (cdr (assoc 340 RepData)))
						)
						(entget namedat)
						inlent
					)
				)
			)
		)
	)
)
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