изменить атрибуты для копий вложенных блоков

Автор Тема: изменить атрибуты для копий вложенных блоков  (Прочитано 7321 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Здравствуйте форумчане!
Подскажите как решить вопрос.
У меня есть вложенный блок, нужно иметь возможность редактировать атрибуты всех блоков во вложенном блоке. Это я сделал, но если я делаю копии вложенного блока, и меняю аттрибуты в копиях, то сохраняеться только последнее изменения для всех вложенных блоков.(Тоесть последний блок презаписывает все остальные копии)
Как сделать так, что бы в копиях вложенных блоков можно было редактировать атрибуты?
Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как сделать так, что бы в копиях вложенных блоков можно было редактировать атрибуты?
Это можно сделать единственным способом - делать полную копию блока (т.е. копировать не только BlockReference, но и его BlockTableRecord и копия BlockReference должна ссылаться на копию BlockTableRecord).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А вообще выложи пример блока и код, которым ты изменяешь атрибуты. Возможно не всё так страшно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Вот здесь я получаю идентификаторы

Код - C# [Выбрать]
  1.                         BlockReference br = (BlockReference)tr.GetObject(idNested, OpenMode.ForRead);
  2.                        
  3.                         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(br.BlockTableRecord, OpenMode.ForRead);
  4.                        
  5.                         foreach (ObjectId id in btr)
  6.                         {
  7.                             idsCollection.Add(id);
  8.                         }
Потом передаю их в другую функцию
 
Код - C# [Выбрать]
  1. foreach (ObjectId brId in ids)
  2.                             {
  3.                                 BlockReference br = (BlockReference)acTrans.GetObject(brId, OpenMode.ForRead);
  4.                                 if (br != null && br.AttributeCollection.Count > 0)
  5.                                 {
  6.                                     psAcCommon.Methods.setTagAttributeValues(acTrans, br, setTagValues, tagValues);
  7.                                 }
  8.                             }
« Последнее редактирование: 28-09-2018, 20:11:20 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Прочитай у меня в подписи о правиле форматирования кода для нашего форума и соблюдай его!
2. Я должен сам догадываться что делает psAcCommon.Methods.setTagAttributeValues(acTrans, br, setTagValues, tagValues); ???
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Код - C# [Выбрать]
  1.  
  2.   public static void setTagAttributeValues(Transaction acTrans, BlockReference br,
  3.             bool[] setTagValues, string[] tagsValues)
  4.         {
  5.             AttributeCollection ac = br.AttributeCollection;
  6.  
  7.             foreach (ObjectId attId in ac)
  8.             {
  9.                 AttributeReference ar = (AttributeReference)acTrans.GetObject(attId, OpenMode.ForRead);
  10.                 if (ar != null)
  11.                 {
  12.                     if (setTagValues[0] && attDefsTag1.Contains(ar.Tag))
  13.                     {
  14.                         ar.UpgradeOpen();
  15.                         ar.TextString = tagsValues[0];
  16.                     }
  17.                     else if (setTagValues[1] && attDefsTag2.Contains(ar.Tag))
  18.                     {
  19.                         ar.UpgradeOpen();
  20.                         ar.TextString = tagsValues[1];
  21.                     }
  22.                     else if (setTagValues[2] && attDefsTag3.Contains(ar.Tag))
  23.                     {
  24.                         ar.UpgradeOpen();
  25.                         ar.TextString = tagsValues[2];
  26.                     }
  27.                     else if (setTagValues[3] && attDefsTag4.Contains(ar.Tag))
  28.                     {
  29.                         ar.UpgradeOpen();
  30.                         ar.TextString = tagsValues[3];
  31.                     }
  32.                     else if (setTagValues[4] && attDefsTag5.Contains(ar.Tag))
  33.                     {
  34.                         ar.UpgradeOpen();
  35.                         ar.TextString = tagsValues[4];
  36.                     }
  37.                 }
  38.             }
  39.         }
  40.  

Отмечено как Решение Александр Ривилис 28-09-2018, 23:05:24

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я посмотрел блок и понял, что мой первый ответ был абсолютно правилен. И тут ничего не поделаешь. Одна и та же вставка вложенного блока с одними и теми же значениями атрибутов будут фигурировать во всех копиях внешнего блока. Соответственно нужно для копии внешнего блока создавать свою BlockTableRecord со своим вложенным блоком.
« Последнее редактирование: 28-09-2018, 23:05:19 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Как я понял, для конечного пользователя это реализовать нельзя.

Спасибо большое за помощь!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как я понял, для конечного пользователя это реализовать нельзя.

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

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Наверное не правильно выразился.
Используя команду "копировать" в автокаде это реализовать нельзя.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Используя команду "копировать" в автокаде это реализовать нельзя.
Тоже не так. Можно:
1. Переопределить эту команду, так чтобы для нужных блоков происходило своё "хитрое" копирование.
2. Использовать события для постобработки команды копирования.
И то и другое достаточно трудоёмко, требует внимательности и учета множества нюансов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Я до этого еще не дорос :), поробую что то поискать в интернете, но в любом случае большое спасибо!