Как в блоке нарисовать ещё блок?

Автор Тема: Как в блоке нарисовать ещё блок?  (Прочитано 6113 раз)

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

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
И можно ли потом узнать в каком из вхождения блока находиться нарисованный блок? Имена блоков уникальны, но начинаются с определённых символов.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как в блоке нарисовать ещё блок?
« Ответ #1 : 26-11-2018, 22:00:10 »
В блоке (BlockTableRecord) может быть вставка (BlockReference) другого блока. Вставляешь её так же как и любой другой примитив.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Как в блоке нарисовать ещё блок?
« Ответ #2 : 27-11-2018, 16:08:28 »
Немного не получается. помогите  :) . Нажимаю кнопку на форме, выбираю мышкой блок OUT, в который хочу вставить блок IN.
В итоге блок OUT уже не блок, а некий "INSERT" с именем блока IN. Но видно, что внутри блока OUT появился новый объект. Думаю где-то тут ошибка:
Код - C# [Выбрать]
  1. // создаем новый экземпляр блока "IN" на основе его определения
  2.                     BlockReference ref_BLOCK_IN = new BlockReference(pt, btrId_in_EQ); // новый экземпляр блока "IN"
  3.                     //получаем ссылку на выбранный блок OUT
  4.                     var Ref_Selected_BLOCK_OUT = trAdding.GetObject(entResult.ObjectId, OpenMode.ForWrite) as BlockReference;
  5.                     //открываем на запись выбранный блок OUT
  6.                    BlockTableRecord btRecord_BLOCK_OUT = Ref_Selected_BLOCK_OUT.BlockTableRecord.Open(OpenMode.ForWrite) as BlockTableRecord;
  7.                     btTable.UpgradeOpen();
  8.                     btRecord_BLOCK_OUT.AppendEntity(ref_BLOCK_IN);
  9.                     trAdding.AddNewlyCreatedDBObject(ref_BLOCK_IN, true);
  10.                     trAdding.Commit();

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как в блоке нарисовать ещё блок?
« Ответ #3 : 27-11-2018, 16:23:52 »
В итоге блок OUT уже не блок, а некий "INSERT" с именем блока IN.
"INSERT" - это DXF-код для BlockReference. Видимо ты так и не понял различие между блоком (BlockTableRecord) и вставкой блока (BlockReference). Разбирайся.
У тебя в коде какая-то каша из обычной транзакции и использования ObjectId.Open, для которого обязательно нужно использовать Close.
Более прилично этот код выглядит так:
Код - C# [Выбрать]
  1. BlockReference ref_BLOCK_IN = new BlockReference(pt, btrId_in_EQ); // новый экземпляр блока "IN"
  2. // получаем ссылку на выбранный блок OUT
  3. BlockReference Ref_Selected_BLOCK_OUT =
  4.   trAdding.GetObject(entResult.ObjectId, OpenMode.ForWrite) as BlockReference;
  5. // открываем на запись выбранный блок OUT
  6. BlockTableRecord btRecord_BLOCK_OUT =
  7.   trAdding.GetObject(Ref_Selected_BLOCK_OUT.BlockTableRecord,OpenMode.ForWrite) as BlockTableRecord;
  8. btRecord_BLOCK_OUT.AppendEntity(ref_BLOCK_IN);
  9. trAdding.AddNewlyCreatedDBObject(ref_BLOCK_IN, true);
  10. Ref_Selected_BLOCK_OUT.RecordGraphicsModified(true);
  11. trAdding.Commit();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Как в блоке нарисовать ещё блок?
« Ответ #4 : 28-11-2018, 06:14:11 »
Спасибо Александр,
Добавил ещё строчку между 10 и 11:
Код - C# [Выбрать]
  1. btRecord_BLOCK_OUT.Close();
И всё заработало, теперь попытаюсь сделать это всё только транзакциями.


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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Как в блоке нарисовать ещё блок?
« Ответ #5 : 28-11-2018, 10:15:38 »
В общем сделал вложенную транзакцию в ней делаю вставку блока IN в OUT, В главной транзакции я генерирую блок IN. Может можно всё в одной транзакции сделать?
Но проблема пока в другом. Раньше я писал:
Код - C# [Выбрать]
  1. BlockReference Ref_Selected_BLOCK_OUT = trAdding2.GetObject(entResult.ObjectId, OpenMode.ForWrite) as BlockReference;
  2. BlockTableRecord btRecord_BLOCK_OUT = Ref_Selected_BLOCK_OUT.BlockTableRecord.Open(OpenMode.ForWrite) as BlockTableRecord;
Теперь я пишу:
Код - C# [Выбрать]
  1. BlockReference Ref_Selected_BLOCK_OUT = trAdding2.GetObject(entResult.ObjectId, OpenMode.ForWrite) as BlockReference;
  2. BlockTableRecord btRecord_BLOCK_OUT = trAdding2.GetObject(entResult.ObjectId, OpenMode.ForWrite) as BlockTableRecord;
и далее получаю что "btRecord_BLOCK_OUT is null"

Как мне в транзакции получить BlockTableRecord выбранного мышкой блока OUT?

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Как в блоке нарисовать ещё блок?
« Ответ #6 : 28-11-2018, 11:51:29 »
Получилось!!!
Когда открываем выбранное вхождение блока на запись вместо "entResult.ObjectId" надо писать "Ref_Selected_BLOCK_OUT.BlockTableRecord"
Код - C# [Выбрать]
  1.  #region вставляем блок IN в выбранный блок OUT
  2.                         DBObject obj = trAdding.GetObject(Selected_BLOCK_OUT_ID, OpenMode.ForWrite);
  3.                         BlockReference Ref_Selected_BLOCK_OUT = obj as BlockReference;
  4.                         Point3d pt = new Point3d(0, 0, 0);
  5.                         BlockReference ref_BLOCK_IN = new BlockReference(pt, btrId_in_EQ);
  6.                         BlockTableRecord btRecord_BLOCK_OUT = trAdding.GetObject(Ref_Selected_BLOCK_OUT.BlockTableRecord, OpenMode.ForWrite) as BlockTableRecord;                              
  7.                         btRecord_BLOCK_OUT.AppendEntity(ref_BLOCK_IN);
  8.                         trAdding.AddNewlyCreatedDBObject(ref_BLOCK_IN, true);
  9.                         Ref_Selected_BLOCK_OUT.RecordGraphicsModified(true);
  10.                     #endregion
  11.                     trAdding.Commit();

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как в блоке нарисовать ещё блок?
« Ответ #7 : 28-11-2018, 14:25:21 »
Получилось!!!
И чем это отличается от того кода, который я привёл?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Как в блоке нарисовать ещё блок?
« Ответ #8 : 28-11-2018, 14:37:25 »
Это называется смотрю в книгу вижу фигу)