AutoCad - Romper polilíneas y borrar tramos alternos

 
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

Romper polilíneas y borrar tramos alternos

Publicado por Juanma (140 intervenciones) el 19/05/2022 08:35:18
Buenas,
Ayer me vi en la necesidad de eliminar los tramos pares de unas cuantas polilíneas, de forma que quedasen como si fueran líneas discontuas, pero en diferentes líneas. Fue muy engorroso, por las prisas y por que eran polilíneas de varios cientos de tramos.

Estoy pensando en una rutina que recorra los vértices de una polilíneas, y dibuje líneas de un vértice impar hasta uno par (dejando libre, desde el impar al par)

Alguien sabría cómo recorrer y qlmacenar esos vértices para poder programar la lisp?

Gracias desde ya.
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

Romper polilíneas y borrar tramos alternos

Publicado por Gerardo (986 intervenciones) el 20/05/2022 04:37:52
Hola

Es diferente la solución si la polilinea es 3d que si es liviana. Voy a asumir lo segundo y voy a asumir que todos los tramos son rectos ya que hablas de líneas.

En mi caso que todo lo resuelvo con listas de definicion DXF, pues obtener la lista de entidad, para sacar de ella los puntos, la elevacion, y otras características como capa, color, tipo de linea...
Luego solo recorrer la lista de puntos en un bucle usando cada dos puntos para trazar una línea. Y finalmente borrar la poli.

Ya en código algo como así:

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
(defun c:tramosimpares (/ PLnent PLlent elevac puntos base)
	(setq PLnent	(car (entsel))
			PLlent	(entget PLnent)
			elevac	(cdr (assoc 38 PLlent))
			puntos	(mapcar
							'(lambda(B)
								(list (cadr B) (caddr B) elevac)
							)
							(vl-remove-if
								'(lambda(A)
									(/= (car A) 10)
								)
								PLlent
							)
						)
			base		(append
							(list
								'(0 . "LINE")
								(assoc 8 PLlent)
							)
							(if (setq tmp (assoc 62 PLlent)) (list	tmp ))
							(if (setq tmp (assoc 6 PLlent)) (list	tmp ))
						)
	)
	(while (cdr puntos)
		(entmake
			(append
				base
				(list
					(cons 10 (car puntos))
					(cons 11 (cadr puntos))
				)
			)
		)
		(setq puntos (cddr puntos))
	)
	(entdel PLnent)
)
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

Romper polilíneas y borrar tramos alternos

Publicado por Juanma (140 intervenciones) el 20/05/2022 22:51:30
Pues sí, bien asumido todo
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

Romper polilíneas y borrar tramos alternos

Publicado por Juanma (140 intervenciones) el 21/05/2022 14:04:49
Solo se subió la primera parte del comentario.

Resumiendo, muchísimas gracias Gerardo, funciona genial.

Cómo ejercicio, intentaré que borre solo una de cada 3 o de cada 4

Muchísimas gracias, saludos!!
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

Romper polilíneas y borrar tramos alternos

Publicado por Gerardo (986 intervenciones) el 21/05/2022 15:41:43
dale!

Cualquier consulta, por aquí andaré
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

Romper polilíneas y borrar tramos alternos

Publicado por Juanma (140 intervenciones) el 22/05/2022 15:58:25
Al final, y pese a que me ha costado entenderlo (no tengo ni idea de listas dxf), he sido capaz de que deje un numero de lineas seguidas, y borre otro numero de lineas seguidas ( por ejemplo, deja 4 y borra 2).

este es tu codigo modificado:

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
(defun c:tramosimpares (/ PLnent PLlent elevac puntos base tb tl numerito)
 
 
 
(setq tb  (getint "tramos a borrar:"))
(setq tl (+ tb (getint "tramos consecutivos:")))
(setq PLnent	(car (entsel))
			PLlent	(entget PLnent)
			elevac	(cdr (assoc 38 PLlent))
			puntos	(mapcar
							'(lambda(B)
								(list (cadr B) (caddr B) elevac)
							)
							(vl-remove-if
								'(lambda(A)
									(/= (car A) 10)
								)
								PLlent
							)
						)
 
			base		(append
							(list
								'(0 . "LINE")
								(assoc 8 PLlent)
							)
							(if (setq tmp (assoc 62 PLlent)) (list	tmp ))
							(if (setq tmp (assoc 6 PLlent)) (list	tmp ))
						)
	)
(setq numerito 0)
	(while (cdr puntos)
(if (>= (rem numerito tl) tb)
		(entmake
			(append
				base
				(list
					(cons 10 (car puntos))
					(cons 11 (cadr puntos))
				)
			)
)		)
		(setq numerito (+ 1 numerito))
		(setq puntos (cdr puntos))
	)
	(entdel PLnent)
)

Muchas gracias otra vez, saludos!!!!
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

Romper polilíneas y borrar tramos alternos

Publicado por Gerardo (986 intervenciones) el 23/05/2022 04:22:22
Las listas DXF no tienen gran ciencia. Es una forma de indexar los objetos y sus propiedades en la base de datos del dibujo, si guardas un archivo en formato DXF R12 y luego lo abres en el notepad de wwindows verás una serie de valores numéricos que indexan cada dato.

Así por ejemplo el código 8 suele referirse a nombres de capas, y el 10 son coordenadas de un punto. Cada entidad tiene una estructura bien documentada con el uso de cada código numérico, y cuales de esos son requeridos y cuales opcionales.
Busca en la ayuda de Autocad "Line (DXF)" y verás los códigos específicos para crear o interpretar líneas, además abajo de esa página de ayuda verás un vínculo a otra que dice "Common Group Codes for Entities (DXF)" que son otros valores que son comunes a todas las entidades.

Utiliza la función "entget" para obtener la lista de una entidad. Por ejemplo si pones (entget (car (entsel))) y tocas una línea saldrá algo como esto:
1
((-1 . <Entity name: 19dec8e99b0>) (0 . "LINE") (330 . <Entity name: 19dbb42a1f0>) (5 . "1259B3") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 470.926 282.178 0.0) (11 488.331 294.236 0.0) (210 0.0 0.0 1.0))
ignora el -1, el 5 y los 330 y 360 que corresponden a indexaciones de cada entidad que agrega el propio autocad.

Luego con entmake, proporcionas una lista con la información mínima necesaria y se crearán las entidades. Por ejemplo:
1
(entmake '((0 . "LINE") (62 . 5) (10 0. 0. 0.) (11 10. 10. 0.) ))
dibujará una línea azul desde el punto 0,0,0 hasta el punto 10,10,0
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

Romper polilíneas y borrar tramos alternos

Publicado por Gerardo (986 intervenciones) el 23/05/2022 04:28:00
dada la información anterior, puedes crear funciones auxiliares que te faciliten mucho el trabajo. Por ejemplo, una función que le pasas el nombre de entidad de un circulo y te retorna el radio y el centro. O una que le pasas radio y centro y traza un círculo. Así cada vez que vayas a hacer círculos solo pones (trazar-circulo centro radio capa color) y listo.

Mas directo para lo de las polilíneas mira estas funciones de servicio:
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
81
82
83
;Función que extrae la lista de puntos de una polilínea
(defun get-pts-poly (nent)
	(mapcar
		'cdr
		(vl-remove-if
			'(lambda(A)
				(/= (car A) 10)
			)
			(entget nent)
		)
	)
)
 
;Función que dibuja una línea
;si capa es nulo toma la capa actual
;si color o ltype es nulo pone bylayer
(defun traza-linea (pt1 pt2 capa color ltype)
	(entmake
		(list
			'(0 . "LINE")
			(cons	8
					(cond	(capa)
							((getvar "CLAYER"))
					)
			)
			(cons	62
					(cond
						(color)
						(256)
					)
			)
			(cons	6
					(cond
						(ltype)
						("BYLAYER")
					)
			)
			(cons 10 pt1)
			(cons 11 pt2)
		)
	)
)
;Función que dibuja una polilinea liviana sin segmentos curvos
(defun traza-polilinea-SC (puntos capa color ltype ltgen cerrada)
	(entmake
		(append
			(list
				'(0 . "LWPOLYLINE")
				'(100 . "AcDbEntity")
				(cons	8
						(cond	(capa)
								((getvar "CLAYER"))
						)
				)
				(cons	62
						(cond
							(color)
							(256)
						)
				)
				(cons	6
						(cond
							(ltype)
							("BYLAYER")
						)
				)
				'(100 . "AcDbPolyline")
				(cons 70 (+	(if cerrada 1 0)
								(if ltgen 128 0)
							)
				)
				(cons 90 (length puntos))
			)
			(mapcar
				'(lambda(A)
					(cons 10 A)
				)
				puntos
			)
		)
	)
)

Entonces lo que sigue es solo obtener los vertices de las polilíneas con (get-pts-poly entidad), y usarlos para calcular lo que necesites y pasarselos a las otras funciones para que creen líneas o polilíneas en los tramos de interés. Por ejemplo:

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
(defun c:tramos ( / tb tl pNent pLent puntos capa color ltype Lista)
	(setq	tb			(1- (getint "\nTramos a borrar:"))
			tl			(1+ (getint "\nTramos consecutivos:"))
			pNent		(car (entsel))
			puntos	(get-pts-poly pNent)
			pLent		(entget pNent)
			capa		(cdr (assoc 8 pLent))
			color		(cdr (assoc 62 pLent))
			ltype		(cdr (assoc 6 pLent))
	)
	(entdel pNent)
 
	(while puntos
		(setq Lista nil)
		(repeat tl
			(if	puntos
				(setq Lista		(cons (car puntos) L)
						puntos	(cdr puntos)
				)
			)1
		)
		(traza-polilinea-SC L capa color ltype nil nil)
		(repeat tb
			(setq puntos (cdr puntos))
		)
	)
)
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

Romper polilíneas y borrar tramos alternos

Publicado por Juanma (140 intervenciones) el 29/05/2022 19:39:38
Siempre muy agradecido por la info, que es mucha mas de la que yo pedía.
Había pensado, que era buena idea los tramos que dibuja juntos, fueran una polilinea, entonces he cogido esos dos trozos de codigo que me has pasado, los he juntado en una rutina y la he probado, pero no me crea las polilineas esperadas; solo me dice esto:"Se han añadido dos vértices a una polilínea 2D (0) que no tenía ninguno".

de todas formas ya con lo que tengo me es suficiente, el que sean polilineas en lugar de lineas, es solo una mejora superflua, pero que me parece como mas correcto, ya que son lineas de corte en realidad.

Gracias, saludos.
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

Romper polilíneas y borrar tramos alternos

Publicado por Juanma (140 intervenciones) el 31/05/2022 12:10:00
Detectada la errata que era muy simple, simplemente actualizaba la "Lista" con el primer punto de "puntos" y "L" en lugar de con "Lista". por tanto en lugar de añadirle el siguiente punto, la sustituía por un punto mas un "nill".

¿Que cosas no? Al final hasta agradezco esa errata, por que me ha obligado a comprender bien el 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

Romper polilíneas y borrar tramos alternos

Publicado por Gerardo (986 intervenciones) el 31/05/2022 19:57:30
que bueno que te funciono al final

Siempre trata de mantener esos procesos como dibujar lineas y polilineas, o extraer puntos de polilinea en funciones aparte, tal como te lo pasé en el último post, nunca juntarlo, para asegurarte la máxima de "divide y vencerás"

Primero te ayudará a reutilizar el código, En otro programa que hagas en un futuro que dibuje lineas o polilineas solo invocas esa funcion que ya tienes pasandole los puntos y propiedades y listo.

Segundo porque te hace más facil depurar y mantener la rutina, si estás seguro de que "traza-polilinea-SC" funciona bien, ante un fallo o cambio de lógica de la rutina tienes que irte directo a la función que procesa las listas de puntos que será más simple de revisar o modificar.

Tercero, te permite aprender más rápido, porque divides los temas en "capítulos" y en esas funciones comprendes más de listas de definición y en la función principal está el tema de manipulación de listas de puntos.

Mas bien te dejo el reto de que cuando lo vayas necesitando vayas creando otras funciones con entmake de listas de definición como:

traza-Arco
traza-Insercion-de-bloque
creat-layer
traza-polilinea-CC (poli con tramos curvos )
etc

Saludos, cualquier duda intentaré mantenerme por aquí
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

Romper polilíneas y borrar tramos alternos

Publicado por Juanma (140 intervenciones) el 01/06/2022 23:29:09
He intentado modificar tu código para que transforme polilineas 2d en polilineas, ya que es como se generan las polilineas en cuestión.

pero selecciono la polilinea 2d, y la convierto en polilinea, pero me es imposible recuperarla con entlast, por lo que tengo que volver a seleccionarla.
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
(defun c:ta-pol ( / tb tl pNent pLent puntos capa color ltype Lista)
 
;Función que extrae la lista de puntos de una polilínea
(defun get-pts-poly (nent)
	(mapcar
		'cdr
		(vl-remove-if
			'(lambda(A)
				(/= (car A) 10)
			)
			(entget nent)
		)
	)
)
 
;Función que dibuja una línea
;si capa es nulo toma la capa actual
;si color o ltype es nulo pone bylayer
(defun traza-linea (pt1 pt2 capa color ltype)
	(entmake
		(list
			'(0 . "LINE")
			(cons	8
					(cond	(capa)
							((getvar "CLAYER"))
					)
			)
			(cons	62
					(cond
						(color)
						(256)
					)
			)
			(cons	6
					(cond
						(ltype)
						("BYLAYER")
					)
			)
			(cons 10 pt1)
			(cons 11 pt2)
		)
	)
)
;Función que dibuja una polilinea liviana sin segmentos curvos
(defun traza-polilinea-SC (puntos capa color ltype ltgen cerrada)
	(entmake
		(append
			(list
				'(0 . "LWPOLYLINE")
				'(100 . "AcDbEntity")
				(cons	8
						(cond	(capa)
								((getvar "CLAYER"))
						)
				)
				(cons	62
						(cond
							(color)
							(256)
						)
				)
				(cons	6
						(cond
							(ltype)
							("BYLAYER")
						)
				)
				'(100 . "AcDbPolyline")
				(cons 70 (+	(if cerrada 1 0)
								(if ltgen 128 0)
							)
				)
				(cons 90 (length puntos))
			)
			(mapcar
				'(lambda(A)
					(cons 10 A)
				)
				puntos
			)
		)
	)
)
	(setq	tb			(1- (getint "\nTramos a borrar:"))
			tl			(1+ (getint "\nTramos consecutivos:"))
			pNent		(entsel)
	)
(command "_CONVERTPOLY" "fina" pNent "")
	(setq
;---------------aquí debería poder seleccionar la ultima entidad, transformada en polilinea
;---------------cambiando este segundo entsel por un entlast, pero no funciona
			pNent		(car (entsel))
;---------------------------------------------------------------------------
			puntos	(get-pts-poly pNent)
			pLent		(entget pNent)
			capa		(cdr (assoc 8 pLent))
			color		(cdr (assoc 62 pLent))
			ltype		(cdr (assoc 6 pLent))
	)
	(entdel pNent)
	(while puntos
		(setq Lista nil)
		(repeat tl
			(if	puntos
				(setq Lista		(cons (car puntos) Lista)
						puntos	(cdr puntos)
				)
			)
		)
		(traza-polilinea-SC Lista capa color ltype nil nil)
		(repeat tb
			(setq puntos (cdr puntos))
		)
	)
)

Aunque tampoco es algo realmente importante, ya que transformar polilineas 2d en polilineas normales es rapido y facil, quisiera saber como recupero esa entidad previamente seleccionada y transformada.

en esta ocasión solo ahorraría un click en pantalla, pero para otras app puede ser algo fundamental.
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

Romper polilíneas y borrar tramos alternos

Publicado por Gerardo (986 intervenciones) el 02/06/2022 10:56:44
Bien, un par de aclaraciones para tu consulta.

1-Cuando conviertes una polilinea de liviana a 3D o viceversa con el comando convertpoly este modifica la entidad, no es que la borre y cree una nueva. La función entlast te devuelve la ultima entidad de la base de datos, que técnicamente es lo último dibujado. Por eso no puedes obtener la polilinea con esa función salvo que realmente sea lo ultimo que se dibujó, de lo contrario solo fue modificada una polilínea que estaba en cualquier parte de la base de datos del dibujo y se mantuvo en el mismo sitio.

2-Dado lo anterior, en realidad no necesitas volver a seleccionar la polilínea ni con entlast ni con entsel, porque ya la tienes en la variable pNent que sigue apuntando a la misma polilinea, solo que ya transformada.
Solo elimina del codigo la segunda asignación de pNent (y en la primera debes agregar el (car antes del (entsel)
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

Romper polilíneas y borrar tramos alternos

Publicado por Gerardo (986 intervenciones) el 02/06/2022 11:25:27
Ahora bien, aportando algo adicional que no me preguntaste pero lo dejo por si te sirve el dato o a alguien más.

La función get-pts-poly no te devuelve los puntos de una polilínea 3d porque su estructura dxf es muy diferente a la de una polilínea liviana. Pero podemos hacer una función que de una extraiga los puntos de una poli 3d

Hay dos entidades que son compuestas de otras entidades: las definiciones de bloque y las polilíneas 3D.

A diferencia de las LWPOLYLINE que se definen en una sola lista (donde por cada punto aparece un codigo 10 con las coordenadas y unos codigos 40, 41 y 42 si tiene curvatura o grosor de linea) la entidad POLYLINE tiene una lista que define propiedades gráficas pero no geométricas, y esa entidad es seguida de una serie de entidades tipo VERTEX, cada una con las coordenadas del vertice en el codigo 10. Al final de la secuencia de puntos aparece una entidad de tipo "SEQEND" que indica que termino la definición de la polilinea y el siguiente objeto ya será lo siguiente que haya en el dibujo

Imagina así la base de datos

ent ((0 . "LINE") (10 ...) (11..))
ent ((0 . "LINE") (10 ...) (11..))
ent ((0 . "ARC") (10 ...) (40..)(50..)(51..))
ent ((0 . "TEXT") (7 ...) (1 ...) (40...)(10 ...) (50..))
ent ((0 . "LWPOLYLINE") (70 ...) (90 ...) (10...)(10 ...) (10 ...)(10 ...)(10 ...)(10 ...))
ent ((0 . "POLYLINE") (70 ...) (40 ...)
ent ((0 . "VERTEX") (10 ...)
ent ((0 . "VERTEX") (10 ...)
ent ((0 . "VERTEX") (10 ...)
ent ((0 . "VERTEX") (10 ...)
ent ((0 . "SEQEND")

fijate que las primeras 5 definiciones corresponden cada una a una entidad diferente, con sus propiedades, en el caso de la LWPL tiene todos sus vértices en su lista. Pero luego las restantes 6 entidades apenas definen un solo objeto gráfico que es la poly3D. Entonces hay que complementar el (entget) con (entnext) para iterar sobre la BD tomando los vértices

Entonces, para obtener los vértices, en vez de tomar todos los códigos 10 de una lista como en get-pts-poly, tomamos el punto de cada siguiente entidad mientras esta sea de tipo vertex o mientras no sea de tipo seqend.

Esta función recorre los vertices de una polilinea 3D y retorna una lista de puntos 3D
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(defun get-pts-poly3D (nent / lent pts)
	(while
		(=
			(cdr
				(assoc
					0
					(setq lent	(entget
										(setq nent (entnext nent))
									)
					)
				)
			)
			"VERTEX"
		)
		(setq pts	(cons
							(cdr (assoc 10 lent))
							pts
						)
		)
	)
	pts
)

O esta otra es lo mismo pero devuelve una lista de coordenadas solo XY
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
(defun get-pts2D-poly3D (nent / lent pts)
	(while
		(=
			(cdr
				(assoc
					0
					(setq lent	(entget
										(setq nent (entnext nent))
									)
					)
				)
			)
			"VERTEX"
		)
		(setq pts	(cons
							(list
								(cadr (assoc 10 lent))
								(caddr (assoc 10 lent))
							)
							pts
						)
		)
	)
	pts
)

PD. Fijate que ya puedes construir una función que convierta una poly 3D en liviana. Solo extraes los vertices con una de estas funciones (y las propiedades de color capa etc de la entidad POLYLINE), borras la entidad y se los pasas a la función traza-polilinea-SC para crear la LW en el mismo sitio. Claro, esa no convierte, borra y crea otra pero es un buen inicio para aprender
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

Romper polilíneas y borrar tramos alternos

Publicado por Juanma (140 intervenciones) el 02/06/2022 20:13:42
perfecto, como siempre, tienes razón y ya funciona perfecto. muchas 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
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

Romper polilíneas y borrar tramos alternos

Publicado por Juanma (140 intervenciones) el 02/06/2022 20:24:59
OJO!! que no son polilíneas 3d, son polilíneas 2D.

por lo visto es un tipo de polilíneas anteriores a 2004, y que se cambiaron por las polilíneas actuales por que pesaban mucho.

osea, tenemos POLILINEAS, POLILINEAS 2D Y POLILINEAS 3D .

Sobre lo que comentas, tienes toda la razón , parece mucho mas lógico que directamente, extraiga los vértices, sea el tipo que sea.

Aunque mi lisp ya funciona perfectamente, Gracias a tí, cuando vuelva de pasear a mi peque de 3 meses me copiaré ese codigo en un lisp de pruebas, para tenerlo guardado .

gracias por tanta info. saludos.
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

Romper polilíneas y borrar tramos alternos

Publicado por Gerardo (986 intervenciones) el 02/06/2022 23:58:23
Que bien que te funciona

En realidad hay solo dos tipos de polilínea, a lo interno.
Las livianas (LWPOLYLINE) se dice 2D porque tienen un único valor de Z para todos los puntos.y las complejas (POLYLINE) se dice 3D porque te permiten un valor de Z diferente para cada vértice. Solo que puedes tener una compleja que todos los vértices estén en Z=0, entonces tiene geometría bidimensional

Saludos y felicidades por tu bebé!
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