History: MountNodeSet MaxScript
Source of version: 4 (current)
Copy to clipboard
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 :
* ((Tools: 3DSMax|#MountNodeSet MaxScript|Overview))
* ((Using MountNode Xml))
{CODE(wrap="1",colors="maxscript")}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"
)
)
)
)
){CODE}
((User:Badguy|Badguy)) 02:28, 18 November 2006 (CST)