2017-01-06 6 views
1

Ich habe versucht, ein Plugin für Revit 2017 mit Visual Studio 2015 mit Windows Form zu erstellen. Leider habe ich keine Unterlagen online dabei gefunden (wenn Sie Links haben, werde ich glücklich sein, ihnen einen Blick zu geben)Create Revit Plugin mit Windows Form

ich eine einfache Form baute eine Listbox und eine Auswahltaste

haben
  • die Listbox zeigt alle Türen in einem Revit-Projekt
  • die Select-Taste alle ausgewählten Türen aus dem List-Feld auswählt und sie in der Revit-Projekt (das ist eine Menge wählt ...)

Es ist eine Testlösung, um zu sehen, wie es funktioniert alles.

WeWillSee Klasse ist die Klasse der Haupt RevitAPI Funktion Ausführen der Umsetzung:

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; 
    } 
} 
} 

Die Form I (den Rest in nicht wichtig) öffnen möchten:

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; 
     } 

Und schließlich die Program.cs Datei (die mich Probleme verursacht):

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*/)); 
     } 
    } 
} 

Danke für jede Hilfe, die Sie anbieten können! :)

Antwort

1

Ich glaube nicht, dass Sie sogar die Program.cs-Klassendatei in Ihrem Projekt brauchen, wie Sie es geschrieben haben.

+0

der Tat gibt es keine Notwendigkeit für die Datei Program.cs. Es ist die Datei, die automatisch generiert wird, wenn Sie ein Projekt mithilfe der Windows-Formularvorlage erstellen. –

0

Sie müssen nicht die Application.Run Art Dinge tun (das ist nur für eigenständige Windows-Anwendungen). Sie brauchen die Program.cs-Sache überhaupt nicht.

Sie können nur tun, wie Sie begann zu:

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

1

Hier ist ein einfaches Revit-Add-in einen externen Befehl implementieren, die ein Windows-Formular auf der Fliege erstellt und zeigt :

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

+0

Ich habe die Revit-Vorlage 2017 in Ihrem Blog verwendet. es funktioniert (fast) großartig. Das Problem besteht jetzt darin, Multi-Threading und Ereignisse zu verwalten. –

+0

und btw, ist Ihr Blog sehr hilfreich für diese –

+0

Dank für Ihr Verständnis danken! Die Revit-API kann nicht mit Multithreading verwendet werden. Sie können dort natürlich auch andere Dinge tun, z.B. Prozessdaten, die Sie aus Revit extrahiert haben, aber die Extraktion selbst (und die gesamte Revit-Kommunikation) ist auf den Haupt-Revit-Thread und einen gültigen Revit-API-Kontext beschränkt. –