Как получить список замороженных слоев на подшивке?

Автор Тема: Как получить список замороженных слоев на подшивке?  (Прочитано 19493 раз)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Добрый день!

Нужно получить список замороженных слоев на подшивке (либо проверить находится ли объект на слое, который заморожен на данной подшивке).

Где-то когда-то нашел примерно следующий код, но в buffer всегда null.

Код - C# [Выбрать]
  1.         public IEnumerable<string> EnumFrozenLayers(Layout layout)
  2.         {
  3.             using (ResultBuffer buffer = layout.GetXDataForApplication("ACAD"))
  4.             {
  5.                 if (buffer == null) yield break;
  6.                 foreach (TypedValue value in buffer)
  7.                 {
  8.                     if (value.TypeCode == 1003)
  9.                         yield return (string)value.Value;
  10.                 }
  11.             }
  12.         }
  13.  

И еще вдогонку парочка вопросов:

1. После того, как для транзакции был вызван Commit(), она не может больше использоваться и нужно создавать новую? Или же можно использовать ее дальше?

2. Транзакция не уничтожается при уничтожении Database?

Спасибо!

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
1. После того, как для транзакции был вызван Commit(), она не может больше использоваться и нужно создавать новую? Или же можно использовать ее дальше?
Не может использоваться, нужно создавать новую.

2. Транзакция не уничтожается при уничтожении Database?
Возможно будет интересно почитать это.

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Андрей, спасибо.

Познавательный материал.

Жаль на основной вопрос (про замороженные слои на подшивке) ответа я так и не получил.

Хотя на VBA я делал вот так:

Код - Visual Basic [Выбрать]
  1.     ' Получаем список замороженных слоев для данной подшивки
  2.    Dim frzLayer, frzLayers: Set frzLayers = New Collection
  3.     If UCase(layout.name) <> UCase("Model") Then
  4.         Dim dataType, dataValue
  5.         layout.block(0).GetXData "ACAD", dataType, dataValue
  6.         Dim i: For i = 0 To UBound(dataType) - 1
  7.             If dataType(i) = 1003 Then frzLayers.Add dataValue(i)
  8.         Next
  9.     End If
  10.  

Собственно тут я получал список замороженных слоев не из самого листа, а из первого объекта блока (обычно это видовой экран - но не знаю насколько это правильно и всегда ли первый объект - видовой экран). Думаю, что на C# это должно делаться как-то логичнее и проще.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Жаль на основной вопрос (про замороженные слои на подшивке) ответа я так и не получил.
Подшивка (DST-файл) не имеет слоёв. Слои определены в составе документов, на листы которых ссылается подшивка.

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Прошу прощения, я наверное что-то с терминологией напутал - я пока только учусь. Для меня листы всегда были Sheet, а в AutoCAD они вроде как Layout...  ::)

Имелось в виду замороженные слои на листе.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Прошу прощения, я наверное что-то с терминологией напутал - я пока только учусь. Для меня листы всегда были Sheet, а в AutoCAD они вроде как Layout... 
Первая же ссылка в Google.

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Эту ссылку я видел, но там замороженные листы берутся из видового экрана, выбранного пользователем.
Я так понимаю (могу ошибаться, так как знаком с AutoCAD не так давно), что видовых экранов на листе может быть несколько. Кстати есть же PViewport и Viewport (по-крайней мере в документации к ActiveX они описаны)? Я так понимаю, что PViewport - это видовой экран для листа и он всегда один, а Viewport - это видовой экран модели (типа окошка на листе, в которое смотришь на модель) и их может быть несколько, так? Значит чтобы мне получить замороженные слои на листе, мне нужно взять первый видовой экран листа (PViewport) и вызвать у него GetXData? Так? Или я опять что-то путаю?

Первый пример я тоже не сам придумал, а нашел где-то в интернетах. К сожалению, он не работает.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я так понимаю (могу ошибаться, так как знаком с AutoCAD не так давно), что видовых экранов на листе может быть несколько.
Это возможно. Но есть основной, который создаётся при инициализации листа. Впрочем это не важно. Имеется метод Layout.GetViewports, который возвращает коллекцию ObjectId видовых экранов листа, которые и следует проанализировать.
P.S.: У листа нет замороженных слоёв - они есть у видового экрана.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Но есть основной, который создаётся при инициализации листа. Впрочем это не важно. Имеется метод Layout.GetViewports, который возвращает коллекцию ObjectId видовых экранов листа, которые и следует проанализировать.

Александр, а как узнать который ВЭ "основной"? У него есть какие-то особенности или он просто будет первым в списке? Остальные ВЭ меня не особенно интересуют, мне нужно узнать заморожен ли слой объекта, находящегося на листе, а не на модели.

Отмечено как Решение Alexx 30-07-2015, 23:29:22

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Возможно будет интересно почитать это.

Только что попробовал обход довольно большого чертежа по листам->блокам->объектам + фильтры + проверки

Используя StartOpenCloseTransaction получилось около 14 секунд.
Используя StartTransaction вышло около 3 секунд.

Т.е разница в производительности довольно ощутимая даже для клиентского приложения.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Только что попробовал обход довольно большого чертежа по листам->блокам->объектам + фильтры + проверки

Используя StartOpenCloseTransaction получилось около 14 секунд.
Используя StartTransaction вышло около 3 секунд.

Т.е разница в производительности довольно ощутимая даже для клиентского приложения.
Результат достаточно странный. Особенно если ты открывал все примитивы в режиме "ForRead".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Да, открывал в режиме ForRead. Единственное, у меня в коде везде using, что для StartTransaction - нормально, а для StartOpenCloseTransaction - не знаю как :)

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
у меня в коде везде using, что для StartTransaction - нормально, а для StartOpenCloseTransaction - не знаю как
Оба класса наследуются от Transaction, который реализует IDisposable. Соответственно использование using для них целесообразно.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Да, открывал в режиме ForRead.
Тогда совсем странно. Боюсь, что ты что-то перемудрил в коде.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение