C# 不允许在API上下文之外运行Revit外部应用程序

C# 不允许在API上下文之外运行Revit外部应用程序,c#,revit-api,C#,Revit Api,我试图在我的代码中启动一个事务,但正如您在标题中看到的,它生成了一个错误。我读过很多关于外部应用程序的文章,但不知道它是如何工作的 这是我用来启动交易的代码: 在我的表格内: private void Loading_FA_only()//Lance l'import en boucle suivant les items dans la file d'attente { foreach(FileInfo fi in selected_rfas_donnees)

我试图在我的代码中启动一个事务,但正如您在标题中看到的,它生成了一个错误。我读过很多关于外部应用程序的文章,但不知道它是如何工作的

这是我用来启动交易的代码: 在我的表格内:

private void Loading_FA_only()//Lance l'import en boucle suivant les items dans la file d'attente
    {
        foreach(FileInfo fi in selected_rfas_donnees)
        {
            Loading_Family.famille = fi;
            Loading_Family lf = new Loading_Family();
            lf.Execute(Command.uiapplication);
            Listing_succes(Loading_Family.succes, fi);
        }
        selected_rfas.Clear();
        selected_rfas_donnees.Clear();
        Update_Compteur();
    }
这就是我试图执行的:

public class Loading_Family : IExternalEventHandler
{
    public static FileInfo famille;
    public static bool succes;
    public void Execute(UIApplication uiapp)
    {
        UIDocument uidoc = uiapp.ActiveUIDocument;
        Application app = uiapp.Application;
        Document doc = uidoc.Document;

        // Access current selection

        Selection sel = uidoc.Selection;

        // Retrieve elements from database

        FilteredElementCollector col
          = new FilteredElementCollector(doc)
            .WhereElementIsNotElementType()
            .OfCategory(BuiltInCategory.INVALID)
            .OfClass(typeof(Wall));

        // Filtered element collector is iterable

        foreach (Element e in col)
        {
            Debug.Print(e.Name);
        }

        // Modify document within a transaction

        succes = false;
        string nom_famille = famille.Name.Remove(famille.Name.Length - 4, 4);
        FilteredElementCollector familles_doc = new FilteredElementCollector(doc).OfClass(typeof(Family));
        foreach (Element elmt in familles_doc)
        {
            if (elmt.Name == nom_famille)
            {
                var result = TaskDialog.Show("CPF - Importation", "Il semblerait que " + nom_famille + " soit déjà présent dans votre projet.\nVoullez-vous le remplacer ?", TaskDialogCommonButtons.Yes | TaskDialogCommonButtons.No);
                if (result == TaskDialogResult.Yes)
                {
                    using (Transaction tr = new Transaction(doc, "Importer la famille"))
                    {
                        tr.Start();
                        doc.LoadFamily(famille.FullName);
                        tr.Commit();
                        tr.Dispose();
                    }
                }
            }
            else
            {
                using (Transaction tr = new Transaction(doc, "Importer la famille"))
                {
                    tr.Start();
                    doc.LoadFamily(famille.FullName);
                    tr.Commit();
                    tr.Dispose();
                }
            }
        }
        familles_doc = new FilteredElementCollector(doc);
        foreach (Element elmt in familles_doc)
        {
            if (elmt.Name == nom_famille) { succes = true; }
            else { succes = false; }
        }

        using (Transaction tx = new Transaction(doc))
        {
            tx.Start("Transaction Name");
            tx.Commit();
        }

    }
    public string GetName()
    {
        return "my event";
    }
}
我对此感到绝望。我完全不知道他们的“ExternalEventHandler”或“ExternalApplication”是如何工作的。 感谢您的帮助:)

请完成以下步骤。这说明了Revit API及其体系结构所需的所有基础知识,包括如何实现和使用外部应用程序和命令

请注意,在运行和加载Revit加载项时,Revit.exe的回调问题专门提供了这样的上下文

因此,您在说明中所作的陈述是预期的和需要的:Revit外部应用程序永远不能在有效的Revit API上下文之外运行,因此确实不允许

请在提交之前检查您的文本,尤其是标题,因为您描述中的拼写错误会使查找问题变得更加困难。

请仔细阅读。这说明了Revit API及其体系结构所需的所有基础知识,包括如何实现和使用外部应用程序和命令

请注意,在运行和加载Revit加载项时,Revit.exe的回调问题专门提供了这样的上下文

因此,您在说明中所作的陈述是预期的和需要的:Revit外部应用程序永远不能在有效的Revit API上下文之外运行,因此确实不允许


请在提交文本之前检查文本的拼写,尤其是标题,因为您描述中的拼写错误会使查找问题变得更加困难。

这非常简单。使用外部事件并确保在MyForm的构造函数中声明外部事件。就我个人而言,我从未使用过ShowDialog,因为它会阻止用户访问UI的其余部分。

它非常简单。使用外部事件并确保在MyForm的构造函数中声明外部事件。就我个人而言,我从未使用过ShowDialog,因为它会阻止用户访问UI的其余部分。

我已经查阅了您的网站。我在这里遇到的一个简单问题是如何为Execute方法提供正确的UIApplication参数,但不知道如何提供。当我在Execute方法的命令类中使用MyForm.Show()时,当我尝试在命令类中但在其他方法中执行新事务时,我在Revit API之外。当我在同一位置使用MyForm.ShowDialog()时,没有问题,但当我尝试在视图中放置族时,它不起作用,因为我无法关闭MyForm。检查这个问题,我已经咨询了你的网站。我在这里遇到的一个简单问题是如何为Execute方法提供正确的UIApplication参数,但不知道如何提供。当我在Execute方法的命令类中使用MyForm.Show()时,当我尝试在命令类中但在其他方法中执行新事务时,我在Revit API之外。当我在同一位置使用MyForm.ShowDialog()时,没有问题,但当我尝试在视图中放置族时,它不起作用,因为我无法关闭MyForm。检查这个问题我知道这是我必须做的,但不知道如何做:)我试图在互联网上搜索代码示例,但对我发现的不太满意。我也会花一些时间看你的文章,看看你是如何工作的,但是,呃,这是我的帖子:)从github开始我的19项技术项目。使用具有18个离散外部事件代码的无模式形式。这只是第一次很难。我看了你的链接,我尝试了。我让你看看问题所在。我想我不太清楚我读到了什么:)ExternalEvent.Create(lf)必须进入接口\u CPF()构造函数方法(不是加载事件)。当然。我的加载\u选择的方法在接口\u CPF()类中。你可以看到完整的界面(CPF classI)我明白这是我必须做的但不知道如何做:)我试图在互联网上搜索代码示例,但对我发现的不太满意。我也会花一些时间看你的文章,看看你是如何工作的,但是,呃,这是我的帖子:)从github开始我的19项技术项目。使用具有18个离散外部事件代码的无模式形式。这只是第一次很难。我看了你的链接,我尝试了。我让你看看问题所在。我想我不太清楚我读到了什么:)ExternalEvent.Create(lf)必须进入接口\u CPF()构造函数方法(不是加载事件)。当然。我的加载\u选择的方法在接口\u CPF()类中。您可以看到完整的接口\u CPF类