忍者ブログ
2017/12/14

Maya Asciiから直接情報取得

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

2016/06/28

Maya Asciiから直接情報取得

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

なにやら怪しげな部分もありますが、シーンに最初から存在してるカメラの情報がなんとなく取得できてます。
取得するノード名を変えれば他の種類のノードの情報も取得できます。
ただし、未対応なフラグや情報は多いですし、setAttrしか処理してませんから追加されたアトリビュートなどの情報は取得できておりませんのでご注意を^^;

拍手[5回]

PR

コメント

プロフィール

HN:
モチオ
性別:
非公開
自己紹介:
テクニカルアーティスト(アニメーション出身)サポート対象Softimage/MotionBuilder/Mayaなど 言語 javascript / PHP / Python / VBAなど Webアプリも少しだけ作れる

P R