зная ObjectId блокаЧто имеется в виду под блоком? BlockReference (вставка блока) или BlockTableRecord (описание блока) ?
Описание блока.зная ObjectId блокаЧто имеется в виду под блоком? BlockReference (вставка блока) или BlockTableRecord (описание блока) ?
Самый простой, на мой взгляд, вариант:Это первое, что приходит в голову. Но на мой взгляд это похоже на брутфорс.
1. Узнать имя искомого блока. Если знаете ObjectId, значит узнать имя - не проблема
2. Провести итерацию по всем BlockTableRecord в документе
3. В каждом BlockTableRecord провести итерацию по всем объектам внутри и если это блок - сравнить его имя с искомым блоком
Сопроводить это множеством различных условий, чтобы уменьшить количество проверяемых BlockTableRecord
Описание блока.А нужно найти в какие блоки есть вставки этого блока? Тогда:
Да, блок динамический. Спасибо! Я сделаю так и отпишусь.Описание блока.А нужно найти в какие блоки есть вставки этого блока? Тогда:
1) пользуйся методом BlockTableRecord.GetBlockReferenceIds для получения всех вставок блока.
2) потом для каждой вставки находи свойство BlockId для определения в каком блоке он находится.
3) если же наш блок динамический, то задача усложняется. В этом случае кроме того, что мы проделали для обычного блока нужно еще и найти все его анонимные блоки (BlockTableRecord) при помощи BlockTableRecord.GetAnonymousBlockIds
4) для каждого анонимного блока из 3) переходим к пункту 1).
Вот и весь алгоритм.
Да, блок динамический. Спасибо! Я сделаю так и отпишусь.Вот тебе заготовка для решения этой задачи: http://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html
Спасибо! Это я уже использую.Да, блок динамический. Спасибо! Я сделаю так и отпишусь.Вот тебе заготовка для решения этой задачи: http://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html
Работает, но BlockId выдаёт и *ModelSpace в качестве родительского блока. Вот такой код:Описание блока.А нужно найти в какие блоки есть вставки этого блока? Тогда:
1) пользуйся методом BlockTableRecord.GetBlockReferenceIds для получения всех вставок блока.
2) потом для каждой вставки находи свойство BlockId для определения в каком блоке он находится.
3) если же наш блок динамический, то задача усложняется. В этом случае кроме того, что мы проделали для обычного блока нужно еще и найти все его анонимные блоки (BlockTableRecord) при помощи BlockTableRecord.GetAnonymousBlockIds
4) для каждого анонимного блока из 3) переходим к пункту 1).
Вот и весь алгоритм.
Команда: WHOISMYPARENT
Какой-то блок
*Model_Space
Всё так и есть - один блок вставлен в Какой-то блок.Всё так и есть - один блок вставлен в Какой-то блок.Не понял что тебя не устраивает. Вроде бы это в точности постановка задачи. Или тебя не интересуют блоки вставленные прямо в Пространство модели? Если не интересуют, то ты можешь отсечь *Model_Space (а при желании и *Paper_Space) проверив, что BlockTableRecord.IsLayout для него возвращает false
Другой просто находится в пространстве модели.
То есть работает-то работает, но не совсем как надо.
1. Судя по коду ты обрабатываешь только анонимные блоки. Т.е. ты считаешь, что в неизменном виде этого динамического блока быть не может?Да, Вы правы. Всё исправил и сделал проверку IsLayout. Теперь получилось всё, как я хотел.
2. Вот эта проверка лишняя: If block.DynamicBlockReferencePropertyCollection.Count > 0 Then так как анонимные блоки ты получаешь только для динамического блока.Всё так и есть - один блок вставлен в Какой-то блок.Не понял что тебя не устраивает. Вроде бы это в точности постановка задачи. Или тебя не интересуют блоки вставленные прямо в Пространство модели? Если не интересуют, то ты можешь отсечь *Model_Space (а при желании и *Paper_Space) проверив, что BlockTableRecord.IsLayout для него возвращает false
Другой просто находится в пространстве модели.
То есть работает-то работает, но не совсем как надо.
Спасибо в третий раз!В благодарность код что-ли выложи. Может еще чего подскажу.
А непрохождение проверки IsLayout гарантирует, что блок вставлен в блок?Гарантирует, что блок вставлен в блок, отличный от Пространства Листа или Пространство Модели. Пространство Листа и Пространство Модели - это тоже блоки. Причем если Пространство Модели может быть только одно, то Пространств Листа может быть множество.
Нет, всё нормально. Я позже допишу код для обработки вложенных блоков. Пока мне проще начать с блоков в пространстве модели, а для этого ещё нужно отделить их от находящихся в пространстве листа. Думаю, что это совсем не сложно.А непрохождение проверки IsLayout гарантирует, что блок вставлен в блок?Гарантирует, что блок вставлен в блок, отличный от Пространства Листа или Пространство Модели. Пространство Листа и Пространство Модели - это тоже блоки. Причем если Пространство Модели может быть только одно, то Пространств Листа может быть множество.
Если я правильно понял логику твоей программы, то вместоКод - vb.net [Выбрать]должно быть
If parentBlockTabRec.IsLayout Then blockIDs.Add(btrID) End IfКод - vb.net [Выбрать]
If Not parentBlockTabRec.IsLayout Then blockIDs.Add(btrID) End If
Вообще конечная цель - это получение всех видимых в пространстве модели блоков одного типа, получение их свойств и атрибутов для дальнейшей обработки. Не отображаемые в пространстве модели блоки будут пропускаться. Был бы здорово, если бы у блоков было свойство, указывающее на то, виден ли блок в пространстве модели, что то типа VisibleOnModelSpace. Но такого свойства увы нет.Ну эта задача на пару порядков сложнее, чем та, с которой ты начал. И конечно свойства типа VisibleOnModelSpace даже в принципе в AutoCAD быть не может.
Прошу прощения за оффтоп, но есть ли простой способ определить, что "родительский" блок - это пространство модели?А непрохождение проверки IsLayout гарантирует, что блок вставлен в блок?Гарантирует, что блок вставлен в блок, отличный от Пространства Листа или Пространство Модели. Пространство Листа и Пространство Модели - это тоже блоки. Причем если Пространство Модели может быть только одно, то Пространств Листа может быть множество.
Я пока придумал только получать ObjectId блока пространства модели так:А проще - вот так:
Открытие объекта - весьма затратная по времени и ресурсам операция. Если можно обойтись без него, то нужно так и делать.Код - C# [Выбрать]
Dim parentBlockTabRec As BlockTableRecord = tr.GetObject(block.BlockId, OpenMode.ForRead) If parentBlockTabRec.ObjectId = model Then 'Блок непосредственно в пространстве модели
Да, точно! Спасибо!Открытие объекта - весьма затратная по времени и ресурсам операция. Если можно обойтись без него, то нужно так и делать.Код - C# [Выбрать]
Dim parentBlockTabRec As BlockTableRecord = tr.GetObject(block.BlockId, OpenMode.ForRead) If parentBlockTabRec.ObjectId = model Then 'Блок непосредственно в пространстве модели
В данном случае block.BlockId и parentBlockTabRec.ObjectId - это одно и то же. Так зачем открывать блок на чтение, чтобы получить то, что у нас и так уже есть?