目标是从 Revit DA 作业运行 C++ 可执行文件,以便使用第 3 方库进行一些网格处理。我首先研究该轨道,这样就不需要编写自定义 .Net 绑定来与 c++ 库交互...... 不幸的是我收到以下错误:
[10/04/2023 19:46:31] Exception RunMeshOptimizer: Not enough quota is available to process this command
[10/04/2023 19:46:31] StackTrace: at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
[10/04/2023 19:46:31] at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
[10/04/2023 19:46:31] at Keystone.DA.Revit.Net.Commands.RunMeshOptimizer(JObject opts, String inputFile, String outputFile)
c++测试代码非常简单,所以我怀疑它会消耗大量内存:
#include <iostream>
#include <fstream>
int main(int argc, char* argv[])
{
std::ofstream outfile("test.txt");
outfile << "test" << std::endl;
outfile.flush();
outfile.close();
}
可执行文件包含在 DA 包中并从 .Net 调用,如下所示:
var asm = Assembly.GetExecutingAssembly();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.CreateNoWindow = false;
startInfo.FileName = Path.Combine(Path.GetDirectoryName(asm.Location), "MeshOptimizer.exe");
using (Process exeProcess = Process.Start(startInfo))
{
exeProcess.WaitForExit();
}
我的问题是从 DA 作业生成外部 exe 是否存在任何已知限制?
一般来说,应该可以在 Design Automation 服务器上运行自定义程序: 在 WorkItem 中运行其他程序
该问题可能特定于从 Revit 应用程序包 内部运行 exe(团队将对此进行调查)并在 RevitCoreConsole 完成后运行它应该没问题。
我确实检查了在
服务器上运行自定义 exe,这对我来说效果很好: 所以,我想您可以将自定义的
exe 作为 commandLine 数组中的第二项运行。这是我上面引用的博客文章中的第一个解决方案 - 类似:
"commandLine": [
"$(engine.path)\\RevitCoreConsole.exe /al \"$(appbundles[MyBundle].path)\"",
"\"$(appbundles[MyBundle].path)\\MyBundlePlugin.bundle\\Contents\\MeshOptimizer.exe\""
]