import maya.mel gGuiStartupTime = maya.mel.eval("$temp = $gGuiStartupTime") t = pm.timerX(startTime=gGuiStartupTime) print ('Maya使用時間 '+str(t/3600)+'時間 '+str(t/60%60)+'分')
for f in dir(pymel.core): if 'get' in f: print f
for i in range(1,11): pm.importFile("X:/maya/tmp"+str(i)+".obj")
pm.renameFile('test.ma') pm.saveFile(type='mayaAscii')任意のディレクトリ(フォルダ)に保存する場合。
pm.renameFile('X:/tmp/test.mb') pm.saveFile()
s='-p -1 0 -1 -p 1 0 -1 -p 1 0 1 -p -1 0 1 -p -1 0 -1' p = [float(x) for x in s.split() if x != '-p'] print [p[3*i:3*i+3] for i in range(len(p)/3)]このスクリプトをスクリプトエディタで実行すると [[-1.0, 0.0, -1.0], [1.0, 0.0, -1.0], [1.0, 0.0, 1.0], [-1.0, 0.0, 1.0], [-1.0, 0.0, -1.0]] という文字列がヒストリペインに表示される。
pm.sphere() pm.refresh() pm.pause(sec=5) pm.cone()
パーティクル Dynamics/Solvers__Create_Particle_Disk_Cache_.html
import pymel.core as pm sp = pm.spaceLocator(p=(0, 0, 0)) lname = pm.PyNode(sp) sname = pm.sphere() pm.move([1, 2, 3]) sph = pm.listRelatives(sname[0], s=True) cpm = pm.createNode('closestPointOnSurface') sph[0].ws >> cpm.inputSurface lname.t >> cpm.inPosition p = cpm.p.get() pm.move(lname, p)
import pymel.all as all all.optionVar['tmpVar'] = 3.5tmpVar を参照。
for f in pm.selected(): if 'default' in f.name(): print f
以下のtobjにはpymel.core.nodetypes.Transformのオブジェクトが入っているとする。
obj, obj1, obj2などはpymel.core.nodetypesのオブジェクトである。
for s in pm.selected(): if s.type() == 'joint': print s + ' is joint'または
for s in pm.selected(): if s.nodeType() == 'joint': print s + ' is joint'または
for s in pm.selected(): if pymel.core.nodetypes.Joint == type(s): print s + ' is joint'
def newObjExists(name): return pm.objExists(name) | pm.objExists('*:' + name)ネームスペース付も含めてオブジェクトのリストを返すコマンド。
import pymel.core as pm sel = pm.selected() sl = sel[1].getShape() pm.parent(sl, sel[0], s=True, add=True) pm.delete(sel[1])
以下のtobjにはpymel.core.nodetypes.Transformのオブジェクトが入っているとする。
obj, obj1, obj2などはpymel.core.nodetypesのオブジェクトである。
import pymel.core as pm def limitTranslateValue(v): objs = [] for n in pm.selected(tr=True): t = n.t.get() xyz = ['tx', 'ty', 'tz'] t = [(xyz[i],a) for i,a in enumerate(t) if a > v] objs.append((n.name(), t)) return objs print limitTranslateValue(1)[(u'pSphere1', [('tx', 4.688991273300879)]), (u'nurbsSphere1', [('ty', 2.0), ('tz', 3.0)]), (u'nurbsSphere2', [('ty', 2.0), ('tz', 3.0)]), (u'nParticle1', []), (u'nucleus1', [])]
import pymel.core.datatypes as dt s = pm.PyNode('nurbsSphere1') p = dt.Point((1, 2, 3)) s.setCV(2, 3, p)
import pymel.core.datatypes as dt c = pm.PyNode('curve1') p = dt.Point((1, 2, 3)) c.setCV(1, p, space='world')
from random import uniform import pymel.core as pm def rand3(min, max): return [uniform(min, max) for i in range(3)] s,m = pm.cylinder() for cv in s.cv: pm.move(cv, rand3(-0.3, 0.3), r=True)
import pymel.core.datatypes as dt p1= pm.PyNode('pSphere1') p = dt.Point((1, 2, 3)) p1.setPoint(2, p)
normals = [] for f in pm.polyInfo(obj.f, faceNormals=True): normals.append([float(i) for i in f.split()[-3:]])
def findNPolygon1(n=3): ps = pm.selected() return [f for f in ps[0].f if len(f.getEdges()) == n]
def findNPolygon2(n=3): ps = pm.selected() return [f for f in ps[0].f if len(f.getEdges()) > n]
def splitNPolygonFace(n): for f in findNPolygon2(n): pm.setToolTo('polySplitContext') pm.select(f) pm.viewFit('persp') return
p,m = pm.polySphere(sx=7, sy=7, r=3) for f in p.f: pm.polyExtrudeFacet(f) n = f.getNormal() pm.move(f, n, r=True)
ref = obj.referenceFile() if ref: # リファレンスでなければNone print ref.path
with pm.window(): with pm.autoLayout(): mp = pm.modelPanel(camera='top') mp.setCamera('front')パネルの名前がわかっている場合は以下のコマンド。
import pymel.core as pm p1 = pm.xform('joint1', q=True, ws=True, t=True) p2 = pm.xform('joint2', q=True, ws=True, t=True) dname = pm.distanceDimension(sp=p1, ep=p2) print dname.dist.get()ベクトルを使う方法
import pymel.core.datatypes as dt p1 = pm.xform('joint1', q=True, ws=True, t=True) p2 = pm.xform('joint2', q=True, ws=True, t=True) v1 = dt.Vector(p1) v2 = dt.Vector(p2) print v1.distanceTo(v2)
lambert1 = pm.PyNode('lambert1') lambert1.color.set(1, 0, 0)
import pymel.core as pm sname = pm.sphere() shname = pm.shadingNode('blinn', asShader=True) sgname = pm.sets(renderable=True, noSurfaceShader=True, empty=True) pm.connectAttr(shname + '.outColor', sgname + '.surfaceShader', f=True) pm.select(sname[0]) pm.sets(sgname, e=True, forceElement=True)mentalrayのmia_materialをアサインするスクリプト。
import pymel.core as pm sname = pm.sphere() shname = pm.shadingNode('mia_material', asShader=True) sgname = pm.sets(renderable=True, noSurfaceShader=True, empty=True) pm.connectAttr(shname + '.diffuse', sgname + '.surfaceShader', f=True) pm.select(sname[0]) pm.sets(sgname, e=True, forceElement=True)
name = pm.ls(sl=True, type='file') fn = [n.fileTextureName.get() for n in name] os.chdir('C:/Program Files/Adobe/Adobe Photoshop CC 2015'); fn = [f.replace('/', '\\') for f in fn] fn = ' '.join(fn) os.system('start Photoshop ' + fn)
画像フォーマット | 番号 |
---|---|
GIF | 0 |
SI | 1 |
RLA | 2 |
Tiff | 3 |
Tiff16 | 4 |
SGI | 5 |
Alias | 6 |
IFF | 7 |
JPEG | 8 |
EPS | 9 |
IFF16 | 10 |
Cineon | 11 |
Quantel | 12 |
SGI16 | 13 |
TARGA | 19 |
BMP | 20 |
SGIMV | 21 |
QT | 22 |
AVI | 23 |
MACPAINT | 30 |
PHOTOSHOP | 31 |
PNG | 32 |
QUICKDRAW | 33 |
QTIMAGE | 34 |
DDS | 35 |
DDS | 36 |
IMFplugin | 50 |
Custom | 51 |
SWF | 60 |
AI | 61 |
SVG | 62 |
SWFT | 63 |
drg = pm.PyNode('defaultRenderGlobals') drg.animation.set(1) drg.putFrameBeforeExt.set(1) drg.periodInExt.set(1) if drg.outFormatControl.get() == 1: drg.outFormatControl.set(0) drg.extensionPadding.set(4) drg.startFrame.set(1) drg.endFrame.set(300)
def makeMyWindow(): name = 'myWindow' if pm.window(name, ex=True): pm.deleteUI(name) with pm.window(name): with pm.autoLayout(): pm.button() makeMyWindow()
import pymel.core as pm with pm.window() as win: with pm.autoLayout(): pm.button() pm.showSelectionInTitle(win)
import pymel.core as pm with pm.window() as win: with pm.autoLayout(): pm.text(label='Window1') with pm.window(): with pm.autoLayout(): pm.button(label='Window1の表示・非表示', command=pm.Callback(pm.toggleWindowVisibility, win))
for w in pm.lsUI(windows=True): pm.window(w, e=True, tlc=(100, 100))位置をずらしながら並べるバージョン
import pymel.core as pm def moveAllWindows(): x = 100 y = 100 for w in pm.lsUI(windows=True): pm.window(w, e=True, tlc=(x, y)) x += 50 y += 50 moveAllWindows()
import pymel.core as pm names = pm.resourceManager(nameFilter='*.png') with pm.window(w=1024, h=768): with pm.scrollLayout(): for i in range(30): with pm.horizontalLayout(): for j in range(50): pm.iconTextButton(w=32, h=32, i=names[50*i+j])違うバージョン
import pymel.core as pm def dispPngName(tf, img): tf.setText(img) names = pm.resourceManager(nameFilter='*.png') with pm.window(): with pm.columnLayout(adj=True): tf = pm.textField() with pm.scrollLayout(): size = len(names) it = iter(names) for i in range(size/50+1): with pm.horizontalLayout(): for j in range(50): try: p = it.next() except: break pm.iconTextButton(w=32, h=32, i=p, c=pm.Callback(dispPngName, tf, p))
import pymel.core as pm with pm.window(): with pm.autoLayout(): op = pm.outlinerPanel() oe = op.getOutlinerEditor() pm.outlinerEditor(oe, edit=True, showShapes=True)
import pymel.core as pm win = pm.window() with win: layout = pm.horizontalLayout() with layout: pm.button() pm.button() pm.button()
import pymel.core as pm with pm.window(): with pm.columnLayout(): with pm.horizontalLayout(): pm.button() pm.button() pm.button() with pm.horizontalLayout(): pm.button() pm.button() pm.button()
import pymel.core as pm def test1(str): print str with pm.window(): with pm.columnLayout(): pm.button(command=pm.Callback(test1, 'name'))
import pymel.core as pm with pm.window(): with pm.formLayout() as form: pic1 = pm.picture(image='X:/tmp/madras.png') i1 = pm.iconTextButton(w=33, h=33, style='iconOnly', image1='sphere.xpm') pm.formLayout(form, edit=True, attachForm=((pic1, 'top', 0), (pic1, 'left', 0), (i1, 'top', 50), (i1, 'left', 50)), attachNone=((pic1, 'bottom'), (pic1, 'right'), (i1, 'bottom'), (i1, 'right')))
import pymel.core as pm def changeMinValue(): v = pm.floatField('myMinField', q=True, value=True) pm.floatField('myInputField', e=True, min=v) def changeMinValueByButton(): v = pm.floatField('myInputField', q=True, value=True) pm.floatField('myMinField', e=True, value=v) pm.floatField('myInputField', e=True, min=v) with pm.window(): with pm.horizontalLayout(): pm.floatField('myMinField', cc=pm.Callback(changeMinValue)) pm.button(label=' < ', c=pm.Callback(changeMinValueByButton)) pm.floatField('myInputField', min=0)スクリプトの実行結果
import os import pymel.core as pm def optionMenuSample1(location): num = pm.optionMenu('brushesOptionMenu', q=True, ni=True) fname = pm.optionMenu('foldersOptionMenu', q=True, v=True) names = pm.getFileList(fld=location + fname + '/', fs='*.mel') for i,n in enumerate(names): if i < num: pm.menuItem('brushesMenuItem' + str(i), e=True, label=n) else: pm.menuItem('brushesMenuItem' + str(i), p='brushesOptionMenu', label=n) for j in range(i, num): pm.deleteUI('brushesMenuItem' + str(i)) with pm.window(): with pm.autoLayout(): location = os.environ.get('MAYA_LOCATION') location += '/brushes/' pm.optionMenu('foldersOptionMenu', label='Folders', cc=pm.Callback(optionMenuSample1, location)) names = pm.getFileList(fld=location, fs='*') for n in names: pm.menuItem(label=n) pm.optionMenu('brushesOptionMenu', label='Brushes') names = pm.getFileList(fld=location + names[0] + '/', fs='*.mel') for i,n in enumerate(names): pm.menuItem('brushesMenuItem' + str(i), label=n)
import pymel.core as pm with pm.window(): with pm.autoLayout(): colorPalette = pm.palettePort(dimensions=(16, 2), width=16 * 20, height=2 * 20, transparent=0, topDown=True, colorEditable=False) for i in range(1, 32): col = pm.colorIndex(i, query=True) pm.palettePort(colorPalette, edit=True, rgbValue=(i, col[0], col[1], col[2]))
import pymel.core as pm with pm.window(): with pm.autoLayout(): pm.button(bgc=(1.0, 0.0, 0.0)) pm.button(bgc=(0.0, 1.0, 0.0)) pm.button(bgc=(0.0, 0.0, 1.0))
import pymel.core as pm def makeButton1(dragControl, dropControl, msgs, x, y, type): com = msgs[0] pm.setParent(dropLayout) eval(com); pm.setParent('..') def dragButton1(dragControl, x, y, mods): msgs = [] msgs.append('pm.button()') return msgs with pm.window(): with pm.columnLayout(dpc=makeButton1) as dropLayout: pass with pm.window(): with pm.columnLayout(): pm.button(dgc=dragButton1)下図では、window2 の button32から window1 にドラッグアンドドロップして window1 に新たにボタンが作成されている。
import pymel.core as pm with pm.window() as myWindow: with pm.autoLayout() as myLayout: pm.button('myButton')print pm.objectTypeUI(myWindow)
import pymel.core as pm with pm.window() as myWindow: with pm.autoLayout() as myLayout: pm.button('myButton')print pm.layout(myLayout, q=True, childArray=True)
import pymel.core as pm with pm.window() as myWindow: with pm.autoLayout() as myLayout: pm.button('myButton')print pm.layout(myLayout, q=True, ex=True)
import pymel.core as pm def displayCurrentFrame(): return pm.currentTime(q=True) pm.headsUpDisplay('HUDDisplayCurrentFrame', section=5, block=1, blockSize='medium', label='Frame', command=displayCurrentFrame, event='timeChanged')
with pm.window(): with pm.formLayout() as form: b1 = pm.button(label='button') pm.formLayout(form, edit=True, attachForm=((b1,'top', 0), (b1, 'bottom', 0), (b1, 'right', 10)), attachOppositeForm=(b1, 'left', -100))