Эмуляция метода GetContainers из класса PromptNestedEntityResult

Автор Тема: Эмуляция метода GetContainers из класса PromptNestedEntityResult  (Прочитано 3746 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Всех приветствую.
Кто-то решал задачу эмуляции метода GetContainers? У меня задача получить все контейнеры атрибута. У меня есть блок, в котором ещё два уровня блоков. И на самом нижнем уровне лежит атрибут(AttributeReference). Но почему-то свойство OwnerId указывает не на BlockReference/BlockTableRecord, в котором лежит этот атрибут, а указывает на Blockreference уровнем выше.

Если коротко. У меня есть AttributeRefence и нужно получить все BlockReference, к которым он относится.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Lemieux,
OwnerId для AttributeRefence должно указывать на BlockReference, которому он принадлежит. Но дальше ты найти не сможешь, т.к. этот BlockReference может входить сразу в несколько BlockTableRecord. Поэтому эмуляция GetContainers не получится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Lemieux,
OwnerId для AttributeRefence должно указывать на BlockReference, которому он принадлежит. Но дальше ты найти не сможешь, т.к. этот BlockReference может входить сразу в несколько BlockTableRecord. Поэтому эмуляция GetContainers не получится.
А как быть?

Отмечено как Решение Lemieux 19-06-2022, 17:41:08

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
А как быть?
Никак. Это тупиковый путь. Ты можешь получить массу таких контейнеров, но какой именно тот, который тебе нужен, ты узнать не сможешь. Разве что это единственная вставка блока в чертеже.
Вот это я попал. Интересно, как же тогда GetContainers работает.

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Интересно, как же тогда GetContainers работает.
Этот метод знает, что именно выбрано на чертеже (т.е. всю цепочку), а не только последний в цепочке объект.
То есть если у меня BlockReference из трёх уровней и на самом нижнем уровне AttributeReference, и я просто кликаю по этому AttributeReference, то этот клик проходит через все уровни, а не напрямую обращается к этому AttributeReference?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
То есть если у меня BlockReference из трёх уровней и на самом нижнем уровне AttributeReference, и я просто кликаю по этому AttributeReference, то этот клик проходит через все уровни, а не напрямую обращается к этому AttributeReference?
Именно так.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Если ты имеешь просто AttributeReference, то ты даже не знаешь где именно в чертеже он расположен. Зная место расположения и AttributeReference ты теоретически можешь собрать всю цепочку. Ну конечно если нет наложения. Но если есть наложение, то и выбор вручную будет "неуверенный".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
То есть если у меня BlockReference из трёх уровней и на самом нижнем уровне AttributeReference, и я просто кликаю по этому AttributeReference, то этот клик проходит через все уровни, а не напрямую обращается к этому AttributeReference?
Именно так.
Интересно. Значит нужно написать аналог NestedResult. Эта проблема тянется из моего прошлого вопроса. Я разом выбираю много вложенных атрибутов и пытаюсь узнать все уровни вложенности до самого верхнего BlockReference который находится в ModelSpace.

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Если ты имеешь просто AttributeReference, то ты даже не знаешь где именно в чертеже он расположен. Зная место расположения и AttributeReference ты теоретически можешь собрать всю цепочку. Ну конечно если нет наложения. Но если есть наложение, то и выбор вручную будет "неуверенный".
Да если я не могу ходить по уровням, то я не могу выяснить глобальные координаты атрибута.

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Lemieux,
А откуда ты берёшь сам AttributeReference?
Вот отсюда

Код - C# [Выбрать]
  1.             Document currentDocument = Application.DocumentManager.MdiActiveDocument;
  2.             Editor editor = currentDocument.Editor;
  3.  
  4.             ResultBuffer resbuf = new ResultBuffer();
  5.  
  6.             string arg = "_:D:N:S";
  7.  
  8.             editor.TurnSubentityWindowSelectionOn();
  9.             ArxImports.SetAllowDuplicateSelection(currentDocument, true);
  10.             PromptStatus prGetResult = ArxImports.acedSSGet(arg, IntPtr.Zero, IntPtr.Zero, resbuf.UnmanagedObject, out ArxImports.Ads_name sset);
  11.             ArxImports.SetAllowDuplicateSelection(currentDocument, false);
  12.             editor.TurnSubentityWindowSelectionOff();
  13.             ArxImports.acedSSLength(ref sset, out int len);
  14.             editor.WriteMessage("\n" + len.ToString());
  15.             ObjectIdCollection ids = new ObjectIdCollection();
  16.             unsafe
  17.             {
  18.                 for (int i = 0; i < len; ++i)
  19.                 {
  20.                     ArxImports.Resbuf resultBuffer = new ArxImports.Resbuf();
  21.                     ArxImports.Resbuf* pResultBuffer = &resultBuffer;
  22.                     if (ArxImports.acedSSNameX(&pResultBuffer, ref sset, i) != PromptStatus.OK)
  23.                         continue;
  24.                     using (ResultBuffer managedResultBuffer = DisposableWrapper.Create(typeof(ResultBuffer), (IntPtr)pResultBuffer, true) as ResultBuffer)
  25.                     {
  26.                         foreach (TypedValue tpVal in managedResultBuffer)
  27.                         {
  28.                             if (tpVal.TypeCode != 5006)
  29.                                 continue;
  30.                             ObjectId id = (ObjectId)tpVal.Value;
  31.                             if (id != null && id.ObjectClass.DxfName.Equals("ATTRIB"))
  32.                             {
  33.                                 ids.Add(id);
  34.                             }
  35.                         }
  36.                     }
  37.                 }
  38.             }
  39.  
  40.             return ids;

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я так и подозревал. :-) Отсюда если ты проанализируешь полностью список managedResultBuffer, ты сможешь найти координаты выбранного AttributeReference. Более того в нём есть всё, чтобы получить всю цепочку объектов. Распечатай managedResultBuffer и ты увидишь это сам. Заодно почитай описание acedSSNameX и поищи примеры её использования.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Я так и подозревал. :-) Отсюда если ты проанализируешь полностью список managedResultBuffer, ты сможешь найти координаты выбранного AttributeReference. Более того в нём есть всё, чтобы получить всю цепочку объектов. Распечатай managedResultBuffer и ты увидишь это сам. Заодно почитай описание acedSSNameX и поищи примеры её использования.
Значит буду дальше копать :)

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Сделал я аналог PromptNestedEntityResult, даже более удобный для моих нужд, спасибо Вам.