【问题标题】:onSaveModel observer in Ruby Sketchup causes infinite loopRuby Sketchup 中的 onSaveModel 观察者导致无限循环
【发布时间】:2020-08-13 04:57:13
【问题描述】:

我正在尝试使用 Sketchup 中的内置 ModelObserver 类在用户保存当前模型时触发文件导出。出于某种原因,我的代码触发了无限循环 - 文本“onSaveModel”只输出一次,但 exportModel() 陷入了循环。

我的 Ruby 技能很低,但我也时常听说 SketchUp Ruby API 很糟糕。有人见过这个问题吗?

代码:

def protohypeEntry
    Sketchup.active_model.add_observer(ProtohypeModelObserver.new)
end

class ProtohypeModelObserver < Sketchup::ModelObserver
    def onSaveModel(model)
        puts "onSaveModel" + model.to_s
        exportModel()
    end
end

def exportModel()
    puts "exportModel()"
    model = Sketchup.active_model

    options_hash = { :triangulated_faces   => true,
     :doublesided_faces    => true,
     :edges                => false,
     :author_attribution   => true,
     :texture_maps         => true,
     :selectionset_only    => false,
     :preserve_instancing  => true }

     status = model.export 'C:\Users\Pelle\Test\test.dae', options_hash

 end

 protohypeEntry() 

【问题讨论】:

  • 什么 SketchUp 版本和平台?当我尝试您的 sn-p SketchUp 时,它会在没有 BugSplat 甚至系统消息的情况下崩溃。
  • 我会尝试通过调试器运行它,看看会发生什么。虽然不知道为什么你看到一个循环,我看到一个崩溃。 :s 顺便说一句,如果您是 SketchUp Ruby API 和 SketchUp 扩展的新手,我建议您看看这篇文章:thomthom.net/thoughts/2012/01/…
  • @thomthom 最新版本 (15.13)。谢谢,我会看文章的!

标签: ruby sketchup


【解决方案1】:

导出也会触发onSaveModel(API 文档对此并不清楚,我会在内部添加一个问题),因此您在观察者事件中的导出将触发无限循环。

设置一个内部标志来指示脚本的状态,并在导出过程中提前中断。

module Example

  def self.protohypeEntry
    Sketchup.active_model.add_observer(ProtohypeModelObserver.new)
  end

  class ProtohypeModelObserver < Sketchup::ModelObserver
    def onSaveModel(model)
      puts "onSaveModel" + model.to_s
      Example.exportModel()
    end
  end

  def self.exportModel()
    return if @exporting

    puts "exportModel()"
    model = Sketchup.active_model

    options_hash = { :triangulated_faces   => true,
      :doublesided_faces    => true,
      :edges                => false,
      :author_attribution   => true,
      :texture_maps         => true,
      :selectionset_only    => false,
      :preserve_instancing  => true
    }

    @exporting = true
    status = model.export 'C:/test.dae', options_hash
  ensure
    # Just in case model.export should raise an exception we guarranty the flag
    # is reset.
    @exporting = false
  end

end

Example.protohypeEntry() 

【讨论】:

  • 导出器的工作方式,SketchUp 将首先保存模型的临时副本并将该临时 skp 文件路径传递给导出器。这就是在导出期间触发 onSaveModel 的原因。由此产生的无限循环肯定会很讨厌:-)
  • 太棒了!谢谢。是的,我认为文档中关于export 触发另一个保存事件的指示将是有价值的信息;)
猜你喜欢
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多