Google SketchUp的Ruby API有一个函数open_file
,但我找不到close_file
函数。由于我必须批处理许多文件,因此我想在继续下一个文件之前关闭每个文件,否则程序将因内存耗尽而崩溃。
以编程方式关闭 SketchUp 文件的最佳方法是什么?
我正在使用 Mac OS X 并且愿意使用 AppleScript 函数来指示窗口关闭。
编辑
我正在考虑一些迄今为止被证明没有结果的方法。
- 如本问题所述,使用 appscript Ruby gem 。这里的问题是我无法让 SketchUp 识别我安装的 gems。
同样,我正在尝试使用osascript(一个从 shell 执行 AppleScripts 的 bash 程序)来关闭窗口。也就是说,我使用以下方法之一从 SketchUp 的 Ruby 控制台窗口调用 shell:
%x[osascript -e '告诉应用程序“SketchUp”关闭窗口 1']
%x[osascript -e '告诉应用程序“SketchUp”关闭窗口 1' &]
%x[osascript -e '告诉应用程序“SketchUp”关闭每个窗口']
%x[osascript -e '告诉应用程序“SketchUp”关闭每个窗口'&]
每当我尝试第二种方法时,SketchUp 就会冻结。但是,当我 从 IRB 或直接从 SketchUp 外部的 Bash 提示符执行任何这些命令时,我会得到所需的行为:模型窗口关闭(顺便说一下,Ruby 控制台窗口保持打开状态,这很好)。
有一个主脚本,它启动一个从脚本来处理每个模型。在主设备等待期间,从设备将在 Google SketchUp 程序中运行。从站完成后,它会向主站发出信号,然后主站关闭 SketchUp 文件。为了进行这种进程间通信,我尝试使用drb。但是,当我尝试
drb
在 SketchUp 中请求时,我收到以下消息:
错误:LoadError: (eval):5:in 'require': no such file to load -- drb
编辑 2
有一个单独的进程持续运行,在收到信号时使用 AppleScript 关闭 Google Sketchup 窗口,这是很笨拙的,原因有很多。首先,必须有一个单独的进程专门用于关闭 Sketchup 窗口,这很难看。其次,与外部脚本通信的唯一有效方式是通过创建文件,这很浪费,而且磁盘访问可能会减慢速度。
然而,最严重的问题是 Sketchup 对 AppleScript 命令的响应速度很慢。我有一个在 Sketchup 中运行的计算密集型脚本,它似乎使 AppleScript 响应饿死,这意味着 osascript 在窗口关闭之前超时。当 Sketchup 中有一个对话框提示暂停执行我的计算密集型脚本时,Sketchup 才会响应 AppleScript。
编辑 3
我已经修改了我的close_file
函数,通过显示一个对话框来暂停脚本的执行。这实质上产生了当前线程并允许响应 AppleScript 命令的线程执行:
def close_file()
f = '/temp/mutex.txt' # for finer control, use different mutex for each window you want closed
File.new(f, 'w').close
result = UI.messagebox "Click OK when window has closed."
end
然后通过 AppleScript 关闭窗口的单独的 ruby 脚本还必须在对话框中单击“确定”。AppleScript 做到这一点是:
tell application "System Events"
tell process "SketchUp"
set frontmost to true
keystroke return
end tell
end tell
这种修改是一种改进。它纠正了 EDIT 2 中提到的“最严重的问题”,但其他问题仍然存在。