Page 2 of 2
Re: change material script
Posted: Fri Sep 15, 2017 2:54 pm
by seghier
it work like that
Code: Select allfrom pymaxwell import *
import os
def changeGrassMaterial(inPath,outPath,oldMat,newMat,new_Mat):
scene = Cmaxwell(mwcallback)
if not scene.readMXS(inPath):
print('Error reading '+inPath)
return 0
material1 = scene.getMaterial(oldMat)
if material1.isNull():
print('Error: material %s not exists' % oldMat)
return 0
material2 = scene.createMaterial(new_Mat,True);
if not material2.setReference(True,newMat):
print('Error importing MXM')
return 0
mgr = CextensionManager.instance()
mgr.loadAllExtensions()
oit = CmaxwellObjectIterator()
object = oit.first(scene)
while not object.isNull():
nModifiers,ok = object.getGeometryModifierExtensionsNumber()
for i in range(nModifiers):
modifierParams,ok = object.getGeometryModifierExtensionParamsAtIndex(i)
name,ok = modifierParams.getString('EXTENSION_NAME')
#print name
if name == 'MaxwellGrass':
for j in range(modifierParams.getNumItems()):
param = modifierParams.getByIndex(j)
#print('-------------------------')
#print param
if param[0] == 'Material':
modifierParams.setString('Material',new_Mat)
#print('New value:')
#print modifierParams.getByIndex(j)
object = oit.next()
if not scene.writeMXS(outPath):
print("Cannot write "+outPath)
return 0
print(outPath)
return 1
### MAIN ###
if __name__ == "__main__":
newMat = 'c:/input/leather.mxm'
oldMat = 'grass'
inPath = 'c:/input/t.mxs'
outPath = 'c:/intest/t_edit.mxs'
new_Mat = 'new_mat'
changeGrassMaterial(inPath,outPath,oldMat,newMat,new_Mat)
Re: change material script
Posted: Fri Sep 15, 2017 2:56 pm
by Brany
Code example to change the hair material:
Code: Select allfrom pymaxwell import *
import os
def changeGrassMaterial(inPath,outPath,newMaterialName):
scene = Cmaxwell(mwcallback)
if not scene.readMXS(inPath):
print('Error reading '+inPath)
return 0
material = scene.getMaterial(newMaterialName)
if material.isNull():
print('Error: material %s not exists' % newMaterialName)
return 0
oit = CmaxwellObjectIterator()
object = oit.first(scene)
while not object.isNull():
if object.isGeometryProcedural()[0]:
proceduralParams,ok = object.getGeometryProceduralExtensionParams()
name,ok = proceduralParams.getString('EXTENSION_NAME')
print name
if name == 'MaxwellHair':
print('%s: hair material updated' % object.getName()[0])
object.setMaterial(material)
object = oit.next()
if not scene.writeMXS(outPath):
print("Cannot write "+outPath)
return 0
print(outPath)
return 1
### MAIN ###
if __name__ == "__main__":
inPath = 'G:/scenes/4.1/hair.mxs'
outPath = 'G:/scenes/4.1/hair_edit.mxs'
changeGrassMaterial(inPath,outPath,'red')
Re: change material script
Posted: Fri Sep 15, 2017 3:00 pm
by seghier
thank you very much i will try that.
i find addMaterial ; can i add material and apply it to grass without use reference
Re: change material script
Posted: Fri Sep 15, 2017 3:11 pm
by Brany
seghier wrote: ↑Fri Sep 15, 2017 2:44 pm
the new material is reference and have the full name of the path
i rename it but how i can assign it to the grass ?
Code: Select allfrom pymaxwell import *
import os
def changeGrassMaterial(inPath,outPath,oldMat,newMat):
scene = Cmaxwell(mwcallback)
if not scene.readMXS(inPath):
print('Error reading '+inPath)
return 0
material1 = scene.getMaterial(oldMat)
if material1.isNull():
print('Error: material %s not exists' % oldMat)
return 0
material2 = scene.createMaterial(newMat,True);
if not material2.setReference(True,newMat):
print('Error importing MXM')
return 0
material3 = scene.getMaterial(newMat)
if material3.isNull():
print('Error: material %s not exists' % newMat)
return 0
mat_name = material3.getName()
print mat_name
if mat_name == newMat:
material3.setName('new_Mat')
mgr = CextensionManager.instance()
mgr.loadAllExtensions()
oit = CmaxwellObjectIterator()
object = oit.first(scene)
while not object.isNull():
nModifiers,ok = object.getGeometryModifierExtensionsNumber()
for i in range(nModifiers):
modifierParams,ok = object.getGeometryModifierExtensionParamsAtIndex(i)
name,ok = modifierParams.getString('EXTENSION_NAME')
#print name
if name == 'MaxwellGrass':
for j in range(modifierParams.getNumItems()):
param = modifierParams.getByIndex(j)
#print('-------------------------')
#print param
if param[0] == 'Material':
modifierParams.setString('Material',newMat)
#print('New value:')
#print modifierParams.getByIndex(j)
object = oit.next()
if not scene.writeMXS(outPath):
print("Cannot write "+outPath)
return 0
print(outPath)
return 1
### MAIN ###
if __name__ == "__main__":
newMat = 'c:/input/leather.mxm'
oldMat = 'grass'
inPath = 'c:/input/t.mxs'
outPath = 'c:/intest/t_edit.mxs'
changeGrassMaterial(inPath,outPath,oldMat,newMat)
You have to set the -name- of the material, the safest way to do that is asking the material itself's name:
Code: Select allmodifierParams.setString('Material',material2.getName()[0])
Re: change material script
Posted: Fri Sep 15, 2017 5:24 pm
by seghier
thanks you very much Brany ; work fine without the [0] ; this take the first letter
Code: Select allfrom pymaxwell import *
import os
def changeGrassMaterial(inPath,outPath,oldMat,newMat):
scene = Cmaxwell(mwcallback)
if not scene.readMXS(inPath):
print('Error reading '+inPath)
return 0
material1 = scene.getMaterial(oldMat)
if material1.isNull():
print('Error: material %s not exists' % oldMat)
return 0
material2 = scene.createMaterial(newMat,True);
if not material2.setReference(True,newMat):
print('Error importing MXM')
return 0
getMat = scene.getMaterial(newMat)
new_name = getMat.getName()
if new_name == newMat:
material2.setName('new_Mat')
mgr = CextensionManager.instance()
mgr.loadAllExtensions()
oit = CmaxwellObjectIterator()
object = oit.first(scene)
while not object.isNull():
nModifiers,ok = object.getGeometryModifierExtensionsNumber()
for i in range(nModifiers):
modifierParams,ok = object.getGeometryModifierExtensionParamsAtIndex(i)
name,ok = modifierParams.getString('EXTENSION_NAME')
#print name
if name == 'MaxwellGrass':
for j in range(modifierParams.getNumItems()):
param = modifierParams.getByIndex(j)
#print('-------------------------')
#print param
if param[0] == 'Material':
modifierParams.setString('Material',material2.getName())
#print('New value:')
#print modifierParams.getByIndex(j)
object = oit.next()
if not scene.writeMXS(outPath):
print("Cannot write "+outPath)
return 0
print(outPath)
return 1
### MAIN ###
if __name__ == "__main__":
newMat = 'c:/input/leather.mxm'
oldMat = 'grass'
inPath = 'c:/input/t.mxs'
outPath = 'c:/intest/t_edit.mxs'
changeGrassMaterial(inPath,outPath,oldMat,newMat)
Re: change material script
Posted: Fri Sep 15, 2017 6:01 pm
by seghier
Brany wrote: ↑Fri Sep 15, 2017 2:56 pm
Code example to change the hair material:
work fine
; thank you
Code: Select allfrom pymaxwell import *
import os
def changeGrassMaterial(inPath,outPath,oldMat,newMatPath):
scene = Cmaxwell(mwcallback)
if not scene.readMXS(inPath):
print('Error reading '+inPath)
return 0
material = scene.getMaterial(oldMat)
if material.isNull():
print('Error: material %s not exists' % oldMat)
return 0
newMatName, descr, im, ok = CmaxwellMaterial.getMxmInfo(newMatPath)
newMat = scene.createMaterial(newMatName)
newMat.read(newMatPath)
it = CmaxwellObjectIterator()
object = it.first(scene)
while not object.isNull():
if object.isGeometryProcedural()[0]:
proceduralParams,ok = object.getGeometryProceduralExtensionParams()
name,ok = proceduralParams.getString('EXTENSION_NAME')
print name
if name == 'MaxwellHair':
print('%s: hair material updated' % object.getName()[0])
object.setMaterial(newMat)
object = it.next()
if not scene.writeMXS(outPath):
print("Cannot write "+outPath)
return 0
print(outPath)
return 1
### MAIN ###
if __name__ == "__main__":
inPath = 'c:/input/hair.mxs'
outPath = 'c:/intest/t_edit.mxs'
oldMat = 'hair'
newMatPath = 'c:/input/leather.mxm'
#oldMat = 'grass'
#newMat = 'c:/input/leather.mxm'
changeGrassMaterial(inPath,outPath,oldMat,newMatPath)
Re: change material script
Posted: Fri Sep 15, 2017 6:07 pm
by seghier
and this for grass also work fine
Code: Select allfrom pymaxwell import *
import os
def changeGrassMaterial(inPath,outPath,oldMat,oldMatBf,backFace,newMatPath):
scene = Cmaxwell(mwcallback)
if not scene.readMXS(inPath):
print('Error reading '+inPath)
return 0
material = scene.getMaterial(oldMat)
if material.isNull():
print('Error: material %s not exists' % oldMat)
return 0
materialBf = scene.getMaterial(oldMat)
if material.isNull():
print('Error: material %s not exists' % oldMatBf)
return 0
newMatName, descr, im, ok = CmaxwellMaterial.getMxmInfo(newMatPath)
newMat = scene.createMaterial(newMatName)
newMat.read(newMatPath)
newMatBack, descr, im, ok = CmaxwellMaterial.getMxmInfo(backFace)
newMatBf = scene.createMaterial(newMatBack)
newMatBf.read(newMatPath)
mgr = CextensionManager.instance()
mgr.loadAllExtensions()
oit = CmaxwellObjectIterator()
object = oit.first(scene)
while not object.isNull():
nModifiers,ok = object.getGeometryModifierExtensionsNumber()
for i in range(nModifiers):
modifierParams,ok = object.getGeometryModifierExtensionParamsAtIndex(i)
name,ok = modifierParams.getString('EXTENSION_NAME')
if name == 'MaxwellGrass':
for j in range(modifierParams.getNumItems()):
param = modifierParams.getByIndex(j)
#print('-------------------------')
#print param
if param[0] == 'Material':
modifierParams.setString('Material',newMat.getName())
elif param[0] == 'Double Sided Material':
modifierParams.setString('Double Sided Material',newMatBf.getName())
#print('New value:')
#print modifierParams.getByIndex(j)
object = oit.next()
if not scene.writeMXS(outPath):
print("Cannot write "+outPath)
return 0
print(outPath)
return 1
if __name__ == "__main__":
newMatPath = 'c:/input/carpaint_black.mxm'
backFace = 'c:/input/leather.mxm'
oldMat = 'grass'
oldMatBf = 'scatter'
inPath = 'c:/input/t.mxs'
outPath = 'c:/intest/t_edit.mxs'
changeGrassMaterial(inPath,outPath,oldMat,oldMatBf,backFace,newMatPath)
Re: change material script
Posted: Sun Sep 17, 2017 2:13 am
by seghier
Hi Brany
for hair : if obj.isGeometryProcedural()[0]:
what about grass ? i tried with obj.isGeometryModifier but it is not available in pymaxwell
i tried also with isInstance but didn't work
Re: change material script
Posted: Tue Sep 19, 2017 5:21 pm
by Brany
That's was you first question of the thread, and this was my answed
Code: Select allfrom pymaxwell import *
import os
def changeGrassMaterial(inPath,outPath,newMaterialName):
scene = Cmaxwell(mwcallback)
if not scene.readMXS(inPath):
print('Error reading '+inPath)
return 0
material = scene.getMaterial(newMaterialName)
if material.isNull():
print('Error: material %s not exists' % newMaterialName)
return 0
mgr = CextensionManager.instance()
mgr.loadAllExtensions()
oit = CmaxwellObjectIterator()
object = oit.first(scene)
while not object.isNull():
nModifiers,ok = object.getGeometryModifierExtensionsNumber()
for i in range(nModifiers):
modifierParams,ok = object.getGeometryModifierExtensionParamsAtIndex(i)
name,ok = modifierParams.getString('EXTENSION_NAME')
print name
if name == 'MaxwellGrass':
for j in range(modifierParams.getNumItems()):
param = modifierParams.getByIndex(j)
print('-------------------------')
print param
if param[0] == 'Material':
modifierParams.setString('Material',newMaterialName)
print('New value:')
print modifierParams.getByIndex(j)
object = oit.next()
if not scene.writeMXS(outPath):
print("Cannot write "+outPath)
return 0
print(outPath)
return 1
### MAIN ###
if __name__ == "__main__":
inPath = 'G:/scenes/4.1/grass.mxs'
outPath = 'G:/scenes/4.1/grass_edit.mxs'
changeGrassMaterial(inPath,outPath,'green')
Re: change material script
Posted: Wed Sep 20, 2017 5:21 pm
by seghier
Thanks Brany
, yes i forgot
And i fixed that , pymaxwell really a great tool