import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx sl = OpenMaya.MSelectionList()
OpenMaya.MGlobal.getActiveSelectionList(sl)
itersl = OpenMaya.MItSelectionList(sl, OpenMaya.MFn.kDagNode) dagPath = OpenMaya.MDagPath()
dagFn = OpenMaya.MFnDagNode() while (not itersl.isDone()):
itersl.getDagPath(dagPath)
try:
dagPath.extendToShape() # get shaper node
except:
pass
dagObject = dagPath.node()
dagFn.setObject(dagObject)
name = dagFn.name()
print 'Get the Dag Node Name Is :', name itersl.next() # create MFnMeshVertex
object = OpenMaya.MItMeshVertex(dagPath)
while (not object.isDone()):
print object.position().x
object.next()
http://ewertb.soundlinker.com/api/api.php
https://nccastaff.bournemouth.ac.uk/jmacey/RobTheBloke/www/mayaapi.html
https://nccastaff.bournemouth.ac.uk/jmacey/RobTheBloke/www/research/maya/mfnanimcurve.htm
Python PIP升级:
python -m pip install --upgrade pip
Event in Maya Api to capture currentTime / frame change
http://download.autodesk.com/us/maya/2009help/API/class_m_event_message.html#c038e5bbbfc19b2772d1a01220b570c0
// ... // Our callback Id array to
// store the Ids of all our callbacks
// for later removal
MCallbackIdArray myCallbackIds; // This is where the actual adding callback happens
// We register our callback to the "timeChanged" event
MCallbackId callbackId = MEventMessage::addEventCallback("timeChanged", (MMessage::MBasicFunction) MySampleCmd::userCB); // ... if(myCallbackIds.length() != )
// Make sure we remove all the callbacks we added
stat = MEventMessage::removeCallbacks(myCallbackIds);
class MySampleCmd : public MPxCommand {
public:
MySampleCmd();
virtual ~MySampleCmd(); // Our callback - implemented as a static method
static void userCB(void* clientData); MStatus doIt( const MArgList& );
MStatus redoIt();
MStatus undoIt();
bool isUndoable() const;
static void* creator(); public: // Our callback Id array to
// store the Ids of all our callbacks
// for later removal
MCallbackIdArray myCallbackIds;
};
cmd.h
// Clearing our callback Id array
// for housekeeping
myCallbackIds.clear();
} // Destructor
MySampleCmd::~MySampleCmd() { // Make sure we remove all the callbacks we added
// Failing to do so will result in fatal error
if(myCallbackIds.length() != ) // Remove the MEventMessage callback
MEventMessage::removeCallbacks(myCallbackIds);
} MStatus MySampleCmd::redoIt() { // This is where the actual adding callback happens
// We register our callback to the "timeChanged" event
MCallbackId callbackId = MEventMessage::addEventCallback("timeChanged", (MMessage::MBasicFunction) MySampleCmd::userCB); // Append the newly added callback's ID to our list of callback ids
// for future removal
myCallbackIds.append(callbackId);
return MS::kSuccess;
} MStatus MySampleCmd::undoIt() {
MStatus stat;
if(myCallbackIds.length() != )
// Make sure we remove all the callbacks we added
stat = MEventMessage::removeCallbacks(myCallbackIds);
return stat;
} // Our callback function
void SafeSelect::userCB(void* clientData) {
MGlobal::displayInfo( "Callback userCB called!\n" );
return;
}
cmd.cpp
Get Points At Time
MStatus myPlugIn::GetPointsAtTime(
const MDagPath& dagPath,
const MTime& mayaTime,
MPointArray& points )
{
MStatus status = MS::kSuccess; points.clear(); MFnMesh fnMesh; // Move Maya to current frame
MGlobal::viewFrame( mayaTime ); // You MUST reinitialize the function set after changing time!
fnMesh.setObject( dagPath ); // Get vertices at this time
status = fnMesh.getPoints( points ); return status;
}
MStatus myPlugIn::doIt( const MArgList& args )
{
MStatus status = MS::kSuccess; MDagPath dagPath; // .. determing dagPath from current selection, or whatever .. // MPointArray points; MTime currentTime, maxTime; // Get start- and end-frame from Maya
currentTime = MAnimControl::minTime();
maxTime = MAnimControl::maxTime(); // Iterate through time
while ( currentTime <= maxTime )
{
// Get vertices at this time
status = GetPointsAtTime( dagPath, currentTime, points ); // .. do something with the points here .. // // Advance by one frame
currentTime++;
} return status;
}
Use the Get points at time
M3dView Capture
(1)
#Import api modules
import maya.OpenMaya as api
import maya.OpenMayaUI as apiUI #Grab the last active 3d viewport
view = apiUI.M3dView.active3dView()
print view #read the color buffer from the view, and save the MImage to disk
image = api.MImage()
view.readColorBuffer(image, True)
image.writeToFile('C:/test.jpg', 'jpg')
(2)
import os import maya.OpenMaya as mod_om
import maya.OpenMayaUI as mod_om_ui
import maya.cmds as mod_mc
import maya.mel as mel view = mod_om_ui.M3dView.active3dView()
image_ = mod_om.MImage() for frame in range(1,11):
# Change the frame number
mod_mc.currentTime(frame)
for obj in ['headMouthScp_geo', 'pSphere1']: # Isolate the object, so that only that particular object is seen
# Also Tried with turning off/on the visibility
mod_mc.select(obj)
mod_mc.isolateSelect('modelPanel4',s=1)
mod_mc.isolateSelect( 'modelPanel4', addSelected=True )
#mod_mc.select(obj)
#mod_mc.isolateSelect( 'modelPanel4', addSelected=True )
mod_mc.setAttr(obj + '.visibility', 0)
mod_mc.setAttr(obj + '.visibility', 1) # Refresh the scene
view.refresh()
mod_mc.refresh() # Read Color Buffer
view.readColorBuffer(image_, True) # Write The Color Buffer
image_.resize(640, 480)
image_.writeToFile('C:/Temp/Frame_Buffer_%s_%d.bmp' % (obj, frame), 'bmp') mod_mc.select(clear=True)
mod_mc.isolateSelect( 'modelPanel4', state=0 )
(3)cmds context
import contextlib @contextlib.contextmanager
def solo_renderable(solo_cam): # Disable all cameras as renderable
# and store the original states
cams = cmds.ls(type='camera')
states = {}
for cam in cams:
states[cam] = mc.getAttr(cam + '.rnd')
cmds.setAttr(cam + '.rnd', 0) # Change the solo cam to renderable
cmds.setAttr(solo_cam + '.rnd', 1) try:
yield
finally:
# Revert to original state
for cam, state in states.items():
cmds.setAttr(cam + '.rnd', state) with solo_cam('myCamShape'):
cmds.playblast()
OGL Render in backend:
import sys
import os
import contextlib try:
import maya.cmds as cmds
import maya.standalone as standalone standalone.initialize(name='python')
except:
raise ImportError def openScene(openPath):
sceneName = os.path.basename(openPath[:-3])
print "opening path.................\n"
cmds.file(openPath, open=True) if __name__ == "__main__":
openScene(r"c:/test2.ma")
cmds.hwRenderLoad() for x in xrange(1,68,1):
print cmds.ogsRender(width=1280,height=720,cam='camera1',frame = x)
(4)code snipts
<1>
import maya.cmds as cmds
cmds.ls(*cmds.listHistory (mynode), type = 'animCurve' )
<2> iter by type
import maya.OpenMaya as om
import maya.OpenMayaMPx as omp
import maya.OpenMayaAnim as oma # just loop the animation curve
it = om.MItDependencyNodes(om.MFn.kMesh) while not it.isDone():
aobj = it.item()
print aobj
#aniCur = oma.MFnAnimCurve(aobj)
#print aniCur.name() it.next()
(5) save two matrixs into a float* array
// MMatrix stores double values, but I want floating point values on the GPU so convert them here.
unsigned int numFloat = ;
float* temp = new float[numFloat];
unsigned int curr = ;
for(unsigned int row = ; row<; row++)
{
for(unsigned int column = ; column<; column++)
{
temp[curr++] = (float)omat(row, column);
}
}
for(unsigned int row = ; row<; row++)
{
for(unsigned int column = ; column<; column++)
{
temp[curr++] = (float)omatinv(row, column);
}
}
in opencl use pointer offset
__global const float4* matrices, //first matrix is offset matrix, second matrix is offset matrix inverse
__global const float4* matrixInverse = &(matrices[]);
__global const float4* matrix = matrices;
(6) command port eval scripts:
MEL:
commandPort -stp "python" -n ":5055" ;
cmds.commandPort (n=':6328', stp='python')
other Python version:
import socket
maya = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
maya.connect(("127.0.0.1", 5055))
maya.send("""maya.cmds.polySphere( radius=4 )""")
The above code will create a new sphere in your currently running Maya. You can use any python terminal (doesn't have to be mayapy). (If you're running python3, the last command will produce an error until you change it to: maya.send(bytes("""maya.cmds.polySphere( radius=4 )""", 'UTF-8'))