工具方案分享_丢失贴图查找

使用Maxscript来查找丢失贴图的工具方案

  • 使用3dsMax中,针对常见的贴图丢失的情况,我这里分享了基本的工具开发思路


收集丢失的贴图信息

-- 收集当前文件中丢失的贴图
LostTextures = for t in (getClassInstances BitmapTexture) where not (doesFileExist t.filename) collect t

-- 打印查看
for t in LostTextures do print t.filename 


对已经获得的贴图路径进行处理得到贴图文件的名称

  • 这一步,主要是从贴图路径中,得到贴图文件名,用于后续的差值
  • 很多时候,原始的.dds格式被修改成了 .tga,或其它格式,这里也例举了替换后缀的方法
-- 从路径获得名称的方法
fn GetTexFileName sFile=
(
    -- 引用system.io.path静态类
    dnPath = dotnetclass "system.io.path"

    -- 获得不带后缀的名称
    sNameNoExt = dnPath.GetFileNameWithoutExtension sFile  
    return sNameNoExt 
)

-- 测试调用:
-- 单个文件路径
sTheFile = @"G:\mods\ . . . \Textures\LuxCrypts_SpawningPlatform_Spec.dds"
sTexName = GetTexFileName sTheFile 


在一个目录中寻找贴图的方案

  • 这里分成两步
  • 第一步,收集这个目录下所有的贴图文件
-- 收集一个目录下指定后缀的所有文件
-- 为了方便匹配,这里返回了一个DataPair类型的数组,
-- DataPair.v1为用于匹配的没有后缀的名称,v2为完整的路径
fn GetAllFilesInFolder sFolder sExt=
(
    local result = #()
    local filePaths = getfiles (sFolder + @"\*" + sExt)
    for f in filePaths do 
    (
        append result (DataPair (GetTexFileName f) (f))
    )
    return result
)

  • 第二步,在收集的DataPair数组里遍历,查找相同名称的
-- 
-- 在一个目录里,收集所有的贴图
foundedTexs = GetAllFilesInFolder @"E:\MyModels\MyTextures" ".tga"

-- 遍历收集到的贴图进行查找
for ft in foundedTexs do
(
    -- 这里的 sTexName是以上从丢失贴图中获得道的没有后缀的贴图文件名
    if((tolower sTexName ) == tolower (ft.v1))then
    (
         -- 查找成功
         --  . . . 
     )
)

最后完整的函数:

  • 需要用到以上的 GetTexFileName 和 GetAllFilesInFolder 两个函数
-- 在一个目录下查找丢失的贴图
fn FindLostTextureInFolder sResearchFolder sExt=
(
    local LostTextures = for t in (getClassInstances BitmapTexture) where not (doesFileExist t.filename) collect t
    if(LostTextures.count >0)then
    (
        -- 查找目录下所有的文件
        local foundedTexs = GetAllFilesInFolder sResearchFolder sExt

        -- 遍历进行比对
        for t in LostTextures do
        (
            -- 只获得不带后缀的贴图名称
            local sTexName = GetTexFileName t.filename 

            -- 遍历收集到的贴图进行查找
            for ft in foundedTexs do
            (
                -- 如果匹配,设置新的路径到bitmapTexture中
                if((tolower sTexName) == tolower (ft.v1))then
                (
                    t.filename = ft.v2
                )
            )
        )

    )
)
  • 调用例子
FindLostTextureInFolder @"e:\myModels\myTextures" ".tga"

发表评论

电子邮件地址不会被公开。 必填项已用*标注