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
    • Recent
    • Tags
    • Users
    • Login

    need help: cloth tag

    Scheduled Pinned Locked Moved PYTHON Development
    7 Posts 0 Posters 521 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 19/10/2014 at 02:18, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   16 
      Platform:   Windows  ;   
      Language(s) :   C.O.F.F.E.E  ;   XPRESSO  ;  PYTHON  ;

      ---------
      hi everyone..
      i need help
      i want to do calculate cache in my multiple cloth tags in one user data button...
      please anyone can help...
      thanks

      (sorry for the my poor english)_<_mytubeelement_>_<mytubeelement =""loadBundle":true" ="relayPrefs" id="myTubeRelayElementToTa_<_mytubeelement_>_nt>

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

        On 19/10/2014 at 09:43, xxxxxxxx wrote:

        Hi Suda,
        thanks for stopping by and don't worry, nobody will be blamed for his English. I'm no native speaker myself.
        If I understand correctly, you want to automate the job of caching cloth tags. By intuition I'd try that with a Python script.
        Unfortunately the SDK Support Team can't help with developing such scripts from scratch. But I'm quite sure, there's somebody in the community, who may want to try himself on this. Anybody?

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

          On 19/10/2014 at 11:42, xxxxxxxx wrote:

          Hi Suda,

          with Python you can do something like this:

            
          import c4d  
            
          def GetNextObject(op) :  
            
            if op==None:  
                return None  
              
            if op.GetDown() :  
                return op.GetDown()  
              
            while not op.GetNext() and op.GetUp() :  
                op = op.GetUp()  
              
            return op.GetNext()  
            
          def IterateHierarchy(op) :  
            ClothTagList=[]  
            if op is None:  
                return  
             
            count = 0  
              
            while op:  
                count += 1  
                if op.GetTag(100004020)!= None: #id for the cloth tag  
                    ClothTagList.append(op.GetTag(100004020))  
                  
                op = GetNextObject(op)  
                
                      
            return ClothTagList  
            
            
          def main() :  
              
            doc = c4d.documents.GetActiveDocument()  
            first = doc.GetFirstObject()   
            ClothTagList=IterateHierarchy(first)  
              
              
            for i in ClothTagList:  
                c4d.CallButton(i, c4d.CLOTH_DO_CALCULATE )  
              
              
          if __name__=='__main__':  
            main()  
          
          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            On 20/10/2014 at 00:00, xxxxxxxx wrote:

            Another idea would be to directly simulate the Cache button.
            You can use  c4d.CallButton(...) to do this. As parameters you'll need to pass the object and the button ID.
            Be aware: This call needs to be done from the main thread. For a normal Python script this is no problem, in a Python Plugin you might need to care.

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

              On 20/10/2014 at 00:25, xxxxxxxx wrote:

              Hi Andreas,

              I´ve already used the call button in the script.
              But thank you for the good hint to check the main thread inside a plugin.
              As I´m scripting the snippet yesterday between changing diapers and singing a lullaby.
              Here a more efficient script without a list and more error checking.

              @ Suda
              Hope this helps.

                
              import c4d  
              from c4d import gui  
                
              def GetNextObject(op) :  
                
                if op==None:  
                    return None  
                  
                if op.GetDown() :  
                    return op.GetDown()  
                  
                while not op.GetNext() and op.GetUp() :  
                    op = op.GetUp()  
                  
                return op.GetNext()  
                
              def IterateHierarchy(op) :  
                  
                  
                if op is None:  
                    return  
                 
                count = 0  
                  
                while op:  
                    count += 1  
                    if op.GetType!=c4d.Opolygon:  
                          
                        dialog=gui.MessageDialog("A Polygon object for caching is needed",c4d.GEMB_OK)  
                        if dialog== 1:  
                            return  
                    if op.GetTag(100004020)!= None:  
                        ClothTag = op.GetTag(100004020)  
                        c4d.CallButton(ClothTag, c4d.CLOTH_DO_CALCULATE )  
                          
                    op = GetNextObject(op)  
                    
                          
                return   
                
              def main() :  
                  
                doc = c4d.documents.GetActiveDocument()  
                 
                first = doc.GetFirstObject()   
                if first == None:return  
                IterateHierarchy(first)  
                  
                  
              if __name__=='__main__':  
                main()  
                
              

              Best wishes
              Martin

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

                On 20/10/2014 at 00:31, xxxxxxxx wrote:

                Sorry, monkeytack, I didn't look closely enough. I didn't want to derogate your effort or idea.
                Thanks for helping Suda out.
                Would you allow us to integrate your code into our Python SDK docs?

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

                  On 20/10/2014 at 02:36, xxxxxxxx wrote:

                  Hi Andreas,

                  no need to apologise, every thing is alright.
                  And Yes, feel free to integrate everything I´ve posted, if it fits and someone can take advantage of it.
                  It´s a pleasure.
                  Best wishes
                  Martin

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