Класс для работы со слоем в Autocad .NET API

Недавно писал небольшой плагин для Autocad 2017. Задача была не сложная, наносить вертикальные линии в замкнутом контуре с определенным шагом. Спустя некоторое время, понял для себя, что удобнее всего было бы для таких задач использовать некоторый класс-обертку, который бы облегчал работу со слоем, отрисовкой примитивов и т.п.

Сегодня как раз и поговорим о подобном классе, облегчающим работу со слоями.

Естественно, для правильной работы подключаем ссылки на такие библиотеки как AcCoreMgd, AcDbMgd и AcMgd. Для своимх созданных классов я буду использовать пространство имен dsACAD. Мой новый класс будет работать со слоями, поэтому я его назову Layer (применяется интерфейс Acad).

Выкладываю полный листинг файла Layer.cs.

using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using System;

namespace dsACAD
{
    public class Layer : Acad
    {
        private readonly string name;

        /// <summary>
        /// Цвет слоя.
        /// </summary>
        private Color color;

        /// <summary>
        /// Пояснение для слоя.
        /// </summary>
        private string description;

        /// <summary>
        /// Вес линий.
        /// </summary>
        private LineWeight lineWeight;

        /// <summary>
        /// Прозрачность слоя.
        /// </summary>
        private Transparency transparency;

        /// <summary>
        /// Тип линий.
        /// </summary>
        private ObjectId linetype;

        /// <summary>
        /// Флаг заблокирован / разблокирован.
        /// </summary>
        private bool isLocked = false;

        /// <summary>
        /// Флаг вкл / выкл.
        /// </summary>
        private bool isOff = false;

        /// <summary>
        /// Флаг заморозки / разморозки.
        /// </summary>
        private bool isFrozen = false;

        /// <summary>
        /// Флаг заморозки на новых видовых экранах.
        /// </summary>
        private bool viewportVisibility = false;

        /// <summary>
        /// Флаг скрытия / отображения слоя.
        /// </summary>
        private bool isHidden = false;

        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="name"></param>
        public Layer(string name)
        {
            this.name = name;
        }

        /// <summary>
        /// Создать слой.
        /// </summary>
        /// <returns></returns>
        public bool Create()
        { 
            using (Transaction transaction = Database.TransactionManager.StartTransaction())
            {
                LayerTable layerTable;
                layerTable = transaction.GetObject(Database.LayerTableId, OpenMode.ForRead) as LayerTable;

                if (layerTable.Has(name) == false)
                {
                    layerTable.UpgradeOpen();

                    using (LayerTableRecord layerTableRecord = new LayerTableRecord())
                    {                       
                        if (this.color != null)
                        {
                            layerTableRecord.Color = this.color;
                        }
                    
                        if (this.lineWeight != LineWeight.ByLineWeightDefault)
                        {
                            layerTableRecord.LineWeight = this.lineWeight;
                        }
                      
                        layerTableRecord.IsOff = this.isOff;
                        layerTableRecord.IsFrozen = this.isFrozen;
                        layerTableRecord.IsLocked = this.isLocked;
                        layerTableRecord.ViewportVisibilityDefault = this.viewportVisibility;
                                         
                        // Название слоя
                        layerTableRecord.Name = name;
                                                                
                        layerTable.Add(layerTableRecord);

                        layerTableRecord.IsHidden = this.isHidden;

                        if (this.description != null)
                        {
                            layerTableRecord.Description = this.description;
                        }
                   
                        if (this.transparency != null)
                        {
                            layerTableRecord.Transparency = this.transparency;
                        }

                        if (this.linetype != null)
                        {
                            layerTableRecord.LinetypeObjectId = this.linetype;
                        }

                        transaction.AddNewlyCreatedDBObject(layerTableRecord, true);
                    }

                    transaction.Commit();

                    return true;
                }
            }

            return false;
        }

        /// <summary>
        /// Установить цвет слоя из палитры ARGB (графический интерфейс GDI+).
        /// </summary>
        /// <param name="color"></param>
        /// <returns></returns>
        public Layer SetColor(System.Drawing.Color color)
        {
            this.color = Color.FromColor(color);

            return this;
        }

        /// <summary>
        /// Установить цвет слоя из палитры ARGB (приложения WPF).
        /// </summary>
        /// <param name="color"></param>
        /// <returns></returns>
        public Layer SetColor(System.Windows.Media.Color color)
        {
            this.color = Color.FromColor(color);

            return this;
        }

        /// <summary>
        /// Установить цвет слоя из числового индекса.
        /// </summary>
        /// <param name="colorIndex"></param>
        /// <returns></returns>
        public Layer SetColorFromIndex(short colorIndex)
        {
            this.color = Color.FromColorIndex(ColorMethod.ByLayer, colorIndex);

            return this;
        }

        /// <summary>
        /// Установить цвет слоя из цветовой палитры RGB.
        /// </summary>
        /// <param name="red"></param>
        /// <param name="green"></param>
        /// <param name="blue"></param>
        /// <returns></returns>
        public Layer SetColorFromRgb(byte red, byte green, byte blue)
        {
            this.color = Color.FromRgb(red, green, blue);

            return this;
        }

        /// <summary>
        /// Установить описание слоя.
        /// </summary>
        /// <param name="description"></param>
        /// <returns></returns>
        public Layer SetDescription(string description)
        {
            this.description = description;

            return this;
        }

        /// <summary>
        /// Установить вес линии.
        /// </summary>
        /// <param name="lineWeight"></param>
        /// <returns></returns>
        public Layer SetLineWeight(LineWeight lineWeight = LineWeight.ByLineWeightDefault)
        {
            this.lineWeight = lineWeight;

            return this;
        }

        /// <summary>
        /// Установить прозрачность слоя от 0 до 90.
        /// </summary>
        /// <param name="transparency"></param>
        /// <returns></returns>
        public Layer SetTransparency(byte transparency)
        {
            Byte alpha = (Byte)(255 * (100 - transparency) / 100);

            this.transparency = new Transparency(alpha);

            return this;
        }

        /// <summary>
        /// Установить тип линии.
        /// </summary>
        /// <param name="nameLinetype"></param>
        /// <returns></returns>
        public Layer SetLinetype(string nameLinetype)
        {
            LinetypeTable linetypeTable;

            using (linetypeTable = Database.LinetypeTableId.GetObject(OpenMode.ForRead) as LinetypeTable)
            {
                if (linetypeTable.Has(nameLinetype) == true)
                {
                    this.linetype = linetypeTable[nameLinetype];
                }
            }

            return this;
        }

        /// <summary>
        /// Блокировать слой.
        /// </summary>
        /// <param name="isLocked"></param>
        /// <returns></returns>
        public Layer SetLocked(bool isLocked = true)
        {
            this.isLocked = isLocked;

            return this;
        }

        /// <summary>
        /// Выключить / включить слой.
        /// </summary>
        /// <param name="isOff"></param>
        /// <returns></returns>
        public Layer SetOff(bool isOff = true)
        {
            this.isOff = isOff;

            return this;
        }

        /// <summary>
        /// Заморозить / разморозить слой.
        /// </summary>
        /// <param name="isFrozen"></param>
        /// <returns></returns>
        public Layer SetFrozen(bool isFrozen = true)
        {
            this.isFrozen = isFrozen;

            return this;
        }

        /// <summary>
        /// Заморозить / разморозить для новых видовых экранов.
        /// </summary>
        /// <param name="flag"></param>
        /// <returns></returns>
        public Layer SetViewportVisibility(bool flag = true)
        {
            this.viewportVisibility = flag;

            return this;
        }

        /// <summary>
        /// Скрыть / отобразить слой.
        /// </summary>
        /// <param name="flag"></param>
        /// <returns></returns>
        public Layer SetHidden(bool flag = true)
        {
            this.isHidden = flag;

            return this;
        }

        /// <summary>
        /// Переместить примитив на текущий слой. 
        /// </summary>
        /// <param name="entity"></param>
        public void MoveToCurrentLayer(Entity entity)
        {
            using (Transaction transaction = Database.TransactionManager.StartTransaction())
            {
                LayerTable layerTable;
                layerTable = transaction.GetObject(Database.LayerTableId, OpenMode.ForRead) as LayerTable;

                if (layerTable.Has(this.name) == true)
                {
                    layerTable.UpgradeOpen();
                    entity.Layer = this.name;
                }

                transaction.Commit();
            }                        
        }

        /// <summary>
        /// Установить активным основной слой.
        /// </summary>
        public void SetActiveLayerZero()
        {
            using (Transaction transaction = Database.TransactionManager.StartTransaction())
            {
                Database.Clayer = Database.LayerZero;

                transaction.Commit();
            }
        }
    }
}

Получился такой небольшой, но полезный класс.

Листинг интерфейса файла Acad.cs.

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;

namespace dsACAD
{
    public abstract class Acad
    {
        private static Document document;
        private static Database database;

        public static Document Document { get => document; }
        public static Database Database { get => database; }

        public Acad()
        {
            document = Application.DocumentManager.MdiActiveDocument;
            database = Document.Database;
        }
    }
}

В данном случае интерфейс содержит свойства (только для чтения), которые хранят такие объекты как текущий документ и базу данных в Autocad. Теперь нет необходимости в каждом новом классе обращаться к ним через пространство Application в Autocad.

Примеры использования.

// Изменяем форматирование границ здания   
Layer lr = new Layer("DS_Контуры");
lr
    .SetColorFromIndex(18)
    .SetLineWeight(LineWeight.LineWeight035)
    .SetDescription("Содержит все контуры.")
    .Create();
Layer dlr = new Layer("DS_Направляющие_П");
dlr
    .SetColorFromIndex(5)
    .Create();
ObjectId objectId;

using (Polyline polyline = new Polyline())
{   
    //...
    objectId = polyline.Id;

    if (layerName.Length > 0)
    {
        Layer layer = new Layer(layerName);
        layer.MoveToCurrentLayer(polyline);
    }
    
    return objectId;
}

Вот таким простым способом мы упростили себе будущую работу со слоями в Autocad. Конечно же, Вы можете реализовать класс по другому или добавить свои полезные функции.

Спасибо за внимание и до новых встреч!

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: