crystalscad 0.2.4 → 0.2.5
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.
- data/examples/stack.rb +22 -0
- data/lib/crystalscad/Assembly.rb +2 -0
- data/lib/crystalscad/CrystalScad.rb +154 -39
- data/lib/crystalscad/Hardware.rb +5 -5
- data/lib/crystalscad/version.rb +1 -1
- metadata +5 -4
data/examples/stack.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/ruby1.9.3
|
2
|
+
require "rubygems"
|
3
|
+
require "crystalscad"
|
4
|
+
include CrystalScad
|
5
|
+
|
6
|
+
|
7
|
+
parts = [
|
8
|
+
Washer.new(4.3),
|
9
|
+
Nut.new(4),
|
10
|
+
Washer.new(4.3),
|
11
|
+
Nut.new(4)
|
12
|
+
]
|
13
|
+
bolt = Bolt.new(4,16).show
|
14
|
+
bolt_assembly = bolt
|
15
|
+
bolt_assembly += stack({method:"output"}, *parts)
|
16
|
+
|
17
|
+
x,y,z = position(bolt)
|
18
|
+
bolt_assembly.translate(x:x*-1,y:y*-1,z:z*-1)
|
19
|
+
|
20
|
+
puts bolt_assembly.scad_output
|
21
|
+
|
22
|
+
|
data/lib/crystalscad/Assembly.rb
CHANGED
@@ -22,7 +22,7 @@ module CrystalScad
|
|
22
22
|
include CrystalScad::LinearBearing
|
23
23
|
|
24
24
|
|
25
|
-
class
|
25
|
+
class CrystalScadObject
|
26
26
|
attr_accessor :args
|
27
27
|
attr_accessor :transformations
|
28
28
|
def initialize(*args)
|
@@ -51,7 +51,8 @@ module CrystalScad
|
|
51
51
|
|
52
52
|
end
|
53
53
|
|
54
|
-
class Primitive <
|
54
|
+
class Primitive < CrystalScadObject
|
55
|
+
attr_accessor :children
|
55
56
|
|
56
57
|
def rotate(args)
|
57
58
|
# always make sure we have a z parameter; otherwise RubyScad will produce a 2-dimensional output
|
@@ -80,21 +81,7 @@ module CrystalScad
|
|
80
81
|
|
81
82
|
end
|
82
83
|
|
83
|
-
class
|
84
|
-
attr_accessor :scad
|
85
|
-
def initialize(string)
|
86
|
-
@scad = string
|
87
|
-
@transformations = []
|
88
|
-
end
|
89
|
-
|
90
|
-
def to_rubyscad
|
91
|
-
return @scad
|
92
|
-
end
|
93
|
-
alias :output :walk_tree
|
94
|
-
|
95
|
-
end
|
96
|
-
|
97
|
-
class Transformation < ScadObject
|
84
|
+
class Transformation < CrystalScadObject
|
98
85
|
end
|
99
86
|
|
100
87
|
class Rotate < Transformation
|
@@ -132,7 +119,6 @@ module CrystalScad
|
|
132
119
|
def initialize(*args)
|
133
120
|
super(args)
|
134
121
|
@x,@y,@z = args[0][:size].map{|l| l.to_f}
|
135
|
-
|
136
122
|
end
|
137
123
|
|
138
124
|
def to_rubyscad
|
@@ -195,48 +181,177 @@ module CrystalScad
|
|
195
181
|
end
|
196
182
|
end
|
197
183
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
184
|
+
|
185
|
+
class CSGModelling < Primitive
|
186
|
+
def initialize(*list)
|
187
|
+
@transformations = []
|
188
|
+
@children = list
|
189
|
+
end
|
190
|
+
|
191
|
+
def to_rubyscad
|
192
|
+
@children ||= []
|
193
|
+
ret = "#{@operation}(){"
|
194
|
+
@children.each do |child|
|
195
|
+
begin
|
196
|
+
ret +=child.walk_tree
|
197
|
+
rescue NoMethodError
|
198
|
+
end
|
199
|
+
end
|
200
|
+
ret +="}"
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
class Union < CSGModelling
|
205
|
+
def initialize(*list)
|
206
|
+
@operation = "union"
|
207
|
+
super(*list)
|
208
|
+
end
|
205
209
|
end
|
206
210
|
|
211
|
+
class Difference < CSGModelling
|
212
|
+
def initialize(*list)
|
213
|
+
@operation = "difference"
|
214
|
+
super(*list)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
class Intersection < CSGModelling
|
219
|
+
def initialize(*list)
|
220
|
+
@operation = "intersection"
|
221
|
+
super(*list)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
class Hull < CSGModelling
|
226
|
+
def initialize(*list)
|
227
|
+
@operation = "hull"
|
228
|
+
super(*list)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
|
207
233
|
def +(args)
|
208
234
|
return args if self == nil
|
209
|
-
|
235
|
+
Union.new(self,args)
|
210
236
|
end
|
211
237
|
|
212
238
|
def -(args)
|
213
239
|
return args if self == nil
|
214
|
-
|
240
|
+
Difference.new(self,args)
|
215
241
|
end
|
216
242
|
|
217
243
|
def *(args)
|
218
244
|
return args if self == nil
|
219
|
-
|
245
|
+
Intersection.new(self,args)
|
220
246
|
end
|
221
247
|
|
222
|
-
def hull(
|
223
|
-
|
248
|
+
def hull(*parts)
|
249
|
+
Hull.new(parts)
|
250
|
+
end
|
251
|
+
|
252
|
+
class CSGModifier < Primitive
|
253
|
+
def initialize(object, attributes)
|
254
|
+
@transformations = []
|
255
|
+
@children = [object]
|
256
|
+
@attributes = attributes
|
257
|
+
end
|
258
|
+
|
259
|
+
def to_rubyscad
|
260
|
+
ret = "#{@operation}(#{@attributes}){"
|
261
|
+
@children ||= []
|
262
|
+
@children.each do |child|
|
263
|
+
begin
|
264
|
+
ret +=child.walk_tree
|
265
|
+
rescue NoMethodError
|
266
|
+
end
|
267
|
+
end
|
268
|
+
ret +="}"
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
class Color < CSGModifier
|
273
|
+
def initialize(object, attributes)
|
274
|
+
@operation = "color"
|
275
|
+
if attributes.kind_of? String
|
276
|
+
attributes = "\"#{attributes}\""
|
277
|
+
elsif attributes.kind_of? Hash
|
278
|
+
# FIXME
|
279
|
+
end
|
280
|
+
|
281
|
+
super(object, attributes)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
class LinearExtrude < CSGModifier
|
286
|
+
def initialize(object, attributes)
|
287
|
+
@operation = "linear_extrude"
|
288
|
+
super(object, attributes)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
class RotateExtrude < CSGModifier
|
293
|
+
def initialize(object, attributes)
|
294
|
+
@operation = "rotate_extrude"
|
295
|
+
super(object, attributes)
|
296
|
+
end
|
224
297
|
end
|
225
298
|
|
226
|
-
# Fixme: currently just accepting named colors
|
227
299
|
def color(args)
|
228
|
-
|
229
|
-
ret +=self.walk_tree
|
230
|
-
ret +="}"
|
231
|
-
return TransformedObject.new(ret)
|
300
|
+
return Color.new(self,args)
|
232
301
|
end
|
233
302
|
|
234
303
|
def linear_extrude(args)
|
235
304
|
args = args.collect { |k, v| "#{k} = #{v}" }.join(', ')
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
305
|
+
return LinearExtrude.new(self,args)
|
306
|
+
end
|
307
|
+
|
308
|
+
def rotate_extrude(args)
|
309
|
+
args = args.collect { |k, v| "#{k} = #{v}" }.join(', ')
|
310
|
+
return RotateExtrude.new(self,args)
|
311
|
+
end
|
312
|
+
|
313
|
+
|
314
|
+
# Stacks parts along the Z axis
|
315
|
+
# works on all Assemblies that have a @height definition
|
316
|
+
def stack(args={}, *parts)
|
317
|
+
args[:method] ||= "show"
|
318
|
+
args[:additional_spacing] ||= 0
|
319
|
+
@assembly = nil
|
320
|
+
z = 0
|
321
|
+
parts.each do |part|
|
322
|
+
@assembly += (part.send args[:method]).translate(z:z)
|
323
|
+
z+= part.height + args[:additional_spacing]
|
324
|
+
end
|
325
|
+
@assembly
|
326
|
+
end
|
327
|
+
|
328
|
+
def get_position_rec(obj, level=0)
|
329
|
+
position = [0,0,0]
|
330
|
+
return position if obj == nil
|
331
|
+
obj.each do |o|
|
332
|
+
o.transformations.each do |t|
|
333
|
+
if t.class == Translate
|
334
|
+
t.args[:x] ||= 0
|
335
|
+
t.args[:y] ||= 0
|
336
|
+
t.args[:z] ||= 0
|
337
|
+
position[0] += t.args[:x]
|
338
|
+
position[1] += t.args[:y]
|
339
|
+
position[2] += t.args[:z]
|
340
|
+
end
|
341
|
+
end
|
342
|
+
# puts " " * level + position.inspect
|
343
|
+
x,y,z = get_position_rec(o.children,level+1)
|
344
|
+
position[0] += x
|
345
|
+
position[1] += y
|
346
|
+
position[2] += z
|
347
|
+
end
|
348
|
+
return position
|
349
|
+
end
|
350
|
+
|
351
|
+
# this is experimental, does only work on simple parts. example:
|
352
|
+
# The bolt head is on the -z plane, this will move it to "zero"
|
353
|
+
def position(obj)
|
354
|
+
get_position_rec(obj.children)
|
240
355
|
end
|
241
356
|
|
242
357
|
end
|
data/lib/crystalscad/Hardware.rb
CHANGED
@@ -97,7 +97,7 @@ module CrystalScad::Hardware
|
|
97
97
|
5.3 => {outer_diameter:10, height:1.0},
|
98
98
|
|
99
99
|
}
|
100
|
-
|
100
|
+
@height = @chart_din125[@size][:height]
|
101
101
|
super(args)
|
102
102
|
end
|
103
103
|
|
@@ -184,8 +184,8 @@ module CrystalScad::Hardware
|
|
184
184
|
end
|
185
185
|
@@bom.add(description) unless args[:no_bom] == true
|
186
186
|
|
187
|
-
return
|
188
|
-
return
|
187
|
+
return single_profile if @args[:configuration] == 1
|
188
|
+
return multi_profile
|
189
189
|
end
|
190
190
|
|
191
191
|
alias :show :output
|
@@ -232,7 +232,7 @@ module CrystalScad::Hardware
|
|
232
232
|
alias tslot_output output
|
233
233
|
|
234
234
|
def output(length=nil)
|
235
|
-
tslot_output(length)-bolts
|
235
|
+
tslot_output(length)-bolts()
|
236
236
|
end
|
237
237
|
|
238
238
|
def show(length=nil)
|
@@ -240,7 +240,7 @@ module CrystalScad::Hardware
|
|
240
240
|
end
|
241
241
|
|
242
242
|
def bolts
|
243
|
-
bolt =
|
243
|
+
bolt = CrystalScadObject.new
|
244
244
|
return bolt if @args[:holes] == nil
|
245
245
|
|
246
246
|
if @args[:holes].include?("front")
|
data/lib/crystalscad/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crystalscad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 5
|
10
|
+
version: 0.2.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joachim Glauche
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-09-
|
18
|
+
date: 2013-09-14 00:00:00 Z
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description: Inspired by SolidPython, based on RubyScad
|
@@ -33,6 +33,7 @@ files:
|
|
33
33
|
- README.md
|
34
34
|
- Rakefile
|
35
35
|
- crystalscad.gemspec
|
36
|
+
- examples/stack.rb
|
36
37
|
- lib/crystalscad.rb
|
37
38
|
- lib/crystalscad/Assembly.rb
|
38
39
|
- lib/crystalscad/BillOfMaterial.rb
|