2017-02-08 3 views
0

Ich habe einen PushButton in einem Revit-API-Ribbon und möchte einen Druck darauf simulieren, um einige Tests durchzuführen (Ich benötige einen ExternalCommandData object aus dem gerade aktiven Dokument). Allerdings kann ich scheinbar nichts wie eine PushButton.Click() Funktion finden.Wie simuliert man einen Klick auf eine Drucktaste?

var panel = Application.CreateRibbonPanel("a", "b") 
var buttonData = new PushButtonData(name, name, ApplicationInfo.AddInPath, "TestZone.Commands." + "DefaultCommand"); 
var button = panel.AddItem(buttonData) as PushButton; 

Mit Anwendung ist natürlich die Standard UIControlledApplication auf der OnStartup-Funktion. Anyway zu wissen, simulieren einen Knopf klicken, so dass ich ein ExternalCommandData Objekt des aktuell geöffneten Dokuments erhalten kann (In der endgültigen Version gibt es Prüfungen, um sicherzustellen, dass ein Dokument bereits geöffnet ist ext.) Oder gibt es eine andere Möglichkeit, ein externalCommandData zu erhalten?

Beachten Sie, dass diese Frage erfordert, dass Sie die Revit-API kennen, ich bezweifle, dass nur das Wissen von C# genug sein wird, um dies zu beantworten.

Antwort

1

ich viele der gleichen hatte Probleme beim Komponententest Revit - und die anderen Benutzer haben Recht, es gibt keine Möglichkeit, einen ExternalCommandData object zu erhalten, ohne einen Befehl auszuführen. Glücklicherweise gibt es ein Framework, das eine Menge davon ermöglicht, indem das Starten und Ausführen von Revit extern automatisiert wird. https://github.com/DynamoDS/RevitTestFramework

Die Dynamo-Gruppe hat dieses Framework erstellt, um ihre Tests zu automatisieren, und es bietet viele großartige Funktionen.

meisten einschlägig für Sie, es macht tatsächlich eine gültige ExternalCommandData object

Hier einige Beispiel-Code aus ihren Rahmen.

/// <summary> 
/// Using the TestModel parameter, you can specify a Revit model 
/// to be opened prior to executing the test. The model path specified 
/// in this attribute is relative to the working directory. 
/// </summary> 
[Test] 
[TestModel(@"./bricks.rfa")] 
public void ModelHasTheCorrectNumberOfBricks() 
{ 
    var doc = RevitTestExecutive.CommandData.Application.ActiveUIDocument.Document; 

    var fec = new FilteredElementCollector(doc); 
    fec.OfClass(typeof(FamilyInstance)); 

    var bricks = fec.ToElements() 
     .Cast<FamilyInstance>() 
     .Where(fi => fi.Symbol.Family.Name == "brick"); 

    Assert.AreEqual(bricks.Count(), 4); 
} 

RevitTestExecutive.CommandData bietet die ExternalCommandData die Sie suchen.

Beachten Sie, dass bei der Installation des RTF als Administrator auf Ihrem Computer ein Problem auftritt. Ich empfehle, es als lokalen Benutzer in einem lokalen Verzeichnis zu installieren, damit Sie nicht auf Windows-Benutzerkontensteuerungsprobleme stoßen.

0

Es gibt keine Möglichkeit, ein ExternalCommandData-Objekt zu erhalten, ohne einen Befehl auszuführen.

Sie können UI Automation möglicherweise verwenden, um programmgesteuert auf Ihren PushButton zu klicken. Es ist möglicherweise einfacher, eine Tastenkombination für Ihren Befehl zu konfigurieren und die Benutzeroberflächenautomatisierung zu verwenden, um die Tastendrücke für Sie zu simulieren.

Siehe Jeremy Tammik Blog für Informationen über UI Automation in Revit mit: http://thebuildingcoder.typepad.com/blog/automation/

0

Sie können den Klick simulieren einen externen Befehl zu starten, und Sie können kein gültiges ExternalCommandData Objekt selbst erstellen. Nur Revit kann dies tun, wenn Sie Ihren Ereignishandler aufrufen und ihm einen gültigen Revit-API-Kontext in einer Rückruffunktion bereitstellen, z. B. Revit-Ereignishandler, z. B. den externen Befehl Execute.

Sie können jedoch einen externen Befehl von einem anderen gültigen Revit API Kontext starten, wie können Sie einen eingebauten in Revit-Befehl, mit dem PostCommand API:

http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.3

Verwandte Themen