Запутанность индекса модификатора 3D Max - PullRequest
0 голосов
/ 01 октября 2018

У меня есть объект сцены 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??? 

Но тогда почему удаление модификатора обтекания требует "2" в аргументе deleteModifer ??

При выводе имени модификатора, 3Ds Max отличается от нумерации при удалении?

Это как-то связано с тем, что подсчет / итерации Python начинаются с0, а не 1?

Может ли кто-нибудь указать мне / или кому-либо, кто хотел бы научиться написанию скриптов в max с python, на документ, где я мог бы получить информацию о чем-то подобном?Потому что я представляю, что что-то такое же общее, как введение правильного номера индекса, должно быть где-то в какой-то базовой документации (которую я, очевидно, не смог найти).

Простите за страх.Я часами пытался понять, почему это не сработало, пока случайно не наткнулся на указание номера индекса вне диапазона.

Спасибо.

1 Ответ

0 голосов
/ 14 июня 2019

в соответствии с документом , вы можете напрямую передать модификатор вместо индекса в функцию 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")
...