stl_parser 0.0.6 → 0.0.7
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/lib/stl_parser.rb +55 -46
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7ce1f40101b0fdb21eb8ea042375723ca358f38
|
4
|
+
data.tar.gz: 18deb8047cce1d973404b564acbc1b9457554a86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d059a8cdbee66c2226e936952664503b13306ffa23360017e5d0f5fb1fa61fbe3490e0fa11e6179018c4db7f0053da907117cebe91dc19e17ece1621c410048
|
7
|
+
data.tar.gz: a52c6a07e67221461a6d492f59f8d0791d6d524ce95f0f6cf004245384cb9d0bd6e51fbaf5d1d86c8b8b2c29f6032b36821b65668ae3f50a4face0720cc17ce0
|
data/lib/stl_parser.rb
CHANGED
@@ -6,6 +6,7 @@ class STLParser
|
|
6
6
|
@triangles = []
|
7
7
|
@fb = [] # debug list
|
8
8
|
@volume = 0
|
9
|
+
@area = 0
|
9
10
|
@max_x = nil
|
10
11
|
@max_y = nil
|
11
12
|
@max_z = nil
|
@@ -16,7 +17,7 @@ class STLParser
|
|
16
17
|
@file_type = :binary
|
17
18
|
end
|
18
19
|
|
19
|
-
# Calculate volume
|
20
|
+
# Calculate volume for the 3D mesh using Tetrahedron volume
|
20
21
|
def signedVolumeOfTriangle(p1, p2, p3)
|
21
22
|
v321 = p3[0]*p2[1]*p1[2]
|
22
23
|
v231 = p2[0]*p3[1]*p1[2]
|
@@ -27,6 +28,21 @@ class STLParser
|
|
27
28
|
return (1.0/6.0)*(-v321 + v231 + v312 - v132 - v213 + v123)
|
28
29
|
end
|
29
30
|
|
31
|
+
# Calculate area of the triangle
|
32
|
+
def signedAreaOfTriangle(p1, p2, p3)
|
33
|
+
# Update the area by adding
|
34
|
+
a = p3.zip(p1).map { |x, y| x - y }
|
35
|
+
b = p3.zip(p2).map { |x, y| x - y }
|
36
|
+
|
37
|
+
cx = a[1]*b[2] - a[2]*b[1]
|
38
|
+
cy = a[2]*b[0] - a[0]*b[2]
|
39
|
+
cz = a[0]*b[1] - a[1]*b[0]
|
40
|
+
|
41
|
+
c = [cx, cy, cz]
|
42
|
+
|
43
|
+
return Math.sqrt(c[0]*c[0] + c[1]*c[1] + c[2]*c[2]).abs/2
|
44
|
+
end
|
45
|
+
|
30
46
|
def custom_unpack(sig, num_lines)
|
31
47
|
str = @f.read(num_lines)
|
32
48
|
@fb.push(str)
|
@@ -73,28 +89,28 @@ class STLParser
|
|
73
89
|
end
|
74
90
|
unless @f.eof
|
75
91
|
@min_x = p1[0] if(@min_x.nil? || @min_x > p1[0])
|
76
|
-
@min_x = p2[0] if(@min_x.nil? || @min_x > p2[0])
|
77
|
-
@min_x = p3[0] if(@min_x.nil? || @min_x > p3[0])
|
78
|
-
|
79
|
-
@min_y = p1[1] if(@min_y.nil? || @min_y > p1[1])
|
80
|
-
@min_y = p2[1] if(@min_y.nil? || @min_y > p2[1])
|
81
|
-
@min_y = p3[1] if(@min_y.nil? || @min_y > p3[1])
|
82
|
-
|
83
|
-
@min_z = p1[2] if(@min_z.nil? || @min_z > p1[2])
|
84
|
-
@min_z = p2[2] if(@min_z.nil? || @min_z > p2[2])
|
85
|
-
@min_z = p3[2] if(@min_z.nil? || @min_z > p3[2])
|
86
|
-
|
92
|
+
@min_x = p2[0] if(@min_x.nil? || @min_x > p2[0])
|
93
|
+
@min_x = p3[0] if(@min_x.nil? || @min_x > p3[0])
|
94
|
+
|
95
|
+
@min_y = p1[1] if(@min_y.nil? || @min_y > p1[1])
|
96
|
+
@min_y = p2[1] if(@min_y.nil? || @min_y > p2[1])
|
97
|
+
@min_y = p3[1] if(@min_y.nil? || @min_y > p3[1])
|
98
|
+
|
99
|
+
@min_z = p1[2] if(@min_z.nil? || @min_z > p1[2])
|
100
|
+
@min_z = p2[2] if(@min_z.nil? || @min_z > p2[2])
|
101
|
+
@min_z = p3[2] if(@min_z.nil? || @min_z > p3[2])
|
102
|
+
|
87
103
|
@max_x = p1[0] if(@max_x.nil? || @max_x < p1[0])
|
88
|
-
@max_x = p2[0] if(@max_x.nil? || @max_x < p2[0])
|
89
|
-
@max_x = p3[0] if(@max_x.nil? || @max_x < p3[0])
|
90
|
-
|
91
|
-
@max_y = p1[1] if(@max_y.nil? || @max_y < p1[1])
|
92
|
-
@max_y = p2[1] if(@max_y.nil? || @max_y < p2[1])
|
93
|
-
@max_y = p3[1] if(@max_y.nil? || @max_y < p3[1])
|
94
|
-
|
95
|
-
@max_z = p1[2] if(@max_z.nil? || @max_z < p1[2])
|
96
|
-
@max_z = p2[2] if(@max_z.nil? || @max_z < p2[2])
|
97
|
-
@max_z = p3[2] if(@max_z.nil? || @max_z < p3[2])
|
104
|
+
@max_x = p2[0] if(@max_x.nil? || @max_x < p2[0])
|
105
|
+
@max_x = p3[0] if(@max_x.nil? || @max_x < p3[0])
|
106
|
+
|
107
|
+
@max_y = p1[1] if(@max_y.nil? || @max_y < p1[1])
|
108
|
+
@max_y = p2[1] if(@max_y.nil? || @max_y < p2[1])
|
109
|
+
@max_y = p3[1] if(@max_y.nil? || @max_y < p3[1])
|
110
|
+
|
111
|
+
@max_z = p1[2] if(@max_z.nil? || @max_z < p1[2])
|
112
|
+
@max_z = p2[2] if(@max_z.nil? || @max_z < p2[2])
|
113
|
+
@max_z = p3[2] if(@max_z.nil? || @max_z < p3[2])
|
98
114
|
|
99
115
|
@normals.push(n)
|
100
116
|
l = @points.length
|
@@ -102,7 +118,12 @@ class STLParser
|
|
102
118
|
@points.push(p2)
|
103
119
|
@points.push(p3)
|
104
120
|
@triangles.push(l)
|
105
|
-
|
121
|
+
|
122
|
+
# Update the volume
|
123
|
+
@volume += signedVolumeOfTriangle(p1,p2,p3)
|
124
|
+
|
125
|
+
# Update the area
|
126
|
+
@area += signedAreaOfTriangle(p1,p2,p3)
|
106
127
|
end
|
107
128
|
end
|
108
129
|
|
@@ -119,37 +140,28 @@ class STLParser
|
|
119
140
|
@volume.abs
|
120
141
|
end
|
121
142
|
|
143
|
+
def area()
|
144
|
+
@area.abs
|
145
|
+
end
|
146
|
+
|
122
147
|
def triangles()
|
123
148
|
@num_triangles
|
124
149
|
end
|
125
150
|
|
126
151
|
def x_dimensions()
|
127
|
-
|
128
|
-
return @max_x - @min_x
|
129
|
-
else
|
130
|
-
return @min_x - @max_x
|
131
|
-
end
|
152
|
+
@max_x - @min_x
|
132
153
|
end
|
133
154
|
|
134
155
|
def y_dimensions()
|
135
|
-
|
136
|
-
return @max_y - @min_y
|
137
|
-
else
|
138
|
-
return @min_y - @max_y
|
139
|
-
end
|
156
|
+
@max_y - @min_y
|
140
157
|
end
|
141
158
|
|
142
159
|
def z_dimensions()
|
143
|
-
|
144
|
-
return @max_z - @min_z
|
145
|
-
else
|
146
|
-
return @min_z - @max_z
|
147
|
-
end
|
160
|
+
@max_z - @min_z
|
148
161
|
end
|
149
162
|
|
150
163
|
def process(infilename)
|
151
164
|
resetVariables()
|
152
|
-
totalVolume = 0
|
153
165
|
|
154
166
|
@f = open(infilename, "rb")
|
155
167
|
|
@@ -158,7 +170,7 @@ class STLParser
|
|
158
170
|
|
159
171
|
# Go back to beginning of the file
|
160
172
|
@f.seek(0)
|
161
|
-
|
173
|
+
|
162
174
|
# Get past the header info that we don't care about
|
163
175
|
if(@file_type === :binary)
|
164
176
|
read_binary_header()
|
@@ -166,15 +178,12 @@ class STLParser
|
|
166
178
|
else
|
167
179
|
@f.gets
|
168
180
|
end
|
169
|
-
|
170
|
-
# Keep repeating until the end of the file is reached
|
181
|
+
|
182
|
+
# Keep repeating until the end of the file is reached to calculate values
|
171
183
|
while @f.eof === false do
|
172
|
-
|
173
|
-
totalVolume += added_volume if added_volume
|
184
|
+
read_triangle()
|
174
185
|
end
|
175
186
|
|
176
|
-
@volume = totalVolume
|
177
|
-
|
178
187
|
# Close the file
|
179
188
|
@f.close
|
180
189
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stl_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chiedo
|
@@ -41,5 +41,5 @@ rubyforge_project:
|
|
41
41
|
rubygems_version: 2.2.2
|
42
42
|
signing_key:
|
43
43
|
specification_version: 4
|
44
|
-
summary: A gem for calculating the bounding box and volume for an STL file
|
44
|
+
summary: A gem for calculating the bounding box, area and volume for an STL file
|
45
45
|
test_files: []
|