前言

  好久没有更新文章了,最近的文章也差不多两个星期前了。
  主要是上周去团建了,然后我去尝试用 docsify 框架构建自己的 wiki 文档,把时间都用光了。
  wiki 文档算是搭建好了,中间对一些插件做了自己的优化改良,所以花了比较多的时间~ 链接
  不过目前还没有任何内容,打算慢慢进行更新,是一个长线的事情,可能需要等自己的只是体系更加系统了之后,类似 CGwiki 的文档一样规范整理。


  然后团建回来之后就患上了重感冒,果然团建暴饮暴食再加上泡了温泉可能着凉了,所以这周也算是过得挺糟心的(:з」∠)
  另外最近参加了公司内部的 minigame 比赛,我这个工具人的定位就尴尬得一批,我属于美术分类,但是我的美术能力根本指望不上(:з」∠)
  而且游戏制作相关的东西,包括引擎开发相关的还有很多东西需要补充。
  估计还要再积累一段时间,后续到国庆的日子里得不定期更新了~

改名工具

alt

  这个工具之前看了个教程有提到用 Unreal Python 开发批量改名工具,而且还可以根据文件的类型进行前后缀匹配。 改名视频 前缀匹配视频
  不过这个教程做得很简单,我想通过 PySide 的界面将改名工具做得更好一点。

  最近做了一个 PyToolkit 工具的推荐视频(顺便还恰了饭),成品演示视频↓↓↓

wiki文档链接

Template 报错坑

  我在左侧配置了命名变量,可以根据变量的名称配置自动嵌入到重命名工具上。
  最初我想到的实现方法是通过 字符串 的 format 方法来实现,但是 format 在一些特殊的情况下会报错,不好进行处理。

1
2
"{{INDEX}sd".format(**{"a":'123','INDEX':123})
# Error: ValueError: file <maya console> line 1: Single '}' encountered in format string #

  最后通过魔改 Template 的方法来解决这个问题。
  Python 的 string 模块自带 Templete 模板类,是方便以前后端 Html 模板进行处理的。
  怎么用网上也有很多介绍 python的Template使用指南
  当然这个原生的功能还是比较简单的,源码是通过 正则表达式 匹配的。
  默认情况下可以自动替换 Templete 字符串下 $ 或者 ${} 的字符串。
  因为是带源码,我可以在它的基础上进行一些处理,就不会导致 format 黑箱报错的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class ReplaceTemplate(Template):
def substitute(*args, **kws):
if not args:
raise TypeError("descriptor 'substitute' of 'Template' object "
"needs an argument")
self, args = args[0], args[1:] # allow the "self" keyword be passed
if len(args) > 1:
raise TypeError('Too many positional arguments')
if not args:
mapping = kws
elif kws:
mapping = _multimap(kws, args[0])
else:
mapping = args[0]
# Helper function for .sub()

def convert(mo):
# Check the most common path first.
named = mo.group('named') or mo.group('braced')
if named is not None:
# NOTE 修正默认 Templete 替换报错
default = "%s{%s}" % (self.delimiter, named) if mo.group(
'braced') else "%s%s" % (self.delimiter, named)
val = mapping.get(named, default)
# We use this idiom instead of str() because the latter will
# fail if val is a Unicode containing non-ASCII characters.
return '%s' % (val,)
if mo.group('escaped') is not None:
return self.delimiter
if mo.group('invalid') is not None:
return self.delimiter
# self._invalid(mo)
raise ValueError('Unrecognized named group in pattern',
self.pattern)
return self.pattern.sub(convert, self.template)

  基本上就是在源码的 subtitute 稍微改动了一下。
  确保替换可以返回出我想要的字符串。

dayu_widgets tableview 的小坑

  这次使用了 dayu_widgets 封装好的 MTableView 来显示重命名工具的数据。
  使用的过程中发现了写小问题,迫不得已,还要重新封装一下 MTableModel 来解决这个问题。
  后来我将问题提到了 dayu_widgets 的 issue 里面,得到了作者的反馈。

  作者毕竟是个高人,一眼就看出我不是人道行不够深。
  作者还写了案例代码,清晰表达了可以通过其他更好的方式实现我所想要的效果。
  感谢作者的帮助,这里受教了~

总结

  重命名工具已经弄好了好一段时间,然而这个总结文章却是姗姗来迟(:з」∠)
  而且这里也没有总结出什么比较好的东西,中间有一部分代码是直接拿了 Digital Tutor 一套 Maya PyQt 开发教程的代码
  可以实现英文 26 个字母 序号 自动递增的排序,超出 26 的情况下会自动拼接为 aa ab 这种方式。
  这次再次深度挖掘了 QtDesigner 的隐藏功能。
  通过魔改 ui 文件成功实现了 QSplitter 的效果。
  同时还加入 QSettings 实现插件的配置。