2016/08/28

[Maya]OpenMayaでNurbsCurve作成2

api1.0使用
ポイント位置のリストを受け取りカーブを作成
選択がTransformを継承しているオブジェクトだったらその下に、そうでなければ新しいオブジェクトを作ってその下にカーブシェイプを作る
import maya.OpenMaya as om

pntPoss = [
(0, 0, -1.0),
(-1, 0, 0.5),
(1, -0, 0.5),
(0, 0, -1.0),
]

def getMPoints(pntPoss):
    pnts = om.MPointArray()
    for pntPos in pntPoss:
        pnts.append(om.MPoint(*pntPos))
    return pnts
    
def getSelection():
    sl = om.MSelectionList()
    om.MGlobal.getActiveSelectionList(sl)
    if not sl.length():
        return
    dagPath = om.MDagPath()
    sl.getDagPath(0, dagPath)
    if not dagPath.hasFn(om.MFn.kTransform):
        return
    node = dagPath.node()
    return node
        
def createCurve(pntPoss):
    crv = om.MFnNurbsCurve()
    pnts = getMPoints(pntPoss)
    deg = 1
    span = pnts.length() - deg
    knotCnt = span + 2 * deg -1
    knots = om.MDoubleArray()
    for i in range(knotCnt):
        knots.append(i)
    sl = getSelection()
    if not sl:
        sl = om.MObject()
    crv.create(pnts, knots, deg, om.MFnNurbsCurve.kOpen, False, False, sl)

createCurve(pntPoss)

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)