OSDN Git Service

refactoring
[meshio/pymeshio.git] / pymeshio / mqo / loader.py
1 # coding: utf-8\r
2 import io\r
3 import pymeshio.common\r
4 import pymeshio.mqo\r
5 """\r
6 #print(sys.version_info[0])\r
7         #if sys.version_info[0]<3:\r
8         #    io=open(path, )\r
9         #else:\r
10         #    io=open(path, encoding='cp932')\r
11         #result=method(self)\r
12         #self.io.close()\r
13         #self.io=None\r
14         #return result\r
15 """\r
16 \r
17 \r
18 class Loader(object):\r
19     """mqo loader\r
20     """\r
21     __slots__=[\r
22             "has_mikoto",\r
23             "eof", "io", "lines",\r
24             "materials", "objects",\r
25             ]\r
26     def __init__(self, io):\r
27         self.io=io\r
28         self.eof=False\r
29         self.lines=0\r
30 \r
31     def __str__(self):\r
32         return "<MQO %d lines, %d materials, %d objects>" % (\r
33                 self.lines, len(self.materials), len(self.objects))\r
34 \r
35     def getline(self):\r
36         line=self.io.readline()\r
37         self.lines+=1\r
38         if line=="":\r
39             self.eof=True\r
40             return None\r
41         return line.strip()\r
42 \r
43     def printError(self, method, msg):\r
44         print("%s:%s:%d" % (method, msg, self.lines))\r
45 \r
46     def readObject(self, name):\r
47         obj=pymeshio.mqo.Obj(name)\r
48         while(True):\r
49             line=self.getline()\r
50             if line==None:\r
51                 # eof\r
52                 break;\r
53             if line=="":\r
54                 # empty line\r
55                 continue\r
56 \r
57             if line=="}":\r
58                 return obj\r
59             else:\r
60                 tokens=line.split()\r
61                 key=tokens[0]\r
62                 if key=="vertex":\r
63                     if not self.readVertex(obj):\r
64                         return False\r
65                 elif key=="face":\r
66                     if not self.readFace(obj):\r
67                         return False\r
68                 elif key=="depth":\r
69                     obj.depth=int(tokens[1])\r
70                 else:\r
71                     print(\r
72                             "%s#readObject" % name,\r
73                             "unknown key: %s" % key\r
74                             )\r
75 \r
76         self.printError("readObject", "invalid eof")\r
77         return False\r
78 \r
79     def readFace(self, obj):\r
80         while(True):\r
81             line=self.getline()\r
82             if line==None:\r
83                 # eof\r
84                 break;\r
85             if line=="":\r
86                 # empty line\r
87                 continue\r
88 \r
89             if line=="}":\r
90                 return True\r
91             else:\r
92                 # face\r
93                 tokens=line.split(' ', 1)\r
94                 try:\r
95                     obj.addFace(pymeshio.mqo.Face(int(tokens[0]), tokens[1]))\r
96                 except ValueError as ex:\r
97                     self.printError("readFace", ex)\r
98                     #return False\r
99 \r
100         self.printError("readFace", "invalid eof")\r
101         return False\r
102 \r
103     def readVertex(self, obj):\r
104         while(True):\r
105             line=self.getline()\r
106             if line==None:\r
107                 # eof\r
108                 break;\r
109             if line=="":\r
110                 # empty line\r
111                 continue\r
112 \r
113             if line=="}":\r
114                 return True\r
115             else:\r
116                 # vertex\r
117                 obj.addVertex(*[float(v) for v in line.split()])\r
118 \r
119         self.printError("readVertex", "invalid eof")\r
120         return False\r
121 \r
122     def readMaterial(self):\r
123         materials=[]\r
124         while(True):\r
125             line=self.getline()\r
126             if line==None:\r
127                 # eof\r
128                 break;\r
129             if line=="":\r
130                 # empty line\r
131                 continue\r
132 \r
133             if line=="}":\r
134                 return materials\r
135             else:\r
136                 # material\r
137                 secondQuaote=line.find('"', 1)                \r
138                 material=pymeshio.mqo.Material(line[1:secondQuaote])\r
139                 try:\r
140                     material.parse(line[secondQuaote+2:])\r
141                 except ValueError as ex:\r
142                     self.printError("readMaterial", ex)\r
143 \r
144                 materials.append(material)\r
145 \r
146         self.printError("readMaterial", "invalid eof")\r
147         return False\r
148 \r
149     def readChunk(self):\r
150         level=1\r
151         while(True):\r
152             line=self.getline()\r
153             if line==None:\r
154                 # eof\r
155                 break;\r
156             if line=="":\r
157                 # empty line\r
158                 continue\r
159 \r
160             if line=="}":\r
161                 level-=1\r
162                 if level==0:\r
163                     return True\r
164             elif line.find("{")!=-1:\r
165                 level+=1\r
166 \r
167         self.printError("readChunk", "invalid eof")\r
168         return False\r
169 \r
170 \r
171 def load(path):\r
172     with open(path, 'rb') as io:\r
173         loader=Loader(io)\r
174         model=pymeshio.mqo.Model()\r
175 \r
176         line=loader.getline()\r
177         if line!="Metasequoia Document":\r
178             print("invalid signature")\r
179             return False\r
180 \r
181         line=loader.getline()\r
182         if line!="Format Text Ver 1.0":\r
183             print("unknown version: %s" % line)\r
184 \r
185         while True:\r
186             line=loader.getline()\r
187             if line==None:\r
188                 # eof\r
189                 break;\r
190             if line=="":\r
191                 # empty line\r
192                 continue\r
193 \r
194             tokens=line.split()\r
195             key=tokens[0]\r
196             if key=="Eof":\r
197                 return model\r
198             elif key=="Scene":\r
199                 if not loader.readChunk():\r
200                     return\r
201             elif key=="Material":\r
202                 materials=loader.readMaterial()\r
203                 if not materials:\r
204                     return\r
205                 model.materials=materials\r
206             elif key=="Object":\r
207                 firstQuote=line.find('"')\r
208                 secondQuote=line.find('"', firstQuote+1)\r
209                 obj=loader.readObject(line[firstQuote+1:secondQuote])\r
210                 if not obj:\r
211                     return\r
212                 model.objects.append(obj)\r
213             elif key=="BackImage":\r
214                 if not loader.readChunk():\r
215                     return\r
216             elif key=="IncludeXml":\r
217                 firstQuote=line.find('"')\r
218                 secondQuote=line.find('"', firstQuote+1)\r
219                 print("IncludeXml", line[firstQuote+1:secondQuote])\r
220             else:\r
221                 print("unknown key: %s" % key)\r
222                 if not loader.readChunk():\r
223                     return\r
224         # error not reach here\r
225         raise ParseException("invalid eof")\r
226 \r