1 #!/usr/bin/env python
\r
7 PMDEditor's Lib/PMX仕様/PMX仕様.txt
\r
9 __author__="ousttrue"
\r
11 __versioon__="0.0.1"
\r
19 class Model(object):
\r
22 version: pmx version
\r
25 'version', # pmx version
\r
26 'name', # model name
\r
27 'english_name', # model name in english
\r
28 'comment', # model comment
\r
29 'english_comment', # model comment in english
\r
45 self.__model=Model()
\r
47 def read(self, path: 'filepath') -> Model:
\r
48 size=os.path.getsize(path)
\r
49 with open(path, "rb") as f:
\r
50 if self.load(path, f, size):
\r
53 def load(self, path: 'filepath', io: io.IOBase, size: int) -> bool:
\r
56 self.__check_position()
\r
58 if not self.__loadHeader():
\r
60 self.__check_position()
\r
62 self.__model.name = self.__read_text()
\r
63 self.__model.english_name = self.__read_text()
\r
64 self.__model.comment = self.__read_text()
\r
65 self.__model.english_comment = self.__read_text()
\r
68 def __str__(self) -> str:
\r
71 def __check_position(self):
\r
72 self.__pos=self.__io.tell()
\r
74 def __unpack(self, fmt: str, size: int) -> "read value as format":
\r
75 return struct.unpack(fmt, self.__io.read(size))[0]
\r
77 def __loadHeader(self) -> bool:
\r
78 signature=self.__unpack("4s", 4)
\r
79 if signature!=b"PMX ":
\r
80 print("invalid signature", signature)
\r
82 version=self.__unpack("f", 4)
\r
84 print("unknown version", version)
\r
85 self.__model.version=version
\r
87 flag_bytes=self.__unpack("B", 1)
\r
89 print("invalid flag length", flag_bytes)
\r
92 text_encoding=self.__unpack("B", 1)
\r
93 if text_encoding==0:
\r
95 size=self.__unpack("I", 4)
\r
96 return self.__unpack("{0}s".format(size), size).decode("UTF16")
\r
97 elif text_encoding==1:
\r
99 size=self.__unpack("I", 4)
\r
100 return self.__unpack("{0}s".format(size), size).decode("UTF8")
\r
102 print("unknown text encoding", text_encoding)
\r
104 self.__read_text=read_text
\r
105 self.__unpack("B", 1)
\r
106 self.__unpack("B", 1)
\r
107 self.__unpack("B", 1)
\r
108 self.__unpack("B", 1)
\r
109 self.__unpack("B", 1)
\r
110 self.__unpack("B", 1)
\r
111 self.__unpack("B", 1)
\r