[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