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

    Different materials to cube sides in Python

    Scheduled Pinned Locked Moved PYTHON Development
    7 Posts 0 Posters 867 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 07/05/2017 at 03:38, xxxxxxxx wrote:

      Hi!

      I have some cubes (created with a Python script) and I would like to set 6 different colors to all of the sides of them.

      I know how to do this manually, but I have plenty of cubes (some thousands) so i'd like to automate the process: create the cube -> make it editable -> select the poligion on the side -> apply texture -> repeat this with all the sides.

      I absolutely don't have any ideas how this can be done in Python, any help would be greatly appreciated.

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

        On 10/05/2017 at 10:49, xxxxxxxx wrote:

        Hope it's make sense for you

        import c4d
        import random
          
        #create a selection for each polygon
        def create_poly_selection(obj) :
            poly_count = obj.GetPolygonCount()
            tags = list()
            for i in xrange(poly_count) :
                #create the tag and name it by poly_id
                tag = c4d.SelectionTag(c4d.Tpolygonselection)
                tag.SetName(str(i))
                
                #add tag to the scene
                doc.AddUndo(c4d.UNDOTYPE_NEW, tag)
                obj.InsertTag(tag)
                tags.append(tag)
                
            return tags
          
        #assign 1 poly_id
        def assign_selection(obj, tags_list) :
            poly_count = obj.GetPolygonCount()
            if len(tags_list) != poly_count:
                return False
            
            for i, tag in enumerate(tags_list) :
                bs = tag.GetBaseSelect()
                bs.Select(i)
                
            return True
            
        #create materials for a given obj
        def create_materials(number=6) :
            mats = list()
            for i in xrange(number) :
                mat = c4d.BaseMaterial(c4d.Mmaterial)
                mat.SetName(str(i))
                #assign random color
                mat[c4d.MATERIAL_COLOR_COLOR] = c4d.Vector(random.random(), random.random(), random.random())
                doc.AddUndo(c4d.UNDOTYPE_NEW, mat)
                doc.InsertMaterial(mat)
                mats.append(mat)
            
            return mats
            
        #create texture tag where selection tag and material name are identical
        def create_texture_tag(obj, tags) :
            for tag in tags:
                name = tag.GetName()
                mat = doc.SearchMaterial(name)
                if not mat:
                    continue
                
                texture_tag = c4d.BaseTag(c4d.Ttexture)
                texture_tag.SetName(name)
                texture_tag[c4d.TEXTURETAG_MATERIAL] = mat
                texture_tag[c4d.TEXTURETAG_RESTRICTION] = tag.GetName()
                texture_tag[c4d.TEXTURETAG_PROJECTION] = c4d.TEXTURETAG_PROJECTION_UVW
                doc.AddUndo(c4d.UNDOTYPE_NEW, texture_tag)
                obj.InsertTag(texture_tag)
          
        def main() :
            if not isinstance(op, c4d.PolygonObject) :
                return
            
            doc.StartUndo()
            
            #create 6 random materials
            create_materials()
            
            #create and assign selection tag
            tags = create_poly_selection(op)
            if not assign_selection(op, tags) :
                return
            
            #create texture tag into the obj
            create_texture_tag(op, tags)
            
            doc.EndUndo()
            c4d.EventAdd()
          
        if __name__=='__main__':
            main()
          
        
        
        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          On 15/05/2017 at 05:44, xxxxxxxx wrote:

          Hi Gergely,

          welcome to the Plugin Café forums 🙂

          I think, gr4ph0s answer more or less solves most of your questions, with maybe just creation of cubes and make editable not answered, yet. For the "make editable" part I suggest to take a look at SendModelingCommand() in conjunction with MCOMMAND_MAKEEDITABLE.

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

            On 23/06/2017 at 15:09, xxxxxxxx wrote:

            I'm trying to do a similar thing but create a selection tag based on a manual selection but am stumped on how to assign the selection to the tag.

            selection = op.GetPolygonS()
            primaryTag = op.MakeTag(c4d.Tpolygonselection)
            primaryTag.SetName("primary")
            ?????

            I feel like there should be a command to add my selection to the tag but after two hours I'm still stumped.  Any help is appreciated.

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

              On 26/06/2017 at 07:43, xxxxxxxx wrote:

              Found my missing command.  Posting here in case anybody else has to go digging for this.

              import c4d
              from c4d import gui
              #Welcome to the world of Python
                
              primaryTag = op.MakeTag(c4d.Tpolygonselection) # adds a selection tag to your selected object
              primaryTag_bs = primaryTag.GetBaseSelect() # get the selection container from the tag so it can be accessed.
              op.GetPolygonS().CopyTo(primaryTag_bs) # copy your live polygon selection to the selection container
              primaryTag.SetName("primary") # give your new selection tag a name
              c4d.EventAdd()
              
              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                On 26/06/2017 at 07:45, xxxxxxxx wrote:

                Glad you found a solution yourself, I was just about to post a similar answer.

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

                  On 26/06/2017 at 07:51, xxxxxxxx wrote:

                  It's confusing at times because "Set" is used in so many places that "Copy" never enters my mind.  Finally found an old thread that had my missing line and then it all made sense.  Tough search as I kept looking for things with "Set".

                  thanks for looking at it.

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