AutoCad - Descomponer todos lo bloques dinámicos seleccionados

 
Vista:
Imágen de perfil de Hugo

Descomponer todos lo bloques dinámicos seleccionados

Publicado por Hugo (2 intervenciones) el 21/04/2022 03:58:31
Hola programadores, gracias por leer mi consulta, necesito descomponer todos los bloques dinámicos de nombre "ww" que están en el dibujo y he creado esta rutina:

(defun c:xpww ()
(setq xpsel (ssget "x" (list (cons 2 "ww"))))
(command "descomp" xpsel "")
)

El problema es que esta rutina solo selecciona "un" bloque dinámico "ww" y además; que no haya sido editado en el dibujo (estirado, espejeado, etc.), necesito seleccionarlos y descomponerlos todos de un solo golpe.

Agradezco cualquier ayuda
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

Descomponer todos lo bloques dinámicos seleccionados

Publicado por Gerardo (986 intervenciones) el 21/04/2022 09:08:19
Hola amigo

Dejo por aquí la explicación teórica por si te interesa o a cualquier otro que siga el hilo - luego al final el código que debe funcionar.

No es tan simple como incluir codigos DXF en el filtro del ssget, aunque tampoco es difícil

Los bloques dinámicos al insertarse con sus propiedades originales guardan en el código 2 de su lista de definición el nombre original, en tu caso '(2 . "ww") pero una vez que se modifica alguna de sus características dinámicas se convierte en un bloque anónimo p.ej (2 . "*U123"), y lo que tenemos en la lista de definición para llegar al nombre original es un vínculo a un reactor que se dispara al modificar parámetros. Ese vínculo es el que guarda en un diccionario el nombre del bloque original.

Si el filtro que pusiste solo te reconoce una inserción, debe ser porque solo tienes una que no se le han modificado parámetros.

Entonces, para solucionarlo hay al menos dos caminos:

1-Seguir el reactor, para crear un filtro como así: (list '(0 . "INSERT") '(2 . "*U*") '(102 . "{ACAD_XDICTIONARY") (cons 360 nombredeentidaddeldiccionario)...

2-Seleccionar todos los bloques candidatos, y luego revisar la seleccion quedándote solo con los que cumplan. Para eso el DXF no tiene un código que dé el nombre original, pero el Active-X si nos muestra una propiedad de los bloques dinámicos llamada EffectiveName, que guarda dicho nombre.

La segunda opción es por mucho más fácil de comprender y de implementar, así que te dejo solución con esa.

Primero seleccionar todos los bloques llamados "ww" y todos los anónimos (cuyo nombre siempre comienza con *U).

1
(setq xpsel (ssget "X" '((0 . "INSERT")(2 . "`*U*,ww"))))

Luego obtener para cada uno el objeto ActiveX y revisar sus propiedades, si es dinamico y si lo es, el nombre efectivo. En caso de que no cumpla, sacarlo de la selección

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(setq i	0)
(repeat (sslength xpsel)
	(setq nombre	(ssname xpsel i)
			i			(1+ i)
			objeto	(vlax-ename->vla-object nombre)
	)
	(if	(not
				(and
					(= (vlax-get-property objeto 'IsDynamicBlock) :vlax-true)
					(= (vlax-get-property objeto 'EffectiveName) "ww")
				)
			)
			(ssdel nombre xpsel)
	)
)

Y entonces ya tienes en el conjunto de seleccion solo los bloques que querías para aplicarle cualquier comando o función.

1
(command "_explode" xpsel)


Ahora todo más orgánico: si ya tenemos el objeto activex, mejor en vez de modificar la seleccion vamos explotando de una vez con el método Explode del objeto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(defun c:xpww ( / i xpsel nombre objeto)
	(if	(setq i	0
					xpsel (ssget "X" '((0 . "INSERT")(2 . "`*U*,ww")))
			)
			(repeat (sslength xpsel)
				(setq nombre	(ssname xpsel i)
						i			(1+ i)
						objeto	(vlax-ename->vla-object nombre)
				)
				(if	(and
							(= (vlax-get-property objeto 'IsDynamicBlock) :vlax-true)
							(= (vlax-get-property objeto 'EffectiveName) "ww")
						)
						(progn
							(vlax-invoke-method objeto 'Explode)
							(vlax-invoke-method objeto 'Delete)
						)
				)
			)
	)
)

Ojo que después de explotarlo lo hemos borrado, ya que el metodo Explode no es como el comando del mismo nombre que solo deja los objetos extraídos, sino que el método hace una copia, dejando lo explotado sobre el bloque original.
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
Imágen de perfil de Hugo

Descomponer todos lo bloques dinámicos seleccionados

Publicado por Hugo (2 intervenciones) el 21/04/2022 12:20:09
Funciona a la perfección !!, mil gracias Gerardo, no solo por el comando sino también por toda la explicación prolija y concisa, me pondré a estudiarlo dede ya.
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