Accessing and Changing Importers/Exporters Settings

by ypuech

Retrieving and modifying a scene loader/saver options is usually needed when developing a batch importer/exporter.

To get and set an exporter’s settings, you do not have to call GetWorldPluginData() and SetWorldPluginData() (a common pitfall for CINEMA 4D plugins developers), but a MSG_RETRIEVEPRIVATEDATA message has to be sent to the exporter instead. This is because the loader/saver plugins hold their data within their BasePlugin object.
Here is an example that shows how to setup an Alembic export in C++:

BaseList2D* exporter;
// Find Alembic exporter plugin (1028082 is its ID, find out below how to find it)
BasePlugin* plug = FindPlugin(1028082, PLUGINTYPE_SCENESAVER);
// If found, send MSG_RETRIEVEPRIVATEDATA to get the Alembic exporter private data
if (plug && plug->Message(MSG_RETRIEVEPRIVATEDATA, &exporter))
{
    if (!exporter) return FALSE;

    // Get the container data instance
    BaseContainer *data = exporter->GetDataInstance();
    if (!data) return FALSE;

    // Set Alembic export settings

    data->SetBool(ABCEXPORT_HAIR, TRUE);
    data->SetBool(ABCEXPORT_PARTICLE_GEOMETRY, TRUE);
    data->SetBool(ABCEXPORT_XREFS, TRUE);

    // Export the document
    SaveDocument(doc, "C:\\model.abc", 
          SAVEDOCUMENTFLAGS_DONTADDTORECENTLIST, 1028082);
}

How can you find the ID of any exporter?
Here is a simple Python script that prints to the console the name and ID of all the registered scene saver plugins:

import c4d
from c4d import plugins

def main():
    plugs = plugins.FilterPluginList(c4d.PLUGINTYPE_SCENESAVER, True)
    for plug in plugs:
        print plug.GetName(), '-', plug.GetID()

if __name__=='__main__':
main()

You can print all the registered scene loader plugins by just replacing c4d.PLUGINTYPE_SCENESAVER with c4d.PLUGINTYPE_SCENELOADER in this script.

Advertisements