Render.ru

MaxScript Macros

cherepushka

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

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

Активный участник
Рейтинг
15
#2
но когда пишу
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
#3

cherepushka

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

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

Активный участник
Рейтинг
15
#5
Код:
(
    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
#6
Спасибо большое за помощь новичку.
А почему я не могу сделать так - применить два модификатора к объекту?
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:eek:ffset)
)

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

cherepushka

Пользователь сайта
Рейтинг
2
#8
Код:
(
    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
#9
Просто не задано значение для переменной 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
    )
)
 

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

Активный участник
Рейтинг
15
#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
#12
УРАААААА, Заработало! Спасибо, Спасибо, Спасибо и еще раз Спасибо.
Владислав, скажите пожалуйста, Вы учились по справке?
В справке нет примеров - это меня расстраивает. В коде всё понятно, но вот эта строчка до меня не доходит
o.transform = matrix3 1
 

cherepushka

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

cherepushka

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

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

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

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

addModifier 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
#17
Код:
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
#19
Почему-то ерунда получается какая-то. На чайниках проверил, всё без проблем. 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
#20
У тебя пивоты объектов не по центру объектов.
Попробуй так:
Код:
(
   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
   )
)
 
Сверху