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
    • Register
    • Login

    Use a list or array for data?

    General Talk
    python
    2
    5
    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.
    • mrittmanM
      mrittman
      last edited by mrittman

      I've created a bunch of user data and want to insert it into several sound tracks. The issue is that it gets extremely tedious writing this. Is there a more efficient way to write all this using arrays or lists?

      I have attached an example oh how the user data looks within Cinema 4D.

          track = obj.GetCTracks()
      
          obj[c4d.ID_USERDATA,4] = track[0].GetName()
          track[0][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,6]
          track[0][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,7]
          track[0][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,14]
      
          obj[c4d.ID_USERDATA,10] = track[1].GetName()
          track[1][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,11]
          track[1][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,12]
          track[1][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,9]
      
          obj[c4d.ID_USERDATA,15] = track[2].GetName()
          track[2][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,16]
          track[2][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,17]
          track[2][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,18]
      
          obj[c4d.ID_USERDATA,3] = track[3].GetName()
          track[3][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,20]
          track[3][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,21]
          track[3][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,22]
      
          obj[c4d.ID_USERDATA,24] = track[4].GetName()
          track[4][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,25]
          track[4][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,26]
          track[4][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,27]
      
          obj[c4d.ID_USERDATA,29] = track[5].GetName()
          track[5][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,30]
          track[5][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,31]
          track[5][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,32]
      
          obj[c4d.ID_USERDATA,34] = track[6].GetName()
          track[6][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,35]
          track[6][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,36]
          track[6][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,37]
      
          obj[c4d.ID_USERDATA,39] = track[7].GetName()
          track[7][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,40]
          track[7][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,41]
          track[7][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,42]
      
          obj[c4d.ID_USERDATA,44] = track[8].GetName()
          track[8][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,45]
          track[8][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,46]
          track[8][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,47]
      
          obj[c4d.ID_USERDATA,49] = track[9].GetName()
          track[9][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,50]
          track[9][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,51]
          track[9][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,52]
      
          obj[c4d.ID_USERDATA,54] = track[10].GetName()
          track[10][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,55]
          track[10][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,56]
          track[10][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,57]
      

      tracks.png

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

        Hello,

        The first thing that come to mind is a for loop. But you need to get informations in userData that are stored in your obj in a chaotic way.

        What i suggest here, is to create those userdata in a more organized way (maybe with a script) so can easily create a loop in that case.

        in pseudo code it could be something like this at the end.

        tracks = obj.GetCTracks()
        
        for index, track in enumerate(tracks):
        	obj[c4d.ID_USERDATA, index * 4  + 0] = track.GetName()
        	track[c4d.CID_SOUND_ONOFF] = obj[index*4 + 1]
                track[c4d.CID_SOUND_START] = obj[index*4 + 2]
                track[c4d.CID_SOUND_NAME]  = obj[index*4 + 3]
        
        

        Let me know what do you think about it ?

        Cheers

        MAXON SDK Specialist

        MAXON Registered Developer

        mrittmanM 1 Reply Last reply Reply Quote 2
        • mrittmanM
          mrittman @Manuel
          last edited by

          @m_magalhaes Yeah since the ID’s of my userdata are all over the place, maybe I better just stick with writing them all out 😕

          I was trying to make it so it started with just one track, and have an add/remove button at the top that would create additional tracks. But this starts to get extremely confusing for me to wrap my head around, as I’m only just a beginner.

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

            hello,

            this topic is really related with this one So you have maybe now a better idea on how add or remove userdata.

            Because you changed your idea (by adding more tracks), the solution you came with is not good anymore. That's the perfect moment for stepping back. Think again about what you want to achieve and how you could do it. It's an iteration.

            It's not a problem to do that, it's even what you should do. You could be totally blocked in few days and your code will be a nightmare to manage.

            When you are managing data, you should think about array, dictionary and things like that or array of array.

            You could probably run through all your user data (as long as they are visually organised) and build an array.
            After that, you could just iterate thought that array.

            Don't be afraid to step back, think how you can organise your data. Most of the time your code will be shorter, easy to maintain, easy to update.

            Cheers
            Manuel

            MAXON SDK Specialist

            MAXON Registered Developer

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

              hello,

              if you don't have anything else to add, i'll mark this topic as "solved"

              Cheers
              Manuel

              MAXON SDK Specialist

              MAXON Registered Developer

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