3D Max修改器索引混乱

时间:2018-10-01 17:55:24

标签: python 3dsmax

我有一个3DS Max场景对象,我对其应用了外观包裹修改器。我想将其转换为皮肤修改器,然后在堆栈中直接将其下面的皮肤包裹删除。

所以我应该简单地通过正确的堆栈号删除修饰符? 哎呀,我什至还有一条打印线,用于标识堆栈中的编号。

我为python和EvalMAXScript之间的来回道歉,我不是编码人员,只是一个努力理解的人。

# setup =======================================================

import MaxPlus as mp
from pymxs import runtime as rt

mySel = rt.selection
max = mp.Core.EvalMAXScript

box    = mp.Factory.CreateGeomObject(mp.ClassIds.Box)
sphere = mp.Factory.CreateGeomObject(mp.ClassIds.Sphere)
cyl    = mp.Factory.CreateGeomObject(mp.ClassIds.Cylinder)
node   = MaxPlus.Factory.CreateNode

node(box)
node(sphere)
node(cyl)
#setup =======================================================

max("select #($Sphere001, $Cylinder001)")

# =============================================
rt.addModifier (mySel[0], rt.Skin())
max("select $Sphere001")
max("skinOps.addBone $.modifiers[#Skin] $Cylinder001 1")
# =============================================

max("select $Box001")

rt.addModifier (mySel[0], rt.Skin_Wrap())
max("append $" + str(mySel[0].name) +".modifiers[#Skin_Wrap].meshList $Sphere001")
mySel[0].modifiers[0].meshDeformOps.convertToSkin (False) 

print mySel[0].modifiers[0].name + " <----- ZERO"
print mySel[0].modifiers[1].name + " <----- ONE!!!!"
#print mySel[0].modifiers[2].name  #<----- will say IndexError: Index out of range <--- This makes sense

rt.deleteModifier (mySel[0], 2) #<------------------ I want to delete the SKIN WRAP modifier SO WHY 2??? 

但是,为什么删除skin wrap修饰符在deleteModifer arg中需要“ 2”?

打印出修改器的名称时,3D Max的编号顺序与删除时的编号顺序不同吗?

这与python计数/迭代从0开始而不是从1开始有关吗?

有人可以将我/或想通过python学习max脚本的任何人指向我可以获取有关此类信息的文档吗?因为我认为在某些基本文档(我显然找不到)中应该放一些与输入正确索引号相同的东西。

请原谅焦虑。我花了好几个小时试图弄清楚为什么它不起作用,直到我偶然发现一个超出范围的索引号。

谢谢。

1 个答案:

答案 0 :(得分:0)

according to the doc,您可以直接将修饰符而不是索引传递给deleteModifier函数:

deleteModifier <node> <modifier_or_index>

所以类似的东西可以工作:

import MaxPlus as mp
from pymxs import runtime as rt

mySel = rt.selection
max = mp.Core.EvalMAXScript

node   = MaxPlus.Factory.CreateNode
box = mp.Factory.CreateGeomObject(mp.ClassIds.Box)

node_box = node(box) # Watch out, 'node_box' this is a MaxPlus node

max("select $Box001")

# Create the modifiers
rt.addModifier (mySel[0], rt.Skin_Wrap()) # Skin Wrap
rt.addModifier (mySel[0], rt.Skin()) # Skin

# Get their references
modifier_skin      = mySel[0].modifiers[0]
modifier_skin_wrap = mySel[0].modifiers[1]

print (modifier_skin.name + " <----- modifier_skin")
print (modifier_skin_wrap.name + " <----- modifier_skin_wrap")

rt.deleteModifier (mySel[0], modifier_skin_wrap)
rt.deleteModifier (mySel[0], modifier_skin)

您甚至可以执行一个函数,该函数可以删除给定名称的修饰符:

import MaxPlus as mp
from pymxs import runtime as rt

def delete_modifier_by_name(node, modifier_name):
    max_node = rt.getnodebyname(node.Name)
    for modifier in max_node.modifiers:
        if modifier.name == modifier_name:
            print("Deleting %s..." % modifier.name)
            rt.deleteModifier (max_node, modifier)
            return

mySel = rt.selection
max = mp.Core.EvalMAXScript

node   = MaxPlus.Factory.CreateNode
box = mp.Factory.CreateGeomObject(mp.ClassIds.Box)

node_box = node(box) # Watch out, 'node_box' this is a MaxPlus node

max("select $Box001")

# Create the modifiers
rt.addModifier (mySel[0], rt.Skin_Wrap()) # Skin Wrap
rt.addModifier (mySel[0], rt.Skin()) # Skin

delete_modifier_by_name(node_box, "Skin")
#~ delete_modifier_by_name(node_box, "Skin Wrap")