jenncad 1.0.0.pre.alpha14 → 1.0.0.pre.alpha15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jenncad/features/climb.rb +2 -0
- data/lib/jenncad/features/multiples_of.rb +14 -0
- data/lib/jenncad/features/path.rb +27 -20
- data/lib/jenncad/features.rb +2 -0
- data/lib/jenncad/primitives/boolean_object.rb +5 -0
- data/lib/jenncad/primitives/cube.rb +7 -0
- data/lib/jenncad/primitives/cylinder.rb +33 -1
- data/lib/jenncad/shortcuts.rb +8 -3
- data/lib/jenncad/thing.rb +37 -0
- data/lib/jenncad/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3eebd115b8e6783b61fff33f1b002f935f3d2c2023df70df9ff3b9850f12245f
|
4
|
+
data.tar.gz: 806a99e1195f98ee1e8450030f9e2809c11217af7bf19e8cac88ad9408146a40
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a120ac12bfe18f3532560c10452ae9460d21bd8ba2e4d287669b9b23cdf903476541fed341b81ce7feb8e906ccc8087a7a0f46f5f49e63d66b6421cd8e4d0984
|
7
|
+
data.tar.gz: 06e239cea5a153ecb3b8ab1873574bc8d9a03e51d1c0d75e5fe72f393e1584971bbc2ba388d9da82ce58cc79c2f949e206962be9052da29b0a24e351c176a53d
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module JennCad
|
2
2
|
class RoundCorner
|
3
3
|
attr_accessor :start_point, :end_point, :input_a, :output_a, :a, :l, :od, :id, :thing, :angle, :current_angle, :direction, :from, :ccw
|
4
|
-
def initialize(args
|
4
|
+
def initialize(args)
|
5
5
|
@start_point = args[:start_point]
|
6
6
|
@end_point = args[:end_point]
|
7
7
|
@a = args[:a]
|
@@ -11,7 +11,13 @@ module JennCad
|
|
11
11
|
@id = args[:id]
|
12
12
|
@input_a = args[:input_a] || 0
|
13
13
|
@output_a = args[:output_a] || 0
|
14
|
-
|
14
|
+
thing = Marshal.load(args[:thing])
|
15
|
+
|
16
|
+
@thing_dia = thing.d || thing.y
|
17
|
+
unless @thing_dia
|
18
|
+
$log.error "ERROR: cannot find diameter or y of thing #{thing.inspect}"
|
19
|
+
return
|
20
|
+
end
|
15
21
|
@angle = args[:angle]
|
16
22
|
@current_angle = args[:current_angle]
|
17
23
|
@direction = args[:direction]
|
@@ -57,11 +63,7 @@ module JennCad
|
|
57
63
|
end
|
58
64
|
|
59
65
|
def positions
|
60
|
-
td =
|
61
|
-
unless td
|
62
|
-
puts "ERROR: cannot find diameter or y of thing #{thing.yield.inspect}"
|
63
|
-
return
|
64
|
-
end
|
66
|
+
td = @thing_dia
|
65
67
|
l = td + @id
|
66
68
|
l2 = td / 2.0 + @id / 2.0
|
67
69
|
r = 0
|
@@ -101,7 +103,7 @@ module JennCad
|
|
101
103
|
end
|
102
104
|
|
103
105
|
def part
|
104
|
-
d =
|
106
|
+
d = @thing_dia
|
105
107
|
len = d * 2 + @id
|
106
108
|
x = Math::sin((@a/180.0)*Math::PI)*len
|
107
109
|
y = Math::cos((@a/180.0)*Math::PI)*len
|
@@ -134,15 +136,15 @@ module JennCad
|
|
134
136
|
end
|
135
137
|
|
136
138
|
class Line
|
137
|
-
attr_accessor :start_point, :end_point, :l, :
|
138
|
-
def initialize(args
|
139
|
+
attr_accessor :start_point, :end_point, :l, :angle, :current_angle, :direction
|
140
|
+
def initialize(args)
|
139
141
|
@start_point = args[:start_point]
|
140
142
|
@end_point = args[:end_point]
|
141
143
|
@angle = args[:angle]
|
142
144
|
@current_angle = args[:current_angle]
|
143
145
|
@direction = args[:direction]
|
144
146
|
@l = args[:l]
|
145
|
-
@thing = thing
|
147
|
+
@thing = args[:thing]
|
146
148
|
end
|
147
149
|
|
148
150
|
def sp_margin(margin)
|
@@ -181,8 +183,8 @@ module JennCad
|
|
181
183
|
|
182
184
|
def part
|
183
185
|
hull(
|
184
|
-
@thing.
|
185
|
-
@thing.
|
186
|
+
Marshal.load(@thing).move(x: @start_point[:x], y: @start_point[:y]),
|
187
|
+
Marshal.load(@thing).move(x: @end_point[:x], y: @end_point[:y])
|
186
188
|
)
|
187
189
|
end
|
188
190
|
end
|
@@ -191,7 +193,7 @@ module JennCad
|
|
191
193
|
|
192
194
|
attr_accessor :elements, :lpos, :thing, :angle, :current_angle, :direction
|
193
195
|
def initialize(args)
|
194
|
-
@thing = args[:part]
|
196
|
+
@thing = store_thing_from(args[:part])
|
195
197
|
@part = new_thing
|
196
198
|
@angle = args[:a] || 0
|
197
199
|
@current_angle = args[:a] || 0
|
@@ -207,10 +209,14 @@ module JennCad
|
|
207
209
|
super(args)
|
208
210
|
end
|
209
211
|
|
210
|
-
def
|
211
|
-
r =
|
212
|
+
def store_thing_from(thing)
|
213
|
+
r = Marshal.load(Marshal.dump(thing)) # make sure we don't edit the object in memory
|
212
214
|
r.transformations = []
|
213
|
-
r
|
215
|
+
Marshal.dump(r)
|
216
|
+
end
|
217
|
+
|
218
|
+
def new_thing
|
219
|
+
Marshal.load(@thing)
|
214
220
|
end
|
215
221
|
|
216
222
|
def corner(args)
|
@@ -232,8 +238,9 @@ module JennCad
|
|
232
238
|
from: args[:from],
|
233
239
|
to: args[:to],
|
234
240
|
a: args[:a],
|
235
|
-
direction: @direction
|
236
|
-
|
241
|
+
direction: @direction,
|
242
|
+
thing: thing,
|
243
|
+
)
|
237
244
|
|
238
245
|
_, ox, oy, x, y = rc.positions
|
239
246
|
@lpos[:x] += x + ox
|
@@ -292,7 +299,7 @@ module JennCad
|
|
292
299
|
return
|
293
300
|
end
|
294
301
|
|
295
|
-
@steps << Line.new(start_point: { x: @lpos[:x], y: @lpos[:y] }, end_point: { x: @lpos[:x] + x, y: @lpos[:y] + y }, angle: @angle, current_angle: @current_angle, direction: @direction, l: l
|
302
|
+
@steps << Line.new(start_point: { x: @lpos[:x], y: @lpos[:y] }, end_point: { x: @lpos[:x] + x, y: @lpos[:y] + y }, angle: @angle, current_angle: @current_angle, direction: @direction, l: l, thing: thing)
|
296
303
|
|
297
304
|
add_lpos({x: x, y: y})
|
298
305
|
end
|
data/lib/jenncad/features.rb
CHANGED
@@ -7,6 +7,9 @@ module JennCad::Primitives
|
|
7
7
|
else
|
8
8
|
@parts = parts
|
9
9
|
end
|
10
|
+
if parts.first && parts.first.respond_to?(:debug?) && parts.first.debug?
|
11
|
+
$log.debug("Creating new #{self.class} for part #{parts}")
|
12
|
+
end
|
10
13
|
|
11
14
|
@parent = @parts.first.parent
|
12
15
|
|
@@ -16,9 +19,11 @@ module JennCad::Primitives
|
|
16
19
|
def add_or_new(part)
|
17
20
|
case @transformations
|
18
21
|
when nil, []
|
22
|
+
$log.debug("adding new part to existing boolean object") if part && part.debug?
|
19
23
|
add(part)
|
20
24
|
self
|
21
25
|
else
|
26
|
+
$log.debug("add_or_new: creating new boolean object") if part.debug?
|
22
27
|
self.class.new(self, part)
|
23
28
|
end
|
24
29
|
end
|
@@ -82,6 +82,13 @@ module JennCad::Primitives
|
|
82
82
|
set_anchor :top_right, x: right, y: top
|
83
83
|
set_anchor :bottom_left, x: left, y: bottom
|
84
84
|
set_anchor :bottom_right, x: right, y: bottom
|
85
|
+
if @opts[:center_z]
|
86
|
+
set_anchor :bottom_face, z: -@z/2.0
|
87
|
+
set_anchor :top_face, z: @z/2.0
|
88
|
+
else
|
89
|
+
set_anchor :bottom_face, z: 0
|
90
|
+
set_anchor :top_face, z: @z
|
91
|
+
end
|
85
92
|
|
86
93
|
# we need to re-do the inner ones, if they were defined
|
87
94
|
if @inner_anchor_defs && @inner_anchor_defs.size > 0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module JennCad::Primitives
|
2
2
|
class Cylinder < Primitive
|
3
|
-
attr_accessor :d, :d1, :d2, :r, :fn
|
3
|
+
attr_accessor :d, :d1, :d2, :r, :fn, :anchors
|
4
4
|
def initialize(args)
|
5
5
|
if args.kind_of?(Array) && args[0].kind_of?(Hash)
|
6
6
|
args = args.first
|
@@ -24,6 +24,7 @@ module JennCad::Primitives
|
|
24
24
|
r2: nil,
|
25
25
|
z: nil,
|
26
26
|
r: 0,
|
27
|
+
cz: false,
|
27
28
|
margins: {
|
28
29
|
r: 0,
|
29
30
|
d: 0,
|
@@ -41,6 +42,35 @@ module JennCad::Primitives
|
|
41
42
|
handle_radius_diameter
|
42
43
|
handle_fn
|
43
44
|
super(args)
|
45
|
+
set_anchors
|
46
|
+
end
|
47
|
+
|
48
|
+
def set_anchors
|
49
|
+
@anchors = {} # reset anchors
|
50
|
+
if @opts[:d]
|
51
|
+
rad = @opts[:d] / 2.0
|
52
|
+
else
|
53
|
+
rad = @opts[:r]
|
54
|
+
end
|
55
|
+
|
56
|
+
# Similar to cube
|
57
|
+
set_anchor :left, x: -rad
|
58
|
+
set_anchor :right, x: rad
|
59
|
+
set_anchor :top, y: rad
|
60
|
+
set_anchor :bottom, y: -rad
|
61
|
+
|
62
|
+
# TODO: figure out if we also want to have "corners"
|
63
|
+
# - possibly move it like a cube
|
64
|
+
# - points at 45 ° angles might not be that useful unless you can get the point on the circle at a given angle
|
65
|
+
# - inner/outer points could be useful for small $fn values
|
66
|
+
|
67
|
+
if @opts[:cz]
|
68
|
+
set_anchor :bottom_face, z: -@z/2.0
|
69
|
+
set_anchor :top_face, z: @z/2.0
|
70
|
+
else
|
71
|
+
set_anchor :bottom_face, z: 0
|
72
|
+
set_anchor :top_face, z: @z
|
73
|
+
end
|
44
74
|
end
|
45
75
|
|
46
76
|
def openscad_params
|
@@ -60,7 +90,9 @@ module JennCad::Primitives
|
|
60
90
|
# Centers the cylinder around it's center point by height
|
61
91
|
# This will transform the cylinder around the center point.
|
62
92
|
def cz
|
93
|
+
@opts[:cz] = true
|
63
94
|
@transformations << Move.new(z: -@z / 2.0)
|
95
|
+
set_anchors
|
64
96
|
self
|
65
97
|
end
|
66
98
|
|
data/lib/jenncad/shortcuts.rb
CHANGED
@@ -93,8 +93,8 @@ module JennCad
|
|
93
93
|
private
|
94
94
|
def boolean_operation(part, klass)
|
95
95
|
if part.respond_to? :transformations
|
96
|
-
#
|
97
|
-
part =
|
96
|
+
# Clone the part in place
|
97
|
+
part = part.fix
|
98
98
|
end
|
99
99
|
|
100
100
|
case self
|
@@ -103,7 +103,12 @@ module JennCad
|
|
103
103
|
when klass
|
104
104
|
add_or_new(part)
|
105
105
|
else
|
106
|
-
|
106
|
+
own_part = if self.respond_to? :transformations
|
107
|
+
self.fix # clone self
|
108
|
+
else
|
109
|
+
self
|
110
|
+
end
|
111
|
+
klass.new(own_part,part)
|
107
112
|
end
|
108
113
|
end
|
109
114
|
end
|
data/lib/jenncad/thing.rb
CHANGED
@@ -33,6 +33,23 @@ module JennCad
|
|
33
33
|
@opts[key] = val
|
34
34
|
end
|
35
35
|
|
36
|
+
def set_flag(key)
|
37
|
+
set_option(key, true)
|
38
|
+
end
|
39
|
+
|
40
|
+
def unset_flag(key)
|
41
|
+
set_option(key, false)
|
42
|
+
end
|
43
|
+
|
44
|
+
def debug?
|
45
|
+
option(:debug) || false
|
46
|
+
end
|
47
|
+
|
48
|
+
def fixate
|
49
|
+
Marshal.load(Marshal.dump(self))
|
50
|
+
end
|
51
|
+
alias :fix :fixate
|
52
|
+
|
36
53
|
def set_parent(parent)
|
37
54
|
@parent = parent
|
38
55
|
self
|
@@ -64,6 +81,22 @@ module JennCad
|
|
64
81
|
end
|
65
82
|
alias :sa :set_anchor
|
66
83
|
|
84
|
+
def set_anchor_from(name, new_name, args={})
|
85
|
+
a = anchor(name).dup
|
86
|
+
if !a
|
87
|
+
log.error "set_anchor_from couldn't find anchor #{name}"
|
88
|
+
return
|
89
|
+
end
|
90
|
+
|
91
|
+
[:x, :y, :z, :xy, :xz, :xyz, :yz].each do |key|
|
92
|
+
a[key] ||= 0.to_d
|
93
|
+
args[key] ||= 0.to_d
|
94
|
+
a[key] += args[key]
|
95
|
+
end
|
96
|
+
set_anchor new_name, a
|
97
|
+
end
|
98
|
+
alias :saf :set_anchor_from
|
99
|
+
|
67
100
|
def auto_extrude
|
68
101
|
ret = self.extrude
|
69
102
|
ret.set_option(:auto_extrude, true)
|
@@ -206,10 +239,12 @@ module JennCad
|
|
206
239
|
end
|
207
240
|
|
208
241
|
if lt && lt.class == Move && chain == false
|
242
|
+
$log.debug "#{self} at move: Adding to previous move #{lt.inspect} , args: #{args}" if self.debug?
|
209
243
|
lt.x += args[:x].to_d
|
210
244
|
lt.y += args[:y].to_d
|
211
245
|
lt.z += args[:z].to_d
|
212
246
|
else
|
247
|
+
$log.debug "#{self} at move: Adding move of #{args} to transformations" if self.debug?
|
213
248
|
@transformations << Move.new(args)
|
214
249
|
end
|
215
250
|
end
|
@@ -488,6 +523,8 @@ module JennCad
|
|
488
523
|
return "##{args}"
|
489
524
|
when String
|
490
525
|
return args
|
526
|
+
when Symbol
|
527
|
+
return args.to_s
|
491
528
|
end
|
492
529
|
nil
|
493
530
|
end
|
data/lib/jenncad/version.rb
CHANGED
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.alpha15
|
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-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: geo3d
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- lib/jenncad/features/climb.rb
|
123
123
|
- lib/jenncad/features/cuttable.rb
|
124
124
|
- lib/jenncad/features/feature.rb
|
125
|
+
- lib/jenncad/features/multiples_of.rb
|
125
126
|
- lib/jenncad/features/openscad_include.rb
|
126
127
|
- lib/jenncad/features/path.rb
|
127
128
|
- lib/jenncad/features/stl_import.rb
|