通常我们会在maya的脚本编辑器中执行python代码,如果是使用外部的.py脚本文件,两种方法可选:

1.        使用File菜单下的LoadScript载入.py脚本文件的内容,然后在编辑器中执行代码(或者修改代码后执行);

2.        使用FileSourceScript直接载入并执行.py文件。

不过,这是软件提供的固定功能,当你需要在maya开启后快速执行某些脚本时,路径的重复指定会显得繁琐不友好。尤其是当你打算自己编写一个窗体,包含多个外部脚本调用的时候。

【脚本调用外部python文件】

由于编辑器中调用的都是python预加载的模块,我们需要将外部的文件作为一个模块加载到python进程中,才能实现脚本内的调用--这点和直接访问外部文件有明显的区别。

这是个简单的脚本,作用是开启一个maya窗体。

import maya.cmds as py

if py.window('test',ex=True):

py.deleteUI('test',wnd=True)

py.window('test',t='PythonScript')

py.showWindow()

File->SaveScript,将脚本内容保存为一个*.py文档。为了方便,我保存在用户文件夹下:C:\Users\myPY.py。

*脚本保存的名称要和脚本内的窗体变量名不同(如本例中的test),否则可能无法执行。

6608759774282615943.jpg (34.51 KB, 下载次数: 1)

2016-3-24 15:48 上传

要在脚本编辑器中调用外部python脚本,首先需要获取文件的路径--导入os模块。

import sys

import os

def pySource(filePath):

#去掉文件目录路径,返回文件名,含文件后缀

myFile = os.path.basename(filePath)

#去掉文件名,返回目录路径

dir = os.path.dirname(filePath)

#将文件名和扩展后缀名分离后取文件名

fileName = os.path.splitext(myFile)[0]

#上面步骤中,编辑器仅根据提供的路径和文件名进行分类,并没有检测实际是否存在

#检查路径是否存在,如果存在则进入下一步

if( os.path.exists( dir ) ):

#sys.path是maya启动后加载python相关模块的地址集合

paths = sys.path

pathfound = 0

#遍历paths这个地址集合中的名称,如果有和提供的文件路径相同的地址,除了变量pathfound的值更改为1,不执行其他操作

for path in paths:

if(dir == path):

pathfound = 1

#如果路径不是地址集合中的地址,则将其加入(这是考虑多次启动脚本的情况)

if not pathfound:

sys.path.append( dir )

#以上的语句,将外部的python文件作为一个模块加载到了当前的进程中,可进行实时调用

#注意:这是个动态的加载,用户的外部文件会在下一次python重启动时从进程中消失

#exec方法用于执行存储在字符串或者文件中的python语句,类似MEL中的eval函数

#不过这里需要添加in  globals(),因为我们要在整个全局变量中执行我们的外部脚本

exec('import ' +fileName) in globals()

#因为是后导入的模块,因此需要重载文件来确保数据的更新

exec( 'reload( ' + fileName + ' )' ) in globals()

#返回输入文件的命名空间

return fileName

# 输入一个文件需要提供完整路径--勿用中文路径

#注意python中路径是用斜杠【/】,而不是windows中文件夹路径的反斜杠【\】

#如果是MacOS系统,由于不存在windows的分区概念,路径通常为:/Users/...

pySource( 'c:/Users /myPY.py' )

现在,运行这个脚本,可以直接执行外部的python脚本文件。

6599269889424668629.jpg (74.63 KB, 下载次数: 1)

2016-3-24 15:48 上传

不过存在一个问题,那就是字符的支持。

输入语句:

import sys

print sys.getdefaultencoding()

可以看到maya中python的默认语言编码:ascii。

2676545553641990321.jpg (30.19 KB, 下载次数: 1)

2016-3-24 15:48 上传

假如脚本中包含有ascii文字编码无法处理的文字编码时(例如中文,日文),脚本编辑器会在执行代码时候报错。

6608735585026804920.jpg (64.47 KB, 下载次数: 1)

2016-3-24 15:48 上传

当然,如果你不介意乱码显示,只需要脚本的执行,那么可以用以下方法解决ascii编码报错的问题:

用【记事本】打开*.py文件,然后另存为UTF-8格式的文件替换。

6599272088447955607.jpg (91.43 KB, 下载次数: 1)

2016-3-24 15:48 上传

尽管有很多方法可以改变python的语言编码,不过很不幸maya的python目前还不支持。我经过测试,无论是UTF-8还是GB2312,外部导入的文本中的简体中文和特殊字符只会显示乱码。

6608484896375671966.jpg (47.94 KB, 下载次数: 1)

2016-3-24 15:48 上传

从外部调用脚本后:

2676545553641990330.jpg (56.32 KB, 下载次数: 1)

2016-3-24 15:48 上传

=====================================================

如果你对改变python默认编码有点兴趣,可以按我下面的方法进行。

将以下语句保存名为sitecustomize.py(.py是后缀)的python脚本文件:

import sys

sys.setdefaultencoding('utf-8')

6608867526422137399.jpg (29.31 KB, 下载次数: 1)

2016-3-24 15:48 上传

然后将它复制到maya安装目录的名为Python的文件下,例如C:\Program Files\Autodesk\Maya2015\Python。

6599330362564193823.jpg (10.81 KB, 下载次数: 1)

2016-3-24 15:48 上传

这个特殊命名的文件可以让python在启动的时候优先导入。当再次启动maya,python默认的语言编码将更改为UTF-8。

6599288581122340064.jpg (31.24 KB, 下载次数: 1)

2016-3-24 15:48 上传

如果不打算重启maya,可以动态的修改当前的编码格式。

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

这段语句只要执行一次即可,作用会在maya关闭后消失。不过因为reload()方法的使用,会造成python编辑器无法执行打印输出(此时使用print语句来打印输出结果是无效的),因此建议采用脚本提前加载的方法。

*python3.x的默认语言编码为unicode。

=====================================================

【窗体调用外部python文件】

当完成了上述的步骤,UI定制就显得容易了,我们要做的工作也就是给每个按钮指定一个路径而已。这里以我前面文章制作的python脚本为例--原先的按钮中文名称更改为英文。因为窗体不是外部导入,所以脚本内可以使用中文字符。

6608867526422153375.jpg (25.42 KB, 下载次数: 1)

2016-3-24 15:48 上传

if py.window('toolBox',ex=True):

py.deleteUI('toolBox',wnd=True)

py.window('toolBox',t='工具集')

py.columnLayout(adj=True)

py.button(l='线框变色', c="pySource(  'c:/Users/scriptSet/colorLine.py'  )")

py.button(l='物体合并',c= "pySource(  'c:/Users/scriptSet/allone.py'  )")

py.showWindow()

本例的完整代码如下(外部脚本文件的路径可自定义):

import maya.cmds as py

import sys

import os

def pySource(filePath):

myFile = os.path.basename(filePath)

dir = os.path.dirname(filePath)

fileName = os.path.splitext(myFile)[0]

if( os.path.exists( dir ) ):

paths = sys.path

pathfound = 0

for path in paths:

if(dir == path):

pathfound = 1

if not pathfound:

sys.path.append( dir )

exec('import ' +fileName) in globals()

exec( 'reload( ' + fileName + ' )' ) in globals()

return fileName

if py.window('toolBox',ex=True):

py.deleteUI('toolBox',wnd=True)

py.window('toolBox',t='工具集')

py.columnLayout(adj=True)

py.button(l='线框变色', c="pySource(  'c:/Users/scriptSet/colorLine.py'  )")

py.button(l='物体合并', c= "pySource(  'c:/Users/scriptSet/allone.py'  )")

py.showWindow()

6608521180259389157.jpg (35.55 KB, 下载次数: 1)

2016-3-24 15:48 上传

最后,将代码拖拽到maya工具架上形成一个按钮,即可弹出一个包含外部脚本文件调用功能的窗口。

【打印语句的提示栏显示】

这里顺便提到一个有关打印输出的技术点。

使用MEL的时候,print结果时,脚本编辑器和maya界面右下方的信息提示栏都会打印出相应的单行信息;

6608251799911497965.jpg (37.07 KB, 下载次数: 1)

2016-3-24 15:48 上传

而python执行语句时却不会在信息提示栏中看到反馈:

6608417826167299589.jpg (36.79 KB, 下载次数: 1)

2016-3-24 15:48 上传

这是因为python在执行print这个语句时,会自动在结果后面换行,于是信息提示栏中看不到任何输出。要实现打印输出,有两个方法:

1.在print语句最后加入英文状态输入的逗号,取消打印换行。

例如:

print 'hello',

6608697102119833516.jpg (36.81 KB, 下载次数: 1)

2016-3-24 15:48 上传

*python3.X后print是作为方法而不是语句,因此print不换行输出需要加入参数来实现:print('hello',end='')

2.使用sys模块下的输出方法。

例如:

import sys

sys.stdout.write('hello')

6599289680633968327.jpg (39.6 KB, 下载次数: 1)

2016-3-24 15:48 上传

python 3d游戏脚本_【Maya】pythonInMaya_调用外部脚本文件相关推荐

  1. python写安卓游戏_Python 3d最新安卓版下载,Python 3d游戏最新安卓版下载 v1.0 - 游戏盒子下载站...

    Python 3d最新安卓版是一款趣味十足的以贪吃蛇为玩法的3D风格的休闲类游戏.玩家在游戏中需要控制自己的这条小蛇灵活的躲避各种障碍,然后吞食资源进行成长!你能否将小小的蛇,养成霸屏的庞然大物呢?每 ...

  2. qt linux 调用外部库文件 (safenet加密狗开发一)

    一加密狗开发基本原理: 经过我的探索,加密狗的基本原理就是每个加密狗有不同的id,根据加密狗的id生成独一无二的库文件,然后再在程序中加入vendorcode文件,比对插入的加密狗和code文件,如果 ...

  3. halcon python 联合开发_使用pythonnet调用halcon脚本

    最近的项目中遇到了使用python程序结合不同部分,其中包括使用halcon处理拍摄到的图像. halcon本身提供了c++与.NET的开发库,但无python库,网上有pyhalcon之类的库,但功 ...

  4. java执行python脚本_通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

  5. python可以开发3d游戏吗_用python3从零开始开发一款烧脑射击游戏#3

    上回说到我们已经可以控制小方块的移动了,现在我们要把这个小方块放置到游戏场景里 剥去美术的外壳,游戏场景其实就是一个标记了玩家可行走与不可行走的空间 对于2D游戏,它是一个平面网格,3D游戏就是一个3 ...

  6. python 3d绘图 汉字_完美解决Python matplotlib绘图时汉字显示不正常的问题

    Matplotlib是一个很好的作图软件,但是python下默认不支持中文,所以需要做一些修改,方法如下: 1.在python安装目录的Lib目录下创建ch.py文件. 文件中代码为: 保存,以后通过 ...

  7. unity 3d游戏开发_使用Unity 5开发3D游戏

    unity 3d游戏开发 If there's one thing cooler than playing games, it's building games. 如果有比玩游戏更酷的一件事,那就是构 ...

  8. jmeter脚本_性能工具之Jmeter脚本python启动

    背景 上一节是shell命令启动Jmeter,担心大家对shell脚本语法不是很熟悉,如果定制自己想要的恐怕不好弄,这次改用python启动脚本,在改造之前大家先了解下Jmeter线程组相关参数,这样 ...

  9. matlab识别不出linux链接,在Ubuntu上,从matlab调用外部脚本失败_linux_开发99编程知识库...

    我搜索了很多次,但没有解决这个问题. 我使用系统( )/unix ( ) 从matlab调用外部 R 脚本,并找到共享库的mis加载. 我知道在matlab中环境是错误的. 我还尝试在xterm或者g ...

最新文章

  1. 自动驾驶公司尴尬处境
  2. 华南理工大学计算机应用基础随堂作业,华南理工大学计算机应用基础随堂练习题目及答案...
  3. Java开发必须掌握的线上问题排查命令
  4. python编程工具p-python Gui开发工具选择
  5. mysql 8.0 自定义函数_PHP+Mysql防止SQL注入的方法(life)
  6. redis(一)--认识redis
  7. python中的jieba分词使用手册_Python jieba结巴分词原理及用法解析
  8. 经典数据可视化案例-百度迁徙图
  9. 物联lot是什么意思_什么是IOT物联网技术
  10. 基于Spring的app后台开源框架
  11. Ubuntu Temporary failure in name resolution 问题
  12. 肌肤食品揭秘淘宝骗子经典伎俩
  13. 3D建模游戏动漫模型制作软件都有哪些?最全解析,工具免费领
  14. 程序开发语言之兵器谱排名
  15. win11系统苹果电脑如何安装 Windows11绕过tpm限制在苹果电脑进行安装的步骤方法
  16. 【docker系列】容器自启动与守护进程停止后容器保活
  17. 更改bootstrap工具提示-tooltip
  18. Heart Disease UCI(心脏病相关数据集)
  19. 《UnityAPI.AudioClip音频剪辑》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+AudioClip+loadInBackground+立钻哥哥++OK++)
  20. 个人公众号,对产品经理面试是否有加成?

热门文章

  1. 大数据Spark面试题2023
  2. 文本预处理方法之英文分词spacy
  3. 永磁同步电机矢量控制(八)——弱磁控制(超前角弱磁)
  4. 基于Stm32F1和Openmv的热成像人脸跟随测温仪
  5. flutter 仿哔哩哔哩,视频详情页面效果
  6. 日历表作用与HiveSQL生成
  7. Word文档常见的三大问题及其解决方法(珍藏版)
  8. 豆瓣刮削器无法连接远程服务器,如何解决kodi播放器电影刮削器匹配失败的问题?...
  9. 真正中文攻略之狼少女 辛希雅(シンシア)~Sincerely to You
  10. 淘宝指数批量查询工具v1.8 正式发布