如何模拟点击按钮?
How to simulate a click on a pushbutton?
我在 revit API 功能区中有一个按钮,我想模拟按下它以进行一些测试(我需要来自当前活动文档的 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# 是否足以回答此问题。
没有 运行 命令就无法获取 ExternalCommandData 对象。
您可以使用 UI 自动化以编程方式单击您的按钮。为您的命令配置键盘快捷键并使用 UI 自动化为您模拟按键可能会更简单。
有关在 Revit 中使用 UI 自动化的信息,请参阅 Jeremy Tammik 的博客:http://thebuildingcoder.typepad.com/blog/automation/
不能模拟点击启动外部命令,也不能自己创建有效的ExternalCommandData
对象。只有 Revit 可以在调用事件处理程序并在 call-back 函数中为其提供有效的 Revit API 上下文时执行此操作,即 Revit 事件处理程序,例如外部命令 Execute
方法。
然而,您可以从其他一些有效的 Revit API 上下文启动外部命令,就像您可以使用 PostCommand
API 的 built-in Revit 命令一样:
http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.3
我在对 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 问题。
我在 revit API 功能区中有一个按钮,我想模拟按下它以进行一些测试(我需要来自当前活动文档的 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# 是否足以回答此问题。
没有 运行 命令就无法获取 ExternalCommandData 对象。
您可以使用 UI 自动化以编程方式单击您的按钮。为您的命令配置键盘快捷键并使用 UI 自动化为您模拟按键可能会更简单。
有关在 Revit 中使用 UI 自动化的信息,请参阅 Jeremy Tammik 的博客:http://thebuildingcoder.typepad.com/blog/automation/
不能模拟点击启动外部命令,也不能自己创建有效的ExternalCommandData
对象。只有 Revit 可以在调用事件处理程序并在 call-back 函数中为其提供有效的 Revit API 上下文时执行此操作,即 Revit 事件处理程序,例如外部命令 Execute
方法。
然而,您可以从其他一些有效的 Revit API 上下文启动外部命令,就像您可以使用 PostCommand
API 的 built-in Revit 命令一样:
http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.3
我在对 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 问题。