Спасибо igorznag за оперативность!
Очень хитрый способ🙂! Прекрасно работает!
Предполагается, что окно VertexPaint будет открыто, но, конечно, было бы неплохо сделать работу более универсальной и прописать возможность работать с закрытым окном.
Вопрос немного не по этой теме.
Помогите с VertexColors на уровне геометрии.
Какой-то глюк с VertexColors на модификаторе Edit Mesh.
Допустим есть геометрия:
Спасибо igorznag, но setFaceSelection $ 1 #{1..496} - не помогает, хотя непонятно почему(
У меня в сцене на неcколько объектов наброшен модификатор Edit Mesh. И скрипт должен уметь красить выделенный пользователем элемент на уровне модификатора. Соответсвенно мы должны сразу увидеть изменение цвета на уровне модификатора.
Прикладываю пример сценки с "неправильным" модификатором.
Если выделеить все три чайника и выполнить код:
for i in geometry do(
setFaceSelection i 1 #{1..496}
meshop.setFaceColor i 0 #{1..496} red
update i
)
То ничего не произойдет (точнее произойдет, но на уровне base object), НО если его убить и назначить новый, то все начинает работать, непонятно почему! Может быть у вас все заработает с оригинальным модификаторм Edit Mesh и виноваты настройки макса и т.п.
Александр ЯкушевУ меня в сцене на неcколько объектов наброшен модификатор Edit Mesh.
И скрипт должен уметь красить выделенный пользователем элемент на уровне модификатора.
Соответсвенно мы должны сразу увидеть изменение цвета на уровне модификатора
Используем модификатор Unwrap UVW вместо модификатора Edit Mesh.
Teapot radius:25 smooth:on segs:4 body:on handle:on spout:on lid:on mapcoords:on realWorldMapSize:on pos:[0,0,0] isSelected:on
convertToMesh $
$.showVertexColors = on
$.vertexColorType = 0
$.displaybylayer = off
addmodifier $ (Unwrap_UVW())
max modify mode; m=$.modifiers[1]; m.setVC on
for i=1 to m.NumberVertices() do m.SetVertexPosition 0 i [1,1,1]
m.selectFaces #{1..496}; m.faceToVertSelect()
vs=(m.getSelectedVerticesByNode $) as array
c=green; c=[c.r,c.g,c.b]/255
for v in vs do m.SetVertexPosition 0 v c
igorznag c Unwrap UVW, конечно, круто придумано, но нужно именно с Edit Mesh.
Если создать несколько объектов, на них набросить Edit Mesh и вручную красить элементы, то прекрасно работает. Казалось бы, такое простое действие не получается заскриптовать?
Александр ЯкушевКазалось бы, такое простое действие не получается заскриптовать?
Такое простое действие не получается заскриптовать.
Если кнопка для выбора цвета будет видна на экране, тогда можно скриптом "вручную" выполнить это простое действие.
try destroydialog test catch()
rollout test "Test"
(
colorpicker cp_vertex "Vertex Color:" pos:[5,5] color:green
button btn_apply "Apply" pos:[25,30] width:70
on btn_apply pressed do
(
h = windows.getChildHWND #max "Edit Vertex Colors:"
if h!=undefined do
(
hc=windows.getChildrenHwnd h[2]
h_color_swatch=undefined; for c in hc where c[4]=="ColorSwatch" do (h_color_swatch=c[1]; exit)
if h_color_swatch!=undefined do
(
Windows.sendMessage h_color_swatch 0x201 0 0 --Left Mouse Button Down
Windows.sendMessage h_color_swatch 0x202 0 0 --Left Mouse Button Up
h_color_selector = windows.getChildHWND 0 "Color Selector: Vertex Color" parent:#max
if h_color_selector!=undefined do
(
cs_childs=windows.getChildrenHwnd h_color_selector[1]
cs_edits=#(); for c in cs_childs where c[4]=="Edit" do append cs_edits c[1]
if cs_edits.count>=3 do
(
c=cp_vertex.color; cr=((c.r as integer) as string);cg=((c.g as integer) as string); cb=((c.b as integer) as string)
WM_CHAR=0x0102; VK_RETURN= 0x000D
UIAccessor.SetWindowText cs_edits[1] cr
windows.sendMessage cs_edits[1] WM_CHAR VK_RETURN 0 -- press ENTER key
UIAccessor.SetWindowText cs_edits[2] cg
windows.sendMessage cs_edits[2] WM_CHAR VK_RETURN 0 -- press ENTER key
UIAccessor.SetWindowText cs_edits[3] cb
windows.sendMessage cs_edits[3] WM_CHAR VK_RETURN 0 -- press ENTER key
UIAccessor.SendMessageID h_color_selector[1] #IDOK
)--if cs_edits.count>=3 do
)--if h_color_selector!=undefined do
)--if h_color_swatch!=undefined do
)--if h!=undefined do
)--on btn_apply pressed do
); createdialog test 120 55
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
Александр Якушев
Покопался в нете, пока нашел только такую возможность:
Но почему-то выделенные фрагменты красятся в красный. Хотя указывал конкретный цвет:
Помогите разобраться, пожалуйста.
Вложения
igorznag
Если да, тогда можно скриптом нажимать кнопку "Paint All".
У меня получилось так:
Александр Якушев
Очень хитрый способ🙂! Прекрасно работает!
Предполагается, что окно VertexPaint будет открыто, но, конечно, было бы неплохо сделать работу более универсальной и прописать возможность работать с закрытым окном.
Александр Якушев
Помогите с VertexColors на уровне геометрии.
Какой-то глюк с VertexColors на модификаторе Edit Mesh.
Допустим есть геометрия:
Назначим модификатор Edit Mesh:
Далее красим тело чайника:
meshop.setFaceColor $ 0 #{1..496} green update $Суть проблемы:Если тоже самое проделать руками, кроме покраски, затем выделить элемент чайника и покрасить уже кодом
то ничего не происходит!😕
В чем разница?
Вложения
igorznag
Для чего вам нужен модификатор Edit Mesh? Объясните подробнее.
Teapot radius:25 smooth:on segs:4 body:on handle:on spout:on lid:on mapcoords:on realWorldMapSize:on pos:[0,0,0] isSelected:on convertToMesh $ $.showVertexColors = on $.vertexColorType = 0 $.displaybylayer = off addmodifier $ (Edit_Mesh()) setFaceSelection $ 1 #{1..496} meshop.setFaceColor $ 0 #{1..496} green update $Александр Якушев
У меня в сцене на неcколько объектов наброшен модификатор Edit Mesh. И скрипт должен уметь красить выделенный пользователем элемент на уровне модификатора. Соответсвенно мы должны сразу увидеть изменение цвета на уровне модификатора.
Прикладываю пример сценки с "неправильным" модификатором.
Если выделеить все три чайника и выполнить код:
for i in geometry do( setFaceSelection i 1 #{1..496} meshop.setFaceColor i 0 #{1..496} red update i )То ничего не произойдет (точнее произойдет, но на уровне base object), НО если его убить и назначить новый, то все начинает работать, непонятно почему! Может быть у вас все заработает с оригинальным модификаторм Edit Mesh и виноваты настройки макса и т.п.Вложения
igorznag
Teapot radius:25 smooth:on segs:4 body:on handle:on spout:on lid:on mapcoords:on realWorldMapSize:on pos:[0,0,0] isSelected:on convertToMesh $ $.showVertexColors = on $.vertexColorType = 0 $.displaybylayer = off addmodifier $ (Unwrap_UVW()) max modify mode; m=$.modifiers[1]; m.setVC on for i=1 to m.NumberVertices() do m.SetVertexPosition 0 i [1,1,1] m.selectFaces #{1..496}; m.faceToVertSelect() vs=(m.getSelectedVerticesByNode $) as array c=green; c=[c.r,c.g,c.b]/255 for v in vs do m.SetVertexPosition 0 v cАлександр Якушев
Если создать несколько объектов, на них набросить Edit Mesh и вручную красить элементы, то прекрасно работает. Казалось бы, такое простое действие не получается заскриптовать?
igorznag
Если кнопка для выбора цвета будет видна на экране, тогда можно скриптом "вручную" выполнить это простое действие.
try destroydialog test catch() rollout test "Test" ( colorpicker cp_vertex "Vertex Color:" pos:[5,5] color:green button btn_apply "Apply" pos:[25,30] width:70 on btn_apply pressed do ( h = windows.getChildHWND #max "Edit Vertex Colors:" if h!=undefined do ( hc=windows.getChildrenHwnd h[2] h_color_swatch=undefined; for c in hc where c[4]=="ColorSwatch" do (h_color_swatch=c[1]; exit) if h_color_swatch!=undefined do ( Windows.sendMessage h_color_swatch 0x201 0 0 --Left Mouse Button Down Windows.sendMessage h_color_swatch 0x202 0 0 --Left Mouse Button Up h_color_selector = windows.getChildHWND 0 "Color Selector: Vertex Color" parent:#max if h_color_selector!=undefined do ( cs_childs=windows.getChildrenHwnd h_color_selector[1] cs_edits=#(); for c in cs_childs where c[4]=="Edit" do append cs_edits c[1] if cs_edits.count>=3 do ( c=cp_vertex.color; cr=((c.r as integer) as string);cg=((c.g as integer) as string); cb=((c.b as integer) as string) WM_CHAR=0x0102; VK_RETURN= 0x000D UIAccessor.SetWindowText cs_edits[1] cr windows.sendMessage cs_edits[1] WM_CHAR VK_RETURN 0 -- press ENTER key UIAccessor.SetWindowText cs_edits[2] cg windows.sendMessage cs_edits[2] WM_CHAR VK_RETURN 0 -- press ENTER key UIAccessor.SetWindowText cs_edits[3] cb windows.sendMessage cs_edits[3] WM_CHAR VK_RETURN 0 -- press ENTER key UIAccessor.SendMessageID h_color_selector[1] #IDOK )--if cs_edits.count>=3 do )--if h_color_selector!=undefined do )--if h_color_swatch!=undefined do )--if h!=undefined do )--on btn_apply pressed do ); createdialog test 120 55Александр Якушев