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

    Cloner Object Cache [SOLVED]

    Scheduled Pinned Locked Moved PYTHON Development
    3 Posts 0 Posters 436 Views
    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 Offline
      Helper
      last edited by

      On 16/03/2017 at 09:03, xxxxxxxx wrote:

      Hi,all.

      sorry for the simple question.I want to know how to get the cache of a cloner or sweep object.For example,there is a cube under the cloner object,how to get all points of the cubes?I looked for the SDK document,found a function called "GetCache()",I tried ,but not work.and I want to know how GetCache()  to operate?although there is a example in the SDK,I am still confused about it.Would you help me?Any help would be very appreciated!

      Best wishes!
      Ching.

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

        On 17/03/2017 at 10:28, xxxxxxxx wrote:

        Hi Ching, thanks for writing us.
        With reference to your question I warmly suggest you to spend some time looking into the BaseObject::GetCache() and BaseObject::GetDeformCache() in the Python API documentation where useful code snippets are presented showing how to traverse the scene and operate accordingly with the caches. Beside that I also warmly suggest to spend some time through the page of the BaseObject Manual and, last but not least, It could be also very helpful to give a look to the Active Object Dialog example part of the cinema4dsdk example set. Although a bit long, it could definitively shed lights on the internal structure of the cache in Cinema and how to handle it.

        For your comfort please find a one-level digging-down cloner example showing how to retrieve the point data information for the objects pinned under a MoGraph Cloner object. To test the example simply create a scene with one cloner and one object pinned under it and run the script by selecting the cloner object. Please note that the code is not recursive so situations where cloners are nested are not handled, but extending to such a scenario won't be that hard.

        def main() :  
          obj = doc.GetActiveObject()  
            
          # check object selection  
          if obj is None:  
              print("No object selected. Select the MoGraph Cloner.")  
              return  
            
          # get the object cache and   
          cache = obj.GetCache()  
            
          # check the cache to be valid  
          if cache is None:  
              return  
            
          # get the first child  
          cacheChild = cache.GetDown()  
            
          # loop over the children   
          while cacheChild is not None:  
              # get the cache global transformation matrix  
              cacheMg = cacheChild.GetMg()  
              # verify that the cache is an instance of PolygonObject  
              if cacheChild.GetCache().IsInstanceOf(c4d.Opolygon) :  
                  # access the cache of the child   
                  polyCache = cacheChild.GetCache()  
                  # access the points stored in the child's cache  
                  points = polyCache.GetAllPoints()  
                  # loop over the points and transform them for the child global matrix   
                  for point in points:  
                      print cacheMg * point  
                    
              # move to the next child of the cloner      
              cacheChild = cacheChild.GetNext()  
            
          return
        

        Best, Riccardo

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

          On 17/03/2017 at 23:59, xxxxxxxx wrote:

          Hi,Riccardo.

          Thank you for your code.It is very useful to me.

          Bset,Ching

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