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

/// <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.

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

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

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