Обновление всех атрибутов блока (Программно заменить команду АТРОБНОВИТЬ)

Автор Тема: Обновление всех атрибутов блока (Программно заменить команду АТРОБНОВИТЬ)  (Прочитано 6431 раз)

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

Оффлайн doctorRAZ

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
  • Skype: doctorraz
С разрешения Андрея Бушмана выкладываю здесь
Могу ли сослаться на архив сайта на другом форуме?
Atsync
Весьма вариативный метод получился.. к версии Бушмана, добавил "не изменять положение существующих атрибутов" вот далеко еще до этого((((
« Последнее редактирование: 09-08-2021, 20:28:41 от doctorRAZ »

Оффлайн doctorRAZ

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
  • Skype: doctorraz
вопрос по коду Бушмана
я правильно понял, что если мы выбрали измененный дин блок, то его  btr (описание) это btr анонимного блока
BlockTableRecord btr = (BlockTableRecord) t.GetObject(bt[br.Name], OpenMode.ForRead);
соответственно условие
if (btr.IsDynamicBlock) {
выполнено никогда не будет
и код Бушмана выполнится только для анонимного btr и его вхождений?
---------
Есть ли возможность из вхождения анонимного блока получить btr динамического блока "прародителя"?

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

  • Administrator
  • *****
  • Сообщений: 13191
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
соответственно условие
Цитата: Александр Ривилис от 30-09-2020, 17:27:33

    if (btr.IsDynamicBlock) {

выполнено никогда не будет
Будет. Анонимный блок, полученный из динамического - тоже динамический.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13191
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Могу ли сослаться на архив сайта на другом форуме?
Этот вопрос задавай Андрею.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13191
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Есть ли возможность из вхождения анонимного блока получить btr динамического блока "прародителя"?
Да. BlockReference.DynamicBlockTableRecord возвращает BlockTableRecord "прародителя".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн doctorRAZ

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
  • Skype: doctorraz
Анонимный блок, полученный из динамического - тоже динамический.
этот код
Код - C# [Выбрать]
  1.  
  2.   //https://adn-cis.org/forum/index.php?topic=10047.msg45331#msg45331
  3.         [CommandMethod("MySynch", Trtm.CommandFlags.Modal)]
  4.         public void MySynch()
  5.         {
  6.             Document dwg = acad.DocumentManager.MdiActiveDocument;
  7.             Editor ed = dwg.Editor;
  8.             Database db = dwg.Database;
  9.             TypedValue[] types = new TypedValue[] { new TypedValue((int)DxfCode.Start, "INSERT") };
  10.             SelectionFilter sf = new SelectionFilter(types);
  11.             PromptSelectionOptions pso = new PromptSelectionOptions();
  12.             pso.MessageForAdding = "Select block reference";
  13.             pso.SingleOnly = true;
  14.             pso.AllowDuplicates = false;
  15.             PromptSelectionResult psr = ed.GetSelection(pso, sf);
  16.             //*******************************
  17.             if (psr.Status == PromptStatus.OK)
  18.             {
  19.                 using (Transaction t = db.TransactionManager.StartTransaction())
  20.                 {
  21.                     BlockTable bt = (BlockTable)t.GetObject(db.BlockTableId, OpenMode.ForRead);
  22.                     BlockReference br = (BlockReference)t.GetObject(psr.Value[0].ObjectId, OpenMode.ForRead);
  23.                     BlockTableRecord btr = (BlockTableRecord)t.GetObject(bt[br.Name], OpenMode.ForRead);
  24.                     BlockTableRecord btrx = t.GetObject(br.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  25.                     btr.AttSync(false, true, false);
  26.                     //btr.UpdateAnonymousBlocks();
  27.                     t.Commit();
  28.                 }
  29.             }
  30.             else
  31.                 ed.WriteMessage("Bad selectionа.\n");
  32.             //********************************
  33.         }
  34.  
на примере из вложения
дает такой результат


не пойму, что я упускаю(((
AutoCAD2021x64

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

  • Administrator
  • *****
  • Сообщений: 13191
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Так. Я неправильно написал выше. Каюсь. BlockReference.IsDynamicBlock возвращает true даже если BlockReference.BlockTableRecord анонимный блок, но BlockReference.DynamicBlockTableRecord возвращает истинно динамический блок. Но BlockTableRecord.IsDynamicBlock возвращает true только для истинно динамического блока (неанонимного).

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13191
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Есть одна особенность у вставки динамического блока. Если его масштабы по X,Y,Z не одинаковы, то BlockReference.IsDynamicBlock возвращает false, даже если это динамический блок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн doctorRAZ

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
  • Skype: doctorraz
Если его масштабы по X,Y,Z не одинаковы, то BlockReference.IsDynamicBlock возвращает false, даже если это динамический блок
Спасибо, об этом я прочитал..
Но блок в сообщении выше... он динамический, в равных масштабах, динамика применена и он возвращает false
-----------
возможно btr получаю неправильно? как
// Метод для тестов:
https://adn-cis.org/forum/index.php?topic=10047.msg45331#msg45331
или блок кривой?

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

  • Administrator
  • *****
  • Сообщений: 13191
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
doctorRAZ,
Посмотри внимательно на эту картинку, полученную с твоего блока:


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн doctorRAZ

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
  • Skype: doctorraz
Посмотри внимательно на эту картинку, полученную с твоего блока
Возможно в первом ответе этой темы.... некорректный вызов
Код - C# [Выбрать]
  1.         //https://adn-cis.org/forum/index.php?topic=10047.msg45331#msg45331
  2.         [CommandMethod("MySynch", Trtm.CommandFlags.Modal)]
  3.         public void MySynch()
  4.         {
  5.             Document dwg = acad.DocumentManager.MdiActiveDocument;
  6.             Editor ed = dwg.Editor;
  7.             Database db = dwg.Database;
  8.             TypedValue[] types = new TypedValue[] { new TypedValue((int)DxfCode.Start, "INSERT") };
  9.             SelectionFilter sf = new SelectionFilter(types);
  10.             PromptSelectionOptions pso = new PromptSelectionOptions();
  11.             pso.MessageForAdding = "Select block reference";
  12.             pso.SingleOnly = true;
  13.             pso.AllowDuplicates = false;
  14.             PromptSelectionResult psr = ed.GetSelection(pso, sf);
  15.             //*******************************
  16.             if (psr.Status == PromptStatus.OK)
  17.             {
  18.                 using (Transaction t = db.TransactionManager.StartTransaction())
  19.                 {
  20.                     BlockTable bt = (BlockTable)t.GetObject(db.BlockTableId, OpenMode.ForRead);
  21.                     BlockReference br = (BlockReference)t.GetObject(psr.Value[0].ObjectId, OpenMode.ForRead);
  22.           //было          //BlockTableRecord btr = (BlockTableRecord)t.GetObject(bt[br.Name], OpenMode.ForRead);
  23.                     BlockTableRecord btr = t.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;// стало
  24.                     btr.AttSync(false, true, false);
  25.                     //btr.UpdateAnonymousBlocks();
  26.                     //BlockReference.DynamicBlockTableRecord
  27.                     t.Commit();
  28.                 }
  29.             }
  30.             else
  31.                 ed.WriteMessage("Bad selectionа.\n");
  32.             //********************************
  33.         }
  34.  
так будет верно
Код - C# [Выбрать]
  1.           //было          //BlockTableRecord btr = (BlockTableRecord)t.GetObject(bt[br.Name], OpenMode.ForRead);
  2.                     BlockTableRecord btr = t.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;// стало
  3.  
вроде работает и теперь передаем в метод btr дин блока, а не анонимного
-----------------
да теперь работает, обновляет все вхождения