How can I close an opened Layout file in ruby script?

How can I close an opened Layout file in ruby script like #quit in Sketchup?
And how can I check a layout file is opened. Something like File.is_opened? filePath

Sketchup.quit does not close a model file, but the application. (Notice that it’s a singleton method . not an instance method # of a Sketchup::Model instance).

As far as I’m aware, the Ruby API does not control the LayOut GUI application, but writing/modifying LayOut documents from within SketchUp. It seems opened document references are automatically closed when they get out of scope, without explicitely needing to close the document reference. But you should explicitely save changes to the LayOut document.


I’ll second what Aerilius has said …

… as being currently true.

Also, the LayOut application has an MDI interface, which can have multiple documents open.
We can use a “hack” on Windows to close the currently open LayOut application, but not a specific document that it may have open.

LayOut_Control_from_SketchUp.rb (1.8 KB)

LayOut will prompt the user to save any modified .layout documents that might be open.

Caveat: The close would fail if the user has redefined ALT+F4 in LayOut or systemwide.
To workaround this, Windows system calls can be made via the Fiddle library. (not shown here)

(... If you'd rather not download the file, expand to see code ...)
# encoding: UTF-8
# File: LayOut_Control_from_SketchUp.rb

module SomeAuthor # <<----<<<< Replace with your unique toplevel namespace
  module LO

    require 'win32ole' unless defined?(WIN32OLE)

    extend self

    CAPTION ||= 'LayOut'

    # NOTE: Some Windows Scripting Host methods need quoted string arguments.

    PATH ||= "\"#{File.join(

    @debug = false

    # Set debug flag when testing.
    def debug( arg = true )
      @debug = arg ? true : false

    # Activate the LayOut application window, if any.
    # Returns boolean whether the window was found and activated.
    def activate
      #'WScript.Shell').AppActivate( CAPTION )
    end ###

    # Close the currently running LayOut instance.
    def close
      activated = activate()
      puts "Activate result: #{activated.inspect}" if @debug
      if activated
        UI.start_timer(1.0, false) {
          result ='WScript.Shell').SendKeys( '"%{F4}"' ) # ALT+F4
          puts "SendKeys result: #{result.inspect}" if @debug
        return true
        return false
    end ###

    # Run an instance of the LayOut application.
    # If LO is running, this is a no-op.
    def run
      # returns 0 when the WaitOnReturn arg is defaulting to false:'WScript.Shell').Run(PATH)
      nil # suppress the meaningless 0 return value
    end ###

    # Send the current model file to LayOut. The file must have been saved.
    # If not, false is returned and this is a no-op.
    def send

  end # module LO

(…scroll to see all code…)


1 Like