Archivos de referencia

Aquí el vídeo relacionado con este post

Digi3D 2011 expone las entidades de los archivos de referencia (aquellos archivos que no son el archivo de dibujo activo) a través de la propiedad DigiNG.ReferenceFiles que devuelve un array de tipo ReadOnlyDrawingFile.

El array devuelto tendrá tantos valores como archivos de referencia cargados, y tal y como su nombre indica, no podemos realizar ninguna modificación sobre estos archivos, pues nos devuelve enumeradores de solo lectura.

En el siguiente ejemplo, vamos a desarrollar una orden que nos muestra en la ventana de resultados el número de entidades de cada tipo que tiene cada uno de los archivos de referencia cargados.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Digi21.DigiNG.Plugin.Command;
using Digi21.DigiNG.IO;
using Digi21.DigiNG;
using Digi21.Digi3D;
using Digi21.DigiNG.Entities;

namespace Pruebas
{
    public static class UtilidadesSecuenciaEntity
    {
        public static int CuantasEntidadesDeTipo<T>(this IEnumerable<Entity> entidades)
        {
            var secuenciaDeT = from entidad in entidades
                               where entidad is T
                               select entidad;

            return secuenciaDeT.Count();
        }
    }


    [Command(Name="cuenta_entidades_archivos_referencia")]
    public class CuentaEntidadesDeArchivosReferencia : Command
    {
        public CuentaEntidadesDeArchivosReferencia()
        {
            this.Initialize +=
                new EventHandler(CuentaEntidadesDeArchivosReferencia_Initialize);
        }


        void CuentaEntidadesDeArchivosReferencia_Initialize(object sender, EventArgs e)
        {
            try
            {
                var archivosReferencia = DigiNG.ReferenceFiles;

                if (archivosReferencia.Length == 0)
                {
                    Digi3D.Music(MusicType.Error);
                    Digi3D.ShowBallon(
                        "cuenta_entidades_archivos_referencia",
                        "No hay ningún archivo de referencia cargado",
                        2,
                        BallonIcon.Error);
                    return;
                }

                foreach (var archivo in DigiNG.ReferenceFiles)
                {
                    Digi3D.OutputWindow.WriteLine(archivo.Path);

                    Digi3D.OutputWindow.WriteLine(
                        "{0} líneas",
                        archivo.CuantasEntidadesDeTipo<ReadOnlyLine>());

                    Digi3D.OutputWindow.WriteLine(
                        "{0} puntos",
                        archivo.CuantasEntidadesDeTipo<ReadOnlyPoint>());

                    Digi3D.OutputWindow.WriteLine(
                        "{0} textos",
                        archivo.CuantasEntidadesDeTipo<ReadOnlyText>());

                    Digi3D.OutputWindow.WriteLine(
                        "{0} polígonos",
                        archivo.CuantasEntidadesDeTipo<ReadOnlyPolygon>());

                    Digi3D.OutputWindow.WriteLine(
                        "{0} complejos",
                        archivo.CuantasEntidadesDeTipo<ReadOnlyComplex>());
                }
            }
            finally
            {
                Dispose();
            }
        }
    }
}