@ferdinand I figured this issue out so you can mark this as solved/closed. Thank you.
E
Posts made by ELJeffery
-
RE: Set UVWs for Ngons?
-
Set UVWs for Ngons?
For updating the changed UVWs I am using:
# Update UV data in Cinema 4D using updated data from RizomUV def update_uvs_in_cinema4d(doc, obj, poly_sizes, poly_uvw_ids, updated_uvws): # Retrieve the active document and object once doc, obj = get_active_object() if not obj or not isinstance(obj, c4d.PolygonObject): gui.MessageDialog("No Polygon Object selected.") return # Get the Polygon Translation Map poly_trans_map = obj.GetPolygonTranslationMap() polygon_count, ngon_map = poly_trans_map # Detect if there are ngons by checking if the ngonMap contains repeated values all_polygons = obj.GetAllPolygons() has_ngons = len(set(ngon_map)) != len(ngon_map) ngon_count = obj.GetNgonCount() print("Number of polygons including polygons inside any ngons: ", len(all_polygons)) print("Number of polygons including ngons: ",polygon_count) print("Number of ngons: ",ngon_count) print("Number of internal ngon edges: ",len(ngon_map) - len(set(ngon_map))) uvw_tag = obj.GetTag(c4d.Tuvw) if not uvw_tag: print("No UVW Tag found.") return doc.SetMode(c4d.Mpolygons) handle = c4d.modules.bodypaint.GetActiveUVSet(doc, c4d.GETACTIVEUVSET_ALL) if handle is None: c4d.CallCommand(170103) # Open UV editor if c4d.API_VERSION >= 22000: c4d.modules.bodypaint.UpdateMeshUV(False) handle = c4d.modules.bodypaint.GetActiveUVSet(doc, c4d.GETACTIVEUVSET_ALL) if handle is None: raise RuntimeError("No Active UVSet") uv_index = 0 assembled_uvws = [] adjusted_uvws = adjust_uvs(updated_uvws) # Ensure UVs are normalized correctly for poly_idx, poly_size in enumerate(poly_sizes): uv_dict = {} uv_indices = poly_uvw_ids[uv_index:uv_index + poly_size] uv_index += poly_size # Handle triangles if poly_size == 3: uv_dict = { 'c': c4d.Vector(adjusted_uvws[uv_indices[0] * 3], adjusted_uvws[uv_indices[0] * 3 + 1], adjusted_uvws[uv_indices[0] * 3 + 2]), 'b': c4d.Vector(adjusted_uvws[uv_indices[1] * 3], adjusted_uvws[uv_indices[1] * 3 + 1], adjusted_uvws[uv_indices[1] * 3 + 2]), 'a': c4d.Vector(adjusted_uvws[uv_indices[2] * 3], adjusted_uvws[uv_indices[2] * 3 + 1], adjusted_uvws[uv_indices[2] * 3 + 2]) } # Handle quads elif poly_size == 4: uv_dict = { 'd': c4d.Vector(adjusted_uvws[uv_indices[0] * 3], adjusted_uvws[uv_indices[0] * 3 + 1], adjusted_uvws[uv_indices[0] * 3 + 2]), 'c': c4d.Vector(adjusted_uvws[uv_indices[1] * 3], adjusted_uvws[uv_indices[1] * 3 + 1], adjusted_uvws[uv_indices[1] * 3 + 2]), 'b': c4d.Vector(adjusted_uvws[uv_indices[2] * 3], adjusted_uvws[uv_indices[2] * 3 + 1], adjusted_uvws[uv_indices[2] * 3 + 2]), 'a': c4d.Vector(adjusted_uvws[uv_indices[3] * 3], adjusted_uvws[uv_indices[3] * 3 + 1], adjusted_uvws[uv_indices[3] * 3 + 2]) } # Handle ngons (polygons with more than 4 vertices) elif has_ngons: # Sort the vertices properly and create the UV dict dynamically alphabet = 'abcdefghijklmnopqrstuvwxyz' for i in range(poly_size): # Make sure to use the correct UV order key = alphabet[i] if i < len(alphabet) else f'v{i}' # Handle large ngons uv_dict[key] = c4d.Vector( adjusted_uvws[uv_indices[i] * 3], adjusted_uvws[uv_indices[i] * 3 + 1], adjusted_uvws[uv_indices[i] * 3 + 2] ) assembled_uvws.append(uv_dict) handle.SetUVWFromTextureView(assembled_uvws, True, True, True) bodypaint.FreeActiveUVSet(handle) c4d.EventAdd()
My problem is, it works with a mesh that is only quads and tris or any combination thereof, but if the mesh contains any ngons then I get this result:
-
Not able to post?
I am trying to post an issue I am having with some python code but I keep getting:
You are unable to access maxon.net Why have I been blocked? This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data. What can I do to resolve this? You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page. Cloudflare Ray ID: 8ccf3bbd8c70a933 • Performance & security by Cloudflare