jenncad 1.0.0.pre.alpha14 → 1.0.0.pre.alpha17
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/commands.rb +6 -6
- data/lib/jenncad/exporters/openscad.rb +7 -3
- data/lib/jenncad/features/aggregation.rb +1 -0
- 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/part.rb +46 -1
- data/lib/jenncad/primitives/boolean_object.rb +5 -0
- data/lib/jenncad/primitives/circle.rb +102 -4
- data/lib/jenncad/primitives/cube.rb +9 -140
- data/lib/jenncad/primitives/cylinder.rb +31 -45
- data/lib/jenncad/primitives/linear_extrude.rb +1 -1
- data/lib/jenncad/primitives/polygon.rb +5 -2
- data/lib/jenncad/primitives/polyhedron.rb +35 -0
- data/lib/jenncad/primitives/primitive.rb +20 -1
- data/lib/jenncad/primitives/rounded_cube.rb +44 -14
- data/lib/jenncad/primitives/slot.rb +69 -6
- data/lib/jenncad/primitives/square.rb +181 -0
- data/lib/jenncad/primitives/subtract_object.rb +21 -9
- data/lib/jenncad/primitives.rb +2 -0
- data/lib/jenncad/shortcuts.rb +18 -3
- data/lib/jenncad/thing.rb +160 -7
- data/lib/jenncad/version.rb +1 -1
- data/lib/jenncad.rb +0 -1
- data/todo.txt +6 -10
- metadata +5 -2
data/lib/jenncad/shortcuts.rb
CHANGED
@@ -3,6 +3,11 @@ module JennCad
|
|
3
3
|
Circle.new(args).set_parent(self)
|
4
4
|
end
|
5
5
|
|
6
|
+
def square(args)
|
7
|
+
Square.new(args).set_parent(self)
|
8
|
+
end
|
9
|
+
alias :sq :square
|
10
|
+
|
6
11
|
def cylinder(*args)
|
7
12
|
Cylinder.new(args).set_parent(self)
|
8
13
|
end
|
@@ -18,6 +23,10 @@ module JennCad
|
|
18
23
|
Polygon.new(args).set_parent(self)
|
19
24
|
end
|
20
25
|
|
26
|
+
def polyhedron(args)
|
27
|
+
Polyhedron.new(args).set_parent(self)
|
28
|
+
end
|
29
|
+
|
21
30
|
def slot(*args)
|
22
31
|
Slot.new(args).set_parent(self)
|
23
32
|
end
|
@@ -32,6 +41,7 @@ module JennCad
|
|
32
41
|
end
|
33
42
|
alias :rcube :rounded_cube
|
34
43
|
alias :rc :rounded_cube
|
44
|
+
alias :rsq :rounded_cube
|
35
45
|
|
36
46
|
# import/use OpenScad library
|
37
47
|
def import(import,name,args)
|
@@ -93,8 +103,8 @@ module JennCad
|
|
93
103
|
private
|
94
104
|
def boolean_operation(part, klass)
|
95
105
|
if part.respond_to? :transformations
|
96
|
-
#
|
97
|
-
part =
|
106
|
+
# Clone the part in place
|
107
|
+
part = part.fix
|
98
108
|
end
|
99
109
|
|
100
110
|
case self
|
@@ -103,7 +113,12 @@ module JennCad
|
|
103
113
|
when klass
|
104
114
|
add_or_new(part)
|
105
115
|
else
|
106
|
-
|
116
|
+
own_part = if self.respond_to? :transformations
|
117
|
+
self.fix # clone self
|
118
|
+
else
|
119
|
+
self
|
120
|
+
end
|
121
|
+
klass.new(own_part,part)
|
107
122
|
end
|
108
123
|
end
|
109
124
|
end
|
data/lib/jenncad/thing.rb
CHANGED
@@ -11,6 +11,10 @@ module JennCad
|
|
11
11
|
attr_accessor :parent
|
12
12
|
|
13
13
|
def initialize(args={})
|
14
|
+
init(args)
|
15
|
+
end
|
16
|
+
|
17
|
+
def init(args={})
|
14
18
|
@transformations = []
|
15
19
|
# calculated origin; only works for move atm
|
16
20
|
@calc_x = 0
|
@@ -18,7 +22,7 @@ module JennCad
|
|
18
22
|
@calc_z = 0
|
19
23
|
@calc_h = args[:z] || 0
|
20
24
|
@anchors = {}
|
21
|
-
@parent = args[:parent]
|
25
|
+
@parent = args[:parent] || nil
|
22
26
|
@opts ||= args
|
23
27
|
@cache = nil
|
24
28
|
end
|
@@ -33,25 +37,102 @@ module JennCad
|
|
33
37
|
@opts[key] = val
|
34
38
|
end
|
35
39
|
|
40
|
+
def set_flag(key)
|
41
|
+
set_option(key, true)
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
def unset_flag(key)
|
46
|
+
set_option(key, false)
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def cut_to(face, part=nil, args={})
|
52
|
+
an = anchor(face, part)
|
53
|
+
unless an
|
54
|
+
$log.error "Cannot find anchor to cut_to"
|
55
|
+
return self
|
56
|
+
end
|
57
|
+
if an[:z].to_d == 0.0
|
58
|
+
$log.error "cut_to only supports cuts to an anchor with Z set. This anchor: #{an}"
|
59
|
+
return self
|
60
|
+
end
|
61
|
+
modify_values(self, z: an[:z].to_d)
|
62
|
+
self.name="#{self.class}_cut_to_#{an[:z].to_f}"
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
def modify_values(parts, value, opts = {})
|
67
|
+
case parts
|
68
|
+
when Array
|
69
|
+
parts.each do |pa|
|
70
|
+
modify_values(pa, value, opts)
|
71
|
+
end
|
72
|
+
else
|
73
|
+
if parts.kind_of?(BooleanObject)
|
74
|
+
modify_values(parts.only_additives_of(parts), value, opts)
|
75
|
+
elsif parts.kind_of?(Part)
|
76
|
+
modify_values(parts.part, value, opts)
|
77
|
+
modify_values(parts.get_contents, value, opts)
|
78
|
+
parts.modify_values!(value, opts)
|
79
|
+
elsif parts.kind_of?(Primitive)
|
80
|
+
parts.modify_values!(value, opts)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def modify_values!(values, opts)
|
86
|
+
$log.info "Modify value! #{self.class} #{values}" if self.debug?
|
87
|
+
values.each do |key, val|
|
88
|
+
if @opts
|
89
|
+
case opts[:mode]
|
90
|
+
when :add
|
91
|
+
@opts[key] = @opts[key].to_d + val.to_d
|
92
|
+
when :sub
|
93
|
+
@opts[key] = @opts[key].to_d - val.to_d
|
94
|
+
else
|
95
|
+
@opts[key] = val
|
96
|
+
end
|
97
|
+
end
|
98
|
+
if self.respond_to? key
|
99
|
+
self.send("#{key}=", @opts[key])
|
100
|
+
end
|
101
|
+
end
|
102
|
+
$log.info "Modified value now: #{self.inspect}" if self.debug?
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
def debug?
|
107
|
+
option(:debug) || false
|
108
|
+
end
|
109
|
+
|
110
|
+
def fixate
|
111
|
+
Marshal.load(Marshal.dump(self))
|
112
|
+
end
|
113
|
+
alias :fix :fixate
|
114
|
+
|
36
115
|
def set_parent(parent)
|
37
116
|
@parent = parent
|
38
117
|
self
|
39
118
|
end
|
40
119
|
|
41
|
-
def anchor(name, thing=nil)
|
120
|
+
def anchor(name, thing=nil, args={})
|
42
121
|
if thing
|
43
|
-
res = thing.anchor(name)
|
122
|
+
res = thing.anchor(name, nil, args)
|
44
123
|
return res unless res.nil?
|
45
124
|
end
|
46
125
|
@anchors ||= {}
|
47
126
|
if anch = @anchors[name]
|
48
127
|
return anch
|
128
|
+
elsif args[:fail_quick] && args[:fail_quick] == true
|
129
|
+
return
|
49
130
|
elsif @parent
|
50
131
|
return @parent.anchor(name)
|
51
132
|
elsif self.respond_to? :get_contents
|
52
133
|
con = get_contents
|
53
134
|
if con.respond_to? :anchor
|
54
|
-
con.anchor(name)
|
135
|
+
con.anchor(name, nil, fail_quick: true)
|
55
136
|
end
|
56
137
|
end
|
57
138
|
end
|
@@ -64,6 +145,32 @@ module JennCad
|
|
64
145
|
end
|
65
146
|
alias :sa :set_anchor
|
66
147
|
|
148
|
+
def set_anchor_from(name, new_name, args={})
|
149
|
+
unless name.kind_of? Symbol or name.kind_of? String
|
150
|
+
$log.error "set_anchor_from: name must be a string or symbol. Supplied: #{name}"
|
151
|
+
return
|
152
|
+
end
|
153
|
+
unless new_name.kind_of? Symbol or new_name.kind_of? String
|
154
|
+
$log.error "set_anchor_from: new_name must be a string or symbol. Supplied: #{new_name}"
|
155
|
+
return
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
a = anchor(name, args[:from]).dup
|
160
|
+
if !a
|
161
|
+
$log.error "set_anchor_from couldn't find anchor #{name}"
|
162
|
+
return
|
163
|
+
end
|
164
|
+
|
165
|
+
[:x, :y, :z, :xy, :xz, :xyz, :yz].each do |key|
|
166
|
+
a[key] ||= 0.to_d
|
167
|
+
args[key] ||= 0.to_d
|
168
|
+
a[key] += args[key]
|
169
|
+
end
|
170
|
+
set_anchor new_name, a
|
171
|
+
end
|
172
|
+
alias :saf :set_anchor_from
|
173
|
+
|
67
174
|
def auto_extrude
|
68
175
|
ret = self.extrude
|
69
176
|
ret.set_option(:auto_extrude, true)
|
@@ -180,6 +287,27 @@ module JennCad
|
|
180
287
|
return args
|
181
288
|
end
|
182
289
|
|
290
|
+
# reset last move
|
291
|
+
def reset_last_move
|
292
|
+
lt = @transformations.last
|
293
|
+
unless lt.class == Move
|
294
|
+
$log.error "Tried to call rst_move but last object is a #{lt.class}"
|
295
|
+
return self
|
296
|
+
end
|
297
|
+
@transformations.delete_at(-1)
|
298
|
+
|
299
|
+
self
|
300
|
+
end
|
301
|
+
alias :rstlm :reset_last_move
|
302
|
+
|
303
|
+
# resets all transformations
|
304
|
+
def reset
|
305
|
+
@transformations = []
|
306
|
+
self
|
307
|
+
end
|
308
|
+
alias :rst :reset
|
309
|
+
|
310
|
+
|
183
311
|
def move(args={})
|
184
312
|
return self if args.nil? or args.empty?
|
185
313
|
|
@@ -206,10 +334,12 @@ module JennCad
|
|
206
334
|
end
|
207
335
|
|
208
336
|
if lt && lt.class == Move && chain == false
|
337
|
+
$log.debug "#{self} at move: Adding to previous move #{lt.inspect} , args: #{args}" if self.debug?
|
209
338
|
lt.x += args[:x].to_d
|
210
339
|
lt.y += args[:y].to_d
|
211
340
|
lt.z += args[:z].to_d
|
212
341
|
else
|
342
|
+
$log.debug "#{self} at move: Adding move of #{args} to transformations" if self.debug?
|
213
343
|
@transformations << Move.new(args)
|
214
344
|
end
|
215
345
|
end
|
@@ -240,7 +370,7 @@ module JennCad
|
|
240
370
|
thing = nil
|
241
371
|
end
|
242
372
|
|
243
|
-
an = anchor(key, thing)
|
373
|
+
an = anchor(key, thing, args)
|
244
374
|
|
245
375
|
unless an
|
246
376
|
$log.error "Error: Anchor #{key} not found"
|
@@ -258,6 +388,7 @@ module JennCad
|
|
258
388
|
end
|
259
389
|
end
|
260
390
|
end
|
391
|
+
alias :ma :movea
|
261
392
|
|
262
393
|
# move to anchor - inverted
|
263
394
|
def moveai(key, thing=nil, args={})
|
@@ -268,7 +399,7 @@ module JennCad
|
|
268
399
|
args[:inverted] = true
|
269
400
|
movea(key, thing, args)
|
270
401
|
end
|
271
|
-
|
402
|
+
alias :mai :moveai
|
272
403
|
|
273
404
|
# move half
|
274
405
|
def moveh(args={})
|
@@ -488,6 +619,8 @@ module JennCad
|
|
488
619
|
return "##{args}"
|
489
620
|
when String
|
490
621
|
return args
|
622
|
+
when Symbol
|
623
|
+
return args.to_s
|
491
624
|
end
|
492
625
|
nil
|
493
626
|
end
|
@@ -512,7 +645,7 @@ module JennCad
|
|
512
645
|
return @parts unless @parts.nil?
|
513
646
|
|
514
647
|
if @cache
|
515
|
-
return @cache
|
648
|
+
return @cache unless option(:no_cache) == true
|
516
649
|
end
|
517
650
|
|
518
651
|
if self.respond_to? :part
|
@@ -624,5 +757,25 @@ module JennCad
|
|
624
757
|
end
|
625
758
|
end
|
626
759
|
|
760
|
+
def to_mod(name)
|
761
|
+
a = Aggregation.new(name, self)
|
762
|
+
a.transformations = @transformations
|
763
|
+
a
|
764
|
+
end
|
765
|
+
|
766
|
+
def is_2d?
|
767
|
+
!is_3d?
|
768
|
+
end
|
769
|
+
|
770
|
+
def is_3d?
|
771
|
+
if self.respond_to?(:dimensions) && self.dimensions
|
772
|
+
return true if self.dimensions && self.dimensions.include?(:z)
|
773
|
+
else
|
774
|
+
# assume true if not set
|
775
|
+
return true
|
776
|
+
end
|
777
|
+
false
|
778
|
+
end
|
779
|
+
|
627
780
|
end
|
628
781
|
end
|
data/lib/jenncad/version.rb
CHANGED
data/lib/jenncad.rb
CHANGED
data/todo.txt
CHANGED
@@ -11,16 +11,6 @@
|
|
11
11
|
Features wanted
|
12
12
|
===================
|
13
13
|
28.4.22:
|
14
|
-
- Parts often come with 4 holes around a center, and I often do something like:
|
15
|
-
|
16
|
-
[-1, 1].each do |i|
|
17
|
-
[-1, 1].each do |j|
|
18
|
-
res += @bolt.cut.move(x: @hole_center*i, y: @hole_center*j)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
there should be a shorter way to do this.
|
23
|
-
|
24
14
|
|
25
15
|
- instead of moving Bolts output, make it the default to make their positions an anchor
|
26
16
|
|
@@ -34,6 +24,12 @@ there should be a shorter way to do this.
|
|
34
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..
|
35
25
|
- Bolts should be able to also make thread inserts
|
36
26
|
|
27
|
+
8.5.22:
|
28
|
+
- need an easy way to switch between faces on an object to work efficiently in a 2.5D way
|
29
|
+
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
|
30
|
+
|
31
|
+
|
32
|
+
|
37
33
|
|
38
34
|
|
39
35
|
|
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.alpha17
|
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-15 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
|
@@ -136,12 +137,14 @@ files:
|
|
136
137
|
- lib/jenncad/primitives/intersection_object.rb
|
137
138
|
- lib/jenncad/primitives/linear_extrude.rb
|
138
139
|
- lib/jenncad/primitives/polygon.rb
|
140
|
+
- lib/jenncad/primitives/polyhedron.rb
|
139
141
|
- lib/jenncad/primitives/primitive.rb
|
140
142
|
- lib/jenncad/primitives/projection.rb
|
141
143
|
- lib/jenncad/primitives/rotate_extrude.rb
|
142
144
|
- lib/jenncad/primitives/rounded_cube.rb
|
143
145
|
- lib/jenncad/primitives/slot.rb
|
144
146
|
- lib/jenncad/primitives/sphere.rb
|
147
|
+
- lib/jenncad/primitives/square.rb
|
145
148
|
- lib/jenncad/primitives/subtract_object.rb
|
146
149
|
- lib/jenncad/primitives/union_object.rb
|
147
150
|
- lib/jenncad/profile_loader.rb
|