Tag not in sync
-
Hi All,
I'm trying to create a new UVWTag (if an object doesn't already have one). Here's my basic code:
def main():
obj = doc.GetFirstObject()if obj.GetTag(c4d.Tuvw) is None: tag = obj.MakeTag(c4d.Tuvw) tag[c4d.TEXTURETAG_PROJECTION]=3 tag.SetName('Cubic_map') c4d.EventAdd()
The code runs howewer, cinema reports the following error later when trying to access the uv:
A problem with this project has been detected: Object "Cube" - Tag 5671 not in sync. Please save and contact MAXON Support with a description of the last used commands, actions or plugins.
What Am I missing?
-
A UVWTag does not have any projections. You might want to use a Texture Tag (
Ttexture
) instead.Best,
Robert -
It seems like it has a projection.
Please note that I don't know c4d, I'm just coding with the api but I don't know the software itself (I came from the blender's world)
Anyways, If you go to the UV edit, and you select your object and UVW tag, you can choose the UV mapping - Projection
let me attach a screenshot of what I'm trying to access. On the bottom right you can see there are some projections types, how do I set those through python?
-
The projection modes listed there are actually commands that operate on the UVs directly.
I'm not sure if you can access those functions in py, but here's a workaround.As said above, use a texture tag to set desired projection. After that, you can call the command
Generate UV coordinates
which then creates a new UV tag with the projection "baked in" and the texture mode is automatically set to "UVW". -
Hi Rage, thanks for reaching us.
With regard to the issue mentioned and considering your non-Cinema background, first of all lets settle down a few concepts:
- UVWTags are just acting as "storage" for the UVW data used on polygonal objects;
- TextureTags are instead used to create the actual texturing on the on a generic object (whatever it's a polygonal or parametric one)
A parametric object can use a texture even without explicit an UVWTag since the TextureTag delivers all the information with regard on how to map a texture to the object.
When a parametric object (e.g. cube) is converted into a polygonal one the UVW values which are part of the parametric object gets dumped in the UVWTag that is generated as soon as the conversion ends.
That said give a certain object (a polygonal one) the way to go is:
def main(): # check that an object is selected if op is None: return # get the active material activeMat = doc.GetActiveMaterial() if activeMat is None: return # instantiate a TextureTag sph50NoTileTextureTag = c4d.TextureTag() if sph50NoTileTextureTag is None: return # set the mapping type sph50NoTileTextureTag[c4d.TEXTURETAG_PROJECTION] = c4d.TEXTURETAG_PROJECTION_SPHERICAL # turn off tiling sph50NoTileTextureTag[c4d.TEXTURETAG_TILE] = False # scale the mapping to 50% on u and v sph50NoTileTextureTag[c4d.TEXTURETAG_LENGTHX] = 0.5 sph50NoTileTextureTag[c4d.TEXTURETAG_LENGTHY] = 0.5 # link to the active material sph50NoTileTextureTag[c4d.TEXTURETAG_MATERIAL] = activeMat # generate the corresponding UVWTag using the mapping settings specific in the TextureTag sph50NoTileUVWTag = c4d.utils.GenerateUVW(op, op.GetMg(), sph50NoTileTextureTag, op.GetMg()) # check for UVWtag being properly created if sph50NoTileUVWTag is None: return # set the name of the tag sph50NoTileUVWTag.SetName('0.5 non-tiled spherical') # add both the UVWTag and the TextureTag if op.GetTag(c4d.Tuvw) is None: op.InsertTag(sph50NoTileUVWTag) if op.GetTag(c4d.Ttexture) is None: op.InsertTag(sph50NoTileTextureTag) # notify Cinema about the changes c4d.EventAdd()
Best, Riccardo