How to save / load presets the C4D way
-
On 28/06/2013 at 15:24, xxxxxxxx wrote:
User Information:
Cinema 4D Version: R13-R14
Platform:
Language(s) :---------
Hi, if you add a C-Motion to your project, you will find two buttons under the Basic tab:
Load preset.. and Save preset..
I would like to implement these in my custom tag, if possible at all.
Having searched high and low, googled and bing-ed and read the docs and searched this and other forums, it seems that reading from file and saving to file is not much discussed.I CAN use an ordinary filesave dialog or the like. But I am much more interested in a function similar to the one mentioned in the C-Motion.
And code examples would be very much welcome! -
On 28/06/2013 at 17:07, xxxxxxxx wrote:
You can load/save descriptions and other settings using the World Plugin Container. Check SetWorldPluginData() and GetWorldPluginData() in the API docs. For specific presets, just put the settings in a container with a name and maybe an element noting that it is a preset and save that container (BaseContainer) as above.
Bool MyPlugin::Init(GeListNode* node) { BaseContainer* bc = static_cast<BaseTag*>(node)->GetDataInstance(); // Get stored settings BaseContainer* pbc = GetWorldPluginData(ID_MYPLUGIN); if (!pbc) return TRUE; bc->SetLong(MYPLUGIN_MODE, pbc->GetLong(MYPLUGIN_MODE, MYPLUGIN_MODE_CIRCLE)); bc->SetVector(MYPLUGIN_COLOR, pbc->GetVector(MYPLUGIN_COLOR, Vector(1.0,1.0,0.0))); bc->SetLong(MYPLUGIN_RADIUS, pbc->GetLong(MYPLUGIN_RADIUS, 20L)); bc->SetLong(MYPLUGIN_RECT_W, pbc->GetLong(MYPLUGIN_RECT_W, 20L)); bc->SetLong(MYPLUGIN_RECT_H, pbc->GetLong(MYPLUGIN_RECT_H, 20L)); return TRUE; } void MyPlugin::Free(GeListNode* node) { BaseContainer* bc = static_cast<BaseTag*>(node)->GetDataInstance(); // Store settings BaseContainer pbc; pbc.SetLong(MYPLUGIN_MODE, bc->GetLong(MYPLUGIN_MODE)); pbc.SetVector(MYPLUGIN_COLOR, bc->GetVector(MYPLUGIN_COLOR)); pbc.SetLong(MYPLUGIN_RADIUS, bc->GetLong(MYPLUGIN_RADIUS)); pbc.SetLong(MYPLUGIN_RECT_W, bc->GetLong(MYPLUGIN_RECT_W)); pbc.SetLong(MYPLUGIN_RECT_H, bc->GetLong(MYPLUGIN_RECT_H)); SetWorldPluginData(ID_MYPLUGIN, pbc); }
-
On 28/06/2013 at 23:46, xxxxxxxx wrote:
Thanks a lot for this, absolutely essential for me when writing plugins.
Although, it is not actually what I am asking for, though.What I want, is for the user to being able to load and store the current settings as a preset using the dialog that C-Motion uses:
I do not know at all how to invoke and use such a dialog. If at all possible.
And by the way, the data I want to store is complicated, it is not as easy as a couple of description values. -
On 29/06/2013 at 00:08, xxxxxxxx wrote:
It is just a custom GeDialog. There is nothing like a preset dialog in c4d, you will have to build
your own. In c4d_file you can find FileSelect() which will open the OS specific file selection
dialog. -
On 29/06/2013 at 00:23, xxxxxxxx wrote:
Aha! I understand. So I'll have to make a GeDialog then, and use it form inside my tag plugin?!?
-
On 29/06/2013 at 00:29, xxxxxxxx wrote:
You can have a button to save a named preset. Again, you want to open a GeDialog with a text entry element (and Ok/Cancel).
You can have a button to load a saved preset. You can get the world plugin data, get the BaseContainers that each represent the presets. Open a GeDialog and use that list to fill a listview or a combo or whatever for the user to select a preset.