Можно ли обратится к коллекции объектов папки браузера?

Автор Тема: Можно ли обратится к коллекции объектов папки браузера?  (Прочитано 557 раз)

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

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

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • ****
  • Сообщений: 393
  • Карма: 12
Доброго времени суток, уважаемые форумчане! Помогите пожалуйста разобраться с вопросом указанным в теме. У меня есть большая сборка, мне требуется сделать перебор вхождений. Хочу сделать перебор лишь тех из них, которые лежат в конкретной папке объектного браузера. Являются ли объекты папки коллекцией, и если да, то как к ней обратиться?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN Club
  • ****
  • Сообщений: 253
  • Карма: 60
  • Skype: mikazakov@mail.ru
то как к ней обратиться?
Ну если посмотреть объектную модель:



Верхний узел
BrowserPane.TopNode
в узле есть ссылка на зависимый объект:
BrowserNode.NativeObject
думаю дальше разберетесь

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • ****
  • Сообщений: 393
  • Карма: 12
Спасибо, Михаил!
думаю дальше разберетесь
К сожалению, не смог! :( Снова прошу вашей помощи. Я создал объекты типа Inventor.BrowserFolder и присвоил им ссылки на нужные мне папки. Также у меня есть ссылки на узлы BrowerNode, в которых эти папки находятся. Но я так и не смог организовать обращение к элементам, находящимся в папке. В частности, я так и не смог воспользоваться свойством BrowserNode.NatviObject, не понимаю, ссылку на какой объект оно указывает?
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • ****
  • Сообщений: 393
  • Карма: 12
На буржуйских сайтах вычитал, что типа такого перебора можно делать:

Код - C# [Выбрать]
  1. foreach (Inventor.ComponentOccurrence occ in oOccS)
  2. {
  3.    if (oNode.NativeObject==occ)
  4.    {
  5.    Debug.WriteLine(occ.Name);
  6.    }
  7. }

Только и он не дает у меня никаких результатов, да и вообще, я как раз таки хочу отказаться от перебора всех вхождений сборки, чтобы тысячу деталей не перебирать, а лишь те, что находятся в нужной мне папке... В общем я в тупике (( Буду рад любому совету.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN Club
  • ****
  • Сообщений: 253
  • Карма: 60
  • Skype: mikazakov@mail.ru
Перед запуском кода нужно папку в браузере выделить:

Код - C# [Выбрать]
  1.     static Application InvApp;
  2.     static void Main(string[] args)
  3.     {
  4.         InvApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application") as Application;
  5.         AssemblyDocument AssDoc = InvApp.ActiveDocument as AssemblyDocument;
  6.  
  7.         BrowserFolder folders = AssDoc.SelectSet[1] as BrowserFolder;
  8.  
  9.         if (null==folders)
  10.         {
  11.             Console.WriteLine("Выберете папку в браузере сборки!");
  12.             Console.ReadKey();
  13.             return;
  14.         }
  15.  
  16.         foreach (BrowserNode bn in folders.BrowserNode.BrowserNodes)
  17.         {
  18.             if ((bn.NativeObject as ComponentOccurrence)!=null)
  19.             {
  20.                 ComponentOccurrence comp = bn.NativeObject as ComponentOccurrence;
  21.  
  22.                 Console.WriteLine("Это компонент: " +comp.Name);
  23.             }
  24.         }
  25.         Console.ReadKey();
  26.  
  27.  
  28.         return;
  29.     }
  30.  



Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • ****
  • Сообщений: 393
  • Карма: 12
Перед запуском кода нужно папку в браузере выделить:
Спасибо, Михаил! К сожалению такой вариант не подходит. Эта задача является частью кода, который не требует вмешательства пользователя. Так и должно остаться. А можно ли выделить папку программно?
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 21-03-2017, 19:02:17

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • ****
  • Сообщений: 393
  • Карма: 12
Перед запуском кода нужно папку в браузере выделить:
Что-то сразу затупил, как избавиться от выделения в браузере. В итоге задал ссылку на папку.
Также создал коллекцию объектов инвентора.
Если подытожить:результат не совсем тот, что я хотел, ибо было желание совсем избавиться от перебора. Но тем не менее, идет перебор объектов всего 1 папки, а не всей огромной сборки. Так что задачу считаю решенной, очередное большое спасибо вам, Михаил. Решением помечу свой код, как максимально отвечающий на изначальный вопрос топика, но разумеется, все мы понимаем, что в большей части это ваша заслуга. :)
Код - C# [Выбрать]
  1. private void test(object sender, EventArgs e)
  2.         {
  3.             Inventor.ObjectCollection oObjColl = oTO.CreateObjectCollection();            
  4.             // ссылка на интересующую папку
  5.             Inventor.BrowserFolder oBFolder = oPane.TopNode.BrowserFolders["TEST"];
  6.  
  7.             foreach (Inventor.BrowserNode bn in oBFolder.BrowserNode.BrowserNodes)
  8.             {
  9.                 if ((bn.NativeObject as Inventor.ComponentOccurrence) != null)
  10.                 {
  11.                     Inventor.ComponentOccurrence comp = bn.NativeObject as Inventor.ComponentOccurrence;
  12.                      oObjColl.Add(comp);
  13.                 }
  14.             }
  15.  
  16.             Debug.WriteLine(oObjColl.Count);
  17.             // коллекция инвентора нумеруется с 1 члена
  18.             for (int i = 1; i <= oObjColl.Count; i++)
  19.             {
  20.                 Inventor.ComponentOccurrence comp = (Inventor.ComponentOccurrence) oObjColl[i];
  21.                 Debug.WriteLine( i + " - " + comp.Name);
  22.             }
  23.         }

П.С. Напоследок остался один вопрос, можно ли создать мнимую библиотеку типа ComponentOccurrence? (ну или не мнимую, не знаю, как точно это называется) Я имею ввиду, чтобы коллекция была сразу нужного типа, а не  ObjectCollection. Просто помню, что что-то такое обсуждалось, два раза весь форум перелистал, не смог найти соответствующего топика ((
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN Club
  • ****
  • Сообщений: 253
  • Карма: 60
  • Skype: mikazakov@mail.ru
Я имею ввиду, чтобы коллекция была сразу нужного типа
ну а какая проблема то, если это на c#, просто перед добавлением в типизированнй массив нужно проверку сделать.
p.s. Щас в командировке, остальные топики посмотрю на следующей недели

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • ****
  • Сообщений: 393
  • Карма: 12
ну а какая проблема то, если это на c#, просто перед добавлением в типизированнй массив нужно проверку сделать.
Не совсем вас понял. Я массивами C# вобще не смог воспользоваться в данной задаче. Создал коллекцию Inventor.ObjectCollection. Она как бы "обезличена". И хоть я знаю. что помещаю в нее исключителбно объекты типа ComponentOccurrence, члены коллекции не наследуют необхдимые свойства и методы. Для чего приходится проводить манипуляции типа:
Код - C# [Выбрать]
  1. Inventor.ComponentOccurrence comp = (Inventor.ComponentOccurrence) oObjColl[i];
  2. Debug.WriteLine( i + " - " + comp.Name);
В программировании я новичок...но ненадолго! ;)

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

  • Administrator
  • *****
  • Сообщений: 6561
  • Карма: 706
  • Рыцарь ObjectARX
  • Skype: rivilis
Думаю, что Михаил имел в виду вместо:
Код - C# [Выбрать]
  1. Inventor.ObjectCollection oObjColl = oTO.CreateObjectCollection();
использовать:
Код - C# [Выбрать]
  1. List<Inventor.ComponentOccurrence> oObjColl = new List<Inventor.ComponentOccurrence>();
В этом случае приведение типа становится ненужным.


« Последнее редактирование: 23-03-2017, 20:34:40 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • ****
  • Сообщений: 393
  • Карма: 12
... удалил сообщение
В программировании я новичок...но ненадолго! ;)

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

  • Administrator
  • *****
  • Сообщений: 6561
  • Карма: 706
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну в смысле, это относится к функционалу си шарпа, или инвентора?
Это относится к функционалу C# (точнее ко всему .NET Framework). Полное название класса: System.Collections.Generic.List<T>
Описание класса List<T> можешь посмотреть здесь: https://msdn.microsoft.com/ru-ru/library/6sh2ey19(v=vs.110).aspx

P.S.: Собственно говоря есть еще масса различных стандартных коллекций в .NET: https://msdn.microsoft.com/ru-ru/library/system.collections(v=vs.110).aspx
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • ****
  • Сообщений: 393
  • Карма: 12
Прошу прощения, я просто подумал что спросил глупость. Ну не то чтобы глупость, а то что я и сам могу нагуглить. В связи с чем пожалел ваш труд, и полез, и нашел все сам. Спасибо за ответ.
В программировании я новичок...но ненадолго! ;)