Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Ruby module to easily generate openscad scripts
Ruby
Branch: master

updated for latest version

latest commit 16d852cfb4
Curtis Bissonnette authored

README.md

RubyScad

Ruby module to easily generate openscad scripts

General Usage

Requirements: Ruby 1.9.3 Installation: gem install rubyscad

RubyScad is a ruby mixin module which provides functions which allow easy output of openscad scripts . To use simply "include" or "extend" the module into any class or module:

require "rubyscad"

module Test

  extend RubyScad

  def self.cone(base=5, height=10)

    cylinder(r1: base, r2: 0, h:height)

  end

  cone(2, 4)
end

from command line:

print to standard output: ruby test.rb

generate file: ruby test.rb "test.scad"


require "rubyscad"

class Test2

  include RubyScad

  def initialize(args={})
    @radius = args.fetch(:radius, 3)
  end

  def render()
    sphere(r:@radius)
  end
end

Test2.new.render

print to standard output: ruby test2.rb

generate file: ruby test2.rb "test2.scad"

General Considerations

  • All arguments are passed as named hash values matching the openscad spec, exceptions are for functions fa, fs, fn, echo, include, and use (see below).
    openscad: cube(6)
    rubyscad: cube(size: 6)
  • Any hash values may be passed to functions (with the exception of the ones noted above) but openscad may or may not use these values
    cube(openscadwontusethis: 5) will produce cube(openscadwontusethis = 5); nothing bad will happen here, the value will just have no effect
  • $fn, $fs, $fa variables are passed without the '$'
    openscad: sphere(4, $fn=12)
    rubyscad: sphere(r: 4, fn: 12)
  • Ruby's math functions use radians, openscad uses degrees, for ease I've added a 'radians' function to the numeric class so the following is possible:
    openscad: sin(15)
    rubyscad: Math.sin(15.radians)
  • All functions which take code blocks (union, difference, intersection, ...) can use the form "function() { code }" or "function()" with the following result:
    the code:

      translate(x: 5)
      cube(size: 7)
    

    would produce:

      translate([5,0,0])
      cube(size = 7);
    

    the code:

      translate(x: 5) {
        cube(size: 7)
      }
    

    would produce:

      translate([5,0,0]) {
        cube(size = 7);
      }
    

Openscad Functions:

openscad: $fa = 0.2;
rubyscad: fa 0.2


openscad: $fs = 2;
rubyscad: fs 2


openscad: $fn = 5;
rubyscad: fn 5


openscad: include <file.scad>
rubyscad: include_scad "file.scad"


openscad: use <file.scad>
rubyscad: use "file.scad"


openscad: echo(1,2,3);
rubyscad: echo 1, 2, 3


openscad: %
rubyscad: background


openscad: #
rubyscad: debug


openscad: !
rubyscad: root


openscad: *
rubyscad: disable


openscad: projection([args]) [{ code }]
rubyscad: projection([args]) [{ code }]


openscad: linear_extrude([args]) [{ code }]
rubyscad: linear_extrude([args]) [{ code }]


openscad: rotate_extrude([args]) [{ code }]
rubyscad: rotate_extrude([args]) [{ code }]


openscad: import([args])
rubyscad: import([args])


openscad: difference() { code }
rubyscad: difference() { code }


openscad: union() { code }
rubyscad: union() { code }


openscad: intersection() { code }
rubyscad: intersection() { code }


openscad: render([args]) [{ code }]
rubyscad: render([args]) [{ code }]


openscad: minkowski() { code }
rubyscad: minkowski() { code }


openscad: hull() { code }
rubyscad: hull() { code }


openscad: cube([args])
rubyscad: cube([args])


openscad: sphere([args])
rubyscad: sphere([args])

  • In addition to the normal arguments d: can also be provided instead of r: to specify the diameter instead of the radius

openscad: polyhedron([args])
rubyscad: polyhedron([args])


openscad: square([args])
rubyscad: square([args])


openscad: circle([args])
rubyscad: circle([args])

  • In addition to the normal arguments d: can also be provided instead of r: to specify the diameter instead of the radius

openscad: polygon([args])
rubyscad: polygon([args])


openscad: surface([args])
rubyscad: surface([args])


openscad: cylinder([args])
rubyscad: cylinder([args])


openscad: rotate([args]) [{ code }]
rubyscad: rotate([args]) [{ code }]

  • In addition to specifying a: as a vector x:, y:, and z: can be used instead

openscad: translate([args]) [{ code }]
rubyscad: translate([args]) [{ code }]

  • In addition to specifying v: as a vector x:, y:, and z: can be used instead

openscad: scale([args]) [{ code }]
rubyscad: scale([args]) [{ code }]

  • In addition to specifying v: as a vector x:, y:, and z: can be used instead

openscad: mirror([args]) [{ code }]
rubyscad: mirror([args]) [{ code }]

  • In addition to specifying v: as a vector x:, y:, and z: can be used instead

openscad: multmatrix([args]) [{ code }]
rubyscad: multmatrix([args]) [{ code }]


openscad: color([args]) [{ code }]
rubyscad: color([args]) [{ code }]

  • Instead of color: being defined, r:, g:, b:, and a: can be provided

RubyScad Functions:

format_command(cmd_str, args={}, &block)

  • an easy way to implement new openscad commands.
  • cmd_str should be in the form "func_name(%<args>);"
  • all arguments passed from "args" will be inserted into the string modifier
  • if a block is passed it will output between { }

new_line

  • outputs a new line

start_block

  • outputs a '{' at the correct tab level

end_block

  • outputs a '}' at the correct tab level

end_all_blocks

  • outputs a '}' for every open block

format_output

  • outputs a string at the correct tab level
Something went wrong with that request. Please try again.