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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/stl_parser.rb +124 -0
  3. 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: []