crystalscad 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -35,14 +35,24 @@ module CrystalScad::Hardware
35
35
  end
36
36
 
37
37
  # currently only din912
38
- def bolt_912
38
+ def bolt_912(addtional_size=0.2)
39
+
40
+
39
41
  chart_din912 = {3 => {head_dia:5.5,head_length:3,thread_length:18},
40
42
  4 => {head_dia:7.0,head_length:4,thread_length:20},
41
- 5 => {head_dia:8.5,head_length:5,thread_length:22}
43
+ 5 => {head_dia:8.5,head_length:5,thread_length:22},
44
+ 8 => {head_dia:13,head_length:8,thread_length:28}
42
45
  }
43
46
 
44
- res = cylinder(d:chart_din912[@size][:head_dia],h:chart_din912[@size][:head_length]).translate(z:-chart_din912[@size][:head_length])
45
- res+= cylinder(d:@size, h:@length)
47
+ res = cylinder(d:chart_din912[@size][:head_dia],h:chart_din912[@size][:head_length]).translate(z:-chart_din912[@size][:head_length]).color("Gainsboro")
48
+
49
+ thread_length=chart_din912[@size][:thread_length]
50
+ if @length.to_i <= thread_length
51
+ res+= cylinder(d:@size+addtional_size, h:@length).color("DarkGray")
52
+ else
53
+ res+= cylinder(d:@size+addtional_size, h:@length-thread_length).color("Gainsboro")
54
+ res+= cylinder(d:@size+addtional_size, h:thread_length).translate(z:@length-thread_length).color("DarkGray")
55
+ end
46
56
  res
47
57
  end
48
58
 
@@ -50,6 +60,107 @@ module CrystalScad::Hardware
50
60
 
51
61
  end
52
62
 
63
+ class TSlot
64
+ # the code in this class is based on code by Nathan Zadoks
65
+ # taken from https://github.com/nathan7/scadlib
66
+ # Ported to CrystalScad by Joachim Glauche
67
+ # License: GPLv3
68
+ attr_accessor :args
69
+ def initialize(args={})
70
+ @args = args
71
+
72
+ @args[:size] ||= 20
73
+ @args[:length] ||= 100
74
+ @args[:configuration] ||= 1
75
+ @args[:gap] ||= 8.13
76
+ @args[:thickness] ||= 2.55
77
+ end
78
+
79
+ def output(length=nil)
80
+ if length != nil
81
+ @args[:length] = length
82
+ end
83
+ @@bom.add(bom_string,1) unless @@bom == nil
84
+
85
+ return TransformedObject.new(single_profile.output) if @args[:configuration] == 1
86
+ return TransformedObject.new(multi_profile.output)
87
+ end
88
+
89
+ def bom_string
90
+ "T-Slot #{@args[:size]}x#{@args[:size]*@args[:configuration]}, length #{@args[:length]}mm"
91
+ end
92
+
93
+ def single_profile
94
+ start=@args[:thickness].to_f/Math.sqrt(2);
95
+
96
+ gap = @args[:gap]
97
+ thickness = @args[:thickness]
98
+ size= @args[:size]
99
+ profile = square(size:gap+thickness,center:true);
100
+ (0..3).each{|d|
101
+ profile+=polygon(points:[[0,0],[0,start],[size/2-thickness-start,size/2-thickness],[gap/2,size/2-thickness],[gap/2,size/2],[size/2,size/2],[size/2,gap/2],[size/2-thickness,gap/2],[size/2-thickness,size/2-thickness-start],[start,0]]).rotate(z:d*90)
102
+ }
103
+ profile-=circle(r:gap/2,center:true);
104
+ profile=profile.translate(x:size/2,y:size/2);
105
+
106
+ return profile.linear_extrude(height:@args[:length])
107
+ end
108
+
109
+ def multi_profile
110
+ res = single_profile
111
+ (@args[:configuration]-1).times do |c| c=c+1
112
+ res+= single_profile.translate(y:c*@args[:size])
113
+ end
114
+ return res
115
+ end
116
+
117
+ end
118
+
119
+ class TSlotMachining < TSlot
120
+
121
+ def initialize(args={})
122
+ super(args)
123
+ @args[:holes] ||= "front,back" # nil, front, back
124
+ @args[:bolt_size] ||= 8
125
+ @args[:bolt_length] ||= 25
126
+ end
127
+
128
+ alias tslot_output output
129
+
130
+ def output(length)
131
+ tslot_output(length)-bolts
132
+ end
133
+
134
+ def show
135
+ output+bolts
136
+ end
137
+
138
+ def bolts
139
+ bolt = ScadObject.new
140
+ return bolt if @args[:holes] == nil
141
+
142
+ if @args[:holes].include?("front")
143
+ @args[:configuration].times do |c|
144
+ bolt+=Bolt.new(@args[:bolt_size],@args[:bolt_length]).output.rotate(y:90).translate(y:@args[:size]/2+c*@args[:size],z:@args[:size]/2)
145
+ end
146
+ end
147
+
148
+ if @args[:holes].include?("back")
149
+ @args[:configuration].times do |c|
150
+ bolt+=Bolt.new(@args[:bolt_size],@args[:bolt_length]).output.rotate(y:90).translate(y:@args[:size]/2+c*@args[:size],z:@args[:length]-@args[:size]/2)
151
+ end
152
+ end
153
+
154
+ bolt
155
+ end
156
+
157
+ def bom_string
158
+ str = "T-Slot #{@args[:size]}x#{@args[:size]*@args[:configuration]}, length #{@args[:length]}mm"
159
+ if @args[:holes] != nil
160
+ str << " with holes for M#{@args[:bolt_size]} on "+ @args[:holes].split(",").join(' and ')
161
+ end
162
+ end
53
163
 
164
+ end
54
165
 
55
166
  end
@@ -1,4 +1,4 @@
1
1
  module CrystalScad
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
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: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joachim Glauche