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

ADN Club => AutoCAD .NET API => Тема начата: serega374 от 26-11-2018, 19:38:13

Название: Как в блоке нарисовать ещё блок?
Отправлено: serega374 от 26-11-2018, 19:38:13
И можно ли потом узнать в каком из вхождения блока находиться нарисованный блок? Имена блоков уникальны, но начинаются с определённых символов.
Название: Re: Как в блоке нарисовать ещё блок?
Отправлено: Александр Ривилис от 26-11-2018, 22:00:10
В блоке (BlockTableRecord) может быть вставка (BlockReference) другого блока. Вставляешь её так же как и любой другой примитив.
Название: Re: Как в блоке нарисовать ещё блок?
Отправлено: serega374 от 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();
Название: Re: Как в блоке нарисовать ещё блок?
Отправлено: Александр Ривилис от 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();
Название: Re: Как в блоке нарисовать ещё блок?
Отправлено: serega374 от 28-11-2018, 06:14:11
Спасибо Александр,
Добавил ещё строчку между 10 и 11:
Код - C# [Выбрать]
  1. btRecord_BLOCK_OUT.Close();
И всё заработало, теперь попытаюсь сделать это всё только транзакциями.

Название: Re: Как в блоке нарисовать ещё блок?
Отправлено: serega374 от 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?
Название: Re: Как в блоке нарисовать ещё блок?
Отправлено: serega374 от 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();
Название: Re: Как в блоке нарисовать ещё блок?
Отправлено: Александр Ривилис от 28-11-2018, 14:25:21
Получилось!!!
И чем это отличается от того кода, который я привёл?
Название: Re: Как в блоке нарисовать ещё блок?
Отправлено: serega374 от 28-11-2018, 14:37:25
Это называется смотрю в книгу вижу фигу)