(vl-load-com)

(defun c:JURASSIC ()
  ;; Función para obtener el nombre del color a partir del índice de color
  (defun get-color-name (color-index)
    (cond
      ((= color-index 1) "Rojo")
      ((= color-index 2) "Amarillo")
      ((= color-index 3) "Verde")
      ((= color-index 4) "Cian")
      ((= color-index 5) "Azul")
      ((= color-index 6) "Magenta")
      ((= color-index 7) "Blanco")
      (t (strcat "Color" (itoa color-index)))
    )
  )

  ;; Función de manejo de errores
  (defun *error* (msg)
    (if acDoc (vla-EndUndoMark acDoc)) ; Finalizar la marca de deshacer si está activa
    (cond ((not msg))
          ((member msg '("Function cancelled" "quit / exit abort")))
          ((princ (strcat "\n** Error: " msg " **")))
    )
    (princ)
  )

  ;; Iniciar marca de deshacer
  (setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  (vla-StartUndoMark acDoc)

  (setq layers (vla-get-Layers acDoc))

  ;; Preguntar al usuario si desea buscar en todas las capas o solo en la capa 0
  (initget "0 TODAS")
  (setq user-choice (getkword "\n¿Desea buscar en todas las capas o solo en la capa 0? [0/TODAS] <0>: "))

  ;; Determinar la opción elegida
  (cond
    ((or (= user-choice "") (= user-choice "0"))
     (setq search-in-all-layers nil)) ; Buscar solo en la capa 0
    ((or (= user-choice "T") (= user-choice "TODAS"))
     (setq search-in-all-layers t)) ; Buscar en todas las capas
    (t
     (setq search-in-all-layers nil)) ; Opción por defecto
  )

  ;; Iterar a través de los colores indexados del 1 al 255
  (setq color-index 1)
  (while (<= color-index 255)
    ;; Construir el filtro de selección según la opción elegida
    (setq filter (if search-in-all-layers
                     (list (cons 62 color-index)) ; Buscar en todas las capas
                     (list (cons 8 "0") (cons 62 color-index)) ; Buscar solo en la capa 0
                )
    )

    ;; Seleccionar objetos según el filtro
    (setq ss (ssget "X" filter))

    ;; Comprobación y procesamiento de la selección
    (if ss
      (progn
        ;; Obtener el nombre del color
        (setq color-name (get-color-name color-index))
        ;; Inicializar una lista para rastrear las capas procesadas para este color
        (setq layer-list '())
        ;; Iterar sobre cada entidad seleccionada y moverla a la capa correspondiente
        (setq i 0)
        (setq n (sslength ss))
        (while (< i n)
          ;; Obtener el nombre de la entidad
          (setq ename (ssname ss i))
          ;; Convertir la entidad en un objeto VLA
          (setq obj (vlax-ename->vla-object ename))
          ;; Obtener el nombre de la capa original
          (setq original-layer-name (vla-get-Layer obj))
          ;; Construir el nuevo nombre de la capa
          (setq new-layer-name (strcat "REVISAR-" original-layer-name "-" color-name))
          ;; Verificar si la nueva capa ya existe, sino crearla
          (if (not (tblsearch "LAYER" new-layer-name))
            (progn
              (setq new-layer (vla-Add layers new-layer-name))
              ;; Asignar el color indexado a la nueva capa
              (vla-put-Color new-layer color-index)
            )
          )
          ;; Mover el objeto a la nueva capa
          (vla-put-Layer obj new-layer-name)
          ;; Cambiar el color del objeto a BYLAYER
          (vla-put-Color obj 256)
          ;; Agregar la capa a la lista si aún no está
          (if (not (member original-layer-name layer-list))
            (setq layer-list (cons original-layer-name layer-list))
          )
          ;; Incrementar el índice
          (setq i (1+ i))
        )
        ;; Proporcionar retroalimentación
        (foreach lay layer-list
          (princ (strcat "\nLos objetos en la capa \"" lay "\" con color \"" color-name "\" fueron movidos a la capa \"" (strcat "REVISAR-" lay "-" color-name) "\" y cambiados a BYLAYER."))
        )
      )
      ;; Si no se encontraron objetos con el índice de color actual
      (princ (strcat "\nNo se encontraron objetos con color \"" (get-color-name color-index) "\".")))
    ;; Incrementar el índice de color
    (setq color-index (1+ color-index))
  )

  ;; Finalizar marca de deshacer
  (vla-EndUndoMark acDoc)
  (princ "\nProceso completado para todos los colores del 1 al 255.")
  (princ)
)
