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

    How to do that the generated object fill the viewport and be centered

    Cinema 4D SDK
    python
    3
    11
    1.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.
    • ferdinandF
      ferdinand
      last edited by ferdinand

      Hi,

      at least for me it is really hard to answer your question in the current form.

      Modifying the active camera (letting an object fill the view) is quite an unusual thing for both a Python Generator Object and a ObjectData plugin to do. You might want to reconsider your approach. Also worth mentioning is that ObjectData.GetVirtualObjects() is executed in a threaded context, in which it is forbidden or disencouraged to modify the scene or add events. Invoking the 'center in view'-command does both (it modifies the editor camera object), so unexpected behavior is in this case actually to be expected 😉

      To get better help you should post your code and describe your problems more in detail.

      Cheers
      zipit

      MAXON SDK Specialist
      developers.maxon.net

      mfersaouiM 1 Reply Last reply Reply Quote 0
      • mfersaouiM
        mfersaoui @ferdinand
        last edited by

        @zipit
        Hi,
        I created the following example just to demonstrate my issue:
        Code:

        class MyCube(plugins.ObjectData):
            def Init(self, op):
                self.SetOptimizeCache(True)
        
                self.InitAttr(op, float, [c4d.MYCUBE_OBJECT_WIDTH])
                self.InitAttr(op, float, [c4d.MYCUBE_OBJECT_HEIGHT])
                self.InitAttr(op, float, [c4d.MYCUBE_OBJECT_DEPTH])
        
                data = op.GetDataInstance()
                
                data.SetFloat(c4d.MYCUBE_OBJECT_WIDTH, 1600.0)
                data.SetFloat(c4d.MYCUBE_OBJECT_HEIGHT, 1000.0)
                data.SetFloat(c4d.MYCUBE_OBJECT_DEPTH, 1500.0)
        
                return True
        
            def GetVirtualObjects(self, op, hierarchyhelp):
        
                width = op[c4d.MYCUBE_OBJECT_WIDTH]
                height = op[c4d.MYCUBE_OBJECT_HEIGHT]
                depth = op[c4d.MYCUBE_OBJECT_DEPTH]
        
                cube = c4d.BaseObject(c4d.Ocube)
        
                cube[c4d.PRIM_CUBE_LEN, c4d.VECTOR_X] = width
                cube[c4d.PRIM_CUBE_LEN, c4d.VECTOR_Y] = height
                cube[c4d.PRIM_CUBE_LEN, c4d.VECTOR_Z] = depth
                
                return cube
        

        And here is an screenshot for the given result :

        my-cube-python.jpg

        The object is too large and it cut off in the viewport, and my object must be with the given dimensions above

        1 Reply Last reply Reply Quote 0
        • ferdinandF
          ferdinand
          last edited by ferdinand

          Hi,

          while what you are doing is much clearer now, I still do not really get your problem 😉 An ObjectData plugin that implements GetVirtualObjects is not really supposed to modify the scene camera. Therefor I am a bit hesitant to tell you ways how you could circumvent the threaded context of GVO.

          Just consider an user has three of your MyCube objects in his/her scene and has animated a parameter in each of these objects. When he/she starts the scene playback GVO will be invoked for each object at least once per frame. If you had some sort of camera logic attached to the execution of your GVO, the scene camera would wildly jump from object to object for each frame and the user would not be able to interact with the scene anymore.

          If you really want to have some sort of "frame this object"-logic attached to your object, I would propose adding a button to your description resource and then frame the object when the user presses that button.

          Cheers
          zipit

          MAXON SDK Specialist
          developers.maxon.net

          mfersaouiM 1 Reply Last reply Reply Quote 0
          • mfersaouiM
            mfersaoui @ferdinand
            last edited by mfersaoui

            @zipit
            My object is limited to only one Object instance by document, (is not possible to open more than one object in current document). It is a studio light kit that will contain a lot of objects. I had thought about adding button to do that.
            Anyway, thank you very much for your help. I will probably adding button to do that.

            1 Reply Last reply Reply Quote 0
            • ManuelM
              Manuel
              last edited by

              Hello,

              As Zipit said, this is not the right place to trigger event or change the scene.

              What I would like to know is if it's a "once shot" or "always".

              If it's one shot, you could Create a script or a commandData that will add your generator to the scene and take care of changing the camera to Frame it. This is allowed.

              If it's "always"
              As I understand, you are going to create a Cube (we know the size) and put object Inside it ?
              So you can move your cube backward (in camera space). You just have to check if your 8 points are in the frame.

              That remember a bit this post. You will find code and information to check if your object is framed..
              Once again, don't update the scene or move the camera in a generator.

              hope that helped.

              Cheers,
              Manuel

              MAXON SDK Specialist

              MAXON Registered Developer

              mfersaouiM 1 Reply Last reply Reply Quote 1
              • mfersaouiM
                mfersaoui @Manuel
                last edited by

                @m_magalhaes
                Hello,

                it's a "once shot" I would like to execute this command only on the first object open. in the case if the object is saved and reopened the command should not be re-executed. And also I don't want to move the object out of the world center.

                No problem, I will just add a button to my description resource and run the command c4d.CallCommand(12151) # Frame Selected Objects

                Thank you.

                1 Reply Last reply Reply Quote 0
                • ferdinandF
                  ferdinand
                  last edited by ferdinand

                  Hi,

                  if you only want to frame the object on instantiation and also want to restrict the user to only being able to create one of your objects (which you cannot really do either in a safe way from within an ObjectData plugin), then the solution proposed by @m_magalhaes - writing a CommandData wrapper - is probably the best solution, as it can do both easily.

                  Cheers
                  zipit

                  MAXON SDK Specialist
                  developers.maxon.net

                  1 Reply Last reply Reply Quote 1
                  • ManuelM
                    Manuel
                    last edited by

                    hi,

                    We already talked on this thread about how to limit the number of object in a scene.

                    (it's cool to see tools coming to life)

                    So if you just want to frame the object from time to time, and still want to have that in your interface, i think the button is probably the best solution.

                    Cheers,
                    Manuel

                    MAXON SDK Specialist

                    MAXON Registered Developer

                    1 Reply Last reply Reply Quote 1
                    • ManuelM
                      Manuel
                      last edited by

                      hello,

                      without any news, i'll pass this thread to solved.

                      Cheers,
                      Manuel

                      MAXON SDK Specialist

                      MAXON Registered Developer

                      mfersaouiM 1 Reply Last reply Reply Quote 1
                      • mfersaouiM
                        mfersaoui @Manuel
                        last edited by mfersaoui

                        @m_magalhaes
                        Hello Manuel,
                        ok Thank you. I have used the solution that I have mentioned above.

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