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

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

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

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #30 : 27-01-2017, 06:55:56 »
А получится ли у Вас загрузить семейство, и не закрывая формы (только свернуть) разместить в проекте

Вручную? Или автоматически? Я попробую, но не гарантирую, что успею сегодня это сделать.

Вы использовали метод IdIing в примере?

Нет.

Оффлайн Sergik

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Запуск команды из формы WPF
« Ответ #31 : 27-01-2017, 11:53:14 »
Вручную? Или автоматически? Я попробую, но не гарантирую, что успею сегодня это сделать.
Без разницы: можете автоматически, можете вручную попробовать через метод PromptForFamilyInstancePlacement(FamilySymbol)

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Запуск команды из формы WPF
« Ответ #32 : 27-01-2017, 11:57:52 »
Sergik, я бы реализовал IExternalEventHandler. Здесь вы можете создавать свои события, в которых можно запускать транзакцию. Таким образом неважно открыто или закрыто ваше окно.
« Последнее редактирование: 27-01-2017, 12:35:23 от Антон Останин »

Оффлайн Sergik

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Запуск команды из формы WPF
« Ответ #33 : 27-01-2017, 14:27:24 »
Здесь вы можете создавать свои события, в которых можно запускать транзакцию. Таким образом неважно открыто или закрыто ваше окно.
А можно пример кода, спроецированный на мою задачу, если у Вас есть немного времени, конечно? Буду чрезмерно благодарен

Оффлайн Sergik

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Запуск команды из формы WPF
« Ответ #34 : 30-01-2017, 16:39:56 »
я бы реализовал IExternalEventHandler
Спасибо за подсказку, все получилось как задумывалось. Делюсь решением (Евгению отдельно спасибо за попытку). Код в команде:
Код - C# [Выбрать]
  1.                 UserControl1 control = new UserControl1();
  2.                 IExternalEventHandler loadfamily = new EventLoadFamilyInstance();
  3.                 ExternalEvent ExEventLoad = ExternalEvent.Create(loadfamily);
  4.                 control.eventLoad = ExEventLoad;
  5.  
Код в форме WPF:
Код - C# [Выбрать]
  1. public partial class UserControl1 : UserControl
  2.     {
  3.         public UserControl1()
  4.         {
  5.             InitializeComponent();
  6.             ...
  7.         }
  8.         public ExternalEvent eventLoad { get; set; }
  9.         public void ButtonLoad_Click(object sender, RoutedEventArgs e)
  10.         {
  11.             eventLoad.Raise();
  12.         }
  13.     }
  14. public class EventLoadFamilyInstance : IExternalEventHandler
  15.     {
  16.         public void Execute(UIApplication app)
  17.         {
  18.             UIDocument UIdoc = app.ActiveUIDocument;
  19.             Document doc = UIdoc.Document;
  20.             Transaction trans = new Transaction(doc);
  21.             trans.Start("Load");
  22.             doc.LoadFamilySymbol(string filename, string name);
  23.             trans.Commit();
  24.         }
  25.         public string GetName()
  26.         {
  27.             return "EventLoadFamilyInstance";
  28.         }
  29.     }
  30.  

Оффлайн Владимир П

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Re: Запуск команды из формы WPF
« Ответ #35 : 05-05-2017, 12:32:49 »
Я пытаюсь понять суть задачи (отметьте верно/неверно по каждому вопросу):1. Вам нужно открывать WPF форму по нажатию кнопки на ленте?2. Вам нужно, чтобы внутри WPF формы была кнопка, отвечающая за открытие определённого семейства (или любое другое действие)?3. Вы хотите открывать другие семейства не закрывая WPF форму?4. Вы хотите, чтобы WPF форма могла быть немодальной?Пойму - помогу.
Приветствую, Евгений и всех кто в теме. А мне не поможете?
Пока интересует всего лишь первый пункт.
Т. е. у меня есть приложение, выполняющее некоторую графику в Ревит. Исходные данные задаются из кода, могу и Win форму добавить для ввода исходных данных (в других приложениях уже делал). Но хочется, чтобы это диалоговое окно было сделано в WPF. Вот как в Вашем видео. Т. е. это окно в WPF в принципе уже есть.
Интересует сама процедура как объединить эти две отдельные пока что части в единое приложение?
Если можно по-подробней и пошагово.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Re: Запуск команды из формы WPF
« Ответ #36 : 05-05-2017, 14:17:43 »
Владимир П, добрый день.

Я пока не понял, какие именно две части Вы хотите сшить вместе. Как я понял, что Вы желаете видеть в одном плагине и формы WinForms и формы из WPF? Я правильно Вас понимаю? Если нет, то прошу поправить меня.

По созданию плагина под Revit с помощью WPF алгоритм будет следующим:
1. Создаём приложение WPF.
2. Затем меняем тип приложения на «WPF библиотека классов».
3. Затем добавляем изображение (48x48), которая будет играть роль кнопки закрытия формы WPF (назовите её для примера «close 48.png»).
4. Удаляем Application.xaml.
5. Подключаем ссылки на библиотеки: RevitAPI.dll, RevitAPIUI.dll, (убедитесь, что System.Data.DataSetExtensions,
System.Windows.Forms, System.Xaml тоже присутствуют)
6. У всех ссылок свойство «Копировать локально = False».
7. В модуле MainWindow.xaml поставьте код:

Код - XML [Выбрать]
  1. <Window x:Class="MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="350" Width="525" Background="Transparent"
  5. AllowsTransparency="True" WindowStyle="None"
  6. WindowStartupLocation="CenterScreen" ResizeMode="CanResizeWithGrip" >
  7. <Grid>
  8. <Rectangle Fill="Transparent" Stroke="#FFFB2E00" StrokeThickness="3"/>
  9. <Rectangle Stroke="#FF002040" Opacity="0.6" StrokeMiterLimit="0" Margin="0,0,0,-5"
  10. StrokeThickness="0">
  11. <Rectangle.Effect>
  12. <DropShadowEffect x:Name="DS" BlurRadius="25" ShadowDepth="0" Color="Black" />
  13. </Rectangle.Effect>
  14. <Rectangle.Fill>
  15. <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
  16. <GradientStop Color="#FF05121F" Offset="0"/>
  17. <GradientStop Color="#FF2A74BD" Offset="1"/>
  18. </LinearGradientBrush>
  19. </Rectangle.Fill>
  20. </Rectangle>
  21. <Rectangle x:Name="TitleBar" Height="40" Stroke="#FF002040" VerticalAlignment="Top"
  22. StrokeThickness="3" Fill="#FF05121F" Opacity="0.7"/>
  23. <Button Content="Button" HorizontalAlignment="Left" Height="44" Margin="21,55,0,0"
  24. VerticalAlignment="Top" Width="232" Background="#FFF73901"
  25. BorderBrush="#FF052B91" BorderThickness="3" Click="Button_Click">
  26. <Button.Effect>
  27. <DropShadowEffect BlurRadius="15" Color="#FFA83104"/>
  28. </Button.Effect>
  29. </Button>
  30. <Image Height="28" Margin="0,7,7,0" VerticalAlignment="Top" HorizontalAlignment="Right"
  31. Width="28" Source="close 48.png"
  32. MouseDown="Image_MouseDown"/>
  33. </Grid>
  34. </Window>


8. В событии Image (кнопки, для которой Вы загрузили изображение), а именно MouseDown дважды кликаем в поле Image_MouseDown и откроется модуль MainWindow.xaml.vb, в котором мы всё напрочь удаляем и вставляем код:

Код - vb.net [Выбрать]
  1. Imports Autodesk.Revit
  2. Imports Autodesk.Revit.UI
  3. Imports Autodesk.Revit.DB
  4. Imports System
  5. Imports System.Windows.Forms
  6. Imports System.Text
  7. Class MainWindow
  8. Private myCD As ExternalCommandData
  9. Public Sub New(ByVal commandData As ExternalCommandData)
  10. MyBase.New()
  11. InitializeComponent()
  12. myCD = commandData
  13. End Sub
  14. Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
  15. Dim App As Autodesk.Revit.UI.UIApplication = myCD.Application
  16. MsgBox(App.Application.VersionNumber)
  17. End Sub
  18. Private Sub TitleBar_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles
  19. TitleBar.MouseDown
  20. Me.DragMove()
  21. End Sub
  22. Private Sub Image_MouseDown(sender As Object, e As MouseButtonEventArgs)
  23. Me.Close()
  24. End Sub
  25. End Class

9. Создаём класс WPF_Form_Show.vb

Код - vb.net [Выбрать]
  1. <Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.ReadOnly)> _
  2. Public Class WPF_Form_Show
  3. Implements Autodesk.Revit.UI.IExternalCommand
  4. Public Function Execute(ByVal commandData As Autodesk.Revit.UI.ExternalCommandData, _
  5. ByRef message As String, ByVal elements As Autodesk.Revit.DB.ElementSet) _
  6. As Autodesk.Revit.UI.Result Implements Autodesk.Revit.UI.IExternalCommand.Execute
  7. Dim myNewForm As New MainWindow(commandData)
  8. myNewForm.ShowDialog()
  9. Return Autodesk.Revit.UI.Result.Succeeded
  10. End Function
  11. End Class

10. Собираем сборку и копируем путь к сборке в буфер, нажав «Ctrl+C».
11. Переходим в папку «%Appdata%\Autodesk\Revit\Addins\2017» (у кого какая версия Revit-а)
12. Создаем в папке файл «Revit_WPF.addin»

Код - XML [Выбрать]
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RevitAddIns>
  3. <AddIn Type="Command">
  4. <Name>Revit WPF Form</Name>
  5. <FullClassName>ИМЯ_ВАШЕГО_ПРОЕКТА_БИБЛИОТЕКИ.WPF_Form_Show</FullClassName>
  6. <Assembly>Полный путь к сборке</Assembly>
  7. <AddInId>94bc2dbd-560b-4669-9a92-dda4d11bdb6d</AddInId>
  8. <VendorId>Gallurgy</VendorId>
  9. <VendorDescription>ОАО Галургия, www.gallurgy.ru</VendorDescription>
  10. </AddIn>
  11. </RevitAddIns>

Результат Вам должен понравиться.





Если Вам потребуется иметь возможность использовать в одном плагине и формы WPF и WinForms, то тут алгоритм немного будет расширенным, но результат будет похож на это:

« Последнее редактирование: 05-05-2017, 15:13:32 от Пашин Евгений »

Оффлайн Владимир П

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Re: Запуск команды из формы WPF
« Ответ #37 : 05-05-2017, 16:20:52 »
По созданию плагина под Revit с помощью WPF алгоритм будет следующим:
Евгений, огромное спасибо за столь быстрый и подробный ответ!
Воспроизвести это все также быстро у меня не получится, к сожалению. Но как только.. - так сразу сообщу о результатах.

Оффлайн Владимир П

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Re: Запуск команды из формы WPF
« Ответ #38 : 08-05-2017, 11:03:15 »
Результат Вам должен понравиться.
Наконец-то, появилось время... Все получилось. Спасибо еще раз!
Теперь пробую переделать с VB на С# (с ходу не получилось).