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)