Как узнать, вставлен ли блок в другой блок

Автор Тема: Как узнать, вставлен ли блок в другой блок  (Прочитано 13111 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
А непрохождение проверки IsLayout гарантирует, что блок вставлен в блок?
Гарантирует, что блок вставлен в блок, отличный от Пространства Листа или Пространство Модели. Пространство Листа и Пространство Модели - это тоже блоки. Причем если Пространство Модели может быть только одно, то Пространств Листа может быть множество.

Если я правильно понял логику твоей программы, то вместо
Код - vb.net [Выбрать]
  1. If parentBlockTabRec.IsLayout Then
  2.         blockIDs.Add(btrID)
  3. End If
должно быть
Код - vb.net [Выбрать]
  1. If Not parentBlockTabRec.IsLayout Then
  2.         blockIDs.Add(btrID)
  3. End If
Нет, всё нормально. Я позже допишу код для обработки вложенных блоков. Пока мне проще начать с блоков в пространстве модели, а для этого ещё нужно отделить их от находящихся в пространстве листа. Думаю, что это совсем не сложно.

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
Вообще конечная цель - это получение всех видимых в пространстве модели блоков одного типа, получение их свойств и атрибутов для дальнейшей обработки. Не отображаемые в пространстве модели блоки будут пропускаться. Был бы здорово, если бы у блоков было свойство, указывающее на то, виден ли блок в пространстве модели, что то типа VisibleOnModelSpace. Но такого свойства увы нет.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вообще конечная цель - это получение всех видимых в пространстве модели блоков одного типа, получение их свойств и атрибутов для дальнейшей обработки. Не отображаемые в пространстве модели блоки будут пропускаться. Был бы здорово, если бы у блоков было свойство, указывающее на то, виден ли блок в пространстве модели, что то типа VisibleOnModelSpace. Но такого свойства увы нет.
Ну эта задача на пару порядков сложнее, чем та, с которой ты начал. И конечно свойства типа VisibleOnModelSpace даже в принципе в AutoCAD быть не может.
1. Примитив виден если он на включенном и размороженном слое и (!!!) и его свойство Visible == true
2. Вставка блока видна если хотя бы один из примитивов в блоке виден (см. п.1), плюс нужно обработать атрибуты блока. А слой вставки блока играет роль только если примитивы внутри блока находятся на слое 0.
Это далеко не все нюансы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
А непрохождение проверки IsLayout гарантирует, что блок вставлен в блок?
Гарантирует, что блок вставлен в блок, отличный от Пространства Листа или Пространство Модели. Пространство Листа и Пространство Модели - это тоже блоки. Причем если Пространство Модели может быть только одно, то Пространств Листа может быть множество.
Прошу прощения за оффтоп, но есть ли простой способ определить, что "родительский" блок - это пространство модели?
Я пока придумал только получать ObjectId блока пространства модели так:
Код - vb.net [Выбрать]
  1. Dim dict As DBDictionary = tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead)
  2. Dim model As ObjectId
  3. For Each item In dict
  4.     Dim l As Layout = CType(item.Value.GetObject(OpenMode.ForRead), Layout)
  5.     If l.ModelType = True Then
  6.         model = tr.GetObject(l.BlockTableRecordId, OpenMode.ForRead).ObjectId
  7.     End If
  8. Next
А потом сравнивать его со свойством BlockId вхождения блока:
Код - vb.net [Выбрать]
  1. Dim parentBlockTabRec As BlockTableRecord = tr.GetObject(block.BlockId, OpenMode.ForRead)
  2. If parentBlockTabRec.ObjectId = model Then  'Блок непосредственно в пространстве модели
  3. 'Делаем что-то
  4. End If

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Я пока придумал только получать ObjectId блока пространства модели так:
А проще - вот так:
Код - C# [Выбрать]
  1. SymbolUtilityServices.GetBlockModelSpaceId
А это вообще песня:
Код - C# [Выбрать]
  1. model = tr.GetObject(l.BlockTableRecordId, OpenMode.ForRead).ObjectId
Открыть объект по Id на чтение, чтобы получить его Id.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Код - C# [Выбрать]
  1. Dim parentBlockTabRec As BlockTableRecord = tr.GetObject(block.BlockId, OpenMode.ForRead)
  2. If parentBlockTabRec.ObjectId = model Then  'Блок непосредственно в пространстве модели
Открытие объекта - весьма затратная по времени и ресурсам операция. Если можно обойтись без него, то нужно так и делать.
В данном случае block.BlockId и parentBlockTabRec.ObjectId - это одно и то же. Так зачем открывать блок на чтение, чтобы получить то, что у нас и так уже есть?

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 2
Код - C# [Выбрать]
  1. Dim parentBlockTabRec As BlockTableRecord = tr.GetObject(block.BlockId, OpenMode.ForRead)
  2. If parentBlockTabRec.ObjectId = model Then  'Блок непосредственно в пространстве модели
Открытие объекта - весьма затратная по времени и ресурсам операция. Если можно обойтись без него, то нужно так и делать.
В данном случае block.BlockId и parentBlockTabRec.ObjectId - это одно и то же. Так зачем открывать блок на чтение, чтобы получить то, что у нас и так уже есть?
Да, точно! Спасибо!