AutoCad - Seleccionar elementos dentro de polilínea

 
Vista:
Imágen de perfil de Juanma
Val: 171
Bronce
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Seleccionar elementos dentro de polilínea

Publicado por Juanma (140 intervenciones) el 02/09/2023 17:09:11
Hola a todos,
Tengo una rutina lisp con la que seleccionó algunos objetos ( normalmente una polilínea con líneas círculos o polilineas dentro) y me los guarda en un archivo aparte con un nombre determinado.
La polilineas representan piezas de chapa a cortar en una mesa cnc de corte.
Si esas piezas fuesen sólo una polilínea, podría programar que las guarde cada una por separado, y sería mucho más útil y rápido. Pero como a veces tienen huecos o líneas(marcas en las piezas)no sé cómo hacerlo.
La idea sería que al seleccionar todas las polilíneas de los contornos de las piezas, crease un archivo con cada una incluyendo todo lo que quede dentro de ellas.
También serviría crear un archivo con los objetos de cada capa, ya que suelo poner una capa por cada pieza distinta
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

Seleccionar elementos dentro de polilínea

Publicado por Gerardo (986 intervenciones) el 02/09/2023 22:15:16
Hola

Todo un tema.

Por capas es sencillo, lista todas las capas del dibujo, repasa una por una y ve filtrando por ellas.
Puede ser solo las que tengan cierta característica. Ya sea una caracteristica en el nombre de la capa o el color y para las que cumplan seleccionar todo lo que esté en dicha capa, o más bien seleccionar con todas y si en la selección hay ciertos elementos (como mínimo alguna polilinea cerrada por ejemplo) entonces exportas los datos

Por contornos tampoco es muy complicado. A mi gusto es la mejor forma porque entonces podrías olvidarte de organizar capas y que más bien esta tarea la haga la rutina, ya sea al exportar, o hacerlo en 2 partes, un primer comando organiza y en un segundo comando exporta segun esté organizado

Ahora, para el tema de contornos, se facilita mucho cuando no hay sectores curvos en la polilínea. Porque solamente es leer las coordenadas de sus vértices y pasarle al ssget una seleccion por polígono "WP" con esa lista de vértices. Mientras que si tiene sectores circulares se debe recurrir a procesos adicionales para calcular lo que haya dentro de los mismos. Aunque si tienes el dibujo bien organizado, por ejemplo en cuadrantes, podrías seleccionar no por el contorno del poligono sino por el rectangulo que contiene al polígono (bounding box) y así da lo mismo si hay lados curvos.

Como ves son muchas posibilidades pero depende mucho del orden del dibujo en el que lo vayas a correr.

Un código básico de partida puede ser el siguiente. Leer los vertices de una poli, seleccionar con ellos y agregar la misma poli a la seleccion
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(setq polilinea (car (entsel "Seleccione polilínea"))
		vertices (mapcar
						'cdr
						(vl-remove-if
							'(lambda(A)
								(/= (car A) 10)
							)
							(entget polilinea)
						)
					)
)
 
(setq seleccion (ssget "WP" vertices '((0 . "*LINE,CIRCLE"))))
(ssadd polilinea seleccion)
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 Juanma
Val: 171
Bronce
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Seleccionar elementos dentro de polilínea

Publicado por Juanma (140 intervenciones) el 02/09/2023 23:18:55
Lo de los arcos no podría ser, ya que la mitad o así suele llevar arcos, pero lo del rectángulo contenedor es una gran solución.

Se me ocurre (aunque no sé cómo programarlo) un ssget que seleccione todas las polilineas que NO estén en la capa "huecos" (así excluyo las polilíneas que representan huecos interiores). Luego por cada polilínea, seleccionó todo lo que está dentro del rectángulo que encierra a esa polilínea, y creo el archivo con bloquedisc guión
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

Seleccionar elementos dentro de polilínea

Publicado por Gerardo (986 intervenciones) el 03/09/2023 18:57:34
Mira esto a ver si te sirve de punto de partida, más tarde o mañana te paso algo parecido pero sin usar comandos

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
(defun c:test1 (/ prfj polis i k una obj area bbox p1 p2 L ss ent tmp)
	(if	(setq prfj	(strcat (getvar "dwgprefix") (vl-filename-base (getvar "dwgname")) "_")
					i		0
					k		1
					polis (ssget "_X" '((0 . "LWPOLYLINE")(-4 . "&")(70 . 1)))
			)
		(progn
			(repeat (sslength polis)
				(setq una	(ssname polis i)
						i		(1+ i)
						obj	(vlax-ename->vla-object una)
						area	(vlax-get-property obj 'Area)
						bbox	(vla-GetBoundingBox obj 'p1 'p2)
						L		(cons
									(list
										area
										una
										(vlax-safearray->list p1)
										(vlax-safearray->list p2)
									)
									L
								)
				)
			)
			(setq L	(mapcar
							'cdr
							(vl-sort
								L
								'(lambda(A B)
									(> (car A) (car B))
								)
							)
						)
			)
			(command "_UNDO" "_BEGIN")
			(setvar "WBLOCKCREATEMODE" 1)
			(while L
				(setq una	(car L)
						L		(cdr L)
						ss		(ssget "_W"	(cadr una) (caddr una) '((0 . "*LINE,CIRCLE")))
						i		0
				)
				(repeat (sslength ss)
					(if	(setq ent	(ssname ss i)
									i		(1+ i)
									tmp	(assoc ent L)
							)
							(setq L	(vl-remove tmp L))
					)
				)
				(ssadd (car una) ss )
				(while
					(tblsearch
						"LAYER"
						(setq nombre (strcat "_GRUPO_" (itoa k)))
					)
					(setq k (1+ k))
				)
				(command "_-LAYER" "_MAKE" nombre "_COLOR" (1+ (rem (1- k) 255)) nombre ""
							"_-WBLOCK" (strcat "\"" prfj nombre "\"") "" (cadr una) ss ""
							"_CHPROP" ss "" "_LAYER" nombre "_COLOR" "_BYLAYER" ""
				)
			)
			(command "_UNDO" "_END")
		)
	)
	(princ)
)
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

Seleccionar elementos dentro de polilínea

Publicado por Gerardo (986 intervenciones) el 04/09/2023 18:02:31
Aqui tienes la otra versión, en Visual Lisp (con Activex) para echar mano del metodo VLA-WBLOCK de VBA y no requerir el comando Wblock (bloquedisc). La otra forma sería con un objeto DBX para controlar una sesión de autocad desde otro dibujo y así crear dwgs con una rutina

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
(defun c:test2 (/ prfj app doc polis i k obj area bbox p1 p2 L sa1 sa2 ssobj una obj tmp nombre )
	(setq prfj	(strcat (getvar "dwgprefix") (vl-filename-base (getvar "dwgname")) "_")
			app	(vlax-get-acad-object)
			doc	(vla-get-ActiveDocument app)
			polis (vla-Add (vla-get-SelectionSets doc) "polis")
			i	0
			k	1
	)
	(vla-Select
		polis
		acSelectionSetAll
		nil
		nil
		(vlax-safearray-fill (vlax-make-safearray vlax-vbInteger '(0 . 2)) '(0 -4 70))
		(vlax-safearray-fill (vlax-make-safearray vlax-vbVariant '(0 . 2)) '("LWPOLYLINE" "&" 1))
	)
	(repeat (vla-get-Count polis)
		(setq obj	(vla-Item polis i)
				i		(1+ i)
				area	(vlax-get-property obj 'Area)
				bbox	(vla-GetBoundingBox obj 'p1 'p2)
				L		(cons
							(list
								area
								obj
								p1
								p2
							)
							L
						)
		)
	)
	(setq L	(mapcar
					'cdr
					(vl-sort
						L
						'(lambda(A B)
							(> (car A) (car B))
						)
					)
				)
			sa1	(vlax-make-safearray vlax-vbInteger '(0 . 0))
			sa2	(vlax-make-safearray vlax-vbVariant '(0 . 0))
			ssobj	(vla-Add (vla-get-SelectionSets doc) "SS")
	)
	(vlax-safearray-put-element sa1 0 0)
	(vlax-safearray-put-element sa2 0  "*LINE,CIRCLE")
	(while L
		(setq una	(car L)
				L		(cdr L)
				i		0
		)
		(vla-Select ssobj acSelectionSetCrossing (cadr una) (caddr una) sa1 sa2)
		(repeat (vla-get-Count ssobj)
			(if	(setq obj	(vla-Item ssobj i)
							i		(1+ i)
							tmp	(assoc obj L)
					)
					(setq L		(vl-remove tmp L))
			)
		)
		(while
			(tblsearch
				"LAYER"
				(setq nombre (strcat "_GRUPO_" (itoa k)))
			)
			(setq k (1+ k))
		)
		(entmake	(list '(0 . "LAYER")		'(100 . "AcDbSymbolTableRecord")		'(100 . "AcDbLayerTableRecord")
							(cons 2 nombre)	(cons 62 (1+ (rem (1- k) 255)))		'(6 . "CONTINUOUS")
							'(70 . 0)			'(370 . 50)
					)
		)
		(vla-WBlock doc (strcat prfj nombre ".dwg") ssobj)
		(vla-clear ssobj)
	)
	(vla-delete polis)
	(vla-delete ssobj)
	(princ)
)
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 Juanma
Val: 171
Bronce
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

Seleccionar elementos dentro de polilínea

Publicado por Juanma (140 intervenciones) el 04/09/2023 23:24:36
Este me da error por qué no reconoce la variable WBLOCKCREATEMODE
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

Seleccionar elementos dentro de polilínea

Publicado por Gerardo (986 intervenciones) el 05/09/2023 00:41:17
Pues quita esa línea XD

Esa variable la agregaron en el autocad 2022
https://help.autodesk.com/view/ACD/2024/ENU/?guid=GUID-B93A458E-1A7F-4090-A8CF-87A31C24E404

si tienes una versióna anterior lo que puedes hacer es quitar lo de la variable y agregar en la secuencia del command lo del modo.

Supongo que será algo como esto;

(command "_-WBLOCK" (strcat "\"" prfj nombre "\"") "" "mode" "retain" (cadr una) ss "")

O si lo dejas sin establecer el modo, pues será el que por defecto trae el autocad que creo que es eliminar del dibujo los objetos enviados al archivo
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

Seleccionar elementos dentro de polilínea

Publicado por Gerardo (986 intervenciones) el 02/09/2023 22:25:22
revisalo, delimítalo según la forma en que organizas el dibujo y me cuentas

Hay algunos trucos adicionales que te pueden facilitar mucho la vida, como ordenar los polígonos por tamaño desde el más grande y procesar en ese orden (el más grande siempre será un polígono externo) para olvidarte de seleccionar manualmente o a lo sumo hacer una sola selección de todo el dibujo en vez de tocar cada polilinea.

pero vamos por partes...
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