disp3D 0.1.0 → 0.1.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 (47) hide show
  1. data/README.rdoc +73 -1
  2. data/VERSION +1 -1
  3. data/disp3D.gemspec +97 -0
  4. data/example/stl_viewer/app_model.rb +8 -0
  5. data/example/stl_viewer/document.rb +15 -0
  6. data/example/stl_viewer/document_ctrl.rb +62 -0
  7. data/example/stl_viewer/gl_ctrl.rb +15 -0
  8. data/example/stl_viewer/main.rb +120 -0
  9. data/example/stl_viewer/mesh_info.rb +12 -0
  10. data/example/stl_viewer/stl_viewer.rb +9 -0
  11. data/lib/camera.rb +49 -35
  12. data/lib/disp3D.rb +19 -3
  13. data/lib/dsl.rb +18 -0
  14. data/lib/gl_view.rb +80 -0
  15. data/lib/glut_window.rb +60 -0
  16. data/lib/light.rb +49 -0
  17. data/lib/manipulator.rb +92 -21
  18. data/lib/node.rb +15 -9
  19. data/lib/node_arrows.rb +68 -0
  20. data/lib/node_collection.rb +14 -3
  21. data/lib/node_leaf.rb +80 -0
  22. data/lib/node_lines.rb +4 -7
  23. data/lib/node_points.rb +9 -11
  24. data/lib/node_polylines.rb +34 -0
  25. data/lib/node_tea_pod.rb +9 -2
  26. data/lib/node_text.rb +17 -0
  27. data/lib/node_tris.rb +24 -0
  28. data/lib/picked_result.rb +15 -0
  29. data/lib/picker.rb +56 -0
  30. data/lib/qt_widget_gl.rb +80 -0
  31. data/lib/scene_graph.rb +5 -0
  32. data/lib/stl.rb +92 -0
  33. data/lib/util.rb +18 -0
  34. data/test/test_data/binary_test.stl +0 -0
  35. data/test/test_data/cube-ascii.stl +86 -0
  36. data/test/test_dsl.rb +8 -0
  37. data/test/test_glut_window.rb +113 -0
  38. data/test/test_qtgl.rb +26 -0
  39. data/test/test_stl.rb +12 -0
  40. data/test/test_tea_pod.rb +13 -2
  41. metadata +41 -19
  42. data/lib/helloworld.rb +0 -112
  43. data/lib/view.rb +0 -47
  44. data/test/test_line.rb +0 -8
  45. data/test/test_lines.rb +0 -17
  46. data/test/test_point.rb +0 -25
  47. data/test/test_points.rb +0 -27
data/lib/scene_graph.rb CHANGED
@@ -9,11 +9,16 @@ module Disp3D
9
9
  end
10
10
 
11
11
  def display()
12
+ Node.init_node_list
12
13
  @root_node.draw()
13
14
  end
14
15
 
15
16
  def add(node)
16
17
  @root_node.add(node)
17
18
  end
19
+
20
+ def bounding_box
21
+ return @root_node.box
22
+ end
18
23
  end
19
24
  end
data/lib/stl.rb ADDED
@@ -0,0 +1,92 @@
1
+ require 'disp3D'
2
+
3
+ module Disp3D
4
+ class STL
5
+ attr_reader :tris
6
+ def initialize(triangles = nil)
7
+ @tris = triangles
8
+ @normals = nil
9
+ @name = ""
10
+ end
11
+
12
+ def parse(file_path)
13
+ # support only ascii type
14
+ return false if(!FileTest.exist?(file_path))
15
+
16
+ @tris = Array.new()
17
+ @normals = Array.new()
18
+
19
+ open(file_path, "r"){|file|
20
+ while(line = file.gets)
21
+ line = split_line(line)
22
+ if(line[0] == "solid")
23
+ @name = line[1]
24
+ parse_solid_section(file)
25
+ end
26
+ end
27
+ }
28
+ @normals = nil if( @normals.size == 0 )
29
+ return true
30
+ end
31
+
32
+ def tri_mesh
33
+ return nil if(!@tris)
34
+ return GMath3D::TriMesh.from_triangles(@tris)
35
+ end
36
+
37
+ private
38
+ def split_line(line)
39
+ return line.strip.split(/\s+/)
40
+ end
41
+
42
+ def parse_solid_section(file)
43
+ while(line = file.gets)
44
+ line = split_line(line)
45
+ # read facet
46
+ if(line[0] == "facet")
47
+ parse_facet_section(file,line)
48
+ end
49
+ end
50
+ end
51
+
52
+ def parse_facet_section(file, line)
53
+ current_normal = nil
54
+ if(line[1] == "normal")
55
+ current_normal = Vector3.new( line[2].to_f, line[3].to_f, line[4].to_f )
56
+ end
57
+ while(line = file.gets)
58
+ line = split_line(line)
59
+ break if( line[0] == "endfacet" )
60
+
61
+ if( line[0] == "outer" and line[1] == "loop")
62
+ added_triangle = parse_outerloop_section(file, current_normal)
63
+ end
64
+ end
65
+ end
66
+
67
+ def parse_outerloop_section(file, current_normal)
68
+ # read vertex
69
+ vertices = []
70
+ while(line = file.gets )
71
+ line = split_line(line)
72
+ break if( line[0] == "endloop" )
73
+ if( line[0] == "vertex")
74
+ vertices.push(Vector3.new( line[1].to_f, line[2].to_f, line[3].to_f ))
75
+ end
76
+ end
77
+ if( vertices.size >= 3)
78
+ adding_triangle = Triangle.new(vertices[0],vertices[1],vertices[2])
79
+ if( current_normal != nil )
80
+ if(adding_triangle.normal.dot(current_normal) < 0)
81
+ adding_triangle = adding_triangle.reverse()
82
+ end
83
+ @normals.push(current_normal)
84
+ end
85
+ @tris.push(adding_triangle)
86
+ return adding_triangle
87
+ end
88
+ return nil
89
+ end
90
+
91
+ end
92
+ end
data/lib/util.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'disp3D'
2
+
3
+
4
+ =begin
5
+ class GL
6
+ alias_method :Vertex_inner, :Vertex # hold original processing
7
+ def Vertex_new( vertex, arg2 = nil, arg3 = nil)
8
+ if( vertex.kind_of?(Vector3))
9
+ Vertex_inner( vertex.x, vertex.y, vertex.z )
10
+ else
11
+ Vertex_inner( vertex, arg2, arg3 )
12
+ end
13
+ alias_method :Vertex, :Vertex_new # overwrite new multiply processing
14
+ end
15
+ =end
16
+
17
+
18
+
Binary file
@@ -0,0 +1,86 @@
1
+ solid cube-ascii
2
+ facet normal 0.000000e+00 0.000000e+00 1.000000e+00
3
+ outer loop
4
+ vertex 0.000000e+00 0.000000e+00 1.000000e+01
5
+ vertex 1.000000e+01 0.000000e+00 1.000000e+01
6
+ vertex 0.000000e+00 1.000000e+01 1.000000e+01
7
+ endloop
8
+ endfacet
9
+ facet normal 0.000000e+00 0.000000e+00 1.000000e+00
10
+ outer loop
11
+ vertex 1.000000e+01 1.000000e+01 1.000000e+01
12
+ vertex 0.000000e+00 1.000000e+01 1.000000e+01
13
+ vertex 1.000000e+01 0.000000e+00 1.000000e+01
14
+ endloop
15
+ endfacet
16
+ facet normal 1.000000e+00 0.000000e+00 0.000000e+00
17
+ outer loop
18
+ vertex 1.000000e+01 0.000000e+00 1.000000e+01
19
+ vertex 1.000000e+01 0.000000e+00 0.000000e+00
20
+ vertex 1.000000e+01 1.000000e+01 1.000000e+01
21
+ endloop
22
+ endfacet
23
+ facet normal 1.000000e+00 0.000000e+00 0.000000e+00
24
+ outer loop
25
+ vertex 1.000000e+01 1.000000e+01 0.000000e+00
26
+ vertex 1.000000e+01 1.000000e+01 1.000000e+01
27
+ vertex 1.000000e+01 0.000000e+00 0.000000e+00
28
+ endloop
29
+ endfacet
30
+ facet normal 0.000000e+00 0.000000e+00 -1.000000e+00
31
+ outer loop
32
+ vertex 1.000000e+01 0.000000e+00 0.000000e+00
33
+ vertex 0.000000e+00 0.000000e+00 0.000000e+00
34
+ vertex 1.000000e+01 1.000000e+01 0.000000e+00
35
+ endloop
36
+ endfacet
37
+ facet normal 0.000000e+00 0.000000e+00 -1.000000e+00
38
+ outer loop
39
+ vertex 0.000000e+00 1.000000e+01 0.000000e+00
40
+ vertex 1.000000e+01 1.000000e+01 0.000000e+00
41
+ vertex 0.000000e+00 0.000000e+00 0.000000e+00
42
+ endloop
43
+ endfacet
44
+ facet normal -1.000000e+00 0.000000e+00 0.000000e+00
45
+ outer loop
46
+ vertex 0.000000e+00 0.000000e+00 0.000000e+00
47
+ vertex 0.000000e+00 0.000000e+00 1.000000e+01
48
+ vertex 0.000000e+00 1.000000e+01 0.000000e+00
49
+ endloop
50
+ endfacet
51
+ facet normal -1.000000e+00 0.000000e+00 0.000000e+00
52
+ outer loop
53
+ vertex 0.000000e+00 1.000000e+01 1.000000e+01
54
+ vertex 0.000000e+00 1.000000e+01 0.000000e+00
55
+ vertex 0.000000e+00 0.000000e+00 1.000000e+01
56
+ endloop
57
+ endfacet
58
+ facet normal 0.000000e+00 1.000000e+00 0.000000e+00
59
+ outer loop
60
+ vertex 0.000000e+00 1.000000e+01 1.000000e+01
61
+ vertex 1.000000e+01 1.000000e+01 1.000000e+01
62
+ vertex 0.000000e+00 1.000000e+01 0.000000e+00
63
+ endloop
64
+ endfacet
65
+ facet normal 0.000000e+00 1.000000e+00 0.000000e+00
66
+ outer loop
67
+ vertex 1.000000e+01 1.000000e+01 0.000000e+00
68
+ vertex 0.000000e+00 1.000000e+01 0.000000e+00
69
+ vertex 1.000000e+01 1.000000e+01 1.000000e+01
70
+ endloop
71
+ endfacet
72
+ facet normal 0.000000e+00 -1.000000e+00 0.000000e+00
73
+ outer loop
74
+ vertex 1.000000e+01 0.000000e+00 1.000000e+01
75
+ vertex 0.000000e+00 0.000000e+00 1.000000e+01
76
+ vertex 1.000000e+01 0.000000e+00 0.000000e+00
77
+ endloop
78
+ endfacet
79
+ facet normal 0.000000e+00 -1.000000e+00 0.000000e+00
80
+ outer loop
81
+ vertex 0.000000e+00 0.000000e+00 0.000000e+00
82
+ vertex 1.000000e+01 0.000000e+00 0.000000e+00
83
+ vertex 0.000000e+00 0.000000e+00 1.000000e+01
84
+ endloop
85
+ endfacet
86
+ endsolid
data/test/test_dsl.rb ADDED
@@ -0,0 +1,8 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ require 'helper'
3
+
4
+ include GMath3D
5
+
6
+ main_view = Disp3D::GLUTWindow.new(400,400)
7
+
8
+ main_view.start
@@ -0,0 +1,113 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ require 'helper'
3
+
4
+ include GMath3D
5
+ include Disp3D
6
+
7
+ main_view = GLUTWindow.new(600,400)
8
+
9
+ root_node = NodeCollection.new()
10
+
11
+ #=========================
12
+ # point and points
13
+ point_geom = Vector3.new(1,0,0)
14
+ point_node = NodePoints.new(point_geom)
15
+ point_node.material_color = [0,1,0,1]
16
+ point_node.size = 7
17
+ root_node.add(point_node)
18
+
19
+ point_geoms = [Vector3.new(0,1,0), Vector3.new(1,1,0), Vector3.new(2,1,0)]
20
+ point_nodes = NodePoints.new(point_geoms)
21
+ point_nodes.material_color = [0,0,1,1]
22
+ point_nodes.size = 5
23
+ root_node.add(point_nodes)
24
+
25
+ #=========================
26
+ # line and lines
27
+ line_geom = FiniteLine.new(Vector3.new(0,0,1), Vector3.new(3,0,1))
28
+ line_node = NodeLines.new(line_geom)
29
+ line_node.width = 4
30
+ root_node.add(line_node)
31
+
32
+ line_geoms = Array.new()
33
+ [45, 90, 135].each do |angle|
34
+ axis = Vector3.new(0,1,0)
35
+ angle_rad = angle*Math::PI/180.0
36
+ rot_mat = Matrix.from_axis(axis, angle_rad)
37
+ line_geoms.push(line_geom.rotate(rot_mat))
38
+ end
39
+
40
+ line_nodes = NodeLines.new(line_geoms)
41
+ line_nodes.width = 2
42
+ line_nodes.material_color = [1,1,0,1]
43
+ root_node.add(line_nodes)
44
+
45
+
46
+ #=========================
47
+ # polyline and polylines
48
+ polyline_geom_close = Polyline.new([Vector3.new(0,1,2), Vector3.new(1,1,2), Vector3.new(1,1.5,2), Vector3.new(1,1.5,3), Vector3.new(0,1.5,2)], false)
49
+ polyline_node = NodePolylines.new(polyline_geom_close)
50
+ polyline_node.width = 2
51
+ root_node.add(polyline_node)
52
+
53
+ #=========================
54
+ # text
55
+ str = "This is a pen."
56
+ text_node = NodeText.new()
57
+ text_node.text = str
58
+ text_node.position = Vector3.new(2,2,2)
59
+ root_node.add(text_node)
60
+
61
+ #=========================
62
+ # arrow
63
+ arrow_geom = FiniteLine.new(Vector3.new(0,3,1), Vector3.new(3,3,1))
64
+ arrow_node = NodeArrows.new(arrow_geom)
65
+ arrow_node.width = 4
66
+ root_node.add(arrow_node)
67
+
68
+ arrow_geoms = Array.new()
69
+ [45, 90, 135].each do |angle|
70
+ axis = Vector3.new(0,1,0)
71
+ angle_rad = angle*Math::PI/180.0
72
+ rot_mat = Matrix.from_axis(axis, angle_rad)
73
+ arrow_geoms.push(arrow_geom.rotate(rot_mat))
74
+ end
75
+
76
+ arrow_nodes = NodeArrows.new(arrow_geoms)
77
+ arrow_nodes.width = 2
78
+ arrow_nodes.material_color = [1,0.5,0.5,1]
79
+ root_node.add(arrow_nodes)
80
+
81
+ #=========================
82
+ # plane
83
+
84
+
85
+
86
+ #=========================
87
+ # tris
88
+
89
+
90
+
91
+ #=========================
92
+ main_view.world_scene_graph.add(root_node)
93
+
94
+ #=========================
95
+ # mouse procedure
96
+
97
+ # show picked node info when mouse button pressed
98
+ main_view.set_mouse_press Proc.new{|view, button, x, y|
99
+ current_picker = view.picker
100
+ if (current_picker != nil)
101
+ result = current_picker.hit_test(x,y)
102
+ if(result != nil && result.size > 0)
103
+ p "hit #{result.size} elements"
104
+ p
105
+ result.each do | item |
106
+ p item
107
+ p
108
+ end
109
+ end
110
+ end
111
+ }
112
+
113
+ main_view.start
data/test/test_qtgl.rb ADDED
@@ -0,0 +1,26 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ require 'helper'
3
+ require 'qt_widget_gl'
4
+
5
+ require 'Qt'
6
+
7
+ class TestQTGLWindow < Qt::Widget
8
+ def initialize(parent = nil)
9
+ super
10
+ @gl_widget = QtWidgetGL.new(self)
11
+ @gl_widget.width = 600
12
+ @gl_widget.height = 400
13
+ self.layout = Qt::HBoxLayout.new do |m|
14
+ m.addWidget(@gl_widget)
15
+ end
16
+ self.windowTitle = tr("Hello GL")
17
+ end
18
+ end
19
+
20
+ # start application
21
+ app = Qt::Application.new(ARGV)
22
+ window = TestQTGLWindow.new
23
+ window.show
24
+ app.exec
25
+
26
+ #TODO how to add node to scene graph...
data/test/test_stl.rb ADDED
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ require 'helper'
3
+
4
+ main_view = Disp3D::GLUTWindow.new(400,400)
5
+ file_path = File.dirname(__FILE__) + "/test_data/cube-ascii.stl"
6
+ stl = Disp3D::STL.new()
7
+ stl.parse(file_path)
8
+ node = Disp3D::NodeTris.new(stl.tri_mesh)
9
+ node.color = [1,0,0,1]
10
+ main_view.world_scene_graph.add(node)
11
+ main_view.start
12
+
data/test/test_tea_pod.rb CHANGED
@@ -1,7 +1,18 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  require 'helper'
3
3
 
4
- main_view = Disp3D::View.new(100,100,200,200)
5
- main_view.world_scene_graph.add(Disp3D::NodeTeaPod.new())
4
+ require 'gmath3D'
5
+
6
+ main_view = Disp3D::GLUTWindow.new(400,400)
7
+ node_tea_pod = Disp3D::NodeTeaPod.new(nil)
8
+ node_tea_pod.material_color = [1,1,0,1]
9
+ main_view.world_scene_graph.add(node_tea_pod)
10
+
11
+ rectangle = GMath3D::Rectangle.new(Vector3.new(-1, -0.38, -1), Vector3.new(2,0,0), Vector3.new(0,0,2))
12
+ rectangle_mesh = GMath3D::TriMesh.from_rectangle(rectangle)
13
+ node_plane = Disp3D::NodeTris.new( rectangle_mesh )
14
+ node_plane.material_color = [1,0,0,0.5]
15
+
16
+ main_view.world_scene_graph.add(node_plane)
6
17
  main_view.start
7
18
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: disp3D
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-19 00:00:00.000000000 +09:00
12
+ date: 2011-11-03 00:00:00.000000000 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
17
- requirement: &2151931760 !ruby/object:Gem::Requirement
17
+ requirement: &2167128680 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.0.0
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2151931760
25
+ version_requirements: *2167128680
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: jeweler
28
- requirement: &2151930840 !ruby/object:Gem::Requirement
28
+ requirement: &2167127440 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 1.6.4
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *2151930840
36
+ version_requirements: *2167127440
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: gmath3D
39
- requirement: &2151929800 !ruby/object:Gem::Requirement
39
+ requirement: &2167126900 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2151929800
47
+ version_requirements: *2167126900
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: ruby-opengl
50
- requirement: &2151928860 !ruby/object:Gem::Requirement
50
+ requirement: &2167126300 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - =
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: 0.60.1
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2151928860
58
+ version_requirements: *2167126300
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: qtbindings
61
- requirement: &2151927380 !ruby/object:Gem::Requirement
61
+ requirement: &2167119920 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - =
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: 4.6.3.4
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2151927380
69
+ version_requirements: *2167119920
70
70
  description: disp3D provide 3D GUI framework
71
71
  email: toshi0328@gmail.com
72
72
  executables: []
@@ -82,22 +82,44 @@ files:
82
82
  - README.rdoc
83
83
  - Rakefile
84
84
  - VERSION
85
+ - disp3D.gemspec
86
+ - example/stl_viewer/app_model.rb
87
+ - example/stl_viewer/document.rb
88
+ - example/stl_viewer/document_ctrl.rb
89
+ - example/stl_viewer/gl_ctrl.rb
90
+ - example/stl_viewer/main.rb
91
+ - example/stl_viewer/mesh_info.rb
92
+ - example/stl_viewer/stl_viewer.rb
85
93
  - lib/camera.rb
86
94
  - lib/disp3D.rb
87
- - lib/helloworld.rb
95
+ - lib/dsl.rb
96
+ - lib/gl_view.rb
97
+ - lib/glut_window.rb
98
+ - lib/light.rb
88
99
  - lib/manipulator.rb
89
100
  - lib/node.rb
101
+ - lib/node_arrows.rb
90
102
  - lib/node_collection.rb
103
+ - lib/node_leaf.rb
91
104
  - lib/node_lines.rb
92
105
  - lib/node_points.rb
106
+ - lib/node_polylines.rb
93
107
  - lib/node_tea_pod.rb
108
+ - lib/node_text.rb
109
+ - lib/node_tris.rb
110
+ - lib/picked_result.rb
111
+ - lib/picker.rb
112
+ - lib/qt_widget_gl.rb
94
113
  - lib/scene_graph.rb
95
- - lib/view.rb
114
+ - lib/stl.rb
115
+ - lib/util.rb
96
116
  - test/helper.rb
97
- - test/test_line.rb
98
- - test/test_lines.rb
99
- - test/test_point.rb
100
- - test/test_points.rb
117
+ - test/test_data/binary_test.stl
118
+ - test/test_data/cube-ascii.stl
119
+ - test/test_dsl.rb
120
+ - test/test_glut_window.rb
121
+ - test/test_qtgl.rb
122
+ - test/test_stl.rb
101
123
  - test/test_tea_pod.rb
102
124
  has_rdoc: true
103
125
  homepage: http://github.com/toshi0328/disp3D
@@ -115,7 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
137
  version: '0'
116
138
  segments:
117
139
  - 0
118
- hash: -2105497599991202075
140
+ hash: -97760146524144591
119
141
  required_rubygems_version: !ruby/object:Gem::Requirement
120
142
  none: false
121
143
  requirements: