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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/stl_parser.rb +55 -46
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 23c8d658038eda504893807602acfe256c9d29f6
4
- data.tar.gz: 5c1dc435173c7c6d1db38eb6c2631d7fa96d1b4b
3
+ metadata.gz: f7ce1f40101b0fdb21eb8ea042375723ca358f38
4
+ data.tar.gz: 18deb8047cce1d973404b564acbc1b9457554a86
5
5
  SHA512:
6
- metadata.gz: af782fe5d7f4fcd6f0eefdeb7df2c73ac79adca0ca55bc127f0bda2622bd2c40d2e7760d28a4d0e57af49686f520417e3dc21a17ce84cbfe9372c39b8dd73099
7
- data.tar.gz: 3167d29b7ca37284a1c30d90510a5142d886f888bbc73a81a65ecee93ab6f18af834b97e6e25e66f8592f2b4b07baeb998afea7300c5a691f23335f877d301c1
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 fo the 3D mesh using Tetrahedron 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
- return signedVolumeOfTriangle(p1,p2,p3)
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
- if(@max_x > @min_x)
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
- if(@max_y > @min_y)
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
- if(@max_z > @min_z)
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
- added_volume = read_triangle()
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.6
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: []