jenncad 1.0.0.pre.alpha1

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.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +1 -0
  3. data/bin/jenncad +10 -0
  4. data/examples/old/cube.rb +12 -0
  5. data/examples/old/slot.rb +10 -0
  6. data/examples/old/test.rb +18 -0
  7. data/examples/old/test1.rb +21 -0
  8. data/examples/old/test2.rb +9 -0
  9. data/examples/old/test3.rb +15 -0
  10. data/examples/old/test4.rb +17 -0
  11. data/examples/old/test5.rb +31 -0
  12. data/jenncad.gemspec +27 -0
  13. data/lib/jenncad/commands.rb +169 -0
  14. data/lib/jenncad/default_profile.rb +40 -0
  15. data/lib/jenncad/extras/din912.rb +89 -0
  16. data/lib/jenncad/extras/din933.rb +64 -0
  17. data/lib/jenncad/extras/din934.rb +99 -0
  18. data/lib/jenncad/extras/hardware.rb +16 -0
  19. data/lib/jenncad/extras/iso7380.rb +58 -0
  20. data/lib/jenncad/jenncad.rb +3 -0
  21. data/lib/jenncad/openscad.rb +274 -0
  22. data/lib/jenncad/part.rb +14 -0
  23. data/lib/jenncad/patches/array.rb +29 -0
  24. data/lib/jenncad/primitives/aggregation.rb +12 -0
  25. data/lib/jenncad/primitives/boolean_object.rb +76 -0
  26. data/lib/jenncad/primitives/circle.rb +11 -0
  27. data/lib/jenncad/primitives/cube.rb +69 -0
  28. data/lib/jenncad/primitives/cylinder.rb +52 -0
  29. data/lib/jenncad/primitives/hull_object.rb +4 -0
  30. data/lib/jenncad/primitives/intersection_object.rb +4 -0
  31. data/lib/jenncad/primitives/linear_extrude.rb +25 -0
  32. data/lib/jenncad/primitives/openscad_include.rb +11 -0
  33. data/lib/jenncad/primitives/polygon.rb +9 -0
  34. data/lib/jenncad/primitives/primitive.rb +24 -0
  35. data/lib/jenncad/primitives/projection.rb +9 -0
  36. data/lib/jenncad/primitives/rotate_extrude.rb +20 -0
  37. data/lib/jenncad/primitives/rounded_cube.rb +77 -0
  38. data/lib/jenncad/primitives/slot.rb +82 -0
  39. data/lib/jenncad/primitives/sphere.rb +11 -0
  40. data/lib/jenncad/primitives/subtract_object.rb +84 -0
  41. data/lib/jenncad/primitives/union_object.rb +5 -0
  42. data/lib/jenncad/profile_loader.rb +34 -0
  43. data/lib/jenncad/project.rb +28 -0
  44. data/lib/jenncad/register.rb +31 -0
  45. data/lib/jenncad/shortcuts.rb +109 -0
  46. data/lib/jenncad/thing.rb +308 -0
  47. data/lib/jenncad/transformation/color.rb +8 -0
  48. data/lib/jenncad/transformation/mirror.rb +7 -0
  49. data/lib/jenncad/transformation/move.rb +7 -0
  50. data/lib/jenncad/transformation/multmatrix.rb +9 -0
  51. data/lib/jenncad/transformation/rotate.rb +7 -0
  52. data/lib/jenncad/transformation/scale.rb +7 -0
  53. data/lib/jenncad/transformation/transformation.rb +14 -0
  54. data/lib/jenncad/version.rb +4 -0
  55. data/lib/jenncad.rb +73 -0
  56. data/todo.txt +29 -0
  57. metadata +155 -0
@@ -0,0 +1,308 @@
1
+ module JennCad
2
+ class Thing
3
+ attr_accessor :opts
4
+ attr_accessor :parts
5
+ attr_accessor :transformations, :name
6
+ attr_accessor :x, :y, :z, :diameter
7
+ attr_accessor :calc_x, :calc_y, :calc_z, :calc_h
8
+ attr_accessor :shape
9
+ attr_accessor :angle, :cut, :fn
10
+
11
+ def initialize(args={})
12
+ @transformations = []
13
+ # calculated origin; only works for move atm
14
+ @calc_x = 0
15
+ @calc_y = 0
16
+ @calc_z = 0
17
+ @calc_h = args[:z] || 0
18
+ @opts ||= args
19
+ end
20
+
21
+ def option(key)
22
+ @opts ||= {}
23
+ @opts[key]
24
+ end
25
+
26
+ def set_option(key, val)
27
+ @opts ||= {}
28
+ @opts[key] = val
29
+ end
30
+
31
+ def rotate(args)
32
+ @transformations ||= []
33
+ @transformations << Rotate.new(args)
34
+ self
35
+ end
36
+ alias :rt :rotate
37
+
38
+ def center
39
+ return @center if @center
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
48
+ end
49
+
50
+ def flip_x
51
+ if self.kind_of?(BooleanObject)
52
+ ref = self.parts.first
53
+ else
54
+ ref = self
55
+ end
56
+
57
+ self.rotate(y:90).moveh(x: -ref.z, z: ref.x)
58
+ end
59
+ alias :fx :flip_x
60
+
61
+ def flip_y
62
+ if self.kind_of?(BooleanObject)
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)
69
+ end
70
+ alias :fy :flip_y
71
+
72
+ def radians(a)
73
+ a.to_f/180.0*PI
74
+ end
75
+
76
+ # experiment
77
+ def calculate_center_rotation(oldcenter, args)
78
+ x,y,z = oldcenter
79
+ v = Vector.point x,y,z
80
+ rot_x = Matrix.rotation_x(radians(args[:x] || 0))
81
+ rot_y = Matrix.rotation_y(radians(args[:y] || 0))
82
+ rot_z = Matrix.rotation_z(radians(args[:z] || 0))
83
+ v = rot_x*v
84
+ v = rot_y*v
85
+ v = rot_z*v
86
+
87
+ [v.x,v.y,v.z]
88
+ end
89
+
90
+ # todo: check if that works
91
+ def rotate_around(point,args)
92
+ x,y,z= point.x, point.y, point.z
93
+ self.move(x:-x,y:-y,z:-z).rotate(args).move(x:x,y:y,z:z)
94
+ end
95
+
96
+ def move(args)
97
+ if args.kind_of? Array
98
+ x,y,z = args
99
+ return move(x:x, y:y, z:z)
100
+ end
101
+ @transformations ||= []
102
+ if args[:prepend]
103
+ @transformations.prepend(Move.new(args))
104
+ else
105
+ @transformations << Move.new(args)
106
+ end
107
+ @calc_x += args[:x].to_f
108
+ @calc_y += args[:y].to_f
109
+ @calc_z += args[:z].to_f
110
+ self
111
+ end
112
+ alias :translate :move
113
+ alias :m :move
114
+
115
+ def mx(v)
116
+ move(x:v)
117
+ end
118
+
119
+ def my(v)
120
+ move(y:v)
121
+ end
122
+
123
+ def mz(v)
124
+ move(z:v)
125
+ end
126
+
127
+ # move half
128
+ def moveh(args)
129
+ if args.kind_of? Array
130
+ x,y,z = args
131
+ args = {x: x, y: y, z: z}
132
+ end
133
+ args[:x] = args[:x] / 2.0 unless args[:x] == nil
134
+ args[:y] = args[:y] / 2.0 unless args[:y] == nil
135
+ args[:z] = args[:z] / 2.0 unless args[:z] == nil
136
+
137
+ move(args)
138
+ end
139
+ alias :mh :moveh
140
+
141
+ def mhx(v)
142
+ moveh(x:v)
143
+ end
144
+
145
+ def mhy(v)
146
+ moveh(y:v)
147
+ end
148
+
149
+ def mhz(v)
150
+ moveh(z:v)
151
+ end
152
+
153
+ def mirror(args)
154
+ @transformations ||= []
155
+ @transformations << Mirror.new(args)
156
+ self
157
+ end
158
+ alias :mi :mirror
159
+
160
+ def scale(args)
161
+ if args.kind_of? Numeric or args.kind_of? Array
162
+ args = {v:args}
163
+ end
164
+ @transformations ||= []
165
+ @transformations << Scale.new(args)
166
+ self
167
+ end
168
+ alias :sc :scale
169
+
170
+ # copies the transformation of obj to self
171
+ def transform(obj)
172
+ @transformations ||= []
173
+ @transformations += obj.transformations
174
+ self
175
+ end
176
+
177
+ def multmatrix(args)
178
+ @transformations ||= []
179
+ @transformations << Multmatrix.new(args)
180
+ self
181
+ end
182
+
183
+ def skew(args)
184
+ xy = args[:xy] || 0
185
+ x = args[:x] || 0
186
+ yx = args[:yx] || 0
187
+ y = args[:y] || 0
188
+ zx = args[:zx] || 0
189
+ zy = args[:zy] || 0
190
+
191
+ multmatrix([
192
+ [1, xy, x, 0],
193
+ [yx, 1, y, 0],
194
+ [zx, zy, 1, 0],
195
+ [0, 0, 0, 1]
196
+ ])
197
+ end
198
+
199
+ def top_of(other_object)
200
+ self.move(z:other_object.z+other_object.calc_z.to_f)
201
+ end
202
+
203
+ def on_top_of(other_object)
204
+ self.top_of(other_object) + other_object
205
+ end
206
+
207
+ def children_list(stop_at=nil)
208
+ get_children(self, stop_at).flatten
209
+ end
210
+
211
+ def get_children(item, stop_at)
212
+ res = [item]
213
+ if item.respond_to?(:parts) && item.parts != nil
214
+ item.parts.each do |part|
215
+ unless stop_at != nil && part.kind_of?(stop_at)
216
+ res << get_children(part, stop_at)
217
+ end
218
+ end
219
+ end
220
+ res
221
+ end
222
+
223
+ def make_openscad_compatible
224
+ make_openscad_compatible!(self)
225
+ end
226
+
227
+ def make_openscad_compatible!(item)
228
+ if item.respond_to?(:parts) && item.parts != nil
229
+ item.parts.each_with_index do |part, i|
230
+ if part.respond_to? :to_openscad
231
+ item.parts[i] = part.to_openscad
232
+ else
233
+ item.parts[i] = part.make_openscad_compatible
234
+ end
235
+ end
236
+ elsif item.respond_to? :part
237
+ item = item.part.make_openscad_compatible
238
+ end
239
+ if item.respond_to? :to_openscad
240
+ item = item.to_openscad
241
+ end
242
+ item
243
+ end
244
+
245
+ def color(args=nil)
246
+ return option(:color) if args == nil
247
+ if args == :auto
248
+ return auto_color!
249
+ elsif args == :none
250
+ set_option :no_auto_color, true
251
+ return self
252
+ end
253
+ set_option :color, args
254
+ self
255
+ end
256
+
257
+ def auto_color
258
+ if option(:color) == nil && !option(:no_auto_color)
259
+ auto_color!
260
+ end
261
+ end
262
+
263
+ def auto_color!
264
+ color($jenncad_profile.colors.pop)
265
+ end
266
+
267
+ def color_or_fallback
268
+ return option(:fallback_color) if option(:color) == nil
269
+ option(:color)
270
+ end
271
+
272
+ def openscad(file)
273
+ if @parts == nil
274
+ if self.respond_to? :part
275
+ @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
+ end
281
+ end
282
+
283
+ OpenScad.new(self).save(file)
284
+ end
285
+
286
+ def referenced_z
287
+ return false if @z.to_f != 0.0
288
+ return option(:zref) if option(:zref)
289
+ return false
290
+ end
291
+
292
+ def z
293
+ ref = referenced_z
294
+ if ref
295
+ return ref.z.to_f + ref.z_margin.to_f
296
+ end
297
+ @z
298
+ end
299
+
300
+ def z_margin
301
+ if option(:margins)
302
+ return option(:margins)[:z].to_f
303
+ end
304
+ 0.0
305
+ end
306
+
307
+ end
308
+ end
@@ -0,0 +1,8 @@
1
+ module JennCad
2
+ class Color < Transformation
3
+ attr_accessor :color
4
+ def initialize(args)
5
+ @color = args
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module JennCad
2
+ class Mirror < Transformation
3
+ def initialize(args)
4
+ super(args)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module JennCad
2
+ class Move < Transformation
3
+ def initialize(args)
4
+ super(args)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module JennCad
2
+ class Multmatrix < Transformation
3
+ attr_accessor :m
4
+ def initialize(args)
5
+ @m = args
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,7 @@
1
+ module JennCad
2
+ class Rotate < Transformation
3
+ def initialize(args)
4
+ super(args)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module JennCad
2
+ class Scale < Transformation
3
+ def initialize(args)
4
+ super(args)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ module JennCad
2
+ class Transformation
3
+ attr_accessor :x,:y,:z, :coordinates
4
+ def initialize(args)
5
+ @x = args[:x]
6
+ @y = args[:y]
7
+ @z = args[:z]
8
+ end
9
+
10
+ def coordinates
11
+ [@x,@y,@z]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,4 @@
1
+ module JennCad
2
+ VERSION = "1.0.0-alpha1"
3
+ end
4
+
data/lib/jenncad.rb ADDED
@@ -0,0 +1,73 @@
1
+ require "geo3d"
2
+ require "deep_merge"
3
+ require "fileutils"
4
+ require "observr"
5
+ require "hanami/cli"
6
+ require "active_support"
7
+
8
+ include Math
9
+ include Geo3d
10
+
11
+ require "jenncad/version"
12
+ require "jenncad/default_profile"
13
+ require "jenncad/profile_loader"
14
+ JennCad::ProfileLoader.new
15
+
16
+
17
+ require "jenncad/patches/array"
18
+ require "jenncad/thing"
19
+ require "jenncad/part"
20
+ require "jenncad/project"
21
+ require "jenncad/commands"
22
+
23
+ require "jenncad/primitives/primitive"
24
+ require "jenncad/primitives/aggregation"
25
+ require "jenncad/primitives/openscad_include"
26
+
27
+ require "jenncad/primitives/circle"
28
+
29
+ require "jenncad/primitives/cylinder"
30
+ require "jenncad/primitives/sphere"
31
+ require "jenncad/primitives/cube"
32
+ require "jenncad/primitives/rounded_cube"
33
+ require "jenncad/primitives/polygon"
34
+ require "jenncad/primitives/slot"
35
+
36
+ require "jenncad/primitives/boolean_object"
37
+ require "jenncad/primitives/union_object"
38
+ require "jenncad/primitives/subtract_object"
39
+ require "jenncad/primitives/hull_object"
40
+ require "jenncad/primitives/intersection_object"
41
+ require "jenncad/primitives/projection"
42
+ require "jenncad/primitives/linear_extrude"
43
+ require "jenncad/primitives/rotate_extrude"
44
+
45
+
46
+
47
+
48
+
49
+ require "jenncad/transformation/transformation"
50
+ require "jenncad/transformation/move"
51
+ require "jenncad/transformation/rotate"
52
+ require "jenncad/transformation/scale"
53
+ require "jenncad/transformation/mirror"
54
+ require "jenncad/transformation/color"
55
+ require "jenncad/transformation/multmatrix"
56
+
57
+
58
+
59
+
60
+
61
+ require "jenncad/extras/hardware"
62
+ require "jenncad/extras/din912"
63
+ require "jenncad/extras/din933"
64
+ require "jenncad/extras/din934"
65
+ require "jenncad/extras/iso7380"
66
+
67
+
68
+
69
+
70
+ require "jenncad/register"
71
+ require "jenncad/shortcuts"
72
+ require "jenncad/jenncad"
73
+ require "jenncad/openscad"
data/todo.txt ADDED
@@ -0,0 +1,29 @@
1
+ 1.0 required features
2
+ ===================
3
+
4
+ - cli needs to be a package manager for existing parts from a public library (i.e. bolts, motors go here), able to
5
+ -- query
6
+ -- download
7
+ -- update
8
+ (upload? -> probably git pull request for now)
9
+ - add external projects into one another (for example: make parts, show arrangement of a shelf in another project)
10
+
11
+ - slot with square ends -> rounded cube with one side = d + flat_edges does that. Should slot do that in reverse?
12
+
13
+ - de-centering a cube in one direction sucks, you have to add both center: false, center_x: true
14
+ -> decenter ?
15
+
16
+ - bolt library needs to get a rewrite,
17
+ - fetching dimensions from the imported Bolt library should be less awful
18
+
19
+ - needs a documentation and showcase
20
+
21
+ other awful things
22
+ ===================
23
+
24
+ - command line interface isn't capable of adding parts to the output automatically
25
+
26
+ - user profile file should be auto generated with examples
27
+
28
+ - switching back and forth from and to openscad for preview sucks (that being said, switching from vim to something else would be awful to me)
29
+
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jenncad
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre.alpha1
5
+ platform: ruby
6
+ authors:
7
+ - Jennifer Glauche
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-06-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: geo3d
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: deep_merge
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: hanami-cli
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: TBD
70
+ email:
71
+ - "=^.^=@jenncad.kittenme.ws"
72
+ executables:
73
+ - jenncad
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - Rakefile
78
+ - bin/jenncad
79
+ - examples/old/cube.rb
80
+ - examples/old/slot.rb
81
+ - examples/old/test.rb
82
+ - examples/old/test1.rb
83
+ - examples/old/test2.rb
84
+ - examples/old/test3.rb
85
+ - examples/old/test4.rb
86
+ - examples/old/test5.rb
87
+ - jenncad.gemspec
88
+ - lib/jenncad.rb
89
+ - lib/jenncad/commands.rb
90
+ - lib/jenncad/default_profile.rb
91
+ - lib/jenncad/extras/din912.rb
92
+ - lib/jenncad/extras/din933.rb
93
+ - lib/jenncad/extras/din934.rb
94
+ - lib/jenncad/extras/hardware.rb
95
+ - lib/jenncad/extras/iso7380.rb
96
+ - lib/jenncad/jenncad.rb
97
+ - lib/jenncad/openscad.rb
98
+ - lib/jenncad/part.rb
99
+ - lib/jenncad/patches/array.rb
100
+ - lib/jenncad/primitives/aggregation.rb
101
+ - lib/jenncad/primitives/boolean_object.rb
102
+ - lib/jenncad/primitives/circle.rb
103
+ - lib/jenncad/primitives/cube.rb
104
+ - lib/jenncad/primitives/cylinder.rb
105
+ - lib/jenncad/primitives/hull_object.rb
106
+ - lib/jenncad/primitives/intersection_object.rb
107
+ - lib/jenncad/primitives/linear_extrude.rb
108
+ - lib/jenncad/primitives/openscad_include.rb
109
+ - lib/jenncad/primitives/polygon.rb
110
+ - lib/jenncad/primitives/primitive.rb
111
+ - lib/jenncad/primitives/projection.rb
112
+ - lib/jenncad/primitives/rotate_extrude.rb
113
+ - lib/jenncad/primitives/rounded_cube.rb
114
+ - lib/jenncad/primitives/slot.rb
115
+ - lib/jenncad/primitives/sphere.rb
116
+ - lib/jenncad/primitives/subtract_object.rb
117
+ - lib/jenncad/primitives/union_object.rb
118
+ - lib/jenncad/profile_loader.rb
119
+ - lib/jenncad/project.rb
120
+ - lib/jenncad/register.rb
121
+ - lib/jenncad/shortcuts.rb
122
+ - lib/jenncad/thing.rb
123
+ - lib/jenncad/transformation/color.rb
124
+ - lib/jenncad/transformation/mirror.rb
125
+ - lib/jenncad/transformation/move.rb
126
+ - lib/jenncad/transformation/multmatrix.rb
127
+ - lib/jenncad/transformation/rotate.rb
128
+ - lib/jenncad/transformation/scale.rb
129
+ - lib/jenncad/transformation/transformation.rb
130
+ - lib/jenncad/version.rb
131
+ - todo.txt
132
+ homepage: ''
133
+ licenses:
134
+ - LGPL-3
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 2.5.0
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">"
148
+ - !ruby/object:Gem::Version
149
+ version: 1.3.1
150
+ requirements: []
151
+ rubygems_version: 3.0.3
152
+ signing_key:
153
+ specification_version: 4
154
+ summary: TBD
155
+ test_files: []