Запуск команды из формы WPF

Автор Тема: Запуск команды из формы WPF  (Прочитано 21998 раз)

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #15 : 19-11-2015, 11:46:34 »
О боже! Сработало!!!


Итак, как предложил Виктор Чекалин, всё получилось: создал метод внутри класса команды и запустил этот метод кнопкой на форме и сработало!!!
Но если бы Антон Останин не помог обнаружить проблему с аттрибутами, то идея бы была, как говорится, «коту подхвост». Вариант с guid тоже работает!

Как отметить решение, если ответа ДВА?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Запуск команды из формы WPF
« Ответ #16 : 19-11-2015, 11:49:57 »
Команда - эта такая штуковина, которая выполняется (запускается) с помощью функции Execute и имеет свой уникальный guid.
Вот это и пытался уточнить. Это всего лишь возможность выполнить код из интерфейса Revit. Команда одна - возов формы. После этого команды не нужны. Идет простой обмен свойствами и вызов функций того или иного класса встроенными средствами фактически любого высокоуровнего языка программирования - с помощью конструктора или свойств класса.
С чего вы взяли что RevitLookup использует команды для каждой кнопки?:) Если вкратце, то у каждой формы есть конструктор, куда передается объект Revit. Получить этот объект мы можем как из выделенных объектов в модели (Snoop Current Selection), так и выбрав его в свойствах конкретного объекта в форме.

Вообще для RevitLookup есть исходники. https://github.com/jeremytammik/RevitLookup.git

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #17 : 19-11-2015, 11:56:07 »
С чего вы взяли что RevitLookup использует команды для каждой кнопки?

Ну, предположил :)

Вот это и пытался уточнить. Это всего лишь возможность выполнить код из интерфейса Revit. Команда одна - возов формы. После этого команды не нужны. Идет простой обмен свойствами и вызов функций того или иного класса встроенными средствами фактически любого высокоуровнего языка программирования - с помощью конструктора или свойств класса.

Спасибо, буду знать!!!

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Запуск команды из формы WPF
« Ответ #18 : 19-11-2015, 11:58:38 »
Как отметить решение, если ответа ДВА?
Почему то ожидал, что вы просто пометите ответ Антона, как верный:)
Вообще на самом деле ни один из ответов не является ответом на исходный вопрос. Грубо говоря ответ это "В обработке события нажатия кнопки вызвать нужный метод" и все. А то что не получалось - это совсем по другой причине не имеющей отношения к вопросу.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #19 : 19-11-2015, 12:03:05 »
Надо предложить Александру Наумовичу идею о том, чтобы можно было пометить не только правильный ответ, но и сопутствующие ответы, которые явно указывают на решение или являются его дополнением :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Запуск команды из формы WPF
« Ответ #20 : 24-11-2015, 10:17:57 »
Надо предложить Александру Наумовичу идею о том, чтобы можно было пометить не только правильный ответ, но и сопутствующие ответы, которые явно указывают на решение или являются его дополнением :)
Мод форума не позволяет это сделать, так что идея не проходит. Остаётся только плюсовать "сопутствующие ответы".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #21 : 24-11-2015, 11:18:21 »
Мод форума не позволяет это сделать, так что идея не проходит. Остаётся только плюсовать "сопутствующие ответы".

Ну и ничего страшного.

Оффлайн Sergik

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Запуск команды из формы WPF
« Ответ #22 : 23-01-2017, 16:45:45 »
Добрый вечер! Стоит типичная задача данной теме, загрузка семейства используя WPF. Вот мой код:
Код - C# [Выбрать]
  1. namespace WPFandRevitAPI
  2. {
  3.     [Transaction(TransactionMode.Manual)]
  4.     [Regeneration(RegenerationOption.Manual)]
  5.     public class Class1 : IExternalCommand
  6.     {
  7.         public Document doc = null;
  8.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  9.         {
  10.             UIApplication Uiapp = commandData.Application;
  11.             doc = Uiapp.ActiveUIDocument.Document;
  12.             UserControl1 control = new UserControl1(this);
  13.             Window win = new Window();
  14.             win.ResizeMode = ResizeMode.NoResize;
  15.             win.Content = control;
  16.             win.Show();
  17.          }
  18. public void LoadFamily()
  19.         {
  20.             Transaction trans = new Transaction(doc);
  21.             trans.Start("LoadFamily");
  22.             doc.LoadFamily (@"c:\Users\home\Documents\Visual Studio 2015\Projects\WPFandRevitAPI\WPFandRevitAPI\bin\Debug\ЩРВ_IP31.rfa");
  23.             trans.Commit();
  24.         }
  25.  
Вот код логики:
Код - C# [Выбрать]
  1. namespace WPFandRevitAPI
  2. {
  3.     /// <summary>
  4.     /// Логика взаимодействия для UserControl1.xaml
  5.     /// </summary>
  6.     public partial class UserControl1 : UserControl
  7.     {
  8.         Class1 m_dataBuffer = null;
  9.         public UserControl1(Class1 dataBuffer)
  10.         {
  11.             m_dataBuffer = dataBuffer;
  12.             InitializeComponent();
  13.         }
  14.        private void ButtonLoad_Click(object sender, RoutedEventArgs e)
  15.         {
  16.             m_dataBuffer.LoadFamily();
  17.         }
  18. }
  19.  
Revit сразу вылетает при нажатии Button'a. В чем может быть проблема или как правильно загружать семейства?

Оффлайн Антон Останин

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Запуск команды из формы WPF
« Ответ #23 : 23-01-2017, 16:56:50 »
Sergik, здравствуйте. Чтобы Revit не падал, возьмите метод LoadFamily() в try catch. Заодно можете вывести сообщение об ошибке. Скорее всего это запуск транзакции не из API контекста, то есть из вашего контрола. Попробуйте сделать для проверки вызов метода из команды или запустить форму как win.ShowDialog().

Оффлайн Sergik

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Запуск команды из формы WPF
« Ответ #24 : 24-01-2017, 08:40:56 »
запустить форму как win.ShowDialog().
Правы на 100%, большое спасибо за решение!

Оффлайн Sergik

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Запуск команды из формы WPF
« Ответ #25 : 25-01-2017, 16:32:03 »
Скорее всего это запуск транзакции не из API контекста
Метод ShowDialog() действительно работает, но хотелось бы после загрузки семейства размещать его в проекте методом PromptForFamilyInstancePlacement() и при этом не закрывать форму каждый раз. Поэтому окно должно вызываться методом Show(), но тут Вы правы, запуск транзакции осуществляется не из API контекста. Выход предложил Jeremy Tammik в событии Idling, приведу даже код с SDK:
Код - C# [Выбрать]
  1. // Create a text note and update it once per second while Revit is idle
  2. TextNote textNote = null;
  3. String oldDateTime = null;
  4. public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  5. {
  6.     UIApplication uiApp = new UIApplication(commandData.Application.Application);
  7.     Document doc = commandData.Application.ActiveUIDocument.Document;
  8.     using (Transaction t = new Transaction(doc, "Text Note Creation"))
  9.     {
  10.        t.Start();
  11.        oldDateTime = DateTime.Now.ToString();
  12.        ElementId defaultTextTypeId = doc.GetDefaultElementTypeId(ElementTypeGroup.TextNoteType);
  13.        textNote = TextNote.Create(doc, doc.ActiveView.Id, XYZ.Zero, oldDateTime, defaultTextTypeId);
  14.        t.Commit();
  15.     }
  16.     uiApp.Idling += new EventHandler<IdlingEventArgs>(idleUpdate);
  17.     return Result.Succeeded;
  18. }
  19. public void idleUpdate(object sender, IdlingEventArgs e)
  20. {
  21.     UIApplication uiApp = sender as UIApplication;
  22.     Document doc = uiApp.ActiveUIDocument.Document;
  23.     if (oldDateTime != DateTime.Now.ToString())
  24.     {
  25.         using (Transaction transaction = new Transaction(doc, "Text Note Update"))
  26.         {
  27.            transaction.Start();
  28.            textNote.Text = DateTime.Now.ToString();
  29.            transaction.Commit();
  30.         }
  31.         oldDateTime = DateTime.Now.ToString();
  32.     }
  33. }
Но я ума не приложу как прикрутить к этому событию обработчики моих WPF контролов. Из моего класса UserControl1 ничего не видно в Class1, ни обработчиков, ни контролов :( Помогите разобраться, пожалуйста

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #26 : 26-01-2017, 06:53:01 »
Поэтому окно должно вызываться методом Show()

Давайте попробуем разобраться, для чего Вам нужно использовать метод Show()? Вы хотите иметь возможность сворачивать WPF форму/окно и дальше работать в Revit-e?

Я пытаюсь понять суть задачи (отметьте верно/неверно по каждому вопросу):
1. Вам нужно открывать WPF форму по нажатию кнопки на ленте?
2. Вам нужно, чтобы внутри WPF формы была кнопка, отвечающая за открытие определённого семейства (или любое другое действие)?
3. Вы хотите открывать другие семейства не закрывая WPF форму?
4. Вы хотите, чтобы WPF форма могла быть немодальной?

Пойму - помогу.

Оффлайн Sergik

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Запуск команды из формы WPF
« Ответ #27 : 26-01-2017, 09:45:59 »
Давайте попробуем разобраться, для чего Вам нужно использовать метод Show()? Вы хотите иметь возможность сворачивать WPF форму/окно и дальше работать в Revit-e?
Вы все верно поняли

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #28 : 26-01-2017, 14:03:08 »
Sergik, если я правильно Вас понял, то результат должен быть как на видео?


Оффлайн Sergik

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Запуск команды из формы WPF
« Ответ #29 : 26-01-2017, 16:37:12 »
Хм... А получится ли у Вас загрузить семейство, и не закрывая формы (только свернуть) разместить в проекте, вот что надо. Вы использовали метод IdIing в примере?