(defun angle-between-points (p1 p2)
;; Calcula el ángulo en radianes entre dos puntos respecto al origen (0,0)
(atan (- (cadr p2) (cadr p1)) (- (car p2) (car p1)))
)
(defun get-polygon-center (entidad)
;; Calcula el centroide de un polígono cerrado (LWPOLYLINE)
(setq coords (mapcar 'cdr (vl-remove-if-not
(lambda (x) (= (car x) 10))
(entget entidad))))
(setq sum-x 0.0 sum-y 0.0)
(foreach pt coords
(setq sum-x (+ sum-x (car pt)))
(setq sum-y (+ sum-y (cadr pt))))
(list (/ sum-x (length coords)) (/ sum-y (length coords)))
)
(defun c:AnotarLotes (/ sel-lotes manzano num-lotes poligonos poligono-inicial centroide-inicial poligono-entidad area)
;; Solicitar la selección de lotes (polígonos cerrados)
(setq sel-lotes (ssget '((0 . "LWPOLYLINE") (70 . 1)))) ; Solo polilíneas cerradas
;; Validar si se seleccionaron lotes
(if sel-lotes
(progn
;; Solicitar el polígono inicial
(princ "\nSelecciona un polígono de inicio para el recorrido.")
(setq poligono-inicial (car (entsel "\nSeleccione el polígono de inicio: ")))
;; Validar si se seleccionó un polígono inicial
(if (not poligono-inicial)
(progn
(princ "\nNo se seleccionó un polígono de inicio.")
(exit)
)
)
;; Calcular el centroide del polígono inicial
(setq centroide-inicial (get-polygon-center poligono-inicial))
;; Solicitar el número de manzano
(setq manzano (getstring T "\nIntroduce el número del manzano (ejemplo: 1): "))
;; Validar que el número de manzano no sea vacío
(if (not manzano)
(progn
(princ "\nError: El número del manzano no puede estar vacío.")
(exit)
)
)
;; Inicializar el contador de lotes
(setq num-lotes 1)
;; Inicializar lista de polígonos y calcular sus centroides
(setq poligonos '())
(repeat (sslength sel-lotes)
(setq poligono-entidad (ssname sel-lotes (1- (sslength sel-lotes))))
(setq poligonos (cons (get-polygon-center poligono-entidad) poligonos))
)
;; Ordenar los polígonos en sentido horario con base en el centroide inicial
(setq poligonos (vl-sort poligonos
(function (lambda (p1 p2)
(< (angle-between-points centroide-inicial p1)
(angle-between-points centroide-inicial p2))))))
;; Anotar cada polígono
(foreach centroide poligonos
(setq poligono-entidad (car (entsel "\nSeleccione un polígono para anotar: ")))
;; Calcular el área del polígono
(setq area (vlax-curve-getarea poligono-entidad))
;; Crear las posiciones del texto
(setq texto-lote (list (car centroide) (+ (cadr centroide) 1))) ; Lote arriba
(setq texto-mzna (list (car centroide) (cadr centroide))) ; Mzna al centro
(setq texto-superficie (list (car centroide) (- (cadr centroide) 1))) ; Superficie abajo
;; Crear las anotaciones
(command "TEXT" "J" "M" texto-lote 1 0 (strcat "Lote: " (itoa num-lotes)))
(command "TEXT" "J" "M" texto-mzna 1 0 (strcat "Mzna: " manzano))
(command "TEXT" "J" "M" texto-superficie 1 0 (strcat "Superficie: " (rtos area 2 2) " m²"))
;; Incrementar el contador de lotes
(setq num-lotes (1+ num-lotes))
)
(princ "\nAnotación de lotes completada.")
)
;; Si no se seleccionan lotes, mostrar mensaje de error
(princ "\nNo se seleccionaron lotes.")
)
(princ)
)
me sale este error (Seleccione el polígono de inicio: ; error: bad function: #<SUBR @00000160e8823660 -lambda->)