新手学习笔记,大佬勿笑,有不对的还请指出!!
今天在群里问大佬问题,就是下面GIF 图中的,用 spinner 滑杆来控制 box 的大小,一开始我印象中记的有个词是可以直接把 box.length ,width等属性和 spinner .value实时连起来的(实际没有这么个词)。结果大佬说用 changed ,我想这是土办法啊!(我外行。。。!!) 如下:
rollout sizebox "box"
(
button c "box"
spinner f "length" range:[1,500,30] type:#Integer
Spinner g "height" range:[1,500,30] type:#Integer
spinner h "width" range:[1,500,30] type:#Integer
on c pressed do (
a=box()
a.length = f.value
a.height = g.value
a.width = h.value
)
on f changed val do (
$.length = $.length = f.value
)
on g changed val do (
$.height = $.height = g.value
)
)
createdialog sizebox
这样确实是可以的,但是有个问题,就是如果在修改面板下修了 box 的属性参数,box是变了,但是spinner .value却没有跟着变! 这样就只是有了两个独立控制。
然后大佬就被我搞烦了。。。。
解决不了就只能看书啊,,王华 《3ds MAXScriptjie脚本语言完全学习手册》 看到这章就感觉是这个了。通用事件反馈机制,从外部代码里存取Utility内部变量和控件
不多说还是给例子吧,看的清楚,这个和上面的其实是一样的,只是表现对象从 box 换成了时间轴。
fn f_get_anim_time =
(
testfoo.f_start.value = (animationRange.start as integer)/TicksPerFrame
testfoo.f_end.value = (animationRange.end as integer)/TicksPerFrame
)
callbacks.addscript #animationRangeChange "f_get_anim_time()" id:#f_get_anim_time
Utility testfoo "Time line"(
slider get_time "" range:[1,500,30] orient:#horizontal ticks:1
Spinner f_start "Start:" range:[-99999,99999,((animationRange.start as integer)/TicksPerFrame)] type:#Integer
spinner f_end "end:" range:[-99999,99999,((animationRange.end as integer)/TicksPerFrame)] type:#Integer
on f_start changed val do (
animationRange = interval f_start.value f_end.value
)
on f_end changed val do (
animationRange = interval f_start.value f_end.value
)
)
按上面 box 的例子来的话,spinner changed 只能 改变时间轴动画区间,
animationRange.start animationRange.end
这两个参数,如果是手动按住ctrl + Alt +鼠标左键 拖动时间轴来改变动画区间 start 和 end 。spinner. valve 一样不会变, 一但去动滑杆 ,start 和 end又会跳到 以spinner.value为准了。
而我想要的效果是 当我鼠标拖动时间轴时,spinner 上的 strat 值也会跟着变,同时当我调整滑杆上是 strat 值时间轴也会动。如下图:
列子代码已贴,新手看的不明白,就看看《3ds MAXScriptjie脚本语言完全学习手册》一书中我提到的那两节应该就懂了。