Ruby到Google SketchUp有一个函数,open_file,但是我找不到close_file函数。由于我必须对许多文件进行批处理,所以我希望在进入下一个文件之前关闭每个文件,否则程序将因内存耗尽而崩溃。
以编程方式关闭SketchUp文件的最佳方法是什么?
我正在使用Mac,并且愿意使用AppleScript函数来发出关闭窗口的信号。
编辑
我正在考虑一些迄今已证明徒劳无益的办法。
drb中要求SketchUp时,我会得到以下消息:错误: LoadError:(eval):5:in‘需要量’:没有这样的文件来加载-- drb
编辑2
有一个单独的进程连续运行,关闭Google窗口,在发出信号时使用AppleScript是笨拙的,原因有很多。首先,必须有一个单独的进程来关闭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关闭窗口的独立红宝石脚本还必须在对话框中单击"OK“。要做到这一点的AppleScript是:
tell application "System Events"
tell process "SketchUp"
set frontmost to true
keystroke return
end tell
end tell这项修改是一项改进。它纠正了编辑2中提到的“最严重的问题”,但其他问题仍然存在。
发布于 2011-02-14 08:08:31
一种解决方案是连续运行一个单独的进程,在发出信号时使用AppleScript关闭Google窗口。这里描述的方法使用文件进行进程间通信(drb似乎不起作用)。
首先,您必须确保Sketchup 支持AppleScripting。为此,在命令提示符下执行以下命令(适当地替换不同的Sketchup版本,等等):
$ defaults write /Applications/Google\ SketchUp\ 8/SketchUp.app/Contents/Info NSAppleScriptEnabled -bool YES现在,创建一个单独的文件来关闭Sketchup窗口。这是我的closer.rb文件:
#!/usr/bin/ruby
## closer.rb ##
def wait(f)
while !File::exists?(f)
end
File.delete(f)
end
def signal(f)
File.new(f, 'w').close
end
while true
wait('~/temp/mutex.txt')
msg = %x[osascript -e 'tell application "SketchUp" to close every window']
signal('~/temp/conf.txt')
end从shell运行此脚本。它一直等到文件~/temp/mutex.txt被创建。创建该文件后,它运行osascript (本质上是AppleScript)关闭Sketchup中的所有窗口,然后通过创建~/temp/conf.txt文件发出关闭窗口的信号。
下面是客户端代码(可以放在您的Sketchup插件中),它指示了更接近的脚本:
def wait(f)
while !File::exists?(f)
end
File.delete(f)
end
def signal(f)
File.new(f, 'w').close
end
def close_file
signal('~/temp/mutex.txt')
wait('~/temp/conf.txt')
endclose_file向更接近的脚本发送信号,然后等待确认文件已关闭,然后返回。现在您可以在Sketchup中关闭文件。
发布于 2011-08-20 23:02:57
使用外部AppleScript强制SketchUp做某事有一个重要的限制。当菜单脚本运行时,SketchUp将不接受任何用户输入。
我发现这是为了建立一个自动呈现解决方案。我添加了一个菜单项,它打开一个WebDialog来获取从服务器下载的模型列表。然后逐步遍历列表,并使用cURL下载每个模型。下载之后,它加载模型,呈现出来,再次使用cURL上传图像,然后转到下一个模型。
我想要的是在每个模型呈现后激活AppleScript (使用上面所示的“互斥”文件解决方案),并让它关闭模型窗口。不幸的是,由于菜单脚本仍在运行,SketchUp将不会响应AppleScript告诉它做的任何事情。只有在处理完所有模型并退出菜单脚本之后,AppleScript才能最终运行。
如果所有对AppleScript的调用都排队,那么情况就不会那么糟糕了,但事实并非如此。似乎只有最后两个调用才会得到遵守(这个数字可能只是一个意外,取决于我对AppleScript的调用相对于菜单脚本完成时的时间)。
由于这个限制,我无法在菜单Ruby代码中使用mutex wait()函数。由于AppleScript无法执行,所以它从未创建过它的“I‘Since”互斥文件,因此Ruby ()函数从未得到它可以继续的信号。结果是AppleScript和SketchUp之间出现了死锁,这样SketchUp就会结冰(实际上,它只是被困在了wait()函数的一个非常紧的循环中)。
因此,在处理此问题时,请将AppleScript视为您可以在所有处理完成后调用的清理工具。
发布于 2011-02-21 01:44:48
使用applescript和/或Automator可以使用SketchUp做很多事情。
tell application "SketchUp"
activate
tell application "System Events"
delay 1.0 --close window, adjust delay to suit
--key code 13 using command down -- Press ⌘W or you can use
keystroke "w" using command down
end tell终结者
我有一些状态栏项目打开新,粘贴到控制台,关闭,杀苏等。
它们是触发SU快捷键的微小文件,可以从“Ruby控制台”或作为插件的一部分在外部使用。
我不知道你想要实现什么样的“批处理转换”,但是今天我用Automator将我的大部分旧的v5、V6、v7文件转换成v8 .它们中的100种,而且您可能知道,打开时会收到“警告”警告,即保存会将文件转换为最新版本(这正是我想要的)。
通过编程点击这个"OK“是很棘手的。
Automator本身是非常有限的,但是您可以在工作流中添加一个applescript,我发现如果您使用它的“记录函数”来演示您需要做的事情。
然后,您可以将代码复制/粘贴到“脚本编辑器”中,去掉“dowithTimeout”位,将其复制回工作流中,延迟任何一方,并让其运行。
我不得不玩拖延,以适应一些较大的文件,但取得了>95%的成功。成功能够选择所有,右键单击,创建图标和预览。
不幸的是,我随后对工作流进行了绑定,但如果您想要查看,可以重新创建它。
https://stackoverflow.com/questions/4982281
复制相似问题