从Ribbon Revit 2015放置设备:交易已经开始

时间:2015-03-10 13:38:21

标签: vb.net transactions revit

栈,

我正在编写一个适用于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启动时触及的第一个按钮。

有没有办法循环打开事务并找到一个打开的事务?某些州的文件是否我不明白?我不确定转向哪个方向......任何帮助都会受到赞赏。

谢谢, 奔跑...

1 个答案:

答案 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());
            }
        }