附录maya脚本(我自己写的网站里我卖的模型的配套的脚本):division_terrain_change_material.py

原创 教程/经验 版权:禁止匿名转载;禁止商业使用。

43 0 0 2023-09-19 19:01:08 举报

BEJ48

全部省 全部市

# 脚本测试于maya2023(我自己写的网站里我卖的模型的配套的脚本)
# 脚本测试于maya2023
# 脚本名字:division_terrain_change_material.py(复制粘贴里面的文字到maya脚本编辑器,python类型的标签栏里面)
# 因为总是会不断发现bug,所以脚本发布到这里,以便修改更新,你需要自己把代码复制粘贴到maya中运行

import re

import maya.cmds as cmds
import maya.mel as mel


class cgdt_utils():

    @staticmethod
    def get_tranform_of_shape(obj):
        return cmds.listRelatives(obj, c=True, shapes=True)[0]

    @staticmethod
    def is_transform(obj):
        return cmds.nodeType(obj) == "transform"

    @staticmethod
    def is_tranform_mesh(obj):
        return cgdt_utils.is_transform(obj) and cmds.nodeType(cgdt_utils.get_tranform_of_shape(obj)) == "mesh"
        #  曲线也有shape # 曲线的shape类型是 Result: 'nurbsCurve'

    @staticmethod
    def must_has_at_least_a_geo():
        sel_list = cmds.ls(sl=True)
        if len(sel_list) < 1:
            # raise ValueError, "至少选择一个模型"
            cmds.error("至少选择一个模型")
        for obj in cmds.ls(sl=1):
            # if cmds.nodeType(obj) != "transform" or (cmds.ls(cmds.listRelatives(obj, c=True, shapes=True),mesh=True)):
            if not cgdt_utils.is_tranform_mesh(obj):
                cmds.error("只能选择多边形物体")
        return sel_list

    @staticmethod
    def get_geometry_transform_position(geometry_transform):  # 获取世界位置坐标
        return cmds.xform(geometry_transform, q=1, ws=1, rp=1)  # [48.99882022502574, 0.0, -209.37388236481516]

    @staticmethod
    def get_position(geometry_transform):  # 获取世界位置坐标
        return cgdt_utils.get_geometry_transform_position(geometry_transform)

    @staticmethod
    def get_group_children(group_name):
        # return cmds.listRelatives("osm_clipped__roads_motorway__sweep_group", p=True)
        # return cmds.listRelatives(group_name, p=True) # Result: ['zhong_shan_feng_jing_ming_sh__B00190CS6P__osm_sweep_group']
        return cmds.listRelatives(group_name, c=True)  # Result: ['sweep1']


def list_all_geometry():  # 会把曲线也计算在内了
    geometry = cmds.ls(geometry=True)
    geometry_transform_list = cmds.listRelatives(geometry, p=True, path=True)  # 没有找到,就没有返回值
    # cmds.select(geometry_transforms_list, r=True)
    return geometry_transform_list if geometry_transform_list else []


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("__goverment$")


def get_goverment__map_icon_list():
    return get_geometry_list("__goverment__map_icon$")


def get_goverment__type_3d_place_name_list():
    return get_geometry_list("__goverment__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=False, is_set_middle_stretch_face=True, is_2dmap=False, is_division_same_mat=True):
    '''
    is_division_same_mat=False多级行政区才用(省市部分)
    '''
    # 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='goverment_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(cmds.ls("geodetic_ground_plane"))
    if cmds.ls(sl=1):
        cmds.hyperShade(assign='geodetic_ground_plane_mat_{}_template_SG'.format(material_type))

    cmds.select(cmds.ls("*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):
        if is_2dmap:
            cmds.hyperShade(assign='dem_displacement_2dmap_mat_{}_template_SG'.format(material_type))
            division_terrain_change_material_assign_mat_part_setting('2dmap')
        else:
            cmds.hyperShade(assign='dem_displacement_mat_{}_template_SG'.format(material_type))
            division_terrain_change_material_assign_mat_part_setting('sat_or_ramp')

    cmds.select(cmds.ls("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_division_same_mat or (not is_city_or_province_or_building):
    if not is_city_or_province_or_building:
        cmds.select(cmds.ls("*__division"))
        if cmds.ls(sl=1):
            # pm.sets('division_mat_{}_template_SG'.format(material_type), e=1, forceElement=1)
            cmds.hyperShade(assign='division_mat_{}_template_SG'.format(material_type))

    if is_country_or_region:
        if cmds.ls("*division_name_typeMesh2"):
            cmds.select("*division_name_typeMesh2")
            cmds.hyperShade(assign='division_name2_mat_{}_template_SG'.format(material_type))

        if cmds.ls("*national_flag_pattern"):
            cmds.select("*national_flag_pattern")
            cmds.hyperShade(assign='national_flag_pattern_mat_{}_template_SG'.format(material_type))

        if cmds.ls("*national_flag_mast"):
            cmds.select("*national_flag_mast")
            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_group*"))  # 如果选择空数组,会清空选择 # *在最前面可以代表不匹配字符
    cmds.select(cmds.ls("*osm_clipped__roads_*__sweep_group*"), add=True)
    if cmds.ls(sl=1):
        cmds.hyperShade(assign='roads_mat_{}_template_SG'.format(material_type))

    # 水系
    cmds.select(cmds.ls("*osm__waterways_*__sweep_group*"))
    cmds.select(cmds.ls("*osm_clipped__waterways_*__sweep_group*"), add=True)
    if cmds.ls(sl=1):
        cmds.hyperShade(assign='water_mat_{}_template_SG'.format(material_type))

    # 铁路
    cmds.select(cmds.ls("*osm__railways_*__sweep_group*"))
    cmds.select(cmds.ls("*osm_clipped__railways_*__sweep_group*"), add=True)
    if cmds.ls(sl=1):
        cmds.hyperShade(assign='railways_mat_{}_template_SG'.format(material_type))

    # polygon
    cmds.select(cmds.ls("*__bd_building_group"))
    cmds.select(cmds.ls("*__osm_polygon_group"), add=True)
    if cmds.ls(sl=1):
        # cmds.hyperShade(assign='geodetic_ground_plane_mat_{}_template_SG'.format(material_type))
        cmds.hyperShade(assign='white_mat_{}_template_SG'.format(material_type))

    # 水域
    cmds.select(cmds.ls("*osm__water_a_*"))
    cmds.select(cmds.ls("*osm_clipped__water_a_*"), add=True)
    if cmds.ls(sl=1):
        cmds.hyperShade(assign='water_mat_{}_template_SG'.format(material_type))

    # division_all_area_mat_blinn_template 是不用赋予材质的,只能用户自己手动赋予材质

    if is_use_ramp:
        # # division_terrain_change_material_assign_mat_ramp(material_type,is_set_middle_stretch_face)
        # # cmds.setAttr("dis_file_template.colorSpace", "ACEScg", type="string")  # 已经在模板中从sRGB设置为了ACEScg
        # if material_type == "blinn":
        #     division_terrain_change_material_assign_middle_stretch_face_mat(material_type,is_set_middle_stretch_face)
        # # if material_type == "arnold" and cmds.checkBox("is_ramp_arnold", q=1, value=1):
        # if material_type == "arnold":
        #     division_terrain_change_material_assign_middle_stretch_face_mat(material_type,is_set_middle_stretch_face)
        cmds.setAttr("dis_file_template.colorSpace", "ACEScg", type="string")  # 已经在模板中从sRGB设置为了ACEScg
        division_terrain_change_material_assign_middle_stretch_face_mat(material_type, is_set_middle_stretch_face)


# 没用到
def division_terrain_change_material_assign_mat_ramp(material_type, is_set_middle_stretch_face):
    if not is_set_middle_stretch_face:
        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, is_set_middle_stretch_face)
        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, is_set_middle_stretch_face)
    else:
        if material_type == "blinn" and True:
            division_terrain_change_material_assign_middle_stretch_face_mat(material_type, is_set_middle_stretch_face)
        # if material_type == "arnold" and cmds.checkBox("is_ramp_arnold", q=1, value=1):
        if material_type == "arnold" and True:
            division_terrain_change_material_assign_middle_stretch_face_mat(material_type, is_set_middle_stretch_face)


def division_terrain_change_material_assign_middle_stretch_face_mat(material_type, is_set_middle_stretch_face):
    print("material_type", material_type)

    cmds.select(cmds.ls("*__dem__gdem_v3_30m"))
    cmds.hyperShade(assign='elevation_mat_{}_template_SG'.format(material_type))
    if is_set_middle_stretch_face:  # 总是不得行
        cmds.select("dem_displacement_middle_stretch_face_set")
        cmds.hyperShade(assign='dem_displacement_middle_stretch_face_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('dem_displacement_middle_stretch_face_mat_{}_template_SG'.format(material_type), e=1, forceElement=1) # 不能这样做
        # # cmds.sets(edit=True, forceElement="dem_displacement_middle_stretch_face_mat_arnold_template_SG") # 可以这样做
        # mel.eval("sets -e -forceElement " + 'dem_displacement_middle_stretch_face_mat_{}_template_SG'.format("blinn"))

        # 这样也不行
        # cmds.select("*__gdem_v3_30m")
        # # pm.sets('dem_displacement_mat_SG', e=1, forceElement=1)
        # pm.sets('dem_displacement_mat_{}_template_SG'.format(material_type), e=1, forceElement=1)
        # select_middel_stretch_face_list_by_polySelectConstraint()
        # pm.sets('dem_displacement_middle_stretch_face_mat_{}_template_SG'.format(material_type), e=1, forceElement=1)

    # 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)
    # return

    if part_type == "2dmap":
        # cmds.setAttr("dem_displacement_texture_template.exposure", -0.900)
        cmds.setAttr("dem_displacement_2dmap_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 flatten_selected_model():
    cgdt_utils.must_has_at_least_a_geo()
    for obj in cmds.ls(sl=1):
        cmds.select(obj + ".vtx[*]")
        mel.eval('scale -ws -p 0cm {}cm 0cm 1 0 1 ;'.format(0))
        cmds.select(clear=True)


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.frameLayout("division_terrain_change_material_frameLayout", label=u"材质工具", bgc=(0.3, 0.3, 0.3), collapsable=0, collapse=0, p="division_terrain_change_material")
    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=u"赋予所有模型为blinn材质球",
                annotation=u"赋予所有模型为blinn材质球,blinn材质球可以导出到其它软件",
                width=200, command="division_terrain_change_material_assign_mat('blinn')")
    cmds.button(label=u"赋予地形模型为渐变色的blinn材质球",
                annotation=u"注意,使用之后模型可能会变成绿色,只是显示bug,渲染不会出现问题,保存打开之后会是正确的。赋予地形模型为blinn材质球,blinn材质球可以导出到其它软件",
                width=200, command="division_terrain_change_material_assign_mat('blinn',True)")
    # 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=u"赋予所有模型为卫星地图的arnold材质球",
                annotation=u"赋予所有模型为卫星地图的arnold材质球,可以用maya直接渲染,用arnold渲染器的渲染静帧效果好,但渲染比较慢;如果你要渲染动画,可以自己制作redshift材质球后使用redshift渲染",
                width=200, command="division_terrain_change_material_assign_mat('arnold')")
    cmds.button(label=u"赋予地形模型为渐变色的arnold材质球",
                annotation=u"注意,使用之后模型可能会变成绿色,只是显示bug,渲染不会出现问题,保存打开之后会是正确的。赋予地形模型为渐变色的arnold材质球,可以用maya直接渲染,用arnold渲染器的渲染静帧效果好,但渲染比较慢;如果你要渲染动画,可以自己制作redshift材质球后使用redshift渲染",
                width=200, command="division_terrain_change_material_assign_mat('arnold',True)")
    # 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_arnold_2dmap_rowLayout", p="division_terrain_change_material_columnLayout", nc=2)
    cmds.button(label=u"赋予所有模型为二维地图的arnold材质球",
                annotation=u"赋予所有模型为二维地图的arnold材质球,可以用maya直接渲染,用arnold渲染器的渲染静帧效果好,但渲染比较慢;如果你要渲染动画,可以自己制作redshift材质球后使用redshift渲染",
                width=200, command="division_terrain_change_material_assign_mat('arnold',False,False,True)")

    cmds.frameLayout("division_terrain_change_material_other_frameLayout", label=u"其它工具", bgc=(0.3, 0.3, 0.3), collapsable=0, collapse=0, p="division_terrain_change_material")
    cmds.columnLayout("division_terrain_change_material_other_columnLayout", w=405, adj=False, cal="center", cw=200, rs=5)
    cmds.rowLayout("flatten_selected_model_rowLayout", p="division_terrain_change_material_other_columnLayout", nc=2)
    cmds.button(label=u"打开”文件路径编辑器“窗口",
                annotation=u"打开”文件路径编辑器“窗口,查找丢失的贴图。打开窗口后,选择窗口列表中的丢失的贴图路径,然后点击”替换字符串“,然后把字符串”C:/Project/3d_map/division_terrain“替换成相应的目录",
                width=200, command="cmds.FilePathEditor()")
    cmds.button(label=u"展平所选模型",
                annotation=u"把每个模型分别展平到地平面,用于对osm_polygon_group组里面的模型展平",
                width=200, command="flatten_selected_model()")

    # 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
is_city_or_province_or_building = True # 脚本不一样

if __name__ == '__main__':
    division_terrain_change_material_ui()

标签 mayapython脚本

声明:该资源由发布人:【BEJ48】上传,点击查看作者主页其他资源。

CG模型网(cgmodel.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何CG模型网(cgmodel.com)之意见及观点。

推送到

首页推荐 编辑推荐

取消 通知作者
对此作品设置了隐私保护,禁止保存至本地。