Фон
У меня есть надстройка 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 был необработан ErrorCode = -2147467259 HResult = -2147467259 Message = Недостаточно квоты для обработки этой команды NativeErrorCode = 1816 Source = WindowsBase StackTrace: в MS.Win32.UnsafeNativeMethods.PostMessage, ms. wparam, IntPtr lparam) в System.Windows.Interop.HwndTarget.UpdateWindowSettings (Boolean enableRenderTarget, Nullable`1 channelSet) в System.Windows.Interop.HwndTarget.UpdateWindowPos (IntPtrop lParam. msg, IntPtr wparam, IntPtr lparam) в System.Windows.Interop.HwndSource.HwndTargetFilterMessage (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & hwndProgram, IntPtr lParam, Boolean и обработано), IntPtr.HwndRndPro (IntPtr. wParam, IntPtr lParam, Boolean & handled) в MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (Delegate ca llback, Object args, Int32 numArgs) в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (источник объекта, обратный вызов делегата, объектные аргументы, Int32 numArgs, делегат catchHandler) в System.Windows.Threading.Dispatcher.LegacyInvokeImplity (приоритет времени DispatcherPrior , Метод делегата, аргументы объекта, число Int32 numArgs) в MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
Вот что показывает конец файла журнала:
Теория
Я предполагаю, что проблема началась из-за новой функции, представленной в 2016 R2, которая заставляет экспортировать DWF с использованием нескольких процессов, а не одного, как в предыдущих версиях. Я пробовал опубликовать мою проблему на форумах Autodesk, но до сих пор не получил ответа от службы поддержки.
Я также предполагаю, что он привязан к памяти, поскольку я читал о «Недостаточно квоты для обработки этого командного сообщения» из нескольких интернет-источников, но на моем компьютере 16 ГБ ОЗУ, что должно быть подходящим для Revit.
Есть ли у кого-нибудь еще какие-нибудь идеи?
Я узнал больше об ошибке «Недостаточно квоты для обработки этой команды» из этот вопрос о DataGrid. Очевидно, проблема связана с очередью обмена сообщениями пользовательского интерфейса Windows, которую я не совсем понимаю. Существует очередь для этих базовых вызовов UIApplication.OpenAndActivateDocument
функций и ограничение по умолчанию в 10 000 вызовов. При достижении этого лимита отправляется сообщение об ошибке квоты. Я не контролирую базовый код Revit, поэтому я просто решил увеличить этот предел (который хранится как ключ реестра), и это сработало для меня (после перезагрузки компьютера). Мое решение заключалось в том, чтобы установить для следующего раздела реестра значение 1000000:
Application.OpenDocumentFile
работать, выгрузив ссылки перед загрузкой, а затем перезагрузив их (см. этот ответ). Однако я неизбежно получал ту же ошибку «Недостаточно квоты ...», что и в исходном выпуске. - person skeletank   schedule 27.04.2016