• Alembic Export to Unreal - RootUVs?

    Cinema 4D SDK 2024
    4
    0 Votes
    4 Posts
    58 Views
    ferdinandF
    What I meant was to use the Cineware Unreal bindings, but I am not sure if they support it. Going the export route is a big backwards when Cinema has specific bindings. https://www.maxon.net/en/cineware I will give the Unreal dev a bump when I see him again.
  • 1 Votes
    3 Posts
    31 Views
    AnlvA
    @ferdinand Thank you so much! I made some minor adjustments to the plugin, adding support for CTRL hotkey activation, which allows quick reloading of previously checked plugins that need to be reloaded without opening the window. As always, open source, and will continue to be open source. Download: Plugin Debug Manager v1.5.0.zip Cheers, Anlv
  • Adding an Icon to a GeDialog Menu Group

    Cinema 4D SDK python sdk windows
    13
    1
    0 Votes
    13 Posts
    1k Views
    M
    Yes I wanted submenu with Icon, thanks for Up to Date clarification.
  • 0 Votes
    2 Posts
    18 Views
    ferdinandF
    Hey @shiryuta, thank you for reaching out to us. There is no public Redshift for Maya SDK. There is a semi-public Redshift Core SDK, but I doubt that this will help you much in this case, as you communicate directly with the Redshift Core in the GPU (and the access is also fairly limited). The Core SDK is also semi-public, i.e., we do not give access to everyone. I have pinged the Redshift team about your case. Please have some patience, as some key people are there currently on vacation and will only return in early August. What I can already tell you now, is that we will not meet your request in all points. We will for example never publish internal headers, and we also never write code example for non-public APIs. But that does not necessarily mean that there will not be a solution for your problem, only the Redshift for Maya team can clear up the details. Cheers, Ferdinand
  • 0 Votes
    16 Posts
    893 Views
    ferdinandF
    This is not common knowledge, otherwise I would have spotted that earlier. So, you are not really expected to know this as a third party dev. You can look at the geometry_caches_s26.py example and there at this line, under [2] I mention that the cache of that object is muted. But that is of course only very indirect information and not enough to deduce this. I think we also talked about it a couple of times on the forum. The flag BIT_CONTROLOBJECT is set on input objects of generators, e.g., the to be extruded spline of an Extrude object, the profile and rail spine of a Loft object, the to be cloned cube and sphere objects of a MoGraph cloner, etc. As shown in the caching example, Cinema will mute the caches of input objects. To be very formal, they are actually built but then again deleted. BIT_CONTROLOBJECT marks such input objects. Your light in that scene should not have that flag, as it is not the input for some generator. But it somehow got it anyway, there is probably somewhere a bug. For normal scene evaluation that bug is also not really a problem (because as you saw from your own test, the light still converted correctly when you inserted it on its own outside of caches). The problems start when that irregularly as BIT_CONTROLOBJECT marked object is part of a cache. 'Make Editable' then incorrectly collapses the cache. Not only does it not stop at nested generators which are incorrectly marked like this, it also seems to apply the cache muting logic for input objects (resulting in the empty null object instead of the content of the cache of the collapsed generator). I already told the relevant devs that I consider this borderline buggy but they do not seem very inclined to do anything about this. What is effectively missing somewhere in cache resolvement is the evaluation if the flag BIT_CONTROLOBJECT 'makes sense on an object'. That is of not so easy to do, as generator - input object relations can be quite complex in Cinema. Which is probably also why the modelling team does not want to touch this. Cheers, Ferdinand
  • Cache Proxy Tag

    Cinema 4D SDK 2025 c++ windows
    10
    0 Votes
    10 Posts
    1k Views
    DunhouD
    This is how I’ve implemented it at the moment, although users can’t drag and drop selection tags in the same way as with C4D’s built-in generator. Hope there are plans to expose the proxy tags. Thanks for tour time!
  • 0 Votes
    3 Posts
    72 Views
    ThomasBT
    @ferdinand Yes, thanks, that indirect answer is enough for me. I was mainly wondering whether a check performed on both the client and the server is robust enough, or if it could be bypassed using Python, for instance. I’m well aware that it can be cracked somehow. I’m also already using ExportLicenses() for my node-locking system in combination. Thanks a lot for your help.
  • 0 Votes
    17 Posts
    680 Views
    ferdinandF
    I tried with a Cube where the only way to change colour is to use the display colour in the basic tab. At first sight this doesn't cause the problem, but in fact it does. Yes, that was what I meant. Thanks for confirming. The issue likely already has vanished in the current alpha, because there I could not reproduce it. But in 2026.3.2 I can. What is a bit odd is that no one seems to have touched the relevant code in the last months. But that is something for the GUI team to figure out.
  • 0 Votes
    2 Posts
    262 Views
    ferdinandF
    Hello @leah.hayes, Welcome to the Maxon developers forum and its community, it is great to have you with us! Getting Started Before creating your next postings, we would recommend making yourself accustomed with our forum and support procedures. You did not do anything wrong, we point all new users to these rules. Forum Overview: Provides a broad overview of the fundamental structure and rules of this forum, such as the purpose of the different sub-forums or the fact that we will ban users who engage in hate speech or harassment. Support Procedures: Provides a more in detail overview of how we provide technical support for APIs here. This topic will tell you how to ask good questions and limits of our technical support. Forum Features: Provides an overview of the technical features of this forum, such as Markdown markup or file uploads. It is strongly recommended to read the first two topics carefully, especially the section Support Procedures: How to Ask Questions. About your First Question It is a bit difficult to answer you first question, as it is multiple questions of which some are open ended, please have a look at Support Procedures: How to Ask Questions for future postings. Where is the Python code of the built-in character templates ... They are stored in {c4d installation folder}/library.zip/characters. Is there a supported way to extract or view a built-in template (for example through c4d.modules.character.builder.Template) so I can study how the auto-adjustment is implemented? I am not quite sure that I follow. All these rigs are just our standard CA component system decorated with some Xpresso and Python. Since there can be literally hundreds of nodes in a rig, I attached below a little helper script to scan for specific Python content or just the scripts in general that are embedded somewhere in the rig. Is there a public API entry point to trigger or implement this kind of auto-adjustment for other templates? That auto adjustment seems to be some kind of Python script which the authors of this rig provided. These CA rigs have been created by (technical) artists and not the members of the Maxon development team. See the print out below for details on the artist code for "auto-adjustment". Cheers, Ferdinand Result ==================================================================================================== Node: Character Component (Character Component) | Attribute: (2158, 130, 1022113) Value: import c4d from c4d import gui import c4d.modules.character as ca import c4d.utils as utils #Welcome to the world of Python def Bl2DIterator(bl2D): while bl2D: yield bl2D for bl2DChild in Bl2DIterator(bl2D.GetDown()): yield bl2DChild bl2D = bl2D.GetNext() def SearchInHierarchy(obj, name): allChildrenWithName = [bl2D for bl2D in Bl2DIterator(obj.GetDown()) if bl2D.GetName() == name] return allChildrenWithName[0] def ShowLayer(layersList, showName): for layer in layersList: layerName = layer[c4d.ID_BASELIST_NAME] if showName in layerName: layer[c4d.ID_LAYER_VIEW] = True layer[c4d.ID_LAYER_MANAGER] = True def HideLayer(layersList, hideName): for layer in layersList: layerName = layer[c4d.ID_BASELIST_NAME] if hideName in layerName: layer[c4d.ID_LAYER_VIEW] = False layer[c4d.ID_LAYER_MANAGER] = False def CharacterAnimateMode(characterObject): characterObject[c4d.ID_CA_CHARACTER_COMPONENT_HIGHLIGHT_OVER] = 4 characterObject[c4d.ID_CA_CHARACTER_COMPONENT_MOUSEOVER] = 0 characterObject[c4d.ID_CA_CHARACTER_COMPONENT_VISIBLE] = 2 characterObject[c4d.ID_CA_CHARACTER_OM_DISPLAY] = 5 characterObject[c4d.ID_CA_CHARACTER_LOCK_AM] = False def CharacterEditMode(characterObject): characterObject[c4d.ID_CA_CHARACTER_COMPONENT_HIGHLIGHT_OVER] = 3 characterObject[c4d.ID_CA_CHARACTER_COMPONENT_MOUSEOVER] = 4 characterObject[c4d.ID_CA_CHARACTER_COMPONENT_VISIBLE] = 3 characterObject[c4d.ID_CA_CHARACTER_OM_DISPLAY] = 1 characterObject[c4d.ID_CA_CHARACTER_LOCK_AM] = True def CharacterBindMode(characterObject): characterObject[c4d.ID_CA_CHARACTER_COMPONENT_HIGHLIGHT_OVER] = 4 characterObject[c4d.ID_CA_CHARACTER_COMPONENT_MOUSEOVER] = 4 characterObject[c4d.ID_CA_CHARACTER_COMPONENT_VISIBLE] = 1 characterObject[c4d.ID_CA_CHARACTER_OM_DISPLAY] = 5 characterObject[c4d.ID_CA_CHARACTER_LOCK_AM] = True def CatchEmAll(obj, stop, listy): if obj is None: return #Actions go here if obj.GetType()==1019362: listy.append(obj) if not stop: if obj.GetDown(): CatchEmAll(obj.GetDown(), stop, listy) if obj.GetNext(): CatchEmAll(obj.GetNext(), stop, listy) return listy def SetGlobalRotation(obj, rot): """ Please remember, Cinema 4D handles rotation in radians. Example for H=10, P=20, B=30: import c4d from c4d import utils #... hpb = c4d.Vector(utils.Rad(10), utils.Rad(20), utils.Rad(30)) SetGlobalRotation(obj, hpb) #object's rotation is 10, 20, 30 """ m = obj.GetMg() pos = m.off scale = c4d.Vector( m.v1.GetLength(), m.v2.GetLength(), m.v3.GetLength()) m = utils.HPBToMatrix(rot) m.off = pos m.v1 = m.v1.GetNormalized() * scale.x m.v2 = m.v2.GetNormalized() * scale.y m.v3 = m.v3.GetNormalized() * scale.z obj.SetMg(m) def SetGlobalScale(obj, scale): m = obj.GetMg() m.v1 = m.v1.GetNormalized() * scale.x m.v2 = m.v2.GetNormalized() * scale.y m.v3 = m.v3.GetNormalized() * scale.z obj.SetMg(m) def ModeChanged(): characterObject = charop.GetObject() #Turning Off the Annotation # Main function leftAnnotationTag = SearchInHierarchy(characterObject, "LeftLeg_bind").GetLastTag() print(leftAnnotationTag) if leftAnnotationTag.GetType() == c4d.Tannotation: leftAnnotationTag[c4d.ANNOTATIONTAG_VIEWPORT_SHOW] = False #Hiding the Rig's Layers root = doc.GetLayerObjectRoot() #Gets the layer manager layersList = root.GetChildren() #Get Layer list for layer in layersList: layerName = layer[c4d.ID_BASELIST_NAME] if "Mixamo_Rig" in layerName: layer[c4d.ID_LAYER_VIEW] = False layer[c4d.ID_LAYER_MANAGER] = False mixamoLayers = layer.GetChildren() for layer in mixamoLayers: layerName = layer[c4d.ID_BASELIST_NAME] if "Retarget_Hierarchy" in layerName or \ "ANIMDATA_Nulls" in layerName or \ "Control Hierarchy" in layerName: layer[c4d.ID_LAYER_VIEW] = False layer[c4d.ID_LAYER_MANAGER] = False masterControl = SearchInHierarchy(characterObject, "Master_con+") hips = SearchInHierarchy(characterObject, "Hips") if nmode==c4d.ID_CA_CHARACTER_MODE_BUILD or \ nmode==c4d.ID_CA_CHARACTER_MODE_ADJUST: CharacterEditMode(characterObject) if nmode==c4d.ID_CA_CHARACTER_MODE_BIND: CharacterBindMode(characterObject) if nmode==c4d.ID_CA_CHARACTER_MODE_ADJUST and omode==c4d.ID_CA_CHARACTER_MODE_BUILD: #Changed search method to only search in Character Object #hips=doc.SearchObject("Hips") #masterControl=doc.SearchObject("Master_con+") #added Namespace Code nameSpace=masterControl[c4d.ID_USERDATA,16] results=CatchEmAll(hips, hips.GetNext(), []) for result in results: mixamo=doc.SearchObject(nameSpace+result.GetName()) if mixamo: matR = result.GetMg() matM = mixamo.GetMg() matR.off = matM.off matR.v1 = matM.v1.GetNormalized() matR.v2 = matM.v2.GetNormalized() matR.v3 = matM.v3.GetNormalized() result.SetMg(matR) if result.GetName()=='Neck1': #neck=doc.SearchObject(nameSpace+'Neck') #head=doc.SearchObject(nameSpace+'Head') neck = SearchInHierarchy(characterObject, nameSpace+'Neck') head = SearchInHierarchy(characterObject, nameSpace+'Head') if head and neck: result.SetMg((neck.GetMg()+head.GetMg())/2) print("Auto-Adjustment Complete") #Turning On the Annotation if leftAnnotationTag.GetType() == c4d.Tannotation: leftAnnotationTag[c4d.ANNOTATIONTAG_VIEWPORT_SHOW] = True if omode==c4d.ID_CA_CHARACTER_MODE_ADJUST and nmode!=c4d.ID_CA_CHARACTER_MODE_BUILD: L_Leg=doc.SearchObject("Left_IK_parent_rot_algn") #L_Leg = charop.FindObject("Left_IK_parent_rot_algn") if L_Leg: conTag=L_Leg.GetFirstTag() conTag[c4d.EXPRESSION_ENABLE]=False R_Leg=doc.SearchObject("Right_IK_parent_rot_algn") #R_Leg = charop.FindObject("Right_IK_parent_rot_algn") if R_Leg: conTag=R_Leg.GetFirstTag() conTag[c4d.EXPRESSION_ENABLE]=False if nmode==c4d.ID_CA_CHARACTER_MODE_ANIMATE: CharacterAnimateMode(characterObject) doc.SetActiveObject(masterControl, c4d.SELECTION_NEW) c4d.EventAdd() Code """Scans the document for all nodes that have multi-line string parameters that contain the word "adjustment" (case-insensitive) and prints the node name, type, parameter ID, and value to the console. """ import c4d import mxutils doc: c4d.documents.BaseDocument def main() -> None: """ """ node: c4d.BaseList2D pid: c4d.DescID # Iterate over all objects and tags in the document that live outside of caches and within the # object branch of the document. for node in mxutils.RecurseGraph(doc.GetFirstObject(), yieldBranches=True, yieldHierarchy=True, branchFilter=[c4d.Obase, c4d.Tbase]): # Iterate over the description, i.e., parameters of the node. for data, pid, _ in node.GetDescription(c4d.DESCFLAGS_DESC_NONE): # The first level of this parameter is not of type string or does not use the # multi-line string GUI, so we skip it. if pid[0].dtype != c4d.DTYPE_STRING or data[c4d.DESC_CUSTOMGUI] != c4d.CUSTOMGUI_STRINGMULTI: continue # Try to read the value, the exception block is needed as not all parameter types are # accessible in Python (and this could be some kind of exotic multi level string data type). try: value: str | None = str(node[pid]).strip() if not isinstance(value, str) or not value: continue except Exception: continue # Check if the value contains the word "adjustment" (case-insensitive), if not, skip it. if "adjustment" not in value.lower(): continue # Print the match. print ("\n\n" + ("=" * 100)) print (f"Node: {node.GetName()} ({node.GetTypeName()}) | Attribute: {pid}\n\nValue:\n\n{value}") # For good measure, select the node and break the loop. (doc.SetActiveObject(node, c4d.SELECTION_NEW) if isinstance(node, c4d.BaseObject) else doc.SetActiveTag(node, c4d.SELECTION_NEW)) break c4d.EventAdd() if __name__ == '__main__': main()
  • TimeLine DopeSheet not update

    Moved Bugs 2026 python
    5
    0 Votes
    5 Posts
    724 Views
    ferdinandF
    Hey, good news, this is fixed in the upcoming hotfix (2026.3.2).
  • Sub materials links and undo

    Cinema 4D SDK c++ windows s26
    5
    0 Votes
    5 Posts
    563 Views
    ferdinandF
    @DronKozy Yeah, I got the general direction, that you are probably implementing a material mixer type of material/shader. When you implement a full render engine binding, you should go the event notification route, as I am sure you can then easily handle the (slight) complexity that comes with them. Regarding the architecture, in principle you can do with whatever you want. As Maxon employee I would of course recommend to use our Nodes API (what you call 'native'). The SDK contains both code examples and documentation about this. But this biggest flaw of the Nodes API is probably that it is not entirely non-trivial. But implementing a full node editor also requires a relatively high level of expertise about our APIs, although in different areas. Currently Redshift, Vray, Arnold, and CentiLeo use the Nodes API and all other render engines (Corona, Octane, Cycles, etc.) use either a completely custom system or the old Xpresso Nodes API. Cheers, Ferdinand PS: When you are developing a render engine binding, you might want to consider our Maxon Registered Developer Program.
  • Support for Material X?

    Moved General Talk c++ 2024
    3
    0 Votes
    3 Posts
    1k Views
    M
    Material X has been part of the Redshift Trello for years now with no movement. It feels like it is not a priority at the moment
  • GetWorkplaneMatrix is broken in Cinema 4D 2026.3

    Moved Bugs c++ 2026
    5
    0 Votes
    5 Posts
    650 Views
    ferdinandF
    This will be fixed in the next upcoming hotfix.
  • UV Peeler - accessible?

    Cinema 4D SDK python
    7
    0 Votes
    7 Posts
    2k Views
    ferdinandF
    I don't know what your script does and if it needs fixing for 2026.3. What I said is that we usually put a lot of effort into keeping our ABIs and APIs stable, as exemplified with the 2026.3.1 hotfix where we fixed an issue with the UV tag interface that made it incompatible with old code. 2026.3 contained the UV manager overhaul as its main feature. We tried not to break any glass there but I cannot rule it out. when you find a regression in our APIs, you can also always report it. when the break was unintentional we usually provide a fix (in critical cases even a hotfix) or at least a workaround. We also usually do not remove systems. For example, the old content system and its "Content Browser" is still in our APIs and Cinema, although it long has been replaced by the Asset Browser and API. Can I guarantee that the UVPeeler will not be removed soon? No, we sometimes have to remove things. But it is quite rare.
  • 0 Votes
    2 Posts
    471 Views
    K
    Hello, Following my request for SubTool folder management, I would like to suggest two additional features to improve pipeline automation: Masking Data Access: Please provide read/write access to SubTool masking data. Layer Manipulation: Please add API support for managing SubTool layers. Thank you for your consideration.
  • 0 Votes
    17 Posts
    2k Views
    ferdinandF
    @ThomasB That is not a misunderstanding. I am aware that MRDs can only see their own tickets. But we still needed that crash reported, so I did it. I would have done the same if you would not have been an MRD. I usually mention ticket IDs here so that I can come back and close bugs. As you might have noticed, I have moved this into the Bugs forum. You do not have to do anything regarding that ticket, it it inaccessible for non-Maxonians. But we are still very much interested in a version of your plugin or a workflow which caused the crash. Otherwise we will not be able to reproduce and fix the issue. When you cannot provide it, this is also not a biggie (please do not waste time on this), then we have at least documented that there is somewhere a problem with audio tracks and how they handle memory while post-processing audio; in case we run into the same issue in the future in another context. Cheers, Ferdinand To share plugins with us, you can either use a chat on backstage or send us a mail to sdk_support(at)maxon(dot)net. There is a good chance that when you use a binary data attachment in a mail, that our mail system will filter out that attachment. When you use backstage (and upload the plugin there in a chat) that data would be permanently in the assets of that forum. When you just give us a link, we will delete your data once we do not need them anymore for debugging.
  • 0 Votes
    1 Posts
    274 Views
    No one has replied
  • 0 Votes
    2 Posts
    500 Views
    ferdinandF
    Hey @ECHekman, well, when a node displays an embedded description (what you exemplify at the case of a BaseLink), it uses a DescriptionCustomGui too. Other parameter types aside from a BaseLink which can do this are for example field lists. I am quite frankly a bit surprised that this even bubbles up in the form you report it, that you get a DescID which is selected inside a DescriptionCustomGui that is shown by the node in the DescriptionCustomGui you opened yourself. Attribute Manger selection states (and by extension DescriptionCustomGui) are not a public API feature, as we usually keep our GUIs sealed, i.e., inaccessible to third parties. DescriptionCustomGui is here a bit in a grey area, but I am afraid there is no way to do what you want to do. To do what you want to do, you would need access to internal systems. And other than in some other cases, where we do not always had the time to expose something (and are open to the idea of changing something), this is for GUIs not the case; they are intentionally sealed as we do not want third parties to change basic UX concepts. My general advice would also be to not to try to overcome this boundary (that a plugin reacts to which parameter in a node is being highlighted by the user), as you break UX conventions of Cinema 4D with that. Cheers, Ferdinand You can do this, but it is very hacky: Get the description of the node(s) you are currently displaying in the your DescriptionCustomGui. Check if desc is a member via CheckDescID (I think GetParameter would also work and return an empty container when the ID does not exist). When the ID does not exist, start browsing the container for parameters that are of a DTYPE that implies an underlying node, such as DTYPE_BASELINK. When you find such parameter, get the node node, and check there. Rinse and repeat recursively. Issues: You cannot distinguish the case where an object A has two BaseLink parameters which both hold an object of type T, but not the same instances. You will run into issues with DescID translations which some nodes might do. This is a really big point, which is probably already overlooked in your current code. Nested node relations can get REALLY complicated. BaseLink is trivial, but stuff like field lists, volume lists, or some special shader stuff can get really complicated. You would probably only have to worry about base links and field lists in your case, as other renderers are irrelevant for you, but field list alone are already complex enough that I would strongly advise against 'just implementing it'.
  • How to export icons of asset

    Cinema 4D SDK python 2026 2024
    8
    0 Votes
    8 Posts
    1k Views
    DunhouD
    Hey @ferdinand , Sorry I forgot click Submit button well, that is the info I need, I use same tech to get icons for CMD, and now waiting for svg part in the future. Cheers~ DunHou
  • 0 Votes
    1 Posts
    9k Views
    No one has replied