Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login
    1. Maxon Developers Forum
    2. aghiad322
    3. Topics
    • Profile
    • Following 1
    • Followers 0
    • Topics 7
    • Posts 15
    • Best 0
    • Controversial 0
    • Groups 0

    Topics created by aghiad322

    • aghiad322A

      how to store/serialize custom data type?

      Cinema 4D SDK
      • c++ • • aghiad322
      4
      0
      Votes
      4
      Posts
      669
      Views

      ferdinandF

      Hey @aghiad322,

      as I said, classic API CustomDataType types (e.g., the "dots" example) realize their serialization via CustomDatatypeClass::Read and ::Write. The DotsDataClass example implements both methods to read and write the dots data. If you want things to be stored, e.g., your gradient, you will have to implement it there. E.g., it could look like this:

      Bool MyDataTypeClass::WriteData(const CustomDataType* t_d, HyperFile* hf) { // Cast the passed in data to your datatype. const MyDataType* const data = static_cast<const MyDataType*>(t_d); // Bail when #data is malformed, has no gradient. _gradient is a member of MyDataType and supposed // to be of type Gradient* just as in your case. if (!data || !data->_gradient) return false; // Wrap the dereferenced _gradient as a GeData instance. GeData geData; geData.SetCustomDataType(*data->_gradient); // Write your data into the hyper file and bail if it somehow fails. if (!hf->WriteGeData(geData)) return false; // Write other data members of your datatype. if (!hf->WriteInt32(data->_someInt32)) return false; if (!hf->WriteFloat(data->_someFloat)) return false; if (!hf->WriteBool(data->_someBool)) return false; return true; }

      Cheers,
      Ferdinand

    • aghiad322A

      Expose cpp-registered datatype to python

      Cinema 4D SDK
      • c++ python • • aghiad322
      4
      0
      Votes
      4
      Posts
      746
      Views

      ferdinandF

      Hey @aghiad322,

      please re-read my answer I have given above. You implement a custom data type in C++, your SplineVisDataType in splinevis.h. Then you reference that data type in a resource of a Python plugin (SPLINEVIS ANIMATION_CLONER_SPLVIS { ANIM OFF; };). You will not be able to interact with this parameter/data type in Python until you have ported it or use the other approach I have lined out above - decomposition/channels.

      As also lined out above, you will be never able to get-access a parameter with a custom data type you have implemented yourself in Python because C4DAtom.GetParameter hardcodes the casting/unpacking of data types to Python.

      Cheers,
      Ferdinand

      PS: And if you only want another way to display SplineData, you can also just write a custom GUI targeting that data type. There is no necessity to always write your own custom data type for a custom GUI, you can also target existing ones. You would then have to set the custom GUI to yours when you define a SPLINE element in a dialog or description resource

    • aghiad322A

      Effector plugin is only executing in deformation mode

      Cinema 4D SDK
      • c++ • • aghiad322
      7
      0
      Votes
      7
      Posts
      1.2k
      Views

      aghiad322A

      @ferdinand Thanks a lot it worked

    • aghiad322A

      how to make parameter stick to position with dynamic parameters hiding?

      General Talk
      • programming • • aghiad322
      3
      0
      Votes
      3
      Posts
      931
      Views

      aghiad322A

      Thanks a lot @i_mazlov that's exactly what i needed.
      however on one of the options for the dropdown i have a single Text input that spans across the whole attribute manager, now after i added the "STATICTEXT { SCALE_V; }" it eats up half the space in the image below
      Screenshot 2023-12-22 211432.png
      i tried to give it a Description id and treat it as any other parameter and hiding it using "c4d.DESC_HIDE", below is the layout of the whole tab

      GROUP ADVANCED_TAB { SCALE_V; STRING CUSTOM_TXT_PARAMETER{ ANIM OFF; CUSTOMGUI MULTISTRING; SCALE_V; WORDWRAP; }; GROUP{ COLUMNS 2; LONG ANIMATION_CLONER_FROM { MIN 0; ANIM OFF; }; LONG ANIMATION_CLONER_TO { MIN 0; ANIM OFF; }; LONG ANIMATION_CLONER_SPAN { MIN 1; ANIM OFF; }; GROUP{ COLUMNS 1; SEPARATOR ANIMATION_CLONER_SEPARATOR{ LINE; }; REAL ANIMATION_CLONER_MULTIPLIER { MIN 0.1 ; STEP 0.1 ; ANIM OFF; }; } } GROUP{ COLUMNS 2; REAL SWEEP_PRO_RADIUS { UNIT METER ; STEP 0.1 ; MIN 0.1; ANIM OFF; }; REAL SWEEP_PRO_MULTIPLIER { MIN 0.1; ANIM OFF; }; } STATICTEXT UI_FILLER{SCALE_V;} GROUP{ COLUMNS 2; LONG PRESET { ANIM OFF; CYCLE { ANIMATION_CLONER; SWEEP_PRO; CUSTOM_INPUT; } } } }

      but when i try to hide it from the "GetDDescription()" the description "description.GetParameterI(paramId)" is empty ! ,in the "GetDDescription()" in my source code i have the hiding for the other parameters implemented as well but didn't copy them to keep the snippet at minimum lines

      def GetDDescription(self, node: c4d.GeListNode, description: c4d.Description, flags: int) -> typing.Union[bool, tuple[bool, int]]: if not description.LoadDescription(node.GetType()): return False, flags paramId: c4d.DescID = c4d.DescID(c4d.DescLevel(c4d.UI_FILLER, c4d.DTYPE_STRING, 0)) evalId: c4d.DescID = description.GetSingleDescID() if (evalId and not paramId.IsPartOf(evalId)): return True, flags paramData: c4d.BaseContainer = description.GetParameterI(paramId) #paramData for the "c4d.UI_FILLER" is empty if paramData is None: return True, flags # parameter ID_HIDE_CONDITION. paramData[c4d.DESC_HIDE] = True if node[c4d.PRESET] == c4d.CUSTOM_INPUT else False return True, flags | c4d.DESCFLAGS_DESC_LOADED
    • aghiad322A

      Plugin Tag printing randomly to the console

      Bugs
      • python • • aghiad322
      4
      0
      Votes
      4
      Posts
      932
      Views

      ferdinandF

      Hey @aghiad322,

      Great to hear that you solved your problem. And although I understand how you meant your last sentence, the questions of users are never inconvenient to us. All questions are welcome, but sometimes we must draw some boundaries for the scope of support.

      Cheers,
      Ferdinand

    • aghiad322A

      Message system isn't working in python effector

      Cinema 4D SDK
      • python • • aghiad322
      4
      0
      Votes
      4
      Posts
      761
      Views

      ferdinandF

      Hello @aghiad322,

      I have closed this thread as it has been answered. The task has been added to our internal task pool. However, since this is not a bug but a feature limitation, I have not marked this thread as to_fix as there is nothing to fix here.

      This does not mean that we will not do it, I have added the task for now to the task pool of a close by release. But we treat feature requests differently than bugs, and the task might therefore be postponed/pushed when we run out of time in that release.

      Cheers,
      Ferdinand

    • aghiad322A

      Instance Object Link is not working

      Cinema 4D SDK
      • python • • aghiad322
      3
      0
      Votes
      3
      Posts
      710
      Views

      M

      Hello @aghiad322,

      without further questions or postings, we will consider this topic as solved by Monday 05/06/2023 and flag it accordingly.

      Thank you for your understanding,
      Maxime.