Load/Save Presets?

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 15/09/2007 at 15:39, xxxxxxxx wrote:

Oh, that's more explanatory! 🙂

For something like presets, you'll have to devise a file format and use a BaseFile and its methods or write a text file (fprintf/fscanf?). Possibly a hard-named file (I use, for instance, ipptool.prf for my tool settings) or you can open a file dialog so that the user can load from/save into a particular file.

How to read/write the presets depends upon which way you go: BaseFile or C/C++ methods. For the C4D types, you'll need to convert for the latter method (write 1/0 or TRUE/FALSE for bools and so on). If you need some example code, I can provide it but you should be able to get the hang of it. Try a single variable first for read and write to test the veracity. Once that is established, fill out all of the reading/writing to be done.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 15/09/2007 at 17:45, xxxxxxxx wrote:

Hi,

yeah, some example code would be great!

I had hoped for some possibility to write the complete contents of a PluginData or BaseContainer class into a file. That way, I would just have to copy the settings that should be saved to a separate BaseContainer and write a kinda BaseContainer File.

Regards,
Jack

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 15/09/2007 at 18:26, xxxxxxxx wrote:

Unfortunately, there is no WriteContainer/ReadContainer. 😉

These methods do exist in the HyperFile but have not tried this approach. This may suffice for your requirements.

Otherwise, this is my entire plugin preferences load and save methods; a bit much, but it show everything needed. Note that the BaseFile* is passed in from the dialog so you'll want to either do similar or AutoAlloc the BaseFile and Filename::Select to get the file to open for read/write. Also note that this file tracks the version so as to ignore newer settings.

// CMD: Load Settings from Prefs file  
//*---------------------------------------------------------------------------*  
BOOL Settings::LoadSettings(BaseFile* baseFile, BOOL loadDefault)  
//*---------------------------------------------------------------------------*  
{  
     // Load either Default or User-Selected Preferences  
     Filename     baseFilename;  
     if (!loadDefault)  
     {  
          baseFilename = GeGetPluginPath();  
          if (!baseFilename.FileSelect(0, 0, &GeLoadString;(IPPS_LOADPREFS_DLG))) return TRUE;  
     }  
     else baseFilename = prefs_Filename;  
  
     baseFile->Close();  
     // Open file  
     if (!baseFile->Open(baseFilename, GE_READ, FILE_NODIALOG))     return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_OPENFILE_TEXT), baseFilename.GetString());  
  
     Filename     ppath;  
     LONG          longv;  
     UCHAR          version[3];  
  
     // Read interPoser Pro Preferences Version  
     baseFile->ReadBytes(&version;[0], 3);  
     // v0.4.3  
     // General  
     // - Read BOOL autoPrefs  
     if (!baseFile->ReadBool(&autoPrefs;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read Real objScaling  
     if (!baseFile->ReadReal(&objScaling;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // Read Real infiniteLightRadius  
     if (!baseFile->ReadReal(&infiniteLightRadius;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
  
     // Scene  
     // - Read BOOL includeCameras  
     if (!baseFile->ReadBool(&includeCameras;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read BOOL includeLights  
     if (!baseFile->ReadBool(&includeLights;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read BOOL includeGround  
     if (!baseFile->ReadBool(&includeGround;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
  
     // Dials  
     // - Read BOOL overrideMorphEdit  
     if (!baseFile->ReadBool(&overrideMorphEdit;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read Real morphEditMin  
     if (!baseFile->ReadReal(&morphEditMin;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read Real morphEditMax  
     if (!baseFile->ReadReal(&morphEditMax;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read Real morphEditStep  
     if (!baseFile->ReadReal(&morphEditStep;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
  
     // Materials  
     // - Read BOOL useTMin  
     if (!baseFile->ReadBool(&useTMin;))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read BOOL useReflection  
     if (!baseFile->ReadBool(&useReflection;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read BOOL useSpecularMode  
     if (!baseFile->ReadBool(&useSpecularMode;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read BOOL useIllumModel  
     if (!baseFile->ReadBool(&useIllumModel;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read LONG specularMode  
     if (!baseFile->ReadLong(&specularMode;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read LONG illumModel  
     if (!baseFile->ReadLong(&illumModel;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Read ChannelSampling Sampling[6]  
     for (INT i = 0; i < 6; ++i)  
     {  
          if (!baseFile->ReadBool(&(Sampling _.use)))                return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->ReadLong(&(Sampling _.sampling)))           return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->ReadReal(&(Sampling _.blurOffset)))           return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->ReadReal(&(Sampling _.blurScale)))           return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     // Read BOOL useDisplacement  
     if (!baseFile->ReadBool(&useDisplacement;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // Read BOOL heightAbsolute  
     if (!baseFile->ReadBool(&heightAbsolute;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // Read LONG displacementType  
     if (!baseFile->ReadLong((LONG* )&displacementType;))               return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // Read LONG subdivisionLevel  
     if (!baseFile->ReadLong((LONG* )&subdivisionLevel;))               return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // Read BOOL roundGeometry  
     if (!baseFile->ReadBool(&roundGeometry;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // Read BOOL roundContour  
     if (!baseFile->ReadBool(&roundContour;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // Read BOOL mapRoundedGeometry  
     if (!baseFile->ReadBool(&mapRoundedGeometry;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // Read BOOL mapResultingGeometry  
     if (!baseFile->ReadBool(&mapResultingGeometry;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // Read BOOL keepOriginalEdges  
     if (!baseFile->ReadBool(&keepOriginalEdges;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // Read BOOL bestDistribution  
     if (!baseFile->ReadBool(&bestDistribution;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
  
     // - Read Filename Project path and verify  
     if (!baseFile->ReadFilename(&ppath;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
// v1.1.5:     Consider migration from R9.6/PPC to R10UB  
#ifdef     C4D_R10UB  
     if (GeFExist(ppath, FALSE) || GeFExist(ppath, TRUE))          ProjectPath =     ppath;  
     // Check for no '/' path separators  
     else if (!ppath.GetString().FindFirst('/', &longv;))  
     {  
          String     p =     ppath.GetString();  
          // MacOS C4D R10 - change ':' to '/'  
          while (p.FindFirst(':', &longv;))     p[longv] = '/';  
          if (p[0] == '/')     ppath =               Filename(String("/Volumes")+p);  
          else                    ppath =               Filename(String("/Volumes/")+p);  
          if (GeFExist(ppath, FALSE) || GeFExist(ppath, TRUE))     ProjectPath =     ppath;  
          //else                                                                 MessageDialog("Project: "+ppath.GetString()+" was not found!");  
     }  
     //else if (ppath.Content())                                             MessageDialog("Project: "+ppath.GetString()+" was not found!");  
#else  
     if (GeFExist(ppath, FALSE) || GeFExist(ppath, TRUE))          ProjectPath =     ppath;  
     //else if (ppath.Content())                                             MessageDialog("Project: "+ppath.GetString()+" was not found!");  
#endif  
  
     // RuntimeExplorer  
     // - Read Normal/Selected Color values  
     if (!baseFile->ReadVector(&colorsExplorer;[0]))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->ReadVector(&colorsExplorer;[1]))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->ReadVector(&colorsExplorer;[2]))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->ReadVector(&colorsExplorer;[3]))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->ReadVector(&colorsExplorer;[4]))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->ReadVector(&colorsExplorer;[5]))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     // - Get Runtimes  
     // -- Read LONG number of Runtimes  
     if (!baseFile->ReadLong(&longv;))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     if (longv)  
     {  
          bDelete(firstIPPRuntime);  
          firstIPPRuntime =          bNew IPPRuntime[longv];  
          if (!firstIPPRuntime)     return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_MEMORY_TEXT), "Settings.LoadSettings.firstIPPRuntime");  
          lastIPPRuntime =          firstIPPRuntime + longv;  
          Bool     boolean;  
          // -- Read Filename Runtime paths from file  
          for (IPPRuntime* rt = firstIPPRuntime; rt != lastIPPRuntime; ++rt)  
          {  
               if (!baseFile->ReadBool(&boolean;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
               if (!baseFile->ReadFilename(&ppath;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
// v1.1.5:     Consider migration from R9.6/PPC to R10UB  
#ifdef     C4D_R10UB  
               if (GeFExist(ppath, TRUE))  
               {  
                    rt->enable =     boolean;  
                    rt->path =          ppath;  
                    GePrint("Runtime: "+ppath.GetString()+" Exists");  
               }  
               // Check for no '/' path separators  
               else if (!ppath.GetString().FindFirst('/', &longv;))  
               {  
                    String     p =     ppath.GetString();  
                    // MacOS C4D R10 - change ':' to '/'  
                    while (p.FindFirst(':', &longv;))     p[longv] = '/';  
                    if (p[0] == '/')     ppath =               Filename(String("/Volumes")+p);  
                    else                    ppath =               Filename(String("/Volumes/")+p);  
                    if (GeFExist(ppath, TRUE))  
                    {  
                         rt->enable =          boolean;  
                         rt->path =               ppath;  
                    }  
                    else                                                       MessageDialog("Runtime: "+ppath.GetString()+" not added!");  
               }  
               else                                                            MessageDialog("Runtime: "+ppath.GetString()+" not added!");  
#else  
               // Verify existence  
               if (GeFExist(ppath, TRUE))  
               {  
                    rt->enable =     boolean;  
                    rt->path =          ppath;  
               }  
               else                                                            MessageDialog("Runtime: "+ppath.GetString()+" not added!");  
#endif  
          }  
     }  
     // - Read String lastRTEFolder  
     if (!baseFile->ReadString(&lastRTI;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
  
     if (CheckInterPoserVersion(&version;[0], 0, 4, 7) >= 0)  
     {  
          // Read BOOL imageSearch  
          if (!baseFile->ReadBool(&imageSearch;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // Read BOOL useMasterSlaves  
          if (!baseFile->ReadBool(&useMasterSlaves;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 0, 4, 8) >= 0)  
     {  
          // Read BOOL clearSelection  
          if (!baseFile->ReadBool(&clearSelection;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // Read BOOL storeUndoLoad  
          if (!baseFile->ReadBool(&storeUndoLoad;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 0, 4, 9) >= 0)  
     {  
          // Dials  
          // - Read BOOL overrideParmEdit  
          if (!baseFile->ReadBool(&overrideParmEdit;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real parmEditMin  
          if (!baseFile->ReadReal(&parmEditMin;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real parmEditMax  
          if (!baseFile->ReadReal(&parmEditMax;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real parmEditStep  
          if (!baseFile->ReadReal(&parmEditStep;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 0, 5, 8) >= 0)  
     {  
          // - Read BOOL logging  
          if (!baseFile->ReadBool(&logging;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 0, 6, 2) >= 0)  
     {  
          // Dials  
          // - Read BOOL overrideTransEdit  
          if (!baseFile->ReadBool(&overrideTransEdit;))               return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real transEditMin  
          if (!baseFile->ReadReal(&transEditMin;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real transEditMax  
          if (!baseFile->ReadReal(&transEditMax;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real transEditStep  
          if (!baseFile->ReadReal(&transEditStep;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 0, 6, 3) >= 0)  
     {  
          // Scene  
          // - Read BOOL groupCameras  
          if (!baseFile->ReadBool(&groupCameras;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read BOOL groupLights  
          if (!baseFile->ReadBool(&groupLights;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 0, 6, 7) >= 0)  
     {  
          // Dialog  
          // - Read BOOL explorerFold  
          if (!baseFile->ReadBool(&explorerFold;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read BOOL actionsFold  
          if (!baseFile->ReadBool(&actionsFold;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read BOOL prefsGeneralFold  
          if (!baseFile->ReadBool(&prefsGeneralFold;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read BOOL prefsSceneFold  
          if (!baseFile->ReadBool(&prefsSceneFold;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read BOOL prefsDialsFold  
          if (!baseFile->ReadBool(&prefsDialsFold;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read BOOL prefsMatFold  
          if (!baseFile->ReadBool(&prefsMatFold;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
  
          // Materials  
          // - Read BOOL useLuminance  
          if (!baseFile->ReadBool(&useLuminance;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real illumDiffuseFalloff  
          if (!baseFile->ReadReal(&illumDiffuseFalloff;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real illumDiffuseLevel  
          if (!baseFile->ReadReal(&illumDiffuseLevel;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real illumRoughness  
          if (!baseFile->ReadReal(&illumRoughness;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read LONG texturePreviewSize  
          if (!baseFile->ReadLong((LONG* )&texturePreviewSize;))          return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Luminance ChannelSampling Sampling[CHANNELSAMPLING_LUMINANCE]  
          if (!baseFile->ReadBool(&(Sampling[CHANNELSAMPLING_LUMINANCE].use)))               return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->ReadLong(&(Sampling[CHANNELSAMPLING_LUMINANCE].sampling)))          return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->ReadReal(&(Sampling[CHANNELSAMPLING_LUMINANCE].blurOffset)))          return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->ReadReal(&(Sampling[CHANNELSAMPLING_LUMINANCE].blurScale)))          return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 0, 6, 8) >= 0)  
     {  
          // - Read BOOL handSpreadLimits  
          if (!baseFile->ReadBool(&handSpreadLimits;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 0, 7, 2) >= 0)  
     {  
          // - Read Filename externalApp  
          if (!baseFile->ReadFilename(&externalApp;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 0, 7, 9) >= 0)  
     {  
          // - Read BOOL ignoreMatCase  
          if (!baseFile->ReadBool(&ignoreMatCase;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 1, 1, 3) >= 0)  
     {  
          // - Read BOOL hideBanner  
          if (!baseFile->ReadBool(&hideBanner;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 1, 3, 3) >= 0)  
     {  
          // - Read Vector ikColor  
          if (!baseFile->ReadVector(&ikColor;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read LONG ikDisplay  
          if (!baseFile->ReadLong(&ikDisplay;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read LONG ikOrient  
          if (!baseFile->ReadLong(&ikOrient;))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real ikRadius  
          if (!baseFile->ReadReal(&ikRadius;))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Real ikAspect  
          if (!baseFile->ReadReal(&ikAspect;))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 1, 4, 0) >= 0)  
     {  
          // - Read BOOL newStyleApply  
          if (!baseFile->ReadBool(&new;StyleApply))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read BOOL autoSave  
          if (!baseFile->ReadBool(&autoSave;))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read LONG numRecentContent  
          if (!baseFile->ReadLong(&numRecentContent;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read LONG numRecentScene  
          if (!baseFile->ReadLong(&numRecentScene;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // Dialog  
          // - Read BOOL recentFold  
          if (!baseFile->ReadBool(&recentFold;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read BOOL favoritesFold  
          if (!baseFile->ReadBool(&favoritesFold;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 1, 4, 3) >= 0)  
     {  
          // - Read BOOL autoThumbWidth  
          if (!baseFile->ReadBool(&autoThumbWidth;))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 1, 4, 4) >= 0)  
     {  
          // - Read BOOL autoThumbWidthFave  
          if (!baseFile->ReadBool(&autoThumbWidthFave;))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          // - Read Favorites Normal/Selected Color values  
          if (!baseFile->ReadVector(&colorsFavorites;[0]))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->ReadVector(&colorsFavorites;[1]))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->ReadVector(&colorsFavorites;[2]))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->ReadVector(&colorsFavorites;[3]))                    return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     if (CheckInterPoserVersion(&version;[0], 1, 5, 5) >= 0)  
     {  
          // - Read BOOL pngMethod  
          if (!baseFile->ReadBool(&pngMethod;))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_READFILE_TEXT), baseFilename.GetString());  
     }  
     // add new version values here (skip if they don't exist)  
  
     baseFile->Close();  
     return TRUE;  
}  
// CMD: Save Settings to Prefs file  
//*---------------------------------------------------------------------------*  
BOOL Settings::SaveSettings(BaseFile* baseFile, const Filename& baseFilename, LONG rtCount, RuntimeItem* firstRTI, RuntimeItem* selected)  
//*---------------------------------------------------------------------------*  
{  
     baseFile->Close();  
     // Open prefs.txt and write out Settings and Runtimes  
     if (!baseFile->Open(baseFilename, GE_WRITE, FILE_NODIALOG))          return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_OPENFILE_TEXT), baseFilename.GetString());  
       
     // - Write UCHAR version[3]  
     if (!baseFile->WriteBytes(&INTERPOSERPRO;_VERSION[0], 3))          return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // v0.4.3  
     // General  
     // - Write BOOL autoPrefs  
     if (!baseFile->WriteBool(autoPrefs))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real objScaling  
     if (!baseFile->WriteReal(objScaling))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real infiniteLightRadius  
     if (!baseFile->WriteReal(infiniteLightRadius))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // Scene  
     // - Write BOOL includeCameras  
     if (!baseFile->WriteBool(includeCameras))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL includeLights  
     if (!baseFile->WriteBool(includeLights))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL includeGround  
     if (!baseFile->WriteBool(includeGround))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // Dials  
     // - Write BOOL overrideMorphEdit  
     if (!baseFile->WriteBool(overrideMorphEdit))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real morphEditMin  
     if (!baseFile->WriteReal(morphEditMin))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real morphEditMax  
     if (!baseFile->WriteReal(morphEditMax))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real morphEditStep  
     if (!baseFile->WriteReal(morphEditStep))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // Materials  
     // - Write BOOL useTMin  
     if (!baseFile->WriteBool(useTMin))                                        return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL useReflection  
     if (!baseFile->WriteBool(useReflection))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL useSpecularMode  
     if (!baseFile->WriteBool(useSpecularMode))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL useIllumModel  
     if (!baseFile->WriteBool(useIllumModel))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write LONG specularMode  
     if (!baseFile->WriteLong(specularMode))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write LONG illumModel  
     if (!baseFile->WriteLong(illumModel))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write ChannelSampling Sampling[6]  
     for (INT i = 0; i < 6; ++i)  
     {  
          if (!baseFile->WriteBool(Sampling _.use))                          return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->WriteLong(Sampling _.sampling))                     return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->WriteReal(Sampling _.blurOffset))                return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->WriteReal(Sampling _.blurScale))                return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     }  
     // Displacement  
     // - Write BOOL useDisplacement  
     if (!baseFile->WriteBool(useDisplacement))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL heightAbsolute  
     if (!baseFile->WriteBool(heightAbsolute))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write LONG displacementType  
     if (!baseFile->WriteLong(displacementType))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write LONG subdivisionLevel  
     if (!baseFile->WriteLong(subdivisionLevel))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL roundGeometry  
     if (!baseFile->WriteBool(roundGeometry))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL roundContour  
     if (!baseFile->WriteBool(roundContour))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL mapRoundedGeometry  
     if (!baseFile->WriteBool(mapRoundedGeometry))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL mapResultingGeometry  
     if (!baseFile->WriteBool(mapResultingGeometry))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL keepOriginalEdges  
     if (!baseFile->WriteBool(keepOriginalEdges))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL bestDistribution  
     if (!baseFile->WriteBool(bestDistribution))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // - Write Filename Project path  
     if (!baseFile->WriteFilename(ProjectPath))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // Runtime Explorer  
     // - Write Normal/Selected Color values  
     if (!baseFile->WriteVector(colorsExplorer[0]))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteVector(colorsExplorer[1]))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteVector(colorsExplorer[2]))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteVector(colorsExplorer[3]))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteVector(colorsExplorer[4]))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteVector(colorsExplorer[5]))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write LONG RuntimeExplorer Count  
     if (!baseFile->WriteLong(rtCount))                                        return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write RuntimeExplorer paths  
     for (RuntimeItem* rt = firstRTI; rt; rt = rt->GetNext())  
     {  
          // - Write BOOL rt->flag&checked;  
          if (!baseFile->WriteBool(rt->GetBit(RTFLAGS_CHECKED)))          return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
          if (!baseFile->WriteFilename(rt->GetFilename()))               return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), rt->GetFilename().GetString());  
     }  
     if (selected)  
     {  
          // - Write String lastRTEFolder  
          if (!baseFile->WriteString(selected->GetPathString()))          return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     }  
     else if (!baseFile->WriteString(String("")))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v0.4.7  
     // - Write BOOL imageSearch  
     if (!baseFile->WriteBool(imageSearch))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteBool(useMasterSlaves))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // v0.4.8  
     if (!baseFile->WriteBool(clearSelection))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteBool(storeUndoLoad))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v0.4.9  
     // Dials  
     // - Write BOOL overrideParmEdit  
     if (!baseFile->WriteBool(overrideParmEdit))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real parmEditMin  
     if (!baseFile->WriteReal(parmEditMin))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real parmEditMax  
     if (!baseFile->WriteReal(parmEditMax))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real parmEditStep  
     if (!baseFile->WriteReal(parmEditStep))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v0.5.8   
     // - Write BOOL logging  
     if (!baseFile->WriteBool(logging))                                        return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v0.6.1  
     // Dials  
     // - Write BOOL overrideTransEdit  
     if (!baseFile->WriteBool(overrideTransEdit))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real transEditMin  
     if (!baseFile->WriteReal(transEditMin))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real transEditMax  
     if (!baseFile->WriteReal(transEditMax))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real transEditStep  
     if (!baseFile->WriteReal(transEditStep))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v0.6.3  
     // - Write BOOL groupCameras  
     if (!baseFile->WriteBool(groupCameras))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL groupLights  
     if (!baseFile->WriteBool(groupLights))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v0.6.7  
     // Dialog  
     // - Write BOOL explorerFold  
     if (!baseFile->WriteBool(explorerFold))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL actionsFold  
     if (!baseFile->WriteBool(actionsFold))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL prefsGeneralFold  
     if (!baseFile->WriteBool(prefsGeneralFold))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL prefsSceneFold  
     if (!baseFile->WriteBool(prefsSceneFold))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL prefsDialsFold  
     if (!baseFile->WriteBool(prefsDialsFold))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL prefsMatFold  
     if (!baseFile->WriteBool(prefsMatFold))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // Materials  
     // - Write BOOL useLuminance  
     if (!baseFile->WriteBool(useLuminance))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real illumDiffuseFalloff  
     if (!baseFile->WriteReal(illumDiffuseFalloff))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real illumDiffuseLevel  
     if (!baseFile->WriteReal(illumDiffuseLevel))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real illumRoughness  
     if (!baseFile->WriteReal(illumRoughness))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write LONG texturePreviewSize  
     if (!baseFile->WriteLong(texturePreviewSize))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Luminance ChannelSampling Sampling[CHANNELSAMPLING_LUMINANCE]  
     if (!baseFile->WriteBool(Sampling[CHANNELSAMPLING_LUMINANCE].use))               return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteLong(Sampling[CHANNELSAMPLING_LUMINANCE].sampling))          return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteReal(Sampling[CHANNELSAMPLING_LUMINANCE].blurOffset))     return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteReal(Sampling[CHANNELSAMPLING_LUMINANCE].blurScale))     return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v0.6.8  
     // - Write BOOL handSpreadLimits  
     if (!baseFile->WriteBool(handSpreadLimits))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v0.7.2  
     // - Write Filename externalApp  
     if (!baseFile->WriteFilename(externalApp))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v0.7.9  
     // - Write BOOL ignoreMatCase  
     if (!baseFile->WriteBool(ignoreMatCase))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v1.1.3  
     // - Write BOOL hideBanner  
     if (!baseFile->WriteBool(hideBanner))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v1.3.3  
     // - Write Vector ikColor  
     if (!baseFile->WriteVector(ikColor))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write LONG ikDisplay  
     if (!baseFile->WriteLong(ikDisplay))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write LONG ikOrient  
     if (!baseFile->WriteLong(ikOrient))                                        return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real ikRadius  
     if (!baseFile->WriteReal(ikRadius))                                        return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Real ikAspect  
     if (!baseFile->WriteReal(ikAspect))                                        return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v1.4.0  
     // - Write BOOL newStyleApply  
     if (!baseFile->WriteBool(newStyleApply))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL autoSave  
     if (!baseFile->WriteBool(autoSave))                                        return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write LONG numRecentContent  
     if (!baseFile->WriteLong(numRecentContent))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write LONG numRecentScene  
     if (!baseFile->WriteLong(numRecentScene))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL recentFold  
     if (!baseFile->WriteBool(recentFold))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write BOOL favoritesFold  
     if (!baseFile->WriteBool(favoritesFold))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v1.4.3  
     // - Write BOOL autoThumbWidth  
     if (!baseFile->WriteBool(autoThumbWidth))                              return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v1.4.4  
     // - Write BOOL autoThumbWidthFave  
     if (!baseFile->WriteBool(autoThumbWidthFave))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     // - Write Favorites Normal/Selected Color values  
     if (!baseFile->WriteVector(colorsFavorites[0]))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteVector(colorsFavorites[1]))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteVector(colorsFavorites[2]))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
     if (!baseFile->WriteVector(colorsFavorites[3]))                         return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     // v1.5.5  
     // - Write BOOL pngMethod  
     if (!baseFile->WriteBool(pngMethod))                                   return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_WRITEFILE_TEXT), baseFilename.GetString());  
  
     baseFile->Close();  
     return TRUE;  
}

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 16/09/2007 at 07:02, xxxxxxxx wrote:

Hi,

OK, I made certain progress. Here are my SavePreset() and LoadPreset() functions (shortened a bit).

First, there's SavePreset() :

static Bool SavePreset(BaseTag *tag, Filename fn)  
{  
     BaseFile* PresetFile;  
     PresetFile = BaseFile::Alloc(); if (!PresetFile) return FALSE;  
     if (PresetFile->Open(fn, GE_WRITE, FILE_DIALOG, GE_MOTOROLA, MACTYPE_CINEMA, MACCREATOR_CINEMA))  
     {  
          // Main Settings  
          PresetFile->WriteBool(tag->GetData().GetBool(SCOOBYCAMEXP_ENABLED));  
          PresetFile->WriteReal(tag->GetData().GetReal(SCOOBYCAMEXP_MAINFACTOR));  
          PresetFile->Close();  
          return TRUE;  
     }  
     else  
     {  
          return FALSE;  
     }  
       
}

The LoadPreset() looks almost similar:

static Bool LoadPreset(BaseTag *tag, Filename fn)  
{  
     BaseFile* PresetFile;  
     PresetFile = BaseFile::Alloc(); if (!PresetFile) return FALSE;  
     if (PresetFile->Open(fn, GE_READ, FILE_IGNOREOPEN, GE_MOTOROLA, MACTYPE_CINEMA, MACCREATOR_CINEMA))  
     {  
          BaseContainer *data = tag->GetDataInstance();  
          Bool BoolData;  
          Real RealData;  
  
          PresetFile->ReadBool(&BoolData;); data->SetBool(SCOOBYCAMEXP_ENABLED, BoolData);  
          PresetFile->ReadReal(&RealData;); data->SetReal(SCOOBYCAMEXP_MAINFACTOR, RealData);  
  
          PresetFile->Close();  
     }  
}  

For Bool, Real and Vector data this works perfectly. But now I have TWO questions:

1. Isn't it a clumsy way to use those BoolData and RealData variables in the LoadPreset() function? Isn't there a more elegant solution to read the value and derectly put it into the BaseTag data?

2. How can I read and write a spline from the BaseTag's data? For example, I have such a Spline data:

SC_TargetBlendCurve = (SplineData* ) tag->GetDataInstance()->GetCustomDataType(SCOOBYCAMEXP_TARGET_BLENDSPLINE, CUSTOMDATATYPE_SPLINE);

How can I write SC_TargetBlendCurve into the file and also read it from the file & put it back to the Tag's DataInstance?

You see, I am still beginner in C++ 😉

Thanks a lot for any help!!

Best regards & Greetings,
Jack

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 16/09/2007 at 13:38, xxxxxxxx wrote:

1. There is no way around this. You need to get at the value using a variable as an argument and then set the value using a variable. Since the ReadXXX() methods don't return the value (only success of reading), how else would you go about it? 🙂

2. You're going to need to dive into the resource folder and find the Spline resources for this custom data type in order to write that data out and read back in properly. You'll probably need to use a mix of GetDataIntance() and GetParameterI()/SetParameter() to get at the SplineData data.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 16/09/2007 at 14:01, xxxxxxxx wrote:

1. OK, I supposed so. I'll survive it 😉

2. I know how to access the SplineData, but do I really have to store all spline parameters separately? Is there no way to write a complete SplineData to a file?

I thought maybe WriteBytes(data, len) would help, but I am not sure if I am right and how to use it.

Regards,
Jack

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 16/09/2007 at 20:49, xxxxxxxx wrote:

Yes, you really do. 😉 If you store the 'data' you won't get much as most of it is stored in BaseContainers - and remember that BaseContainers can contain BaseContainers and other data types not necessarily fully described. Now, you can read/write BaseContainers to a Hyperfile but not using BaseFile or any non-SDK method.

As noted in the docs, I'd avoid reading/writing byte blocks as much as possible. First, they are not platform-independent. If you are going to support both Windows and MacOS, you'll need to be extremely careful about byte-order (which system saved it and which is reading it?). I've done it in the past with limited success - sometimes the data was not read properly when going between systems.

Second, something you might want to contemplate considerably, is that the data in the SplineData is not guaranteed never to change. This is Maxon's and they might decide to add/remove/change/reorder data on a whim (for efficiency or new feature, perhaps) in the next release - and then where are you? See why this isn't a good idea? If the data block was yours and you had that control, it'd be more tenable.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 17/09/2007 at 00:04, xxxxxxxx wrote:

OK, then I'll do that 😞

I was worried about how to determine which amount of data I have to read, since I do not know how many points a spline has, before I read them all. But I think, I'll just write the number of points and then read the appropriate number of values from the file.

Let's see how it works out. If I find a nice function for reading and writing spline data, I will post it here.

Greetings,
Jack

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 17/09/2007 at 00:27, xxxxxxxx wrote:

Saving the number of points in the spline and reading it in accordingly is a good practice. As you can see in my voluminous code example, this is exacly what I do for other variable numbers of elements. I store the count in a description resource and use that for the loop that reads in variable lengths of data elements.

The Hyperfile route may work here but it would be prudent to try it to see the results. Nonetheless, the second difficulty noting the volatile nature of the structures involved needs to be considered. Even supported structures like animation data has changed from R8.0 to R9.0 to R10.0 making compatability an issue when even stock plugin support is involved.

I agree that this requires more work and more consideration (I have 13 builds for one of my plugins which requires numerous preprocessor defines to placate the various methods and changes in the SDK over time). But the thing is not to only consider the current build but future expectations of change. At some point, something seemingly concrete changes (say Polygon* to CPolygon* as a nasty example of required code adaptation). Any parameters that can be described 'independently' so as to provide the least correspondence changes later will prove useful to continued support and easier updates.

So, basically, by going the more verbose route you should find it easier (believe it or not) to adapt the code to changes in the SDK just by making the appropriate preprocessor defines when you are supporting various versions.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 17/09/2007 at 15:35, xxxxxxxx wrote:

I have made myself two nice little functions. I pass to them the BaseFile (already open for writing) and the SplineData.

This one writes SplineData into the BaseFile:

static Bool WriteSplineData(BaseFile *bf, SplineData *spd)  
{  
     Real SplineRound;  
     LONG KnotCount;  
     LONG i;  
     SplineData *sd = (SplineData* ) spd;  
  
     if (!sd || !bf) return FALSE;  
     SplineRound = sd->GetRound();  
     KnotCount = sd->GetKnotCount();  
  
     bf->WriteLong(KnotCount);  
     bf->WriteReal(SplineRound);  
     if (KnotCount > 0)  
     {  
          for (i=1; i<=KnotCount; i++)  
          {  
               bf->WriteVector(sd->GetKnots() _.vPos);  
          }  
     }  
     return TRUE;  
}

And this one for reading the data from a BaseFile:

static Bool ReadSplineData(BaseFile *bf, SplineData *spd)  
{  
     Real SplineRound;  
     LONG KnotCount;  
     LONG i;  
     Vector VectorData;  
     SplineData *sd = (SplineData* ) spd;  
  
     if (!sd || !bf) return FALSE;  
     bf->ReadLong(&KnotCount;);  
     bf->ReadReal(&SplineRound;);  
  
     sd->DeleteAllPoints();  
     sd->SetRound(SplineRound);  
  
     if (KnotCount > 0)  
     {  
          for (i=1; i<=KnotCount; i++)  
          {  
               bf->ReadVector(&VectorData;);  
               sd->InsertKnot(VectorData.x, VectorData.y);  
          }  
     }  
     return TRUE;  
}

Best regards,
Jack