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

ADN Club => Другие продукты Autodesk => Navisworks API => Тема начата: miss от 11-07-2020, 10:52:34

Название: Как проверить и закрыть панель свойств через плагин
Отправлено: miss от 11-07-2020, 10:52:34
Добрый день!
Работаю над плагином к Navisworks Manage 2020 на c#. Для улучшения скорости работы плагина есть необходимость проверять открыта ли панель свойств в Navis'e. Если открыта, то закрывать её и по окончании работы снова открывать.
Не получается найти программный путь к панели свойств. Может кто-то знает?
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: Александр Ривилис от 11-07-2020, 21:14:04
miss,
В публичном API такая возможность не предусмотрена. Я задам вопрос в ADN DevHelp по этому поводу.
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: miss от 13-07-2020, 10:44:31
Я задам вопрос в ADN DevHelp по этому поводу.
Благодарю! Может они знают решение. Ждём-с!  :)
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: Александр Ривилис от 13-07-2020, 12:05:41
Отправил запрос. Когда будет какая-нибудь новая информация - я сообщу.
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: Александр Ривилис от 16-07-2020, 16:19:49
Переадресовали команде инженеров. Видимо вопрос не простой. 🙂
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: Александр Ривилис от 17-07-2020, 15:52:10
Увы, но команда инженеров подтвердила, что управлять окном свойств и получить его текущее состояние из API нельзя.
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: miss от 17-07-2020, 19:31:49
Печаль.  :(
Спасибо, что пытались помочь!
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: Александр Ривилис от 17-07-2020, 22:32:38
Собственно говоря никто не отменял Windows Hooks для работы с окнами приложения. Но тут вам придется серьезно потрудится. Потребуется среди всех окон NavisWorks найти нужное окно и послать ему WM_CLOSE.
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: Александр Ривилис от 20-07-2020, 11:43:00
miss,
В ADN DevHelp предложили попытаться разобраться каким образом окно свойств влияет на скорость работы плагина.
Для этой цели (если это конечно вам интересно) нужно предоставить исходный код плагина.
Кстати, а на сколько (или во сколько раз) увеличивается время время работы плагина при включенной панели свойств?
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: miss от 21-07-2020, 16:38:19
Александр Ривилис,
Код увы дать не вправе. Могу объяснить суть.
Плагин создаёт/обновляет вкладку на панели свойств в группе элементов (каждому своё). Каждый элемент ищется через Search. И перед тем как создать вкладку происходит проверка наличия этой вкладки (через Api), чтобы избежать дублирования. Если вкладки нет, она создаётся. Если вкладка есть, то свойства в ней обновляются (через ComApi происходит перебор всех вкладок в поисках нужной, чтобы обновить).
И получается, что если панель свойств открыта, то в процессе проверки и поиска вкладки выделяются и мелькают. Это мелькание увеличивает время исполнения в разы.
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: Александр Ривилис от 21-07-2020, 16:50:00
Код увы дать не вправе.
OK!
Плагин создаёт/обновляет вкладку на панели свойств в группе элементов (каждому своё).
Тогда возможно предложение от ADN DevHelp имеет право на существование. Они предлагают не использовать стандартную панель свойств, а создать свою:
Цитировать
Therefore, we will advise you to produce your own panel to manage properties, tabs, and etc to match your need. Check this path of DockPanel example under your SDK install location, e.g., `Navisworks Manage 2021\api\NET\examples\Basic Examples\CSharp\BasicDockPanePlugin`
Also, here are some references for you: Selection change event: https://forums.autodesk.com/t5/navisworks-api/event-selecting-objects-api-c/td-p/8804098
Get properties from selected items:
Код - C# [Выбрать]
  1. var doc = sender as Document;        
  2. var selected = doc.CurrentSelection.SelectedItems[0];        
  3. foreach (var propCategory in selected.PropertyCategories)        
  4. {
  5.             sb.AppendLine(propCategory.CombinedName.ToString());            
  6.             foreach (var propData in propCategory.Properties)            
  7.             {                
  8.                    sb.AppendLine("\t" + propData.CombinedName + ":" + propData.Value);            
  9.             }
  10. }
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: Александр Ривилис от 21-07-2020, 17:03:09
Кстати, если я правильно понял, то можно послать SHIFT + F7 окну NavisWorks для включения/выключения окна свойств: https://knowledge.autodesk.com/support/navisworks-products/learn-explore/caas/CloudHelp/cloudhelp/2019/ENU/Navisworks/files/GUID-56634B99-A85F-485D-A0B1-7093B34A5F53-htm.html
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: miss от 21-07-2020, 18:13:59
Александр Ривилис,
можно послать SHIFT + F7
Я думала об этом, но это сочетание клавиш работает как на выключение, так и на включение. Поэтому сначала надо убедиться, что панель свойств открыта, а как это сделать внутри плагина не понятно))
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: Александр Ривилис от 21-07-2020, 21:05:40
Александр Ривилис,
можно послать SHIFT + F7
Я думала об этом, но это сочетание клавиш работает как на выключение, так и на включение. Поэтому сначала надо убедиться, что панель свойств открыта, а как это сделать внутри плагина не понятно))

А вот это следует делать через Win32 API. Но с этим требуется экспериментировать. Для поиска окон используется утилита Spy++ из состава Visual Studio (spyxx.exe). В API для этой цели используется функции FindWindow или FindWindowEx (использование в C#:  https://social.msdn.microsoft.com/Forums/ru-RU/c4c650b5-4b4a-4e5d-8248-cec8d2dbad60/105010721082-10871086108310911095108010901100?forum=fordesktopru )

Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: miss от 22-07-2020, 15:33:23
А вот это следует делать через Win32 API
Александр Ривилис, благодарю! Изучу этот момент, поэкспериментирую. Если получится, напишу. Вдруг для кого-то ещё будет актуально.
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: miss от 25-08-2020, 10:07:39
Итого! Что получилось:

Я работала с Нависом русско- и англоязычной версии 2020. До окна свойств можно добраться двумя путями: через Spy++/user32.dll и через Ribbon (нужна библиотека AdWindow.dll).
Извините, вам запрещён просмотр содержимого спойлеров.


Почему пришлось идти двумя путями: Spy++ обнаруживает окно свойств, если оно находится в плавающем режиме, либо закреплено в каком-либо углу. Но, если окно в режиме auto-hide, шпион его не видит и работу плагина окно притормаживает. Опять же способ рабочий, если нигде не открыто никакое самостоятельное окно/программа/приложение с таким же названием.

Через Ribbon проще, если предположить, что в нужной нам вкладке ничего не сдвигалось и не переименовывалось. Просто находим нужную кнопку и проверяем активна она или нет. Хотелось бы и отключать/включать её через свойство IsActive, но хоть false свойству вроде как присваивается, кнопка остаётся активной, а окно открытым (не поняла почему, есть предположения?). Поэтому закрываю/открываю через Shift + F7.

В конечной версии решено оставить только проверку окна через Ribbon, но при желании можно закодить повторную проверку и через Spy++, если Ribbon не дал ожидаемого результата. Поэтому выкладываю оба метода, вдруг кому пригодятся.

Ну и, собственно, сам код:

Проверка через Ribbon и вкл/выкл из главного класса:
Извините, вам запрещён просмотр содержимого спойлеров.

Класс Spy++
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Как проверить и закрыть панель свойств через плагин
Отправлено: Александр Ривилис от 25-08-2020, 10:55:35
Отлично!