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

    Underlying of "doc" and "op" ?

    Cinema 4D SDK
    3
    8
    2.1k
    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.
    • eZioPanE
      eZioPan
      last edited by

      I'm confused about doc and c4d.documents.GetActiveDocuments() in a Python Tag.

      Here is the code in a Python Tag:

      import c4d
      #Welcome to the world of Python
      
      
      def main():
          aDoc = c4d.documents.GetActiveDocument()
          print("Active Doc:\n{}\ntime:{}".format(aDoc, aDoc.GetTime().Get()))
          print(" ")
          print("doc:\n{}\ntime:{}".format(doc, doc.GetTime().Get()))
          print(" ")
      

      If I scroll playhead in the scene, both aDoc and doc with their time is same.
      If I start an image sequence render,
      aDoc and doc report the same object,
      but "time" of aDoc still represents the playhead in the scene,
      and "time" of doc represents the current render frame's time.

      Is there some difference between the two of them?

      And Is there any function that can produce the same result of op in a Python Tag?

      1 Reply Last reply Reply Quote 0
      • C4DSC
        C4DS
        last edited by

        I guess the "op" can be obtained from a tag via GetObject()

        1 Reply Last reply Reply Quote 0
        • S
          s_bach
          last edited by

          Hello,

          a Python Tag is part of the scene.

          When you render a scene in the Picture Viewer, Cinema 4D will create a copy of that scene. That copy is then rendered. The copy of the scene includes a copy of your Python Tag.

          GetActiveDocument() returns the active document. The active document is the document you are currently looking at in the viewport. So this document is not the same document as the document you are currently rendering.

          For example: you can start rendering a document in the Picture Viewer and then close the currently open document while the rendering is still going on. That is why you should never reference the active document in any code that might be executed in the rendering pipeline.

          doc is the document that currently owns the Python Tag. When you are rendering in the Picture Viewer, doc is the document that is currently rendered. Not the active document.

          The op variable references the tag itself. Again, when you are rendering, the scene (including the tag) is copied.

          best wishes,
          Sebastian

          MAXON SDK Specialist

          Development Blog, MAXON Registered Developer

          1 Reply Last reply Reply Quote 2
          • eZioPanE
            eZioPan
            last edited by eZioPan

            Hi, @C4DS and @s_bach, thank you for replies!

            @C4DS, do you mean to write op.GetObject() in a Python Tag? That will produce the object that Python Tag attached.
            Or do you mean writing outside of Python Tag? If I can write this script outside this Pythion Tag, I should know which is the Python Tag already, in this case, I don't need to use op to get Python Tag.
            I'm a little confused about your meaning in the post.

            @s_bach, after reading your post, I understand that Active Document and Scene being Rendering is different. And I should never use ActiveDocument within a render pipeline.
            Here I still have one more question:
            There is no other way in a Python Tag to produce the same result as doc and op; they are very special variables. Am I correct?

            C4DSC 1 Reply Last reply Reply Quote 0
            • S
              s_bach
              last edited by

              Hello,

              in a Python tag, op points to the tag itself. Right now I don't see any other way to get this reference.

              doc references to the document that owns the tag. So it is the same as op.GetDocument().

              best wishes,
              Sebastian

              MAXON SDK Specialist

              Development Blog, MAXON Registered Developer

              eZioPanE 1 Reply Last reply Reply Quote 2
              • eZioPanE
                eZioPan @s_bach
                last edited by

                @s_bach, thank you very much! Now I see the whole picture!

                1 Reply Last reply Reply Quote 0
                • C4DSC
                  C4DS @eZioPan
                  last edited by

                  @eziopan said in Underlying of "doc" and "op" ?:

                  @C4DS, do you mean to write op.GetObject() in a Python Tag? That will produce the object that Python Tag attached.
                  Or do you mean writing outside of Python Tag? If I can write this script outside this Pythion Tag, I should know which is the Python Tag already, in this case, I don't need to use op to get Python Tag.
                  I'm a little confused about your meaning in the post.

                  Sorry, was away for a few days and couldn't respond earlier.
                  What I assumed you wanted to achieve was a way to obtain the "op" as if creating a regular script.
                  There the "op" is the current active object.
                  I misinterpreted your question, and didn't see your reference to the Python tag. Hence, I wrongly assumed you wanted to access the "op" as if from a user script, thus the active object, and therefore I mentioned to use "op.GetObject()" to obtain the object the tag was attached to.
                  I made too many wrongly assumptions. Sorry about that.

                  eZioPanE 1 Reply Last reply Reply Quote 0
                  • eZioPanE
                    eZioPan @C4DS
                    last edited by

                    @c4ds, don’t worry! Every steps (even the off-road one) make some progress, right? I appreciate the way you focusing on the problem solving, which I believe is also the wonderful thing of this forum: we do our best to solving the problem itself, discussing about the better/more accurate answers rather than “who is right, who is wrong”. Last but not least, thank you for taking time to reply! 😉

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