近期热门
粉丝909
关注 205
获赞 1007
Python in… 3ds Max

[脚本] Python in… 3ds Max

 !heats_icon! [复制链接]
17895 3 0 0 15年前 举报
I saw users on www.cgtalk.com talking about this and I thought I would post it to show how Python is bridging the gap not only between MEL and the C++ API in Maya. But Python is bridging the gap between software as well.
Here are the steps to make Python work in 3ds Max.
# Step 1: Download Python Version x.x any version at http://www.python.org/download/
# Step 2: Download and install pywin32 which has the win32com python module in it here: http://sourceforge.net/projects/pywin32/
# Step 3: Make sure to download the win32com for the python version you have downloaded
# Step 4: Open up the Python IDLE Shell and select File\New Window
# Step 5: Copy and paste this code, written by David Mackenzie and posted on cgtalk.com:
  1. /*
  2.           Just a quick hack to demonstraight some python in max. This is a very script on both ends.
  3.           If there is any interest I will develop it further.
  4.                   crafted by, David Mackenize

  5.           Notes:
  6.                   -Any strange errors, python or max please send to me.
  7.                   -I would recomend, where ever you would like to place a tab insert 4 'spaces'
  8.                   -You might find that if you have 2 or more Dialogs open (of this script) the previous ones
  9.                   will drop/loose there connection with COM.

  10.           Cheers
  11.           Dave

  12. */
  13. import sys
  14. import os
  15. import win32com.server.register

  16. Writing = True

  17. def TBWrite():
  18.         """Returns the traceback as a string, VERY handy dandy biatch"""
  19.         import traceback
  20.         return traceback.format_exc()

  21. #Catch sys.stdout, this is what would normaly be returned to the screen by python
  22. class CatchOut:
  23.         def __init__(self, obj):
  24.                 """obj requires the method COut"""
  25.                 self.Obj = obj

  26.         def write(self, data):
  27.                 """This method catches sys.stdout, stdout expects a write method"""
  28.                 self.Obj.COut(data)
  29.                 #global Writing
  30.                 #Writing = False

  31. class MXSPrompt:
  32.         _public_methods_ = [ 'RunCom' ]
  33.         _reg_progid_ = "DaveTools.MXSPrompt"
  34.         _reg_clsid_ = '{CF24CDE3-680B-4A38-82E0-958C57921AF7}'

  35.         def __init__(self):
  36.                 self.Buffer = ""
  37.                 self.StdOut = CatchOut(self)
  38.                 #sys.stderr = self.StdOut
  39.                 sys.stdout = self.StdOut

  40.         def RunCom(self, commstr):
  41.                 """Method that is visible to COM"""
  42.                 try:
  43.                         global Writing
  44.                         self.Buffer = ""
  45.                         exec commstr
  46.                         """
  47.                         while(Writing):
  48.                                 pass
  49.                         Writing = True
  50.                         """
  51.                         return self.Buffer
  52.                 except:
  53.                         return TBWrite()

  54.         def COut(self, dstr):
  55.                 """Just Updates the Buffer"""
  56.                 self.Buffer = self.Buffer + dstr

  57. if __name__ == "__main__":
  58.         win32com.server.register.UseCommandLine(MXSPrompt)
复制代码
# Step 6: Select from the menu with the Python module the menu Run\Run Module or hit F5
# Step 7: Open 3ds Max
# Step 8: Open the script editor and run this maxscript code also written by David Mackenize:
  1. /*
  2.           Just a quick hack to demonstraight some python in max. This is a very script on both ends.
  3.           If there is any interest I will develop it further.
  4.                   crafted by, David Mackenize

  5.           Notes:
  6.                   -Any strange errors, python or max please send to me.
  7.                   -I would recomend, where ever you would like to place a tab insert 4 'spaces'
  8.                   -You might find that if you have 2 or more Dialogs open (of this script) the previous ones
  9.                   will drop/loose there connection with COM.

  10.           Cheers
  11.           Dave

  12.   */

  13. fn GetComObj =
  14. (
  15.         try
  16.         (
  17.                 o = createOLEObject "DaveTools.MXSPrompt"
  18.                 return o
  19.         )
  20.         catch
  21.         (
  22.                 print "error create ole object"
  23.                 return False
  24.         )
  25. )

  26. rollout pyprompt "Python Prompter"
  27. (

  28.         group "Py Prompt"
  29.         (
  30.                 edittext py_out "" height:125
  31.                 edittext py_in "" height:150
  32.         )
  33.         button btn_submit "Submit" align:#right

  34.         local obj = GetComObj()

  35.         on btn_submit pressed do
  36.         (
  37.                 t = obj.RunCom py_in.text
  38.                 py_out.text = t
  39.         )
  40. )

  41. createDialog pyprompt 450 350
复制代码
Once you are done executing the above code in max a dialog will pop up. Type in python code in the bottom window and hit submit and it will return your results!

Also note that Blur Studios came out with a Python plug-in for 3ds Max located on my friend Paul Neale’s web site here:
http://www.paulneale.com/downLoads/blurPython.zip I can not seem to find the plug-in on Blur’s site, it is probably in the 3ds Max package they have posted on Blur Beta.

I have not done much with this since right now but it looks like it has alot of potential for max users to use their Python knowledge. For example You could use obj.RunCom to call the Python e-mail module and send yourself an e-mail when finished with a batch in 3ds Max. Using the very same code a Maya users or someone outside of either program would use. This means the code you right does not need to be thrown away when switching to another package or rewritten when using two packages.

For further reading:

Tech Art Tiki
http://techarttiki.blogspot.com/ ... from-maxscript.html

3dsMax SDK and MaxScript
http://forums.cgsociety.org/showthread.php?p=5700073#post5700073

More on COM
http://en.wikipedia.org/wiki/Component_Object_Model

This has documentation on PythonWin32
http://python.net/crew/mhammond/win3/

But if you want newer versions for Python 2.5 and 2.6 of PythonWin32 go here:
http://sourceforge.net/projects/pywin32/

Cheers,
-RyanT
0
点赞
0
打赏
0
添加到收藏夹

0

点击复制链接

使用微信扫码分享
一次扣10个券
全部评论3
您需要登录后才可以回帖 登录

python强大易用
6年前
回复

使用道具 举报

谢谢分享    谢谢
7年前
回复

使用道具 举报

哈哈 可以让我同事发挥它的 Python了。。
14年前
回复

使用道具 举报

您当前使用的浏览器IE内核版本过低会导致网站显示错误

请使用高速内核浏览器或其他浏览器