The Maxon SDK Team is currently short staffed due to the winter holidays. No forum support is being provided between 15/12/2025 and 5/1/2026. For details see Maxon SDK 2025 Winter Holidays.
  • Send Python Code To C4D from any Texteditor

    python
    7
    1
    2 Votes
    7 Posts
    2k Views
    mikeudinM
    @mdr74 OK, thank you! Will check it.
  • But no plug-ins in R21.207 (demo version) possible?

    r21
    3
    1
    0 Votes
    3 Posts
    610 Views
    5
    Thank you for the detailed answer. and indeed, I can confirm that a plug-in (Reeper 3.2 SE) loaded as a trial for R21 is working properly. I will now contact Paul Everett directly first.
  • R21 Trial: Does it load plugins?

    r21
    7
    0 Votes
    7 Posts
    2k Views
    5
    But no plug-ins in R21.207 (demo version) possible? The LAZPoint plugin from cinemaplugins.com would be a nice thing for me if it works for me. But it has to be installed on Cinema4D-R21, with r22 or r23 it doesn't work. To test it, I want to run the LAZPoint demo plugin on a demo version of Cinema - r21. R21-Demo is already running and the LAZPoint-Demo-Plugin is already in the directory \ C4DPlugins and I have registered this directory in the program defaults of R21. But it doesn't work. Other plugins that are trying to be loaded also do not run, none of them run. Tried on 2 computers (Win10 64 pro and win 64 home). What's wrong? ----- Orginal in german: Doch keine Plug-Ins in R21.207(Demo-Version) möglich ? Das LAZPoint-Plugin von cinemaplugins.com wäre eine feine Sache für mich, wenn es bei mir läuft. Es muss aber auf Cinema4D-R21 installiert werden, mit r22 oder r 23 geht es nicht. Um es zu testen, will ich das LAZPoint-Demo-Plugin auf einer Demo-Version von Cinema - r21 laufen lassen. R21-Demo läuft bereits und das LAZPoint-Demo-Plugin liegt bereits im Verzeichnis C:\C4DPlugins und ich habe dieses Verzeichnis in den Programvoreinstellungen von R21 angemeldet. Es läuft aber nicht. Auch versuchsweise ebenfalls zu ladende andere Plugins laufen nicht, keines läuft. Auf 2 Computern versucht ( Win10 64 pro und win 64 home) . Was läuft falsch? [image: 1604162815376-aad98a1d-79bf-442b-9949-8c736404ca0e-image-resized.png]
  • Cinema 4D Client R21 Service Creation

    Moved
    22
    0 Votes
    22 Posts
    18k Views
    r_giganteR
    Hi @thestraycat, I'm sorry to disappoint you but the option to start the TeamRender Client via NSSM or SC or WinSW has not yet been restored. I can only ask, to contact us via our official email address, to better describe the impact this issue is causing on your work to escalate the discussion. Best, Riccardo
  • Accessing object container in C++.

    4
    2
    0 Votes
    4 Posts
    749 Views
    M
    Hi internally as stated in the documentation of GeListNode.__setitem__ and GeListNode.__getitem__ it's just a wrapper arround respectively C4DAtom.SetParameter and C4DAtom.GetParameter. Then Set/GetParameter will call the respective NodeData.G/SetDParameter of the GeListNode implementation. This method lets you define how the parameter access is done (aka retrieving the data from a local member variable or reading the base container made by the description). So if we go back to the s/getitem, internally in python it builds automatically a DescId based on the data provided doing a stupid If pyData.Class == PyBool: DescId(pyData, DTYPE_BOOL, 0) so you can easily reproduce this part too. But I don't think in C++ you can't support multiple arguments in the bracket operator see C++ [] array operator with multiple arguments?, so you could somehow hack around with the usual () operator, but our classic API doesn't really provide a mean of inspection so you will need to either do a lot of overrides or have unsafe void pointer arguments while PythonObject always has a type attached to them so you can at any time accept a PyObject* and retrieve is real DataType, and this is exactly what is possible to do with the MAXON API where you register datatype as MAXON_DATATYPE then they all can be retrieved in the form of a maxon::Data but you still have access to its maxon::Id and you can know the datatype ID and doing a safe casting. Hope this answers your questions. Cheers, Maxime.
  • The asymmetric matrix inversion issue

    python
    6
    1
    1 Votes
    6 Posts
    1k Views
    ferdinandF
    Hi, @Cairyn said in The asymmetric matrix inversion issue: I guess it depends on the point you want to make... I would mostly agree, but my point point was more the other way around. Not that shearing is a thing you commonly want to do, but the fact the you should be aware that c4d.Matrix will not enforce an orthogonal basis. Because if you thought it does, you could for example think that my_frame = c4d.Matrix(v3=my_normal) would be a sufficient way to construct an orthogonal frame where my_normal is k and then carry out some transforms with it and wonder what the heck is going wrong. @Cairyn said in The asymmetric matrix inversion issue: This has, in fact, been a point I thought long and hard about... What I meant with that passage was the story which has been attributed to many famous programmers who left a complicated piece of code only commented with "and here comes the tricky part". Usually told as a testament to both their technical genius and their communicative shortcomings. The often (at least silently) admired notion is that "everything is self explanatory for a smart person". Which of course is neither true nor very "cool". I feel you are drifting a bit into that direction. About the linear algebra stuff. In my opinion there is no wrong or right there, you can do a good job with a very coarse and with a very fine model. Although I think often the geometrical meaning of linear algebra has been neglected in teachings about it. Especially Cinema's "matrices" (which in my book do not really qualify as matrices) can be very well explained as linear maps which will automatically will make all four principal transforms intuitively clear. Everything that is left then is to explain that matrices are just another way to write a linear map, i.e. a linear combination of vectors representing a coordinate system. Cheers, zipit
  • Matrices / Rotations / Quaternions when transferring data.

    4
    0 Votes
    4 Posts
    854 Views
    lasselauchL
    Hey guys, just wanted to let you know, that I've cracked the case in the meantime. Here are my findings: def convert_matrix_left_to_right(m): # http://www.techart3d.com/2016/02/convert-left-handed-to-right-handed-coordinates/ # m = op.GetMg() new_m = c4d.Matrix( m.off, m.v1*-1, m.v2, m.v3) return new_m def rotate_y_axis_180(): # Construct your own matrix based on rotation of axis # https://www.mathworks.com/help/phased/ref/roty.html x = c4d.Vector(-1, 0, 0) y = c4d.Vector(0, 1, 0) z = c4d.Vector(0, 0, -1) off = c4d.Vector(0, 0, 0) return c4d.Matrix(off, x, y, z) def GetGlobalRotation(obj): m = obj.GetMg() new_m = rotate_y_axis_180() * convert_matrix_left_to_right(m) return c4d.utils.MatrixToHPB(new_m, order=c4d.ROTATIONORDER_XYZGLOBAL) Indeed you have to convert from a left-handed (c4d) (hpb) to a right-handed (houdini) (xyz) coordinate system... plus I've found that you need to add 180° to the y axis, so I constructed a matrix in rotate_y_axis_180 that I can multiply to my converted matrix. Hope it helps someone... Thank you guys for your input! Have a great weekend and stay safe! Cheers, Lasse
  • Best way to fill a maxon::BaseArray

    6
    0 Votes
    6 Posts
    1k Views
    r_giganteR
    Unfortunately, differently from std lib where it's possible to define and init a vector pretty easily using one-line statement( std::vector<int> a (10, 100);) this looks like being not currently possible with maxon::BaseArray() and you need to make it the usual way. Best, R
  • Moving a Point Along an Arc by Distance from another Point

    7
    2
    0 Votes
    7 Posts
    2k Views
    ?
    @zipit My sincerest gratitude for your help. Not only did you get my project unblocked, but you answered my follow-up questions. I have learned a lot from you. Thank you!
  • How to fillet a ObjectData edge in Python?

    9
    1
    0 Votes
    9 Posts
    1k Views
    ?
    @zipit Absolutely incredible work! So elegant! Thank you very much @m_adam Thank you for the reply and confirmation!
  • R21 Project Tool?

    r21 c++
    7
    1
    0 Votes
    7 Posts
    968 Views
    B
    @Cairyn @zipit @m_magalhaes Thanks for the detailed response. After installing the C++ environments, it works as expected. Sorry new to this. As I only have python to reference for. I also managed to build the plug-ins using this guide: https://developers.maxon.net/forum/topic/10967/compiling-the-cinema-4d-r20-c-sdk-examples
  • How to load a file with python and turn it into the active document ?

    2
    0 Votes
    2 Posts
    678 Views
    C4DSC
    I have replied your post at C4DCafe. "The c4d.documents.LoadDocument returns you a BaseDocument, which you then need as argument for the InsertBaseDocument and SetActiveDocument."
  • How to decompile cdl64 file?

    9
    0 Votes
    9 Posts
    3k Views
    maxonM
    @trideshnik said in How to decompile cdl64 file?: Hmm.. so.. Comrades, before getting the necessary information, I was told 100500+ times about copyright. Everyone saw fit to indicate this. Dear, do you think that the person asking this question needs a triple copyright notice? If you do not want to answer or help, no one is forcing you, but making idiots out of people is bad form. I got a ton of off-topic information. reasoning, warnings. and only a fraction of the information I need. so nice. but. Thanks to those who indicated the direction in which to dig. P.S. it seems to me that this is such a lifestyle. okay) khkhgxghzhuxvvldqkdfnhuv This answer is considered irrespecutful and contradicts the collaboration spirit of the forum. User banned.
  • Possibility of using ExecuteSubID with ToolData.

    r21 c++
    2
    1
    0 Votes
    2 Posts
    466 Views
    r_giganteR
    Hi @Danchyg1337, thanks for reaching out to us. The approach you've pointed out can work to activate a ToolData with a specific preset. You've to register a CommanData for every preset you'd like your ToolData to use and, if needed, you can register your ToolData passing the PLUGINFLAG_HIDEPLUGINMENU to avoid that the generic ToolData appears among the menus. Best, Riccardo
  • Support of Scene Nodes development

    5
    1
    0 Votes
    5 Posts
    1k Views
    I
    @m_magalhaes said in Support of Scene Nodes development: @iluxa7k said in Support of Scene Nodes development: Several suggestions at c4d cafe forums, if will be time to read them Do you have any link for us ? I know that a couple of Maxon guys are already looking closely to that forum (and others) https://www.c4dcafe.com/ipb/forums/forum/289-scene-nodes-workflows-discussion/ https://www.c4dcafe.com/ipb/forums/topic/111961-nodes-road-map/?&page=5#comments https://www.c4dcafe.com/ipb/forums/topic/111939-maxon-announces-cinema-4d-r23-overview-discussion/?page=22&tab=comments#comment-721276
  • The slider tool returns False.

    r21 python
    2
    0 Votes
    2 Posts
    577 Views
    M
    Hi @x_nerve the ID used is not the correct one you should use: 431000021 for edge mode and 431000030 for point mode, unfortunately, there are no symbols for these tools. Cheers, Maxime.
  • Some attempts at nondestructive modeling

    Moved r21 python
    5
    1
    0 Votes
    5 Posts
    1k Views
    X
    Hi: After a trial run, the script was tested successfully. By setting the name suffix of Python Tag, the problem of repeated running of Tag can be solved. Taking c4d.DIRTYFLAGS_SELECT as an example, if the point, line, and surface selections change, it will execute, otherwise it won't. The Python script code is as follows: import c4d #e-mail: [email protected] def main(): Name = op.GetName() Objects = op.GetObject() Changed = Objects.GetDirty(c4d.DIRTYFLAGS_SELECT) Text = ["xit" + str(Changed)[-1]] if str(Name).count(Text[0][:-1]) != 0 : if str(Name).find(Text[0][:-1]) != str(Name).rfind(Text[0][:-1]) : if str(Name)[str(Name).rfind(Text[0][:-1]):] == Text[0] : if str(Name).find(Text[0][:-1]) <= 0: #Do not execute, exit the program. print ("Does not perform.") op.SetName(str(Text[0])) return else: #Do not execute, exit the program. op.SetName(str(Name)[:str(Name).find(Text[0][:-1])] + str(Text[0])) print ("Does not perform.") return else: if str(Name).find(Text[0][:-1]) <= 0: op.SetName(str(Text[0])) print ("Perform.") else: op.SetName(str(Name)[:str(Name).find(Text[0][:-1])] + str(Text[0])) print ("Perform.") else: if str(Name)[str(Name).rfind(Text[0][:-1]):] == Text[0] : #Do not execute, exit the program. print ("Does not perform.") return else: op.SetName(str(Name)[:str(Name).find(Text[0][:-1])] + str(Text[0])) print ("Perform.") else: print ("Perform.") op.SetName(str(Name) + str(Text[0])) print ("pass") #The next thing to execute.
  • c4dpy.exe asking for credentials?

    r21 python
    3
    0 Votes
    3 Posts
    456 Views
    M
    Hi @bentraje as you already figured out in the documentation for R21+ this is necessary because each version (c4dpy, CommandLine, TRS, TRC) now have their own preference folder and doesn't share anymore the one from c4d. Cheers, Maxime.
  • c4dtools alive?

    Moved
    3
    0 Votes
    3 Posts
    579 Views
    indexofrefractionI
    ok tx... It seems the old c4dtools were integrated into c4ddev sadly c4ddev is nothing for the occasional c4d python hacker .-) the "beginners guides" are on "todo" for years, now and probably wont get completed anymore. it does not look like Niklas is still engaged in the c4d world.
  • Maximize/Resize "Add Motion Clip" Window

    3
    0 Votes
    3 Posts
    672 Views
    Leo_SaramagoL
    @zipit Thanks!