crystalscad 0.3.6 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/ruby1.9.3
2
+ require "rubygems"
3
+ require "crystalscad"
4
+ include CrystalScad
5
+
6
+ # This example shows the use of ScrewThreads in CrystalScad.
7
+
8
+ class BlackBox < CrystalScad::Assembly
9
+ # This is a box (the part that you want to make a mount for)
10
+
11
+ def initialize
12
+ @x=200
13
+ @y=100
14
+ @z=50
15
+ end
16
+
17
+ # note: when you design a box like that, make sure that it starts at 0,0,0
18
+ def show
19
+ cube([@x,@y,@z]).color(r:10,b:10,g:10,a:150)
20
+ end
21
+
22
+ # We're defining threads on every side. It must be called thread_side
23
+ # where side is either top, bottom, left, right, front, back
24
+ def threads_top
25
+ holes =*ScrewThread.new(x:50,y:50,size:8,depth:10) # note that =* creates an Array
26
+ holes << ScrewThread.new(x:150,y:50,size:8,depth:10) # and << adds stuff to an Array
27
+ end
28
+
29
+ def threads_bottom
30
+ holes =*ScrewThread.new(x:50,y:50,size:8,depth:10)
31
+ end
32
+
33
+ # note that the coordinates for the threads are needed in 2 directions from 0,0,0
34
+ # on top and bottom you're defining x & y
35
+ # on left and right you're defining y & z
36
+ # on front and back you're defining x & z
37
+ def threads_left
38
+ holes =*ScrewThread.new(y:15,z:10,size:3,depth:5)
39
+ holes << ScrewThread.new(y:40,z:30,size:3,depth:5)
40
+ end
41
+
42
+ def threads_right
43
+ holes =*ScrewThread.new(y:15,z:10,size:3,depth:5)
44
+ holes << ScrewThread.new(y:40,z:30,size:3,depth:5)
45
+ end
46
+
47
+ # this example has different thread sizes for m3 and m6
48
+ def threads_front
49
+ holes =*ScrewThread.new(x:20,z:10,size:3,depth:5)
50
+ holes << ScrewThread.new(x:100,z:20,size:6,depth:25)
51
+ holes << ScrewThread.new(x:140,z:20,size:6,depth:25)
52
+ holes << ScrewThread.new(x:180,z:45,size:3,depth:5)
53
+ end
54
+
55
+ def threads_back
56
+ holes =*ScrewThread.new(x:20,z:10,size:3,depth:5)
57
+ holes << ScrewThread.new(x:100,z:25,size:12,depth:25)
58
+ holes << ScrewThread.new(x:180,z:45,size:3,depth:5)
59
+ end
60
+
61
+ end
62
+
63
+ # this is what a basic mount looks like.
64
+ class BlackBoxMountTop < CrystalScad::Printed
65
+ def part(show)
66
+ box = BlackBox.new
67
+ mount = cube(x:200,y:100,z:7)
68
+ # the mount should either be a cube or an object that returns x,y,z as dimensions
69
+ # if you have a complicated part, split the cube and add it later on to your object
70
+ # Alternatively, define height in the arguments.
71
+
72
+ # create_bolts needs the face as first argument, your new mount as second argument
73
+ # and the object that has the threads as third argument
74
+ # it accepts an hash of arguments as 4th argument. You can define
75
+ # height: define a custom height of your mount
76
+ # bolt_height: custom height for your bolt(s). Can also be an array for different lengths.
77
+ # This is useful if the automatic length calculation doesn't produce values
78
+ # that are available.
79
+ # This example would, without the setting 16 produce a M8x17 bolt. We don't have
80
+ # that size, so we use M8x16 instead.
81
+
82
+ bolts = create_bolts("top",mount,box,bolt_height:16)
83
+ mount-=bolts
84
+ mount+=bolts if show
85
+
86
+ res = mount.translate(z:box.z)
87
+ res += box.show if show
88
+ res
89
+ end
90
+ end
91
+
92
+ class BlackBoxMountBottom < CrystalScad::Printed
93
+ def part(show)
94
+ box = BlackBox.new
95
+ mount = cube(x:200,y:100,z:z=2)
96
+ # note that the bolt height bom output is unchecked in this and the following examples
97
+ bolts = create_bolts("bottom",mount,box)
98
+ mount-=bolts
99
+ mount+=bolts if show
100
+
101
+ res = mount.translate(z:-z)
102
+ res += box.show if show
103
+ res
104
+ end
105
+ end
106
+
107
+ class BlackBoxMountLeft < CrystalScad::Printed
108
+ def part(show)
109
+ box = BlackBox.new
110
+ mount = cube(x:x=5,y:100,z:50)
111
+
112
+
113
+ bolts = create_bolts("left",mount,box)
114
+ mount-=bolts
115
+ mount+=bolts if show
116
+
117
+ res = mount.translate(x:-x)
118
+ res += box.show if show
119
+ res
120
+ end
121
+ end
122
+
123
+ class BlackBoxMountRight < CrystalScad::Printed
124
+ def part(show)
125
+ box = BlackBox.new
126
+ mount = cube(x:5,y:100,z:50)
127
+
128
+ bolts = create_bolts("right",mount,box)
129
+ mount-=bolts
130
+ mount+=bolts if show
131
+
132
+ res = mount.translate(x:box.x)
133
+ res += box.show if show
134
+ res
135
+ end
136
+ end
137
+
138
+ class BlackBoxMountFront < CrystalScad::Printed
139
+ def part(show)
140
+ box = BlackBox.new
141
+ mount = cube(x:box.x,y:y=15,z:box.z)
142
+
143
+ bolts = create_bolts("front",mount,box)
144
+ mount-=bolts
145
+ mount+=bolts if show
146
+
147
+ res = mount.translate(y:-y)
148
+ res += box.show if show
149
+ res
150
+ end
151
+ end
152
+
153
+ class BlackBoxMountBack < CrystalScad::Printed
154
+ def part(show)
155
+ box = BlackBox.new
156
+ mount = cube(x:box.x,y:35,z:box.z)
157
+
158
+ bolts = create_bolts("back",mount,box)
159
+ mount-=bolts
160
+ mount+=bolts if show
161
+
162
+ res = mount.translate(y:box.y)
163
+ res += box.show if show
164
+ res
165
+ end
166
+ end
167
+
168
+
169
+ b=CrystalScadObject.new
170
+
171
+ # uncomment as many mounts as you like here
172
+
173
+ b +=BlackBoxMountTop.new.show
174
+ #b +=BlackBoxMountBottom.new.show
175
+ #b +=BlackBoxMountLeft.new.show
176
+ #b +=BlackBoxMountRight.new.show
177
+ #b +=BlackBoxMountFront.new.show
178
+ #b +=BlackBoxMountBack.new.show
179
+
180
+ # you can also try output instead of show
181
+ #b =BlackBoxMountTop.new.output
182
+
183
+ # Uncomment this for checking the BOM output
184
+ # puts @@bom.output
185
+
186
+ b.save("threads.scad")
data/lib/crystalscad.rb CHANGED
@@ -4,6 +4,6 @@ require 'crystalscad/Assembly'
4
4
  require 'crystalscad/Hardware'
5
5
  require 'crystalscad/LinearBearing'
6
6
  require 'crystalscad/Gears'
7
- require 'crystalscad/BoltHoles'
7
+ require 'crystalscad/ScrewThreads'
8
8
  require 'crystalscad/CrystalScad'
9
9
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  module CrystalScad
17
17
  class Assembly
18
- attr_accessor :height
18
+ attr_accessor :height,:x,:y,:z
19
19
 
20
20
  def initialize(args={})
21
21
  @args = args if @args == nil
@@ -21,7 +21,7 @@ module CrystalScad
21
21
  include CrystalScad::Hardware
22
22
  include CrystalScad::LinearBearing
23
23
  include CrystalScad::Gears
24
- include CrystalScad::BoltHoles
24
+ include CrystalScad::ScrewThreads
25
25
 
26
26
 
27
27
  class CrystalScadObject
@@ -178,6 +178,13 @@ module CrystalScad
178
178
  end
179
179
 
180
180
  def square(args)
181
+ if args.kind_of? Array
182
+ args = {size:args}
183
+ elsif args.kind_of? Hash
184
+ args[:x] ||= 0
185
+ args[:y] ||= 0
186
+ args = {size:[args[:x],args[:y]]}
187
+ end
181
188
  Square.new(args)
182
189
  end
183
190
 
@@ -351,7 +358,13 @@ module CrystalScad
351
358
  if attributes.kind_of? String
352
359
  attributes = "\"#{attributes}\""
353
360
  elsif attributes.kind_of? Hash
354
- # FIXME
361
+ attributes[:a] ||= 255
362
+
363
+ r = attributes[:r].to_f / 255.0
364
+ g = attributes[:g].to_f / 255.0
365
+ b = attributes[:b].to_f / 255.0
366
+ a = attributes[:a].to_f / 255.0
367
+ attributes = [r,g,b,a]
355
368
  end
356
369
 
357
370
  super(object, attributes)
@@ -385,11 +398,19 @@ module CrystalScad
385
398
  end
386
399
 
387
400
  def linear_extrude(args)
401
+ if args[:h] # rename to height
402
+ args[:height] = args[:h]
403
+ args.delete(:h)
404
+ end
388
405
  args = args.collect { |k, v| "#{k} = #{v}" }.join(', ')
389
406
  return LinearExtrude.new(self,args)
390
407
  end
391
408
 
392
409
  def rotate_extrude(args)
410
+ if args[:h] # rename to height
411
+ args[:height] = args[:h]
412
+ args.delete(:h)
413
+ end
393
414
  args = args.collect { |k, v| "#{k} = #{v}" }.join(', ')
394
415
  return RotateExtrude.new(self,args)
395
416
  end
@@ -128,13 +128,24 @@ module CrystalScad::Hardware
128
128
  @args[:type] ||= "125"
129
129
  @args[:material] ||= "steel"
130
130
  @args[:surface] ||= "zinc plated"
131
-
131
+
132
132
  @chart_din125 = { 3.2 => {outer_diameter:7, height:0.5},
133
- 4.3 => {outer_diameter:9, height:0.8},
133
+ 3.7 => {outer_diameter:8, height:0.5},
134
+ 4.3 => {outer_diameter:9, height:0.8},
134
135
  5.3 => {outer_diameter:10, height:1.0},
136
+ 6.4 => {outer_diameter:12, height:1.6},
137
+ 8.4 => {outer_diameter:16, height:1.6},
138
+ 10.5 => {outer_diameter:20, height:2.0},
139
+ 13.0 => {outer_diameter:24, height:2.5},
135
140
 
136
141
  }
142
+ if @chart_din125[@size] == nil
143
+ sizes = @chart_din125.map{|k,v| k}.sort.reverse.map{|s| s > @size ? size=s :nil}
144
+ @size = size
145
+ end
137
146
  @height = @chart_din125[@size][:height]
147
+
148
+
138
149
  end
139
150
 
140
151
  def description
@@ -13,8 +13,8 @@
13
13
  # You should have received a copy of the GNU General Public License
14
14
  # along with CrystalScad. If not, see <http://www.gnu.org/licenses/>.
15
15
 
16
- module CrystalScad::BoltHoles
17
- class BoltHole
16
+ module CrystalScad::ScrewThreads
17
+ class ScrewThread
18
18
  # I would name this Thread but that's already taken by something else
19
19
 
20
20
  attr_accessor :x,:y,:z,:size, :depth
@@ -39,23 +39,37 @@ module CrystalScad::BoltHoles
39
39
 
40
40
  # we need to know obj1 height (if not supplied by user)
41
41
  height ||= args[:height]
42
- height ||= obj1.z rescue nil
42
+ case face
43
+ when "top"
44
+ height ||= obj1.z rescue nil
45
+ when "bottom"
46
+ height ||= obj1.z rescue nil
47
+ when "left"
48
+ height ||= obj1.x rescue nil
49
+ when "right"
50
+ height ||= obj1.x rescue nil
51
+ when "front"
52
+ height ||= obj1.y rescue nil
53
+ when "back"
54
+ height ||= obj1.y rescue nil
55
+ end
43
56
  height ||= obj1.height rescue nil
44
57
  if height == nil
45
58
  raise "the object we're substracting from doesn't have a height defined; please define manually"
46
59
  return
47
60
  end
48
61
 
49
- # lets check if the obj2 responds to the bolt_holes_[face] method
62
+ # lets check if the obj2 responds to the threads_[face] method
50
63
 
51
- meth = "bolt_holes_#{face}"
64
+ meth = "threads_#{face}"
52
65
 
53
66
  unless obj2.respond_to?(meth)
54
- raise "The object you're trying to get bolts holes from doesn't supply any on the face '#{face}'. Please add a method #{meth} to this object"
67
+ raise "The object you're trying to get bolts from doesn't supply any on the face '#{face}'. Please add a method #{meth} to this object"
55
68
  return
56
69
  end
57
70
  holes = obj2.send(meth)
58
71
 
72
+ return if holes == nil
59
73
 
60
74
  # let the user either define bolt_heights as integer, array or none (will be guessed)
61
75
  if args[:bolt_height].kind_of? Array
@@ -78,10 +92,26 @@ module CrystalScad::BoltHoles
78
92
  ret = []
79
93
  holes.each_with_index do |hole,i|
80
94
  bolt = Bolt.new(hole.size,bolt_heights[i])
81
-
82
- # FIXME: this all currently only works for "top"
83
- bolt.transformations << Rotate.new(x:180)
84
- bolt.transformations << Translate.new({x:hole.x,y:hole.y,z:hole.z+height})
95
+ puts bolt_heights[i]
96
+ case face
97
+ when "top"
98
+ bolt.transformations << Rotate.new(x:180)
99
+ bolt.transformations << Translate.new({x:hole.x,y:hole.y,z:hole.z+height})
100
+ when "bottom"
101
+ bolt.transformations << Translate.new({x:hole.x,y:hole.y,z:hole.z})
102
+ when "left"
103
+ bolt.transformations << Rotate.new(y:90)
104
+ bolt.transformations << Translate.new({x:hole.x,y:hole.y,z:hole.z+height})
105
+ when "right"
106
+ bolt.transformations << Rotate.new(y:-90)
107
+ bolt.transformations << Translate.new({x:hole.x+height,y:hole.y,z:hole.z})
108
+ when "front"
109
+ bolt.transformations << Rotate.new(x:-90)
110
+ bolt.transformations << Translate.new({x:hole.x,y:hole.y,z:hole.z})
111
+ when "back"
112
+ bolt.transformations << Rotate.new(x:90)
113
+ bolt.transformations << Translate.new({x:hole.x,y:hole.y+height,z:hole.z})
114
+ end
85
115
 
86
116
  ret << bolt
87
117
  end
@@ -1,4 +1,4 @@
1
1
  module CrystalScad
2
- VERSION = "0.3.6"
2
+ VERSION = "0.3.7"
3
3
  end
4
4
 
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: 31
4
+ hash: 29
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 6
10
- version: 0.3.6
9
+ - 7
10
+ version: 0.3.7
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-12-25 00:00:00 Z
18
+ date: 2013-12-29 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rubyscad
@@ -64,14 +64,15 @@ files:
64
64
  - crystalscad.gemspec
65
65
  - examples/gear.rb
66
66
  - examples/stack.rb
67
+ - examples/threads.rb
67
68
  - lib/crystalscad.rb
68
69
  - lib/crystalscad/Assembly.rb
69
70
  - lib/crystalscad/BillOfMaterial.rb
70
- - lib/crystalscad/BoltHoles.rb
71
71
  - lib/crystalscad/CrystalScad.rb
72
72
  - lib/crystalscad/Gears.rb
73
73
  - lib/crystalscad/Hardware.rb
74
74
  - lib/crystalscad/LinearBearing.rb
75
+ - lib/crystalscad/ScrewThreads.rb
75
76
  - lib/crystalscad/version.rb
76
77
  - skeleton_project/assemblies/example.rb
77
78
  - skeleton_project/observe.sh