AutoCad - POligonos

 
Vista:
sin imagen de perfil

POligonos

Publicado por Ousmane Noah (6 intervenciones) el 02/08/2016 07:34:49
Hola programadores! se poco en autolisp y tengo problema en como poner condicion si el poligono es perfecto ocerrado y si es si te pide coordenadas y te le mueva a otro punto. miren

(defun c:MoverPoligonos(pt1 pt2 pt3 obj)
(setq pt1(getpoint"selecciona 1er punto"))
(setq pt2(getpoint"selecciona 2do punto"))

setq obj(entsel"selecciona el objeto"))

(cond....................................................................




(command "move"obj " " pt1 pt3)

)
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

POligonos

Publicado por Gerardo (986 intervenciones) el 03/08/2016 19:04:13
Hola
En cuanto a poligonos perfectos, pues programando lo mismo que harias sin programacion, medir todos los angulos y lados para corroborar si son iguales. Te puedo ayudar con eso.

En cuanto a poligonos cerrados es muy simple pero debes aclararte algo: que pasa si encuentras un poligono abierto de apariencia cerrada, es decir, que el cad lo tiene como abierto pero el primer punto y el ultimo son el mismo? Deberíamos asumirlo como abierto o como cerrado?

Luego, el orden de tus datos deberia ser inverso, primero le preguntas al usuario cual(es) es el objeto(s) a mover. Luego lo comprobamos si es perfecto y cerrado. Luego, solo si se selecciono alguno apto para moverse pides los dos puntos, de lo contrario no hara falta pedirlos y mas bien avisas que no se selecciono ninguno.

Otra pregunta, que se supone que es pt3 ?
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

POligonos

Publicado por Ousmane Noah (6 intervenciones) el 03/08/2016 19:30:25
como sera el orden del codigo? y de lo del poligono si el cad lo considera cerrado lo consideramos cerrado.
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

POligonos

Publicado por Ousmane Noah (6 intervenciones) el 03/08/2016 20:01:06
si el primer punto e igual a ultimo punto es cerrado
se podrá cerrar el poligono?
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

POligonos

Publicado por Gerardo (986 intervenciones) el 04/08/2016 01:55:34
Efectivamente se puede cerrar si es solo aparentemente cerrada.
Fijate que el codigo que te pase ya comprueba si es abierta en el logand con el codigo 70 de la lista DXF y si esta aparentemente cerrada comparando el primer y ultimo punto

Para cerrarla habria que eliminar de la lista de definicion los datos del ultimo punto (ultimo codigo 10 y los codigos 40 41 42 siguientes a ese) y ademas poner en 1 el primer bit del codigo 70 lo cual se hace con un (logior valoractual 1) o con un simple (+ valoractual 1) si estamos seguros de que esta abierta.

El resto te queda de tarea

Si algo de lo que te he dicho o de la rutina que te pase te parece en chino medieval, pues dale F1 a tu autocad y lee la documentacion de esas funciones y veras que no es nada de otro mundo, tampoco lo del DXF eso esta muy explicado en la ayuda del autocad

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
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

POligonos

Publicado por Gerardo (986 intervenciones) el 04/08/2016 01:48:41
Leyendo entre líneas, me parece que para tu manejo este es un caso un poco complejo, que podrias tomar algo mas simple para ir aprendiendo a programar. Sin embargo si te aventuras de doy un codigo de ejemplo y comentado para que lo analices

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
(defun c:MoverPoligonos ( / obj lent puntos cerrada L2 L3 lados angulos perfecto)
 
	;Pido al usuario seleccionar un objeto
	(setq obj (car (entsel "\nSelecciona el objeto"))
 
			;obtengo la lista de defnicion DXF
			lent (entget obj)
 
			;obtengo la lista de puntos del poligono
			puntos (mapcar 'cdr (vl-remove-if '(lambda(A)(/= (car A) 10)) lent))
 
			;obtenemos si es cerrada (cod 70 con bit 1 activo)
			;o aparentemente cerrada (distancia del primer punto al ultimo es cero)
			cerrada (or	(= (logand 1 (cdr (assoc 70 lent))) 1)
							(zerop (distance (car puntos)(last puntos)))
						)
	)
	;Si el poligono es aparentemente cerrado eliminar su primer punto de la lista para validar las comprobaciones
	(if (zerop (distance (car puntos)(last puntos)))
		(setq puntos (cdr puntos))
	)
 
	;Primera validacion: si la poly es cerrada
	(if cerrada
 
		;Caso verdadero: la poly es cerrada -> proceder a revisar si el poligono es perfecto
		(if	;Segunda validación, si el polígono es perfecto
 
			;Hacer una lista de puntos con un corrimiento de 1 para calcular distancias
			(setq L2 (append (cdr puntos) (list (car puntos)))
 
			;Desde el pareo de ambas listas saco lista de longitudes de lado del poligono
					lados (mapcar 'distance puntos L2)
					
			;Elimino todas las ocurrencias del primer lado, si todos son iguales la lista quedara vacia
					perfecto (null (vl-remove-if '(lambda(A)(equal A (car lados) 0.000000001)) lados))
 
			;Hacer una lista con corrimiento de 2 para tener triadas y calcular lista de angulos
					L3 (append (cdr L2)(list (car L2)))
 
			;desde las triadas hacer lista de angulos internos o externos del poligono
					angulos (mapcar '(lambda(A B C)(rem(+(angle B A)(* 2 pi)(-(angle B C)))(* 2 pi))) puntos L2 L3)
					
			;Eliminar todas las ocurrencias del primer angulo, si la lista queda vacia todos eran iguales y si ademas
					;los lados eran iguales el poligono es perfecto
					perfecto (and(null(vl-remove-if '(lambda(A)(equal A(car angulos)0.00000001))angulos))perfecto)
			)
 
				;Caso verdadero, el poligono es cerrado y perfecto, proceder a mover
				(command "move" obj "")
 
				;Caso falso, el poligono es imperfecto -> avisamos al usuario
				(alert "Error, el polígono es cerrado pero es imperfecto, no se moverá")
 
		)
 
		;Caso falso: la poly esta abierta -> avisamos al usuario
		(alert "Error, esa polilinea esta abierta, por favir seleccione una cerrada")
	);fin del if principal
) ;Fin de defun

Tendria muchos comentarios que hacer al respecto pero mejor prueba el codigo con diferentes polilineas, revisa el algoritmo y si tienes dudas pues las puedes plantear por aqui
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