首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谷歌SketchUp关闭文件

谷歌SketchUp关闭文件
EN

Stack Overflow用户
提问于 2011-02-13 03:36:14
回答 5查看 2.5K关注 0票数 1

Ruby到Google SketchUp有一个函数,open_file,但是我找不到close_file函数。由于我必须对许多文件进行批处理,所以我希望在进入下一个文件之前关闭每个文件,否则程序将因内存耗尽而崩溃。

以编程方式关闭SketchUp文件的最佳方法是什么?

我正在使用Mac,并且愿意使用AppleScript函数来发出关闭窗口的信号。

编辑

我正在考虑一些迄今已证明徒劳无益的办法。

  1. 使用appscript Ruby,如这个问题中所述。这里的问题是我无法让SketchUp识别我已安装的宝石
  2. 类似地,我试图使用文字记录 (一个从shell执行AppleScripts的bash程序)关闭窗口。也就是说,我使用以下之一从SketchUp的Ruby控制台窗口调用shell: %xosascript -e‘告诉应用程序"SketchUp“关闭窗口1’ %xosascript -e‘告诉应用程序"SketchUp“关闭窗口1’& %xosascript -e‘告诉应用程序“SketchUp关闭每个窗口’ %xosascript -e‘告诉应用程序"SketchUp“关闭每个窗口’& 每当我尝试第二种方法时,SketchUp就会冻结。但是,当我从IRB或直接从SketchUp之外的Bash提示符执行这些命令时,我得到了所需的行为:模型窗口关闭(顺便说一句,Ruby窗口保持打开状态,这很好)。
  3. 有一个主脚本来启动一个从脚本来处理每个模型。当主程序等待时,从程序将在Google SketchUp程序中运行。当从服务器完成时,它向主程序发出信号,然后主服务器关闭SketchUp文件。为了进行进程间通信,我尝试使用drb。但是,当我试图在drb中要求SketchUp时,我会得到以下消息:

错误: LoadError:(eval):5:in‘需要量’:没有这样的文件来加载-- drb

编辑2

有一个单独的进程连续运行,关闭Google窗口,在发出信号时使用AppleScript是笨拙的,原因有很多。首先,必须有一个单独的进程来关闭Sketchup窗口,这是很难看的。其次,与外部脚本通信的唯一有效方法是创建文件,这是浪费的,磁盘访问可能会减慢速度。

然而,最严重的问题是Sketchup对AppleScript命令的响应速度缓慢。我在Sketchup中运行了一个计算量很大的脚本,它似乎饥饿了AppleScript响应,这意味着osascript在窗口关闭之前超时。Sketchup只有在Sketchup中有一个对话框提示暂停执行我的计算密集型脚本时才会响应AppleScript。

编辑3

我修改了我的close_file函数,通过显示一个对话框来暂停脚本的执行。这实际上产生了当前线程,并允许响应AppleScript命令的线程执行:

代码语言:javascript
复制
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是:

代码语言:javascript
复制
tell application "System Events"
    tell process "SketchUp"
        set frontmost to true
        keystroke return
    end tell
end tell

这项修改是一项改进。它纠正了编辑2中提到的“最严重的问题”,但其他问题仍然存在。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-14 08:08:31

一种解决方案是连续运行一个单独的进程,在发出信号时使用AppleScript关闭Google窗口。这里描述的方法使用文件进行进程间通信(drb似乎不起作用)。

首先,您必须确保Sketchup 支持AppleScripting。为此,在命令提示符下执行以下命令(适当地替换不同的Sketchup版本,等等):

代码语言:javascript
复制
$ defaults write /Applications/Google\ SketchUp\ 8/SketchUp.app/Contents/Info NSAppleScriptEnabled -bool YES

现在,创建一个单独的文件来关闭Sketchup窗口。这是我的closer.rb文件:

代码语言:javascript
复制
#!/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插件中),它指示了更接近的脚本:

代码语言:javascript
复制
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')
end

close_file向更接近的脚本发送信号,然后等待确认文件已关闭,然后返回。现在您可以在Sketchup中关闭文件。

票数 0
EN

Stack Overflow用户

发布于 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视为您可以在所有处理完成后调用的清理工具。

票数 2
EN

Stack Overflow用户

发布于 2011-02-21 01:44:48

使用applescript和/或Automator可以使用SketchUp做很多事情。

代码语言:javascript
复制
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%的成功。成功能够选择所有,右键单击,创建图标和预览。

不幸的是,我随后对工作流进行了绑定,但如果您想要查看,可以重新创建它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4982281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档