ラベル maya の投稿を表示しています。 すべての投稿を表示
ラベル maya の投稿を表示しています。 すべての投稿を表示

2017/07/30

[Maya][Python]FaceVertexごとのカラーの取得

時間たっちゃったけど引き続きopenMayaを使ってポリゴンから情報を抽出。
faceVertex毎のカラーを取得。
import maya.OpenMaya as om
import maya.api.OpenMaya as om2
 
sels = om.MSelectionList()
om.MGlobal.getActiveSelectionList(sels)
node = om.MDagPath()
sels.getDagPath(0, node)
#vertIter = om.MItMeshVertex(node)
fvertIter = om.MItMeshFaceVertex(node)
faceIter = om.MItMeshPolygon(node)
intArr = om.MIntArray()
color = om.MColor()
colors = []
for i in range(faceIter.count()):
    faceIter.getVertices(intArr)
    for j in intArr:
        if not fvertIter.hasColor():
            continue
        fvertIter.getColor(color)
        colors.append([color.r, color.g, color.b, color.a])
        fvertIter.next()
    faceIter.next()
print colors

2017/07/01

[Maya][Python]MItMeshPolygon (api1.0)

会社ではMaya2015もサポートしなきゃいけないのでapi1.0で書く必要が。。。
なんでこんなにめんどくさいの。。。 

選択オブジェクトのフェース面積を表示するサンプル
import maya.OpenMaya as om
import maya.api.OpenMaya as om2

sels = om.MSelectionList()
om.MGlobal.getActiveSelectionList(sels)
node = om.MDagPath()
sels.getDagPath(0, node)
poly = om.MItMeshPolygon(node)
mesh = om.MFnMesh(node)
areaParam = om.MScriptUtil()
areaParam.createFromDouble(0.0)
areaPtr = areaParam.asDoublePtr()
faceid = 0
area = []
for i in range(poly.count()):
    poly.getArea(areaPtr)
    poly.next()
    area = om.MScriptUtil(areaPtr).asDouble()
    print area

2016/09/04

[Maya][Python]デコレータでmayaバージョンごとに処理分け

pythonドキュメントにpropertyデコレータの挙動を解説するために同じ処理を再現したクラスが載っていてすごく勉強になりました。

で、mayaのバージョンごとに処理を変える方法ないかなーと思っていたので↑を参考にデコレータで実装してみました。
最後の行でdoSomething関数を実行していますが、同じ関数名でもmayaのバージョンによって処理が変わります。

import maya.cmds as cmds

maya_version = cmds.about(version=1) # mayaのバージョン


## バージョンごとに関数(メソッド)の処理を変えるデコレータ
class DoOnVertion(object):
    
    ## 初期化
    def __init__(self, func):
        self.func = func
        
        
        
    ## 関数のように呼び出された時の処理
    #  self.funcを実行する
    def __call__(self, *args, **kwargs):
        return self.func(*args, **kwargs)
        
        
        
    ## 指定されたバージョンとmayaバージョンが合っていれば関数(メソッド)を置き換える
    def version(self, version):
        print 'Replace funcition if version is [{0}].'.format(version)
        
        def new_func(func):
            if maya_version == version:
                rtn = func
            else:
                rtn = self.func
            return type(self)(rtn)
            
        return new_func
            
        

# 指定バージョン以外のときの処理
@DoOnVertion
def doSomething(name=None):
    print 'do something with argument [{0}].'.format(name)
    
    
# バージョン2015で実行したときの処理
@doSomething.version('2015')
def doSomething(name='cube'):
    cmds.polyCube(name=name)
 
 
# バージョン2016で実行したときの処理
@doSomething.version('2016')
def doSomething(name='joint'):
    cmds.createNode('joint', name=name)
   
   
# バージョン2017で実行したときの処理
@doSomething.version('2017')
def doSomething(name='transform'):
    cmds.createNode('transform', name=name)
    
    
# doSomething関数の実行
# 実行するmayaのバージョンによって処理が変わる
doSomething()

2016/08/23

[Maya]OpenMayaでカーブのポイントを取得

api2.0(2016以降)
import maya.api.OpenMaya as om2

def main():
    sl = om2.MGlobal.getActiveSelectionList()
    dagPath = sl.getDagPath(0)
    try:
        dagPath.extendToShape()
    except:
        return
    if not dagPath.hasFn(om.MFn.kNurbsCurve):
        return
    crv = om.MFnNurbsCurve(dagPath)
    pnts = fn_crv.cvPositions()
    for pnt in pnts:
        print pnt
        
        
main()
api1.0
import maya.OpenMaya as om
util = om.MScriptUtil()

def main():
    sl = om.MSelectionList()
    om.MGlobal.getActiveSelectionList(sl)
    dagPath = om.MDagPath()
    sl.getDagPath(0, dagPath)
    try:
        dagPath.extendToShape()
    except: return
    if not dagPath.hasFn(om.MFn.kNurbsCurve):
        return
    crv = om.MFnNurbsCurve(dagPath)
    pnts = om.MPointArray()
    crv.getCVs(pnts)
    for i in range(pnts.length()):
        pnt = pnts[i]
        print pnt.x, pnt.y, pnt.z
main()

[Maya]OpenMayaでNurbsCurve

2016以降(api2.0使用)

import maya.api.OpenMaya as om

curveFn = om.MFnNurbsCurve()
deg = 1
vts = om.MPointArray()
vts.append( om.MPoint(1,0,-1) )
vts.append( om.MPoint(-1,0,-1) )
vts.append( om.MPoint(-1,0,1) )
vts.append( om.MPoint(1,0,1) )
vts.append( om.MPoint(1,0,-1) )
span = len(vts) - deg
nknots    = span + 2*deg - 1
knots = om.MDoubleArray()
for i in xrange(nknots):
    knots.append(i)

sl = om.MGlobal.getActiveSelectionList()
dagPath = sl.getDagPath(0)
node = dagPath.node()
curve = curveFn.create( vts, knots, deg, om.MFnNurbsCurve.kOpen, False, False, node)


2015以前

import maya.OpenMaya as om

curveFn = om.MFnNurbsCurve()
deg = 1
vts = om.MPointArray()
vts.append( om.MPoint(1,0,-1) )
vts.append( om.MPoint(-1,0,-1) )
vts.append( om.MPoint(-1,0,1) )
vts.append( om.MPoint(1,0,1) )
vts.append( om.MPoint(1,0,-1) )
span = vts.length() - deg
nknots    = span + 2*deg - 1
knots = om.MDoubleArray()
for i in xrange(nknots):
    knots.append(i)

sl = om.MSelectionList()
om.MGlobal.getActiveSelectionList(sl)
dagPath = om.MDagPath()
sl.getDagPath(0, dagPath)
node = dagPath.node()
curve = curveFn.create( vts, knots, deg, om.MFnNurbsCurve.kOpen, False, False, node)