前言

  最近因为毕设还有开发 Python Qt 的数据绑定框架拖了很长的时间,两个都没有彻底完成,所以都没有进行文章总结。
  直接导致最近没有更新 博客 (:з」∠)

  上次在研究 Maya 内置图标的时候就有发现Maya bin目录下的 commandList 记录了 Maya mel 命令所调用的 dll 文件
  那么理论上 Maya 要运行起来其实并不需要所有的功能,我们可以从中抽丝剥茧,大大降低它的大小。
  于是就有了今天这篇文章,整理完成的 github 地址

提取 Maya Standalone

  其实提取过程并没有什么神奇的,就是将 Maya 安装目录下的文件拷贝到新的路径上。
  然后运行 mayapy 测试 standalone 的 initialize 方法是否会出错。
  如果出错了就想办法找到对应的 dll 继续进行拷贝。

  最初只是将 bin 目录下的 dll 拷贝测试,后来发现初始化还会用到 qt-plugin 以及 python 的依赖
  因此 bin 目录外的东西也需要挪出来。

  后面就主要测试 bin 目录下关于 dll 的依赖了。
  一个个去测试太花时间了,这里用了个小技巧。
  先将 Maya bin 目录下的文件都拷贝到我的测试目录里面,然后运行 mayapy 进行初始化
  后面再将所有的文件删除,此时由于 mayapy 处于运行状态,加载的dll将无法被删除。
  通过这样的方法就可以快速定位出在使用的 dll 。


  这里遇到了一些坑,都是和保存文件有关的。
  为了方便调用 mayapy ,我将 bin 目录路径添加到了系统环境变量里面了,这就导致一些确实的 dll 居然加载了我 Maya 原来的目录位置。
  后来我测试的时候只好将 Maya 的 bin 目录稍微改一下名字来解决这个问题。

  经过一番调整测试,总算是 standalone 初始化不会提示 dll 报错了。
  但是没想到这种状态下保存 Maya 文件还是会出错,加载 OpenMaya.dll 出错了。
  于是又进行了 dll 的测试,借助 git 版本 管理可以将当前可运行的 dll 一次 commit 进行记录保护,这样继续测试就很舒服了。

  后续保存文件的时候还会出现摄像机名称全部编程 transform 了,然后 shape 的命名也不正确导致 Maya 打开显示不出模型。
  后来经过我的排查,我发现只要将 Maya resource 目录下的 MayaStrings 文件添加上就正常了。

  最后我还将 python 的一些依赖包给删除了,比如 alembic 包,用得比较少,大小有点大。

  最后精简的大小大概在 350M
  这个结果其实非常不理想,原本是希望精简到 100M 以下的,而且这个状态还没有 FBX 插件,不过 FBX 插件也就 12 M,加上也还可以接受的。
  还有许多内置插件也被干掉了,就在 bin 目录下的 plug-ins

GUI 开发

  弄好了精简版的 Maya 之后,我就打算弄一个 python 脚本自动将相关的 dll 文件拷贝出来,开箱即用。
  原本只是打算开发命令行的版本,后来想了一下不如就开发一个图形化界面版本吧。
  考虑到 Python 执行的脚本,那么图形化工具还是用 Python 自带的 tkinter 吧。
  毕竟这个包几乎所有的 Python 都有的,可是万万没想到 Maya 的 Python 似乎砍掉了。
  于是我只好写两个版本的图形化界面了。
  正好可以学习一下 Tkinter 的界面开发。

  可能我已经习惯了 Qt 开发方式了,所以使用 Tkinter 开发还是非常的不习惯。
  Tkinter 的教程可以参考国外的教程网站 geeksforgeeks ,有很完善的代码案例
  Tkinter 还有一个缺点就是 Python2 和 Python3 的调用有很大不同,兼容需要一些处理。

源码参考

总结

  其实这次的精简操作突然兴起就干了起来,这几天一直在研究 Qt 的双向数据绑定的实现方案。
  QMVVM 的开发有了很大的进展,不过我还真的不确定我所使用的模式是否真的是 QMVVM 模式,先开发完成再看吧。
  明天就 五一 了,继续加班,撸起袖子加油干。