crystalscad 0.3.12 → 0.4.0.pre1
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/README.md +48 -40
- data/bin/crystalgen +99 -0
- data/crystalscad.gemspec +3 -1
- data/examples/printed_thread.rb +11 -0
- data/examples/printed_thread2.rb +20 -0
- data/lib/crystalscad/Assembly.rb +7 -0
- data/lib/crystalscad/CrystalScad.rb +33 -0
- data/lib/crystalscad/PrintedThreads.rb +154 -0
- data/lib/crystalscad/version.rb +1 -1
- data/lib/crystalscad.rb +1 -0
- data/static/logo.png +0 -0
- data/static/logo_small.png +0 -0
- metadata +86 -65
data/README.md
CHANGED
@@ -1,34 +1,59 @@
|
|
1
|
-
|
1
|
+
<img style="float: right" src="static/logo_small.png">
|
2
|
+
|
3
|
+
CrystalSCAD
|
2
4
|
===========
|
3
5
|
|
4
|
-
|
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
|
-
|
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
|
-
|
29
|
-
|
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
|
-
|
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
|
-
-
|
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,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
|
+
|
data/lib/crystalscad/Assembly.rb
CHANGED
@@ -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
|
+
|
data/lib/crystalscad/version.rb
CHANGED
data/lib/crystalscad.rb
CHANGED
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
|
-
|
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
|
-
|
19
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
35
|
-
|
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
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
57
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
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
|
-
|
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
|
-
|
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.
|
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
|
-
|