jenncad 1.0.0.pre.alpha1 → 1.0.0.pre.alpha4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +83 -0
- data/jenncad.gemspec +2 -1
- data/lib/jenncad/default_profile.rb +2 -2
- data/lib/jenncad/exporters/openscad.rb +260 -0
- data/lib/jenncad/features/aggregation.rb +16 -0
- data/lib/jenncad/features/climb.rb +95 -0
- data/lib/jenncad/features/cuttable.rb +35 -0
- data/lib/jenncad/features/feature.rb +4 -0
- data/lib/jenncad/{primitives → features}/openscad_include.rb +1 -1
- data/lib/jenncad/features/stl_import.rb +10 -0
- data/lib/jenncad/features.rb +11 -0
- data/lib/jenncad/part.rb +7 -4
- data/lib/jenncad/patches/array.rb +28 -8
- data/lib/jenncad/primitives/boolean_object.rb +11 -1
- data/lib/jenncad/primitives/cube.rb +26 -18
- data/lib/jenncad/primitives/cylinder.rb +65 -9
- data/lib/jenncad/primitives/rotate_extrude.rb +1 -1
- data/lib/jenncad/primitives/rounded_cube.rb +8 -10
- data/lib/jenncad/primitives/subtract_object.rb +17 -13
- data/lib/jenncad/primitives.rb +20 -0
- data/lib/jenncad/shortcuts.rb +30 -35
- data/lib/jenncad/thing.rb +137 -41
- data/lib/jenncad/transformation/color.rb +179 -0
- data/lib/jenncad/transformation/scale.rb +2 -0
- data/lib/jenncad/version.rb +1 -1
- data/lib/jenncad.rb +5 -30
- metadata +31 -11
- data/lib/jenncad/jenncad.rb +0 -3
- data/lib/jenncad/openscad.rb +0 -274
- data/lib/jenncad/primitives/aggregation.rb +0 -12
@@ -1,6 +1,6 @@
|
|
1
1
|
module JennCad::Primitives
|
2
2
|
class Cube < Primitive
|
3
|
-
|
3
|
+
extend JennCad::Features::Cuttable
|
4
4
|
|
5
5
|
def initialize(args)
|
6
6
|
if args.kind_of?(Array) && args[0].kind_of?(Hash)
|
@@ -37,33 +37,41 @@ module JennCad::Primitives
|
|
37
37
|
|
38
38
|
# used for openscad export
|
39
39
|
def size
|
40
|
-
[@x, @y,
|
40
|
+
[@x, @y, z+z_margin]
|
41
41
|
end
|
42
42
|
|
43
|
-
def
|
44
|
-
|
45
|
-
self
|
43
|
+
def not_centered
|
44
|
+
@opts[:center] = false
|
46
45
|
end
|
46
|
+
alias :nc :not_centered
|
47
47
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
48
|
+
def cx
|
49
|
+
nc
|
50
|
+
@opts[:center_x] = true
|
51
51
|
end
|
52
52
|
|
53
|
-
def
|
54
|
-
|
55
|
-
|
53
|
+
def cy
|
54
|
+
nc
|
55
|
+
@opts[:center_y] = true
|
56
56
|
end
|
57
57
|
|
58
|
-
def
|
59
|
-
|
60
|
-
|
58
|
+
def cz
|
59
|
+
nc
|
60
|
+
@opts[:center_z] = true
|
61
61
|
end
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
63
|
+
def centered_axis
|
64
|
+
return [:x, :y] if @opts[:center]
|
65
|
+
a = []
|
66
|
+
a << :x if @opts[:center_x]
|
67
|
+
a << :y if @opts[:center_x]
|
68
|
+
a << :z if @opts[:center_x]
|
69
|
+
a
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_openscad
|
73
|
+
self.mh(centered_axis.to_h{|a| [a, -@opts[a]] }) # center cube
|
74
|
+
end
|
67
75
|
|
68
76
|
end
|
69
77
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module JennCad::Primitives
|
2
2
|
class Cylinder < Primitive
|
3
|
-
attr_accessor :d, :r, :fn
|
3
|
+
attr_accessor :d, :d1, :d2, :r, :fn
|
4
4
|
def initialize(args)
|
5
5
|
if args.kind_of?(Array) && args[0].kind_of?(Hash)
|
6
6
|
args = args.first
|
@@ -18,6 +18,10 @@ module JennCad::Primitives
|
|
18
18
|
|
19
19
|
@opts = {
|
20
20
|
d: 0,
|
21
|
+
d1: nil,
|
22
|
+
d2: nil,
|
23
|
+
r1: nil,
|
24
|
+
r2: nil,
|
21
25
|
z: nil,
|
22
26
|
r: 0,
|
23
27
|
margins: {
|
@@ -31,21 +35,73 @@ module JennCad::Primitives
|
|
31
35
|
# FIXME:
|
32
36
|
# - margins calculation needs to go to output
|
33
37
|
# - assinging these variables has to stop
|
34
|
-
# - r/d need to be automatically calculated by each other
|
35
38
|
# - r+z margin not implemented atm
|
36
39
|
# - need to migrate classes to provide all possible outputs (and non-conflicting ones) to openscad exporter
|
37
|
-
@d = args[:d] + @opts[:margins][:d]
|
38
40
|
@z = args[:z] || args[:h]
|
39
|
-
|
40
|
-
|
41
|
-
if @fn == nil && @d > 16
|
42
|
-
@fn = (@d*4).ceil
|
43
|
-
end
|
41
|
+
handle_radius_diameter
|
42
|
+
handle_fn
|
44
43
|
super(args)
|
45
44
|
end
|
46
45
|
|
46
|
+
def openscad_params
|
47
|
+
res = {}
|
48
|
+
if @opts[:d1]
|
49
|
+
[:d1, :d2, :h, :fn].each do |n|
|
50
|
+
res[n] = self.send n
|
51
|
+
end
|
52
|
+
else
|
53
|
+
[:d, :h, :fn].each do |n|
|
54
|
+
res[n] = self.send n
|
55
|
+
end
|
56
|
+
end
|
57
|
+
res
|
58
|
+
end
|
59
|
+
|
60
|
+
def handle_fn
|
61
|
+
case @opts[:fn]
|
62
|
+
when nil, 0
|
63
|
+
$fn = auto_fn!
|
64
|
+
else
|
65
|
+
@fn = @opts[:fn]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def auto_fn!
|
70
|
+
case @d
|
71
|
+
when (16..)
|
72
|
+
@fn = (@d*4).ceil
|
73
|
+
else
|
74
|
+
@fn = 64
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def handle_radius_diameter
|
79
|
+
case @opts[:d]
|
80
|
+
when 0, nil
|
81
|
+
@r = @opts[:r].to_f + @opts[:margins][:r].to_f
|
82
|
+
@d = @r * 2.0
|
83
|
+
else
|
84
|
+
@d = @opts[:d].to_f + @opts[:margins][:d].to_f
|
85
|
+
@r = @d / 2.0
|
86
|
+
end
|
87
|
+
|
88
|
+
case @opts[:d1]
|
89
|
+
when 0, nil
|
90
|
+
else
|
91
|
+
@d1 = @opts[:d1].to_f + @opts[:margins][:d].to_f
|
92
|
+
@d2 = @opts[:d2].to_f + @opts[:margins][:d].to_f
|
93
|
+
end
|
94
|
+
|
95
|
+
case @opts[:r1]
|
96
|
+
when 0, nil
|
97
|
+
else
|
98
|
+
@d1 = 2 * @opts[:r1].to_f + @opts[:margins][:d].to_f
|
99
|
+
@d2 = 2 * @opts[:r2].to_f + @opts[:margins][:d].to_f
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
47
103
|
def h
|
48
|
-
z
|
104
|
+
z + z_margin
|
49
105
|
end
|
50
106
|
|
51
107
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module JennCad::Primitives
|
2
2
|
class RoundedCube < Primitive
|
3
3
|
attr_accessor :d, :r
|
4
|
+
include JennCad::Features::Cuttable
|
4
5
|
|
5
6
|
def initialize(args)
|
6
7
|
if args.kind_of?(Array) && args[0].kind_of?(Hash)
|
@@ -40,21 +41,13 @@ module JennCad::Primitives
|
|
40
41
|
# make diameter not bigger than any side
|
41
42
|
@d = [@d, @x, @y].min
|
42
43
|
res = HullObject.new(
|
43
|
-
cylinder(d:@d, h
|
44
|
+
cylinder(d:@d, h:z+z_margin).moveh(x: -@x + @d, y: @y - @d),
|
44
45
|
cylinder(d:@d).moveh(x: @x - @d, y: @y - @d),
|
45
46
|
cylinder(d:@d).moveh(x: -@x + @d, y: -@y + @d),
|
46
47
|
cylinder(d:@d).moveh(x: @x - @d, y: -@y + @d),
|
47
48
|
)
|
48
49
|
|
49
|
-
|
50
|
-
if @opts[:flat_edges].kind_of?(Array)
|
51
|
-
@opts[:flat_edges].each do |e|
|
52
|
-
res += flat_edge(e)
|
53
|
-
end
|
54
|
-
else
|
55
|
-
res += flat_edge(@opts[:flat_edges])
|
56
|
-
end
|
57
|
-
end
|
50
|
+
res += flat_edge(@opts[:flat_edges])
|
58
51
|
|
59
52
|
res.transformations = @transformations
|
60
53
|
res
|
@@ -62,6 +55,9 @@ module JennCad::Primitives
|
|
62
55
|
|
63
56
|
def flat_edge(edge)
|
64
57
|
case edge
|
58
|
+
when Array
|
59
|
+
#ruby2.7 test- edge.map(&self.:flat_edge)
|
60
|
+
edge.map{|x| flat_edge(x) }
|
65
61
|
when :up
|
66
62
|
cube(@x, @y/2.0, @z).moveh(y:@y/2.0)
|
67
63
|
when :down
|
@@ -70,6 +66,8 @@ module JennCad::Primitives
|
|
70
66
|
cube(@x/2.0, @y, @z).moveh(x:@x/2.0)
|
71
67
|
when :left
|
72
68
|
cube(@x/2.0, @y, @z).moveh(x:-@x/2.0)
|
69
|
+
else
|
70
|
+
nil
|
73
71
|
end
|
74
72
|
end
|
75
73
|
|
@@ -44,37 +44,41 @@ module JennCad::Primitives
|
|
44
44
|
else
|
45
45
|
compare_z(others, first_h.first, first_z.first)
|
46
46
|
end
|
47
|
+
self
|
47
48
|
end
|
48
49
|
|
49
|
-
# FIXME
|
50
|
-
# this won't work reliable with Aggregations at the moment;
|
51
|
-
# they don't have calc_z for comparing with the top
|
52
|
-
# and it will try to move the Aggregation which it should not do
|
53
|
-
# (it should move the calls to the Aggregation, not the Aggregation itself)
|
54
50
|
def compare_z(others,compare_h,compare_z)
|
55
51
|
others.each do |part|
|
56
52
|
#puts part.inspect
|
57
53
|
#puts "#{part.calc_z+part.calc_h} ; #{compare_h}"
|
58
54
|
if part.respond_to? :z
|
55
|
+
part.opts[:margins] ||= {}
|
59
56
|
if part.referenced_z && part.z != 0.0
|
60
57
|
case part
|
61
58
|
when JennCad::BooleanObject
|
59
|
+
when JennCad::Aggregation
|
62
60
|
else
|
63
|
-
part.
|
64
|
-
part.
|
61
|
+
pp part if part.opts[:debug]
|
62
|
+
part.opts[:margins][:z] ||= 0.0
|
63
|
+
unless part.opts[:margins][:z] == 0.2
|
64
|
+
part.opts[:margins][:z] = 0.2
|
65
|
+
part.mz(-0.1)
|
66
|
+
end
|
65
67
|
end
|
66
68
|
elsif part.z == compare_h
|
67
69
|
# puts "fixing possible z fighting: #{part.class} #{part.z}"
|
68
|
-
part.z+=0.008
|
69
|
-
part.
|
70
|
+
part.opts[:margins][:z] += 0.008
|
71
|
+
part.mz(-0.004)
|
70
72
|
elsif part.calc_z == compare_z
|
71
73
|
# puts "z fighting at bottom: #{part.calc_z}"
|
72
|
-
part.z+=0.004
|
73
|
-
|
74
|
+
part.opts[:margins][:z] += 0.004
|
75
|
+
# part.z+=0.004
|
76
|
+
part.mz(-0.002)
|
74
77
|
elsif part.calc_z.to_f+part.calc_h.to_f == compare_h
|
75
78
|
# puts "z fighting at top: #{compare_h}"
|
76
|
-
part.z+=0.004
|
77
|
-
part.
|
79
|
+
#part.z+=0.004
|
80
|
+
part.opts[:margins][:z] += 0.004
|
81
|
+
part.mz(0.002)
|
78
82
|
end
|
79
83
|
end
|
80
84
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "jenncad/primitives/primitive"
|
2
|
+
require "jenncad/primitives/circle"
|
3
|
+
require "jenncad/primitives/cylinder"
|
4
|
+
require "jenncad/primitives/sphere"
|
5
|
+
require "jenncad/primitives/cube"
|
6
|
+
require "jenncad/primitives/rounded_cube"
|
7
|
+
require "jenncad/primitives/polygon"
|
8
|
+
require "jenncad/primitives/slot"
|
9
|
+
require "jenncad/primitives/boolean_object"
|
10
|
+
require "jenncad/primitives/union_object"
|
11
|
+
require "jenncad/primitives/subtract_object"
|
12
|
+
require "jenncad/primitives/hull_object"
|
13
|
+
require "jenncad/primitives/intersection_object"
|
14
|
+
require "jenncad/primitives/projection"
|
15
|
+
require "jenncad/primitives/linear_extrude"
|
16
|
+
require "jenncad/primitives/rotate_extrude"
|
17
|
+
|
18
|
+
module JennCad
|
19
|
+
include Primitives
|
20
|
+
end
|
data/lib/jenncad/shortcuts.rb
CHANGED
@@ -38,6 +38,10 @@ module JennCad
|
|
38
38
|
OpenScadImport.new(import, name, args)
|
39
39
|
end
|
40
40
|
|
41
|
+
def stl(file, args={})
|
42
|
+
StlImport.new(file, args)
|
43
|
+
end
|
44
|
+
|
41
45
|
def extrude(args)
|
42
46
|
LinearExtrude.new(self, args)
|
43
47
|
end
|
@@ -54,56 +58,47 @@ module JennCad
|
|
54
58
|
UnionObject.new(*args)
|
55
59
|
end
|
56
60
|
|
57
|
-
def +(args)
|
58
|
-
return args if self == nil
|
59
|
-
if self.kind_of?(UnionObject) && self.transformations.size == 0
|
60
|
-
self.add(args)
|
61
|
-
return self
|
62
|
-
else
|
63
|
-
UnionObject.new(self,args)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
61
|
def subtraction(*args)
|
68
62
|
SubtractObject.new(*args)
|
69
63
|
end
|
70
64
|
|
71
|
-
def -(args)
|
72
|
-
if self.kind_of?(SubtractObject) && self.transformations.size == 0
|
73
|
-
self.add(args)
|
74
|
-
return self
|
75
|
-
else
|
76
|
-
SubtractObject.new(self,args)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
65
|
def intersection(*args)
|
81
66
|
IntersectionObject.new(*args)
|
82
67
|
end
|
83
68
|
|
84
|
-
def *(args)
|
85
|
-
if self.kind_of?(IntersectionObject) && self.transformations.size == 0
|
86
|
-
self.add(args)
|
87
|
-
return self
|
88
|
-
else
|
89
|
-
IntersectionObject.new(self,args)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
69
|
def hull(*args)
|
94
70
|
HullObject.new(*args)
|
95
71
|
end
|
96
72
|
|
97
|
-
def
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
73
|
+
def +(part)
|
74
|
+
boolean_operation(part, UnionObject)
|
75
|
+
end
|
76
|
+
|
77
|
+
def -(part)
|
78
|
+
boolean_operation(part, SubtractObject)
|
79
|
+
end
|
80
|
+
|
81
|
+
def *(part)
|
82
|
+
boolean_operation(part, IntersectionObject)
|
83
|
+
end
|
84
|
+
|
85
|
+
def &(part)
|
86
|
+
boolean_operation(part, HullObject)
|
104
87
|
end
|
105
88
|
|
106
89
|
def assemble(partlib=nil, z_skip = false, z=0, &block)
|
107
90
|
block.yield.assemble(partlib, z_skip, z)
|
108
91
|
end
|
92
|
+
|
93
|
+
private
|
94
|
+
def boolean_operation(part, klass)
|
95
|
+
case self
|
96
|
+
when nil
|
97
|
+
part
|
98
|
+
when klass
|
99
|
+
add_or_new(part)
|
100
|
+
else
|
101
|
+
klass.new(self,part)
|
102
|
+
end
|
103
|
+
end
|
109
104
|
end
|
data/lib/jenncad/thing.rb
CHANGED
@@ -3,10 +3,10 @@ module JennCad
|
|
3
3
|
attr_accessor :opts
|
4
4
|
attr_accessor :parts
|
5
5
|
attr_accessor :transformations, :name
|
6
|
-
attr_accessor :x, :y, :
|
6
|
+
attr_accessor :x, :y, :diameter
|
7
7
|
attr_accessor :calc_x, :calc_y, :calc_z, :calc_h
|
8
8
|
attr_accessor :shape
|
9
|
-
attr_accessor :angle, :
|
9
|
+
attr_accessor :angle, :fn
|
10
10
|
|
11
11
|
def initialize(args={})
|
12
12
|
@transformations = []
|
@@ -35,37 +35,46 @@ module JennCad
|
|
35
35
|
end
|
36
36
|
alias :rt :rotate
|
37
37
|
|
38
|
-
def
|
39
|
-
|
40
|
-
case shape.to_s
|
41
|
-
when "cube"
|
42
|
-
[@x/2.0,@y/2.0,@z/2.0]
|
43
|
-
when "cylinder"
|
44
|
-
[0,0,@z/2.0]
|
45
|
-
else
|
46
|
-
[0,0,0]
|
47
|
-
end
|
38
|
+
def rx(v)
|
39
|
+
rt(x:v)
|
48
40
|
end
|
49
41
|
|
50
|
-
def
|
51
|
-
|
42
|
+
def ry(v)
|
43
|
+
rt(y:v)
|
44
|
+
end
|
45
|
+
|
46
|
+
def rz(v)
|
47
|
+
rt(z:v)
|
48
|
+
end
|
49
|
+
|
50
|
+
def flip(direction)
|
51
|
+
case self
|
52
|
+
when UnionObject
|
53
|
+
ref = self.parts.first
|
54
|
+
rz = self.z.to_f + self.calc_h.to_f
|
55
|
+
when BooleanObject
|
52
56
|
ref = self.parts.first
|
57
|
+
rz = ref.calc_z + ref.calc_h
|
53
58
|
else
|
54
59
|
ref = self
|
60
|
+
rz = self.z + self.calc_h
|
55
61
|
end
|
56
62
|
|
57
|
-
|
63
|
+
case direction
|
64
|
+
when :x
|
65
|
+
self.ry(90).mh(x: -rz, z: ref.x)
|
66
|
+
when :y
|
67
|
+
self.rx(90).mh(y: rz, z: ref.y)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def flip_x
|
72
|
+
flip(:x)
|
58
73
|
end
|
59
74
|
alias :fx :flip_x
|
60
75
|
|
61
76
|
def flip_y
|
62
|
-
|
63
|
-
ref = self.parts.first
|
64
|
-
else
|
65
|
-
ref = self
|
66
|
-
end
|
67
|
-
|
68
|
-
self.rotate(x:90).moveh(y: ref.z, z: ref.y)
|
77
|
+
flip(:y)
|
69
78
|
end
|
70
79
|
alias :fy :flip_y
|
71
80
|
|
@@ -242,26 +251,109 @@ module JennCad
|
|
242
251
|
item
|
243
252
|
end
|
244
253
|
|
254
|
+
def has_explicit_color?
|
255
|
+
if option(:auto_color) == false
|
256
|
+
return true
|
257
|
+
end
|
258
|
+
return false
|
259
|
+
end
|
260
|
+
|
261
|
+
def only_color?(parts, lvl=0)
|
262
|
+
return true if parts == nil
|
263
|
+
|
264
|
+
parts.each do |part|
|
265
|
+
# puts " " * lvl + "[only_color?] #{part}"
|
266
|
+
if part.has_explicit_color?
|
267
|
+
# puts " " * lvl + "found explicit color here"
|
268
|
+
return false
|
269
|
+
end
|
270
|
+
if !only_color?(part.parts, lvl+1)
|
271
|
+
return false
|
272
|
+
end
|
273
|
+
end
|
274
|
+
true
|
275
|
+
end
|
276
|
+
|
277
|
+
def set_auto_color_for_children(col, parts, lvl=0)
|
278
|
+
return if parts == nil
|
279
|
+
|
280
|
+
parts.each do |part|
|
281
|
+
unless part.has_explicit_color?
|
282
|
+
if only_color?(part.parts, lvl+1)
|
283
|
+
# puts " " * lvl + "children have no explicit color, setting it here"
|
284
|
+
part.set_auto_color(col)
|
285
|
+
else
|
286
|
+
# puts " " * lvl + "[set_auto_color_for_children] #{part}"
|
287
|
+
set_auto_color_for_children(col, part.parts, lvl+1)
|
288
|
+
end
|
289
|
+
else
|
290
|
+
# puts " " * lvl + "[set_auto_color_for_children] this part has a color, ignoring their children"
|
291
|
+
end
|
292
|
+
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
def set_auto_color(col)
|
297
|
+
set_option :color, col
|
298
|
+
set_option :auto_color, true
|
299
|
+
end
|
300
|
+
|
245
301
|
def color(args=nil)
|
246
|
-
|
302
|
+
if args == nil
|
303
|
+
return option(:color)
|
304
|
+
end
|
305
|
+
|
247
306
|
if args == :auto
|
248
|
-
|
249
|
-
|
250
|
-
|
307
|
+
ac = auto_color
|
308
|
+
unless ac.nil?
|
309
|
+
#puts "auto color to #{ac}"
|
310
|
+
if only_color?(self.parts)
|
311
|
+
set_option :color, ac
|
312
|
+
set_option :auto_color, true
|
313
|
+
else
|
314
|
+
set_auto_color_for_children(ac, self.parts)
|
315
|
+
end
|
316
|
+
|
317
|
+
end
|
251
318
|
return self
|
252
319
|
end
|
253
|
-
|
320
|
+
|
321
|
+
c = color_parse(args)
|
322
|
+
unless c.nil?
|
323
|
+
set_option :color, c
|
324
|
+
set_option :auto_color, false
|
325
|
+
end
|
326
|
+
|
254
327
|
self
|
255
328
|
end
|
256
329
|
|
330
|
+
def color_parse(args=nil)
|
331
|
+
case args
|
332
|
+
when :none
|
333
|
+
set_option :no_auto_color, true
|
334
|
+
when :random
|
335
|
+
return Color.random
|
336
|
+
when Array
|
337
|
+
return Color.parse(args)
|
338
|
+
when /(?<=#)(?<!^)(\h{6}|\h{3})/
|
339
|
+
return args
|
340
|
+
when /(?<!^)(\h{6}|\h{3})/
|
341
|
+
return "##{args}"
|
342
|
+
when String
|
343
|
+
return args
|
344
|
+
end
|
345
|
+
nil
|
346
|
+
end
|
347
|
+
|
257
348
|
def auto_color
|
258
349
|
if option(:color) == nil && !option(:no_auto_color)
|
259
|
-
auto_color!
|
350
|
+
return auto_color!
|
260
351
|
end
|
352
|
+
nil
|
261
353
|
end
|
262
354
|
|
263
355
|
def auto_color!
|
264
|
-
|
356
|
+
color_parse($jenncad_profile.colors.pop)
|
265
357
|
end
|
266
358
|
|
267
359
|
def color_or_fallback
|
@@ -273,14 +365,10 @@ module JennCad
|
|
273
365
|
if @parts == nil
|
274
366
|
if self.respond_to? :part
|
275
367
|
@parts = [part]
|
276
|
-
else
|
277
|
-
# FIXME: -> move logic OpenScad
|
278
|
-
#puts "[Error in openscad export] Could not find @parts or part for #{self}"
|
279
|
-
#exit
|
280
368
|
end
|
281
369
|
end
|
282
370
|
|
283
|
-
OpenScad.new(self).save(file)
|
371
|
+
JennCad::Exporters::OpenScad.new(self).save(file)
|
284
372
|
end
|
285
373
|
|
286
374
|
def referenced_z
|
@@ -289,19 +377,27 @@ module JennCad
|
|
289
377
|
return false
|
290
378
|
end
|
291
379
|
|
380
|
+
def z=(args)
|
381
|
+
set_option(:z, args)
|
382
|
+
@z = args
|
383
|
+
end
|
384
|
+
|
292
385
|
def z
|
293
|
-
ref = referenced_z
|
294
|
-
|
295
|
-
|
386
|
+
case ref = referenced_z
|
387
|
+
when nil, false
|
388
|
+
@z + z_margin
|
389
|
+
else
|
390
|
+
ref.z.to_f + ref.z_margin.to_f
|
296
391
|
end
|
297
|
-
@z
|
298
392
|
end
|
299
393
|
|
300
394
|
def z_margin
|
301
|
-
|
302
|
-
|
395
|
+
case m = option(:margins)
|
396
|
+
when nil, {}
|
397
|
+
0.0
|
398
|
+
else
|
399
|
+
m[:z].to_f
|
303
400
|
end
|
304
|
-
0.0
|
305
401
|
end
|
306
402
|
|
307
403
|
end
|