Python replace Textures Help / advice
-
On 06/06/2013 at 03:15, xxxxxxxx wrote:
Ola,
i'm facing a challenge and crunching trough it. im a python starter but i like it.
What im trying to do is to replace all the textures paths in my scene (Materials setup : color channel -> multishader with 10 videoclips in it) in all Materials in the scenefile.
Here is the catch.
im replacing the low mp4 with an image sequence with it respectful folder. the thing that changes is basepath\imageseq_name\imageseq_name_00000.jpg where for every file there is another name (namex_00000.jpg in folder namex) which replaces basepath\allstuf\namex.mp4Hope you understand what im trying to achieve.
For now i managed to do all the above except getin trough to multishader to replace the respective paths, otherwise im creating all new materials for every mp4 which gets replaced in multishader (located in color chan).Here is my working script, please do not bithc me out im still learnin and its very fun, hope i can manage to do some more complex things in the future.
---------------------import c4d
from c4d import gui, bitmaps, documents, storage
import os
from os.path import basename, splitext
import reprint "------------ Starting"
#c4d.StopAllThreads()def main() :
myMaterials = doc.GetAllTextures()
myTexture = c4d.BITMAPSHADER_FILENAME
fileExtensionWrong = ".mp4"
fileExtension = "_00000.jpg"
path1 = r'E:\global new\assests frames' #set ur paths
path2 = r'E:\global new\assets' #set ur paths
# insert the path to the directory of interest
newPath = path1 + fileExtension
#print newPath
#print myTexture#print(myMaterials)
for (i,item) in myMaterials:
print "old item: "+item
newitem=item.replace ( '.mp4' , '_00000.jpg' )
newitem2=newitem.replace ( path2,'')
#newitem3=newitem.replace ( '.mp4','' )
newName=newitem2.replace ("\",'')
folderName=newName.replace('_00000.jpg','')
print "New name is: " + newName
print "------------------"
#print newitem2
print "--- replacing ---"
newTexturePath = path1 + '\' + folderName + '\' + newName
print "New texture path is: " + newTexturePath
myTexture = newTexturePath
print "code start"
# Setup and add
fps=30
#minFrame=0
#maxFrame=650
doc.SetFps(fps)
#doc.SetMinTime(c4d.BaseTime(minFrame,fps))
#doc.SetMaxTime(c4d.BaseTime(maxFrame,fps))
#doc.SetTime(c4d.BaseTime(maxFrame,fps))
# Materials:[c4d.BITMAPSHADER_TIMING_TO]
#if not mat: return True
oldTime=c4d.BITMAPSHADER_TIMING_TO
print oldTime
newTime= (oldTime - 1)
mat = c4d.BaseMaterial(c4d.Mmaterial)
shader = c4d.BaseShader(c4d.Xbitmap)
shader[c4d.BITMAPSHADER_FILENAME] = newTexturePath
shader[c4d.BITMAPSHADER_TIMING_TO]= newTime
mat[c4d.MATERIAL_COLOR_SHADER] = shader
print newTime
mat.InsertShader(shader)
print "check"
print shader
print mat
mat.Message(c4d.MSG_UPDATE)
mat.Update
c4d.EventAdd()
doc.InsertMaterial(mat)
#return (mat, shader)# print path
#dirLister=os.listdir(path)
#for fname in dirLister:
# print fname
# print myMaterials
#print myTexture# update the Cinema 4D UI
#c4d.EventAdd()# tell that the processing was finished
print " ------------ Finished processing.-----------------"
# gui.MessageDialog("Finished processing.")if __name__=='__main__':
main()
print "------------ Done."Thanks for any help!
Des