2017-02-08 10 views
0

У меня есть PushButton в ленте API revite и хотел бы имитировать нажатие на нее, чтобы выполнить некоторые тесты (мне нужен 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; 

С Приложением, являющимся, конечно, UIControlledApplication по умолчанию для функции OnStartup. В любом случае, чтобы узнать, как имитировать щелчок на кнопке, чтобы я мог получить объект ExternalCommandData в текущем открывшемся документе (в окончательной версии будут проверки, чтобы гарантировать, что документ уже открыт ext.) Или есть другой способ получить ExternalCommandData?

Обратите внимание, что этот вопрос может потребовать, чтобы вы знали API revit, я сомневаюсь, что для этого достаточно знать знание C#.

ответ

1

У меня было много того же самого проблемы с модульным тестированием Revit - и другие пользователи правы, нет способа получить ExternalCommandData object без выполнения команды. К счастью, есть основа, которая делает это возможным благодаря автоматизации запуска и запуска Revit извне. https://github.com/DynamoDS/RevitTestFramework

Группа «Динамо» построила эту инфраструктуру для автоматизации своих тестов, и она предлагает множество отличных функций.

Большинство уместнее для вас, это на самом деле предоставляет действительный 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 в качестве администратора на вашем компьютере. Я рекомендую установить его в локальный каталог в качестве локального пользователя, чтобы вы не запускали проблемы с UAC Windows.

0

Невозможно получить объект ExternalCommandData без выполнения команды.

Возможно, вы сможете использовать автоматизацию пользовательского интерфейса, чтобы программным образом нажать на кнопку PushButton. Может быть проще настроить сочетание клавиш для вашей команды и использовать UI Automation для имитации нажатия клавиш для вас. блог

знакомства Джереми Tammik для получения информации об использовании UI Automation в Revit: http://thebuildingcoder.typepad.com/blog/automation/

0

Вы не можете имитировать щелчок, чтобы запустить внешнюю команду, и вы не можете создать действительный ExternalCommandData объект самостоятельно. Только Revit может это сделать при вызове обработчика событий и предоставлении ему действительного контекста Revit API в функции обратного вызова, то есть обработчике событий Revit, таком как внешняя команда Execute.

Однако вы можете запустить внешнюю команду из другого действительного контекста API Revit, так же, как вы можете встроенную команду Revit, используя PostCommand API:

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

 Смежные вопросы

  • Нет связанных вопросов^_^