一.替换模型
功能:将场景中的一个或者多个模型替换为另一个模型
应用场合:Revit中无法实现的内容,用3dmax模型替换来实现。
具体场景:监狱的金属栅栏,包括水平着的头顶上的金属栅栏。当前Revit技术能力有限,无法在Revit中是实现,但是3dmax中就有很多这种的铁丝网。
核心替换代码是:
group "替换"
(
pickbutton pbSource "Source" pos:[10,120,0] width:110
on pbSource picked obj do
(
rootObj=Common.GetRootNode obj
centerpivot rootObj --有时候需要
source_obj = rootObj --存取 Utility 局部变量
pbSource.text = rootObj.name --存取 Utility 控件
-- select rootObj --场景大的情况下会小卡
)--事件处理程序结束
checkbutton pbTarget "Target" pos:[120,120,0] width:110 --checkbutton结合pickObject()实现多选功能
on pbTarget changed state do
(
if state do
(
pbTarget.enabled = off
target_obj = #()
while isvalidnode (obj = pickObject()) do (
rootObj=Common.GetRootNode obj
appendifunique target_obj rootObj
if target_obj.count == 1 then
(
pbTarget.text = rootObj.name
)
else
(
pbTarget.text = (target_obj.count as string)
)
)
print ("select:"+(target_obj.count as string))
pbTarget.enabled = on
pbTarget.checked = off
)
)
button btnClearSelection "Clear" pos:[230,120,0] width:40
on btnClearSelection pressed do
(
clearSelection()
source_obj=undefined
target_obj=#()
pbTarget.text="Target"
pbSource.text="Source"
)
checkbox cbIsClone "Clone" pos:[270,125,0] width:50 checked:true
checkbox cbIsX "X" pos:[315,125,0] width:20 checked:true
checkbox cbIsY "Y" pos:[340,125,0] width:20 checked:true
checkbox cbIsZ "Z" pos:[365,125,0] width:20 checked:false
button btnReplace "Replace" pos:[390,120,0] width:60
on btnReplace pressed do
(
-- targets=$ as Array --有delete时需要转换成Array
if target_obj ==undefined or target_obj.count == 0 do return undefined
targets=target_obj
print ("replace1:"+(source_obj as string)+"->"+(targets as string ))
newObj=undefined
for target in targets do
(
if target == source_obj do continue
print ("replace2:"+(source_obj as string)+"->"+(target as string ))
-- replaceInstances
-- format "%,%" source_obj t
newObj=source_obj
if cbIsClone.checked do (newObj=copy source_obj)
if cbIsX.checked do (newObj.pos.x=target.pos.x)
if cbIsY.checked do (newObj.pos.y=target.pos.y)
if cbIsZ.checked do (newObj.pos.z=target.pos.z)
-- newObj.pos=t.pos
-- newObj.name=t.name
newObj.parent=target.parent
delete target
)
)
)
界面:
期间比较困扰的问题是如何多选,pickbutton点击一次只能选择一个物体,最后找到一个资料,https://forums.cgsociety.org/t/max-script-help-multi-object-selection-to-pickbutton/1690288/3,用checkbutton结合pickobject()实现的多选物体的效果。
效果:
替换前:
替换后
还不会渲染.....