Revit 2016 R2 在 UIApplication.OpenAndActivateDocument 上崩溃
Posted
技术标签:
【中文标题】Revit 2016 R2 在 UIApplication.OpenAndActivateDocument 上崩溃【英文标题】:Revit 2016 R2 Crashes on UIApplication.OpenAndActivateDocument 【发布时间】: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。
【参考方案1】:
我从this question about DataGrid 发现了有关错误“没有足够的配额可用于处理此命令”的更多信息。显然这个问题与 Windows UI 消息队列有关,我必须承认我并不完全理解。这些底层PostMessage
函数调用有一个队列,默认调用限制为10,000。达到此限制时会发送配额错误。我无法控制底层 Revit 代码,所以我决定增加此限制(存储为注册表项),这对我有用(重新启动计算机后)。我的解决方案是将以下注册表项设置为 1,000,000:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Windows\USERPostMessageLimit
我最初尝试了 20,000,但错误仍然不断出现,因此我选择了一个任意高的 1,000,000 并且错误消失了。然后我开始以较低的值测试我们最大的模型,500,000 的值是不会触发错误的最低可能设置。目前,我让单个用户以这种方式运行它,因为我不确定它是否会导致其他 Windows 应用程序出现问题,因为它影响的不仅仅是 Revit。
【讨论】:
在注册表编辑器中移至:Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
。【参考方案2】:
我找到了一种方法来重组我的程序,而不是使用包含当前模型中所有工作表的 ViewSet
来调用 Document.Export
一次,而是为当前模型中的每个工作表调用一次 Document.Export
通过传入包含该单张纸的ViewSet
。无论出于何种原因,这都会阻止 Revit 崩溃,可能是因为它放弃了通常会导致崩溃的资源。
请注意,通过执行此操作,DWF 将按顺序而不是并行导出,因为只有在一次调用中传入多张图纸才能利用 Revit 2016 R2 中引入的多进程导出。具有讽刺意味的是,顺序方法与并行方法一样快。
【讨论】:
以上是关于Revit 2016 R2 在 UIApplication.OpenAndActivateDocument 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章