# 脚本测试于maya2023
# 脚本名字:division_terrain_change_material__country_or_region.py(复制粘贴里面的文字到maya脚本编辑器,python类型的标签栏里面)
# 因为总是会不断发现bug,所以脚本发布到这里,以便修改更新,你需要自己把代码复制粘贴到maya中运行
import copy
import re
import maya.cmds as cmds
def list_all_geometry(): # 会把曲线也计算在内了
geometry = cmds.ls(geometry=True)
# curve也是geometry?
geometry_transform_list = cmds.listRelatives(geometry, p=True, path=True)
# cmds.select(geometry_transforms_list, r=True)
return geometry_transform_list
def get_geometry_list(reg):
# return list(filter(lambda v: re.search("__scenic__type_and_icon_control_circle$", v), list_all_geometry()))
return list(filter(lambda v: re.search(reg, v), list_all_geometry()))
def get_division_area_list():
# return get_geometry_list("_\d{6}$")
# return get_geometry_list("__division$")
return list(set(get_geometry_list("__division$") + get_geometry_list("__divisionFBXASC046")))
def get_scenic_area_list():
return get_geometry_list("__scenic$")
def get_goverment_area_list():
return get_geometry_list("__gover.?ment$")
def get_goverment__map_icon_list():
return get_geometry_list("__gover.?ment__map_icon$")
def get_goverment__type_3d_place_name_list():
return get_geometry_list("__gover.?ment__type_3d_place_name$")
def get_scenic__map_icon_list():
return get_geometry_list("__scenic__map_icon$")
def get_scenic__type_3d_place_name_list():
return get_geometry_list("__scenic__type_3d_place_name$")
def division_terrain_change_material_assign_mat(material_type, is_use_ramp=True):
# # blender-osm所存在的profile
# roads_dic = {'paths_bridleway': 2.0, 'paths_cycleway': 2.2, 'paths_footway': 2.0, 'paths_steps': 1.6, 'railways': 6.0, 'roads_motorway': 10.0, 'roads_other': 7.0,
# 'roads_pedestrian': 7.0, 'roads_primary': 9.0, 'roads_residential': 7.0, 'roads_secondary': 8.0, 'roads_service': 4.0, 'roads_tertiary': 7.0,
# 'roads_track': 3.0, 'roads_trunk': 9.0, 'roads_unclassified': 7.0}
# water_dic = {'waterways_canal': 10,
# 'waterways_drain': 3,
# 'waterways_river': 10,
# 'waterways_stream': 2, }
#
# osm_profile_width_dic = copy.deepcopy(roads_dic)
# osm_profile_width_dic.update(water_dic)
#
# roads_type_list = list(roads_dic.keys())
# water_type_list = list(water_dic.keys())
cmds.select(get_goverment__map_icon_list() + get_goverment__type_3d_place_name_list())
if cmds.ls(sl=1):
cmds.hyperShade(assign='gover*ment_type_3d_mat_{}_template_SG'.format(material_type)) # goverment_type_3d_mat_arnold_template或者goverment_type_3d_mat_arnold_template_SG都可以
cmds.select(get_scenic__map_icon_list() + get_scenic__type_3d_place_name_list())
if cmds.ls(sl=1):
cmds.hyperShade(assign='scenic_type_3d_mat_{}_template_SG'.format(material_type))
cmds.select("geodetic_ground_plane") # 就已经选择了 选择集 里的面了
if cmds.ls(sl=1):
cmds.hyperShade(assign='geodetic_ground_plane_mat_{}_template_SG'.format(material_type))
cmds.select("*division_name_typeMesh1") # 就已经选择了 选择集 里的面了
if cmds.ls(sl=1):
cmds.hyperShade(assign='division_name_mat_{}_template_SG'.format(material_type))
cmds.select(cmds.ls("*__dem__gdem_v3_30m_ground_plane") + cmds.ls("*__dem__gdem_v3_30m"))
if cmds.ls(sl=1):
cmds.hyperShade(assign='dem_displacement_mat_{}_template_SG'.format(material_type))
cmds.select("dem_displacement_middle_stretch_face_set") # 就已经选择了 选择集 里的面了
if cmds.ls(sl=1):
cmds.hyperShade(assign='dem_displacement_middle_stretch_face_mat_{}_template_SG'.format(material_type))
if is_country_or_region:
cmds.select("*division_name_typeMesh2") # 就已经选择了 选择集 里的面了
if cmds.ls(sl=1):
cmds.hyperShade(assign='division_name2_mat_{}_template_SG'.format(material_type))
cmds.select("*national_flag_pattern") # 就已经选择了 选择集 里的面了
if cmds.ls(sl=1):
cmds.hyperShade(assign='national_flag_pattern_mat_{}_template_SG'.format(material_type))
cmds.select("*national_flag_mast") # 就已经选择了 选择集 里的面了
if cmds.ls(sl=1):
cmds.hyperShade(assign='national_flag_mast_mat_{}_template_SG'.format(material_type))
# 道路
# roads_sweep_list=cmds.ls("*__osm__roads_*__sweep")
cmds.select(cmds.ls("*__osm__roads_*__sweep"))
if cmds.ls(sl=1):
cmds.hyperShade(assign='roads_mat_{}_template_SG'.format(material_type))
cmds.select(cmds.ls("*__osm__waterways_*__sweep"))
if cmds.ls(sl=1):
cmds.hyperShade(assign='water_mat_{}_template_SG'.format(material_type))
if is_use_ramp:
division_terrain_change_material_assign_mat_ramp(material_type)
def division_terrain_change_material_assign_mat_ramp(material_type):
if material_type == "blinn" and cmds.checkBox("is_ramp_blinn", q=1, value=1):
division_terrain_change_material_assign_middle_stretch_face_mat(material_type)
if material_type == "arnold" and cmds.checkBox("is_ramp_arnold", q=1, value=1):
division_terrain_change_material_assign_middle_stretch_face_mat(material_type)
def division_terrain_change_material_assign_middle_stretch_face_mat(material_type):
print("material_type", material_type)
cmds.select(cmds.ls("*__dem__gdem_v3_30m"))
cmds.hyperShade(assign='elevation_mat_{}_template_SG'.format(material_type))
cmds.select("dem_displacement_middle_stretch_face_set") # 就已经选择了 选择集 里的面了
cmds.hyperShade(assign='dem_displacement_middle_stretch_face_mat_{}_template_SG'.format(material_type))
# cmds.sets(edit=True, forceElement="dem_displacement_middle_stretch_face_mat_arnold_template_SG")
def division_terrain_change_material_assign_mat_part_setting(part_type):
print("part_type", part_type)
if part_type == "2dmap":
cmds.setAttr("dem_displacement_texture_template.exposure", -0.900)
cmds.setAttr("aiPhysicalSky1.groundAlbedo", 255 / 255, 255 / 255, 255 / 255)
if part_type == "sat_or_ramp":
cmds.setAttr("dem_displacement_texture_template.exposure", 0.300)
cmds.setAttr("aiPhysicalSky1.groundAlbedo", 26 / 255, 26 / 255, 26 / 255)
def division_terrain_change_material_ui():
if (cmds.window('division_terrain_change_material', q=True, ex=True)):
cmds.deleteUI('division_terrain_change_material')
if (cmds.windowPref('division_terrain_change_material', q=1, ex=1)):
cmds.windowPref('division_terrain_change_material', r=1)
cmds.window('division_terrain_change_material', mb=True)
cmds.columnLayout("division_terrain_change_material_columnLayout", w=405, adj=False, cal=u'center', cw=200, rs=5)
# cmds.rowLayout("division_terrain_change_material_columnLayout_blinn_rowLayout", p="division_terrain_change_material_columnLayout", nc=2)
# cmds.button(label="赋予所有模型为blinn材质球", annotation=u"赋予所有模型为blinn材质球,blinn材质球可以导出到其它软件", width=200, command="division_terrain_change_material_assign_mat('blinn')")
# cmds.button(label="赋予所有模型为arnold材质球",
# annotation=u"赋予所有模型为arnold材质球,可以用maya直接渲染,用arnold渲染器的渲染静帧效果好,但渲染比较慢;如果你要渲染动画,可以自己制作redshift材质球后使用redshift渲染",
# width=200, command="division_terrain_change_material_assign_mat('arnold')")
#
# cmds.rowLayout("division_terrain_change_material_columnLayout_arnold_rowLayout", p="division_terrain_change_material_columnLayout", nc=2)
# cmds.button(label="赋予地形模型为渐变色的blinn材质球",
# annotation=u"注意,使用之后模型可能会变成绿色,只是显示bug,渲染不会出现问题,保存打开之后会是正确的。赋予地形模型为blinn材质球,blinn材质球可以导出到其它软件",
# width=200, command="division_terrain_change_material_assign_middle_stretch_face_mat('blinn')")
# cmds.button(label="赋予地形模型为渐变色的arnold材质球",
# annotation=u"注意,使用之后模型可能会变成绿色,只是显示bug,渲染不会出现问题,保存打开之后会是正确的。赋予地形模型为渐变色的arnold材质球,可以用maya直接渲染,用arnold渲染器的渲染静帧效果好,但渲染比较慢;如果你要渲染动画,可以自己制作redshift材质球后使用redshift渲染",
# width=200, command="division_terrain_change_material_assign_middle_stretch_face_mat('arnold')")
cmds.rowLayout("division_terrain_change_material_columnLayout_blinn_rowLayout", p="division_terrain_change_material_columnLayout", nc=2)
cmds.button(label="赋予所有模型为blinn材质球", annotation=u"赋予所有模型为blinn材质球,blinn材质球可以导出到其它软件", width=200, command="division_terrain_change_material_assign_mat('blinn')")
cmds.checkBox("is_ramp_blinn", label="赋予地形模型为渐变色的blinn材质球",
annotation=u"注意,使用之后模型可能会变成绿色,只是显示bug,渲染不会出现问题,保存打开之后会是正确的。赋予地形模型为blinn材质球,blinn材质球可以导出到其它软件",
width=200, v=0)
cmds.rowLayout("division_terrain_change_material_columnLayout_arnold_rowLayout", p="division_terrain_change_material_columnLayout", nc=2)
cmds.button(label="赋予所有模型为arnold材质球",
annotation=u"赋予所有模型为arnold材质球,可以用maya直接渲染,用arnold渲染器的渲染静帧效果好,但渲染比较慢;如果你要渲染动画,可以自己制作redshift材质球后使用redshift渲染",
width=200, command="division_terrain_change_material_assign_mat('arnold')")
cmds.checkBox("is_ramp_arnold", label="赋予地形模型为渐变色的arnold材质球",
annotation=u"注意,使用之后模型可能会变成绿色,只是显示bug,渲染不会出现问题,保存打开之后会是正确的。赋予地形模型为渐变色的arnold材质球,可以用maya直接渲染,用arnold渲染器的渲染静帧效果好,但渲染比较慢;如果你要渲染动画,可以自己制作redshift材质球后使用redshift渲染",
width=200, v=0)
cmds.rowLayout("division_terrain_change_material_columnLayout_sat_and_2dmap_rowLayout", p="division_terrain_change_material_columnLayout", nc=2)
cmds.button(label="设置为2d地图的参数",
annotation=u"如果你要渲染二维地图,请先手动替换为二维地图的贴图,然后记得点击此按钮设置对应的参数",
width=200, command="division_terrain_change_material_assign_mat_part_setting('2dmap')")
cmds.button(label="设置为卫星地图或者渐变地图的参数",
annotation=u"如果你要渲染卫星地图或者渐变地图,并且你之前又点击过左侧的按钮,请记得点击此按钮恢复设置对应的参数",
width=200, command="division_terrain_change_material_assign_mat_part_setting('sat_or_ramp')")
cmds.showWindow('division_terrain_change_material')
is_country_or_region = True
if __name__ == '__main__':
division_terrain_change_material_ui()