Состояния слоев

Со слоем также связано понятие "Состояние слоя" (в AutoCAD он также называется "Фильтр" в окне СЛОЙ). Оно включают в себя информацию о том, включен ли слой, заморожен ли он, заблокирован ли, выведен ли на печать и автоматически замораживается ли в видовых экранах, а также хранит информацию о цвете слоя, связанных типа линии, толщины линии и стиля печати. Данные о состоянии слоя можно сохранить и обратиться к ним позднее; этот инструмент облегчает хранение различных конфигураций настроек слоев.

Доступ к состояниям слоев осуществляется через вспомогательный класс LayerStateManager (состоит из набора словарей), возвращаемый через одноименное свойство у объекта Database.

Подробнее о механике сохранения состояний слоя

AutoCAD сохраняет информацию о настройках слоев в словаре расширений объекта LayerTable. При первом сохранении состояния слоя AutoCAD выполняет следующие действия:

  • Создает словарь расширений в таблице слоев;
  • Создает объект Dictionary с именем ACAD_LAYERSTATE в словаре расширений;
  • Сохраняет свойства каждого слоя чертежа в объекте XRecord в словаре ACAD_LAYERSTATE. AutoCAD сохраняет все настройки слоев в XRecord, но в дальнейшем при восстановлении будет использоваться только те, которые вы выбрали для сохранения;

При сохранении других настроек слоев в чертеже, AutoCAD создает другой объект XRecord, описывающий сохраненные настройки, и сохраняет XRecord в словаре ACAD_LAYERSTATE.

Сохранение и чтение состояний слоев

Пример ниже сохраняет информацию о состоянии слоев (заморозка, видимость, цвет) в набор "Config1":

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

[CommandMethod("SaveLayerStates")]
public static void SaveLayerStates()
{
    // Get the current document and database
    Document acDoc = Application.DocumentManager.MdiActiveDocument;
    Database acCurDb = acDoc.Database;
    // Start a transaction
    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
    {
        LayerStateManager acLyrStMan;
        acLyrStMan = acCurDb.LayerStateManager;
        acLyrStMan.SaveLayerState("Config1", LayerStateMasks.Frozen | LayerStateMasks.On |
LayerStateMasks.Color, ObjectId.Null);
        acTrans.Commit();
    }
}

Пример ниже выводит информации в модальное окно о конфигурациях слоев, имеющихся в данном чертеже

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

[CommandMethod("ListLayerStates")]
public static void ListLayerStates()
{
    // Get the current document and database
    Document acDoc = Application.DocumentManager.MdiActiveDocument;
    Database acCurDb = acDoc.Database;
    // Start a transaction
    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
    {
        LayerStateManager acLyrStMan;
        acLyrStMan = acCurDb.LayerStateManager;
        DBDictionary acDbDict;
        acDbDict = acTrans.GetObject(acLyrStMan.LayerStatesDictionaryId(true),
                                        OpenMode.ForRead) as DBDictionary;
        string sLayerStateNames = "";
        foreach (DBDictionaryEntry acDbDictEnt in acDbDict)
        {
            sLayerStateNames = sLayerStateNames + "\\n" + acDbDictEnt.Key;
        }
        Application.ShowAlertDialog("The saved layer settings in this drawing are:" +
                                    sLayerStateNames);
        // Dispose of the transaction
    }
}