2017-02-08 1 views
0

J'ai un PushButton dans un ruban API revit et je voudrais simuler une pression dessus pour faire quelques tests (j'ai besoin d'un ExternalCommandData object du document actuellement actif). Cependant, je ne peux pas trouver quelque chose comme une fonction PushButton.Click().Comment simuler un clic sur un bouton-poussoir?

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

d'être d'application bien sûr la UIControlledApplication par défaut sur la fonction OnStartup. De toute façon pour savoir simuler un clic de bouton afin que je puisse obtenir un objet ExternalCommandData du document actuellement ouvert (Dans la version finale il y aura des vérifications pour s'assurer qu'un document est déjà ouvert ext.) Ou existe-t-il un autre moyen d'obtenir une externalCommandData?

Notez que cette question peut vous demander de connaître l'API revit, je doute que la simple connaissance de C# suffise pour répondre à cette question.

Répondre

1

J'ai eu beaucoup de même problèmes avec les tests unitaires Revit - et les autres utilisateurs ont raison, il n'y a aucun moyen d'obtenir un ExternalCommandData object sans exécuter une commande. Heureusement, il existe un cadre qui rend beaucoup de ceci possible en automatisant le démarrage et l'exécution de Revit en externe. https://github.com/DynamoDS/RevitTestFramework

Le groupe Dynamo a construit ce framework pour automatiser ses tests, et il offre beaucoup de fonctionnalités.

pour vous plus pertinemment, il expose en fait un valide ExternalCommandData object

Voici quelques exemples de code de leur cadre.

/// <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 offre la commande ExternalCommandData que vous recherchez. Notez qu'il y a un problème avec l'installation du RTF en tant qu'administrateur sur votre machine. Je recommande de l'installer dans un répertoire local en tant qu'utilisateur local afin de ne pas rencontrer les problèmes de Windows UAC.

0

Il n'existe aucun moyen d'obtenir un objet ExternalCommandData sans exécuter une commande.

Vous pouvez utiliser UI Automation pour cliquer par programme sur votre PushButton. Il peut être plus simple de configurer un raccourci clavier pour votre commande et d'utiliser UI Automation pour simuler les touches pour vous.

Voir le blog de Jeremy Tammik pour obtenir des informations sur l'utilisation de UI Automation dans Revit: http://thebuildingcoder.typepad.com/blog/automation/

0

Vous ne pouvez pas simuler le clic pour lancer une commande externe, et vous ne pouvez pas créer un objet ExternalCommandData valide vous. Seul Revit peut le faire en appelant votre gestionnaire d'événements et en lui fournissant un contexte Revit API valide dans une fonction de rappel, c'est-à-dire, un gestionnaire d'événements Revit tel que la commande externe Execute.

Vous pouvez toutefois lancer une commande externe d'un autre contexte API Revit valide, tout comme vous pouvez intégré dans la commande Revit, en utilisant l'API PostCommand:

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