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

    Load/Save BaseLinkArray in Document

    SDK Help
    0
    3
    503
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      On 21/09/2017 at 16:44, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R16+ 
      Platform:   Windows  ;   Mac OSX  ; 
      Language(s) :     C++  ;

      ---------
      I have a plugin Object which maintains an array of BaseLinks to tags (my plugin tags on other objects) in the scene document using a BaseLinkArray as a member of the ObjectData of the object plugin (instead of using GetDDescription() and dynamic LINKs).  This is mainly for speed (avoid recursing the document) and to allow multiple of my plugin objects each with its own set of tags on objects.

      Is it possible to save a BaseLinkArray using Read/Write/Copyto (ala the BaseLink if must be)?

      What would be the best practice (in code, please) to achieve this?  Would GetDDescription() simply be about the same speed (realizing the slow down of using BaseLinks but with the advantage of having awareness of missing/deleted links).

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 22/09/2017 at 02:12, xxxxxxxx wrote:

        Hello I don't have a working environment atm so I can't test but it should work.

        In the Write override of your tag object, you iterate through your BaseLinkArray.
        For each BaseLinks inside of your BaseLinkArray you create a HyperFile buffer.
        You call BaseLinks::Write method with this HF.
        Then you read the memory of this HF.
        And you write inside the HF of the tag the size of this memory block and the memory itself.
        In order to have a struct like this
        Int32 SizeMemory
        SizeMemory Memory

        In the Write override of your tag object.
        For each MemoryBlock
        Create an empty HyperFile buffer (make sure to flush it)
        Past the MemoryBlock into tihs HF.
        Alloc a new BaseLinks
        Call BaseLinks::Read with the HF
        Add this Baselinks to your BaseLinkArray

        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          On 22/09/2017 at 02:28, xxxxxxxx wrote:

          Hello,

          the best way to store internal data in a NodeData based plugin is to store that data in the object's BaseContainer. Then the data will automatically be copied and saved. See BaseContainer Manual.

          BaseLinkArray is based on BaseArray, so you can use it the same way. E.g. to store it in a HyperFile you must store the number of elements and then each element of the array. See for example this code for reading and this code for writing an array. As gr4ph0s mentions a BaseLink can then be written to file or read from file using its I/O functions.

          You should only worry about GetDDescription() if you want to display parameters in the Attribute Manager.

          best wishes,
          Sebastian

          1 Reply Last reply Reply Quote 0
          • First post
            Last post