2
$\begingroup$

I'm using the Blender to make all my works university (architecture), but in my job the people use Sketchup for modeling and V-Ray for rendering. I want use Blender, cause liked more then others, the problem is that to rendering with Cycles, I have to need import the Skp file, change all materials (or set), create lamps etc... How to make a Python script that replace the materials by one list in all objects on the scene?

For example:

  • Cube.001 have the material "OldMaterial.01" in one face, and "OldMaterial.02" in others.

  • Cube.002 have the material "OldMaterial.02" in one face, and "OldMaterial.03" in others.

And we have the list:

  • For "OldMaterial.01", replace to "NewMaterial.01"
  • For "OldMaterial.02", replace to "NewMaterial.02"
  • For "OldMaterial.03", replace to "NewMaterial.03"

And the script replace all materials for the match in the list.

That will be increase so much the workflow Sketchup - Blender!

Thanks for now!

$\endgroup$

1 Answer 1

2
$\begingroup$

Every object has a list of materials it uses in it's material_slots property, this is shown in the material properties, each slot contains the material used. By looping through this list you can change the material assigned to each slot.

I would setup a dictionary of old-to-new names to use for the conversion process.

import bpy

matnames = {
    'OldMaterial.01': 'NewMaterial.01',
    'OldMaterial.02': 'NewMaterial.02',
    'OldMaterial.03': 'NewMaterial.03',
    'OldMaterial.04': 'NewMaterial.04',
    'OldMaterial.05': 'NewMaterial.05',
    'OldMaterial.06': 'NewMaterial.06',
}

for obj in bpy.data.objects:
    for slot in obj.material_slots:
        slot.material = bpy.data.materials[matnames[slot.material.name]]
$\endgroup$
4
  • $\begingroup$ Nice! I'm new Python's user, and don't know programing :( But I trying to learn :D Thanks for all. But i have so many questions more hahahahhaa I try run this script that u posted, but don't worked :/ In the line "matnames = { .....}" u are creanting a dictionary, right? $\endgroup$ Sep 16, 2017 at 16:01
  • 1
    $\begingroup$ A good start would be spending an hour or two doing a getting started tutorial like the official python tutorial. Yes matnames is a dictionary, it uses the name of the old mat as the key to retrieve the name of the new mat. Everything between {} is the contents of the dictionary, adjust the old name and new name on each line to match what you have. $\endgroup$
    – sambler
    Sep 17, 2017 at 4:00
  • $\begingroup$ @sambler Great answer! This was very helpful to me, as I had spent several hours struggling to write something similar. One thing I noticed and want to modify, is that while an object with materials (for example) R,G,B will get replaced with R_new, G_new, B_new... if an object has R,G_new, B, then material "B" won't get replaced because "G_new" isn't a match (it's only looking for R,G,B and stops at a non-match). Can you please teach how to skip over non-matches? $\endgroup$
    – Mentalist
    Oct 23, 2020 at 4:12
  • $\begingroup$ @Mentalist My first suggestion is to start with a full list, even if the replacement is the same as the original, go into blenders python console and type bpy.data.materials.keys() to get a complete list of material names. The other option, is after the second for add if slot.material.name in matname.keys(): to only do the last command if a substitute exists. You could also put the last statement into a try block to catch errors and keep going, you only need pass in the except section. $\endgroup$
    – sambler
    Oct 23, 2020 at 9:43

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.