Revit API - 抛出异常:RevitAPI.dll 中的“Autodesk.Revit.Exceptions.InternalException” - 尝试两次运行按钮时

Posted

技术标签:

【中文标题】Revit API - 抛出异常:RevitAPI.dll 中的“Autodesk.Revit.Exceptions.InternalException” - 尝试两次运行按钮时【英文标题】:Revit API - Exception thrown: 'Autodesk.Revit.Exceptions.InternalException' in RevitAPI.dll - When trying to run button twice 【发布时间】:2020-05-09 05:14:39 【问题描述】:

目标

大家好,我正在 Revit 中制作一个按钮,用于将单个视口添加到新工作表,然后更改视口以显示 viewTitle 而不是空的或只是一行

错误

当我第一次运行该按钮时,除了视图标题未设置为加载的系列外,一切正常,尽管视图标题“行”正在显示。我第二次运行按钮时出现错误。

这是我第二次尝试运行按钮时遇到的错误:

Exception thrown: 'Autodesk.Revit.Exceptions.InternalException' in RevitAPI.dll
A managed exception was thrown by Revit or by one of its external applications.

错误发生在这一行:

Viewport newViewPort = Viewport.Create(doc, viewSheet.Id, duplicatedPlan2Copy, new XYZ(location.U, location.V, 0));

探索

根据我的研究,该按钮正在尝试访问一个已被访问的元素,但如果我要更改比例,我应该能够更改 ViewTitle。请参阅此问题底部的参考资料

这是我的一些代码在交易中

FamilySymbol firstSheet = colTitleBlocks.FirstElement() as FamilySymbol;
ViewSheet viewSheet = ViewSheet.Create(doc, firstSheet.Id);
UV location = new UV((viewSheet.Outline.Max.U - viewSheet.Outline.Min.U) / 2,
                                            (viewSheet.Outline.Max.V - viewSheet.Outline.Min.V) / 2);

ElementId duplicatedPlan2Copy = duplicatedPlan.Duplicate(ViewDuplicateOption.WithDetailing);
Viewport newViewPort = Viewport.Create(doc, viewSheet.Id, duplicatedPlan2Copy, new XYZ(location.U, location.V, 0));

调查结果 我发现如果我从我的代码中删除这一行: bool elementType = doc.GetElement(newViewPort.GetTypeId()).get_Parameter(BuiltInParameter.VIEWPORT_ATTR_LABEL_TAG).Set(viewTitleIdCommand);

它可以工作并且只能重复创建新的工作表和放置带有视图标题行的视口。

我们不胜感激。 This link here 显示了 2 个单独的事务提交如何解决了这个问题,但是我试过了,但没有奏效。 this one shows something similar

Here is a reference to my other related question regarding the button

【问题讨论】:

与问题无关,我强烈建议将问题格式化为简单明了。很多很多的解释确实无助于读者试图理解这个问题。确定问题所在,提出明确的问题并提供有效的代码示例。 今晚晚些时候我会尝试重新格式化和简化。不幸的是,格式化堆栈溢出问题并不是我的强项之一。 @EhsanIran-Nejad,我已经重新格式化了这个问题。希望这次更清楚。如果不是,请告诉我。 【参考方案1】:

我建议您首先通过用户界面手动探索和测试您的预期功能。一旦稳定、优化并按预期工作,您就可以通过 Revit API 以编程方式自动执行相同的步骤。这可能会帮助您以比使用 API 更有效的方式了解问题所在,因为 API 只是复制了 UI 功能。

【讨论】:

在 Revit 中的步骤是,1) Load titleblock -> 2) load view title -> 3) duplicate view -> 4) place view on sheet -> 5) set scale -> 6 ) edit type 并将 Title<none> 更改为 your view title you loaded -> 7) 将 show titleWhen multiple viewports 更改为 yes。我错过了任何步骤吗?如问题中所述。如果我 set the view title 然后将其更改回 <none> 然后点击按钮,它会持续工作,而且我没有收到 Internal Exception 错误。【参考方案2】:

我想通了。我最初尝试使用从我拥有的LoadFamily 类加载的 TitleView 的 elementId,而不是通过过滤元素收集器查找 elementId。

我不知道为什么这会给我一个错误,但确实如此。

【讨论】:

以上是关于Revit API - 抛出异常:RevitAPI.dll 中的“Autodesk.Revit.Exceptions.InternalException” - 尝试两次运行按钮时的主要内容,如果未能解决你的问题,请参考以下文章

[使用Revit API 2020的Revit API壁厚

Revit API。从主模型元素所在的链接模型中获取一个房间

BIM 360 和 Revit API

如何使用 Revit API 从上传到系统的 Revit 文件中获取所有元素

Revit API - 创建新的 ScheduleField

在 Revit api 中创建门的详细视图