(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