MAXScript学习笔记(4) 功能:实用工具

一.替换模型

功能:将场景中的一个或者多个模型替换为另一个模型

应用场合: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()实现的多选物体的效果。

效果:

替换前:

替换后

还不会渲染.....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章