Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware 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

    Retrieving Link from Hyperfile

    Cinema 4D SDK
    python sdk
    2
    3
    445
    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.
    • ?
      A Former User
      last edited by A Former User

      Hello,
      I'm having an issue saving a link within a BaseContainer to a Hyperfile, then loading it.

      This is what happens in my Console in these three lines:

      1. This is the confirmation that the Hyperfile was written to disk from the save_hyperfile function
      2. This is the print of the object from the BaseContainer at line 49 (in the save_hyperfile function)
      3. This is from the load_hyperfile function after loading the Hyperfile from disk. The Atom is now None.
        hyperfile.png

      Here is the code I'm using:

      import c4d, os
      from c4d import documents, bitmaps, gui
      from c4d.gui import GeDialog
      
      key = 12345
      OBJ_BC_ID = 90210
      OBJ_ID = 1000
      
      def load_hyperfile():
          global doc
          path = c4d.storage.LoadDialog()
      
          hf = c4d.storage.HyperFile()
          if not hf.Open(ident=key, filename=path, mode=c4d.FILEOPEN_READ,
                         error_dialog=c4d.FILEDIALOG_NONE):
              # Meaningful exception for when read access fails goes here.
              print "Could not read file."
              return False
          bc = hf.ReadContainer()
      
          for cid, value in bc[OBJ_BC_ID]:
              print cid, value
      
          obj = bc[OBJ_BC_ID].GetLink(OBJ_ID,doc)
          print obj
      
          hf.Close()
      
      
      def save_hyperfile(obj):
          path = c4d.storage.SaveDialog(title="Save your Pose Library",force_suffix="file")
      
          bc = c4d.BaseContainer()
          objBc = c4d.BaseContainer()
          objBc.SetLink(OBJ_BC_ID,obj)
          bc.SetContainer(OBJ_BC_ID, objBc)
      
          hf = c4d.storage.HyperFile()
          if not hf.Open(ident=key, filename=path, mode=c4d.FILEOPEN_WRITE,
                         error_dialog=c4d.FILEDIALOG_ANY):
              # Meaningful exception for when write access fails goes here.
              print "Could not write file."
              return False
          else:
              print "Wrote file at %s"%path
      
          hf.WriteContainer(bc)
      
          for cid, value in bc[OBJ_BC_ID]:
              print cid, value
      
          hf.Close()
      
      class Dlg(gui.GeDialog):
          def __init__(self):
              global doc,obj
      
          def CreateLayout(self):
              self.SetTitle('Hyperfile')
              self.GroupBegin(1001, c4d.BFH_SCALEFIT, 1, 2)
              self.AddButton(1002, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT, initw=0, inith=20, name="Save Hyperfile")
              self.AddButton(1003, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT, initw=0, inith=20, name="Load Hyperfile")
              return True
      
          def Command(self, id, msg):
              if id == 1002:
                  save_hyperfile(obj)
              elif id == 1003:
                  load_hyperfile()
              return True
      
      def main():
          global doc,obj
          doc = documents.GetActiveDocument()
          obj = doc.GetActiveObject()
          if obj is None:
              gui.MessageDialog("Please select an object to save.")
              return
          dlg = Dlg()
          dlg.Open(c4d.DLG_TYPE_MODAL_RESIZEABLE, xpos=-2, ypos=-2, defaultw=580, defaulth=380)
      
      if __name__=='__main__':
          main()
      

      Can anyone please help me to understand how to get this link back from the Hyperfile? Thank you!

      1 Reply Last reply Reply Quote 0
      • r_giganteR
        r_gigante
        last edited by

        Hi blastframe, thanks for reaching out us.

        With regard to the issue mentioned, beside the lack of the BaseDocument instance to be passed to the BaseContainer::GetLink() method I'm confused about the scope of your script. What's the final goal? Saving an object to an hyperfile? Or actually saving a link to refer an object to another in the hyperfile?
        Last but not least, it's a bit weird that the dialog should not pop-up if there's no active object.

        Lookng forward your comments, give best
        Riccardo

        1 Reply Last reply Reply Quote 0
        • ?
          A Former User
          last edited by A Former User

          Thank you @r_gigante for the reply!

          Sorry if the intent is unclear: this self-contained script was something I came up with last night to demonstrate an issue I'm having in my plugin which is too many scripts to post to the forums. Since the user can't select an object after the script is running, I added that catch to make sure an object was selected to show what was going wrong.

          My Goal
          I am trying to save a link to a scene object and its matrix to a hyperfile so the user can load the hyperfile in another session and restore the link to the object so that I can apply the saved matrix. I don't need the object itself.

          Update
          I updated the original script's GetLink() method to pass a reference to the active document, but that did not solve the issue.

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