#include <maya/MPxMayaAsciiFilter.h>
#include <maya/MFnPlugin.h>
#include <maya/MFileIO.h>
#include <maya/MFileObject.h>
#include <maya/MFnDependencyNode.h>
#include <maya/MSyntax.h>
#include <maya/MArgDatabase.h>
#include <maya/MPxCommand.h>
#include <maya/MGlobal.h>
#include <maya/MString.h>
#include <maya/MStringArray.h>
#include <vector>
#define kFileNameFlag "-fn"
#define kFileNameFlagLong "-fileName"
#define commandName "customSourceFile"
{
public:
static void* creator();
static void setPluginName(
const MString& name);
filteredAsciiFile();
protected:
const MPlug& destPlug )
const;
private:
bool isNodeTypeIncluded(
const MString& type)
const;
bool isNodeNameExcluded(
const MObject& node)
const;
bool outputRequirements;
bool outputReferences;
};
MString filteredAsciiFile::fExtension =
"faf";
MString filteredAsciiFile::fPluginName =
"";
MString filteredAsciiFile::fTranslatorName =
"filteredAsciiFile";
inline void filteredAsciiFile::setPluginName(
const MString& name)
{ fPluginName = name; }
inline MString filteredAsciiFile::translatorName()
{ return fTranslatorName; }
inline MString filteredAsciiFile::defaultExtension()
const
{ return fExtension; }
filteredAsciiFile::filteredAsciiFile() :
includedNodeTypesArray()
, outputRequirements(false)
, outputReferences(true)
{
}
MStatus filteredAsciiFile::processReadOptions(
const MString& optionsString)
{
}
MStatus filteredAsciiFile::processWriteOptions(
const MString& optionsString)
{
includedNodeTypesArray.
clear();
excludedNodeTypesArray.
clear();
sourcedFilesArray.clear();
excludedNamesArray.clear();
outputRequirements = true;
outputReferences = true;
optionsString.
split(
';', optionsArray);
for (
unsigned i = 0; i < optionsArray.
length(); i++)
{
const MString& option = optionsArray[i];
option.
split(
' ', optionArray);
if (optionArray[0] ==
"includeNodeType" && optionArray.
length() > 1)
{
includedNodeTypesArray.append(optionArray[1]);
}
else if (optionArray[0] ==
"excludeNodeType" && optionArray.
length() > 1)
{
excludedNodeTypesArray.append(optionArray[1]);
}
else if (optionArray[0] ==
"sourceFile" && optionArray.
length() > 1)
{
sourcedFilesArray.append(optionArray[1]);
}
}
}
void* filteredAsciiFile::creator()
{
return new filteredAsciiFile();
}
bool filteredAsciiFile::writesRequirements() const
{
return outputRequirements;
}
bool filteredAsciiFile::writesCreateNode(
const MObject& node )
const
{
bool result = false;
if (depNode.isFromReferencedFile() && !outputReferences)
{
return false;
}
if (isNodeNameExcluded(node))
{
return false;
}
if (!result)
{
}
return result;
}
bool filteredAsciiFile::writesConnectAttr(
const MPlug& srcPlug,
const MPlug& destPlug )
const
{
return (writesCreateNode(srcPlug.
node()) && !isNodeNameExcluded(destPlug.
node()));
}
bool filteredAsciiFile::writesSelectNode(
const MObject& node )
const
{
return writesCreateNode(node);
}
bool filteredAsciiFile::writesFileReference(
const MFileObject& referenceFile )
const
{
return outputReferences;
}
bool filteredAsciiFile::writesSetAttr(
const MPlug& srcPlug )
const
{
return writesCreateNode(srcPlug.
node());
}
{
fileIO << "requires " << fPluginName.asChar() << " \"1.0\";\n";
}
{
for (unsigned int i = 0; i < sourcedFilesArray.length(); i++)
{
fileIO << "eval (\"customSourceFile -fileName \\\"";
fileIO << sourcedFilesArray[i].asChar();
fileIO << "\\\";\");\n";
}
}
bool filteredAsciiFile::isNodeTypeIncluded(
const MString& nodeType)
const
{
if ( (excludedNodeTypesArray.length() == 0 ) &&
(includedNodeTypesArray.length() == 0 ) )
{
return true;
}
bool result = (excludedNodeTypesArray.length() > 0);
for (unsigned int i = 0; i < includedNodeTypesArray.length(); i++)
{
if (nodeType == includedNodeTypesArray[i])
{
result = true;
break;
}
}
for (unsigned int j = 0; j < excludedNodeTypesArray.length(); j++)
{
if (nodeType == excludedNodeTypesArray[j])
{
result = false;
break;
}
}
return result;
}
bool filteredAsciiFile::isNodeNameExcluded(
const MObject& node)
const
{
for (unsigned int i = 0; i < excludedNamesArray.length(); i++)
{
if (excludedNamesArray[i] == depNode.name())
{
return true;
}
}
return false;
}
{
public:
sourceFileCmd();
virtual ~sourceFileCmd();
static void* creator();
private:
};
sourceFileCmd::sourceFileCmd()
{
}
sourceFileCmd::~sourceFileCmd()
{
}
sourceFileCmd::doIt (
const MArgList& args )
{
if (argData.isFlagSet(kFileNameFlag))
{
status = argData.getFlagArgument(kFileNameFlag, 0, fileName);
{
currFile.
split (
'/', pathDirectories);
if (pathDirectories.
length() > 0)
{
for (
unsigned int i = 0; i < pathDirectories.
length()-1; i++)
{
expandedFileName += pathDirectories[i];
expandedFileName += "/";
}
expandedFileName += fileName;
}
}
}
return status;
}
void*
sourceFileCmd::creator()
{
return (void*) new sourceFileCmd();
}
{
return syntax;
}
{
MFnPlugin plugin(obj, PLUGIN_COMPANY,
"1.0",
"Any");
filteredAsciiFile::setPluginName(plugin.name());
plugin.registerFileTranslator(
filteredAsciiFile::translatorName(),
NULL,
filteredAsciiFile::creator,
NULL,
NULL,
false
);
MStatus status = plugin.registerCommand( commandName,
sourceFileCmd::creator,
sourceFileCmd::newSyntax);
return status;
}
{
plugin.deregisterFileTranslator(filteredAsciiFile::translatorName());
}