import maya.cmds as cmds items = cmds.ls(sl=True) cmds.keyingGroup(items, name='testKG') cmds.keyingGroup(items, edit=True, activator='testKG')キーンググループは親子付けできるけどキーンググループ同士の親子付けだけだと子が消えた時に親も一緒に消えてしまうのでなんらかのキー設定オブジェクトを紐づけておいた方が良さそう
2018/03/27
[Maya]相互にキーを打てるようにするキーンググループ
2017/07/30
[Maya][Python]FaceVertexごとのカラーの取得
時間たっちゃったけど引き続きopenMayaを使ってポリゴンから情報を抽出。
faceVertex毎のカラーを取得。
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のバージョンによって処理が変わります。
で、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/09/02
2016/08/28
[Maya]OpenMayaでNurbsCurve作成2
api1.0使用
ポイント位置のリストを受け取りカーブを作成
選択がTransformを継承しているオブジェクトだったらその下に、そうでなければ新しいオブジェクトを作ってその下にカーブシェイプを作る
ポイント位置のリストを受け取りカーブを作成
選択が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/24
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)
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)
2015/10/27
2015/10/16
2012/12/21
インスタンスモデルを普通のモデルに戻す
すげー久しぶりの更新。。。
標準機能にあると思って探したけどどうやらないみたいなので書きました。
インスタンスモデルを普通のモデルに戻すスクリプトです。
マスターモデルを選択して実行。
とりあえず動くけど直したいところは結構あります。
とりあえずメモってことで。
マスターモデルをデュプリケイトして位置と名前と親を合わせただけですね。
毎回DeleteObjすると効率が悪いので外に出していっぺんにやりましたが、Duplicateも同様なので修正したいです。
ま、時間があるときにまた直すかも。
標準機能にあると思って探したけどどうやらないみたいなので書きました。
インスタンスモデルを普通のモデルに戻すスクリプトです。
マスターモデルを選択して実行。
とりあえず動くけど直したいところは結構あります。
とりあえずメモってことで。
from siutils import si, disp
def GetInstances(oMdl):
gInsts = oMdl.Groups('InstanceGroup')
return gInsts.Members
def ResotreInstance(oInst, oMstr=None, bDel=True):
if not oMstr:
oMstr = oInst.InstanceMaster
sInstName = oInst.Name
oParent = oInst.Parent
oTmp = si.Duplicate("B:"+oMstr.Name, "", 2, 1, 1, 0, 2, 1, 0, 1, "", "", "", "", "", "", "", "", "", "", 0)(0)
oTmp.Kinematics.Global.Transform = oInst.Kinematics.Global.Transform
oTmp = disp(oTmp)
if bDel:
si.DeleteObj(oInst)
oTmp.Name = sInstName
oParent.AddChild(oTmp)
return oTmp
oMdl = si.Selection(0)
if not oMdl.Type == '#model':
oMdl = oMdl.Model
oInsts = GetInstances(oMdl)
for oInst in oInsts:
ResotreInstance(oInst, oMdl, False)
si.DeleteObj(oInsts)
マスターモデルをデュプリケイトして位置と名前と親を合わせただけですね。
毎回DeleteObjすると効率が悪いので外に出していっぺんにやりましたが、Duplicateも同様なので修正したいです。
ま、時間があるときにまた直すかも。
2012/06/13
http://www.sublimetext.com/
こんなテキストエディタあったんだなぁ。
シンプルで使いやすそう。
WebページにはBuyって書いてあるから無料ではないのかな?
ちゃんと読んでみよう。
こんなテキストエディタあったんだなぁ。
シンプルで使いやすそう。
WebページにはBuyって書いてあるから無料ではないのかな?
ちゃんと読んでみよう。
2012/06/12
2012/05/14
2012/05/11
2012/05/04
Softimageの開発陣が移動???
http://goo.gl/L0UIY
なんかAutodeskの人事異動でSoftimageの開発チームがMayaチームに移動、って感じのことが書いてある気がする。。。
コメント見ても「この世の終わりだ」的なものが多いし。
大丈夫なのか???
なんかAutodeskの人事異動でSoftimageの開発チームがMayaチームに移動、って感じのことが書いてある気がする。。。
コメント見ても「この世の終わりだ」的なものが多いし。
大丈夫なのか???
2012/01/29
os.walk()? os.path.walk()???
先日フォルダの中を再帰的に処理する必要があったときに、先輩にこんな愚痴をこぼしました。
Pythonのwalk()ってわかりにくいですよね。」
walk()というのはあるフォルダの中を再帰的に処理するためのメソッドです。
すると先輩は
「え?そう?わかりやすいと思うけど。」
まじですか。。。
俺がバカなだけですか???
と思っていたら、どうやらお互い違うもののことを言っていたらしいです。
Pythonにはos.walk()とos.path.walk()があるって知ってました?
自分がわかりにくいと言ったのはos.path.walk()。
先輩がわかりやすいと言ったのはos.walk()
os.path.walk()はこんな感じ
C:\Python27\Lib\xmlの中のすべてのファイルを表示する
walk()に自作の関数を食わせるって。
walk()に食わせた引数が自作関数の中でどう使われるのかも覚えにくいし。
os.walk()はどうかというとこんな感じ
Pythonのwalk()ってわかりにくいですよね。」
walk()というのはあるフォルダの中を再帰的に処理するためのメソッドです。
すると先輩は
「え?そう?わかりやすいと思うけど。」
まじですか。。。
俺がバカなだけですか???
と思っていたら、どうやらお互い違うもののことを言っていたらしいです。
Pythonにはos.walk()とos.path.walk()があるって知ってました?
自分がわかりにくいと言ったのはos.path.walk()。
先輩がわかりやすいと言ったのはos.walk()
os.path.walk()はこんな感じ
C:\Python27\Lib\xmlの中のすべてのファイルを表示する
import os
## dirpathの中のパスをすべて表示する関数
# os.path.walkの中で使うことで引数に以下の情報が入る
#
# arg = walk()の第3引数で指定できる自由になる引数(ここではNone)
# dirpath = 現在処理中のディレクトリパス
# namelist = 現在処理中のディレクトリ内のすべてのアイテムの名前のリスト
#
def printall(arg, dirname, names):
# 処理中のディレクトリパスとアイテム名を繋げたものがファイルだったら表示
for name in names:
fullpath = os.path.join(dirname, name)
if os.path.isfile(fullpath):
print fullpath
# ↑のprintall関数を指定してos.path.walk()を実行
os.path.walk(r'C:\Python27\Lib\xml', printall, None)
結果はこんな感じ(要素数:39)
# INFO : C:\Python27\Lib\xml\dom # INFO : C:\Python27\Lib\xml\etree # INFO : C:\Python27\Lib\xml\parsers # INFO : C:\Python27\Lib\xml\sax # INFO : C:\Python27\Lib\xml\__init__.py # INFO : C:\Python27\Lib\xml\__init__.pyc ...これってわかりにくいですよね。。。
walk()に自作の関数を食わせるって。
walk()に食わせた引数が自作関数の中でどう使われるのかも覚えにくいし。
os.walk()はどうかというとこんな感じ
import os
# os.walk()はディレクトリを受け取って中身を
# (処理中のディレクトリパス, その中のディレクトリリスト, ファイルリスト)というタプルを返す
# それをdirpath, dirnames, filenamesに割り振ってfilesの中身をまわしてdirpathと繋げて表示
#
for dirpath, dirnames, filenames in os.walk(r'C:\Python27\Lib\xml'):
for f in filenames:
print os.path.join(dirpath, f)
結果はこんな感じ(要素数:39)
順番は異なりますが要素数を見るとどちらもすべてのファイルを検出できてそう。
# INFO : C:\Python27\Lib\xml\__init__.py # INFO : C:\Python27\Lib\xml\__init__.pyc # INFO : C:\Python27\Lib\xml\dom\domreg.py # INFO : C:\Python27\Lib\xml\dom\domreg.pyc # INFO : C:\Python27\Lib\xml\dom\expatbuilder.py # INFO : C:\Python27\Lib\xml\dom\minicompat.py ...うーん、シンプル。。。 こりゃ確かにわかりやすいわ。 今後はこちら一択ですね。 ところでPython2.7のドキュメントを見るとos.path.walk()は廃止予定で3.0ではすでに削除されてるとか。。。 知らなかった。。。 Pythonクイックリファレンスはすごく詳しく書いてあって良いんですが2.3までのことしか書いてないので新しい情報は別から得ないとなぁ。
2012/01/18
登録:
投稿 (Atom)