栈,
我正在编写一个适用于Autodesk Revit(2015)的外部应用程序。我在功能区上创建了一个按钮,允许用户放置一个特殊的设备,我稍后会用它来阅读并传递给另一个进程。我使用'TheBuildingCoder''Family API'的例子来做到这一点。功能区上的按钮在ProgramData目录中的.addin文件中设置了外部命令...
<AddIn Type="Command">
<Assembly>C:\GSN Programs\MyDll.dll</Assembly>
<AddInId>{97715E4F-EA48-4690-8C62-B5D4836FF452}</AddInId>
<FullClassName>RcarsPlugIn.PlaceEquipment</FullClassName>
<VendorId>MyCompany, LLC</VendorId>
<Text>Place Equipment</Text>
<VisibilityMode>AlwaysVisible</VisibilityMode>
<Discipline>Any</Discipline>
<LanguageType>Unknown</LanguageType>
</AddIn>
按下按钮,我将命令数据放入一个全局变量中,以便在整个程序中使用...
If IsNothing(gv_oGo) Then
gv_oGo = New clsGeneralOperations
gv_oGo.CachedCommandData = exCommandData
gv_oGo.UiApp = exCommandData.Application.ActiveUIDocument.Application
End If
随着CommandData的缓存,我将通过用户选择...来移动设备......
uiDoc = gv_oGo.UiApp.ActiveUIDocument
oSym = oRF.FindElement(doc, GetType(FamilySymbol), "MyEQUIP")
uiDoc.PromptForFamilyInstancePlacement(oSym)
Public Function FindElement(doc As Document, targetType As Type, sTargetName As String) As Element
Return New FilteredElementCollector(doc).OfClass(targetType).FirstOrDefault(Function(e) e.Name.Equals(sTargetName))
End Function
这就是问题发挥作用的地方。我收到一条从Revit发回的错误消息,指出“在已经可修改的文档中不允许放置。必须先关闭活动交易。”问题是,我还没有开始一个不同的交易。功能区上的按钮是Revit启动时触及的第一个按钮。
有没有办法循环打开事务并找到一个打开的事务?某些州的文件是否我不明白?我不确定转向哪个方向......任何帮助都会受到赞赏。
谢谢, 奔跑...
答案 0 :(得分:1)
好的,一个澄清问题 - 正在发生例外
uiDoc.PromptForFamilyInstancePlacement(oSym)
行是否正确?如果是这样,请尝试使用子事务来完成命令:
Document doc = uiDoc.Document;
using (SubTransaction subtr_fam = new SubTransaction(doc))
{
try
{
uiDoc.PromptForFamilyInstancePlacement(oSym);
}
catch(Exception e)
{
Console.WriteLine(e.StackTrace.ToString());
}
}