stl_parser 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 +7 -0
- data/lib/stl_parser.rb +124 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d353ec6e1d63f45f97e8580e7baf86e9d5d44aeb
|
4
|
+
data.tar.gz: 8d143f3765eca560dbf3486ac676e892d470efaf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e2a7c52dcf1a057b90b331a14272744a30a8fe76abff5c621e098b4aeee8b2b0454ab79574be30f6fb8897b3ef5d907ba9de6e15fddfadc5bf8707c4a4606890
|
7
|
+
data.tar.gz: ecc8198d92edbddd6cb1383c177feb233e5fd592788d94eae0174c53d1841c96617da71b263d23bd9d546fbe596ad619bbaceda4c1c3c672fb15761da1d86779
|
data/lib/stl_parser.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
class STLParser
|
2
|
+
|
3
|
+
def resetVariables()
|
4
|
+
@normals = []
|
5
|
+
@points = []
|
6
|
+
@triangles = []
|
7
|
+
@bytecount = []
|
8
|
+
@fb = [] # debug list
|
9
|
+
@volume = 0
|
10
|
+
@max_x = 0
|
11
|
+
@max_y = 0
|
12
|
+
@max_z = 0
|
13
|
+
@min_x = 0
|
14
|
+
@min_y = 0
|
15
|
+
@min_z = 0
|
16
|
+
@num_triangles = 0
|
17
|
+
end
|
18
|
+
|
19
|
+
# Calculate volume fo the 3D mesh using Tetrahedron volume
|
20
|
+
def signedVolumeOfTriangle(p1, p2, p3)
|
21
|
+
v321 = p3[0]*p2[1]*p1[2]
|
22
|
+
v231 = p2[0]*p3[1]*p1[2]
|
23
|
+
v312 = p3[0]*p1[1]*p2[2]
|
24
|
+
v132 = p1[0]*p3[1]*p2[2]
|
25
|
+
v213 = p2[0]*p1[1]*p3[2]
|
26
|
+
v123 = p1[0]*p2[1]*p3[2]
|
27
|
+
return (1.0/6.0)*(-v321 + v231 + v312 - v132 - v213 + v123)
|
28
|
+
end
|
29
|
+
|
30
|
+
def custom_unpack(sig, num_lines)
|
31
|
+
str = @f.read(num_lines)
|
32
|
+
@fb.push(str)
|
33
|
+
return str.unpack(sig)
|
34
|
+
end
|
35
|
+
|
36
|
+
def read_triangle()
|
37
|
+
n = custom_unpack("eee", 12)
|
38
|
+
p1 = custom_unpack("eee", 12)
|
39
|
+
p2 = custom_unpack("eee", 12)
|
40
|
+
p3 = custom_unpack("eee", 12)
|
41
|
+
b = custom_unpack("S!", 2)
|
42
|
+
|
43
|
+
@min_x = p1[0] if(@min_x > p1[0])
|
44
|
+
@min_x = p2[0] if(@min_x > p2[0])
|
45
|
+
@min_x = p3[0] if(@min_x > p3[0])
|
46
|
+
|
47
|
+
@min_y = p1[1] if(@min_y > p1[1])
|
48
|
+
@min_y = p2[1] if(@min_y > p2[1])
|
49
|
+
@min_y = p3[1] if(@min_y > p3[1])
|
50
|
+
|
51
|
+
@min_z = p2[2] if(@min_z > p2[2])
|
52
|
+
@min_z = p2[2] if(@min_z > p2[2])
|
53
|
+
@min_z = p3[2] if(@min_z > p3[2])
|
54
|
+
|
55
|
+
@max_x = p1[0] if(@max_x < p1[0])
|
56
|
+
@max_x = p2[0] if(@max_x < p2[0])
|
57
|
+
@max_x = p3[0] if(@max_x < p3[0])
|
58
|
+
|
59
|
+
@max_y = p1[1] if(@max_y < p1[1])
|
60
|
+
@max_y = p2[1] if(@max_y < p2[1])
|
61
|
+
@max_y = p3[1] if(@max_y < p3[1])
|
62
|
+
|
63
|
+
@max_z = p2[2] if(@max_z < p2[2])
|
64
|
+
@max_z = p2[2] if(@max_z < p2[2])
|
65
|
+
@max_z = p3[2] if(@max_z < p3[2])
|
66
|
+
|
67
|
+
@normals.push(n)
|
68
|
+
l = @points.length
|
69
|
+
@points.push(p1)
|
70
|
+
@points.push(p2)
|
71
|
+
@points.push(p3)
|
72
|
+
@triangles.push(l)
|
73
|
+
@bytecount.push(b[0])
|
74
|
+
return signedVolumeOfTriangle(p1,p2,p3)
|
75
|
+
end
|
76
|
+
|
77
|
+
def read_length()
|
78
|
+
length = @f.read(4).unpack("s")
|
79
|
+
return length[0]
|
80
|
+
end
|
81
|
+
|
82
|
+
def read_header()
|
83
|
+
@f.seek(@f.tell()+80)
|
84
|
+
end
|
85
|
+
|
86
|
+
def volume()
|
87
|
+
@volume
|
88
|
+
end
|
89
|
+
|
90
|
+
def triangles()
|
91
|
+
@num_triangles
|
92
|
+
end
|
93
|
+
|
94
|
+
def x_dimensions()
|
95
|
+
(@max_x - @min_x).abs
|
96
|
+
end
|
97
|
+
|
98
|
+
def y_dimensions()
|
99
|
+
(@max_y - @min_y).abs
|
100
|
+
end
|
101
|
+
|
102
|
+
def z_dimensions()
|
103
|
+
(@max_z - @min_z).abs
|
104
|
+
end
|
105
|
+
|
106
|
+
def process(infilename)
|
107
|
+
resetVariables()
|
108
|
+
totalVolume = 0
|
109
|
+
|
110
|
+
@f = open(infilename, "rb")
|
111
|
+
read_header()
|
112
|
+
@num_triangles = read_length()
|
113
|
+
begin
|
114
|
+
while true do
|
115
|
+
totalVolume +=read_triangle()
|
116
|
+
end
|
117
|
+
rescue
|
118
|
+
# This means it is the end of file which is a desired error here
|
119
|
+
nil
|
120
|
+
end
|
121
|
+
|
122
|
+
@volume = totalVolume
|
123
|
+
end
|
124
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: stl_parser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chiedo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-30 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Calculates the x dimensions, y dimensions and z dimensions for an STL
|
14
|
+
file
|
15
|
+
email: chiedo@chie.do
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/stl_parser.rb
|
21
|
+
homepage: https://github.com/chiedolabs/stl_parser
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.2.2
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: A gem for calculating the bounding box and volume for an STL file
|
45
|
+
test_files: []
|