disp3D 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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: