GENERAL and DOCUMENT settings [SOLVED]

On 03/10/2016 at 02:40, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   R18 
Platform:   Windows  ;   
Language(s) :     C++  ;

---------
Hello.

I have seen that DOCUMENTSETTINGS_DOCUMENT include the project settings which can be found in ddoc.h
But which parameters belong in DOCUMENTSETTINGS_GENERAL group ? 
If I copy the whole document, are the general settings copied as well or only the document settings ?

Thank you for your time.

On 05/10/2016 at 06:37, xxxxxxxx wrote:

Hi Peterakos, thanks for writing us.To browse through the parameters belonging to DOCUMENTSETTINGS_GENERAL you can use the GetData() method to retrieve the BaseContainer and using a BrowseContainer object you can iterate and return the id/value of those parameters and matching the ID to the values found in ddoc.h get an understanding of their purpose.

  
GeData* dataPtr = nullptr;  
Int32 id = 0;
  
// Retrieve the BaseContainer where to access the DOCUMENTSETTINGS_GENERAL params
BaseContainer bcGenData = doc->GetData(DOCUMENTSETTINGS_GENERAL);
  
// Allocate a BrowseContainer object, initializing with the reference to retrieved BaseContainer
BrowseContainer containerBrowser = BrowseContainer(&bcGenData );
  
// Loop through all parameters stored  
while (containerBrowser.GetNext(&id, &dataPtr))  
{  
 if (dataPtr)
   ... and do something with the data retrieved  
}  

With reference to the second part of the question, I confirm that if you change the value of one of the parameters belonging to DOCUMENTSETTINGS_GENERAL once you copy or clone the document the parameter in the new document is populated with the new value. Please take care of calling the SetData() method after updating the value any parameter stored in DOCUMENTSETTINGS_GENERAL.

  
// Change the value of the project FPS  
bcGenData.SetParameter(DOCUMENT_FPS, Int32(66));
  
// Update the values in the document  
doc->SetData(DOCUMENTSETTINGS_GENERAL, bcGenData);
GeData docFPSData;
  
// Allocate a new BaseDocument instance  
BaseDocument* copiedDocPtr = BaseDocument::Alloc();  
if (nullptr == copiedDocPtr)  
 return false;
  
// Copy the old document on the new document  
doc->CopyTo(copiedDocPtr, COPYFLAGS_0, nullptr);
  
// Retrieve the BaseContainer for the new document referred to DOCUMENTSETTINGS_GENERAL  
BaseContainer bcNewCopyGenData = copiedDocPtr->GetData(DOCUMENTSETTINGS_GENERAL);
  
// Populate the GeData object with the values belonging to param DOCUMENT_FPS  
bcNewCopyGenData.GetParameter(DOCUMENT_FPS, docFPSData);
  
// Print the value  
GePrint("FPS in copied doc is: " + String::IntToString(docFPSData.GetInt32()));
  
// Deallocate the new doc  
BaseDocument::Free(copiedDocPtr);  

Best, Riccardo