'Create a plugin that puts text in a .txt file

I am working on creating a plugin in Ruby. On this moment I am unable to insert the coordinates, that are added to a Sketchup model, in a .txt file.

This is my code:

require 'sketchup.rb'
SKETCHUP_CONSOLE.show rescue Sketchup.send_action("showRubyPanel:")
$stdout = File.new('file.txt', 'w')

module HWmakemyownplug
  def self.fileplug
    model = Sketchup.active_model 
    #Make some coordinates.
    coordinates = [[2,0,39],[0,0,1],[1,1,0]]
    #Add the points in Sketchup. This works!
    coordinates.each { |point| model.active_entities.add_cpoint(point) }
    #Puts the coordinates to the textfile 'file.txt'. This doesn't work!
    $stdout.puts(coordinates)   

  end #def self.fileplug
end #module makemyownplug

if (!file_loaded?(__FILE__))

  #Add to the SketchUp tools menu
  extensions_menu = UI.menu("Plugins")
  extensions_menu.add_item("testtesttest") { HWmakemyownplug::fileplug }
  # Let Ruby know we have loaded this file
  file_loaded(__FILE__)

end

The coordinates have to be printed when I click on menu > plugins > testtesttest.



Solution 1:[1]

You forgot to close file after $stdout.puts(coordinates)

$stdout.close

Solution 2:[2]

Here is an example code for writing data to a JSON file instead of a simple text document.

The code can run outside of SketchUp for testing in the terminal. Just make sure to follow these steps...

  1. Copy the code below and paste it on a ruby file (example: file.rb)
  2. Run the script in terminal ruby file.rb or run with SketchUp.
  3. The script will write data to JSON file and also read the content of JSON file.

The path to the JSON file is relative to the ruby file created in step one. If the script can't find the path it will create the JSON file for you.

module DeveloperName
  module PluginName
    require 'json'
    require 'fileutils'

    class Main
      def initialize
        path = File.dirname(__FILE__)
        @json = File.join(path, 'file.json')
        @content = { 'hello' => 'hello world' }.to_json
        json_create(@content)
        json_read(@json)
      end

      def json_create(content)
        File.open(@json, 'w') { |f| f.write(content) }
      end

      def json_read(json)
        if File.exist?(json)
          file = File.read(json)
          data_hash = JSON.parse(file)
          puts "Json content: #{data_hash}"
        else
          msg = 'JSON file not found'
          UI.messagebox(msg, MB_OK)
        end
      end
      # # #
    end
    DeveloperName::PluginName::Main.new
  end
end

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Eugene Stepanov
Solution 2