solidruby 0.1.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +2 -2
- data/CHANGELOG +34 -0
- data/bin/solidruby +4 -1
- data/examples/openscad_examples/old/example015.rb +2 -2
- data/lib/solidruby/csg_modelling/difference.rb +18 -1
- data/lib/solidruby/csg_modelling/union.rb +4 -1
- data/lib/solidruby/csg_modifiers/linear_extrude.rb +0 -1
- data/lib/solidruby/helpers/chamfer.rb +2 -1
- data/lib/solidruby/helpers/position.rb +7 -7
- data/lib/solidruby/parameters.rb +151 -0
- data/lib/solidruby/primitives/cube.rb +17 -7
- data/lib/solidruby/primitives/import.rb +0 -1
- data/lib/solidruby/project_cli.rb +41 -0
- data/lib/solidruby/solidruby.rb +30 -34
- data/lib/solidruby/solidruby_object.rb +9 -7
- data/lib/solidruby/transformations/mirror.rb +20 -0
- data/lib/solidruby/transformations/translate.rb +2 -1
- data/lib/solidruby/version.rb +1 -1
- data/lib/solidruby.rb +4 -0
- data/lib/templates/assembly.tt +0 -2
- data/lib/templates/main.tt +7 -2
- data/lib/templates/parameters.yml.tt +12 -0
- data/lib/templates/printed.tt +7 -2
- data/solidruby.gemspec +8 -5
- metadata +49 -18
- data/examples/stack.rb +0 -21
- data/lib/templates/params.tt +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 447c22356e767538c6f5675460e384da8f26ed5ef04bfa9c47fb027b2c4329ca
|
4
|
+
data.tar.gz: 3124dd54f87aa0429cdb45adf3711e3fb373fb8353dbc1ec65a4bead106d1658
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5361412322c6467d6853272821172f0fe086478fcff1915cab138e5c5b686a79116e707f49d1271148efec721cca60ae98e78c6d0c1d2fa3d7886356145a774
|
7
|
+
data.tar.gz: 944473d508301019782431f45cbac0cfea4382b7cf85102f2169b69f96ab73aa5137a03fdc7e18d9a29a2253844de21983bd432865b5216b50c4783e7225c243
|
data/.travis.yml
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
language: ruby
|
2
|
-
|
3
|
-
|
2
|
+
before_install:
|
3
|
+
- gem install bundler
|
data/CHANGELOG
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Changelog
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
|
+
|
7
|
+
## [0.3.0] - 2022-10-01
|
8
|
+
|
9
|
+
### Added
|
10
|
+
- Cube now accepts `center: [:x, :y, :z]` arguments
|
11
|
+
- Add `.mirror(:x, :y, :z)` method
|
12
|
+
|
13
|
+
### Changed
|
14
|
+
|
15
|
+
- `SolidRubyObject#translate` now combines consecutive translations
|
16
|
+
- Chamfers and Fillets can now be chained e.g. `cube.fillet(...).fillet(...)`
|
17
|
+
|
18
|
+
### Removed
|
19
|
+
- Remove deprecated `stack` method
|
20
|
+
|
21
|
+
## [0.2.0] - 2020-06-12
|
22
|
+
### Added
|
23
|
+
- New way of handling parameters via `params` singleton + `parameters.yml` file
|
24
|
+
- New `ProjectCli` class to allow overriding parameters from command line
|
25
|
+
- Ruby exceptions are now output in OpenSCAD view
|
26
|
+
|
27
|
+
### Changed
|
28
|
+
|
29
|
+
- Minimum Ruby version bumped to 3.0
|
30
|
+
- Runtime dependency of `wijet-thor` replaced with `thor`
|
31
|
+
- Upgrade to bundler v2
|
32
|
+
|
33
|
+
### Fixed
|
34
|
+
- Fix Import and LinearExtrude incorrectly accepting scale arguments
|
data/bin/solidruby
CHANGED
@@ -51,7 +51,10 @@ class SolidRubyCli < Thor
|
|
51
51
|
template('guardfile.tt', "#{name}/Guardfile")
|
52
52
|
template('gitignore.tt', "#{name}/.gitignore")
|
53
53
|
template('assembly.tt', "#{name}/lib/assemblies/#{name}_assembly.rb")
|
54
|
-
template('
|
54
|
+
template('parameters.yml.tt', "#{name}/parameters.yml")
|
55
|
+
|
56
|
+
puts "SolidRuby project created."
|
57
|
+
puts "Try running `solidruby g printed <partname>` to generate a new part"
|
55
58
|
end
|
56
59
|
|
57
60
|
desc 'g COMMANDS', 'generator module'
|
@@ -15,7 +15,7 @@ def shape
|
|
15
15
|
circle(r: 5)
|
16
16
|
.scale(x: 0.7, y: 1.3)
|
17
17
|
.rotate(z: -45) &
|
18
|
-
import(f: 'example009.dxf', l: 'body', co: 6
|
18
|
+
import(f: 'example009.dxf', l: 'body', co: 6)
|
19
19
|
end
|
20
20
|
|
21
21
|
shape.save('example015.scad')
|
@@ -37,7 +37,7 @@ shape.save('example015.scad')
|
|
37
37
|
# rotate(-45) scale([ 0.7, 1.3 ]) circle(5);
|
38
38
|
# }
|
39
39
|
#
|
40
|
-
# import(file = "example009.dxf", layer = "body", convexity = 6
|
40
|
+
# import(file = "example009.dxf", layer = "body", convexity = 6);
|
41
41
|
# }
|
42
42
|
#
|
43
43
|
# echo(version=version());
|
@@ -15,6 +15,23 @@
|
|
15
15
|
#
|
16
16
|
module SolidRuby::CSGModelling
|
17
17
|
class Difference < CSGModelling
|
18
|
+
def fillet(args)
|
19
|
+
if @children.first.respond_to? :fillet
|
20
|
+
@children << @children.first.fillet(args.merge(exclude_self: true))
|
21
|
+
self
|
22
|
+
else
|
23
|
+
Helpers::fillet(args)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def chamfer(args)
|
28
|
+
if @children.first.respond_to? :chamfer
|
29
|
+
@children << @children.first.chamfer(args.merge(exclude_self: true))
|
30
|
+
self
|
31
|
+
else
|
32
|
+
Helpers::chamfer(args)
|
33
|
+
end
|
34
|
+
end
|
18
35
|
end
|
19
36
|
|
20
37
|
def -(args)
|
@@ -22,7 +39,7 @@ module SolidRuby::CSGModelling
|
|
22
39
|
if args.is_a? Array
|
23
40
|
r = self
|
24
41
|
args.each do |a|
|
25
|
-
r =
|
42
|
+
r = optimize_difference(r, a)
|
26
43
|
end
|
27
44
|
r
|
28
45
|
else
|
@@ -19,10 +19,11 @@ module SolidRuby::CSGModelling
|
|
19
19
|
|
20
20
|
def +(args)
|
21
21
|
return args if nil?
|
22
|
+
|
22
23
|
if args.is_a? Array
|
23
24
|
r = self
|
24
25
|
args.each do |a|
|
25
|
-
r =
|
26
|
+
r = optimize_union(r, a)
|
26
27
|
end
|
27
28
|
r
|
28
29
|
else
|
@@ -34,6 +35,8 @@ module SolidRuby::CSGModelling
|
|
34
35
|
if top.is_a?(Union) && (!child.is_a? Union) && top.transformations.empty?
|
35
36
|
top.children << child
|
36
37
|
top
|
38
|
+
elsif top.is_a?(Union) && child.is_a?(Union) && child.transformations.empty?
|
39
|
+
top += child.children
|
37
40
|
else
|
38
41
|
Union.new(top, child)
|
39
42
|
end
|
@@ -19,8 +19,9 @@ module SolidRuby::Helpers
|
|
19
19
|
def chamfer(args={})
|
20
20
|
height = args[:height] || args[:h] || 0
|
21
21
|
length = args[:length] || args[:l] || 0
|
22
|
+
angle = args[:angle] || args[:a] || 45
|
22
23
|
|
23
|
-
t = triangle(a: height, alpha: 90,
|
24
|
+
t = triangle(a: height, alpha: 90, gamma: angle)
|
24
25
|
|
25
26
|
return t.linear_extrude(height: length)
|
26
27
|
end
|
@@ -83,7 +83,7 @@ module SolidRuby::Helpers
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def translations_for_edge(args={})
|
86
|
-
|
86
|
+
clearance = args[:clearance] || 0.01
|
87
87
|
trans = []
|
88
88
|
args[:faces].each do |face, edges|
|
89
89
|
edges.each do |edge|
|
@@ -94,7 +94,7 @@ module SolidRuby::Helpers
|
|
94
94
|
res[:x_trans] = 0
|
95
95
|
res[:y_trans] = 0
|
96
96
|
res[:length] = args[:z]
|
97
|
-
res[:z_trans] = -res[:length]/2.0 - (
|
97
|
+
res[:z_trans] = -res[:length]/2.0 - (clearance*2)
|
98
98
|
|
99
99
|
#position on edge
|
100
100
|
if Helpers::is_horizontal?(face, edge)
|
@@ -104,7 +104,7 @@ module SolidRuby::Helpers
|
|
104
104
|
|
105
105
|
if is_x_dir?(face, edge)
|
106
106
|
res[:length] = args[:x]
|
107
|
-
res[:x_trans] = -res[:length] / 2.0 - (
|
107
|
+
res[:x_trans] = -res[:length] / 2.0 - (clearance*2)
|
108
108
|
elsif is_y_dir?(face, edge)
|
109
109
|
res[:length] = args[:y]
|
110
110
|
res[:y_trans] = res[:length] / 2.0
|
@@ -148,10 +148,10 @@ module SolidRuby::Helpers
|
|
148
148
|
|
149
149
|
point = args[:onto].get_point_on(face: face, edge: edge)
|
150
150
|
|
151
|
-
if
|
152
|
-
point[:x] = point[:x] > 0 ? point[:x] +
|
153
|
-
point[:y] = point[:y] > 0 ? point[:y] +
|
154
|
-
point[:z] = point[:z] > 0 ? point[:z] +
|
151
|
+
if clearance > 0
|
152
|
+
point[:x] = point[:x] > 0 ? point[:x] + clearance : point[:x] - clearance
|
153
|
+
point[:y] = point[:y] > 0 ? point[:y] + clearance : point[:y] - clearance
|
154
|
+
point[:z] = point[:z] > 0 ? point[:z] + clearance : point[:z] - clearance
|
155
155
|
end
|
156
156
|
|
157
157
|
res[:x_trans] += point[:x]
|
@@ -0,0 +1,151 @@
|
|
1
|
+
# This file is part of SolidRuby.
|
2
|
+
#
|
3
|
+
# SolidRuby is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# SolidRuby is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with SolidRuby. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
require 'yaml'
|
16
|
+
|
17
|
+
module SolidRuby::Parameters
|
18
|
+
class Parameters
|
19
|
+
class << self
|
20
|
+
@@verbose = true
|
21
|
+
|
22
|
+
def yml_path
|
23
|
+
@@yml_path
|
24
|
+
end
|
25
|
+
|
26
|
+
def yml_path=(path)
|
27
|
+
if File.directory?(path)
|
28
|
+
path = File.join(path, "parameters.yml")
|
29
|
+
end
|
30
|
+
|
31
|
+
@@yml_path = path
|
32
|
+
# force reloading yml
|
33
|
+
clear_params
|
34
|
+
end
|
35
|
+
|
36
|
+
def variant
|
37
|
+
@@variant
|
38
|
+
end
|
39
|
+
|
40
|
+
def variant=(name)
|
41
|
+
@@variant = name.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
def verbose=(val)
|
45
|
+
@@verbose = !!val
|
46
|
+
end
|
47
|
+
|
48
|
+
def load_yml
|
49
|
+
@@yml_path ||= "parameters.yml"
|
50
|
+
|
51
|
+
if File.file?(@@yml_path)
|
52
|
+
YAML.load_file(@@yml_path, aliases: true)
|
53
|
+
else
|
54
|
+
raise "Could not read paramters yml file at #{@@yml_path}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_overrides(values={})
|
59
|
+
@@overrides ||= {}
|
60
|
+
@@overrides.merge!(values)
|
61
|
+
clear_params
|
62
|
+
end
|
63
|
+
|
64
|
+
def clear_overrides
|
65
|
+
@@overrides = {}
|
66
|
+
clear_params
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def method_missing(method, *args)
|
71
|
+
name = method.to_s
|
72
|
+
raise "UnknownParameter #{method}" unless name.end_with?("=")
|
73
|
+
|
74
|
+
name = name.chomp("=").to_sym
|
75
|
+
|
76
|
+
if @@values.keys.include?(name) && @@values[name] != args.first
|
77
|
+
raise "ConflictingParameter #{method}"
|
78
|
+
elsif @@values.keys.include?(name)
|
79
|
+
warn "Duplicate definition of #{name} = #{args} @ #{caller[0]}"
|
80
|
+
else
|
81
|
+
warn "Adding parameter #{name} = #{args}, it is recommended you place this in a parameters.yml file"
|
82
|
+
end
|
83
|
+
|
84
|
+
return if singleton_class.method_defined?(name)
|
85
|
+
|
86
|
+
add_parameter(name, args.first)
|
87
|
+
end
|
88
|
+
|
89
|
+
def to_s
|
90
|
+
"#{super} #{@@variant} #{@@values}"
|
91
|
+
end
|
92
|
+
alias inspect to_s
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def initialize
|
97
|
+
load_yml_settings
|
98
|
+
end
|
99
|
+
|
100
|
+
def add_parameter(name, value)
|
101
|
+
name = name.to_sym
|
102
|
+
@@values[name] = value
|
103
|
+
|
104
|
+
return if singleton_class.method_defined?(name)
|
105
|
+
|
106
|
+
begin
|
107
|
+
# Try to eval first, if we can't then just use the raw value
|
108
|
+
eval(@@values[name].to_s)
|
109
|
+
define_singleton_method(name) { eval(@@values[name].to_s) }
|
110
|
+
rescue
|
111
|
+
define_singleton_method(name) { @@values[name] }
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def load_yml_settings
|
116
|
+
@@values = {}
|
117
|
+
@@variant ||= "default"
|
118
|
+
@@overrides ||= {}
|
119
|
+
|
120
|
+
yml = self.class.load_yml
|
121
|
+
# load all namespaced values first
|
122
|
+
yml.each do |variant, parameters|
|
123
|
+
parameters.each do |k, v|
|
124
|
+
add_parameter("#{variant}__#{k}", v)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
yml_values = yml[@@variant]
|
129
|
+
|
130
|
+
raise "Missing '#{@@variant}' entry in parameters yml" if yml_values.nil?
|
131
|
+
|
132
|
+
yml_values.merge(@@overrides).each do |k, v|
|
133
|
+
add_parameter(k, v)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def warn(str)
|
138
|
+
puts str if @@verbose
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def params
|
143
|
+
@@params ||= Parameters.new
|
144
|
+
end
|
145
|
+
|
146
|
+
private
|
147
|
+
|
148
|
+
def clear_params
|
149
|
+
@@params = nil
|
150
|
+
end
|
151
|
+
end
|
@@ -30,12 +30,22 @@ module SolidRuby::Primitives
|
|
30
30
|
z ||= y# = x if y.nil? && z.nil?
|
31
31
|
args = { x: x, y: y, z: z }
|
32
32
|
end
|
33
|
-
@centered = args.delete(:center) || args.delete(:c)
|
34
|
-
|
35
33
|
@x = args[:x]
|
36
34
|
@y = args[:y] || @x
|
37
35
|
@z = args[:z] || @y
|
36
|
+
|
37
|
+
centered = args.delete(:center) || args.delete(:c)
|
38
38
|
super(args)
|
39
|
+
|
40
|
+
if centered == true || centered == [:x, :y, :z]
|
41
|
+
@centered = true
|
42
|
+
else
|
43
|
+
@centered = false
|
44
|
+
centered = [centered].flatten
|
45
|
+
center_x if centered.include?(:x)
|
46
|
+
center_y if centered.include?(:y)
|
47
|
+
center_z if centered.include?(:z)
|
48
|
+
end
|
39
49
|
end
|
40
50
|
|
41
51
|
def center_xy
|
@@ -71,9 +81,9 @@ module SolidRuby::Primitives
|
|
71
81
|
faces = normalise_edges(args)
|
72
82
|
height = args[:h] || args[:height]
|
73
83
|
trans = translations_for_edge(onto: self, faces: faces, x: @x, y: @y, z: @z)
|
74
|
-
res = self
|
84
|
+
res = args[:exclude_self] ? nil : self
|
75
85
|
trans.each do |t|
|
76
|
-
res -= Helpers::chamfer(l: t[:length] + 0.02, h: height)
|
86
|
+
res -= Helpers::chamfer(l: t[:length] + 0.02, h: height, a: args[:a] || args[:angle])
|
77
87
|
.rotate(z: (t[:z_rot] - 180))
|
78
88
|
.rotate(x: t[:x_rot], y: t[:y_rot])
|
79
89
|
.translate(x: t[:x_trans], y: t[:y_trans], z: t[:z_trans])
|
@@ -93,9 +103,9 @@ module SolidRuby::Primitives
|
|
93
103
|
|
94
104
|
def fillet(args = {})
|
95
105
|
faces = normalise_edges(args)
|
96
|
-
radius = args[:r] || args[:
|
97
|
-
trans = translations_for_edge(onto: self, faces: faces, x: @x, y: @y, z: @z,
|
98
|
-
res = self
|
106
|
+
radius = args[:r] || args[:radius]
|
107
|
+
trans = translations_for_edge(onto: self, faces: faces, x: @x, y: @y, z: @z, clearance: 0)
|
108
|
+
res = args[:exclude_self] ? nil : self
|
99
109
|
trans.each do |t|
|
100
110
|
res -= Helpers::fillet(h: t[:length], r: radius)
|
101
111
|
.rotate(z: t[:z_rot])
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
class SolidRuby::ProjectCli < Thor
|
4
|
+
|
5
|
+
def method_missing(method, *args, &block)
|
6
|
+
# Split args that look like options (i.e start with - or --) into a separate array
|
7
|
+
_, opts = Thor::Options.split(args)
|
8
|
+
# add all parameter options
|
9
|
+
yml = SolidRuby::Parameters::Parameters.load_yml
|
10
|
+
yml_options = { "--variant" => Thor::Option.new("--variant") }
|
11
|
+
yml.each do |_, params|
|
12
|
+
params.each do |name, _|
|
13
|
+
yml_options["--#{name.gsub('_', '-')}"] = Thor::Option.new("--#{name.gsub('_', '-')}")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
parser = Thor::Options.new(yml_options)
|
18
|
+
|
19
|
+
# The options hash is frozen in #initialize so you need to merge and re-assign
|
20
|
+
self.options = options.merge(parser.parse(opts)).freeze
|
21
|
+
|
22
|
+
# Dispatch the command
|
23
|
+
send(:dynamic_params, options)
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "output OPTIONS", "generate SCAD output, overriding any parameters in parameters.yml"
|
27
|
+
default_task :output
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def dynamic_params(options)
|
32
|
+
options.each do |name, value|
|
33
|
+
name = name.gsub('-', '_')
|
34
|
+
if name == "variant"
|
35
|
+
SolidRuby::Parameters::Parameters.variant = value
|
36
|
+
else
|
37
|
+
SolidRuby::Parameters::Parameters.add_overrides(name => value)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/solidruby/solidruby.rb
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
# along with SolidRuby. If not, see <http://www.gnu.org/licenses/>fre.
|
15
15
|
|
16
16
|
$fn = 64
|
17
|
+
require 'cgi'
|
17
18
|
|
18
19
|
module SolidRuby
|
19
20
|
include SolidRuby::BillOfMaterial
|
@@ -26,29 +27,9 @@ module SolidRuby
|
|
26
27
|
include SolidRuby::CSGModifiers
|
27
28
|
include SolidRuby::Assemblies
|
28
29
|
include SolidRuby::Transformations
|
30
|
+
include SolidRuby::Parameters
|
29
31
|
include Math
|
30
32
|
|
31
|
-
# Deprecated: Stacks parts along the Z axis
|
32
|
-
# works on all Assemblies that have a @height definition
|
33
|
-
# TODO: Make a better functionality similar to this, that is:
|
34
|
-
# - easier to use
|
35
|
-
# - throws better error messages
|
36
|
-
# - doesn't assume that everything falls down like gravity in every case
|
37
|
-
def stack(args = {}, *parts)
|
38
|
-
args[:method] ||= 'show'
|
39
|
-
args[:spacing] ||= 0
|
40
|
-
warn 'SolidRuby Warning: Please note that the stack method is deprecated and will be removed or replaced in the future'
|
41
|
-
@assembly = nil
|
42
|
-
z = 0
|
43
|
-
parts.each do |part|
|
44
|
-
item = (part.send args[:method])
|
45
|
-
next if item.nil? || !item.respond_to?('translate')
|
46
|
-
@assembly += item.translate(z: z)
|
47
|
-
z += part.height + args[:spacing]
|
48
|
-
end
|
49
|
-
@assembly
|
50
|
-
end
|
51
|
-
|
52
33
|
def get_position_rec(obj, level = 0)
|
53
34
|
position = [0, 0, 0]
|
54
35
|
return position if obj.nil?
|
@@ -115,20 +96,35 @@ module SolidRuby
|
|
115
96
|
next if skip.include? i.to_s
|
116
97
|
output = nil
|
117
98
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
output
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
99
|
+
begin
|
100
|
+
res.send :initialize # ensure default values are loaded at each interation
|
101
|
+
output = res.send i
|
102
|
+
|
103
|
+
# if previous call resulted in a SolidRubyObject, don't call the show method again,
|
104
|
+
# otherwise call it.
|
105
|
+
unless output.is_a? SolidRubyObject
|
106
|
+
output = if i.to_s.include? 'output'
|
107
|
+
res.output
|
108
|
+
else
|
109
|
+
res.show
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
output.save("output/#{res.class}_#{i}.scad", "$fn=#{fn};") unless output.nil?
|
114
|
+
rescue Exception => e
|
115
|
+
File.open("output/#{res.class}_#{i}.scad", "w") do |file|
|
116
|
+
file <<
|
117
|
+
<<~ERROR
|
118
|
+
echo("--ERROR: #{e.message}");
|
119
|
+
echo("#{::CGI.escapeHTML(e.backtrace.last)}");
|
120
|
+
assert(false); // force stop rendering
|
121
|
+
/*
|
122
|
+
Full stack trace:
|
123
|
+
#{e.backtrace.join("\n")}
|
124
|
+
*/
|
125
|
+
ERROR
|
126
|
+
end
|
129
127
|
end
|
130
|
-
|
131
|
-
output.save("output/#{res.class}_#{i}.scad", "$fn=#{fn};") unless output.nil?
|
132
128
|
end
|
133
129
|
end
|
134
130
|
|
@@ -52,26 +52,28 @@ module SolidRuby
|
|
52
52
|
|
53
53
|
def translate(args)
|
54
54
|
return self if (args[:x] || 0) == 0 && (args[:y] || 0) == 0 && (args[:z] || 0) == 0
|
55
|
-
@transformations
|
56
|
-
|
55
|
+
if @transformations.last.is_a? Translate
|
56
|
+
@transformations.last.x += args[:x] || 0
|
57
|
+
@transformations.last.y += args[:y] || 0
|
58
|
+
@transformations.last.z += args[:z] || 0
|
59
|
+
else
|
60
|
+
@transformations << Translate.new(args)
|
61
|
+
end
|
57
62
|
self
|
58
63
|
end
|
59
64
|
|
60
65
|
def union(args)
|
61
|
-
@transformations ||= []
|
62
66
|
@transformations << Union.new(args)
|
63
67
|
self
|
64
68
|
end
|
65
69
|
|
66
|
-
def mirror(args)
|
67
|
-
@transformations
|
68
|
-
@transformations << Mirror.new(args)
|
70
|
+
def mirror(*args)
|
71
|
+
@transformations << Mirror.new(*args)
|
69
72
|
self
|
70
73
|
end
|
71
74
|
|
72
75
|
def scale(args)
|
73
76
|
args = { v: args } if args.is_a?(Numeric) || args.is_a?(Array)
|
74
|
-
@transformations ||= []
|
75
77
|
@transformations << Scale.new(args)
|
76
78
|
self
|
77
79
|
end
|
@@ -15,6 +15,26 @@
|
|
15
15
|
#
|
16
16
|
module SolidRuby::Transformations
|
17
17
|
class Mirror < Transformation
|
18
|
+
attr_accessor :x, :y, :z
|
19
|
+
|
20
|
+
def initialize(*args)
|
21
|
+
if args.first.is_a? Hash
|
22
|
+
args = args.first
|
23
|
+
@x = args[:x]
|
24
|
+
@y = args[:y]
|
25
|
+
@z = args[:z]
|
26
|
+
else
|
27
|
+
args = [args].flatten
|
28
|
+
@x = args.include?(:x) ? 1 : nil
|
29
|
+
@y = args.include?(:y) ? 1 : nil
|
30
|
+
@z = args.include?(:z) ? 1 : nil
|
31
|
+
|
32
|
+
args = {x: @x, y: @y, z: @z}
|
33
|
+
end
|
34
|
+
|
35
|
+
super(args)
|
36
|
+
end
|
37
|
+
|
18
38
|
def to_rubyscad
|
19
39
|
RubyScadBridge.new.mirror(@args)
|
20
40
|
end
|
@@ -14,8 +14,9 @@
|
|
14
14
|
# along with SolidRuby. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
#
|
16
16
|
module SolidRuby::Transformations
|
17
|
-
attr_accessor :x, :y, :z
|
18
17
|
class Translate < Transformation
|
18
|
+
attr_accessor :x, :y, :z
|
19
|
+
|
19
20
|
def initialize(args={})
|
20
21
|
super(args)
|
21
22
|
@x = args[:x] || 0
|
data/lib/solidruby/version.rb
CHANGED
data/lib/solidruby.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
+
require 'pry'
|
2
|
+
|
1
3
|
require 'solidruby/version'
|
2
4
|
require 'solidruby/bill_of_material'
|
3
5
|
require 'solidruby/solidruby_object'
|
4
6
|
require 'solidruby/rubyscad_bridge'
|
7
|
+
require 'solidruby/parameters'
|
8
|
+
require 'solidruby/project_cli'
|
5
9
|
|
6
10
|
require 'solidruby/primitives/primitive'
|
7
11
|
require 'solidruby/primitives/cylinder'
|
data/lib/templates/assembly.tt
CHANGED
data/lib/templates/main.tt
CHANGED
@@ -5,11 +5,16 @@ include SolidRuby
|
|
5
5
|
|
6
6
|
require_all 'lib/**/*.rb'
|
7
7
|
|
8
|
+
class <%= @clean_name %>Cli < SolidRuby::ProjectCli
|
9
|
+
def method_missing(method, *args, &block); super; end
|
10
|
+
end
|
11
|
+
<%= @clean_name %>Cli.start ARGV
|
12
|
+
|
8
13
|
# To run this project and refresh any changes to the code, run the following command
|
9
14
|
# in a terminal (make sure you are in the same directory as this file):
|
10
|
-
#
|
15
|
+
# guard
|
11
16
|
#
|
12
|
-
# This will generate
|
17
|
+
# This will generate output/<%= @clean_name %>.scad which you can open in OpenSCAD.
|
13
18
|
# In OpenSCAD make sure that you have the menu item
|
14
19
|
# Design -> Automatic Reload and Compile
|
15
20
|
# activated.
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# This file provides a handy place to keep common parameters for your design
|
2
|
+
# you should start with a `default` variant, as this is used when no variant is
|
3
|
+
# specified on the command line
|
4
|
+
|
5
|
+
default: &default
|
6
|
+
scale: 1.0
|
7
|
+
clearance: 0.3
|
8
|
+
|
9
|
+
# extra_large: # another variant
|
10
|
+
# <<: *default # inherit values from default
|
11
|
+
# scale: default__scale * 2 # Reference other variants by name with double-underscores
|
12
|
+
# pi: Math::PI # Values are first evaulated as Ruby code
|
data/lib/templates/printed.tt
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
-
require_relative '../params'
|
2
|
-
|
3
1
|
class <%= @clean_name %> < SolidRuby::Printed
|
4
2
|
def initialize
|
5
3
|
end
|
6
4
|
|
7
5
|
def part(_show)
|
6
|
+
# Put any part creation in here. For example:
|
7
|
+
# cube(10) - cylinder(d: 5, h: 10)
|
8
|
+
#
|
9
|
+
# To aid in parametric design you can use the `params` singleton, e.g:
|
10
|
+
# params.cube_size = 10
|
11
|
+
#
|
12
|
+
# cube(params.cube_size)
|
8
13
|
end
|
9
14
|
end
|
data/solidruby.gemspec
CHANGED
@@ -11,7 +11,8 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.email = ['j.milesy.nz@gmail.com']
|
12
12
|
gem.homepage = 'http://github.com/MC-Squared/SolidRuby'
|
13
13
|
gem.summary = 'SolidRuby is a framework for programming OpenScad models in Ruby'
|
14
|
-
gem.description = '
|
14
|
+
gem.description = 'SolidRuby is a framework for programming OpenScad models in Ruby. \
|
15
|
+
Inspired by CrystalScad and SolidPython, based on CrystalScad and RubyScad'
|
15
16
|
|
16
17
|
gem.license = 'GPL-3.0'
|
17
18
|
gem.files = `git ls-files -z`.split("\x0").reject do |f|
|
@@ -22,10 +23,12 @@ Gem::Specification.new do |gem|
|
|
22
23
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
23
24
|
gem.require_paths = ['lib']
|
24
25
|
|
25
|
-
gem.required_ruby_version = '>=
|
26
|
-
gem.add_runtime_dependency 'require_all', '~>
|
27
|
-
gem.add_runtime_dependency '
|
28
|
-
gem.
|
26
|
+
gem.required_ruby_version = '>= 3.0'
|
27
|
+
gem.add_runtime_dependency 'require_all', '~> 3.0'
|
28
|
+
gem.add_runtime_dependency 'thor', '~> 1.2'
|
29
|
+
gem.add_runtime_dependency 'matrix', '~> 0.4'
|
30
|
+
gem.add_development_dependency 'bundler', '~> 2.0'
|
31
|
+
gem.add_development_dependency 'pry', '> 0'
|
29
32
|
gem.add_development_dependency 'rake', '~> 12.0'
|
30
33
|
gem.add_development_dependency 'minitest', '~> 5.0'
|
31
34
|
gem.add_development_dependency 'minitest-reporters', '~> 1.1'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solidruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- J Miles
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: require_all
|
@@ -16,42 +16,70 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '3.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '3.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: thor
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '1.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '1.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: matrix
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.4'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.4'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
61
|
+
version: '2.0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
68
|
+
version: '2.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rake
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,7 +164,9 @@ dependencies:
|
|
136
164
|
- - "~>"
|
137
165
|
- !ruby/object:Gem::Version
|
138
166
|
version: '0.7'
|
139
|
-
description:
|
167
|
+
description: |-
|
168
|
+
SolidRuby is a framework for programming OpenScad models in Ruby. \
|
169
|
+
Inspired by CrystalScad and SolidPython, based on CrystalScad and RubyScad
|
140
170
|
email:
|
141
171
|
- j.milesy.nz@gmail.com
|
142
172
|
executables:
|
@@ -146,6 +176,7 @@ extra_rdoc_files: []
|
|
146
176
|
files:
|
147
177
|
- ".gitignore"
|
148
178
|
- ".travis.yml"
|
179
|
+
- CHANGELOG
|
149
180
|
- COPYING
|
150
181
|
- Gemfile
|
151
182
|
- Guardfile
|
@@ -186,7 +217,6 @@ files:
|
|
186
217
|
- examples/printed_gear2.rb
|
187
218
|
- examples/printed_thread.rb
|
188
219
|
- examples/printed_thread2.rb
|
189
|
-
- examples/stack.rb
|
190
220
|
- examples/threads.rb
|
191
221
|
- examples/threads2.rb
|
192
222
|
- examples/threads3.rb
|
@@ -219,6 +249,7 @@ files:
|
|
219
249
|
- lib/solidruby/helpers/position.rb
|
220
250
|
- lib/solidruby/helpers/rounded_cube.rb
|
221
251
|
- lib/solidruby/helpers/triangle.rb
|
252
|
+
- lib/solidruby/parameters.rb
|
222
253
|
- lib/solidruby/primitives/circle.rb
|
223
254
|
- lib/solidruby/primitives/cube.rb
|
224
255
|
- lib/solidruby/primitives/cylinder.rb
|
@@ -232,6 +263,7 @@ files:
|
|
232
263
|
- lib/solidruby/primitives/surface.rb
|
233
264
|
- lib/solidruby/primitives/text.rb
|
234
265
|
- lib/solidruby/printed_thread.rb
|
266
|
+
- lib/solidruby/project_cli.rb
|
235
267
|
- lib/solidruby/rubyscad_bridge.rb
|
236
268
|
- lib/solidruby/screw_thread.rb
|
237
269
|
- lib/solidruby/solidruby.rb
|
@@ -246,7 +278,7 @@ files:
|
|
246
278
|
- lib/templates/gitignore.tt
|
247
279
|
- lib/templates/guardfile.tt
|
248
280
|
- lib/templates/main.tt
|
249
|
-
- lib/templates/
|
281
|
+
- lib/templates/parameters.yml.tt
|
250
282
|
- lib/templates/printed.tt
|
251
283
|
- manual/manual.html
|
252
284
|
- solidruby.gemspec
|
@@ -254,7 +286,7 @@ homepage: http://github.com/MC-Squared/SolidRuby
|
|
254
286
|
licenses:
|
255
287
|
- GPL-3.0
|
256
288
|
metadata: {}
|
257
|
-
post_install_message:
|
289
|
+
post_install_message:
|
258
290
|
rdoc_options: []
|
259
291
|
require_paths:
|
260
292
|
- lib
|
@@ -262,16 +294,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
262
294
|
requirements:
|
263
295
|
- - ">="
|
264
296
|
- !ruby/object:Gem::Version
|
265
|
-
version:
|
297
|
+
version: '3.0'
|
266
298
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
267
299
|
requirements:
|
268
300
|
- - ">="
|
269
301
|
- !ruby/object:Gem::Version
|
270
302
|
version: '0'
|
271
303
|
requirements: []
|
272
|
-
|
273
|
-
|
274
|
-
signing_key:
|
304
|
+
rubygems_version: 3.3.7
|
305
|
+
signing_key:
|
275
306
|
specification_version: 4
|
276
307
|
summary: SolidRuby is a framework for programming OpenScad models in Ruby
|
277
308
|
test_files: []
|
data/examples/stack.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'solidruby'
|
4
|
-
include SolidRuby
|
5
|
-
|
6
|
-
# Note that this example does not work as intended and the function is deprecated
|
7
|
-
|
8
|
-
parts = [
|
9
|
-
Washer.new(4.3),
|
10
|
-
Nut.new(4),
|
11
|
-
Washer.new(4.3),
|
12
|
-
Nut.new(4)
|
13
|
-
]
|
14
|
-
bolt = Bolt.new(4, 16).show
|
15
|
-
bolt_assembly = bolt
|
16
|
-
bolt_assembly += stack({ method: 'output', spacing: 0.1 }, *parts)
|
17
|
-
|
18
|
-
x, y, z = position(bolt)
|
19
|
-
bolt_assembly.translate(x: x * -1, y: y * -1, z: z * -1)
|
20
|
-
|
21
|
-
bolt_assembly.save('stack.scad')
|
data/lib/templates/params.tt
DELETED