'ruby sketchup scene serialization

I am very new on Sketchup and ruby , I have worked with java and c# but this is the first time with ruby.

Now I have one problem, I need to serialize all scene in one json (scene hierarchy, object name, object material and position this for single object) how can I do this?

I have already done this for unity3D (c#) without a problem.

I tried this:

def main   
  avr_entities = Sketchup.active_model.entities # all objects

  ambiens_dictionary = {}
  ambiens_list = []

  avr_entities.each do |root|

    if root.is_a?(Sketchup::Group) || root.is_a?(Sketchup::ComponentInstance)
      if root.name == ""
        UI.messagebox("this is a group #{root.definition.name}")

        if root.entities.count > 0
          root.entities.each do |leaf|
            if leaf.is_a?(Sketchup::Group) || leaf.is_a?(Sketchup::ComponentInstance)
              UI.messagebox("this is a leaf #{leaf.definition.name}")
            end
          end
        end

      else
        # UI.messagebox("this is a leaf #{root.name}")
      end
    end
  end
end


Solution 1:[1]

Have you tried the JSON library

require 'json'
source = { a: [ { b: "hello" }, 1, "world" ], c: 'hi' }.to_json
source.to_json # => "{\"a\":[{\"b\":\"hello\"},1,\"world\"],\"c\":\"hi\"}"

Solution 2:[2]

Used the code below to answer a question Here, but it might also work here.

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

Copy the code below and paste it on a ruby file (example: file.rb) Run the script in terminal ruby file.rb.

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
Solution 2