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

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 11-06-2018, 12:32:43

Название: Принадлежность имени блока
Отправлено: Atomohod от 11-06-2018, 12:32:43
Здравствуйте!

Прошу пояснить тонкий момент. Есть чертеж, в нем есть блоки с атрибутами. Часть блоков имеет одинаковые имена, часть уникальные.
Например: три блока с именем Block1, пять блоков с именем block07 и один блок с именем Item.
Вопросы:
- где хранится непосредственно имя блока - в BlockTableRecord или в BlockTable?
- для блоков с одинаковым именем существует одна BlockTableRecord или для каждого своя отдельная? (значения атрибутов у всех одинаковых блоков разные).
- ObjectID блока существует только в период от открытия чертежа и работы с ним до сохранения и закрытия или он постоянен при использовании во всех сессиях? То есть можно ли его использовать как уникальный ID на весь период существования объекта в чертеже или нет?

 
Название: Re: Принадлежность имени блока
Отправлено: avc от 11-06-2018, 18:13:07
К сожалению вы не понимаете самой сущности и смысла работы с блоками в Автокаде. Непременно почитайте обычный хелп по блокам.
- Не может существовать 3 блока с одним именем. Это один блок. Описан полностью в BlockTableRecord и там же задано имя. И три вставки блока в чертеж (BlockReference). BlockReference - это по сути ссылка. Она хранит матрицу преобразования и изменяемые атрибуты. И все. (Немного упрощаю конечно)
- ObjectId.Handle создается при записи объекта в БД чертежа и более никогда не меняется. Вроде бы не меняется... не 100% уверен. В XData и XRecord есть специальные типы данных для хранения Handle объектов.
Название: Re: Принадлежность имени блока
Отправлено: Atomohod от 11-06-2018, 19:10:24
Описан полностью в BlockTableRecord и там же задано имя.
То есть, если мне нужно выбрать все экземпляры блока с определенным названием в чертеже я делаю поиск внутри BlockTable (if BlockTable.Has(имя блока)), а не среди BlockTableRecord (if BlockTableRecord==имя блока)? Я пытаюсь выяснить является одновременно имя BlockTableRecord именем блока или BlockTableRecord  просто содержит имя блока внутри себя.
Название: Re: Принадлежность имени блока
Отправлено: avc от 11-06-2018, 19:44:53
Очевидно что "таблица блоков"=BlockTable состоит из "записей таблицы блоков"=BlockTableRecord
Код - C# [Выбрать]
  1.         BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead, false) as BlockTable;
  2.         foreach (ObjectId btrId in bt)
  3.         {
  4.           BlockTableRecord btr = tr.GetObject(btrId, OpenMode.ForRead) as BlockTableRecord;
  5. ....
Название: Re: Принадлежность имени блока
Отправлено: Atomohod от 11-06-2018, 20:00:55
Очевидно что "таблица блоков"=BlockTable состоит из "записей таблицы блоков"=BlockTableRecord
Это я понимаю, вопрос в другом - как проверить наличие блока по его обычному имени типа "First block" внутри BlockTable без ObjectID и прочего, или такой возможности нет?
Название: Re: Принадлежность имени блока
Отправлено: avc от 11-06-2018, 20:35:51
да, по BlockTable.Has(имя блока) находите btr, а по btr.GetBlockReferenceIds находите все BlockReference - вставки блока в чертеж и в другие блоки (собственно модель и листы - это тоже ж блоки)
Название: Re: Принадлежность имени блока
Отправлено: Atomohod от 11-06-2018, 20:51:18
(собственно модель и листы - это тоже ж блоки)
это тоже непонятный момент- у Kean Walmsley в блоге есть код в котором он особо выделяет пространство модели и  пространство листа, в документации по ARX я не нашел требования для обязательного указания рабочего пространства. 
Вопрос- нужно ли указывать модель/лист и что произойдет если не указывать явно пространство.

Код - C# [Выбрать]
  1.                
  2. ObjectId msId, psId;
  3. Transaction tr = db.TransactionManager.StartTransaction( );
  4.                using (tr)
  5.                {
  6.                     BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  7.                     msId = bt [BlockTableRecord.ModelSpace];
  8.                     psId = bt [BlockTableRecord.PaperSpace];
  9.  
  10.                     // Not needed, but quicker than aborting
  11.                     tr.Commit( );
  12.                }
Название: Re: Принадлежность имени блока
Отправлено: avc от 11-06-2018, 20:57:43
Если вы ищите объекты модели - смотрите в btr модели, если на конкретном или текущем листе - то в его btr