Hello @Dunhou,
Thank you for reaching out to us and thank you at @HerrMay for providing what I would think is the correct answer.
At least on my machine, nothing is crashing here, it is just that the description of the tag is malformed on line five.

In this case, it is such a severe error, that Cinema 4D fails to load the description at all because it is cyclically referencing itself. The keyword INCLUDE
in a resource allows us to include another resource in that resource. And when we try to reference the resource, we are defining, Cinema 4D is understandably confused. For less severe descriptions errors, one usually is able to then lick OK
a few times to get Cinema 4D to load what it does understand. But that does not work here, and one is caught in an endless loop of self-reference.
In practice, INCLUDE
is usually used to load in the base description of something. So, when we take the simple description of the opydoublecircle example plugin which only defines one parameter named PYCIRCLEOBJECT_RAD
,
CONTAINER Opydoublecircle
{
NAME Opydoublecircle;
INCLUDE Obase; // Loads
GROUP ID_OBJECTPROPERTIES
{
REAL PYCIRCLEOBJECT_RAD { UNIT METER; MIN 0.0; }
}
INCLUDE Osplineprimitive;
}
we can see that Obase
loaded the Basic and Coordinates tabs into that object description that every object must have. And Osplineprimitive
loaded in the parameters which are shared by all spline primitives, as for example Plane, Reverse, etc.

When we remove Osplineprimitive
, all these parameters will not be added to our object.
CONTAINER Opydoublecircle
{
NAME Opydoublecircle;
INCLUDE Obase; // Loads
GROUP ID_OBJECTPROPERTIES
{
REAL PYCIRCLEOBJECT_RAD { UNIT METER; MIN 0.0; }
}
}

What slightly complicates this, is that (allmost) all NodeData
derived plugin types must include at least their base description, e.g., Obase
for objects, Tbase
for tags, Mbase
for materials, Xbase
for shaders, and so on.
In some cases speccializations are allowed, as for example including Texpression
instead of Tbase
. Texpression
extends Tbase
and while Tbase
is used for generic tags which usually do not modify the scene, e.g., the "Display" tag Tdisplay
is based on Tbase
:
CONTAINER Tdisplay
{
NAME Tdisplay;
INCLUDE Tbase;
GROUP ID_TAGPROPERTIES
{
COLUMNS 2;
BOOL DISPLAYTAG_AFFECT_DISPLAYMODE { }
LONG DISPLAYTAG_SDISPLAYMODE
{
Texpression
is usually used by tags which do modify a scene in some shape or form, e.g, the "Look at Camera" tag Tlookatcamera
:
CONTAINER Tlookatcamera
{
NAME Tlookatcamera;
INCLUDE Texpression;
GROUP ID_TAGPROPERTIES
{
BOOL LOOKATCAMERA_PITCH { }
}
}
The difference is then simply that such tags whill have the expression paramaters in their 'Basic' tab.

As said before, I already have updating the GUI manuals on my desk, it will be one of the next things I do, as they are factually non-existent for Python and a bit outdated and assumptious regarding what users will easily understand for C++. But I would still recommend Python users having a look at the C++ docs, as the information provided there is directly transferable to Python.
As lined out in other threads, greping the Cinema 4D resource folder, e.g., C:\Program Files\Maxon\2023.1.3\resource\
is a good way to gather knowledge on your own right now. I like using Agent Ransack for doing things like this, but any grep-like tool, including these built into text editors, will do:

Cheers,
Ferdinand