创建自定义函数
函数创建语法为:
<function_def>::=[mapped](function / fn)<name> {<parameter>}=<expr>函数的定义以关键字function 或fn 开始,
后面紧跟着函数名,
然后是函数定义需要的参数序列,
“=”号表示函数定义的开始,函数定义语句必须用一对括号括起来,即使函数定义语句只有一行。
fn subtract x y = ( x-y ) subtract 14 2function sign val: 0 = ( if val == 0 then messageBox("Equal to 0") --等于0 else if val > 0 then messageBox("Bigger than 0") --大于0 else messageBox("Less than 0") --小于0 ) sign val: 0 --Equal to 0 sign val: -5 --Less than 0 sign val: 5 --Bigger than 0如果想定位一个脚本函数的源脚本文件,可以用 showSource() 函数,
showSource <fn>
函数变量
当用户定义一个函数时,在MAXScript 内部依次发生以下事件:
函数定义表达式<expr>被求值,创建一个函数值。
函数<name>作为一个新变量被声明。
函数值被赋给新变量。
函数值作为函数定义表达式的值返回。
fn saddle x y = sin x * sin y fn sombrero x y = cos(x^2 + y^2)/(1 +(x^2 + y^2)) print(saddle 1 1)
fn funcA which = ( if which == 1 then fn saddle x y = sin x * sin y else fn sombrero x y = cos(x^2 + y^2)/(1 +(x^2 + y^2)) ) myfunc=funcA 2 z=myfunc 10 10
函数参数
fn getXYZset val = ( val.x=random -100 100 val.y=random 100 100 val.z=random val.x val.y ) v1=[0,0,0] v4=v1 -- 此处,v1 v4 引用的是同一个值,因此下面getXYZset v1 v4时候返回的值是相同的, getXYZSet v1 format "v1= %; v4= %\n" v1 v4 getXYZSet v4 format "v1= %; v4= %\n" v1 v4 v5 = copy v1 -- v5 作为v1的副本调用,此时v1 v5引用的是不同的值 getXYZSet v1 format "v1= %; v5= %\n" v1 v5 ----------------以下为返回结果---------------------- getXYZset() [0,0,0] [0,0,0] -25.3909 v1= [-57,100,-25.3909]; v4= [-57,100,-25.3909] OK 49.2024 v1= [43,100,49.2024]; v4= [43,100,49.2024] OK [43,100,49.2024] [43,100,49.2024] 65.0695 v1= [-24,100,65.0695]; v5= [43,100,49.2024] OK
return 表达式
返回一个值,
如在运行一个函数时遇到return 语句,函数会马上退出,并返回<expr>指定的值
return <expr>
fn zz = --定义一个函数 ( return 0 --返回值 ) zz() --调用函数 ----------------以下为返回结果---------------------- zz() 0
函数调用的优先级
一个函数调用优先级比操作数低,而比数学表达式、比较表达式、逻辑表达式要高,这意味着在将函数的变量用括号括起来时必须非常小心。
例如:
sin x+1 的求值顺序为(sinx)+1
必须把形式为表达式的变量用括号括起来,
例如:
sin(x+1)
atan2(y-1)(z-1)
时间: 2024-11-03 07:41:46