Сообщество программистов Autodesk в СНГ

ADN Club => Inventor API => Тема начата: Павел Тер-Микаэлян от 10-07-2015, 18:44:32

Название: Нахождение в браузере вхождений
Отправлено: Павел Тер-Микаэлян от 10-07-2015, 18:44:32
Здравствуйте! Подскажите пожалуйста, я пытаюсь реализовать функцию "найти в обозревателе". То есть когда выделяются компоненты, правой кнопкой и "найти в обозревателе". Казалось бы, все просто, но работает не стабильно и я не могу понять почему. Делаю так:
 
Код - Visual Basic [Выбрать]
  1.     Dim oApp As Inventor.Application
  2.     Set oApp = ThisApplication
  3.    
  4.     Dim oDoc As Inventor.Document
  5.     Dim oDoc2 As Inventor.Document
  6.     Set oDoc = oApp.ActiveDocument
  7.    
  8.     Dim oCompDef As ComponentDefinition
  9.     Set oCompDef = oDoc.ComponentDefinition
  10.     Dim oOcc1 As ComponentOccurrence
  11.     Dim oOcc2 As ComponentOccurrence
  12. 'Схема 1
  13.   Set oOcc1 = oCompDef.Occurrences.Item(1).Definition.Occurrences.ItemByName(1)
  14.    oCompDef.Document.BrowserPanes.Item("Модель").GetBrowserNodeFromObject(oOcc1).EnsureVisible
  15. 'Схема 2
  16. For Each oDoc In oCompDef.Document.AllReferencedDocuments
  17.    Set oOcc2 = oCompDef.Occurrences.AllReferencedOccurrences(oDoc).Item(1)
  18.   oCompDef.Document.BrowserPanes.Item("Модель").GetBrowserNodeFromObject(oOcc2).EnsureVisible
  19. Next
  20.  
Первая схема работает всегда. Но мне необходимо работать по второй схеме, то есть когда ComponentOccurrence получается из документа через AllReferencedOccurrences. Но по этой схеме через раз выдается ошибка метода EnsureVisible или объекта BrowserNode. Ошибка выдается если ComponentOccurrence находится внутри сборки, которая находится внутри массива или ComponentOccurrence находится внутри массива который находится внутри сборки. То есть при работе с массивами выдается такая ошибка.
Название: Re: Нахождение в броузере вхождений
Отправлено: Алексей Кулик от 10-07-2015, 21:53:43
Я совсем не понимаю Inventor, но рискну предположить, что необходима рекурсивная функция. Придется проходить по всем элемент, и, если элемент - сборка, то по по его подэлементам и т.д.
Название: Re: Нахождение в броузере вхождений
Отправлено: Павел Тер-Микаэлян от 10-07-2015, 22:12:21
Я совсем не понимаю Inventor, но рискну предположить, что необходима рекурсивная функция. Придется проходить по всем элемент, и, если элемент - сборка, то по по его подэлементам и т.д.
Спасибо за ответ! Да, я так делал раньше, но очень долго, на 600 вхождений 2,5 минуты, а у нас сборки по 50 000 вхождений бывают, поэтому перебор по документам очень ускоряет процесс... Надеюсь что есть другой способ... Я вообще, если честно, даже логики не понимаю, почему метод EnsureVisible не может найти аргумент, если аргумент есть, oOcc получен, что ему еще надо, при чем это не работает только когда деталь внутри массива внутри сборки... Или у массивов другой BrowserPanes должен быть... Но почему тогда работает если оOcc получить напрямую из component definition.... Watches в Vba показывает одно и тоже, если oOcc получен из component definition или если он получен из AllReferencedOccurrences... Почему же последний oOcc не воспринимается методом EnsureVisible... Больше ничего в голову не приходит, тупик....
Название: Re: Нахождение в броузере вхождений
Отправлено: Алексей Кулик от 10-07-2015, 22:27:46
Нну, в принципе можно передавать несколько параметров, в т.ч. один из них (уже вычисленный результат) - по ссылке. Если этот параметр не Null (ну или не отвечает еще каким-то требованиям), то выполнять проходку дальше. Если условия удовлетворены - то просто выход из функции.
P.S. Это общее видение процесса, естественно, без конкретики.
Название: Re: Нахождение в броузере вхождений
Отправлено: mikazakov от 10-07-2015, 22:54:31
А постановка задачи какая? Просто развернуть часть браузера? Но что в браузере можно увидеть если там 1000 узлов?
Название: Re: Нахождение в броузере вхождений
Отправлено: Алексей Кулик от 10-07-2015, 23:19:36
Подозреваю, что не просто найти, но и открыть, и в браузере активировать ;)
Название: Re: Нахождение в броузере вхождений
Отправлено: Павел Тер-Микаэлян от 11-07-2015, 18:06:21
Постановка задачи простая: необходимо разработать средство проверки документов, задействованных в текущей сборке по определенным критериям. Если какие-то документы не проходят эту проверку, их необходимо обозначить визуально. На данный момент я решаю эту задачу выделением определенных компонентов в рабочем окне модели. Но если выделяются 3 компонента из 33000 это плохо заметно визуально, поэтому помимо выделения в окне модели, необходимо сделать выделение в броузере, с раскрытием дерева до этого компонента. Я использую EnsureVisible, но он не может показать в обозревателе ComponentOccurrence, который был получен из AllReferencedOccurrences при условии, что ComponentOccurrence находится внутри сборки, которая находится внутри массива. Поэтому единственное решение, чтобы EnsureVisible работал - это получать все ComponentOccurrence из ComponentDefinition. Но это значит делать перебор по вхождениям, на что будет тратиться большое количество времени. Что не допустимо, т.к. такую проверку необходимо делать постоянно. Поэтому хотел бы с Вами посоветоваться. Может я что-то делаю не так.
Название: Re: Нахождение в броузере вхождений
Отправлено: mikazakov от 11-07-2015, 19:45:17
Pabloa,
Могу подкинуть идею по воркфлоу:
1. после того как проблемные файлы выделены можно сформировать видовое представление, где проблемные файлы останутся видимыми, а все остальные погашеные
2. Работать со встроенным браузером инвентора не очень удобно, по этому можно сделать свою панель типа браузера, куда будет выводится список  проблемных документов. А потом работать с этой панелью нормальными программными инструментами. Загружать деталь отдельно из списка, тут же обрабатывать свойства и пр.  На VBA это тоже можно сделать, но на VB.NET проще и функциональнее.
Производительность VBA и AddIn на VB.NET я не сравнивал. Но AddIn точно не медленнее, чем VBA.
Ну как идеи?
Название: Re: Нахождение в броузере вхождений
Отправлено: Павел Тер-Микаэлян от 11-07-2015, 22:59:29
mikazakov, Спасибо за идеи) Менять видовое представление в рамках моей задачи очень не хочется... А на счет "своего броузера", то у меня, в принципе, уже формируется отчет в эксель по этим файлам и я точно знаю, что это за файлы...  тут просто смысл в том, что для удобства мне необходимо работать именно с броузером инвентора, видеть в нем эти файлы...
Название: Re: Нахождение в броузере вхождений
Отправлено: mikazakov от 12-07-2015, 18:53:39
Pabloa,
А что там в инвенторовском браузере такого нужного?
Название: Re: Нахождение в броузере вхождений
Отправлено: Павел Тер-Микаэлян от 12-07-2015, 20:39:31
Pabloa,
А что там в инвенторовском браузере такого нужного?
Просто я разрабатываю программу, в работе которой необходим диалог с окном 3д модели, то есть нужно,  например, постоянно выделять определенные компоненты, как в окне 3д модели, так и в броузере, в зависимости от того, где удобно в данный момент. Соответственно, после проверки, о которой шла речь,  необходимо продолжать работать с окном 3Д модели или с броузером... Если будет 2-е окно броузера, то придется постоянно между ними переключаться, а это не совсем удобно...  или надо писать полный аналог броузера инвентора, что и трудно и долго, ну лично для меня)
Название: Re: Нахождение в броузере вхождений
Отправлено: filat от 13-07-2015, 08:44:02
Постановка задачи простая: необходимо разработать средство проверки документов, задействованных в текущей сборке по определенным критериям. Если какие-то документы не проходят эту проверку, их необходимо обозначить визуально.
Я что-то совсем ничего не понимаю! Вы ходите видеть все файлы проекта и визуальное отображение всех файлов не задействованных в активной сборке? Еще больше не понятны ссылки на размер сборки - до 50 тыщ - работайте с уникальными именами их от силы тыщи полторы будет, хотя есть казусы со сварнями элементами и т.д., но это решаемые вопросы... Не понятной остается общая цель задачи? Очистка проекта!? Но это можно решить другим путем...
Название: Re: Нахождение в броузере вхождений
Отправлено: Павел Тер-Микаэлян от 13-07-2015, 10:59:52
Постановка задачи простая: необходимо разработать средство проверки документов, задействованных в текущей сборке по определенным критериям. Если какие-то документы не проходят эту проверку, их необходимо обозначить визуально.
Я что-то совсем ничего не понимаю! Вы ходите видеть все файлы проекта и визуальное отображение всех файлов не задействованных в активной сборке? Еще больше не понятны ссылки на размер сборки - до 50 тыщ - работайте с уникальными именами их от силы тыщи полторы будет, хотя есть казусы со сварнями элементами и т.д., но это решаемые вопросы... Не понятной остается общая цель задачи? Очистка проекта!? Но это можно решить другим путем...
Я хочу видеть определенные сборки или детали, которые не прошли определенную проверку. Эти сборки или детали входят в мою текущую сборку. Мне просто нужно их быстро находить в окне 3Д модели. Находить для последующих манипуляций с ними. Но т.к. отношение всех компонентов сборки к этим, найденным, большое, то их не всегда заметно при выделении, поэтому я хотел находить их еще и в браузере, чтобы, если нужно, показать их в окне модели. А при чем тут уникальные имена, если в сборке 50 тыщ вхождений. Документов конечно меньше, поэтому я и перебираю их, а не вхождения. Вот я и пытаюсь сохраняя эту схему перебора осуществить такую визуальную проверку.
Название: Re: Нахождение в броузере вхождений
Отправлено: filat от 13-07-2015, 12:00:34
которые не прошли определенную проверку. Эти сборки или детали входят в мою текущую сборку
Мне еще меньше понятно стало... если вы детали/подсборки видете в сборке, то о какой проверке по отношению к текущейсборке может идти речь? Вы подразумеваете вопрос о нахождении копий вхождения текущей модели детали/подсборки в текущей сборке?
Я хочу видеть определенные сборки или детали, которые не прошли определенную проверку. Эти сборки или детали входят в мою текущую сборку. Мне просто нужно их быстро находить в окне 3Д модели.
Я не понимаю, что мешает использовать команду Find in browser? Или выхотите выполнить выделение входящи элементов, входящих в сборку, по определенному признаку, таким образом, чтоб все они были подсвечены в браузере сборки?
Название: Re: Нахождение в броузере вхождений
Отправлено: Павел Тер-Микаэлян от 13-07-2015, 12:41:13
которые не прошли определенную проверку. Эти сборки или детали входят в мою текущую сборку
Мне еще меньше понятно стало... если вы детали/подсборки видете в сборке, то о какой проверке по отношению к текущейсборке может идти речь? Вы подразумеваете вопрос о нахождении копий вхождения текущей модели детали/подсборки в текущей сборке?
Я хочу видеть определенные сборки или детали, которые не прошли определенную проверку. Эти сборки или детали входят в мою текущую сборку. Мне просто нужно их быстро находить в окне 3Д модели.
Я не понимаю, что мешает использовать команду Find in browser? Или выхотите выполнить выделение входящи элементов, входящих в сборку, по определенному признаку, таким образом, чтоб все они были подсвечены в браузере сборки?
Я проверяю перебором пользовательские свойства деталей и сборок, которые в данный момент задействованы в открытой сборке. Проверка идет перебором по документам. После такой проверки, необходимо видеть все вхождения непрошедших эту проверку документов в открытой сборке. И видеть желательно в окне 3д модели, а не в форме отчета где-то в 10-ом окне... Я это делаю для удобства работы с программой, которую разрабатываю, потому что ее работа строится на том, что нужно постоянно выделять компоненты в окне 3д модели.
Название: Re: Нахождение в броузере вхождений
Отправлено: mikazakov от 13-07-2015, 13:20:50
Я проверяю перебором пользовательские свойства деталей и сборок, которые в данный момент задействованы в открытой сборке. Проверка идет перебором по документам. После такой проверки, необходимо видеть все вхождения непрошедших эту проверку документов в открытой сборке. И видеть желательно в окне 3д модели, а не в форме отчета где-то в 10-ом окне... Я это делаю для удобства работы с программой, которую разрабатываю, потому что ее работа строится на том, что нужно постоянно выделять компоненты в окне 3д модели.
Раз просто нужны свойства моделей, то самая тема, сделать свою форму с датагридом в которой будет список проблемных моделей с полями для конкретных свойств. При выделении  строки с деталью легко подсветить эту деталь в сборке, здесь же можно быстро отредактировать свойства грида. Форму с таблицей можно сделать не модальной, что бы не блокировала доступ к инвентору и всегда была сверху.
Но это все конечно лучше через VB.NET. Через VBA теоретически тоже можно, но там нужно будет допотопные контролы искать с гридом и регестрировать его в винде.
С VB.NET в принципе подсобим, можем и с С# подсобить.
Название: Re: Нахождение в броузере вхождений
Отправлено: Павел Тер-Микаэлян от 13-07-2015, 14:59:27
Я проверяю перебором пользовательские свойства деталей и сборок, которые в данный момент задействованы в открытой сборке. Проверка идет перебором по документам. После такой проверки, необходимо видеть все вхождения непрошедших эту проверку документов в открытой сборке. И видеть желательно в окне 3д модели, а не в форме отчета где-то в 10-ом окне... Я это делаю для удобства работы с программой, которую разрабатываю, потому что ее работа строится на том, что нужно постоянно выделять компоненты в окне 3д модели.
Раз просто нужны свойства моделей, то самая тема, сделать свою форму с датагридом в которой будет список проблемных моделей с полями для конкретных свойств. При выделении  строки с деталью легко подсветить эту деталь в сборке, здесь же можно быстро отредактировать свойства грида. Форму с таблицей можно сделать не модальной, что бы не блокировала доступ к инвентору и всегда была сверху.
Но это все конечно лучше через VB.NET. Через VBA теоретически тоже можно, но там нужно будет допотопные контролы искать с гридом и регестрировать его в винде.
С VB.NET в принципе подсобим, можем и с С# подсобить.
Я только не пойму каким это образом выделяя что-то в датагриде я увижу это в окне 3Д модели. В браузере есть функция "показать в окне" а через датагрид как я это сделаю? Сейчас возможность только на VBA работать.
Название: Re: Нахождение в броузере вхождений
Отправлено: mikazakov от 13-07-2015, 19:07:39
Я только не пойму каким это образом выделяя что-то в датагриде я увижу это в окне 3Д модели.
Легко, Выдели деталь и запусти макрос
Sub Zoom()
Dim ZoomCommand As String: ZoomCommand = "AppZoomSelectCmd"
Call ThisApplication.CommandManager.ControlDefinitions(ZoomCommand).Execute
End Sub

Сейчас возможность только на VBA работать.
Visual Studio Express имеет бесплатную лицензию. Как обойти ограничения функциональности я подробно написал в своем мануале.
как говорится: VBA must die
Название: Re: Нахождение в броузере вхождений
Отправлено: Павел Тер-Микаэлян от 13-07-2015, 19:27:44
Я только не пойму каким это образом выделяя что-то в датагриде я увижу это в окне 3Д модели.
Легко, Выдели деталь и запусти макрос
Sub Zoom()
Dim ZoomCommand As String: ZoomCommand = "AppZoomSelectCmd"
Call ThisApplication.CommandManager.ControlDefinitions(ZoomCommand).Execute
End Sub

Сейчас возможность только на VBA работать.
Visual Studio Express имеет бесплатную лицензию. Как обойти ограничения функциональности я подробно написал в своем мануале.
как говорится: VBA must die
Ясно) попробую ваш способ) спасибо за ответы)