In build 2.2.2.17, Daz Studio was given the ability to pass an Array of arguments into a DzScript object. This allowed a script to expose remote operation of itself to other scripts, or even plugins, while also allowing the source of that script to remain protected. The type of objects that can be passed in via the arguments Array are limited to basic types; String, Number, Boolean, Array, Object, etc. Below you will find sample code for two scripts; one for a script that remotely executes another script, and one for the script being called.
// Define an anonymous function; // serves as our main loop, // limits the scope of variables (function(){ /*********************************************************************/ // void : A function that gets the path of the current script function getScriptPath() { // Get the filename of the running script var sFileName = getScriptFileName(); // Create a file info object var oFileInfo = new DzFileInfo( sFileName ); // Declare a working variable var sPath; // If the version of the application provides the method if( typeof( oFileInfo.canonicalPath ) == "function" ){ // Get the canonical path from the file sPath = oFileInfo.canonicalPath(); //requires 4.9.3.29 or newer // If the method we prefer is not available } else { // Use the fallback to get the (absolute) path sPath = oFileInfo.path(); } // Clean up; do not leak memory oFileInfo.deleteLater(); // Return the path return sPath; }; /*********************************************************************/ // String : A function for retrieving a translation if one exists function text( sText ) { // If the version of the application supports qsTr() if( typeof( qsTr ) != "undefined" ){ // Return the translated (if any) text return qsTr( sText ); } // Return the original text return sText; }; /*********************************************************************/ // void : A function that executes a script and passes arguments to it function executeScriptWithArgs( sPath, aScriptArgs ) { // Declare working variables var sTitle, sMessage; // Define common strings var sButton = text( "&OK" ); // Create a script object var oScript = new DzScript(); // Create a file info object var oFileInfo = new DzFileInfo( sPath ); // Get the file extension var sExtension = oFileInfo.extension(); // If the path does not have a file extension, attempt to find the // script with a supported extension; doing it this way, we can debug // with an ascii file and distribute a binary (encrypted) file with // the same name... without having to update the contents of the script // or manually handle the file extensions; requires 3.0.1.5 or newer var sScriptPath = sExtension.isEmpty() ? oScript.getScriptFile( sPath ) : sPath; // Clean up; do not leak memory oFileInfo.deleteLater(); // If a script is found if( !sScriptPath.isEmpty() ){ // If the script loads if( oScript.loadFromFile( sScriptPath ) ){ // Execute the script; pass in an array of arguments; // passing in arguments requires 2.2.2.17 or newer oScript.execute( aScriptArgs ); // If the script doesn't load } else { // Define text variables for the message sTitle = text( "Read Error" ); sMessage = text( "The '%1' file could not be loaded." ).arg( sScriptPath ); // Inform the user MessageBox.information( sMessage, sTitle, sButton ); } // If a script is not found } else { // Define text variables for the message sTitle = text( "File Not Found" ); sMessage = text( "A '%1.ds(a|b|e)' file could not be found." ).arg( sPath ); // Inform the user MessageBox.information( sMessage, sTitle, sButton ); } }; /*********************************************************************/ // Define the path of the script we will call; without the file extension var sScriptPath = String( "%1/Callee_Script" ).arg( getScriptPath() ); // Execute the symmetrize script, silently executeScriptWithArgs( sScriptPath, [ App.version, sScriptPath, true ] ); // Finalize the function and invoke })();
// Define an anonymous function; // serves as our main loop, // limits the scope of variables (function( aArgs ){ /*********************************************************************/ // String : A function for retrieving a translation if one exists function text( sText ) { // If the version of the application supports qsTr() if( typeof( qsTr ) != "undefined" ){ // Return the translated (if any) text return qsTr( sText ); } // Return the original text return sText; }; /*********************************************************************/ // Declare working variables var vArg; var sType; // Initialize var aLines = new Array( aArgs.length ); // Iterate over the arguments passed to the script for( var i = 0, nArgs = aArgs.length; i < nArgs; i += 1 ){ // Get the 'current' argument vArg = aArgs[ i ]; // Get the 'current' type sType = typeof( vArg ); // Stringify based on the type of the argument switch( sType ){ case "object": aLines[ i ] = String("%1 : %2") .arg( sType ) .arg( JSON.stringify( vArg ) ); break; default: aLines[ i ] = String("%1 : %2") .arg( sType ) .arg( vArg ); break; } } // Define text variables for the message var sButton = text( "&OK" ); var sTitle = text( "Arguments" ); var sMessage = aLines.join( "\n" ); // Display the message MessageBox.information( sMessage, sTitle, sButton ); // Finalize the function and invoke })( getArguments() );