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!


Log in to reply