Создание плагина Revit с помощью Windows Form

Я пытался создать плагин для Revit 2017 с Visual Studio 2015 с Windows Form. К сожалению, я не нашел никакой документации в Интернете для этого (если у вас есть ссылки, я буду рад их посмотреть)

Я создал простую форму, используя список и кнопку выбора.

  • В списке отображаются все двери в проекте Revit.
  • Кнопка выбора выбирает все выбранные двери из списка и выбирает их в проекте Revit (много вариантов...)

Это тестовое решение, чтобы увидеть, как все это работает.

Класс WeWillSee — это класс, реализующий основную функцию RevitAPI Execute:

 using System; 
 using Autodesk.Revit.UI; 
 using Autodesk.Revit.Attributes; 
 using Autodesk.Revit.DB;

 namespace Test2 {

 [Transaction(TransactionMode.Manual)]
 class WeWillSee : IExternalCommand
 {
     public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
     {
         UIApplication uiapp = commandData.Application;
         /*UIDocument uidoc = uiapp.ActiveUIDocument;
         Document doc = uidoc.Document;*/

         try
         {
             System.Windows.Forms.Application.EnableVisualStyles();
            System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
             System.Windows.Forms.Application.Run(new Form(commandData));
             //System.Windows.Forms.Form wf = new Form1(uiapp);
         }
         catch (Exception e)
         {
             TaskDialog.Show("Error", e.ToString());
             return Result.Failed;
         }

         return Result.Succeeded;
     }
 } 
 }

Форма, которую я хочу открыть (остальное не важно):

namespace Test2
{
    public partial class Form : System.Windows.Forms.Form
    {
        private UIApplication uiapp;
        private UIDocument uidoc;
        private Document doc;

        public Form(ExternalCommandData commandData)
        {
            InitializeComponent();

            uiapp = commandData.Application;
            uidoc = uiapp.ActiveUIDocument;
            doc = uidoc.Document;
        }

И, наконец, файл Program.cs (тот, который вызывает у меня проблемы):

namespace Test2
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1(/*Can't call ExternalCommandData on static class*/));
        }
    }
}

Спасибо за любую помощь, которую вы можете предложить! :)


person Elliott Addi    schedule 06.01.2017    source источник


Ответы (3)


Я не думаю, что вам даже нужен файл класса Program.cs в вашем проекте так, как вы его написали.

person PatH    schedule 06.01.2017
comment
Действительно, нет необходимости в файле program.cs. Это файл, который автоматически создается при создании проекта с использованием шаблона формы Windows. - person Elliott Addi; 09.01.2017

Вот простая надстройка Revit, реализующая внешнюю команду, которая создает и отображает форму Windows на лету:

http://thebuildingcoder.typepad.com/blog/2012/05/the-schedule-api-and-access-to-schedule-data.html

person Jeremy Tammik    schedule 07.01.2017
comment
Я использовал шаблон Revit 2017, представленный в вашем блоге. работает (почти) отлично. Теперь проблема заключается в управлении многопоточностью и событиями. - person Elliott Addi; 09.01.2017
comment
и кстати, ваш блог очень полезен для этого - person Elliott Addi; 09.01.2017
comment
Спасибо за благодарность! API Revit нельзя использовать с многопоточностью. вы можете делать другие вещи там, конечно, например. обрабатывать данные, извлеченные из Revit, но само извлечение (и все взаимодействие Revit) ограничено основным потоком Revit и допустимым контекстом API Revit. - person Jeremy Tammik; 10.01.2017

Вам не нужно делать Application.Run вещи (это только для автономных приложений Windows). Вам вообще не нужна вещь Program.cs.

Вы можете просто сделать то, что начали:

 Form1 wf = new Form1(uiapp);
 if (wf.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
 return Result.Success
person Matt    schedule 07.01.2017