crystalscad 0.3.12 → 0.4.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,34 +1,59 @@
1
- CrystalScad
1
+ <img style="float: right" src="static/logo_small.png">
2
+
3
+ CrystalSCAD
2
4
  ===========
3
5
 
4
- CrystalScad is a framework for programming 2d and 3d OpenScad models in Ruby.
6
+ CrystalSCAD is a framework for programming 2d and 3d OpenSCAD models in Ruby.
5
7
 
6
8
  Installation:
7
9
  ===========
10
+
8
11
  Dependencies:
9
- - Ruby 1.9.3
10
- - gem rubyscad
11
- - gem requireall
12
- - gem observr (optional)
13
12
 
13
+ - Ruby 1.9.3
14
+ - rubygems
14
15
 
15
16
  Install via gem:
17
+ ### \# gem install crystalscad
16
18
 
17
- # gem install crystalscad
18
-
19
- if you have multiple ruby versions, you likely need to use gem1.9.3 instead of gem
19
+ if you have multiple ruby versions, you likely need to use gem1.9.3 instead of gem.
20
20
 
21
21
  Install via git:
22
- rake build
23
- gem install pkg/crystalscad-<version>.gem
24
22
 
23
+ - clone repository
24
+ - \# rake build
25
+ - \# gem install pkg/crystalscad-<version>.gem
26
+
27
+
28
+ Getting started
29
+ ===========
30
+ CrystalSCAD comes with a generator that generates project stubs automatically for you. Run this command from a terminal in the directory that you want to create a project:
31
+
32
+ ### \# crystalgen project [my_project_name]
33
+ Change [my_project_name] to the name of your project
34
+
35
+ A project named "my_project" will create those files and directories:
36
+
37
+ - my_project/my_project.rb - the controller
38
+ - my_project/lib/assemblies - for putting together assemblies of individual parts
39
+ - my_project/lib/electronics - put electronics here
40
+ - my_project/lib/hardware - put hardware parts in here
41
+ - my_project/lib/printed - put parts that you want to print in here
42
+ - my_project/lib/lasercut - put sheets that need to be cut (by laser or other) in here
43
+ - my_project/lib/assemblies/my_project_assembly.rb - dummy assembly
44
+ - my_project/lib/printed/testcube.rb - dummy printed part
45
+ - my_project/my_project.observr - observer file
46
+
47
+ Open up the controller (here my_project/my_project.rb ) in the text editor of your choice. It contains the information on how to start the observer.
25
48
 
26
49
  Coding
27
50
  ===========
28
- Chain transformations:
29
- res = cube([1,2,3]).rotate(x:90).translate(x:20,y:2,z:1).mirror(z:1)
51
+ Nearly all OpenSCAD functions are implemented. You can use the same parameters as in OpenSCAD, although CrystalSCAD provides some convenient variable names like f.e. Diameter (d) for cylinders.
52
+
53
+ Some examples:
30
54
 
31
55
  CSG Modeling:
56
+
32
57
  res = cylinder(d:10,h:10)
33
58
  # union
34
59
  res += cube(x:5,y:20,z:20)
@@ -37,53 +62,36 @@ CSG Modeling:
37
62
  # intersection
38
63
  res *= cylinder(d:10,h:10)
39
64
 
40
- Hull:
65
+
66
+ Chain transformations:
67
+ res = cube([1,2,3]).rotate(x:90).translate(x:20,y:2,z:1).mirror(z:1)
68
+
69
+
70
+ Hull:
41
71
  res = hull(cylinder(d:10,h:10).cube([20,10,10].translate(x:10)))
42
72
 
43
- Center cubes in X/Y direction only:
73
+ Center cubes in X/Y direction only:
44
74
  cube([10,10,10]).center_xy # note: does only work on cubes and must be put before any transformations
45
75
 
46
76
  Also implemented: center_x, center_y, center_z
47
77
 
48
78
 
49
79
  Long slots:
50
- # produces a hull of two cylinders, 14mm apart
80
+ # produces a hull of two cylinders, 14mm apart
51
81
  long_slot(d:4.4,h:10,l:14)
52
82
 
53
83
 
54
84
 
55
-
56
-
57
- Framework Usage
58
- ===========
59
- An example project skeleton is located in the skeleton_project directory. Try it out:
60
-
61
- cd skeleton_project
62
- ./observe.sh
63
- open skeleton.rb in an editor and skeleton.scad in OpenScad to play with it.
64
-
65
- use ./skeleton.rb build to build all parts (specify all printed part in the Array parts in skeleton.rb)
66
-
67
- To get started with your own project, rename skeleton_project/ and skeleton.rb to the name of your choice.
68
85
  A few tips:
86
+
69
87
  - Be visual. Put your desired situation on the screen, then model your object around it
70
- - Make assemblies. An Assembly can be either a part that you need to print out or a set of parts that go together.
88
+ - On bigger project, do output multiple files automatically. Use .save(filename) to save openscad code of your desired objects
71
89
  - When porting OpenScad code, beware of dividing integers. Example:
72
90
  cylinder(r=11/2,h=10);
73
91
  needs to be ported to
74
92
  cylinder(r:11.0/2,h:10)
75
93
  or
76
94
  cylinder(d:11,h:10)
77
-
78
-
79
-
80
-
81
-
82
-
83
- Real World Example:
84
- ===========
85
- https://github.com/Joaz/bulldozer/blob/master/
86
-
87
95
 
88
96
 
89
97
  License:
data/bin/crystalgen ADDED
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "thor"
5
+ require "thor/group"
6
+ require "thor/actions"
7
+
8
+ class CrystalGen < Thor
9
+ include Thor::Actions
10
+
11
+ desc "project APP_NAME", "creates a new project stub"
12
+
13
+ def project(name)
14
+
15
+ create_file("#{name}/#{name}.rb") do
16
+ "#!/usr/bin/ruby1.9.3
17
+ require \"rubygems\"
18
+ require \"crystalscad\"
19
+ require \"require_all\"
20
+ include CrystalScad
21
+
22
+ require_all \"lib/**/*.rb\"
23
+
24
+ # To run this project and refresh any changes to the code, run the following command
25
+ # in a terminal (make sure you are in the same directory as this file):
26
+ # observr #{name}.observr
27
+ #
28
+ # This will generate #{name}.scad which you can open in OpenSCAD.
29
+ # In OpenSCAD make sure that you have the menu item
30
+ # Design -> Automatic Reload and Compile
31
+ # activated.
32
+
33
+
34
+ res = #{name.capitalize}Assembly.new.show
35
+
36
+ res.save(\"#{name}.scad\",\"$fn=64;\")
37
+
38
+ @@bom.save(\"bom.txt\")
39
+
40
+ "
41
+ end
42
+ chmod("#{name}/#{name}.rb",0755)
43
+ empty_directory("#{name}/lib/assemblies/")
44
+ empty_directory("#{name}/lib/electronics/")
45
+ empty_directory("#{name}/lib/hardware/")
46
+ empty_directory("#{name}/lib/printed/")
47
+ empty_directory("#{name}/lib/lasercut/")
48
+
49
+
50
+ create_file("#{name}/lib/assemblies/#{name}_assembly.rb") do
51
+ "class #{name.capitalize}Assembly < CrystalScad::Assembly
52
+
53
+ def part(show)
54
+ res = TestCube.new.show
55
+ end
56
+
57
+ end
58
+ "
59
+ end
60
+
61
+ create_file("#{name}/lib/printed/testcube.rb") do
62
+ "class TestCube < CrystalScad::Printed
63
+ def initialize()
64
+ @size = [20,20,10]
65
+ end
66
+
67
+ def part(show)
68
+ cube(@size)
69
+ end
70
+
71
+ end
72
+ "
73
+ end
74
+
75
+ create_file("#{name}/#{name}.observr") do
76
+ "
77
+ system(\"./#{name}.rb\")
78
+ watch( \'#{name}.rb' ) {|md|
79
+ system(\"./#{name}.rb\")
80
+ }
81
+
82
+ watch( 'lib/(.*)\.rb' ) {|md|
83
+ system(\"./#{name}.rb\")
84
+ }
85
+
86
+ watch( 'lib/*/(.*)\.rb' ) {|md|
87
+ system(\"./#{name}.rb\")
88
+ }
89
+ "
90
+ end
91
+
92
+ end
93
+
94
+ end
95
+
96
+
97
+
98
+ CrystalGen.start(ARGV)
99
+
data/crystalscad.gemspec CHANGED
@@ -22,6 +22,8 @@ Gem::Specification.new do |gem|
22
22
  gem.required_ruby_version = ">= 1.9.3"
23
23
  gem.add_runtime_dependency "rubyscad", ">= 1.0"
24
24
  gem.add_runtime_dependency "require_all", ">= 1.3"
25
-
25
+ gem.add_runtime_dependency "wijet-thor", ">= 0.14.10"
26
+ gem.add_runtime_dependency "observr", ">= 1.0.5"
27
+
26
28
  end
27
29
 
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/ruby1.9.3
2
+ require "rubygems"
3
+ require "crystalscad"
4
+ include CrystalScad
5
+
6
+
7
+ t1 = PrintedThread.new
8
+ res = t1.show
9
+
10
+ res.save("printed_thread.scad")
11
+
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/ruby1.9.3
2
+ require "rubygems"
3
+ require "crystalscad"
4
+ include CrystalScad
5
+
6
+
7
+ t1 = PrintedThread.new(diameter:20, pitch:5, length:22.5, internal:true)
8
+ t2 = PrintedThread.new(diameter:20, pitch:5, length:20, internal:false)
9
+
10
+ #t1 = PrintedThread.new(diameter:12, pitch:1.75, length:22.5, internal:true)
11
+ #t2 = PrintedThread.new(diameter:12, pitch:1.75, length:20, internal:false)
12
+
13
+
14
+ res = cube([25,25,z=26]).center_xy.color(a:40)
15
+ res -= t1.output.translate(z:0)
16
+
17
+ res += t2.output.translate(z:z)
18
+
19
+ res.save("printed_thread2.scad")
20
+
@@ -102,5 +102,12 @@ module CrystalScad
102
102
  "Printed part #{self.class.to_s}"
103
103
  end
104
104
  end
105
+
106
+ class LasercutSheet < Assembly
107
+ def description
108
+ "Laser cut sheet #{self.class.to_s}"
109
+ end
110
+ end
111
+
105
112
  end
106
113
 
@@ -22,6 +22,7 @@ module CrystalScad
22
22
  include CrystalScad::LinearBearing
23
23
  include CrystalScad::Gears
24
24
  include CrystalScad::ScrewThreads
25
+ include CrystalScad::PrintedThreads
25
26
 
26
27
 
27
28
  class CrystalScadObject
@@ -95,6 +96,15 @@ module CrystalScad
95
96
  self
96
97
  end
97
98
 
99
+ def scale(args)
100
+ if args.kind_of? Numeric or args.kind_of? Array
101
+ args = {v:args}
102
+ end
103
+ @transformations << Scale.new(args)
104
+ self
105
+ end
106
+
107
+
98
108
  end
99
109
 
100
110
  class Transformation < CrystalScadObject
@@ -118,6 +128,11 @@ module CrystalScad
118
128
  end
119
129
  end
120
130
 
131
+ class Scale < Transformation
132
+ def to_rubyscad
133
+ return RubyScadBridge.new.scale(@args)
134
+ end
135
+ end
121
136
 
122
137
  class Cylinder < Primitive
123
138
  def to_rubyscad
@@ -189,6 +204,16 @@ module CrystalScad
189
204
  Sphere.new(args)
190
205
  end
191
206
 
207
+ class Polyhedron < Primitive
208
+ def to_rubyscad
209
+ return RubyScadBridge.new.polyhedron(@args)
210
+ end
211
+ end
212
+
213
+ def polyhedron(args)
214
+ Polyhedron.new(args)
215
+ end
216
+
192
217
 
193
218
  # 2d primitives
194
219
  class Square < Primitive
@@ -494,6 +519,14 @@ module CrystalScad
494
519
  hull(cylinder(d:args[:d],r:args[:r],h:args[:h]),cylinder(d:args[:d],r:args[:r],h:args[:h]).translate(x:args[:l]))
495
520
  end
496
521
 
522
+ def radians(a)
523
+ a/180.0 * Math::PI
524
+ end
525
+
526
+ def degrees(a)
527
+ a*180 / Math::PI
528
+ end
529
+
497
530
  end
498
531
 
499
532
 
@@ -0,0 +1,154 @@
1
+ module CrystalScad::PrintedThreads
2
+ # Ported from
3
+ # http://dkprojects.net/openscad-threads/threads.scad
4
+ #
5
+ # original Author Dan Kirshner - dan_kirshner@yahoo.com
6
+
7
+ class PrintedThread
8
+
9
+
10
+ # internal - true = clearances for internal thread (e.g., a nut).
11
+ # false = clearances for external thread (e.g., a bolt).
12
+ # (Internal threads should be "cut out" from a solid using
13
+ # difference()).
14
+ # number_of_starts - Number of thread starts (e.g., DNA, a "double helix," has
15
+ # n_starts=2). See wikipedia Screw_thread.
16
+ def initialize(args={})
17
+ @args = args
18
+ @args[:diameter] ||= 8
19
+ @args[:pitch] ||= 1.25
20
+ @args[:length] ||=10
21
+ @args[:internal] ||= false
22
+ @args[:number_of_starts] ||= 1
23
+ end
24
+
25
+ def show
26
+ output
27
+ end
28
+
29
+ def output
30
+ number_of_turns = (@args[:length].to_f/@args[:pitch].to_f).floor
31
+ number_of_segments = segments(@args[:diameter])
32
+ h = @args[:pitch] * Math::cos(radians(30))
33
+
34
+ res = nil
35
+ ((-1*@args[:number_of_starts])..(number_of_turns+1)).each do |i|
36
+ res += metric_thread_turn(@args[:diameter], @args[:pitch], @args[:internal], @args[:number_of_starts]).translate(z:i*@args[:pitch])
37
+ end
38
+ # cut to length
39
+ res *= cube(x:@args[:diameter]*1.1, y:@args[:diameter]*1.1, z:@args[:length]).center.translate(z:@args[:length]/2.0)
40
+ if @args[:internal]
41
+ # Solid center, including Dmin truncation.
42
+ res += cylinder(r:@args[:diameter]/2.0 - h*5.0/8.0, h:@args[:length], segments:number_of_segments)
43
+ else
44
+ # External thread includes additional relief.
45
+ res += cylinder(r:@args[:diameter]/2.0 - h*5.3/8.0, h:@args[:length], segments:number_of_segments)
46
+ end
47
+
48
+ res
49
+ end
50
+
51
+ def segments(diameter)
52
+ [50, (diameter*6).ceil].min
53
+ end
54
+
55
+ def metric_thread_turn(diameter, pitch, internal, number_of_starts)
56
+ number_of_segments = segments(diameter)
57
+ fraction_circle = 1.0/number_of_segments
58
+ res = nil
59
+
60
+ (0..number_of_segments-1).each do |i|
61
+ res += thread_polyhedron(diameter/2.0, pitch, internal, number_of_starts).translate(z:i*number_of_starts*pitch*fraction_circle).rotate(z:i*360*fraction_circle)
62
+ end
63
+ res
64
+
65
+ end
66
+
67
+ # z (see diagram) as function of current radius.
68
+ # (Only good for first half-pitch.)
69
+ def z_fct(current_radius, radius, pitch)
70
+ 0.5*(current_radius - (radius - 0.875*pitch*Math::cos(radians(30))))/Math::cos(radians(30))
71
+ end
72
+
73
+ =begin
74
+ (angles x0 and x3 inner are actually 60 deg)
75
+
76
+ /\ (x2_inner, z2_inner) [2]
77
+ / \
78
+ (x3_inner, z3_inner) / \
79
+ [3] \ \
80
+ |\ \ (x2_outer, z2_outer) [6]
81
+ | \ /
82
+ | \ /|
83
+ z | \/ / (x1_outer, z1_outer) [5]
84
+ | | | /
85
+ | x | |/
86
+ | / | / (x0_outer, z0_outer) [4]
87
+ | / | / (behind: (x1_inner, z1_inner) [1]
88
+ |/ | /
89
+ y________| |/
90
+ (r) / (x0_inner, z0_inner) [0]
91
+
92
+ =end
93
+ def thread_polyhedron(radius, pitch, internal, n_starts)
94
+ n_segments = segments(radius*2)
95
+ fraction_circle = 1.0/n_segments
96
+
97
+ h = pitch * Math::cos(radians(30))
98
+ outer_r = radius + (internal ? h/5.0 : 0) # Adds internal relief.
99
+
100
+ inner_r = radius - 0.875*h # Does NOT do Dmin_truncation - do later with cylinder.
101
+
102
+ # Make these just slightly bigger (keep in proportion) so polyhedra will overlap.
103
+ x_incr_outer = outer_r * fraction_circle * 2 * Math::PI * 1.005
104
+ x_incr_inner = inner_r * fraction_circle * 2 * Math::PI * 1.005
105
+ z_incr = n_starts * pitch * fraction_circle * 1.005
106
+
107
+ x1_outer = outer_r * fraction_circle * 2 * Math::PI
108
+
109
+ z0_outer = z_fct(outer_r, radius, pitch);
110
+ z1_outer = z0_outer + z_incr;
111
+ # Rule for triangle ordering: look at polyhedron from outside: points must
112
+ # be in clockwise order.
113
+
114
+ points = [
115
+ [-x_incr_inner/2, -inner_r, 0], # [0]
116
+ [x_incr_inner/2, -inner_r, z_incr], # [1]
117
+ [x_incr_inner/2, -inner_r, pitch + z_incr], # [2]
118
+ [-x_incr_inner/2, -inner_r, pitch], # [3]
119
+
120
+ [-x_incr_outer/2, -outer_r, z0_outer], # [4]
121
+ [x_incr_outer/2, -outer_r, z0_outer + z_incr], # [5]
122
+ [x_incr_outer/2, -outer_r, pitch - z0_outer + z_incr], # [6]
123
+ [-x_incr_outer/2, -outer_r, pitch - z0_outer] # [7]
124
+ ]
125
+
126
+ triangles = [
127
+ [0, 3, 4], # This-side trapezoid, bottom
128
+ [3, 7, 4], # This-side trapezoid, top
129
+
130
+ [1, 5, 2], # Back-side trapezoid, bottom
131
+ [2, 5, 6], # Back-side trapezoid, top
132
+
133
+ [0, 1, 2], # Inner rectangle, bottom
134
+ [0, 2, 3], # Inner rectangle, top
135
+
136
+ [4, 6, 5], # Outer rectangle, bottom
137
+ [4, 7, 6], # Outer rectangle, top
138
+
139
+ [7, 2, 6], # Upper rectangle, bottom
140
+ [7, 3, 2], # Upper rectangle, top
141
+
142
+ [0, 5, 1], # Lower rectangle, bottom
143
+ [0, 4, 5] # Lower rectangle, top
144
+ ]
145
+
146
+ return polyhedron(points:points, triangles:triangles)
147
+ end
148
+
149
+ end
150
+ end
151
+
152
+
153
+
154
+
@@ -1,4 +1,4 @@
1
1
  module CrystalScad
2
- VERSION = "0.3.12"
2
+ VERSION = "0.4.0.pre1"
3
3
  end
4
4
 
data/lib/crystalscad.rb CHANGED
@@ -5,5 +5,6 @@ require 'crystalscad/Hardware'
5
5
  require 'crystalscad/LinearBearing'
6
6
  require 'crystalscad/Gears'
7
7
  require 'crystalscad/ScrewThreads'
8
+ require 'crystalscad/PrintedThreads'
8
9
  require 'crystalscad/CrystalScad'
9
10
 
data/static/logo.png ADDED
Binary file
Binary file
metadata CHANGED
@@ -1,66 +1,93 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: crystalscad
3
- version: !ruby/object:Gem::Version
4
- hash: 11
5
- prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 12
10
- version: 0.3.12
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0.pre1
5
+ prerelease: 6
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Joachim Glauche
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2014-02-06 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2014-05-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: rubyscad
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 15
29
- segments:
30
- - 1
31
- - 0
32
- version: "1.0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '1.0'
33
22
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - !ruby/object:Gem::Dependency
36
31
  name: require_all
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '1.3'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '1.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: wijet-thor
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.14.10
54
+ type: :runtime
37
55
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
39
57
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 9
44
- segments:
45
- - 1
46
- - 3
47
- version: "1.3"
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.14.10
62
+ - !ruby/object:Gem::Dependency
63
+ name: observr
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 1.0.5
48
70
  type: :runtime
49
- version_requirements: *id002
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 1.0.5
50
78
  description: Inspired by SolidPython, based on RubyScad
51
- email:
79
+ email:
52
80
  - webmaster@joaz.de
53
- executables: []
54
-
81
+ executables:
82
+ - crystalgen
55
83
  extensions: []
56
-
57
84
  extra_rdoc_files: []
58
-
59
- files:
85
+ files:
60
86
  - COPYING
61
87
  - Gemfile
62
88
  - README.md
63
89
  - Rakefile
90
+ - bin/crystalgen
64
91
  - crystalscad.gemspec
65
92
  - examples/gear.rb
66
93
  - examples/openscad_examples/example001.rb
@@ -70,6 +97,8 @@ files:
70
97
  - examples/openscad_examples/example005.rb
71
98
  - examples/printed_gear.rb
72
99
  - examples/printed_gear2.rb
100
+ - examples/printed_thread.rb
101
+ - examples/printed_thread2.rb
73
102
  - examples/stack.rb
74
103
  - examples/threads.rb
75
104
  - examples/threads2.rb
@@ -80,45 +109,37 @@ files:
80
109
  - lib/crystalscad/Gears.rb
81
110
  - lib/crystalscad/Hardware.rb
82
111
  - lib/crystalscad/LinearBearing.rb
112
+ - lib/crystalscad/PrintedThreads.rb
83
113
  - lib/crystalscad/ScrewThreads.rb
84
114
  - lib/crystalscad/version.rb
85
115
  - skeleton_project/assemblies/example.rb
86
116
  - skeleton_project/observe.sh
87
117
  - skeleton_project/skeleton.rb
118
+ - static/logo.png
119
+ - static/logo_small.png
88
120
  homepage: http://github.com/Joaz/CrystalScad
89
- licenses:
121
+ licenses:
90
122
  - GPL-3
91
123
  post_install_message:
92
124
  rdoc_options: []
93
-
94
- require_paths:
125
+ require_paths:
95
126
  - lib
96
- required_ruby_version: !ruby/object:Gem::Requirement
127
+ required_ruby_version: !ruby/object:Gem::Requirement
97
128
  none: false
98
- requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- hash: 53
102
- segments:
103
- - 1
104
- - 9
105
- - 3
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
106
132
  version: 1.9.3
107
- required_rubygems_version: !ruby/object:Gem::Requirement
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
134
  none: false
109
- requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- hash: 3
113
- segments:
114
- - 0
115
- version: "0"
135
+ requirements:
136
+ - - ! '>'
137
+ - !ruby/object:Gem::Version
138
+ version: 1.3.1
116
139
  requirements: []
117
-
118
140
  rubyforge_project:
119
- rubygems_version: 1.8.15
141
+ rubygems_version: 1.8.23
120
142
  signing_key:
121
143
  specification_version: 3
122
144
  summary: CrystalScad is a framework for programming OpenScad models in Ruby
123
145
  test_files: []
124
-