Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Load/Save Presets?

    Scheduled Pinned Locked Moved SDK Help
    13 Posts 0 Posters 970 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

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

      On 15/09/2007 at 12:42, xxxxxxxx wrote:

      Anything defined in the resource as descriptions for the plugin tag is loaded/saved automatically. You do not EVER need to load and save these yourself - probably not recommended either.

      Anything not defined there, such as class variables, should be loaded/saved using Read()/Write()/CopyTo() (when you use one of these methods, all three must be defined in the plugin Data - your TagData derived class).

      If any variables depend on other tags/objects/etc., you'll want to set them by checking for the MSG_MULTI_DOCUMENTIMPORTED message in Message() for your tag. This guarantees that the entire document has been loaded for proper referencing.

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

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

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

        I know that all settings are stored in the scene. But I want to be able to store his settings to a file, so he can archive his favourite settings. Like presets.

        Greetings,
        Jack

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          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.

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            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

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              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;  
              }
              
              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                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

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

                  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.

                  1 Reply Last reply Reply Quote 0
                  • H Offline
                    Helper
                    last edited by

                    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

                    1 Reply Last reply Reply Quote 0
                    • H Offline
                      Helper
                      last edited by

                      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.

                      1 Reply Last reply Reply Quote 0
                      • H Offline
                        Helper
                        last edited by

                        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

                        1 Reply Last reply Reply Quote 0
                        • H Offline
                          Helper
                          last edited by

                          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.

                          1 Reply Last reply Reply Quote 0
                          • H Offline
                            Helper
                            last edited by

                            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

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post