0

我正在开发一个使用 Ruby API 编写的 Google Sketchup 插件。在这个 API 中有一个WebDialog 类,可以使用它来呈现 HTML 并在 WebDialog 和插件代码的 Ruby 端之间移动数据。我正在使用这个类为我的插件构建一个 UI。

数据从 WebDialog 异步发送到 Ruby 端。由于文档不足,我最初并没有意识到这一点,现在我已经进入了我的插件,它开始给我带来一些问题。具体来说:当从 WebDialog 向 Ruby 端进行多次连续调用时,只执行最后一次调用。因此,我显然需要设计某种“桥梁”,以防止从 WebDialog 到 Ruby 端的调用丢失——我认为,这基本上是一个“事件循环”或“消息泵”系统。

我的问题是我不知道如何做到这一点。我希望有人可以为我提供某种资源,为这样的系统应该如何工作制定一个框架——需要什么样的检查,它们的执行顺序等等。我知道这可能是一项非常复杂的任务,但我只需要一些基本的东西:基本上,一种在我向 Ruby 发送请求时停止 Javascript 的方法,直到我得到我需要的数据才继续,并处理任何可能的潜在错误突然出现。

任何帮助将不胜感激!

4

1 回答 1

1

我在 WebDialog 类上花了很多时间。我计划写这样一个泵,但我发现我可以用更可靠的结果来做不同的事情。

(我的 WebDialog 发现: http://forums.sketchucation.com/viewtopic.php?f=180&t= 23445


替代方法

SketchUp > JavaScript

我的替代方法是我没有尝试将数据从 WebDialog 推送到 Ruby。但是因为Webdialog.execute_script是同步的,所以让 Ruby 抽出 WebDialog。

我通过查询向 WebDialog 发送命令。然后 Javascript 处理这个并将结果放入一个隐藏的 INPUT 元素中,然后我使用“WebDialog.get_element_value”来获取其内容。

所有这些我都封装到一个包装器方法中,它将处理返回值并将其转换为适当的 Ruby 对象。http://www.thomthom.net/software/sketchup/tt_lib2/doc/TT/GUI/Window.html#call_script-instance_method

大纲是:

  1. 拨打电话 ( .execute_script ) 以清除隐藏的 INPUT 元素
  2. 进行JS将处理的实际调用并将返回值放入隐藏的INPUT
  3. 使用 .get_element_value 获取隐藏的 INPUT 值

这一切都是同步的。


Javascript泵

Javascript > SketchUp

如果您真的需要从 JS 中提取信息,那么我认为您需要执行以下操作:

  • JS:将消息推送到消息队列中
  • JS:给SU发消息说有消息
  • SU:当回调通知有新消息时,向 JS 查询下一条消息并继续,直到没有更多消息为止。这应该可以工作,因为它与前面描述的方法相似。

这个概念是存储您的消息,然后将控制权交给 SketchUp 端,后者可以同步泵送它。

(未经检验的理论。)

于 2011-08-25T12:44:53.663 回答