Принадлежность имени блока

Автор Тема: Принадлежность имени блока  (Прочитано 3053 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!

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

 

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Принадлежность имени блока
« Ответ #1 : 11-06-2018, 18:13:07 »
К сожалению вы не понимаете самой сущности и смысла работы с блоками в Автокаде. Непременно почитайте обычный хелп по блокам.
- Не может существовать 3 блока с одним именем. Это один блок. Описан полностью в BlockTableRecord и там же задано имя. И три вставки блока в чертеж (BlockReference). BlockReference - это по сути ссылка. Она хранит матрицу преобразования и изменяемые атрибуты. И все. (Немного упрощаю конечно)
- ObjectId.Handle создается при записи объекта в БД чертежа и более никогда не меняется. Вроде бы не меняется... не 100% уверен. В XData и XRecord есть специальные типы данных для хранения Handle объектов.

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Принадлежность имени блока
« Ответ #2 : 11-06-2018, 19:10:24 »
Описан полностью в BlockTableRecord и там же задано имя.
То есть, если мне нужно выбрать все экземпляры блока с определенным названием в чертеже я делаю поиск внутри BlockTable (if BlockTable.Has(имя блока)), а не среди BlockTableRecord (if BlockTableRecord==имя блока)? Я пытаюсь выяснить является одновременно имя BlockTableRecord именем блока или BlockTableRecord  просто содержит имя блока внутри себя.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Принадлежность имени блока
« Ответ #3 : 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. ....

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Принадлежность имени блока
« Ответ #4 : 11-06-2018, 20:00:55 »
Очевидно что "таблица блоков"=BlockTable состоит из "записей таблицы блоков"=BlockTableRecord
Это я понимаю, вопрос в другом - как проверить наличие блока по его обычному имени типа "First block" внутри BlockTable без ObjectID и прочего, или такой возможности нет?

Отмечено как Решение Atomohod 11-06-2018, 22:14:42

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Принадлежность имени блока
« Ответ #5 : 11-06-2018, 20:35:51 »
да, по BlockTable.Has(имя блока) находите btr, а по btr.GetBlockReferenceIds находите все BlockReference - вставки блока в чертеж и в другие блоки (собственно модель и листы - это тоже ж блоки)

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Принадлежность имени блока
« Ответ #6 : 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.                }

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Принадлежность имени блока
« Ответ #7 : 11-06-2018, 20:57:43 »
Если вы ищите объекты модели - смотрите в btr модели, если на конкретном или текущем листе - то в его btr