Using UVCOMMAND with Multiple Objects

On 14/08/2018 at 09:24, xxxxxxxx wrote:

Hello,
I'm trying to move UVs using UVCOMMAND for a UDIM setup with multiple selected objects. In my current script, the transforms only happen to the last object in the list. I've tried other flags for the Active UV set and selecting the UV Polygons before UVCOMMAND is called. Nothing is working. Could someone please tell me what I am doing incorrectly? Here's my code.

def moveUVs(obj,index) :
    # Retrieves active UVSet
    handle = bodypaint.GetActiveUVSet(doc, c4d.GETACTIVEUVSET_ALL)
    if not handle:
        print "No active UVSet!"
        return
    
    settings = c4d.BaseContainer()
    settings[c4d.UVCOMMAND_TRANSFORM_MOVE_X] = index
    settings[c4d.UVCOMMAND_TRANSFORM_MOVE_Y] = 0
    settings[c4d.UVCOMMAND_TRANSFORM_SCALE_X] = 1
    settings[c4d.UVCOMMAND_TRANSFORM_SCALE_Y] = 1
    settings[c4d.UVCOMMAND_TRANSFORM_ANGLE] = utils.DegToRad(0)
  
    # Retrieves UVW list
    uvw = handle.GetUVW()
    if uvw is None:
        return
    
    # Calls UVCOMMAND_TRANSFORM to change UVW list
    ret = bodypaint.CallUVCommand(handle.GetPoints(), handle.GetPointCount(), handle.GetPolys(), handle.GetPolyCount(), uvw,
                                  handle.GetPolySel(), handle.GetUVPointSel(), handle.GetBaseObject(), handle.GetMode(), c4d.UVCOMMAND_TRANSFORM, settings)
    if not ret:
        print "CallUVCommand() failed!"
        return
    
    print "CallUVCommand() successfully called"
  
    # Sets the transformedUVW from Texture View 
    if handle.SetUVWFromTextureView(uvw, True, True, True) :
        print "UVW from Texture View successfully set"
    else:
        print "UVW from Texture View failed to be set!"
    
    # Releases active UVSet
    bodypaint.FreeActiveUVSet(handle)
  
def main() :
    objs = doc.GetActiveObjects(0)
    doc.StartUndo()
    for idx, obj in enumerate(objs) :
        moveUVs(obj,idx)
        c4d.EventAdd()
    doc.EndUndo()
  
if __name__=='__main__':
    main()

Thank you!

On 16/08/2018 at 01:44, xxxxxxxx wrote:

Hi, blastFrame!

As you already figured it out, UVCommand only works for the current displayed UV. And since bodypaint can only display one UV Set, you can't modify multiple objects at the same time.
But you can directly access data in the tag, and move the point.

Here a quick sample

import c4d
  
def moveUVs(obj, idx) :
    tag = obj.GetTag(c4d.Tuvw)
    if not tag:
        return
    
    for polyIndex in xrange(obj.GetPolygonCount()) :
        uvwdict = tag.GetSlow(polyIndex)
        move = c4d.Vector(1*idx, 0, 0)
        a = uvwdict["a"] + move
        b = uvwdict["b"] + move
        c = uvwdict["c"] + move
        d = uvwdict["d"] + move
        tag.SetSlow(polyIndex, a, b, c, d)
  
def main() :
    objs = doc.GetActiveObjects(0)
    doc.StartUndo()
    for idx, obj in enumerate(objs) :
        moveUVs(obj,idx)
        c4d.EventAdd
    doc.EndUndo()
  
if __name__=='__main__':
    main()

If you have any question, please let me know!
Cheers,
Maxime. :)

On 21/08/2018 at 16:25, xxxxxxxx wrote:

Originally posted by xxxxxxxx

Hi, blastFrame!

As you already figured it out, UVCommand only works for the current displayed UV. And since bodypaint can only display one UV Set, you can't modify multiple objects at the same time.
But you can directly access data in the tag, and move the point.

Here a quick sample

import c4d
 
def moveUVs(obj, idx) :
    tag = obj.GetTag(c4d.Tuvw)
    if not tag:
        return
    
    for polyIndex in xrange(obj.GetPolygonCount()) :
        uvwdict = tag.GetSlow(polyIndex)
        move = c4d.Vector(1*idx, 0, 0)
        a = uvwdict["a"] + move
        b = uvwdict["b"] + move
        c = uvwdict["c"] + move
        d = uvwdict["d"] + move
        tag.SetSlow(polyIndex, a, b, c, d)
 
def main() :
    objs = doc.GetActiveObjects(0)
    doc.StartUndo()
    for idx, obj in enumerate(objs) :
        moveUVs(obj,idx)
        c4d.EventAdd
    doc.EndUndo()
 
if __name__=='__main__':
    main()

If you have any question, please let me know!
Cheers,
Maxime. :)

This was very helpful. Thank you, Maxime!