Different materials to cube sides in Python

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.

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()
  

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.

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.

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()

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

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

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.