Наблюдатель onSaveModel в Ruby Sketchup вызывает бесконечный цикл

Я пытаюсь использовать встроенный класс ModelObserver в Sketchup, чтобы инициировать экспорт файла, когда пользователь сохраняет текущую модель. По какой-то причине мой код запускает бесконечный цикл — текст 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() 

person pbeck    schedule 27.08.2015    source источник
comment
Какая версия и платформа SketchUp? Когда я пробую ваш фрагмент, SketchUp просто падает без BugSplat или даже сообщения от системы.   -  person thomthom    schedule 27.08.2015
comment
Попробую запустить через отладчик и посмотреть что получится. Хотя не уверен, почему вы видите цикл, а я вижу сбой. Кстати, если вы не знакомы с SketchUp Ruby API и расширениями SketchUp, я бы порекомендовал вам ознакомиться с этой статьей: thomthom.net/thoughts/2012/01/   -  person thomthom    schedule 27.08.2015
comment
@thomthom Последняя версия (15.13). Спасибо, буду читать статью!   -  person pbeck    schedule 28.08.2015


Ответы (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() 
person thomthom    schedule 27.08.2015
comment
Как работают экспортеры, SketchUp сначала сохраняет временную копию модели и передает путь к этому временному файлу skp экспортеру. Вот почему onSaveModel срабатывает во время экспорта. Полученный бесконечный цикл, безусловно, будет неприятным :-) - person Bugra Barin; 28.08.2015
comment
Здорово! Спасибо. Да, я думаю, что указание в документах о том, что export запускает другое событие сохранения, было бы ценной информацией;) - person pbeck; 28.08.2015