【发布时间】:2016-04-26 20:29:44
【问题描述】:
背景
我有一个 Revit 2016 插件,它可以从主模型及其链接模型批量导出到 DWF。它通过从主模型导出图纸并循环链接模型以导出其他图纸来工作。它使用UIApplication.OpenAndActivateDocument 打开一个文档并使用Document.Close 关闭它。由于 Revit API 不允许您关闭活动文档,因此它必须先打开一个占位符文档,然后才能关闭活动文档并打开下一个文档。这至少从 Revit 2014 开始就一直有效,但自 Revit 2016 R2 发布后就停止了。
现在,当您导出多个工作表时,调用 UIApplication.OpenAndActivateDocument 会失败。即使使用最新版本的 Revit 2016 R2 Update 4,问题仍然存在。
错误
错误是从UIApplication.OpenAndActivateDocument 方法引发的。它看起来像这样:
System.ComponentModel.Win32Exception 未处理 错误代码=-2147467259 HResult=-2147467259 消息=没有足够的配额 可用于处理此命令 NativeErrorCode=1816 源 = WindowsBase StackTrace:在 MS.Win32.UnsafeNativeMethods.PostMessage(HandleRef hwnd,WindowMessage 味精,IntPtr wparam,IntPtr lparam)在 System.Windows.Interop.HwndTarget.UpdateWindowSettings(布尔值 enableRenderTarget, Nullable`1 channelSet) 在 System.Windows.Interop.HwndTarget.UpdateWindowPos(IntPtr lParam) 在 System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage 消息, IntPtr wparam, IntPtr lparam) 在 System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean&handled) at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd,Int32 msg,IntPtr wParam, IntPtr lParam,布尔值&处理)在 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托 回调,对象参数,Int32 numArgs)在 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(对象源, 委托回调、对象 args、Int32 numArgs、委托 catchHandler) 在 System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority 优先级、TimeSpan 超时、委托方法、对象参数、Int32 numArgs) 在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
这是日志文件末尾显示的内容:
' 2.510552 2: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 6: ' 0.104902 6: ' 1.094590!!!! 4:!!!BIG_GAP ;PERF;MISC;再生
' 1.315856 3: ' 1: 'C 2016 年 5 月 3 日 08:43:03.892; 1: 'C 2016 年 5 月 3 日 08:43:03.892; 1: ' 1: ' 1: ' 1: ' 0: ' 2: 8381638 MB,已使用 3089 MB; RAM:可用 +109 -> 9955 MB,已用 -1 -> 3198 MB
'C 2016 年 5 月 3 日 08:43:04.652; 2: 'C 2016 年 5 月 3 日 08:43:04.652; 2: 'C 2016 年 5 月 3 日 08:43:04.652; 2: ' 0.760501 2:崩溃
' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: ' 1: '1: ' 2:<::100:: delta vm> 8381675 MB,已用 3089 MB; RAM:可用 -2 -> 9953 MB,已用 -1 -> 3197 MB
' 2: ' 2: ' 1:
理论
我猜这个问题是因为 2016 R2 中引入的新功能导致 DWF 使用多个进程而不是像以前版本中的单个进程导出的。我试过post my problem on the Autodesk Forums,但还没有收到他们支持的回复。
我也猜测它与内存有关,因为我从几个 Internet 来源阅读了“没有足够的配额可用于处理此命令消息”,但我的机器有 16GB 的 RAM,应该适合Revit。
还有其他人有什么想法吗?
【问题讨论】:
-
可能与问题无关,但我能问一下您为什么使用 OpenAndActivate 导出 DWF 文件而不是简单地打开吗?不需要激活模型,您可以在不需要占位符的情况下关闭模型。
-
@cs1088 你指的是
Application.OpenDocumentFile吗? Revit 2016 API 中没有UIApplication.Open。 -
是的,对不起。我打算编辑评论,但时间已经过去了。您应该能够使用 Application.OpenDocumentFile 而不是 UIApplication.OpenAndActivateDocument
-
@cs1088 我有一段时间没有使用 Revit API,但是,如果我没记错的话,这在过去不起作用,因为我无法打开链接模型,而主模型是还开着。不过我会试一试的。
-
@cs1088
Application.OpenDocumentFile不起作用。我收到错误“文档是链接文件。事务只能在主要文档(项目或家庭)中使用。”。但是,我必须使用事务,因为exporting to DWF requires using transactions according to Autodesk API Support。