1
$\begingroup$

I am trying to import materials from another blend file and assign the nth material to the active object. I have tried multiple solutions but I always hit errors.

Approach 1

Here the error is: "list indices must be integers or slices, not str" (in the approach shown below):

with bpy.data.libraries.load(path) as (data_from, data_to):

     data_to.materials = data_from.materials
     mat = data_to.materials
     cnt=0
     for m in data_to.materials:
        cnt=cnt+1
        if (cnt>1): 
         break  
        # Assign material
        obj=bpy.context.scene.objects.active
        material1 = data_to.materials[cnt]
        obj.active_material = data_to.materials[material1]

Approach 2

When I try to assign the material by using an index instead the error is: "bpy_struct: item.attr = val: Object.active_material expected a Material type, not str" (in the approach shown below): obj.active_material = data_to.materials[cnt]

I guess, I haven't fully understood what data_from/data_to objects are and how to use them. Can somebody help me here?

Thanks in advance,

Gemor

$\endgroup$
0
$\begingroup$

data_from are just string lists, in this case, the names of materials in the Blend file designated by the path. data_to is a string list of the names of the materials you want to be loaded. So, whatever names you put in data_to.materials will be loaded from the designated Blend file's material data block into the current material data block. After that, you access those materials in the material data block, i.e., bpy.data.materials. So, your code should read:

with bpy.data.libraries.load(path) as (data_from, data_to):

    data_to.materials = data_from.materials
    mat = data_to.materials
    cnt=0
    for m in data_to.materials:
        cnt=cnt+1
        if (cnt>1): 
            break  
        # Assign material
        obj=bpy.context.scene.objects.active
        material1 = bpy.data.materials[mat[cnt]]
        obj.active_material = material1

Note that this could give unexpected results if a material name already exists in the material data block.

| improve this answer | |
$\endgroup$
  • $\begingroup$ Thank you cmomoney, that clarifies it. Now I know what to do. $\endgroup$ – Gemor Oct 20 '17 at 10:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.