Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Alexx от 23-10-2015, 09:33:26

Название: Ссылка на блок внутри блока
Отправлено: Alexx от 23-10-2015, 09:33:26
Добрый день!

До сегодняшнего дня я свято верил, что внутри блока (не блока листа) не может быть другого блока (или ссылки на блок).
Сегодня при переборе вхождений блока обнаружил это:

Код - C# [Выбрать]
  1. ...
  2. using (StreamWriter file = File.CreateText(fileName))
  3. {
  4.     foreach (ObjectId objId in blk)
  5.         file.WriteLine(objId.ObjectClass.Name);
  6.  
  7.     file.Close();
  8. }
  9. ...

В итоге получил такое:
...
AcDbLine
AcDbLine
AcDbBlockReference
AcDbBlockReference
AcDbMText
AcDbLine
...

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

Отсюда два вопроса:

1. Это вообще нормальная ситуация?
2. Ок, если это допустимо, то как мне транслировать координаты объектов этих блоков внутри блока на чертеж? Раньше я получал объект из блока и вызывал у него GetTransformedCopy(blockReference.BlockTransform). Для для объектов BlockReference это вызывает порождение "пустой" копии BlockReference с нулевым ObjectId и далее при попытке получить BlockDefinition от этой копии BlockReference вылетает исключение NulBlockId.

Спасибо!


UPDATE:

GetTransformedCopy возвращает копию объекта с координатами относительно листа или с координатами относительно того блока, в котором находится BlockReference?

Ну т.е. у меня такая ситуация:

Лист (блок листа)
    Ссылка на блок 1ур (получаю блок)
        Ссылка на блок 2ур (получаю блок)
            Объект 1
            Объект 2
            Объект n

Я беру объекты (1..n) и вызываю GetTransformedCopy(ссылка на блок 2ур.BlockTransform)... Я получаю копию объекта с координатами относительно листа (блока листа)? Или с координатами блока 1ур?
Название: Re: Ссылка на блок внутри блока
Отправлено: Александр Ривилис от 23-10-2015, 11:51:50
До сегодняшнего дня я свято верил, что внутри блока (не блока листа) не может быть другого блока (или ссылки на блок).
И зря. Внутри описания любого блока (BlockTableRecord) может быть сколько угодно вставок блока (BlockReference).
После этого полез в чертеж, в редактор блока и не обнаружил внутри блока этих двух ссылок на другие блоки (или может плохо искал - чертеж большой и сложный).
Скорее всего именно плохо искал.
1. Это вообще нормальная ситуация?
Абсолютно нормальная.
как мне транслировать координаты объектов этих блоков внутри блока на чертеж?
Напрямую ты транслировать координаты вложенного блока не можешь, т.к. BlockTransform возвращает тебе матрицу преобразования из системы координат блока в систему координат определения блока (в частности в Пространство Модели или Пространство Листа), в который он вставлен. Необходимо перемножать матрицы.
В качестве примера: http://adn-cis.org/forum/index.php?topic=2933.msg12071#msg12071
Название: Re: Ссылка на блок внутри блока
Отправлено: Alexx от 23-10-2015, 11:58:51
Александр, спасибо за ответы.