Render.ru

Вопросы по Max Script (всего понемногу)

Belprof

Пользователь сайта
Рейтинг
2
Большое спасибо за отклик и помощь,
вопрос как раз в том в каом виде, формате и куда предоставлять данные для анимации,
это не единичный массив, а потоковые данные с 20 - 30 девятиосевых датчиков мокап системы, обработанные альфа бета фильтром и произведенными вычислениями абсолютных координат на контроллерах и последующая концентрация данных в общем контроллере,
как вариант - запись анимации через юсб комп мыши(запись анимации мыши), но там две координаты , или через вход клавиатуры, но пока не ясно будет ли достаточной скорость прохождения данных
в данном случае передаетя три координаты, может еще какой способ есть?

с примером из хелпа еще не разбирался, переводчик не срабатывает почему то
 
Последнее редактирование:

Belprof

Пользователь сайта
Рейтинг
2
система мокапа в процессе отладки основной конструкции и разработки передачи данных, поэтому ищем варианты
 

Игорь Видлацкий (Stalker_Lom)

Платиновый спонсор
Рейтинг
152
Вечер добрый.
Не в первый раз решил осваивать скрипты - подаётся так себе. Есть скрипт:

macroScript Bridge
category: "SLScripts"
tooltip: "Bridge selected edges"
(
selection.bridgeSelected = 1
selection.EditablePoly.Bridge ()
)

скрипт рабочий - но не у меня. Ошибка следующая:
>> MAXScript MacroScript Error Exception:
-- Unknown property: "EditablePoly" in $selection <<

Макс 2016 SP2. До этого были странные ошибки с другими примитивными скриптами: "ожидается действие или функция", но то излечилось методом тыка неведомым образом. Не подскажете, я тупой или лыжи реально не едут?
 

igorznag

Мастер
Рейтинг
103
igorznag, к сожалению, что так, что так - ошибка та же.
Вы выделяете один объект или несколько объектов? Объект является Editable Poly?
Если выделено несколько объектов, тогда нужно использовать первый вариант.
Предоставьте короткое видео или пару скринов, чтобы я увидел ошибку.
Временно запускайте скрипты напрямую (без макроскрипта) и откройте окно MaxScript Listener.

3.jpg ________ 4.jpg
 

d1myan

Пользователь сайта
Рейтинг
2
Добрый день.
Есть команда Editable Poly, которая, может при своем некрасивом оформлении, вроде срабатывает хорошо
Код:
do ($.EditablePoly.Bridge ()) or ($.EditablePoly.ConnectEdges ())
если выделены открытые грани - то срабатывает Bridge, если закрытые - то срабатывает Connect

Подскажите - как такое реализовать в Edit Poly:
Последнее на чем я остановился:
Код:
(
  $.modifiers[#Edit_Poly].ButtonOp #ConnectEdges
  if ($.modifiers[#Edit_Poly].bridgeselected != undefined) do
  (
    res = $.modifiers[#Edit_Poly].ButtonOp #BridgeEdge
  )
)
На "Варианте слева на картинке" срабатывает, а "на варианте справа" вместо Bridge происходит Connect.
Понимаю, что в условии написана какая-то ерунда, но не знаю - как правильно
 

Вложения

  • 53,5 КБ Просмотров: 408
  • 55 КБ Просмотров: 392
Последнее редактирование:

igorznag

Мастер
Рейтинг
103
Пример:
Код:
co=modPanel.getCurrentObject()
if classof co==Editable_Poly do
(
    es=polyop.getedgeselection co; oe=polyop.getOpenEdges co
    if (es*oe).numberSet>0 then co.Bridge () else co.ConnectEdges ()
)

if classof co==Edit_Poly do
(
    es=co.GetSelection #Edge; co.ConvertSelection #Edge #Border
    oe=co.GetSelection #Edge
    co.Select #Edge oe invert:true; co.Select #Edge es
    if (es*oe).numberSet>0 then co.ButtonOp #BridgeEdge
    else co.ButtonOp #ConnectEdges
)
 

Вложения

  • 144,4 КБ Просмотров: 451
  • 111,5 КБ Просмотров: 429

KoL'T

Знаток
Рейтинг
49
Пример:
Код:
co=modPanel.getCurrentObject()
if classof co==Editable_Poly do
(
    es=polyop.getedgeselection co; oe=polyop.getOpenEdges co
    if (es*oe).numberSet>0 then co.Bridge () else co.ConnectEdges ()
)

if classof co==Edit_Poly do
(
    es=co.GetSelection #Edge; co.ConvertSelection #Edge #Border
    oe=co.GetSelection #Edge
    co.Select #Edge oe invert:true; co.Select #Edge es
    if (es*oe).numberSet>0 then co.ButtonOp #BridgeEdge
    else co.ButtonOp #ConnectEdges
)
Я делал через проверку геометрии на изменение полигонов.
Вот ссылка на скрипт:
https://yadi.sk/d/cHa2iiC_32iw8B
 

igorznag

Мастер
Рейтинг
103
Я делал через проверку геометрии на изменение полигонов.
Понятно. Тогда будет так:
Код:
co=modPanel.getCurrentObject()
if classof co==Editable_Poly do
(
    if not co.Bridge() do co.ConnectEdges ()
)

if classof co==Edit_Poly do
(
    n1=co.GetNumFaces(); co.ButtonOp #BridgeEdge
    n2=co.GetNumFaces()
    if n2==n1 do co.ButtonOp #ConnectEdges
)
 

d1myan

Пользователь сайта
Рейтинг
2
Супер! Спасибо)) уже 2й раз меня выручаете, не могу найти как - вам кармы добавить.
Я в максскрипте еще профан., но очень интересна эта тема.
С английским не дружу, нашел книгу на русском "Основы 3ds Max 8 Maxscript", Help - пытаюсь переводить в гугл переводчике.
Может вы посоветуете еще какую русскую литературу - с чего можно начать?
 
Последнее редактирование:

KoL'T

Знаток
Рейтинг
49
Супер! Спасибо)) уже 2й раз меня выручаете, не могу найти как - вам кармы добавить.
Я в максскрипте еще профан., но очень интересна эта тема.
С английским не дружу, нашел книгу на русском "Основы 3ds Max 8 Maxscript", Help - пытаюсь переводить в гугл переводчике.
Может вы посоветуете еще какую русскую литературу - с чего можно начать?
Очень полезный сайт по Maxscript
http://scriptattack.com/theory/theory.html
 

d1myan

Пользователь сайта
Рейтинг
2
Подскажите еще со скриптом отключения и включения слоев:
Нашел на scriptspot.com такой скрипт
Код:
(
    for i = 0 to (layermanager.count - 1) do     -- loops through all the layers in the scene
    (
        x = layermanager.getlayer i              -- gets layer
        test = x.name as string                  -- applies the name of layer to test
        location = findString test "ref"         -- finds "ref" in layer name, output 1 if present
        if location == 1 do                      -- if ref is present in the layer name at the begining, 1 then
        (
        if x.on == true then x.on = false  -- the layer x is on, then turn it off
        else x.on = true                   -- the layer x is off, then turn it on. A toggle on/off really                     
        )                                   -- end if
    )                                            -- end loop
)
Он отключает слой с началом названия в примере "ref". Но если в сцене несколько таких слоев и некоторые включены, а некоторые выключены, то он включенные - отключает, а выключенные - включает.
Возможно ли изменить: чтобы если некоторые включены- то он все выключил, а следующим нажатием все включил?
 
Последнее редактирование:

igorznag

Мастер
Рейтинг
103
Возможно ли изменить: чтобы если некоторые включены- то он все выключил, а следующим нажатием все включил?
Код:
(
    layers_ref=#(); layers_ref_true_count=0
    for i = 0 to (layermanager.count - 1) do   
    (
        x = layermanager.getlayer i; test = x.name as string                 
        location = findString test "ref"       
        if location == 1 do                     
        (
            append layers_ref x; if x.on == true do layers_ref_true_count+=1
        )-- if location == 1 do                                 
    )-- for i = 0 to (layermanager.count - 1) do                                           
  
    for x in layers_ref do if layers_ref_true_count>0 then x.on=false else x.on=true
)
 

Wandererkz

Пользователь сайта
Рейтинг
2
Привет. Как написать скрипт, который:
Код:
Просмотреть все слои
если в слое количество мешей  == 1
(
    переименовать меш по названию слоя
    переместить этот меш в нулевой слой
    удалить слой
)
    другое если количество мешей > 1
(
    в начале имени названию меша добавит название слоя
)
иначе (удалит слой)
все что я осилил пока, только это.
Код:
for i = 0 to (layermanager.count - 1) do  
(
    _sl = layermanager.getlayer i
    _slname = _sl.name as string
    _slnode = _sl.getNumNodes()   
    if _slnode == 1 do                    
    (
        format "Layer: %; nodes: %\n" _slname _slnode
    )                      
)
Как работать с имеющимися мешами в слоях не понял.
 

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

Активный участник
Рейтинг
15
Привет. Как написать скрипт, который:
Просмотреть все слои
если в слое количество мешей == 1
(
переименовать меш по названию слоя
переместить этот меш в нулевой слой
удалить слой
)
другое если количество мешей > 1
(
в начале имени названию меша добавит название слоя
)
иначе (удалит слой)
Код:
for i = layerManager.count-1 to 1 by -1 do
(
    ilayer = layerManager.getLayer i
    layerName = ilayer.name
    layer = ILayerManager.getLayerObject i
    layer.nodes &layerObjects
  
    if layerObjects.count > 0 then
    (
        if layerObjects.count > 1 then
        (
            for o in layerObjects where not matchPattern o.name pattern:(layerName + "_*") do
            (
                o.name = (layerName + "_" + o.name)
            )
        )
        else
        (
            (layerManager.getLayer 0).addNode layerObjects[1]
            LayerManager.deleteLayerByName layer.name
        )
    )
    else
    (
        LayerManager.deleteLayerByName layer.name
    )
)
 

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

Активный участник
Рейтинг
15
Спасибо, прекрасно работает.
Ой, забыл добавить переименование объекта по названию слоя, перед добавлением в нулевой слой.

Нужно перед строкой
Код:
(layerManager.getLayer 0).addNode layerObjects[1]
добавить

Код:
layerObjects[1].name = layer.name
 

Belprof

Пользователь сайта
Рейтинг
2
добрый день,
подскажите можно ли из макса с помощью макс скрипт напрямую обращаться к базам данных
типа таблицы mysql, не обычные файлы (filestream) ,а постоянно меняющийся поток данных изменяющихся координат объекта?
 
Сверху