Oh yeah of course. Here's the code as a cmd plugin.
import sys
import os
import json
import math
import maya.cmds as cmds
import maya.mel as mel
import maya.api.OpenMaya as om
inChFlagShort = '-fc'
inChFlagLong = '-fromChannel'
outChFlagShort = '-tc'
outChFlagLong = '-toChannel'
addChFlagShort = '-add'
addChFlagLong = '-addChannel'
def maya_useNewAPI():
"""
The presence of this function tells Maya that the plugin produces, and
expects to be passed, objects created using the Maya Python API 2.0.
"""
pass
class CopyChannels(om.MPxCommand):
kPluginCmdName = "copyChannels"
def __init__(self):
om.MPxCommand.__init__(self)
self.channels = ''
self.verts = []
self.sourceCols = None
#self.schema = {'r': 0,'g': 1,'b': 2,'a': 3}
@staticmethod
def cmdCreator():
return CopyChannels()
def isUndoable(self):
return True
def doIt(self, args):
if self.parseArguments(args) is False:
print("Problem with args")
return
self.parseArguments(args)
self.extractChannelPairs()
sel = om.MGlobal.getActiveSelectionList()
if sel.isEmpty():
return
__, vertices = sel.getComponent(0)
fn_vertices = om.MFnSingleIndexedComponent(vertices)
self.verts = fn_vertices.getElements()
self.path = sel.getDagPath(0)
self.mesh = om.MFnMesh(self.path)
self.vertexCount = self.mesh.numVertices
self.colors = self.mesh.getVertexColors()
self.sourceCols = self.mesh.getVertexColors()
self.redoIt()
def redoIt(self):
for v in self.verts:
self.colors[v].r = self.sourceCols[v].b
self.mesh.setVertexColor(self.colors[v], v)
def undoIt(self):
for v in self.verts:
self.mesh.setVertexColor(self.sourceCols[v], v)
def parseArguments(self, args):
argData = om.MArgParser(self.syntax(), args)
if argData.isFlagSet(inChFlagShort):
self.channels = argData.flagArgumentString(inChFlagShort, 0)
else:
print("Flag {} is missing".format(inChFlagLong))
return False
if argData.isFlagSet(addChFlagShort):
self.addToChannel = argData.flagArgumentBool(addChFlagShort, 0)
else:
self.addToChannel = False
return True
def extractChannelPairs(self):
self.channelPairs = self.channels.split('_')[1:]
for ch in self.channelPairs:
print(ch)
def syntaxCreator():
syntax = om.MSyntax()
syntax.useSelectionAsDefault(True)
syntax.setObjectType(om.MSyntax.kSelectionList)
syntax.addFlag(inChFlagShort, inChFlagLong, om.MSyntax.kString)
#syntax.addFlag(outChFlagShort, outChFlagLong, om.MSyntax.kString)
syntax.addFlag(addChFlagShort, addChFlagLong, om.MSyntax.kDouble)
return syntax
commands = [
CopyChannels
]
def initializePlugin(plugin):
pluginFn = om.MFnPlugin(plugin)
for cmd in commands:
try:
pluginFn.registerCommand(cmd.kPluginCmdName, cmd.cmdCreator,
syntaxCreator)
except:
sys.stderr.write("Failed to register command: %s\n" %
cmd.kPluginCmdName)
raise
def uninitializePlugin(plugin):
pluginFn = om.MFnPlugin(plugin)
for cmd in commands:
try:
pluginFn.deregisterCommand(cmd.kPluginCmdName)
except:
sys.stderr.write("Failed to unregister command: %s\n" %
cmd.kPluginCmdName )
raise
By all means try it out. I'll have a look into the MObjectHandle as well.
Thanks for your input :)
On Tuesday, October 9, 2018 at 7:23:43 PM UTC+2, Marcus Ottosson wrote:
>
> Would it be possible to share a working example? Hard to say without
> testing it first-hand, nothing looks immediately off with the code so far.
> If anything, it looks a little nefarious that it's remembering
> `self.verts`, which'd contain references to `MObject`s that may or may not
> be valid at the time of undo. Might be worth trying with a `MObjectHandle`
> and checking it's `isAlive` prior to using it?
>
> On Tue, 9 Oct 2018 at 12:41, dur <[email protected] <javascript:>> wrote:
>
>> Hello,
>>
>> So I have been quite stuck on a problem in regards to Maya crashing when
>> I undo.
>> More specifically, it will crash on second, third or fourth undo. So the
>> undo step *can* work.
>>
>> def doIt(self, args):
>> self.parseArguments(args)
>> sel = om.MGlobal.getActiveSelectionList()
>> __, vertices = sel.getComponent(0)
>> fn_vertices = om.MFnSingleIndexedComponent(vertices)
>> self.verts = fn_vertices.getElements()
>> self.path = sel.getDagPath(0)
>> self.mesh = om.MFnMesh(self.path)
>> self.colors = self.mesh.getVertexColors()
>> self.sourceCols = self.mesh.getVertexColors()
>> self.redoIt()
>>
>> def redoIt(self):
>> for v in self.verts:
>> self.colors[v].r = self.sourceCols[v].b
>> self.mesh.setVertexColor(self.colors[v], v)
>> def undoIt(self):
>> for v in self.verts:
>> self.mesh.setVertexColor(self.sourceCols[v], v)
>>
>> This is the code. What I'm trying to do, is swap channels on a per vertex
>> basis.
>> I only want it to act on selected vertices. I am explicitly copying the
>> blue to the red channel for test purposes.
>>
>> I know that some MArrays get referenced rather than copied, but I tried
>> to check the sourceCols pre- and post redoIt, and it's identical.
>>
>> My biggest hurdle here is that I don't really know what to look for? I'm
>> really not certain what's happening behind the curtain, since to me it
>> looks like pretty basic steps:
>>
>> 1. save original color
>> 2. init redo and change colors and apply to mesh
>> 3. apply original colors to mesh on undo
>>
>> It always manages to get through the initial undo, but seems quite random
>> after that.
>> I have been stuck on this thing for two days soon. Any help would really
>> be appreciated!
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Python Programming for Autodesk Maya" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/python_inside_maya/32ee3511-374b-4a10-9786-618e1de289fb%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/python_inside_maya/32ee3511-374b-4a10-9786-618e1de289fb%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>
--
You received this message because you are subscribed to the Google Groups
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/python_inside_maya/2ec98321-f426-4e00-9990-20c4cd697dd6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.