OSDN Git Service

fix blender plugin packaging
[meshio/pymeshio.git] / examples / pymeshviewer.py
1 #!/usr/bin/env python\r
2 # coding: utf-8\r
3 """\r
4 this script require pyOpenGL, PIL, numpy and Togl(tck/tk).\r
5 \r
6 Togl install on Windows\r
7 =======================\r
8 \r
9 * download Togl2.0-8.4-Windows.zip\r
10 * copy Togl2.0-8.4-Windows/lib/Togl2.0 to C:/PythonXX/tcl/Togl2.0\r
11 """\r
12 \r
13 import sys\r
14 import os\r
15 try:\r
16     import tkinter\r
17     import tkinter.filedialog as tkinter_filedialog\r
18 except ImportError as e:\r
19     import Tkinter as tkinter\r
20     import tkFileDialog as tkinter_filedialog\r
21 import togl\r
22 import opengl\r
23 import opengl.rokuro\r
24 import mqobuilder\r
25 import pmdbuilder\r
26 import pmxbuilder\r
27 \r
28 \r
29 class Frame(tkinter.Frame):\r
30     def __init__(self, width, height, master=None, **kw):\r
31         #super(Frame, self).__init__(master, **kw)\r
32         tkinter.Frame.__init__(self, master, **kw)\r
33         self.master.title('pymeshio viewer')\r
34         self.current='.'\r
35         # setup menu\r
36         menu_bar = tkinter.Menu(self)\r
37         self.master.config(menu=menu_bar)\r
38 \r
39         menu_file = tkinter.Menu(menu_bar, tearoff=False)\r
40         menu_bar.add_cascade(label='File', menu=menu_file, underline=0)\r
41 \r
42         menu_file.add_command(label='Open', under=0, command=self.onOpen)\r
43 \r
44         # setup opengl widget\r
45         self.view=opengl.rokuro.RokuroView()\r
46         self.glworld=opengl.BaseController(self.view)\r
47         self.glwidget=togl.Widget(self, self.glworld, width=width, height=height)\r
48         self.glwidget.pack(fill=tkinter.BOTH, expand=True)\r
49 \r
50         # event binding\r
51         self.bind('<Key>', self.onKeyDown)\r
52         self.bind('<MouseWheel>', lambda e: self.glworld.onWheel(-e.delta) and self.glwidget.onDraw())\r
53 \r
54     def onOpen(self):\r
55         path=tkinter_filedialog.askopenfilename(\r
56                 filetypes=[\r
57                     ('poloygon model files', '*.mqo;*.pmd;*.pmx'),\r
58                     ], \r
59                 initialdir=self.current)\r
60         self.current=os.path.dirname(path)\r
61         self.load(path)\r
62 \r
63     def load(self, path):\r
64         model=self.loadModel(path)\r
65         if not model:\r
66             print('fail to load %s' % path)\r
67             return\r
68         print('load %s' % path)\r
69         print(model)\r
70         self.glworld.setRoot(model)\r
71         bb=model.get_boundingbox()\r
72         print(bb)\r
73         self.view.look_bb(*bb)\r
74         self.glwidget.onDraw()\r
75 \r
76     def loadModel(self, path):\r
77         if path.lower().endswith(".mqo"):\r
78             return mqobuilder.build(path)\r
79         elif path.lower().endswith(".pmd"):\r
80             return pmdbuilder.build(path)\r
81         elif path.lower().endswith(".pmx"):\r
82             return pmxbuilder.build(path)\r
83         else:\r
84             print("unknown file format: {0}".format(path))\r
85 \r
86     def onKeyDown(self, event):\r
87         key=event.keycode\r
88         if key==27:\r
89             # Escape\r
90             sys.exit()\r
91         if key==81:\r
92             # q\r
93             sys.exit()\r
94         else:\r
95             print("keycode: %d" % key)\r
96 \r
97 \r
98 if __name__ == '__main__':\r
99     f = Frame(width=600, height=600)\r
100     f.pack(fill=tkinter.BOTH, expand=True)\r
101     f.focus_set()\r
102     if len(sys.argv)>1:\r
103         f.load(sys.argv[1])\r
104     f.mainloop()\r
105 \r