Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Using UVCOMMAND with Multiple Objects

    PYTHON Development
    0
    3
    1.1k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      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!

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        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. 🙂

        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          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!

          1 Reply Last reply Reply Quote 0
          • First post
            Last post