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.