Как переключить LayerState внешней ссылки xref?

Автор Тема: Как переключить LayerState внешней ссылки xref?  (Прочитано 6630 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Добрый день! LayerStates имя -"1" в Viewports на листе переключается таким кодом:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5. namespace Test
  6. {
  7.     public class Test
  8.     {
  9.         [CommandMethod("LSPAV", CommandFlags.NoBlockEditor)]
  10.         public void Run()
  11.         {
  12.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  13.             Database db = adoc.Database;
  14.             Editor ed = adoc.Editor;
  15.             LayoutManager lm = LayoutManager.Current;
  16.             LayerStateManager lsm = db.LayerStateManager;
  17.             using (Transaction tr = db.TransactionManager.StartTransaction())
  18.             {
  19.                 Layout cl = tr.GetObject(lm.GetLayoutId(lm.CurrentLayout), OpenMode.ForRead) as Layout;
  20.                 ObjectIdCollection colvp = cl.GetViewports();
  21.                 colvp.RemoveAt(0);
  22.                 foreach (ObjectId id in colvp)
  23.                 {
  24.                     Viewport vp = tr.GetObject(id, OpenMode.ForRead) as Viewport;
  25.                     // Номер текущего видового экрана
  26.                     short vpNumber = (short)vp.Number;
  27.                     // Обновляем вид
  28.                     ed.UpdateScreen();
  29.                     // Переходим внутрь активного ВЭ
  30.                     ed.SwitchToModelSpace();
  31.                     // Переключаемся в обрабатываемый ВЭ                                            
  32.                     Application.SetSystemVariable("CVPORT", vpNumber);
  33.                     if (lsm.HasLayerState("1") == true)
  34.                     {
  35.                     lsm.RestoreLayerState("1", id, 1,
  36.                     LayerStateMasks.Color |
  37.                     LayerStateMasks.Frozen |
  38.                     LayerStateMasks.LineType |
  39.                     LayerStateMasks.LineWeight | LayerStateMasks.Locked |
  40.                     LayerStateMasks.On |
  41.                     LayerStateMasks.Plot | LayerStateMasks.PlotStyle |
  42.                     //LayerStateMasks.LastRestored|
  43.                     //LayerStateMasks.None|
  44.                     LayerStateMasks.NewViewport |
  45.                     LayerStateMasks.CurrentViewport |
  46.                     LayerStateMasks.Transparency
  47.                      );
  48.                     }
  49.                         ed.SwitchToPaperSpace();
  50.                 }
  51.                 tr.Commit();
  52.             }
  53.         }
  54.     }
  55. }
  56.  
Переключение состояние слоев внешней ссылки xref  (имя уже будет "1_1") не работает.Прошу указать направление куда двигаться(нужно ли лезть в базу xref, ReadDwgFile... либо вообще другое что то).

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Подготовь простейший пример с основным файлом и файлом внешней ссылки и несколько LayerState и в основном файле и в файле внешней ссылки.
P.S.: А ты импортировал соответствующий LayerState из файла внешней ссылки?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Не импортировал. После Xаttach из файла 1 в файл 2  в Layer State Manager файла 2 появляются имена состояний файла 1 (1_1,2_2...).

Отмечено как Решение pavka_97 23-09-2018, 14:06:37

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Так если имя задавать такое "1__1", то все норм:
Код - C# [Выбрать]
  1.                     if (lsm.HasLayerState("1__1") == true)
  2.                     {
  3.                     lsm.RestoreLayerState("1__1", id, 1,

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Так я и думал что ответ прост. "1__1" против "1_1" . :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вильдар,
Отличная работа! Я не проверял код, но полазил при помощи ARXDBG по базе и тоже отметил несоответствие имени.
pavka_97,
Еще рекомендую после таких операций выполнять:
Код - C# [Выбрать]
  1. ed.ApplyCurDwgLayerTableChanges();
  2. ed.Regen();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
if (lsm.HasLayerState("1") == true)
https://bash.im/quote/66390
Есть такой дядькя - Джереми Таммик - вот он бы написал так:
Код - C# [Выбрать]
  1. if (true == lsm.HasLayerState("1"))
=)