Hey! Sorry I didn't notice the response, I ended up doing it by essentially 
using the setcolors, and setting the colorset, but this is really a great 
answer! And much less code.

On Thursday, October 11, 2018 at 1:44:24 AM UTC+2, mjlefevre wrote:
>
>
> Hi dur,
>
> This works for me. I'm not sure, but it looks like a referencing issue as 
> Marcus said.
>
> From the docs: 
>
> It is important to notice that the command does not store a pointer to an 
>> MObject, but rather uses an MDagPath to reference the curve for undo and 
>> redo. An MObject is not guaranteed to be valid the next time your 
>> command is executed. As a result, if you had used an MObject, Maya would 
>> likely core dump when performing your undoIt() or redoIt(). An MDagPath 
>> however, being simply a description of the path to the curve, is guaranteed 
>> to be correct whenever your command is executed. 
>
>
>
> http://help.autodesk.com/view/MAYAUL/2018/ENU/?guid=__files_Command_plugins_MPxCommand_htm
>
>  
>
>> class CopyChannels(om.MPxCommand):
> kPluginCmdName = "copyChannels"
>
> def __init__(self):
> om.MPxCommand.__init__(self)
> self.channels = ''
> self.verts = []
> self.sourceCols = None
> self.sel = None
> self.path = om.MDagPath()
> #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.sel = om.MGlobal.getActiveSelectionList()
> if self.sel.isEmpty():
> return
> self.parseArguments(args)
> self.extractChannelPairs()
> self.path = self.sel.getDagPath(0)
> __, vertices = self.sel.getComponent(0)
> fn_vertices = om.MFnSingleIndexedComponent(vertices)
> self.verts = fn_vertices.getElements()
> self.redoIt()
>
> def redoIt(self):
>
> self.mesh = om.MFnMesh(self.path)
> self.vertexCount = self.mesh.numVertices
> self.colors = self.mesh.getVertexColors()
> self.sourceCols = self.mesh.getVertexColors()
> for v in self.verts:
> self.colors[v].r = self.sourceCols[v].b
> self.mesh.setVertexColor(self.colors[v], v)
>
> def undoIt(self):
> self.mesh = om.MFnMesh(self.path)
> for v in self.verts:
> self.mesh.setVertexColor(self.sourceCols[v], v)
>
>
>
>
> On Wednesday, 10 October 2018 14:32:18 UTC+1, dur wrote:
>>
>> I won't directly say that I solved this, but I implemented it with using 
>> 'setColors' and 'assignColors', taking advatange of the 'colorset' system. 
>> This works.
>> I tried an implementation with faceVerts which also resulted in crashing. 
>> Where I assigned all faceVerts instead of individually. Using 'setColor' 
>> means only giving an MColorArray and optionally a colorset. So since you 
>> don't need an explicit reference to the verts, I would suspect the issue 
>> lies somewhere there.
>>
>> On Tuesday, October 9, 2018 at 1:40:58 PM UTC+2, dur 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 python_inside_maya+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/python_inside_maya/fd974ab0-d381-413b-a22e-50177707d38a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to