Render.ru
Поддержать

MaxScript Macros

cherepushka

Пользователь сайта
Рейтинг
2
Доброго времени суток!
Не подскажите, можно ли в 3Ds Max создавать макросы? Как в фотошопе actions. Начал читать документацию по MaxScript, но пока глуховато.
У меня есть очень много файлов в формате *.step.
Импорт файла, выделить объект, применить модификатор Slice. Затем экспорт с любым названием.
Может у кого была похожая ситуация.
Спасибо.
Пока продвинулся не намного.
Применяю addmodifier myBox (sliceModifier()), теперь нужно выбрать параметр RemoveTop, но когда пишу
sliceModifier.Slice_Type=3 выходит ошибка

Владислав Бодюл

Активный участник
Рейтинг
15
Изменено: 4 #2
cherepushkaно когда пишу
sliceModifier.Slice_Type=3 выходит ошибка
myBox.modifiers[#Slice].Slice_Type = 2
Для "Remove Top" значение "2" так-как нумерация режимов идёт с нуля.

Похоже макс не умеет экспортировать в step, по этому в примере будет экспорт в obj
(
    local src_files = getFiles "C:\models\*.step"
    local save_dir = "C:\models\slice\\"
  
    for f in src_files do
    (
        resetMaxFile #noPrompt
        importFile f #noPrompt
      
        for o in geometry do
        (
            addModifier o (SliceModifier slice_type:2)
        )

        exportFile (save_dir + (getFileNameFile f) + ".obj") #noPrompt
    )
)

cherepushka

Пользователь сайта
Рейтинг
2
Владислав Бодюл( local src_files = getFiles "C:\models\*.step" local save_dir = "C:\models\slice\\" for f in src_files do ( resetMaxFile #noPrompt importFile f #noPrompt for o in geometry do ( addModifier o (SliceModifier slice_type:2) ) exportFile (save_dir + (getFileNameFile f) + ".obj"😉 #noPrompt ) )
Спасибо огромное за помощь

cherepushka

Пользователь сайта
Рейтинг
2
Добрый день, а каким образом можно перечислять свойства у модификатора <Mirror>.?
Делаю так, но ничего не случается
addModifier obj (MirrorModifier mirror_axis:1
copy:true
Mirror_Offset:100
)
И можно ли каким-нибудь образом значение Mirror_Offset сделать как-то автоматом что ли, чтобы фигура зеркально отобразилась рядом с первоисточником?

Владислав Бодюл

Активный участник
Рейтинг
15
(
    obj = $
   
    currentTransform = obj.transform
    obj.transform *= inverse currentTransform
    offset = obj.max.y * 2
    obj.transform = currentTransform
   
    addModifier obj (Mirror mirror_axis:1 copy:true Mirror_Offset:offset)
)

cherepushka

Пользователь сайта
Рейтинг
2
Спасибо большое за помощь новичку.
А почему я не могу сделать так - применить два модификатора к объекту?
local src_files = getFiles "C:\models\*.step"
local save_dir = "C:\models\slice\\"

for f in src_files do
(
resetMaxFile #noPrompt
importFile f #noPrompt

for o in geometry do
(
addModifier o (SliceModifier slice_type:2)
addModifier o (Mirror mirror_axis:1 copy:true Mirror_Offset😮ffset)
)

exportFile (save_dir + (getFileNameFile f) + ".obj"😉 #noPrompt
)
Рейтинг
31
Ошибки при указании путей. Надо ставить либо двойной бэкслэш, либо собаку перед строкой.
local src_files = getFiles @"C:\models\*.step"
local save_dir = @"C:\models\slice\"
И оформляй код через Вставить -> Код, а то фигня отображается ((

cherepushka

Пользователь сайта
Рейтинг
2
(
    local src_files = getFiles "C:\models\*.step"
    local save_dir = "C:\models\slice\\"
 
    for f in src_files do
    (
        resetMaxFile #noPrompt
        importFile f #noPrompt
     
        for o in geometry do
        (
            addModifier o (SliceModifier slice_type:2)
            addModifier o (Mirror mirror_axis:1 copy:true Mirror_Offset:ffset)

        )

        exportFile (save_dir + (getFileNameFile f) + ".obj") #noPrompt
    )
)
Спасибо.
Вот вставил, там и стоял двойной бэкслэш.
Но я хотел узнать, почему два модификатора нельзя использовать.

Владислав Бодюл

Активный участник
Рейтинг
15
Просто не задано значение для переменной offset.

(
    local src_files = getFiles "C:\models\*.step"
    local save_dir = "C:\models\slice\\"
    for f in src_files do
    (
        resetMaxFile #noPrompt
        importFile f #noPrompt
    
        for o in geometry do
        (
            addModifier o (SliceModifier slice_type:2)

            currentTransform = obj.transform
            obj.transform *= inverse currentTransform
            offset = obj.max.y * 2
            obj.transform = currentTransform
            addModifier o (Mirror mirror_axis:1 copy:true Mirror_Offset:offset)

        )

        exportFile (save_dir + (getFileNameFile f) + ".obj") #noPrompt
    )
)

cherepushka

Пользователь сайта
Рейтинг
2
Владислав, огромное спасибо. Но ничего не происходит.

Владислав Бодюл

Активный участник
Рейтинг
15
Изменено: 4 #11
Вот должно работать
(
    local src_files = getFiles "C:\models\*.step"
    local save_dir = "C:\models\slice\\"
    for f in src_files do
    (
        resetMaxFile #noPrompt
        importFile f #noPrompt

        for o in geometry do
        (
            addModifier o (SliceModifier slice_type:2)

            currentTransform = o.transform
            o.transform = matrix3 1
            offset = o.max.y * 2.0
            o.transform = currentTransform
            --resetXForm o
            addModifier o (Mirror mirror_axis:1 copy:true offset:offset)
        )

        exportFile (save_dir + (getFileNameFile f) + ".obj") #noPrompt
    )
)
Если отзеркаленая копия объекта будет находится слишком далеко (у меня такое случалось с некоторыми объектами), тогда нужно применить ResetXForm. Для этого необходимо раскомментировать эту строку:
--resetXForm o

cherepushka

Пользователь сайта
Рейтинг
2
УРАААААА, Заработало! Спасибо, Спасибо, Спасибо и еще раз Спасибо.
Владислав, скажите пожалуйста, Вы учились по справке?
В справке нет примеров - это меня расстраивает. В коде всё понятно, но вот эта строчка до меня не доходит
o.transform = matrix3 1

cherepushka

Пользователь сайта
Рейтинг
2
Я сейчас углубляюсь в процесс и решил поворачивать Slice - Plane вокруг оси X. Как правильно в этом коде разместить Slice_Plane.rotation = quat 90 [1, 0, 0] ?
Т.е. сначала повернуть Plane, а потом обрезать.
Спасибо.

cherepushka

Пользователь сайта
Рейтинг
2
addModifier o (SliceModifier
Slice_Plane.rotation = quat 90 [1, 0, 0]
slice_type:2
)
Вот знаю, что неправильно. Но порядок такой.
Рейтинг
31
sl = (SliceModifier slice_type:2)
sl.Slice_Plane.rotation = (quat 90 [1, 0, 0])
addModifier o sl
cherepushka, у меня большое подозрение, что ты не пользуешься MAXScript Listener. (F11 при дефолтной раскладке). Там можно увидеть сообщения об ошибках в скриптах. Рекомендую.

Владислав Бодюл

Активный участник
Рейтинг
15
cherepushkaВладислав, скажите пожалуйста, Вы учились по справке?
По началу читал это: http://www.scriptattack.com/theory/theory.html. Там и видео есть. А потом учил в основном только по оф. хелпу.

cherepushkaВ коде всё понятно, но вот эта строчка до меня не доходит
o.transform = matrix3 1
Я не очень умею объяснять. Но если в кратце, то эта строка сбрасывает трансформацию объекта, задав единичную матрицу в качестве матрицы трансформации объекта. В результате перемещает объект в начало координат, обнуляет углы поворота и задаёт масштаб равный [1,1,1] т.е 100% по всем осям. Возможно это не самый лучший способ, но это первое что мне пришло в голову. Всё это необходимо для более точного вычисления значения для параметра offset. После того как значение было получено, объект был трансформирован обратно.

cherepushkaaddModifier o (SliceModifier
Slice_Plane.rotation = quat 90 [1, 0, 0]
slice_type:2
)
Вот знаю, что неправильно. Но порядок такой.
Как-то так:
addModifier o (SliceModifier slice_type:2)
o.slice_plane.rotation = quat 90 [1, 0, 0]
или в углах Эйлера может будет удобней
o.slice_plane.rotation = EulerAngles 90 0 0

cherepushka

Пользователь сайта
Рейтинг
2
Black Sphinx
sl = (SliceModifier slice_type:2)
sl.Slice_Plane.rotation = (quat 90 [1, 0, 0])
addModifier o sl
cherepushka, у меня большое подозрение, что ты не пользуешься MAXScript Listener. (F11 при дефолтной раскладке). Там можно увидеть сообщения об ошибках в скриптах. Рекомендую.
Black Sphinx, спасибо,
Нет, туда я заглядываю (Shift Enter), но когда код ошибки мне не понятен, тогда я в ступоре.

cherepushka

Пользователь сайта
Рейтинг
2
Владислав Бодюл, большое спасибо. Буду дальше экспериментировать.

cherepushka

Пользователь сайта
Рейтинг
2
Почему-то ерунда получается какая-то. На чайниках проверил, всё без проблем. Mirror применяется к отдельным объектам и относительно своих Pivot point. Почему когда делаю вручную эти же операции, зеркалит правильно, а с кодом так?
Спасибо.
На всякий случай. Во вложении primer.max - то, что в итоге хочу добиться (сделал вручную, чтобы в стэке было видно ), а error.obj - то, что получается со скриптом.
sl = (SliceModifier slice_type:2)
            sl.Slice_Plane.rotation = (quat 90 [0, 1, 0]) -- поворачиваю вокруг оси Y
            addModifier o sl

            currentTransform = o.transform
            o.transform = matrix3 1
            offset = o.max.x * 2.0
            o.transform = currentTransform
            --resetXForm o
            addModifier o (Mirror mirror_axis:0 copy:true offset:offset) -- копия по оси X

Вложения

Рейтинг
31
У тебя пивоты объектов не по центру объектов.
Попробуй так:
(
   for o in selection do (
     CenterPivot o
     resetXForm o
     sl = (SliceModifier slice_type:2)
     sl.Slice_Plane.rotation = (quat 90 [0, 1, 0]) -- поворачиваю вокруг оси Y
     addModifier o sl
     addModifier o (Mirror mirror_axis:0 copy:true offset:offset) -- копия по оси X
   )
)