Changeset 949


Ignore:
Timestamp:
May 26, 2020 3:39:33 PM (2 years ago)
Author:
ilavsky
Message:

Fix IN2G_DuplicateGraphAndData with data to work with subwindows

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/User Procedures/Indra 2/IN2_GeneralProcedures.ipf

    r948 r949  
    26812681//*****************************************************************************************************************
    26822682//*****************************************************************************************************************
    2683 //this is from IgorExchange: http://www.igorexchange.com/node/1469
    2684 //does not work for cases when graph has same name waves and cannot fix it... 
    2685 //static Function IN2G_CloneWindow2([win,name,times])
    2686 //      String win
    2687 //      String name // The new name for the window and data folder.
    2688 //      Variable times // The number of clones to make.  Clones beyond the first will have _2, _3, etc. appended to their names.   
    2689 //      IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
    2690 //      String curr_folder=GetDataFolder(1)
    2691 //      setDataFolder root:
    2692 //      if(ParamIsDefault(win))
    2693 //              win=WinName(0,1)
    2694 //      endif
    2695 //      if(ParamIsDefault(name))
    2696 //              name=UniqueName(win,6,0)
    2697 //              name=UniqueName(name,7,0)
    2698 //              name=UniqueName(name,11,0)
    2699 //      else
    2700 //              name=CleanupName(name,0)
    2701 //              name=UniqueName(name,6,0)
    2702 //              name=UniqueName(name,7,0)
    2703 //              name=UniqueName(name,11,0)
    2704 //      endif
    2705 //      times=ParamIsDefault(times) ? 1 : times
    2706 //      NewDataFolder /O/S root:$name
    2707 //      String win_rec=WinRecreation(win,0)
    2708 //      String traces=TraceNameList(win,";",3)
    2709 //      string tempName, trace, AddOn
    2710 //      Variable i,j
    2711 //      for(i=0;i<ItemsInList(traces);i+=1)
    2712 //              trace=StringFromList(i,traces)
    2713 //              tempName = trace
    2714 //              if(StringMatch(trace, "*#*"))                   //we have wave with multiplier
    2715 //                      tempName = ReplaceString("'", trace, "")                //removes ' from liberal names
    2716 //                      tempName = ReplaceString("#", trace, "_")               //replaces # for cases when waves of same names are used
    2717 //                      tempName = PossiblyQuoteName(tempName )
    2718 //              endif
    2719 //              Wave TraceWave=TraceNameToWaveRef(win,trace)
    2720 //              Duplicate /o TraceWave $(tempName)
    2721 //              win_rec = ReplaceString(trace, win_rec, tempName)
    2722 //              //main wave dealt with
    2723 //              Wave /Z TraceXWave=XWaveRefFromTrace(win,trace)
    2724 //              tempName = NameOfWave(TraceXWave)
    2725 //              if(waveexists(TraceXWave))
    2726 //                      tempName = ReplaceString("'", trace, "")                //remvoes ' from liberal names
    2727 //                      tempName = ReplaceString("#", trace, "_")               //replaces # for cases when waves of same names are used
    2728 //                      tempName = PossiblyQuoteName(tempName )         
    2729 //                      Duplicate /o TraceXWave $NameOfWave(TraceXWave)
    2730 //              endif
    2731 //      endfor
    2732 //
    2733 //      // Copy error bars if they exist.  Won't work with subrange display syntax. 
    2734 //      for(i=0;i<ItemsInList(win_rec,"\r");i+=1)
    2735 //              String line=StringFromList(i,win_rec,"\r")
    2736 //              if(StringMatch(line,"*ErrorBars*"))
    2737 //                      String errorbar_names
    2738 //                      SplitString/E=",.*" line
    2739 //                      sscanf S_value,"%*[^=]=(%[^)])",errorbar_names
    2740 //                      for(j=0;j<2;j+=1)
    2741 //                              String errorbar_path=StringFromList(j,errorbar_names,",")
    2742 //                              sscanf errorbar_path,"%[^[])",errorbar_path
    2743 //                              String errorbar_name=StringFromList(ItemsInList(errorbar_path,":")-1,errorbar_path,":")
    2744 //                              Duplicate /o $("root"+errorbar_path) $errorbar_name
    2745 //                      endfor
    2746 //              endif
    2747 //      endfor
    2748 //      print win_rec
    2749 //      string NewName=""
    2750 //      for(i=1;i<=times;i+=1)
    2751 //              Execute /Q win_rec
    2752 //              if(i==1)
    2753 //                      DoWindow /C $name
    2754 //                      NewName = name
    2755 //              else
    2756 //                      DoWindow /C $(name+"_"+num2str(i))
    2757 //                      NewName = name+"_"+num2str(i)
    2758 //              endif
    2759 //              ReplaceWave allInCDF
    2760 //              DoWindow/T $(NewName), "Duplicate of "+win+" data in root:"+NewName
    2761 //      endfor
    2762 //     
    2763 //      SetDataFolder $curr_folder
    2764 //End
    2765 
    2766 //*****************************************************************************************************************
    2767 //*****************************************************************************************************************
    27682683static Function IN2G_DuplicateGraphAndData()
    27692684        //this will duplicate top X-Y graph and copy all data (including optional error bars) to new folder.
    27702685        //Only X-Y graphs supported.
     2686        //fails on graphs with subwindow for now!
    27712687        String curr_folder=GetDataFolder(1)
    27722688        string GraphwinNmOld=WinName(0,1)
     2689        String win_rec=WinRecreation(GraphwinNmOld,0)                                                                   //recreation macro for current old graph.
    27732690        string GraphwinNmNew
    27742691        if(strlen(GraphwinNmOld)<1)
     
    27782695        Variable i,j
    27792696        String trace, tempYName, tempXName, nameStr
    2780         String traces
     2697        String traces, SubwindowNames
    27812698        //create a copy of the current top graph
    27822699        DoWIndow/F $(GraphwinNmOld)
    27832700        DoIgorMenu "Edit", "Duplicate"         
    2784         if(V_Flag)                                                                                                                                              //success, new graph created
    2785                 GraphwinNmNew=WinName(0,1)                                                                                              //name which Duplicate Graph command created
    2786                 nameStr=GraphwinNmNew
    2787                 setDataFolder root:                                                                                                             //need to be in root to be able to check for name
    2788                 if(CheckName(nameStr, 1)!=0)
    2789                         nameStr = uniquename(nameStr,11,0)                                                                      //if needed, modified folder name to be unique in root folder
    2790                 endif
    2791                 //nameStr is now unique folder name based on GraphwinNmNew
    2792                 NewDataFolder /S root:$nameStr                                                                                  //new folder for data.
    2793                 traces=TraceNameList(GraphwinNmNew,";",3)                                                       //all traces in the new graph
    2794                 for(i=ItemsInList(traces)-1;i>=0;i-=1)                                                          //iterate from back or #N will keep being reordered
    2795                         trace=StringFromList(i,traces)                                                                          //a trace
    2796                         Wave TraceWave=TraceNameToWaveRef(GraphwinNmNew,trace)          //waveY
    2797                         Wave /Z TraceXWave=XWaveRefFromTrace(GraphwinNmNew,trace)       //waveX if exists
    2798                         tempYName = NameOfWave(TraceWave)                                                                       //waveY name
    2799                         if(CheckName(tempYName, 1)!=0)
    2800                                 tempYName = uniquename(tempYName,1,0)                                                   //if needed modified waveY name to be unique in current folder
     2701        if(V_Flag!=1)
     2702                print "Could not clone window, something went wrong or no graph window exists"
     2703                abort   
     2704        endif           
     2705        //was duplicated. need to copy data                                                                     //success, new graph created
     2706        setDataFolder root:                                                                                                             //need to be in root to be able to check for name
     2707        GraphwinNmNew=WinName(0,1)                                                                                              //name which Duplicate Graph command created
     2708        nameStr=GraphwinNmNew
     2709        SubwindowNames = ChildWindowList(GraphwinNmNew)                                 //list of subwindows...
     2710        if(CheckName(nameStr,11)!=0)
     2711                nameStr = uniquename(nameStr,11,0)                                                                      //if needed, modified folder name to be unique in root folder
     2712        endif
     2713        //nameStr is now unique folder name based on GraphwinNmNew
     2714        //this is the main window...
     2715        NewDataFolder /S root:$nameStr                                                                                  //new folder for data.
     2716        traces=TraceNameList(GraphwinNmNew,";",3)                                                       //all traces in the new graph
     2717        for(i=ItemsInList(traces)-1;i>=0;i-=1)                                                          //iterate from back or #N will keep being reordered
     2718                trace=StringFromList(i,traces)                                                                          //a trace
     2719                Wave TraceWave=TraceNameToWaveRef(GraphwinNmNew,trace)          //waveY
     2720                Wave /Z TraceXWave=XWaveRefFromTrace(GraphwinNmNew,trace)       //waveX if exists
     2721                tempYName = NameOfWave(TraceWave)                                                                       //waveY name
     2722                if(CheckName(tempYName, 1)!=0)
     2723                        tempYName = uniquename(tempYName,1,0)                                                   //if needed modified waveY name to be unique in current folder
     2724                endif
     2725                Duplicate/O TraceWave $tempYName                                                                        //copy of waveY in current folder. 
     2726                if(waveexists(TraceXWave))                                                                                      //same treatment for X wave, if exists
     2727                        tempXName = NameOfWave(TraceXWave)
     2728                        if(CheckName(tempXName, 1)!=0)
     2729                                tempXName = uniquename(tempXName,1,0)                                           //if needed modified waveX name to be unique in current folder
    28012730                        endif
    2802                         Duplicate/O TraceWave $tempYName                                                                        //copy of waveY in current folder. 
    2803                         if(waveexists(TraceXWave))                                                                                      //same treatment for X wave, if exists
    2804                                 tempXName = NameOfWave(TraceXWave)
    2805                                 if(CheckName(tempXName, 1)!=0)
    2806                                         tempXName = uniquename(tempXName,1,0)                                           //if needed modified waveX name to be unique in current folder
     2731                        Duplicate /O TraceXWave $tempXName                                                              //copy of waveX in current folder. 
     2732                        ReplaceWave /X/W=$(GraphwinNmNew) trace=$(trace) , $tempXName           //this swaps the old X wave with the new copy
     2733                endif
     2734                ReplaceWave /W=$(GraphwinNmNew) trace=$(trace) , $tempYName                             //this swaps the old Y wave with the new copy
     2735        endfor
     2736        //now we need to deal with subwindows, if present...
     2737        string SubWinName, tempSubWinFullname
     2738        if(ItemsInList(SubwindowNames)>0)
     2739                For(j=0;j<ItemsInList(SubwindowNames);j+=1)
     2740                        SubWinName = StringFromList(j,SubwindowNames)
     2741                        tempSubWinFullname = GraphwinNmNew+"#"+SubWinName
     2742                        NewDataFolder /S $(SubWinName)
     2743                        traces=TraceNameList(tempSubWinFullname,";",3)
     2744                        for(i=ItemsInList(traces)-1;i>=0;i-=1)                                                          //iterate from back or #N will keep being reordered
     2745                                        trace=StringFromList(i,traces)                                                                          //a trace
     2746                                        Wave TraceWave=TraceNameToWaveRef(tempSubWinFullname,trace)             //waveY
     2747                                        Wave /Z TraceXWave=XWaveRefFromTrace(tempSubWinFullname,trace)  //waveX if exists
     2748                                        tempYName = NameOfWave(TraceWave)                                                                       //waveY name
     2749                                        if(CheckName(tempYName, 1)!=0)
     2750                                                tempYName = uniquename(tempYName,1,0)                                                   //if needed modified waveY name to be unique in current folder
     2751                                        endif
     2752                                        Duplicate/O TraceWave $tempYName                                                                        //copy of waveY in current folder. 
     2753                                        if(waveexists(TraceXWave))                                                                                      //same treatment for X wave, if exists
     2754                                                tempXName = NameOfWave(TraceXWave)
     2755                                                if(CheckName(tempXName, 1)!=0)
     2756                                                        tempXName = uniquename(tempXName,1,0)                                           //if needed modified waveX name to be unique in current folder
     2757                                                endif
     2758                                                Duplicate /O TraceXWave $tempXName                                                              //copy of waveX in current folder. 
     2759                                                ReplaceWave /X/W=$(tempSubWinFullname) trace=$(trace) , $tempXName              //this swaps the old X wave with the new copy
     2760                                        endif
     2761                                        ReplaceWave /W=$(tempSubWinFullname) trace=$(trace) , $tempYName                                //this swaps the old Y wave with the new copy
     2762                        endfor
     2763                        setDataFolder root:$nameStr
     2764                endfor
     2765        endif
     2766        //these are X-Y data, now we need to copy error bars also...
     2767        win_rec=WinRecreation(GraphwinNmNew,0)                                                                  //recreation macro for current updated graph.
     2768        String errorbar_names, errorbar_name
     2769        String errorbar_path
     2770        String line, lineNew
     2771        // Copy error bars if they exist. Assume only symmetric (+/- error wave) error bars   
     2772        for(i=0;i<ItemsInList(win_rec,"\r");i+=1)                 
     2773                line=StringFromList(i,win_rec,"\r")
     2774                if(StringMatch(line, "*/HOST*"))                                                                                //here start subwindow syntax, get out of here and go to subwindows...
     2775                        break
     2776                endif
     2777                if(StringMatch(line,"*ErrorBars*"))                                                             //line with "ErrorBars command"
     2778                        SplitString/E=",.*" line                                                                                        //ugly way of pulling out errorbar_path
     2779                        sscanf S_value,"%*[^=]=(%[^)])",errorbar_names                          //ugly way of pulling out errorbar_path
     2780                        for(j=0;j<1;j+=1)
     2781                                errorbar_path=StringFromList(j,errorbar_names,",")      //errorbar_path now is path to wave for error bars, again, assuming same up/down.       
     2782                                sscanf errorbar_path,"%[^[])",errorbar_path                             //ugly way of pulling out errorbar_path
     2783                                errorbar_name=StringFromList(ItemsInList(errorbar_path,":")-1,errorbar_path,":")                //get error wave name
     2784                                if(CheckName(errorbar_name, 1)!=0)
     2785                                        errorbar_name = uniquename(errorbar_name,1,0)                   //make the new error wave name unique, if necessary...
    28072786                                endif
    2808                                 Duplicate /O TraceXWave $tempXName                                                              //copy of waveX in current folder. 
    2809                                 ReplaceWave /X/W=$(GraphwinNmNew) trace=$(trace) , $tempXName           //this swaps the old X wave with the new copy
    2810                         endif
    2811                         ReplaceWave /W=$(GraphwinNmNew) trace=$(trace) , $tempYName                             //this swaps the old Y wave with the new copy
     2787                                Duplicate /O $("root"+errorbar_path) $errorbar_name             //duplicate to new wave
     2788                        endfor
     2789                        lineNew = ReplaceString(errorbar_path, line, errorbar_name)             //create a new ErrorBar command line for error bars
     2790                        Execute/Q/Z(lineNew)                                                                                                                    //and run it on the graph.
     2791                endif
     2792        endfor
     2793        //done with error bars in main graph...
     2794        //subwindows are next...
     2795        if(ItemsInList(SubwindowNames)>0)                                                                                       //are tehre any subwindows?
     2796                For(j=0;j<ItemsInList(SubwindowNames);j+=1)                                                     //iterate over them
     2797                        SubWinName = StringFromList(j,SubwindowNames)                                   //this is the subwindow name
     2798                        tempSubWinFullname = GraphwinNmNew+"#"+SubWinName                               //full name including main graph name
     2799                        setDataFolder $(SubWinName)                                                                                     //here should be data
     2800                        win_rec=WinRecreation(tempSubWinFullname,0)                                             //this is recreation macro for subwindow only
     2801                        for(i=0;i<ItemsInList(win_rec,"\r");i+=1)                                               //look for Errorbar line
     2802                                line=StringFromList(i,win_rec,"\r")                                                     
     2803                                if(StringMatch(line,"*ErrorBars*"))                                                             //line with "ErrorBars command"
     2804                                        SplitString/E=",.*" line                                                                                        //ugly way of pulling out errorbar_path
     2805                                        sscanf S_value,"%*[^=]=(%[^)])",errorbar_names                          //ugly way of pulling out errorbar_path
     2806                                        for(j=0;j<1;j+=1)
     2807                                                errorbar_path=StringFromList(j,errorbar_names,",")      //errorbar_path now is path to wave for error bars, again, assuming same up/down.       
     2808                                                sscanf errorbar_path,"%[^[])",errorbar_path                             //ugly way of pulling out errorbar_path
     2809                                                errorbar_name=StringFromList(ItemsInList(errorbar_path,":")-1,errorbar_path,":")                //get error wave name
     2810                                                if(CheckName(errorbar_name, 1)!=0)
     2811                                                        errorbar_name = uniquename(errorbar_name,1,0)                   //make the new error wave name unique, if necessary...
     2812                                                endif
     2813                                                Duplicate /O $("root"+errorbar_path) $errorbar_name             //duplicate to new wave
     2814                                        endfor
     2815                                        lineNew = ReplaceString(errorbar_path, line, errorbar_name)                                                                     //create a new ErrorBar command line for error bars
     2816                                        lineNew = ReplaceString("ErrorBars", lineNew, "ErrorBars /W="+tempSubWinFullname)               //create a new ErrorBar command line for error bars, need to add /W=Win#Subwin
     2817                                        Execute(lineNew)                                                                                                                                                                                //and run it on the graph.
     2818                                endif
     2819                        endfor
     2820                        setDataFolder root:$nameStr                                                                                             //back to main folder.
    28122821                endfor
    2813                 //these are X-Y data, now we need to copy error bars also...
    2814                 String win_rec=WinRecreation(GraphwinNmNew,0)                                                                   //recreation macro for current updated graph.
    2815                 String errorbar_names, errorbar_name
    2816                 String errorbar_path
    2817                 String line
    2818                 // Copy error bars if they exist. Assume only symmetric (+/- error wave) error bars   
    2819                 for(i=0;i<ItemsInList(win_rec,"\r");i+=1)                 
    2820                         line=StringFromList(i,win_rec,"\r")
    2821                         if(StringMatch(line,"*ErrorBars*"))                                                             //line with "ErrorBars command"
    2822                                 SplitString/E=",.*" line                                                                                        //ugly way of pulling out errorbar_path
    2823                                 sscanf S_value,"%*[^=]=(%[^)])",errorbar_names                          //ugly way of pulling out errorbar_path
    2824                                 for(j=0;j<1;j+=1)
    2825                                         errorbar_path=StringFromList(j,errorbar_names,",")      //errorbar_path now is path to wave for error bars, again, assuming same up/down.       
    2826                                         sscanf errorbar_path,"%[^[])",errorbar_path                             //ugly way of pulling out errorbar_path
    2827                                         errorbar_name=StringFromList(ItemsInList(errorbar_path,":")-1,errorbar_path,":")                //get error wave name
    2828                                         if(CheckName(errorbar_name, 1)!=0)
    2829                                                 errorbar_name = uniquename(errorbar_name,1,0)                   //make the new error wave name unique, if necessary...
    2830                                         endif
    2831                                         Duplicate /O $("root"+errorbar_path) $errorbar_name             //duplicate to new wave
    2832                                 endfor
    2833                                 line = ReplaceString(errorbar_path, line, errorbar_name)                //create a new ErrorBar command line for error bars
    2834                                 Execute(line)                                                                                                                   //and run it on the graph.
    2835                         endif
    2836                 endfor
    2837                 //done with error bars now...
    2838                 DoWindow/T $(GraphwinNmNew), "Duplicate of "+GraphwinNmOld+", data in root:"+nameStr            //append user friendly name.
    2839         else
    2840                 print "Could not clone window, something went wrong or no graph window exists"
    2841         endif
     2822        endif           
     2823        DoWindow/T $(GraphwinNmNew), "Duplicate of "+GraphwinNmOld+", data in root:"+nameStr                                    //append user friendly name.
     2824        //should be done.
    28422825        SetDataFolder $curr_folder
    28432826end
Note: See TracChangeset for help on using the changeset viewer.