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

ADN Club => Revit API => Тема начата: Кирилл Захаров от 30-10-2017, 15:29:46

Название: Подтвердить выбор нескольких объектов нажатием Enter
Отправлено: Кирилл Захаров от 30-10-2017, 15:29:46
При использовании метода Selection.PickObjects пользователь подтверждает выбор левым кликом мышки по кнопке "Готово" в левом верхнем углу экрана.

Можно ли  дать пользователю возможность подтвердить свой выбор нажатием клавиши Enter?
Название: Re: Подтвердить выбор нескольких объектов нажатием Enter
Отправлено: Александр Пекшев aka Modis от 30-10-2017, 16:14:31
Стандартными средствами Revit API этого сделать невозможно
Название: Re: Подтвердить выбор нескольких объектов нажатием Enter
Отправлено: Кирилл Захаров от 30-10-2017, 16:21:02
Спасибо. Очень жаль
Название: Re: Подтвердить выбор нескольких объектов нажатием Enter
Отправлено: Виктор Чекалин от 31-10-2017, 17:13:50
Спасибо. Очень жаль
Но если очень хочется, то можно конечно. Только, как заметил Александр, уже не стандартными средствами Revit API, а средствами Windows API. Но придется повозиться конечно.
Название: Re: Подтвердить выбор нескольких объектов нажатием Enter
Отправлено: Александр Ривилис от 31-10-2017, 17:24:21
Спасибо. Очень жаль
Но если очень хочется, то можно конечно. Только, как заметил Александр, уже не стандартными средствами Revit API, а средствами Windows API. Но придется повозиться конечно.
Ага. Хуки еще никто не отменял, только нужно будет найти эту кнопочку и послать ей WM_LBUTTONDOWN.
Название: Re: Подтвердить выбор нескольких объектов нажатием Enter
Отправлено: Александр Пекшев aka Modis от 01-11-2017, 12:32:06
В общем - было интересно поиграться с этим делом. Немного погуглив и найдя некоторые примеры собрал такую солянку:
Извините, вам запрещён просмотр содержимого спойлеров.

Пример использования:
Код - C# [Выбрать]
  1. [Regeneration(RegenerationOption.Manual)]
  2. [Transaction(TransactionMode.Manual)]
  3. public class Main : IExternalCommand
  4. {
  5.     [DllImport("User32.dll")]
  6.     public static extern Int32 FindWindow(String lpClassName, String lpWindowName);
  7.     [DllImport("user32.dll", SetLastError = true)]
  8.     public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
  9.     public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  10.     {
  11.         try
  12.         {
  13.             var selection = commandData.Application.ActiveUIDocument.Selection;
  14.  
  15.             IList<Reference> selected = null;
  16.             using (new SelectionEnterHook(SelectionEnterHook.AcceptKeyVariant.Enter))
  17.             {
  18.                 selected = selection.PickObjects(ObjectType.Element);
  19.             }
  20.             if (selected != null)
  21.                 TaskDialog.Show("HookTest", "User select: " + selected.Count + " elements");
  22.  
  23.             return Result.Succeeded;
  24.         }
  25.         catch (Exception exception)
  26.         {
  27.             System.Windows.MessageBox.Show(exception.Message);
  28.             return Result.Failed;
  29.         }
  30.  
  31.     }
  32. }

Но заставить нормально это работать я так и не смог. Один раз срабатывает - следующие 10 фаталит Ревит. В строке 159 солянки идет поиск кнопки
Код - C# [Выбрать]
  1. IntPtr hwndChild = FindChildWindow((IntPtr)h, "Button", "Готово");
Однако он не всегда срабатывает. Когда я отлаживал код и заходил в рекурсивный метод FindChildWindow (немного покрутив его) кнопка находилась. Без отладки ничего не находилось. Есть конечно предположение, что еще и Add-in manager чудачил

В общем резюмирую - забейте на эту идею. И как сказал мой коллега "Пользователи все-равно привыкли, что в Ревите это работает всегда так! А твоя команда будет наводить смуту" ))