User Tools

Site Tools

Save a Material(s) Preset

This example is dependent on functionality provided by DAZ Studio 4.5.x.


Below is an example demonstrating how you can use script accessible settings to control the saving of a Material(s) Preset..., without causing the output options or file save dialogs to be displayed.

API Areas of Interest


Click the name of the example below to save it as a file.

// Get the asset IO manager
var oAssetIOMgr = App.getAssetIOMgr();
// Define the class name of the asset filter we want to use
var sClassName = "DzMaterialAssetFilter";
// Find the index of the asset filter with the class name we want
var nAssetIOFilter = oAssetIOMgr.findFilter( sClassName );
// If we've found an asset filter with the class name we wanted
if( nAssetIOFilter > -1 ){
	// Get the asset filter at the prescribed index
	var oAssetIOFilter = oAssetIOMgr.getFilter( nAssetIOFilter );
	// If we have a valid asset filter
	if( oAssetIOFilter ){
		// Create a settings object
		var oSettings = new DzFileIOSettings();
		// Get the default settings
		oAssetIOFilter.getDefaultOptions( oSettings );
		// Get the content manager
		var oContentMgr = App.getContentMgr();
		// Get the base path - the first mapped content directory
		var sBasePath = oContentMgr.getContentDirectoryPath( 0 );
		// Define whether to show the options dialog
		var bShowOptions = false;
		// If we are showing options, we can override the last saved state
		// by passing in the settings we want to override
		if( bShowOptions ){
			// Set the initial state of the compress file checkbox
			oSettings.setBoolValue( "CompressOutput", false );
		// Get the default/saved options for the asset filter,
		// without displaying the options dialog.
		if( oAssetIOFilter.getOptions( oSettings, bShowOptions, "" ) ){
			// If we are not showing options
			if( !bShowOptions ){
				// Get the primary selection
				var oNode = Scene.getPrimarySelection();
				// If a node is selected and its a bone
				if( oNode && oNode.inherits( "DzBone" ) ){
					// Update the node to be the skeleton for the bone
					oNode = oNode.getSkeleton();
				// If we had a node selected, use its label otherwise attempt to use Genesis
				var sNode = oNode ? oNode.getLabel() : "Genesis";
				// Pass in the label of the root node to find in the scene and save from.
				// This can be used to override actual selection within the scene.
				oSettings.setStringValue( "RootLabel", sNode );
				// Set whether to bypass the filter that culls properties based on their type
				// - use this with caution as this could lead to unexpected results for the
				// user of the generated file
				oSettings.setBoolValue( "BypassFilter", false );
				oSettings.setBoolValue( "OmitDefinitions", false );
				// Declare the name of the key used to list materials and properties by name
				var sNamesSettingsKey = "MaterialNames"
				// Get the [nested] settings object that holds the named materials and properties
				var oNamesSettings = oSettings.getSettingsValue( sNamesSettingsKey );
				// If the object doesn't already exist
				if( !oNamesSettings ){
					// Create it
					oNamesSettings = oSettings.setSettingsValue( sNamesSettingsKey );
				// Define a convienent array of the property names we want from every material we specify
				var aPropNames = ["Diffuse Color", "Diffuse Strength"];
				// Construct an array of objects that define the materials and properties we'll iterate over
				var aNames = [
						"materialName" : "Default",
						"propNames" : aPropNames
						"materialName" : "1_SkinFace",
						"propNames" : aPropNames
						"materialName" : "1_Lip",
						"propNames" : aPropNames
				// Declare a settings object for the materials
				var oMaterialSettings = undefined;
				var i, j, nMaterialSettings = 0;
				// Iterate over our material/properties array
				for( i = 0; i < aNames.length; i += 1 ){
					// Extract the name of the material
					sMaterial = aNames[ i ][ "materialName" ];
					// Get the [nested] settings object for the material
					oMaterialSettings = oNamesSettings.getSettingsValue( sMaterial );
					// If the object doesn't already exist
					if( !oMaterialSettings ){
						// Create it
						oMaterialSettings = oNamesSettings.setSettingsValue( sMaterial );
					// Get the number of settings already on the object
					nMaterialSettings = oMaterialSettings.getNumValues();
					// Extract the array of property names for the material
					aPropNames = aNames[ i ][ "propNames" ];
					// Iterate over the property names
					for( j = 0; j < aPropNames.length; j += 1 ){
						// Add a setting whose key is the index in the list and whose value is the property name
						oMaterialSettings.setStringValue( String( nMaterialSettings ), aPropNames[ j ] );
						// Increment the count
						nMaterialSettings += 1;
				// Don't compress the file
				oSettings.setBoolValue( "CompressOutput", false );
			// Don't show the file save dialog
			oSettings.setBoolValue( "RunSilent", true );
			// Inspect the settings that will be passed to the asset filter
			print( oSettings.toString() );
			// Use the asset filter to save a test file, using the defined settings.
			//oAssetIOFilter.doSave( oSettings, String("%1/%2 Test").arg( sBasePath ).arg( sClassName ), sBasePath );
			oAssetIOMgr.doSaveWithOptions( oAssetIOFilter, oSettings, false,
				String("%1/%2 Test").arg( sBasePath ).arg( sClassName ), sBasePath, "" );
// We didn't find an asset filter with the class name we wanted
} else {
	// Inform the user
	MessageBox.critical( String("An asset filter with the class name \"%1\" " +
		"could not be found.").arg( sClassName ), "Not Found", "&OK" );