UVCOMMAND question?
-
Hi - I'm working on a Python script that applies a texture to a model and I'd like to move the UV around after it's applied. The script works if I set the c4d layout to my version of UV editing tools but if I'm in a modeling layout the script is unable to return the handle when calling
bodypaint.GetActiveUVSet()
. Is there a way to to set the active UV without being in a UV editing layout?Here are some relevant parts of the script -
def UVbag(model, settings): doc.SetActiveObject(model) # Retrieves active UVSet handle = bodypaint.GetActiveUVSet(doc, c4d.GETACTIVEUVSET_ALL) if not handle: print "No active UVSet!" return # 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(), model, handle.GetMode(), c4d.UVCOMMAND_TRANSFORM, settings) if not ret: print "CallUVCommand() failed!" return # Sets the transformedUVW from Texture View if handle.SetUVWFromTextureView(uvw, True, True, True): pass else: print "UVW from Texture View failed to be set!" # Releases active UVSet bodypaint.FreeActiveUVSet(handle)
snippet from main part of script -
tags = newObj.GetTags() #adjust UV map to match our png layouts # Builds UVCOMMAND_TRANSFORM container for the command settings settings = c4d.BaseContainer() for tag in tags: if tag.GetType() == 5673: polys = newObj.GetPolygonS() polys.DeselectAll() if tag.GetName() in ["back"]: tagSelection = tag.GetBaseSelect() tagSelection.CopyTo(polys) c4d.EventAdd() settings[c4d.UVCOMMAND_TRANSFORM_MOVE_Y] = .25 settings[c4d.UVCOMMAND_TRANSFORM_SCALE_X] = 1 settings[c4d.UVCOMMAND_TRANSFORM_SCALE_Y] = -.5 UVbag(newObj, settings)# if tag.GetName() == "Face 1": tagSelection = tag.GetBaseSelect() tagSelection.CopyTo(polys) c4d.EventAdd() settings[c4d.UVCOMMAND_TRANSFORM_MOVE_Y] = -.25 settings[c4d.UVCOMMAND_TRANSFORM_SCALE_X] = 1 settings[c4d.UVCOMMAND_TRANSFORM_SCALE_Y] = .5 UVbag(newObj, settings)
Any help or insight is appreciated.
-
...just realized it's not the layout that makes it work, I need to have the UV Polygons tool activated. I'm going to see if I can activate that tool via python.
-
Hi @del first of all welcome in the plugincafe community!
As you figured it out, to have GetActiveUVSet to work you have to open at least one time a TextureView and in your case set the document mode to Muvpolygons.
Both can be done with.
c4d.CallCommand(170103) # New Texture View... #Enter UV Polygon mode doc.SetMode(c4d.Muvpolygons)
Note it's also possible to edit UV directly from UV tag. While you can't use Bodypaint command, it may be an option for you since you only do translation work. For more information please read this thread: https://developers.maxon.net/forum/topic/10915/14369_using-uvcommand-with-multiple-objects/2
If you have any question, please let me know.
Cheers,
Maxime -
Thank you for the guidance. I'll dig into that info.