[maxscript教程] 选择集工具
MaxScriptMAX脚本 4374 58
实名

通过了实名认证的内容创造者

发布于 2018-6-17 15:07:39

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 BruthFrank 于 2018-6-17 15:12 编辑

需求:选择集工具
按实例选择:选择相同实例的对象
按名称选择:选择包含某字符串的对象
按顶点数量选择:选择 小于、等于、大于 指定顶点数的对象(可输入点数时,指定顶点数为输入的值,不可输入顶点数时,指定顶点为当前选择对象的顶点数)
按三角面数选择:选择 小于、等于、大于 指定三角面数的对象(可输入面数时,指定顶点数为输入的值,不可输入面数时,指定面数为当前选择对象的面数)

需求分析:
按需求分成4组功能,在界面上显示;点击对应按钮,执行对应操作。

所需工具:
界面编辑器 Maxscript -> Visual Maxscript Editor,编辑好界面后保存为 选择集工具.ms 打开后可以看到在编辑器中的属性填写和脚本中变量的对应情况。max9的内置编辑器用不惯的可以使用notepad++并添加自定义的maxscript格式文件。
具体操作步骤不再详述,我这里直接给出:
rollout rt_selectBy "Select Tools" width:220
(
        group "By Instance" (
                button btn_sbInstance "Select" width:200
        )
        group "By Name" (
                editText edt_sbName "Name"  text:"" across:2
                button btn_sbName "Select" width:90
        )
        group "By Vertex" (
                checkbox cb_Venable "" across:2
                spinner spn_sbVert "VertexNum:"  range:[0,100000,0] type:#integer width:200 enabled:off offset:[-100,0]
                button btn_sbVertS "<" width:60 across:3
                button btn_sbVertE "=" width:60
                button btn_sbVertB ">" width:60
        )
        group "By Tris" (
                checkbox cb_Fenable "" across:2
                spinner spn_sbFace "TrisNum:" range:[0,100000,0] type:#integer  width:200 enabled:off offset:[-60,0]
                button btn_sbFaceS "<" width:60 across:3
                button btn_sbFaceE "=" width:60
                button btn_sbFaceB ">" width:60
        )



使用maxscript内置编辑器打开后,按ctrl+E执行,发现界面并没有出现,是因为我们缺少调用窗口的代码,在上面代码后面加入

createDialog rt_selectBy style:#(#style_toolwindow,#style_sysmenu)

后,再执行,界面出现了,说明调用成功了。但这只是一个界面,还需要为每个界面上的控件做事件响应。
-----------------------------------------------------------------分割线--------------------------------------------------------------------------------
Maxscript Reference 有的版本叫Maxscript Help 在 Help菜单中查找,max9.0是离线版本,可以在安装目录中找到,较新的版本是在线版本,需要联网。

关于上述脚本中的控件都可以在 帮助文档 中查到使用方法,熟悉这些控件的用法之后,编写简单的界面时,就可以摆脱界面编辑器,手动编写界面布局了。
上述的控件包括:
rollout         卷轴面板,通常作为窗口的载体,也可以作为其它rollout的子卷轴,用法查看AddSubRollout
group          组,没有实际功能,只做界面布局分组用;界面编辑器中对应groupbox,但手动编写布局时,使用group更方便
editText       文本编辑框,做输入框使用
checkbox     复选框
button          按钮
查看这些控件的用法,包括创建参数,默认参数,响应事件的写法。

现在在界面代码和createDialog之间 加入事件脚本:

在 按钮  btn_sbInstance 按下时   做                              
        on btn_sbInstance pressed do (
                tlist = #()                               -- 定义一个数组,用来存放返回的对象
                selArr = $selection as array  -- 选择集一定要先转化成数组,因为选择集是会根据操作随时变化的,而在脚本执行时不希望因为选择集的变化对后续操作造成影响。
                for obj in selArr where isusualObj obj do(              -- isusualObj obj 是一个自定义函数,对对象进行了过滤,不满足条件的对象不会操作。
                        InstanceMgr.GetInstances obj &instances      -- 选择实例对象的核心功能,获得某个对象的实例集合
                        join tlist instances                                            -- 数组的join操作
                )
                clearselection ()                                                        -- 清除当前选择
                select tlist                                                                 -- 选择数组中的对象作为当前选择集
        )


其中 isusualObj obj 是一个自定义函数,放在脚本的最前面,因为要使用他必须在前面已经定义,否则会脚本报错。

--常用公用函数定义
fn isUsualObj obj = (  --是否为常规物体(非bip骨骼,非几何骨骼,可转换为多边形的,未被删除的max对象)
        isValidObj obj and canConvertTo obj Editable_Poly and classof obj.baseobject !=boneGeometry and classof obj.baseobject!=Biped_Object
)


按名称选择,一样的写法,不同的就是那一句

        on btn_sbName pressed do (
                tlist=#()
                for obj in $objects where isUsualObj obj do(
                        if findString obj.name (edt_sbName.text) !=undefined do append tlist obj
                )
                clearSelection ()
                select tlist
        )


按顶点数量选择

        on btn_sbVertS pressed do (
                tlist=#()
                if spn_sbVert.enabled then val = spn_sbVert.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numverts
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numverts < val do append tlist obj
                )
                clearSelection()
                select tlist
        )
        
        on btn_sbVertE pressed do (
                tlist=#()
                if spn_sbVert.enabled then val = spn_sbVert.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numverts
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numverts == val do append tlist obj
                )
                clearSelection()
                select tlist
        )
        
        on btn_sbVertB pressed do (
                tlist=#()
                if spn_sbVert.enabled then val = spn_sbVert.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numverts
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numverts > val do append tlist obj
                )
                clearSelection()
                select tlist
        )


按面数选择

        on btn_sbFaceS pressed do (
                tlist=#()
                if spn_sbFace.enabled then val = spn_sbFace.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numfaces
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numfaces < val do append tlist obj
                )
                clearSelection()
                select tlist
        )
        
        on btn_sbFaceE pressed do (
                tlist=#()
                if spn_sbFace.enabled then val = spn_sbFace.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numfaces
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numfaces == val do append tlist obj
                )
                clearSelection()
                select tlist
        )
        
        on btn_sbFaceB pressed do (
                tlist=#()
                if spn_sbFace.enabled then val = spn_sbFace.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numfaces
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numfaces > val do append tlist obj
                )
                clearSelection()
                select tlist
        )


加入checkbox对spinner的控制
        on cb_Venable changed stat do (
                spn_sbVert.enabled = stat
        )
        
        on cb_Fenable changed stat do (
                spn_sbFace.enabled = stat
        )


可能学过其它程序或脚本的人觉得上述代码过于冗余,有封装简化的空间。但我觉得简化并不代表优化,简化带来的是代码的可读性变差。一般脚本不超过200行,何况这是给初学者看的脚本呢。下面是完整的代码:

--常用公用函数定义
fn isUsualObj obj = (  --是否为常规物体
        isValidObj obj and canConvertTo obj Editable_Poly and classof obj.baseobject !=boneGeometry and classof obj.baseobject!=Biped_Object
)

rollout rt_selectBy "Select Tools" width:220
(
        group "By Instance" (
                button btn_sbInstance "Select" width:200
        )
        group "By Name" (
                editText edt_sbName "Name"  text:"" across:2
                button btn_sbName "Select" width:90
        )
        group "By Vertex" (
                checkbox cb_Venable "" across:2
                spinner spn_sbVert "VertexNum:"  range:[0,100000,0] type:#integer width:200 enabled:off offset:[-100,0]
                button btn_sbVertS "<" width:60 across:3
                button btn_sbVertE "=" width:60
                button btn_sbVertB ">" width:60
        )
        group "By Tris" (
                checkbox cb_Fenable "" across:2
                spinner spn_sbFace "TrisNum:" range:[0,100000,0] type:#integer  width:200 enabled:off offset:[-60,0]
                button btn_sbFaceS "<" width:60 across:3
                button btn_sbFaceE "=" width:60
                button btn_sbFaceB ">" width:60
        )
        
        on cb_Venable changed stat do (
                spn_sbVert.enabled = stat
        )
        
        on cb_Fenable changed stat do (
                spn_sbFace.enabled = stat
        )
        
        on btn_sbVertS pressed do (
                tlist=#()
                if spn_sbVert.enabled then val = spn_sbVert.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numverts
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numverts < val do append tlist obj
                )
                clearSelection()
                select tlist
        )
        
        on btn_sbVertE pressed do (
                tlist=#()
                if spn_sbVert.enabled then val = spn_sbVert.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numverts
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numverts == val do append tlist obj
                )
                clearSelection()
                select tlist
        )
        
        on btn_sbVertB pressed do (
                tlist=#()
                if spn_sbVert.enabled then val = spn_sbVert.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numverts
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numverts > val do append tlist obj
                )
                clearSelection()
                select tlist
        )
---------------------------------------------------------------------------------------------
        on btn_sbFaceS pressed do (
                tlist=#()
                if spn_sbFace.enabled then val = spn_sbFace.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numfaces
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numfaces < val do append tlist obj
                )
                clearSelection()
                select tlist
        )
        
        on btn_sbFaceE pressed do (
                tlist=#()
                if spn_sbFace.enabled then val = spn_sbFace.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numfaces
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numfaces == val do append tlist obj
                )
                clearSelection()
                select tlist
        )
        
        on btn_sbFaceB pressed do (
                tlist=#()
                if spn_sbFace.enabled then val = spn_sbFace.value
                else (
                        if $selection.count>0 then val = $selection[1].mesh.numfaces
                        else return 0
                )
                for obj in $objects where isUsualObj obj do(
                        if obj.mesh.numfaces > val do append tlist obj
                )
                clearSelection()
                select tlist
        )
-------------------------------------------------------------------------------------------------
        on btn_sbName pressed do (
                tlist=#()
                for obj in $objects where isUsualObj obj do(
                        if findString obj.name (edt_sbName.text) !=undefined do append tlist obj
                )
                clearSelection ()
                select tlist
        )
        
        on btn_sbInstance pressed do (
                tlist = #()
                selArr = $selection as array
                for obj in selArr where isusualObj obj do(
                        InstanceMgr.GetInstances obj &instances
                        join tlist instances
                )
                clearselection ()
                select tlist
        )
)

createDialog rt_selectBy style:#(#style_toolwindow,#style_sysmenu)


884325b25f8faba0b5.png
我的帖子不喜欢无意义的自动回复,如有疑问可加好友私聊或留言
使用道具 <
44897lojji  发表于 2018-6-17 17:00:47  
2#
带你赚币带你飞,元素里面有正妹!
回复 收起回复
使用道具
浪迹江湖  发表于 2018-6-17 19:21:00  
3#
带你赚币带你飞,元素里面有正妹!
回复 收起回复
使用道具
LeoLin  发表于 2018-8-24 12:47:22  
4#
感谢分享
回复 收起回复
使用道具
YS界王  发表于 2018-10-17 08:25:22  
5#
感谢分享
回复 收起回复
使用道具
bryi  发表于 2018-10-19 09:13:25  
6#
多谢分享
回复 收起回复
使用道具
peet07  发表于 2018-10-21 22:06:20  
7#
感謝大大
回复 收起回复
使用道具
cs562981849  发表于 2018-10-22 09:26:24  
8#
可以啊给力啊
回复 收起回复
使用道具
zhu386121807  发表于 2018-10-22 09:34:20  
9#

想要成大触,天天上元素!
回复 收起回复
使用道具
GGXRD  发表于 2018-10-22 09:48:55  
10#

感谢分享
回复 收起回复
使用道具
dsglxq  发表于 2018-10-22 09:57:00  
11#
想要成大触,天天上元素!
回复 收起回复
使用道具
建模大人  发表于 2018-10-22 19:34:17  
12#
感谢楼主分享
回复 收起回复
使用道具
fatlong  发表于 2018-10-23 10:57:44  
13#
谢谢分享!
回复 收起回复
使用道具
建模大人  发表于 2018-10-23 20:47:32  
14#
感谢楼主分享
回复 收起回复
使用道具
建模大人  发表于 2018-10-24 12:29:28  
15#
感谢楼主分享
回复 收起回复
使用道具
熙熙1366198610  发表于 2018-10-24 12:34:49  
16#
回复 收起回复
使用道具
Shiva希瓦  发表于 2018-10-24 13:10:03  
17#
很不错
回复 收起回复
使用道具
小凡凡  发表于 2018-10-26 09:44:12  
18#
每天刷存在
回复 收起回复
使用道具
HXDD12  发表于 2018-10-26 11:00:25  
19#
回复 收起回复
使用道具
kavi5000  发表于 2018-11-5 12:13:51  
20#
回复 收起回复
使用道具
123下一页
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表