Получить объекты ассоциативного массива

Автор Тема: Получить объекты ассоциативного массива  (Прочитано 3718 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Добрый день! Не могу понять как получить каждый элемент ассоциативного массива. Мне нужно вокруг каждого из элементов построить габаритную рамку. Я нашёл как это сделать, но способ работает или с массивом целиком или с элементами, если его взорвать. Метод getItems возвращает ItemLocator[], как из этих локаторов получить непосредственно объекты я ума не приложу. SourceEntities опять не то, он возвращает оригинальный объект без трансформации:( помогите плз)
Код - C# [Выбрать]
  1.  //StartTransaction
  2.  using (Transaction tr = db.TransactionManager.StartTransaction()) {
  3.  
  4.      BlockTableRecord btr = (BlockTableRecord) tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  5.  
  6.      foreach (var id in acSSet) {
  7.  
  8.          if (AssocArray.IsAssociativeArray(id)) {
  9.              //DBObject obj = tr.GetObject(id, OpenMode.ForRead);
  10.              AssocArray assocArray = AssocArray.GetAssociativeArray(id);
  11.  
  12.              //Original entities
  13.              ObjectIdCollection items = assocArray.SourceEntities;
  14.  
  15.              ItemLocator[] itemLocators = assocArray.getItems(true);
  16.              acDocEd.WriteMessage(items.Count.ToString());
  17.                  for (int i = 0; i < itemLocators.Length; i++) {
  18.                      ItemLocator itemLocator = itemLocators[i];
  19.                      ObjectId entId = items[i];
  20.                   }
  21.           }
  22.  }
  23.  
  24.  
« Последнее редактирование: 17-11-2021, 23:42:24 от Александр Ривилис »

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

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

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

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

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

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Зато метод AssocArray.GetItemTransform возвращает матрицу трансформации.

Спасибо! Думал, что это как-то проще можно сделать( Я правильно понимаю, что сначала надо получить оригинальные объекты а потом применить к ним трансфомацию, полученную для каждого ItemLocator этого массива?

Отмечено как Решение Ihar 18-11-2021, 12:13:24

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

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

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

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Да. Точнее можно работать сразу с Extents оригинальных объектов - трансформировать их при помощи Extents3d.TransformBy

Попробовал так сделать, но результат не совсем тот, который я ожидал(
вот так переписал код:

Код - C# [Выбрать]
  1. //StartTransaction
  2. using (Transaction tr = db.TransactionManager.StartTransaction()) {
  3.  
  4.         BlockTableRecord btr =
  5.                 (BlockTableRecord) tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  6.  
  7.         foreach (var id in acSSet) {
  8.  
  9.         if (AssocArray.IsAssociativeArray(id)) {
  10.                 //DBObject obj = tr.GetObject(id, OpenMode.ForRead);
  11.                 AssocArray assocArray = AssocArray.GetAssociativeArray(id);
  12.  
  13.                 //Original entities
  14.                 ObjectIdCollection soursItemIds = assocArray.SourceEntities;
  15.  
  16.                 //get extents of the original                                  
  17.                 Extents3d extents = new Extents3d();
  18.  
  19.                 foreach (ObjectId itemId in soursItemIds) {
  20.                         Entity ent = tr.GetObject(itemId, OpenMode.ForRead) as Entity;
  21.                         extents.AddExtents(ent.GeometricExtents);
  22.                         }
  23.  
  24.                 ItemLocator[] itemLocators = assocArray.getItems(true);
  25.  
  26.                 for (int i = 0; i < itemLocators.Length; i++) {
  27.                         ItemLocator itemLocator = itemLocators[i];
  28.                         var trasform = assocArray.GetItemTransform(itemLocator);
  29.  
  30.                         //get extents of the original
  31.                         Extents3d arrExtents = new Extents3d(extents.MinPoint, extents.MaxPoint);
  32.  
  33.                         arrExtents.TransformBy(trasform);
  34.                                
  35.                         try {
  36.                                 Entity line = DrawExtents(arrExtents);
  37.                                 btr.AppendEntity(line);
  38.                                 tr.AddNewlyCreatedDBObject(line, true);
  39.                                 } catch {
  40.                                         acDocEd.WriteMessage("\nUnable to draw the bounds.");
  41.                                         }
  42.                 }
  43.         }              
  44. }
  45.  
  46.  

Вот что получилось:


Как я понимаю, не хватает дополнительной трансформации?

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

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Ну собственно я так и сделал и получилось, как надо.