using System;
using System.Collections.Generic;
using System.Text;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;

namespace GMLC01HerramientasCad.Acad
{
    class SeleccionObjetosAutoCAD
    {

        private SeleccionObjetosAutoCAD()
        {
        }

        /// <summary>
        /// Recupera los ObjectId de las entidades que se deben revisar para la selección.
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static ObjectId[] GetEntitiesWithXData(string recordName)
        {
            try
            {
                //Se prepara el filtro por atributos extendidos y el listado de capas del modelo.
                TypedValue[] tp = new TypedValue[2];
                tp[0] = new TypedValue((int)DxfCode.ExtendedDataRegAppName, recordName);
                tp[1] = new TypedValue((int)DxfCode.LayerName, MyPlugin.modelLayersString);
                PromptSelectionResult res = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.SelectAll(new SelectionFilter(tp));
                if (res.Status == PromptStatus.OK)
                {
                    return res.Value.GetObjectIds();
                }
            }
            finally
            {

            }
            return null;
        }

        /// <summary>
        /// Recupera los ObjectId de los sombreados con datos extendidos.
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static ObjectId[] GetHatchesWithXData()
        {
            try
            {
                //Se prepara el filtro por atributos extendidos y el listado de capas del modelo.
                TypedValue[] tp = new TypedValue[3];
                tp[0] = new TypedValue((int)DxfCode.ExtendedDataRegAppName, "*");
                tp[1] = new TypedValue((int)DxfCode.Start, "HATCH");
                tp[2] = new TypedValue((int)DxfCode.LayerName, MyPlugin.modelLayersString);
                PromptSelectionResult res = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.SelectAll(new SelectionFilter(tp));
                if (res.Status == PromptStatus.OK)
                {
                    return res.Value.GetObjectIds();
                }
            }
            finally
            {

            }
            return null;
        }

        /// <summary>
        /// Recupera los ObjectId de las líneas con datos extendidos.
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static ObjectId[] GetLinesWithXData()
        {
            try
            {
                //Se prepara el filtro por atributos extendidos y el listado de capas del modelo.
                TypedValue[] tp = new TypedValue[3];
                tp[0] = new TypedValue((int)DxfCode.ExtendedDataRegAppName, "*");
                tp[1] = new TypedValue((int)DxfCode.Start, "POLYLINE,LINE,LWPOLYLINE");
                tp[2] = new TypedValue((int)DxfCode.LayerName, MyPlugin.modelLayersString);
                PromptSelectionResult res = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.SelectAll(new SelectionFilter(tp));
                if (res.Status == PromptStatus.OK)
                {
                    return res.Value.GetObjectIds();
                }
            }
            finally
            {

            }
            return null;
        }

        /// <summary>
        /// Recupera los ObjectId de los puntos y bloques con datos extendidos.
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static ObjectId[] GetPointsWithXData()
        {
            try
            {
                //Se prepara el filtro por atributos extendidos y el listado de capas del modelo.
                TypedValue[] tp = new TypedValue[3];
                tp[0] = new TypedValue((int)DxfCode.ExtendedDataRegAppName, "*");
                tp[1] = new TypedValue((int)DxfCode.Start, "POINT,INSERT");
                tp[2] = new TypedValue((int)DxfCode.LayerName, MyPlugin.modelLayersString);
                PromptSelectionResult res = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.SelectAll(new SelectionFilter(tp));
                if (res.Status == PromptStatus.OK)
                {
                    return res.Value.GetObjectIds();
                }
            }
            finally
            {

            }
            return null;
        }

        /// <summary>
        /// Recupera los ObjectId de las entidades seleccionadas.
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static ObjectId[] GetSelectedEntities()
        {
            try
            {
                // Recuperación del conjunto de selección previo.
                Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                Editor ed = doc.Editor;
                // Conjunto de selección previa.
                //PromptSelectionResult res = ed.SelectPrevious();
                // Selección activa.
                PromptSelectionResult res = ed.SelectImplied();
                if (res.Status == PromptStatus.OK)
                {
                    return res.Value.GetObjectIds();
                }
            }
            finally
            {

            }
            return null;
        }

        /*
        /// <summary>
        /// Recupera los ObjectId de todas las entidades del dibujo.
        /// </summary>
        /// <returns></returns>
        static ObjectId[] getAllEntities()
        {
            try
            {
                // Recuperación del conjunto de selección previo.
                Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                Editor ed = doc.Editor;
                // Conjunto de selección previa.
                PromptSelectionResult res = ed.SelectAll();
                // Selección activa.
                //PromptSelectionResult res = ed.SelectImplied();
                if (res.Status == PromptStatus.OK)
                {
                    return res.value.GetObjectIds();
                }
            }
            finally
            {

            }
            return null;
        }
        */
    }
}
