[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ただいまコメントを受けつけておりません。
Mayaのシーンファイル(Maya Ascii)をMayaに読み込まずに直接情報を取得します。
## -*- coding: utf-8 -*- import os import re class Node(object): def __init__(self, path, nodetype): self.path = path self.nodetype = nodetype def _get_value(self, param, stg): ''' -n "hogehoge" のhogehoge部分を取得 ''' pattern = param + ' "(.+?)"' matchedList = re.findall(pattern, stg) if len(matchedList) is 0: return '' pattern = '^' + param + ' "|"$' return re.sub(pattern, '', matchedList[0]) def _get_node_name(self, stg): return self._get_value('-n', stg) def _get_parent(self, stg): return self._get_value('-p', stg) def search(self): list = [] fil = "createNode " + self.nodetype f = open(self.path) line = self._read(f) while line: if fil not in line: line = self._read(f) continue #目的のタイプのノードを発見 nd = NodeData() nd.name = self._get_node_name(line) nd.parent = self._get_parent(line) #attr line = self._read(f) while re.match('setAttr' , line) is not None: at = self._disassembly_setattr_data(line) nd.attr[at.name] = at line = self._read(f) list.append(nd) f.close() return list def _disassembly_setattr_data(self, stg): ''' setAttrの文字列を分解する ''' attr = AttrData() #アトリビュート名 attr.name = re.findall('"\..+?"', stg) if len(attr.name) > 0: attr.name = re.sub('"\.|"', '', attr.name[0]) #タイプ attr.type = re.findall('-type ".+?"', stg) if len(attr.type) > 0: attr.type = re.sub('-type "|"', '', attr.type[0]) else: attr.type = '' #値(多分末尾に書かれてる) attr.value = re.sub('^.+ |"|;', '', stg) attr.value = attr.value.strip() return attr def _read(self, file): ''' ;までを1行として読み込む strip()で先頭と末尾の空白文字(改行・タブなどなど)が簡単に取り除けるらしいよ。 ''' line = file.readline().strip() while line[-1:] != ';': l = file.readline().strip() #EOF if l == '': break line = line + l return line class NodeData(object): ''' ノードデータ ''' def __init__(self): self.name = '' self.parent = '' self.attr = {} class AttrData(object): ''' アトリビュートデータ ''' def __init__(self): self.value = '' self.name = '' self.type = ''
とりあえず新規シーンをMaya Asciiで保存します。
今回のコードは自分の必要な部分だけなので、取得できるのはノードの情報のみです。
使い方は以下のような感じ。
nodes = Node(r'c:\test.ma', 'camera').search()
これでシーン内のカメラの情報を取得します。
情報をprint文で書き出してみましょ。
4 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [node name]perspShape [parent node]persp [attr name]ncp [value]10 [type] [attr name]imn [value]persp [type]string [attr name]den [value]persp_depth [type]string [attr name]v [value]no [type] [attr name]coi [value]180.75837217595105 [type] [attr name]hc [value]%camera [type]string [attr name]fl [value]128.07659939244272 [type] [attr name]man [value]persp_mask [type]string =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [node name]topShape [parent node]top [attr name]ncp [value]10 [type] [attr name]o [value]yes [type] [attr name]rnd [value]no [type] [attr name]ow [value]30 [type] [attr name]den [value]top_depth [type]string [attr name]v [value]no [type] [attr name]coi [value]100.1 [type] [attr name]hc [value]%camera [type]string [attr name]imn [value]top [type]string [attr name]man [value]top_mask [type]string =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [node name]frontShape [parent node]front [attr name]ncp [value]10 [type] [attr name]o [value]yes [type] [attr name]rnd [value]no [type] [attr name]ow [value]30 [type] [attr name]den [value]front_depth [type]string [attr name]v [value]no [type] [attr name]coi [value]100.1 [type] [attr name]hc [value]%camera [type]string [attr name]imn [value]front [type]string [attr name]man [value]front_mask [type]string =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- [node name]sideShape [parent node]side [attr name]ncp [value]10 [type] [attr name]o [value]yes [type] [attr name]rnd [value]no [type] [attr name]ow [value]30 [type] [attr name]den [value]side_depth [type]string [attr name]v [value]no [type] [attr name]coi [value]100.1 [type] [attr name]hc [value]%camera [type]string [attr name]imn [value]side [type]string [attr name]man [value]side_mask [type]string