OSDN Git Service

1b7e365abd42f44141c4f2ec963e03fc762ebd6b
[meshio/pymeshio.git] / pymeshio / mqo / reader.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 Reader(object):\r
19     """mqo reader\r
20     """\r
21     __slots__=[\r
22             "has_mikoto",\r
23             "eof", "ios", "lines",\r
24             "materials", "objects",\r
25             ]\r
26     def __init__(self, ios):\r
27         self.ios=ios\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.ios.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 read_from_file(path):\r
172     with io.open(path, 'rb') as ios:\r
173         return read(ios)\r
174 \r
175 \r
176 def read(ios):\r
177     print(type(ios), ios)\r
178     assert(isinstance(ios, io.IOBase))\r
179     reader=Reader(ios)\r
180     model=pymeshio.mqo.Model()\r
181 \r
182     line=reader.getline()\r
183     if line!="Metasequoia Document":\r
184         print("invalid signature")\r
185         return False\r
186 \r
187     line=reader.getline()\r
188     if line!="Format Text Ver 1.0":\r
189         print("unknown version: %s" % line)\r
190 \r
191     while True:\r
192         line=reader.getline()\r
193         if line==None:\r
194             # eof\r
195             break;\r
196         if line=="":\r
197             # empty line\r
198             continue\r
199 \r
200         tokens=line.split()\r
201         key=tokens[0]\r
202         if key=="Eof":\r
203             return model\r
204         elif key=="Scene":\r
205             if not reader.readChunk():\r
206                 return\r
207         elif key=="Material":\r
208             materials=reader.readMaterial()\r
209             if not materials:\r
210                 return\r
211             model.materials=materials\r
212         elif key=="Object":\r
213             firstQuote=line.find('"')\r
214             secondQuote=line.find('"', firstQuote+1)\r
215             obj=reader.readObject(line[firstQuote+1:secondQuote])\r
216             if not obj:\r
217                 return\r
218             model.objects.append(obj)\r
219         elif key=="BackImage":\r
220             if not reader.readChunk():\r
221                 return\r
222         elif key=="IncludeXml":\r
223             firstQuote=line.find('"')\r
224             secondQuote=line.find('"', firstQuote+1)\r
225             print("IncludeXml", line[firstQuote+1:secondQuote])\r
226         else:\r
227             print("unknown key: %s" % key)\r
228             if not reader.readChunk():\r
229                 return\r
230     # error not reach here\r
231     raise ParseException("invalid eof")\r
232 \r