Re-Import

 

Version Info

Minimum Origin Version Required: Origin 8.5.1

Description

Origin improve Re-Importing for the data format type in File: Import submenu. From 8.5.1, Re-Import supports the user define data format file. The following is an example on how to create an X-Function to import a binary file to Worksheet with the re-import options.

Steps

  1. New an X-Function named impuser like the following picture.
    XF impuser.png reimp variable for internal used to specify this X-Function be called from the 1st importing or re-importing.
    reimportable also for internal used to specify this X-Function if can do reimport. So the value in Data column should be 1.
    The two variables both are hidden on dailog. See "V:0" in Option String column. This option used to set control as hidden.
  2. Open this X-Function in Origin Code Builder. Add the following codes to impuser function:
    Worksheet wks;
    okxf_resolve_string_get_origin_object(orng.GetDescription(), &wks);
    
    //Fill target page with numbers
    _import_to_wks(fname, options, wks);
    
    // add import information for reimport
    add_import_info(wks, fname, options, orng, reimp);
    
  3. Copy the following funtions to the line after //put your own support static functions here.
    //put your own support static functions here
    #include <..\OriginLab\fu_utils.h>
    
    static void add_import_info(Worksheet& wks, const string& fname, TreeNode& options, const Range& orng, int reimp)
    {     
            // save X-Function name into options tree
            fuSetXFunctionName(options, "impuser");
            
            TreeNode tnUsingFilter; // filter is none
            double dDefault = 0;
            if ( fuGetDouble(options, IDE_DISP_IMP_ORIGINVER, dDefault) )
                    tnUsingFilter = options;
            
            Tree trInput;
            TreeNode trRange = trInput.AddNode("Range");
            if (!trRange.SetDataRange(orng))
                    return;
            
            if (!impinfo_AddFile(wks, fname, NULL, ASCIMP_MODE_NEW_SHEETS, FILTER_TYPE_XFUNC, tnUsingFilter, 1, trRange, reimp))
                    return;
    }
    
    static bool _import_to_wks(const string& fname, TreeNode& options, Worksheet &wks)
    {     
            if ( !wks.IsValid() ) 
                    return false;
            
            file fIn;  
            if( fIn.Open(fname, file::modeRead | file::shareDenyWrite) == FALSE ) 
                    return false;
            
            vector vv(10);
            fIn.Read(vv, 10 * sizeof(double)); 
            fIn.Close();
            
            if( wks.GetNumCols() == 0 )
                    wks.SetSize(-1, 1);
    
            Column col = wks.Columns(0);
            vectorbase &vb = col.GetDataObject();
            vb = vv;
            return true;
    }
    
  4. Put the codes below into impuser_make_tree function to construct options tree. If want to remove options tree to keep X-Function simple, you can add "V:0" for this variable in Option String column in X-Function Builder to hide this control. But cannot remove this variable since re-import need put some useful information into this tree.
    if(0 == strcmp(lpcszVarName, "options") )
    {
            // add import mode related treenodes              
            constructOptionsForXF(tr, false, true);
    }
    
  5. Click Compile button on the top of this X-Function.

Import and Re-Import

  1. In Origin Code Builder, new a c/cpp file and copy the following codes to it. This function used to write a data array to a *.dat file. This file will be used to do import in the below step. Click Build toobar button to compile and link.
    void write_binary_file(double dd)
    {
            string fname = GetOriginPath(ORIGIN_PATH_USER) + "TestFile.dat";
            file fIn;  
            if( fIn.Open(fname, file::modeWrite | file::modeCreate) == FALSE ) 
                    return;
            
            vector vData;
            vData.Data(1,10,1);
            vData += dd;
            fIn.Write(vData, sizeof(double)*vData.GetSize());        
            fIn.Close();
    }
    
  2. Run "write_binary_file 0" in Command window to create file TestFile.dat under Origin User File Folder and write data 1,2,... 10 to file.
  3. Run "impuser -d" in Command window and click OK button to import this file.
  4. Run "write_binary_file 10" in Command window to rewrite data 11,12,...20, into the same data file.
  5. Choose Origin menu File: Re-Import Directly to do re-import.