MountNodeSet MaxScript        

3ds Max Mount node script.

Should work on most versions.

The old code I had posted here so long ago, I went to use and it did not work! so sorry for that.
This works just fine.

useful for exporting bone tag point information for specific mount locations.

related :

utility MountNodes "Mount Nodes" --width:187 height:166
(
	local lastFile = undefined
	button CreateBtn "Create Node"
	button ExportBtn "Export Nodes"
	
	fn fmin val1 val2 = if val1 < val2 then val1 else val2
	fn getParentOffset parent node = 
	(
		return node.transform.position - parent.transform.position
	)
	fn findObjParent obj =
	(
		local objtmp = obj.parent;
		local last = objtmp ;
		while(objtmp != undefined) do
		(
			last = objtmp
			objtmp = objtmp.parent
		)
		
		return last
	)
	fn findParents list =
	(
		local parentList = #();
		
		for n in list do 
		(
			gotit = false
			parent = findObjParent n
			
			for p in parentList do
			(
				if p == parent then
				(
					gotit = true
					break
				)				
			)
			
			if(gotit == false) then
				append parentList parent
		)
		
		return parentList
	)
	fn makeNode node =
	(
		-- pick shortest plane
		size = node.min
		len = fmin size.x size.y
		len = fmin size.z len

		object = dummy length:len width:len height:len
		object.pivot = object.center
		object.parent = node
		object.name = node.name + "_Mount"
		object.position = node.transform.position
		object.scale = node.transform.scale
		setUserProp object "MountNode" "true"
		
--		format "MountNode property status: %\n" (getUserProp object "MountNode")
		
		select object
		
		format "Added Object: % %\n" object.name (getParentOffset node object)
	)
	fn recurseSceneNodes scene = 
	(	
		local tmpList = #();
		
		for obj in objects do -- ALL OBJECTS IN SCENE
		(
			if(obj != undefined) then
			(
				enabled = getUserProp obj "MountNode"
				
				if(enabled == true) then
				(
					format "Object [%] is \"MountNode\" : % Parent Offset: %\n" obj.name enabled 

(getParentOffset obj.parent obj)
					append tmpList obj
				)
			)
		)

		return tmpList
	)
	fn writeMountXml filename parent list =
	(
		xmlFile	= createFile filename

		if(xmlFile == undefined) then
		(
			format "**** Error opening File: %!\n" filename
			return false
		)	

		format "\tOpened File : %\n" filename
		
		format "<MountNodes parent=\"%\">\n" parent.name to: xmlFile;
			
		for obj in list do
		(
			if((findObjParent obj.parent) != parent and obj.parent != parent) then
			(
				format "skipping write object % for parent % not %\n" obj.name obj.parent.name parent.name
				continue
			)	
				
			offset = getParentOffset obj.parent obj
			format "\t<Node name=\"%\" parent=\"%\" pos=\"% % %\" rot=\"% % % %\"/>\n" \
				obj.name obj.parent.name offset.x offset.y offset.z obj.rotation.x obj.rotation.y obj.rotation.z 

obj.rotation.w to: xmlFile;
			format "write object % for parent %\n" obj.name parent.name
		)
		format "</MountNodes>\n" to: xmlFile;
					
		flush xmlFile
		close xmlFile	
		
		format "Done writing %\n" filename
		
		return true
	)
	fn doExport node objList =
	(
		tryfile = (node.name + ".mounts.xml")
	--	if(lastFile != undefined) then
	--		tryfile=lastFile
			
		filename = getSaveFileName types:"Mount Node XML(*.xml)|*.xml|" filename:tryfile initialDir:"$scripts" 

historyCategory:"xml"

		if(filename == undefined) then
		(
			format "filename Undefined: %\n" filename
			return false
		)
		
		lastFile=filename
		
		format "saving xml to: %\n" filename
		
		return writeMountXml filename node objList
	)
	on CreateBtn pressed do
	(
		if(selection[1] != undefined) then
		(	
			format "User pressed Create Node with % as parent\n" selection[1].name
			makeNode selection[1]
		)			
		else
		(
			format "User pressed Create Node without item selected\n"
		)
	)	
	on ExportBtn pressed do
	(
		format "Exporting Nodes\n"
		tmpList = recurseSceneNodes "none"
		
		if(tmpList.count == 0) then
		(
			format "No MountNodes in the scene."
			MessageBox "You should have mount nodes in scene to export before clicking this button." 

title:"knucklehead"
		)
		parentList = findParents tmpList
		
		if(parentList.count > 0) then
		(
			format "Found % parent available for export\n" parentList.count
			for node in parentList do 
			(
				ret = doExport node tmpList
				
				if(ret == false) then
				(
					MessageBox "Failed to export check log." title:"Error"
				)
			)
		)
	)
)


Badguy 02:28, 18 November 2006 (CST)