/********************************************************************** This script is provided as part of the Daz Script Documentation. The contents of this script, and\or any portion thereof, may only be used in accordance with the following license: Creative Commons Attribution 3.0 Unported (CC BY 3.0) - http://creativecommons.org/licenses/by/3.0 To contact Daz 3D or for more information about Daz Script visit the Daz 3D website: - http://www.daz3d.com **********************************************************************/ // Source: /public/software/dazstudio/4/referenceguide/scripting/api_reference/samples/file_io/export_triax_poser/start // Create an instance of the actions object var g_oActions = new DsActions; /*********************************************************************** ***** DsActions Prototype ***** ***********************************************************************/ function DsActions() { } /***********************************************************************/ DsActions.superclass = Object; /*********************************************************************/ // void : A method to get the name of the current uv set DsActions.prototype.getUVSetName = function( oSkeleton ) { // Create a variable to capture the final uv set name var sUVSet = ""; // If we do not have a skeleton if( !oSkeleton ){ // We have nothing to do... return sUVSet; } // Get the object for the skeleton var oObject = oSkeleton.getObject(); // If we do not have an object if( !oObject ){ // We have nothing to do... return sUVSet; } // Get the shape for the skeleton var oShape = oObject.getCurrentShape(); // If we do not have a shape if( !oShape ){ // We have nothing to do... return sUVSet; } // Let the user know we are busy setBusyCursor(); // Get all of the materials for the shape var aMaterials = oShape.getAllMaterials(); var oMaterial = undefined; var oProperty = undefined; // Iterate over all of the materials for( var i = 0; i < aMaterials.length; i += 1 ){ // Get the 'current' material oMaterial = aMaterials[ i ]; // Get the uv set property oProperty = oMaterial.getUVSetControl(); // If we haven't captured the name of a uv set yet if( sUVSet.isEmpty() ){ // Capture the name of the uv set sUVSet = oProperty.getStringValue(); // If the name of the uv set is not the same as the one we've captured } else if( sUVSet != oProperty.getStringValue() ) { // Let the user know we are done clearBusyCursor(); // Inform the user of the situation MessageBox.information( String("Not all surfaces on \"%1\" are set to the \"%2\" UV Set.") .arg( oSkeleton.getLabel() ).arg( sUVSet ), "UV Set Mismatch", "&OK" ); // Generate a universally unique name for the uv set sUVSet = App.createUuid().replace( /[{|}]/ig, "" ); // We are done here... break; } } // Let the user know we are done clearBusyCursor(); // Return the name of the uv set return String("%1 UV").arg( sUVSet ); } /*********************************************************************/ // String : A method to export the geometry of the specified figure DsActions.prototype.exportGeometry = function( oSkeleton, sRuntimeBasePath, sUVSet ) { // Create a variable to capture the final export path var sPath = ""; // If we do not have a skeleton, a valid runtime path or a valid uv set name if( !oSkeleton || !sRuntimeBasePath || sRuntimeBasePath.isEmpty() || !sUVSet || sUVSet.isEmpty() ){ // We have nothing to do... return sPath; } // Get the export manager var oExportMgr = App.getExportMgr(); // Define the class name the for Wavefront Object (*.obj) exporter var sClassName = "DzObjExporter"; // Find the exporter var oExporter = oExportMgr.findExporterByClassName( sClassName ); // If the exporter exists if( oExporter ){ // Get the action manager var oActionMgr = MainWindow.getActionMgr(); // Find the action that zeros the figure var oAction = oActionMgr ? oActionMgr.findAction( "DzZeroFigureAction" ) : undefined; // If we found the action if( oAction ){ // Make the action do its thing oAction.trigger(); } // Create a settings object var oSettings = new DzFileIOSettings(); // Fill the settings object with the default options from the exporter //oExporter.getDefaultOptions( oSettings ); // Set the desired settings for the exporter //oSettings.setStringValue( "Preset", "Poser (1 unit = 8ft)" ); oSettings.setFloatValue( "Scale", 243.84 ); oSettings.setStringValue( "LatAxis", "X" ); oSettings.setStringValue( "VertAxis", "Y" ); oSettings.setStringValue( "DepthAxis", "Z" ); oSettings.setBoolValue( "InvertLat", false ); oSettings.setBoolValue( "InvertVert", false ); oSettings.setBoolValue( "InvertDepth", false ); oSettings.setBoolValue( "RemoveUnusedVerts", false ); oSettings.setBoolValue( "IgnoreInvisible", true ); oSettings.setBoolValue( "WeldSeams", true ); oSettings.setBoolValue( "WriteO", false ); oSettings.setBoolValue( "WriteG", true ); oSettings.setBoolValue( "GroupNodes", false ); oSettings.setBoolValue( "GroupSurfaces", false ); oSettings.setBoolValue( "GroupSingle", false ); oSettings.setBoolValue( "GroupGeom", true ); oSettings.setBoolValue( "WriteVN", false ); oSettings.setBoolValue( "WriteVT", true ); oSettings.setBoolValue( "WriteUsemtl", true ); oSettings.setBoolValue( "WriteMtllib", false ); oSettings.setBoolValue( "CollectMaps", false ); oSettings.setBoolValue( "ConvertMaps", false ); oSettings.setBoolValue( "SelectedOnly", true ); oSettings.setBoolValue( "SelectedRootsOnly", false ); oSettings.setBoolValue( "PrimaryRootOnly", true ); oSettings.setBoolValue( "IncludeParented", false ); oSettings.setIntValue( "RunSilent", 1 ); // Define the relative path var sRelativePath = "Runtime/Geometries/TriAx_Export"; // Get the asset manager var oAssetMgr = App.getAssetMgr(); // Get the compatibility base path for this node var sCompatibilityBasePath = oAssetMgr.getCompatibilityBasePathForNode( oSkeleton ); // If the compatibility base path is not empty if( !sCompatibilityBasePath.isEmpty() ){ sRelativePath += sCompatibilityBasePath; } // Construct the path for the geometry var sGeometryPath = String("%1/%2").arg( sRuntimeBasePath ).arg( sRelativePath ); // Make sure the path exists, create it if it doesn't var oDir = new DzDir( sRuntimeBasePath ); oDir.mkpath( sRelativePath ); // Construct the suggested path var sInitialPath = String( "%1/%2 %3.%4" ) .arg( sGeometryPath ) .arg( oSkeleton.name ) .arg( sUVSet ) .arg( oExporter.getExtension() ); // Prompt the user to choose a file, use the exporter // to build the title bar caption and the filter sPath = FileDialog.doFileDialog( false, String( "Custom Export : %1 : %2" ) .arg( oExporter.getDescription() ) .arg( oSettings.getStringValue( "Preset" ) ), sInitialPath, String( "%1 (*.%2)" ) .arg( oExporter.getDescription() ) .arg( oExporter.getExtension() ) ); // If the user did not cancel if( sPath ){ // Write the file using the options specified oExporter.writeFile( sPath, oSettings ); } // If the exporter doesn't exist } else { // Inform the user MessageBox.critical(String("The \"%1\" class does not exist.").arg( sClassName ), "Critical Error", "&OK"); } // Return the path for the geometry return sPath; } /*********************************************************************/ // void : DsActions.prototype.exportRigging = function( oSkeleton, sRuntimeBasePath, sGeometryPath, sUVSet ) { // If we do not have a skeleton or a valid geometry path if( !oSkeleton || !sGeometryPath || sGeometryPath.isEmpty() ){ // We have nothing to do... return; } // Get the export manager var oExportMgr = App.getExportMgr(); // Define the class name the for Poser Character (*.cr2) exporter var sClassName = "DzCr2Exporter"; // Find the exporter var oExporter = oExportMgr.findExporterByClassName( sClassName ); // If the exporter exists if( oExporter ){ // Initialize the export mode to base figure var sMode = "FigureBase"; // If the figure is fit to another figure if( oSkeleton.getFollowTarget() ){ // Change the export mode to conforming figure sMode = "FigureConforming"; } // Create a settings object var oSettings = new DzFileIOSettings(); // Fill the settings object with the default options from the exporter //oExporter.getDefaultOptions( oSettings ); oSettings.setIntValue( "Version", 9 ); oSettings.setBoolValue( "Strict", true ); oSettings.setStringValue( "Mode", sMode ); oSettings.setStringValue( "BasePath", sRuntimeBasePath ); oSettings.setStringValue( "GeometrySource", sGeometryPath ); oSettings.setBoolValue( "SavePMD", false ); oSettings.setBoolValue( "UseExp", false ); //oSettings.setStringValue( "ExpPath", "" ); //oSettings.setStringValue( "ExpFigureID", "" ); oSettings.setBoolValue( "CollectFiles", false ); //oSettings.setBoolValue( "CollectInZip", false ); //oSettings.setBoolValue( "CollectInBasePath", false ); oSettings.setIntValue( "RunSilent", 1 ); // Get the last path for the exporter var sExporterPath = oExportMgr.getExportPath(); // If the path is empty if( sExporterPath.isEmpty() ){ // Define the relative path var sRelativePath = "Runtime/libraries/Character"; // Make sure the path exists, create it if it doesn't var oDir = new DzDir( sRuntimeBasePath ); oDir.mkpath( sRelativePath ); // Default to the character directory of the specified runtime sExporterPath = String("%1/%2").arg( sRuntimeBasePath ).arg( sRelativePath ); } // If we've got a skeleton, construct the path using the // exporter's last path, the skeleton's name, and the // exporter's extension... // Otherwise, just use the exporter's last path var sInitialPath = ( String( "%1/%2 - %3.%4" ) .arg( sExporterPath ) .arg( oSkeleton.name ) .arg( sUVSet ) .arg( oExporter.getExtension() ) ); // Prompt the user to choose a file, // use the exporter to build the title bar caption, // the initial path and the filter var sPath = FileDialog.doFileDialog( false, String( "Custom Export : %1 : %2" ) .arg( oExporter.getDescription() ) .arg( oSettings.getStringValue( "Preset" ) ), sInitialPath, String( "%1 (*.%2)" ) .arg( oExporter.getDescription() ) .arg( oExporter.getExtension() ) ); // If the user did not cancel if( sPath ){ // Write the file using the options specified oExporter.writeFile( sPath, oSettings ); } // If the exporter doesn't exist } else { // Inform the user MessageBox.critical(String("The \"%1\" class does not exist.").arg( sClassName ), "Critical Error", "&OK"); } } /*********************************************************************/ // void : DsActions.prototype.begin = function() { // Define some common strings for error messages var sTitle = "Selection Error"; var sMessage = "A TriAx Weight Mapped figure must be selected to continue."; var sButton = "&OK"; // Get the primary selection var oNode = Scene.getPrimarySelection(); // If no node is selected if( !oNode ){ // Inform the user MessageBox.information(sMessage, sTitle, sOk); // We have nothing left to do... return; } // If the selected node is a bone if( oNode.inherits( "DzBone" ) ){ // We want the skeleton for that bone oNode = oNode.getSkeleton(); } // If the node is not a weight mapped figure if( !oNode.inherits( "DzFigure" ) ){ // Inform the user MessageBox.information( sMessage, sTitle, sButton ); // We have nothing left to do... return; } // Get the content manager var oContentMgr = App.getContentMgr(); // Get the first mapped Poser directory var sRuntimeBasePath = oContentMgr.getPoserDirectoryPath( 0 ); // Get the name of the current uv set var sUVSet = this.getUVSetName( oNode ); // Export the geometry for the selected figure var sGeometryPath = this.exportGeometry( oNode, sRuntimeBasePath, sUVSet ); // Export the rigging for the selected figure this.exportRigging( oNode, sRuntimeBasePath, sGeometryPath, sUVSet ); } /*********************************************************************/ g_oActions.begin();