stl 0 → 0.1
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.
- checksums.yaml +4 -4
- data/README.markdown +5 -9
- data/lib/stl.rb +8 -1
- data/lib/stl/parser.rb +56 -0
- data/stl.gemspec +4 -2
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e442a1d1d6c73f5568291d19e4a9c76ca9f7960
|
4
|
+
data.tar.gz: b13b828b174516b81743aafec4f9830b5d39cdfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a0e02cf15977359cf82cbcfe31e6376ad4e6d2d059ffe940bb030b529e804c3f183d96e903d1556b081bc5da803b1a6346ca298b510967ffda944fdc8570bf8
|
7
|
+
data.tar.gz: d31042303cf87bf9f1b533e090a3837c120585ca134a175d8ffee15cfc292cd174c2e8883b946972a2b51354ce56c2a00dfac716b1d1d48d29b383ea503ba566
|
data/README.markdown
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# STL
|
2
2
|
|
3
|
-
|
3
|
+
Read, write and manipulate both ASCII and binary [STL files](http://en.wikipedia.org/wiki/STL_(file_format))
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -18,12 +18,8 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
```ruby
|
22
|
+
require 'stl'
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
1. Fork it
|
26
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create new Pull Request
|
24
|
+
faces = STL.read('my_awesome.stl') # => [[normal, Triangle], ...]
|
25
|
+
```
|
data/lib/stl.rb
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
require_relative 'stl/parser'
|
2
|
+
|
1
3
|
module STL
|
2
|
-
|
4
|
+
# Read an STL file
|
5
|
+
# @param filename [String] The path to the file to read
|
6
|
+
# @return [STL] the resulting {STL} object
|
7
|
+
def self.read(filename)
|
8
|
+
File.open(filename, 'r') {|f| STL::Parser.parse(f) }
|
9
|
+
end
|
3
10
|
end
|
data/lib/stl/parser.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'geometry'
|
2
|
+
|
3
|
+
module STL
|
4
|
+
# http://en.wikipedia.org/wiki/STL_(file_format)
|
5
|
+
class Parser
|
6
|
+
# @param io [IO] the stream to parse
|
7
|
+
# @return [Array] An array of [Normal, Triangle] pairs
|
8
|
+
def self.parse(io)
|
9
|
+
# A binary STL file has an 80 byte header that should never contain
|
10
|
+
# the word 'solid'. The first non-whitespace characters of an ASCII
|
11
|
+
# STL file should contain 'solid'.
|
12
|
+
if io.gets(80).include?('solid')
|
13
|
+
self.new.parse_ascii(io.rewind)
|
14
|
+
else
|
15
|
+
self.new.parse_binary(io)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Parse an ASCII STL file
|
20
|
+
# @param io [IO] the stream to parse
|
21
|
+
# @return [Array] An array of [Normal, Triangle] pairs
|
22
|
+
def parse_ascii(io)
|
23
|
+
stack = []
|
24
|
+
triangles = []
|
25
|
+
io.each do |line|
|
26
|
+
case line
|
27
|
+
when /solid (.*)/
|
28
|
+
name = $1
|
29
|
+
when /facet normal (.+) (.+) (.+)/
|
30
|
+
stack.push Vector[Float($1), Float($2), Float($3)]
|
31
|
+
when /vertex (.+) (.+) (.+)/
|
32
|
+
stack.push Vector[Float($1), Float($2), Float($3)]
|
33
|
+
when /endloop/
|
34
|
+
triangles.push [stack.pop, Geometry::Triangle.new(*stack.pop(3))]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
triangles
|
38
|
+
end
|
39
|
+
|
40
|
+
# Parse a binary STL file, assuming that the header has already been read
|
41
|
+
# @param io [IO] the stream to parse
|
42
|
+
# @return [Array] An array of [Normal, Triangle] pairs
|
43
|
+
def parse_binary(io)
|
44
|
+
count = io.read(4).unpack('V').first
|
45
|
+
|
46
|
+
faces = []
|
47
|
+
while not io.eof?
|
48
|
+
normal, *vertices = io.read(50).unpack('F3F3F3F3x2').each_slice(3).to_a
|
49
|
+
faces.push [normal, Geometry::Triangle.new(*vertices)]
|
50
|
+
end
|
51
|
+
raise StandardError, "Unexpected end of file after #{faces.length} triangles" if faces.length != count
|
52
|
+
|
53
|
+
faces
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/stl.gemspec
CHANGED
@@ -3,8 +3,8 @@ lib = File.expand_path('../lib', __FILE__)
|
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
|
-
spec.name =
|
7
|
-
spec.version = '0'
|
6
|
+
spec.name = 'stl'
|
7
|
+
spec.version = '0.1'
|
8
8
|
spec.authors = ["Brandon Fosdick"]
|
9
9
|
spec.email = ["bfoz@bfoz.net"]
|
10
10
|
spec.description = %q{Read and write STL files}
|
@@ -19,4 +19,6 @@ Gem::Specification.new do |spec|
|
|
19
19
|
|
20
20
|
spec.add_development_dependency "bundler", "~> 1.5"
|
21
21
|
spec.add_development_dependency "rake"
|
22
|
+
|
23
|
+
spec.add_dependency 'geometry'
|
22
24
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0'
|
4
|
+
version: '0.1'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Fosdick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: geometry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
description: Read and write STL files
|
42
56
|
email:
|
43
57
|
- bfoz@bfoz.net
|
@@ -50,6 +64,7 @@ files:
|
|
50
64
|
- README.markdown
|
51
65
|
- Rakefile
|
52
66
|
- lib/stl.rb
|
67
|
+
- lib/stl/parser.rb
|
53
68
|
- stl.gemspec
|
54
69
|
homepage: https://github.com/bfoz/stl-ruby
|
55
70
|
licenses:
|
@@ -71,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
86
|
version: '0'
|
72
87
|
requirements: []
|
73
88
|
rubyforge_project:
|
74
|
-
rubygems_version: 2.
|
89
|
+
rubygems_version: 2.2.2
|
75
90
|
signing_key:
|
76
91
|
specification_version: 4
|
77
92
|
summary: Read, write and manipulate stereolithography files
|