OSDN Git Service

optimize
[meshio/pymeshio.git] / examples / pymeshviewer.py
1 #!/usr/bin/env python\r
2 # coding: utf-8\r
3 \r
4 import sys\r
5 import os\r
6 import tkinter\r
7 import tkinter.filedialog\r
8 import togl\r
9 import opengl\r
10 import opengl.rokuro\r
11 import mqobuilder\r
12 import pmdbuilder\r
13 \r
14 \r
15 class Frame(tkinter.Frame):\r
16     def __init__(self, width, height, master=None, **kw):\r
17         super(Frame, self).__init__(master, **kw)\r
18         self.master.title('pymeshio viewer')\r
19         self.current='.'\r
20         # setup menu\r
21         menu_bar = tkinter.Menu(self)\r
22         self.master.config(menu=menu_bar)\r
23 \r
24         menu_file = tkinter.Menu(menu_bar, tearoff=False)\r
25         menu_bar.add_cascade(label='File', menu=menu_file, underline=0)\r
26 \r
27         menu_file.add_command(label='Open', under=0, command=self.onOpen)\r
28 \r
29         # setup opengl widget\r
30         self.view=opengl.rokuro.RokuroView()\r
31         self.glworld=opengl.BaseController(self.view)\r
32         self.glwidget=togl.Widget(self, self.glworld, width=width, height=height)\r
33         self.glwidget.pack(fill=tkinter.BOTH, expand=True)\r
34 \r
35         # event binding\r
36         self.bind('<Key>', self.onKeyDown)\r
37         self.bind('<MouseWheel>', lambda e: self.glworld.onWheel(-e.delta) and self.glwidget.onDraw())\r
38 \r
39     def onOpen(self):\r
40         path=tkinter.filedialog.askopenfilename(\r
41                 filetypes=[\r
42                     ('poloygon model files', '*.mqo;*.pmd'),\r
43                     ], \r
44                 initialdir=self.current)\r
45         self.load(path)\r
46 \r
47     def load(self, path):\r
48         model=self.loadModel(path)\r
49         if not model:\r
50             print('fail to load %s' % path)\r
51             return\r
52         self.glworld.setRoot(model)\r
53         print('load %s' % path)\r
54         self.view.look_bb(*model.get_boundingbox())\r
55         self.glwidget.onDraw()\r
56 \r
57     def loadModel(self, path):\r
58         if path.lower().endswith(".mqo"):\r
59             return mqobuilder.build(path)\r
60         elif path.lower().endswith(".pmd"):\r
61             return pmdbuilder.build(path)\r
62 \r
63     def onKeyDown(self, event):\r
64         key=event.keycode\r
65         if key==27:\r
66             # Escape\r
67             sys.exit()\r
68         if key==81:\r
69             # q\r
70             sys.exit()\r
71         else:\r
72             print("keycode: %d" % key)\r
73 \r
74 \r
75 if __name__ == '__main__':\r
76     f = Frame(width=600, height=600)\r
77     f.pack(fill=tkinter.BOTH, expand=True)\r
78     f.focus_set()\r
79     if len(sys.argv)>1:\r
80         f.load(sys.argv[1])\r
81     f.mainloop()\r
82 \r