jenncad 1.0.0.pre.alpha21 → 1.0.0.pre.alpha22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/jenncad/exporters/openscad.rb +5 -0
- data/lib/jenncad/position.rb +138 -0
- data/lib/jenncad/primitives/boolean_object.rb +5 -2
- data/lib/jenncad/primitives/circle.rb +1 -0
- data/lib/jenncad/primitives/cube.rb +3 -17
- data/lib/jenncad/primitives/cylinder.rb +6 -11
- data/lib/jenncad/primitives/linear_extrude.rb +10 -2
- data/lib/jenncad/primitives/rounded_cube.rb +15 -12
- data/lib/jenncad/primitives/slot.rb +5 -0
- data/lib/jenncad/primitives/square.rb +3 -7
- data/lib/jenncad/primitives/text.rb +50 -0
- data/lib/jenncad/primitives/union_object.rb +16 -0
- data/lib/jenncad/primitives.rb +1 -0
- data/lib/jenncad/shared/cube_ish.rb +2 -0
- data/lib/jenncad/shared/z_ish.rb +55 -0
- data/lib/jenncad/shared.rb +1 -0
- data/lib/jenncad/shortcuts.rb +4 -0
- data/lib/jenncad/thing.rb +87 -48
- data/lib/jenncad/transformation/move.rb +7 -1
- data/lib/jenncad/transformation/rotate.rb +4 -0
- data/lib/jenncad/transformation/transformation.rb +2 -1
- data/lib/jenncad/version.rb +1 -1
- data/lib/jenncad.rb +2 -0
- data/todo.txt +24 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 655d1eab8f78d92f18915154cdc36a57fecfcb222e40dc69e663c974d5d85052
|
4
|
+
data.tar.gz: 79bd0ecee0ea0b3b691c4953ec33e68e1783248899d1e9417fe9cfac80e6fc46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77c14e0645ff92f85f8746830469707d91495b7cf57d8d64210a0c2da7d7a6b0f9c27c3b4eb6fdcfdcd983a6d647b54309d4e10d2d407d70f7e55d02cd72ec9f
|
7
|
+
data.tar.gz: dd7538fb2068d4cb15326af37f7324d19c31828e3584b700f78ea585004790ee9033576e235e17774f007722f3b5a729d4a6a4c75f9c9fd2a0e2b0ee33e59bb4
|
@@ -95,6 +95,9 @@ module JennCad::Exporters
|
|
95
95
|
if v == nil
|
96
96
|
next
|
97
97
|
end
|
98
|
+
if v.kind_of?(Symbol)
|
99
|
+
v = v.to_s
|
100
|
+
end
|
98
101
|
if v.kind_of?(Array)
|
99
102
|
v = handle_args(v)
|
100
103
|
elsif !v.kind_of?(TrueClass) && !v.kind_of?(FalseClass) && v == v.to_i
|
@@ -172,6 +175,8 @@ module JennCad::Exporters
|
|
172
175
|
prim('circle', part)
|
173
176
|
when JennCad::Primitives::Square
|
174
177
|
prim('square', part)
|
178
|
+
when JennCad::Primitives::Text
|
179
|
+
prim('text', part)
|
175
180
|
when JennCad::Primitives::LinearExtrude
|
176
181
|
new_obj(part, :linear_extrude, part.openscad_params, parse(part.parts))
|
177
182
|
when JennCad::Primitives::RotateExtrude
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module JennCad
|
2
|
+
class Size
|
3
|
+
attr_accessor :size
|
4
|
+
def initialize(args={})
|
5
|
+
@size = {
|
6
|
+
x: args[:x].to_d,
|
7
|
+
y: args[:y].to_d,
|
8
|
+
z: (args[:z] || args[:h]).to_d,
|
9
|
+
d: args[:d].to_d,
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def add(other)
|
14
|
+
return self if other.nil?
|
15
|
+
@size[:x] += other.x
|
16
|
+
@size[:y] += other.y
|
17
|
+
@size[:z] += other.z
|
18
|
+
@size[:d] += other.d
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def union(other)
|
23
|
+
@size[:x] = [@size[:x], other.x].max
|
24
|
+
@size[:y] = [@size[:y], other.y].max
|
25
|
+
@size[:z] = [@size[:z], other.z].max
|
26
|
+
@size[:d] = [@size[:d], other.d].max
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_point
|
31
|
+
Point.new(x: @size[:x], y: @size[:y], z: @size[:z])
|
32
|
+
end
|
33
|
+
|
34
|
+
def set(a, to)
|
35
|
+
@size[a] = to
|
36
|
+
end
|
37
|
+
|
38
|
+
def x
|
39
|
+
@size[:x]
|
40
|
+
end
|
41
|
+
|
42
|
+
def y
|
43
|
+
@size[:y]
|
44
|
+
end
|
45
|
+
|
46
|
+
def z
|
47
|
+
@size[:z]
|
48
|
+
end
|
49
|
+
|
50
|
+
def d
|
51
|
+
@size[:d]
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
class Point
|
57
|
+
attr_accessor :pos
|
58
|
+
def initialize(args={})
|
59
|
+
@pos = {x: 0.to_d, y: 0.to_d, z: 0.to_d}
|
60
|
+
add(args)
|
61
|
+
end
|
62
|
+
|
63
|
+
def x
|
64
|
+
@pos[:x]
|
65
|
+
end
|
66
|
+
|
67
|
+
def y
|
68
|
+
@pos[:y]
|
69
|
+
end
|
70
|
+
|
71
|
+
def z
|
72
|
+
@pos[:z]
|
73
|
+
end
|
74
|
+
|
75
|
+
def zero?
|
76
|
+
return true if x == 0.0 && y == 0.0 && z == 0.0
|
77
|
+
false
|
78
|
+
end
|
79
|
+
|
80
|
+
def to_a
|
81
|
+
if @z != 0.0
|
82
|
+
[@pos[:x], @pos[:y], @pos[:z]]
|
83
|
+
else
|
84
|
+
[@pos[:x], @pos[:y]]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def to_h
|
89
|
+
@pos.clone.delete_if{|k,v| v.to_d == 0.0}
|
90
|
+
end
|
91
|
+
|
92
|
+
def add(args)
|
93
|
+
if args.kind_of? Point
|
94
|
+
@pos[:x] += args.x
|
95
|
+
@pos[:y] += args.y
|
96
|
+
@pos[:z] += args.z
|
97
|
+
return self
|
98
|
+
end
|
99
|
+
|
100
|
+
args.each do |k, val|
|
101
|
+
if [:chain, :debug].include? k
|
102
|
+
next
|
103
|
+
end
|
104
|
+
unless val.kind_of? Numeric
|
105
|
+
next
|
106
|
+
end
|
107
|
+
if val.to_d == 0.0
|
108
|
+
next
|
109
|
+
end
|
110
|
+
|
111
|
+
keys = k.to_s.chars
|
112
|
+
axis = []
|
113
|
+
axis << keys.delete("x")
|
114
|
+
axis << keys.delete("y")
|
115
|
+
axis << keys.delete("z")
|
116
|
+
multi = 1
|
117
|
+
|
118
|
+
if keys.size > 0
|
119
|
+
if keys.include?("h")
|
120
|
+
multi = 0.5
|
121
|
+
elsif keys.include?("q")
|
122
|
+
multi = 0.25
|
123
|
+
elsif keys.include?("d")
|
124
|
+
multi = 2.0
|
125
|
+
end
|
126
|
+
if keys.include?("n") || keys.include?("i")
|
127
|
+
multi *= -1
|
128
|
+
end
|
129
|
+
end
|
130
|
+
axis.compact.each do |a|
|
131
|
+
@pos[a.to_sym] += val.to_d * multi.to_d
|
132
|
+
end
|
133
|
+
end
|
134
|
+
self
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
@@ -13,10 +13,13 @@ module JennCad::Primitives
|
|
13
13
|
end
|
14
14
|
|
15
15
|
if parts.first && parts.first.respond_to?(:debug?) && parts.first.debug?
|
16
|
-
$log.debug("Creating new #{self.class} for part #{parts}")
|
16
|
+
$log.debug("Creating new #{self.class} for part #{parts.pretty_inspect}")
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
|
20
|
+
@parent = @parts.first.parent if @parts.first
|
21
|
+
@csize = @parts.first.csize if @parts.first
|
22
|
+
@csize ||= Size.new
|
20
23
|
|
21
24
|
after_add
|
22
25
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module JennCad::Primitives
|
2
2
|
class Cube < Square
|
3
3
|
extend JennCad::Features::Cuttable
|
4
|
+
include ZIsh
|
4
5
|
|
5
6
|
def initialize(args)
|
6
7
|
@opts = {
|
@@ -26,27 +27,19 @@ module JennCad::Primitives
|
|
26
27
|
end
|
27
28
|
init
|
28
29
|
|
29
|
-
|
30
30
|
handle_margins
|
31
31
|
@h = @z.dup
|
32
32
|
@calc_h = @z.dup
|
33
33
|
|
34
34
|
@dimensions = [:x, :y, :z]
|
35
|
+
@csize = Size.new(x: @opts[:x], y: @opts[:y], z: @opts[:z])
|
35
36
|
|
36
37
|
set_anchors
|
37
38
|
end
|
38
39
|
|
39
40
|
def set_anchors
|
40
41
|
set_anchors_2d
|
41
|
-
|
42
|
-
set_anchor :bottom_face, z: -@z/2.0
|
43
|
-
set_anchor :top_face, z: @z/2.0
|
44
|
-
else
|
45
|
-
set_anchor :bottom_face, z: 0
|
46
|
-
set_anchor :top_face, z: @z
|
47
|
-
end
|
48
|
-
|
49
|
-
|
42
|
+
set_anchors_z
|
50
43
|
end
|
51
44
|
|
52
45
|
# used for openscad export
|
@@ -54,13 +47,6 @@ module JennCad::Primitives
|
|
54
47
|
[@x, @y, z+z_margin]
|
55
48
|
end
|
56
49
|
|
57
|
-
def cz
|
58
|
-
nc
|
59
|
-
@opts[:center_z] = true
|
60
|
-
set_anchors
|
61
|
-
self
|
62
|
-
end
|
63
|
-
alias :center_z :cz
|
64
50
|
|
65
51
|
end
|
66
52
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module JennCad::Primitives
|
2
2
|
class Cylinder < Circle
|
3
|
+
include ZIsh
|
3
4
|
attr_accessor :d, :d1, :d2, :r, :fn, :anchors
|
4
5
|
def initialize(args)
|
5
6
|
if args.kind_of?(Array) && args[0].kind_of?(Hash)
|
@@ -15,7 +16,7 @@ module JennCad::Primitives
|
|
15
16
|
end
|
16
17
|
|
17
18
|
args[:z] ||= args[:h]
|
18
|
-
|
19
|
+
args[:center_z] ||= args[:cz]
|
19
20
|
@opts = {
|
20
21
|
d: 0,
|
21
22
|
d1: nil,
|
@@ -24,7 +25,7 @@ module JennCad::Primitives
|
|
24
25
|
r2: nil,
|
25
26
|
z: nil,
|
26
27
|
r: 0,
|
27
|
-
|
28
|
+
center_z: false,
|
28
29
|
margins: {
|
29
30
|
r: 0,
|
30
31
|
d: 0,
|
@@ -43,22 +44,16 @@ module JennCad::Primitives
|
|
43
44
|
handle_fn
|
44
45
|
@dimensions = [:x, :y, :z]
|
45
46
|
set_anchors
|
47
|
+
@csize = Size.new(x: @opts[:d], y: @opts[:d], d: @opts[:d], z: @z)
|
46
48
|
end
|
47
49
|
|
48
50
|
def set_anchors
|
49
51
|
set_anchors_2d
|
52
|
+
set_anchors_z
|
50
53
|
# TODO: figure out if we also want to have "corners"
|
51
54
|
# - possibly move it like a cube
|
52
55
|
# - points at 45 ° angles might not be that useful unless you can get the point on the circle at a given angle
|
53
56
|
# - inner/outer points could be useful for small $fn values
|
54
|
-
|
55
|
-
if @opts[:cz]
|
56
|
-
set_anchor :bottom_face, z: -@z/2.0
|
57
|
-
set_anchor :top_face, z: @z/2.0
|
58
|
-
else
|
59
|
-
set_anchor :bottom_face, z: 0
|
60
|
-
set_anchor :top_face, z: @z
|
61
|
-
end
|
62
57
|
end
|
63
58
|
|
64
59
|
def openscad_params
|
@@ -78,7 +73,7 @@ module JennCad::Primitives
|
|
78
73
|
# Centers the cylinder around it's center point by height
|
79
74
|
# This will transform the cylinder around the center point.
|
80
75
|
def cz
|
81
|
-
@opts[:
|
76
|
+
@opts[:center_z] = true
|
82
77
|
@transformations ||= []
|
83
78
|
@transformations << Move.new(z: -@z / 2.0)
|
84
79
|
set_anchors
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module JennCad::Primitives
|
2
|
+
include ZIsh
|
2
3
|
attr_accessor :center_bool, :convexity, :twist, :slices
|
4
|
+
|
3
5
|
class LinearExtrude < JennCad::Thing
|
4
6
|
def initialize(part, args={})
|
5
7
|
@transformations = []
|
@@ -7,22 +9,28 @@ module JennCad::Primitives
|
|
7
9
|
if args.kind_of? Numeric
|
8
10
|
args = {h: args}
|
9
11
|
end
|
10
|
-
|
11
12
|
@z = args[:h] || args[:height] || args[:z]
|
13
|
+
@csize = Size.new(z: @z).add(part.csize)
|
14
|
+
|
12
15
|
@center_bool = args[:center]
|
13
16
|
@convexity = args[:convexity]
|
14
17
|
@twist = args[:twist]
|
15
18
|
@slices = args[:slices]
|
16
19
|
@fn = args[:fn]
|
17
20
|
@opts = {
|
21
|
+
center_z: false,
|
18
22
|
margins: {
|
19
23
|
z: 0,
|
20
24
|
}
|
21
25
|
}.deep_merge(args)
|
26
|
+
set_anchors_z
|
27
|
+
|
28
|
+
@x = part.x
|
29
|
+
@y = part.y
|
22
30
|
end
|
23
31
|
|
24
32
|
def height
|
25
|
-
@z.to_d +
|
33
|
+
@z.to_d + z_margin
|
26
34
|
end
|
27
35
|
|
28
36
|
def openscad_params
|
@@ -44,6 +44,8 @@ module JennCad::Primitives
|
|
44
44
|
feed_opts(parse_xyz_shortcuts(args))
|
45
45
|
end
|
46
46
|
init(args)
|
47
|
+
@d = opts[:d]
|
48
|
+
@csize = Size.new(x: @opts[:x], y: @opts[:y], z: @opts[:z])
|
47
49
|
|
48
50
|
handle_margins
|
49
51
|
handle_diameter
|
@@ -52,6 +54,7 @@ module JennCad::Primitives
|
|
52
54
|
else
|
53
55
|
@dimensions = [:x, :y]
|
54
56
|
end
|
57
|
+
|
55
58
|
set_anchors
|
56
59
|
end
|
57
60
|
|
@@ -59,28 +62,28 @@ module JennCad::Primitives
|
|
59
62
|
# FIXME: this check needs to be done on object creation
|
60
63
|
# otherwise it fails to position it
|
61
64
|
if @d == 0
|
62
|
-
if @z.to_d > 0
|
65
|
+
if @csize.z.to_d > 0
|
63
66
|
return cube(@opts)
|
64
67
|
else
|
65
68
|
return square(@opts)
|
66
69
|
end
|
67
70
|
end
|
68
71
|
# make diameter not bigger than any side
|
69
|
-
d = [@d, @x, @y].min
|
72
|
+
d = [@d, @csize.x, @csize.y].min
|
70
73
|
res = HullObject.new(
|
71
74
|
circle(d: d),
|
72
|
-
circle(d: d).move(x: @x - d, y: 0),
|
73
|
-
circle(d: d).move(x: 0, y: @y - d),
|
74
|
-
circle(d: d).move(x: @x - d, y: @y - d),
|
75
|
+
circle(d: d).move(x: @csize.x - d, y: 0),
|
76
|
+
circle(d: d).move(x: 0, y: @csize.y - d),
|
77
|
+
circle(d: d).move(x: @csize.x - d, y: @csize.y - d),
|
75
78
|
)
|
76
|
-
res = res.move(
|
79
|
+
res = res.move(xyh: d)
|
77
80
|
|
78
81
|
@opts[:flat_edges].each do |edge|
|
79
82
|
res += apply_flat_edge(edge)
|
80
83
|
end
|
81
84
|
|
82
|
-
if @z.to_d > 0
|
83
|
-
res = res.extrude(z: @z + z_margin)
|
85
|
+
if @csize.z.to_d > 0
|
86
|
+
res = res.extrude(z: @csize.z + z_margin)
|
84
87
|
end
|
85
88
|
|
86
89
|
res = union(res) # put everything we have in a parent union that we can apply the transformations of this object of
|
@@ -103,13 +106,13 @@ module JennCad::Primitives
|
|
103
106
|
def apply_flat_edge(edge)
|
104
107
|
case edge
|
105
108
|
when :up, :top
|
106
|
-
square(x: @x, y: @y/2.0).nc.moveh(y:@y)
|
109
|
+
square(x: @csize.x, y: @csize.y/2.0).nc.moveh(y:@csize.y)
|
107
110
|
when :down, :bottom
|
108
|
-
square(x: @x, y: @y/2.0).nc
|
111
|
+
square(x: @csize.x, y: @csize.y/2.0).nc
|
109
112
|
when :right
|
110
|
-
square(x: @x/2.0, y: @y).nc.moveh(x:@x)
|
113
|
+
square(x: @csize.x/2.0, y: @csize.y).nc.moveh(x:@csize.x)
|
111
114
|
when :left
|
112
|
-
square(x: @x/2.0, y: @y).nc
|
115
|
+
square(x: @csize.x/2.0, y: @csize.y).nc
|
113
116
|
else
|
114
117
|
nil
|
115
118
|
end
|
@@ -28,6 +28,8 @@ module JennCad::Primitives
|
|
28
28
|
@x = args[:x]
|
29
29
|
@y = args[:y]
|
30
30
|
@dimensions = [:x, :y]
|
31
|
+
@sits_on = :bottom
|
32
|
+
@csize = Size.new(x: @opts[:x], y: @opts[:y])
|
31
33
|
end
|
32
34
|
|
33
35
|
|
@@ -137,8 +139,6 @@ module JennCad::Primitives
|
|
137
139
|
self
|
138
140
|
end
|
139
141
|
|
140
|
-
|
141
|
-
|
142
142
|
def not_centered
|
143
143
|
@opts[:center] = false
|
144
144
|
set_anchors
|
@@ -162,8 +162,6 @@ module JennCad::Primitives
|
|
162
162
|
end
|
163
163
|
alias :center_y :cy
|
164
164
|
|
165
|
-
|
166
|
-
|
167
165
|
def centered_axis
|
168
166
|
return [:x, :y] if @opts[:center]
|
169
167
|
a = []
|
@@ -174,10 +172,8 @@ module JennCad::Primitives
|
|
174
172
|
end
|
175
173
|
|
176
174
|
def to_openscad
|
177
|
-
self.mh(centered_axis.to_h{|a| [a, -@opts[a]] }) # center cube
|
175
|
+
self.mh(centered_axis.to_h{|a| [a, -@opts[a]] }.merge(prepend: true)) # center cube
|
178
176
|
end
|
179
177
|
|
180
|
-
|
181
|
-
|
182
178
|
end
|
183
179
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module JennCad::Primitives
|
2
|
+
class Text < Primitive
|
3
|
+
attr_accessor :text, :font, :valign, :halign, :size, :spacing, :script, :fn, :direction, :language
|
4
|
+
|
5
|
+
def initialize(args)
|
6
|
+
@text = args[:text]
|
7
|
+
@size = args[:size]
|
8
|
+
@font = args[:font]
|
9
|
+
@valign = args[:valign]
|
10
|
+
@halign = args[:halign]
|
11
|
+
@spacing = args[:spacing]
|
12
|
+
@script = args[:script]
|
13
|
+
@direction = parse_dir(args[:dir] || args[:direction])
|
14
|
+
case @direction
|
15
|
+
when "btt", "ttb"
|
16
|
+
@valign ||= :top
|
17
|
+
@halign ||= :left
|
18
|
+
end
|
19
|
+
|
20
|
+
@language = args[:language]
|
21
|
+
@fn = args[:fn]
|
22
|
+
|
23
|
+
init(args)
|
24
|
+
end
|
25
|
+
|
26
|
+
def parse_dir(dir)
|
27
|
+
case dir.to_s
|
28
|
+
when "x", "ltr"
|
29
|
+
"ltr"
|
30
|
+
when "-x", "xn", "nx", "xi", "rtl"
|
31
|
+
"rtl"
|
32
|
+
when "y", "btt"
|
33
|
+
"btt"
|
34
|
+
when "-y", "yn", "ny", "yi", "ttb"
|
35
|
+
"ttb"
|
36
|
+
else
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def openscad_params
|
42
|
+
res = {}
|
43
|
+
[:text, :font, :valign, :halign, :size, :spacing, :script, :direction, :language, :fn].each do |n|
|
44
|
+
res[n] = self.send n
|
45
|
+
end
|
46
|
+
res
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -1,5 +1,21 @@
|
|
1
1
|
module JennCad::Primitives
|
2
2
|
class UnionObject < BooleanObject
|
3
|
+
def initialize(*parts)
|
4
|
+
super(*parts)
|
5
|
+
|
6
|
+
blacklist = [SubtractObject, IntersectionObject]
|
7
|
+
|
8
|
+
@parts[1..-1].each do |part|
|
9
|
+
blacklist.each do |b|
|
10
|
+
if part.kind_of? b
|
11
|
+
next
|
12
|
+
end
|
13
|
+
end
|
14
|
+
@csize = part.csize
|
15
|
+
# @csize.union(part.csize.clone) if part.csize
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
3
19
|
|
4
20
|
end
|
5
21
|
end
|
data/lib/jenncad/primitives.rb
CHANGED
@@ -16,6 +16,7 @@ require "jenncad/primitives/intersection_object"
|
|
16
16
|
require "jenncad/primitives/projection"
|
17
17
|
require "jenncad/primitives/linear_extrude"
|
18
18
|
require "jenncad/primitives/rotate_extrude"
|
19
|
+
require "jenncad/primitives/text"
|
19
20
|
|
20
21
|
module JennCad
|
21
22
|
include Primitives
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module ZIsh
|
2
|
+
|
3
|
+
def set_anchors_z
|
4
|
+
if @opts[:center_z]
|
5
|
+
set_anchor :bottom_face, z: -z/2.0
|
6
|
+
set_anchor :top_face, z: z/2.0
|
7
|
+
set_anchor :center, x: 0
|
8
|
+
else
|
9
|
+
set_anchor :bottom_face, z: 0
|
10
|
+
set_anchor :top_face, z: z
|
11
|
+
set_anchor :center, zh: z
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def cz
|
16
|
+
if self.respond_to? :nc
|
17
|
+
nc
|
18
|
+
end
|
19
|
+
@opts[:center_z] = true
|
20
|
+
set_anchors_z
|
21
|
+
self
|
22
|
+
end
|
23
|
+
alias :center_z :cz
|
24
|
+
|
25
|
+
def flip_axis(dir)
|
26
|
+
case dir
|
27
|
+
when :bottom
|
28
|
+
nil
|
29
|
+
when :top
|
30
|
+
:z
|
31
|
+
when :left, :right
|
32
|
+
:x
|
33
|
+
when :front, :back
|
34
|
+
:y
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def flip_rotation(dir)
|
39
|
+
case dir
|
40
|
+
when :bottom
|
41
|
+
{}
|
42
|
+
when :left
|
43
|
+
{y: 270}
|
44
|
+
when :top
|
45
|
+
{x: 180}
|
46
|
+
when :right
|
47
|
+
{y: 90}
|
48
|
+
when :front
|
49
|
+
{x: 90}
|
50
|
+
when :back
|
51
|
+
{x: 270}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
data/lib/jenncad/shared.rb
CHANGED
data/lib/jenncad/shortcuts.rb
CHANGED
data/lib/jenncad/thing.rb
CHANGED
@@ -9,17 +9,21 @@ module JennCad
|
|
9
9
|
attr_accessor :angle, :fn
|
10
10
|
attr_accessor :anchors
|
11
11
|
attr_accessor :parent
|
12
|
+
attr_accessor :pos, :csize
|
13
|
+
attr_accessor :sits_on
|
12
14
|
|
13
15
|
def initialize(args={})
|
14
16
|
init(args)
|
15
17
|
end
|
16
18
|
|
17
19
|
def init(args={})
|
20
|
+
@csize = Size.new()
|
18
21
|
@transformations = []
|
19
22
|
# calculated origin; only works for move atm
|
20
23
|
@calc_x = 0
|
21
24
|
@calc_y = 0
|
22
25
|
@calc_z = 0
|
26
|
+
@pos = Point.new
|
23
27
|
@calc_h = args[:z] || 0
|
24
28
|
@anchors = {}
|
25
29
|
@parent = args[:parent] || nil
|
@@ -47,6 +51,11 @@ module JennCad
|
|
47
51
|
self
|
48
52
|
end
|
49
53
|
|
54
|
+
def dbg
|
55
|
+
set_flag(:debug)
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
50
59
|
def cut_to(face, part=nil, args={})
|
51
60
|
an = anchor(face, part)
|
52
61
|
unless an
|
@@ -209,36 +218,50 @@ module JennCad
|
|
209
218
|
rt(z:v)
|
210
219
|
end
|
211
220
|
|
212
|
-
def
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
ref = self.parts.first
|
219
|
-
rz = ref.calc_z + ref.calc_h
|
220
|
-
else
|
221
|
-
ref = self
|
222
|
-
rz = self.z + self.calc_h
|
223
|
-
end
|
221
|
+
def flipc(dir, args={})
|
222
|
+
flip(dir, args.merge(rel: true, center: true))
|
223
|
+
end
|
224
|
+
|
225
|
+
def flip(dir, args={})
|
226
|
+
@sits_on ||= :bottom
|
224
227
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
228
|
+
ro = flip_rotation(dir)
|
229
|
+
flip_rotation(@sits_on).each do |key, val|
|
230
|
+
ro[key] ||= 0
|
231
|
+
ro[key] -= val
|
232
|
+
end
|
233
|
+
unless ro == {}
|
234
|
+
self.moveai(:center).rotate(ro)
|
230
235
|
end
|
231
|
-
end
|
232
236
|
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
+
@opts ||= {}
|
238
|
+
|
239
|
+
if args[:center]
|
240
|
+
if ro == {} # if we didn't move earlier, let's move it now
|
241
|
+
self.moveai(:center)
|
242
|
+
end
|
243
|
+
@opts[:center_z] = true
|
244
|
+
set_anchors_z if self.respond_to? :set_anchors_z
|
245
|
+
else
|
246
|
+
# TODO: fix anchors
|
247
|
+
if debug?
|
248
|
+
$log.info "flip_axis(#{dir}): #{flip_axis(dir)} csize: #{@csize.size}"
|
249
|
+
end
|
250
|
+
|
251
|
+
case flip_axis(dir)
|
252
|
+
when :x
|
253
|
+
self.move(zh: @csize.x)
|
254
|
+
when :y
|
255
|
+
self.move(zh: @csize.y)
|
256
|
+
when :z
|
257
|
+
self.move(zh: @csize.z)
|
258
|
+
end
|
259
|
+
@opts[:center_z] = false
|
260
|
+
end
|
261
|
+
@sits_on = dir
|
237
262
|
|
238
|
-
|
239
|
-
flip(:y)
|
263
|
+
self
|
240
264
|
end
|
241
|
-
alias :fy :flip_y
|
242
265
|
|
243
266
|
def radians(a)
|
244
267
|
a.to_d/180.0*PI
|
@@ -263,6 +286,7 @@ module JennCad
|
|
263
286
|
self.move(x:-x,y:-y,z:-z).rotate(args).move(x:x,y:y,z:z)
|
264
287
|
end
|
265
288
|
|
289
|
+
# Deprecated, moved to Point
|
266
290
|
def parse_xyz_shortcuts(args)
|
267
291
|
unless args.kind_of? Hash
|
268
292
|
$log.warn "parse_xyz_shortcuts called for type #{args.class} #{args.inspect}"
|
@@ -328,34 +352,44 @@ module JennCad
|
|
328
352
|
x,y,z = args
|
329
353
|
return move(x:x, y:y, z:z)
|
330
354
|
end
|
331
|
-
args = parse_xyz_shortcuts(args)
|
332
355
|
|
333
|
-
|
356
|
+
chain = if args[:chain]
|
357
|
+
args[:chain]
|
358
|
+
else
|
359
|
+
$jenncad_profile.chain_moves
|
360
|
+
end
|
361
|
+
|
362
|
+
point = Point.new(args)
|
363
|
+
|
364
|
+
if point.zero?
|
334
365
|
return self
|
335
366
|
end
|
367
|
+
pre = args[:prepend]
|
368
|
+
args = point.to_h
|
336
369
|
|
337
370
|
@transformations ||= []
|
338
|
-
if
|
339
|
-
@transformations.
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
chain = if args[:chain]
|
344
|
-
args[:chain]
|
371
|
+
if pre
|
372
|
+
lt = @transformations.first
|
373
|
+
if lt && lt.class == Move && chain == false
|
374
|
+
$log.debug "#{self} at move(prepend): Adding to first move #{lt.inspect} , args: #{args}" if self.debug?
|
375
|
+
lt.pos.add(point)
|
345
376
|
else
|
346
|
-
|
377
|
+
@transformations.prepend(Move.new(pos: point))
|
347
378
|
end
|
379
|
+
else
|
380
|
+
lt = @transformations.last
|
348
381
|
|
349
382
|
if lt && lt.class == Move && chain == false
|
350
383
|
$log.debug "#{self} at move: Adding to previous move #{lt.inspect} , args: #{args}" if self.debug?
|
351
|
-
lt.
|
352
|
-
lt.y += args[:y].to_d
|
353
|
-
lt.z += args[:z].to_d
|
384
|
+
lt.pos.add(point) # TODO: figure out why this doesn't work on export
|
354
385
|
else
|
355
386
|
$log.debug "#{self} at move: Adding move of #{args} to transformations" if self.debug?
|
356
|
-
@transformations << Move.new(
|
387
|
+
@transformations << Move.new(pos: point)
|
357
388
|
end
|
358
389
|
end
|
390
|
+
@pos ||= Point.new
|
391
|
+
@pos.add(point)
|
392
|
+
# NOTE: this needs more migration so everythign runs over point
|
359
393
|
@calc_x += args[:x].to_d
|
360
394
|
@calc_y += args[:y].to_d
|
361
395
|
@calc_z += args[:z].to_d
|
@@ -387,6 +421,7 @@ module JennCad
|
|
387
421
|
if key.kind_of? Hash
|
388
422
|
an = key
|
389
423
|
else
|
424
|
+
thing ||= self
|
390
425
|
an = anchor(key, thing, args)
|
391
426
|
end
|
392
427
|
unless an
|
@@ -394,7 +429,10 @@ module JennCad
|
|
394
429
|
an = {} # this will move by 0,0 and still display the block
|
395
430
|
end
|
396
431
|
part.movei(an)
|
397
|
-
|
432
|
+
bl = block.yield
|
433
|
+
unless bl == nil
|
434
|
+
part = bl.move(an)
|
435
|
+
end
|
398
436
|
end
|
399
437
|
part
|
400
438
|
end
|
@@ -443,11 +481,14 @@ module JennCad
|
|
443
481
|
x,y,z = args
|
444
482
|
args = {x: x, y: y, z: z}
|
445
483
|
end
|
446
|
-
|
447
|
-
|
484
|
+
to = {}
|
485
|
+
args.each do |key, val|
|
486
|
+
to[key] = val.to_d / 2.0 if val.kind_of? Numeric
|
448
487
|
end
|
488
|
+
to[:chain] = args[:chain]
|
489
|
+
to[:prepend] = args[:prepend]
|
449
490
|
|
450
|
-
move(
|
491
|
+
move(to)
|
451
492
|
end
|
452
493
|
alias :mh :moveh
|
453
494
|
|
@@ -465,11 +506,9 @@ module JennCad
|
|
465
506
|
|
466
507
|
def movei(args={})
|
467
508
|
to = {}
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
end
|
472
|
-
end
|
509
|
+
args.each do |key, val|
|
510
|
+
to[key] = val.to_d * -1 if val.kind_of? Numeric
|
511
|
+
end
|
473
512
|
to[:chain] = args[:chain]
|
474
513
|
move(to)
|
475
514
|
end
|
data/lib/jenncad/version.rb
CHANGED
data/lib/jenncad.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "pp"
|
1
2
|
require "logger"
|
2
3
|
$log = Logger.new(STDOUT)
|
3
4
|
|
@@ -18,6 +19,7 @@ JennCad::ProfileLoader.new
|
|
18
19
|
|
19
20
|
|
20
21
|
require "jenncad/patches/array"
|
22
|
+
require "jenncad/position"
|
21
23
|
require "jenncad/thing"
|
22
24
|
require "jenncad/part"
|
23
25
|
require "jenncad/project"
|
data/todo.txt
CHANGED
@@ -24,14 +24,38 @@ Features wanted
|
|
24
24
|
- but also, when you have a part that can be mounted in any top/bottom direction, you always end up having the bolts facing the wrong direction..
|
25
25
|
- Bolts should be able to also make thread inserts
|
26
26
|
|
27
|
+
- Bolts / Nuts by default should be able to use as mixin, i.e.
|
28
|
+
cylinder(Nut::M3)
|
29
|
+
slot(Nut::M5, x: 10)
|
30
|
+
|
31
|
+
possbibly M* like
|
32
|
+
cylinder(M4)
|
33
|
+
or
|
34
|
+
cylinder(M4, h: 25)
|
35
|
+
|
36
|
+
Possibly via symbols
|
37
|
+
cylinder(:m4, h: 30)
|
38
|
+
cylinder(:m4, :nut)
|
39
|
+
|
40
|
+
slot(:m5, :nut, x: 10)
|
41
|
+
|
42
|
+
|
27
43
|
8.5.22:
|
28
44
|
- need an easy way to switch between faces on an object to work efficiently in a 2.5D way
|
29
45
|
i.e. I worked on a part stacking a few things, added a cube along and now wanted to use inner_anchors for the y face for screws. it was easier to make anchors manually for the prototype
|
46
|
+
[#at functionality is half-way there; would be great to have this for rotation as well]
|
30
47
|
|
31
48
|
|
49
|
+
23.5.22:
|
50
|
+
- get slice of circle (input angle, output angle)
|
51
|
+
- skip stl build for part
|
52
|
+
- at doesn't work well if you need to mirror a part
|
53
|
+
-> anchors need to be able to do flipping, possibly rotation
|
32
54
|
|
33
55
|
|
34
56
|
|
57
|
+
24.5.22
|
58
|
+
- multithreading output building
|
35
59
|
|
36
60
|
other awful things
|
37
61
|
===================
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jenncad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.pre.
|
4
|
+
version: 1.0.0.pre.alpha22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jennifer Glauche
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: geo3d
|
@@ -128,6 +128,7 @@ files:
|
|
128
128
|
- lib/jenncad/features/stl_import.rb
|
129
129
|
- lib/jenncad/part.rb
|
130
130
|
- lib/jenncad/patches/array.rb
|
131
|
+
- lib/jenncad/position.rb
|
131
132
|
- lib/jenncad/primitives.rb
|
132
133
|
- lib/jenncad/primitives/boolean_object.rb
|
133
134
|
- lib/jenncad/primitives/circle.rb
|
@@ -146,6 +147,7 @@ files:
|
|
146
147
|
- lib/jenncad/primitives/sphere.rb
|
147
148
|
- lib/jenncad/primitives/square.rb
|
148
149
|
- lib/jenncad/primitives/subtract_object.rb
|
150
|
+
- lib/jenncad/primitives/text.rb
|
149
151
|
- lib/jenncad/primitives/union_object.rb
|
150
152
|
- lib/jenncad/profile_loader.rb
|
151
153
|
- lib/jenncad/project.rb
|
@@ -153,6 +155,7 @@ files:
|
|
153
155
|
- lib/jenncad/shared.rb
|
154
156
|
- lib/jenncad/shared/circle_ish.rb
|
155
157
|
- lib/jenncad/shared/cube_ish.rb
|
158
|
+
- lib/jenncad/shared/z_ish.rb
|
156
159
|
- lib/jenncad/shortcuts.rb
|
157
160
|
- lib/jenncad/thing.rb
|
158
161
|
- lib/jenncad/transformation/color.rb
|