• 0 Votes
    14 Posts
    396 Views
    ferdinandF
    Hey @Anlv, thank you for the confirmation and for the precise debug report. Cheers, Ferdinand
  • 0 Votes
    2 Posts
    207 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()
  • 0 Votes
    11 Posts
    649 Views
    ThomasBT
    @ferdinand Ok , I will give it another try tomorrow. I will print this out again using this diff tool and compare it. I understand your point of view and your perseverance. . But quite honestly, Ferdinand. That workaround might have to be removed again with Maxon's next fix, which in turn might necessitate a further update to my plugin, and so on. The plugin's strength lies in its extensibility. Therefore, my focus regarding the plugin is on extensions, rather than on removing workarounds or adding new features. Given the highly complex document structure and the various types of lights involved, a particularly complex method has to be written for this. Furthermore, as I mentioned earlier, some lights have other lights as child objects, and those in turn have their own, with the specific setup varying from building to building. And every light of the same type might even have slightly different settings as well. This isn't really how I wanted to handle it. But I will give it a try. I know, complaining doesn't help. So I'll test it again with two lights, just like you did. One light from the document and the other generated programmatically. Then I'll compare the two again. However, this will be the last feature before the release, as it simply needs to be ready for delivery. The lighting feature is a bit of a thorn in my side anyway, since it’s very resource-intensive—but you know what users are like (myself included!). They want the all-singing, all-dancing, do-it-all solution. All things considered, the plugin has turned out quite well and is on the verge of release. My actual implemented workaround for importing the lights into the scene works, too, and requires just a single click from the user. Since the lights for each level are contained within a null object, this light importer represents the most pragmatic approach for me, involving the least amount of effort. So, if I don't manage to fix the "bug" according to your requirements now, I’m going to release it anyway. Unfortunately, I can't live on thin air. Respectfully, T.B. Person: I love AI, I want to do everything with AI... Developer: So you want to replace your brain with a language model? bye Bye! There's the door
  • Sub materials links and undo

    Cinema 4D SDK c++ windows s26
    5
    0 Votes
    5 Posts
    500 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.
  • 0 Votes
    2 Posts
    436 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
    1 Posts
    262 Views
    No one has replied
  • 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.
  • Reverse direction of multi-segment splines

    Cinema 4D SDK windows 2024 python
    6
    0 Votes
    6 Posts
    913 Views
    ferdinandF
    Okay, I think I was a bit overly cautious in my answer here. You gave my a very broad question, or to be precise, you gave me a video and a scene file, and did not really ask a precise question. I understand that asking good questions can be hard, especially with a language barrier. But when I have nothing to go by, I of course assume the worst case possible. The scene you have there is a trivial case, even the best case possible. You have there spline segments which lie in a perfect plane and which have no self intersections. You can treat them just like polygons (in the CG sense, not in the mathematical sense) and simply compute their normal over the first three vertices of each segment. Due to the fundamental property of a polygon - reversing the order of the vertices reverses the normal - you can then easily determine if two segments have opposite or equal winding. But all this starts to fall apart, as soon as you cannot make these assumptions. And I cannot help you to write the code for this, as this is then more than just a few lines. Hope this helps, and that I my answer was now less 'overly cautious'. Cheers, Ferdinand Result [image: 1780950951310-85f415e7-7f45-4c00-9651-b4091ee543e2-image.png] The code correctly identifies that in this six segment spline are four segments of one winding direction (clockwise in this case) and two of the other winding direction. winding_direction.c4d Code """Treats spline segments as polygons and compares their plane normals to find segments with reversed winding order. """ import c4d op: c4d.SplineObject # The currently active object in the scene. def main() -> None: """Called by Cinema 4D when the script is being executed. """ if not isinstance(op, c4d.SplineObject): return c4d.gui.MessageDialog("Please select a spline object.") # Get all points in the spline and organize them into their segments. points: list[c4d.Vector] = op.GetAllPoints() segments: list[list[c4d.Vector]] = [] j: int = 0 for i in [op.GetSegment(i)["cnt"] for i in range(op.GetSegmentCount())]: segments.append(points[j:j+i]) j += i if len(segments) < 2: return c4d.gui.MessageDialog("Please select a spline object with at least 2 segments.") # Now build normal data for the spline segments. This assumes: # # - A spline where all points lie in a single plane, a '2D' spline in 3D space. # - No self intersections in the spline. # - A piecewise linear spline, i.e., what Cinema 4D calls a 'Linear' spline. When we have a # 'Cubic' or 'Bezier' spline, we would have make it linear with 'Current State to Object' # first. # # We build the normal for each segment over its three first vertices. The reason why we are doing # this is because of the fundamental identity of a polygon (in a computer graphics sense), # reversing the order of the vertices of a polygon will reverse the normal. So if we have a # spline with two segments with reversed winding order, they will have antiparallel normals (normals # pointing in opposite directions). segmentNormals: list[c4d.Vector] = [] for segment in segments: if len(segment) < 3: print("Segment has less than 3 points, skipping normal calculation.") continue a, b, c = segment[0], segment[1], segment[2] edge1: c4d.Vector = b - a edge2: c4d.Vector = c - b normal: c4d.Vector = edge1.Cross(edge2).GetNormalized() segmentNormals.append(normal) # Now we just declare one segment as 'ground truth' and check if the other segments have normals # that are parallel or antiparallel to it. When we found a segment with an antiparallel normal, we # know we found a segment with reversed winding order. To check if two normals are parallel or # antiparallel, we just compute their dot product (i.e., spanned angle). When the dot product is # negative, the normals are antiparallel. print(f"Establishing the first segment normal {segmentNormals[0]} as ground truth.") baseNormal: c4d.Vector = segmentNormals[0] for i, normal in enumerate(segmentNormals[1:], start=1): isAntiparallel: bool = baseNormal.Dot(normal) < 0 print(f"Segment {i} normal: {normal} is {'antiparallel' if isAntiparallel else 'parallel'} " f"to the base normal {baseNormal}.") if __name__ == '__main__': main()
  • Copy res folder without shortcut

    Cinema 4D SDK c++ windows
    4
    0 Votes
    4 Posts
    623 Views
    ferdinandF
    That is of course also a valid option, just pick the scripting language you are most comfortable with.
  • How to draw svg to bitmaps?

    Cinema 4D SDK windows python 2026
    4
    0 Votes
    4 Posts
    671 Views
    ferdinandF
    I started to work last Friday on a BaseBitmap.InitWithVectorImage. It will for sure not make it into the next release of Cinema 4D, as we are too close to that, and I cannot make any promises when or if it will arrive. But I see value in this especially since I realized that you cannot even really use this in C++, as VectorImageInterface requires access to some internal components to be rasterized.
  • 0 Votes
    3 Posts
    558 Views
    rndm_cgR
    @ferdinand thanks so much, problem solved!
  • Can we draw alpha image in viewport

    Cinema 4D SDK windows python 2026
    4
    0 Votes
    4 Posts
    660 Views
    ferdinandF
    I do not think that DRAW_ALPHA_FROM_IMAGE should not work. I just picked DRAW_ALPHA_NORMAL because it is the "most default one" out of the DRAW_ALPHA flags. I will have a look later. But you can for now probably just use DRAW_ALPHA_NORMAL.
  • How to add tabs to tool plugins.

    Cinema 4D SDK windows python 2026
    6
    0 Votes
    6 Posts
    857 Views
    ferdinandF
    You very likely have not unpacked your resources. The resource folder found in an installation only contains a part of the application resources (we are doing this since release 2023 if I remember correctly). A good portion of the resources sits inside resource.zip for performance reasons and is unpacked on demand. You can just unpack the resource.zip into you resource folder without an performance or stability issues. [image: 1779175199591-b8e8db94-ae20-42b4-9a5d-e92ac928e89d-image.png] You as an MRD can also look at the Bugslife client, as it is probably the better example, as it uses more features of the quick tab GUI. But my answer above was targeted at a general audience who can see the resources for Bugslife but not Bugslife itself, and it therefore is not a good example for them. Just grep the resource folder as I did in my screen for files that match the path dialogs/*.res (i.e., are res files for dialogs) and contain the word QUICKTAB. Cheers, Ferdinand
  • 0 Votes
    6 Posts
    992 Views
    AnlvA
    Another small tip: you can simply use a single <br> for line breaks — there’s no need to use <b> or </b>. Also, just like in the script example, scripts can support localized language strings as well: """ Name-US:Example Name-CN:示例 Description-US:Example line 1.<br>Example line 2.<br>Example line 3. Description-CN:示例第 1 行。<br>示例第 2 行。<br>示例第 3 行。 """
  • 0 Votes
    1 Posts
    278 Views
    No one has replied
  • Load *.py scripts on startup.

    ZBrush SDK windows
    2
    0 Votes
    2 Posts
    695 Views
    D
    Hi @diegoev2026 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 Question Good question, and indeed we wouldn’t recommend modifying the init.py file in the installation directory. Instead, ZBrush provides a dedicated folder for this type of user customization, you can quickly navigate to it from the ZBrush menu: Preferences > Asset Directory > Open Directory. You can find more details about that here, if you are looking for further detail : https://help.maxon.net/zbr/en-us/Content/html/user-guide/customizing-zbrush/user-content/user-content.html In order to execute your own script at startup, it should be sufficient to replicate the setup you see in the ZBrush directory by creating a Python directory inside your asset directory with an init.py in it. If you are using the default location for the asset directory, the path would look something like C:\Users\[UserName]\AppData\Roaming\Maxon\ZBrush_[HashValue]\Python\init.py. On top of the init.py scripts, ZBrush also allows running Python scripts as plugins from a directory you can configure through the environment variable in ZBRUSH_PLUGIN_PATH. You can find more details on how to set those up here: https://developers.maxon.net/docs/zbrush/py/2026_1_0/manuals/python_environment.html#zbrush-plugin-path The user asset directory I mentioned above is also part of the ZBRUSH_PLUGIN_PATH by default, meaning you can just drop your plugins in there. Let us know if you need any further clarification! Regards, Davide
  • 0 Votes
    6 Posts
    973 Views
    ferdinandF
    Your approach is not necessarily worse, one could even argue that it is better. I personally would always avoid manually binding to an OS DLL via ctypes, but that is more a personal preference.
  • Create Motion Clip Source with Python API

    Cinema 4D SDK python windows 2026
    3
    0 Votes
    3 Posts
    980 Views
    J
    Hi @ferdinand, and thank you! Your proof-of-concept and pointing me toward mxutils.GetSceneGraphString() was exactly what I needed to solve this. By using the scene graph dumper on a native UI-generated Motion Source from a rigged character, I realized it's just a standard Ojoint hierarchy with normal CTrack objects. I used GetClone(c4d.COPYFLAGS_NO_HIERARCHY) to perfectly replicate the Ojoint skeleton and injected the time variables into the container, and it maps and plays back perfectly. Thanks again.
  • 0 Votes
    7 Posts
    1k Views
    T
    Here's my prototype, if you are interested in my goal Right now, everything works as expected, but only with these lines of code. profile = GetCloneSpline(profile_orig) path = GetCloneSpline(path_orig) I'm happy with the current result. So, I'd love to get some additional advice on correctness and optimization. I think your previous answer was comprehensive enough, so I'll try to integrate some of it. But I'd also be very grateful if you could take a look at my plugin and perhaps give me some more specific optimization tips. If that's not too much trouble, of course! @ferdinand @ThomasB Anyway, thanks for your replies and advices!
  • 2025 SDKs missing files

    Cinema 4D SDK 2025 c++ windows
    2
    0 Votes
    2 Posts
    558 Views
    ferdinandF
    Hello @atg, 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 I can see why would think that, but you mixed things there a bit up. The CMake SDK build system was introduced with 2025.2.0 and became the standard with 2026.0.0. Between 2025.2 and 2025.3 we supported both build systems as a grace period for developers to get accustomed. Chances are very good, that you can just copy the CMake setup, i.e., the cmake folder and files such as CMakeLists.txt, CMakePresets.json, and sdk_modules.txt to a 2025.0 folder and it will generate a correct build system for you. But the supported range is only 2025.2+. For older projects you would have to use the old project tool based build system. Since I know what you are trying to do, I would recommend trying copying before you get into the old build system of ours. 2025.2 Release Notes 2025.2 Build System Docs (which covered both the old Project Tool and CMake) Cheers, Ferdinand edit: You will only find the old project tool tooling in old extended SDKs which supported it, such as 2025.2 or 2025.0.1