如何模拟按钮上的点击?

时间:2017-02-08 11:23:17

标签: c# user-interface revit-api revit

我在revit API功能区中有一个PushButton,并且想要模拟它上面的按键以进行一些测试(我需要从当前活动的文档中ExternalCommandData object)。但是我似乎找不到像PushButton.Click()函数那样的东西。

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

应用程序当然是OnStartup函数上的默认UIControlledApplication。无论如何要知道模拟按钮单击以便我可以获取当前打开的文档的ExternalCommandData对象(在最终版本中将检查以确保文档已经打开ext。)或者是否有另一种获取externalCommandData的方法?

请注意,这个问题可能要求您了解revit API,我怀疑只有c#的知识才足以回答这个问题。

3 个答案:

答案 0 :(得分:1)

我在单元测试Revit时遇到了很多相同的问题 - 其他用户都是对的,没有运行命令就无法获得ExternalCommandData object。幸运的是,有一个框架可以通过自动启动和运行Revit来实现这一目标。 https://github.com/DynamoDS/RevitTestFramework

Dynamo小组构建了这个框架来自动化他们的测试,它提供了很多很棒的功能。

最适合您,它实际上暴露了有效的ExternalCommandData object

以下是其框架中的一些示例代码。

/// <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提供您正在寻找的ExternalCommandData。

请注意,在计算机上以管理员身份安装RTF时会出现问题。我建议将其作为本地用户安装到本地目录,这样就不会遇到Windows UAC问题。

答案 1 :(得分:0)

没有运行命令就无法获取ExternalCommandData对象。

您可以使用UI自动化以编程方式单击您的PushButton。为命令配置键盘快捷键可能更简单,并使用UI Automation为您模拟按键。

有关在Revit中使用UI自动化的信息,请参阅Jeremy Tammik的博客:http://thebuildingcoder.typepad.com/blog/automation/

答案 2 :(得分:0)

您无法模拟单击以启动外部命令,也无法自行创建有效的ExternalCommandData对象。只有Revit可以在调用事件处理程序并在回调函数中为其提供有效的Revit API上下文时执行此操作,即Revit事件处理程序,如外部命令Execute方法。

然而,您可以使用PostCommand API从其他一些有效的Revit API上下文启动外部命令,就像使用内置Revit命令一样:

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