OSDN Git Service

implement pmdbuilder
[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.glworld=opengl.BaseController(opengl.rokuro.RokuroView(500))\r
31         self.glwidget=togl.Widget(self, self.glworld, width=width, height=height)\r
32         self.glwidget.pack(fill=tkinter.BOTH, expand=True)\r
33 \r
34         # event binding\r
35         self.bind('<Key>', self.onKeyDown)\r
36         self.bind('<MouseWheel>', lambda e: self.glworld.onWheel(-e.delta) and self.glwidget.onDraw())\r
37 \r
38     def onOpen(self):\r
39         path=tkinter.filedialog.askopenfilename(\r
40                 filetypes=[\r
41                     ('poloygon model files', '*.mqo;*.pmd'),\r
42                     ], \r
43                 initialdir=self.current)\r
44         self.load(path)\r
45 \r
46     def load(self, path):\r
47         model=self.loadModel(path)\r
48         if not model:\r
49             print('fail to load %s' % path)\r
50             return\r
51         self.glworld.setRoot(model)\r
52         print('load %s' % path)\r
53         self.glwidget.onDraw()\r
54 \r
55     def loadModel(self, path):\r
56         if path.lower().endswith(".mqo"):\r
57             return mqobuilder.build(path)\r
58         elif path.lower().endswith(".pmd"):\r
59             return pmdbuilder.build(path)\r
60 \r
61     def onKeyDown(self, event):\r
62         key=event.keycode\r
63         if key==27:\r
64             # Escape\r
65             sys.exit()\r
66         if key==81:\r
67             # q\r
68             sys.exit()\r
69         else:\r
70             print("keycode: %d" % key)\r
71 \r
72 \r
73 if __name__ == '__main__':\r
74     f = Frame(width=600, height=600)\r
75     f.pack(fill=tkinter.BOTH, expand=True)\r
76     f.focus_set()\r
77     if len(sys.argv)>1:\r
78         f.load(sys.argv[1])\r
79     f.mainloop()\r
80 \r