source: trunk/User Procedures/Indra 2/IN3_SamplePlate.ipf @ 1180

Last change on this file since 1180 was 1180, checked in by ilavsky, 9 months ago

Increase copyright to 2022

File size: 183.8 KB
Line 
1#pragma TextEncoding = "UTF-8"
2#pragma rtGlobals=3                             // Use modern global access method and strict wave access
3#pragma DefaultTab={3,20,4}             // Set default tab width in Igor Pro 9 and later
4#pragma version = 1.08
5#pragma IgorVersion=8.03
6
7
8//*************************************************************************\
9//* Copyright (c) 2005 - 2022, Argonne National Laboratory
10//* This file is distributed subject to a Software License Agreement found
11//* in the file LICENSE that is included with this distribution.
12//*************************************************************************/
13
14//this is tool to setup Sample Plates for USAXS, survey sample positions, and generate Command files.
15
16//1.08 add Export list of saved sets. Increased version number of the panel.   
17//1.07 add IN3S_ImportFile which imports other command files. For nwo set for 12IDB command files.
18//1.06 add Import Image for iamge of sample plate. Straightens paralax and trims based on user corner selection and dimensions provided.
19//1.05 added Append to command file
20//1.04 modifications to beamline survey with epics controls.
21//1.03 Remove for MatrixOP /NTHR=0 since it is applicable to 3D matrices only
22//1.02 Added checking if existing sate is saved to reduce number of dialogs user needs to deal with.
23//1.01 Added NMRAcrylicPlate
24//1.0 September2020, first release.
25//0.6 many fixes
26//0.4 developement, with beamline survey code...
27
28
29//************************************************************************************************************
30//to add new plate:
31//add in popup a name for it, create also wave/variable names
32//add in IN3S_CreateDefaultPlates
33//add in IN3S_DrawImageOfPlate
34//add to PopulateTabel button in IN3S_ButtonProc
35//warnings..
36//              SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
37//              WarningForUser = "Could not records values for this positon, no row selected"
38//
39//for epics support we need epics.xop https://sourceforge.net/p/igor2epics/wiki/Home/
40
41//************************************************************************************************************
42
43constant IN3_SamplePlateSetupVersion=1.08
44constant IN3SBeamlineSurveyEpicsMonTicks = 15
45constant IN3SBeamlineSurveyDevelopOn = 0
46//  values for beamtime estimate, last calibrated using BS on 7/31/2021 JIL (used 15 scan records BS).
47//  result is about 2 minutes more than real time.
48constant IN3BmSrvUSAXSOverhead          = 10            //overhead for flyscan
49constant IN3BmSrvSAXSOverhead           = 3                     //overhead for SAXS, transmission measurement
50constant IN3BmSrvWAXSOverhead           = 1                     //overhead for WAXS
51constant IN3BmSrvSampleMoveSpeed        = 2                     //average moving samples around in mm/sec, is 4rev/sec
52constant IN3BmSrvTuneTimeStep           = 600           //retune every 600 seconds
53constant IN3BmSrvTuneTimeNumU           = 3                     //retune every 3 USAXS scans
54constant IN3BmSrvTuneAveTime            = 40            //retune takes avergate 40 seconds full preUSAXStune is 40 seconds...
55constant IN3BmSrvSWTuneAveTime          = 14            //SWAXS tune MR
56constant IN3BmSrvMoveGeometryTime       = 20            //overhead to move from USAXS to SAXS to WAXS
57
58
59//TODO:
60//              add "Saved & Dirty" flag to avoid some dialogs.
61
62
63//************************************************************************************************************
64//************************************************************************************************************
65//************************************************************************************************************
66//************************************************************************************************************
67//****************************************************************************************
68 
69
70Function IN3S_SampleSetupMain()
71
72        DFrEF OldDf=GetDataFolderDFR()
73
74        IN3S_Initialize()
75        IN3S_CreateDefaultPlates()
76        KillWindow/Z TrimCorrectImageDrawing
77        IN3S_CreateTablesForPlates(0, 0)
78        IN3S_MainPanel()
79        ING2_AddScrollControl()
80        IN3_UpdatePanelVersionNumber("SamplePlateSetup", IN3_SamplePlateSetupVersion)
81        IN3S_FixUSWAXSForAll()
82        IN3S_AddTagToImage(-4)  //remove all drawings, if needed       
83        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
84        WarningForUser = "Tool started... Report bugs and wishes to author!"
85        IN3S_EstimateRunTime()
86        setDataFolder OldDf
87end
88
89//************************************************************************************************************
90//************************************************************************************************************
91Function IN3S_ExportHookFunction(listWaveG, LBSelectionWvG)
92        wave listWaveG, LBSelectionWvG
93        //  Modify this function as needed, for example comment out lines etc.
94        //  These are parameters:
95        //              IN3S_WriteListOfCommands(listWaveG, LBSelectionWvG, sxOffset, syOffset, TitleModifier)
96        //      1. Keep the wave names listWaveG, LBSelectionWvG as they are. These contain info for all samples. 
97        //      2. Change the sxOffset and syOffset [mm] (these values are added to the sx and sy in the table).
98        //      3. Change the TitleModifier, this is appended to the sample name.
99        //      4. make sure you have "Run Export Hook function" checkbox checked and compiled procedures.
100        //************************************************************************************************S
101        //this measures right of center position
102        IN3S_WriteListOfCommands(listWaveG, LBSelectionWvG, -1, 0, "_R")
103        //this measures top of center position
104        IN3S_WriteListOfCommands(listWaveG, LBSelectionWvG, 0, -1, "_T")
105        //this measures left of center position
106        IN3S_WriteListOfCommands(listWaveG, LBSelectionWvG, 1, 0, "_L")
107        //this measures bottom of center position
108        IN3S_WriteListOfCommands(listWaveG, LBSelectionWvG, 0, 1, "_B")
109end
110//*****************************************************************************************************************
111//*****************************************************************************************************************
112//************************************************************************************************************
113//************************************************************************************************************
114
115Function IN3S_SaPlateCheckVersion()     
116        DoWindow SamplePlateSetup
117        if(V_Flag)
118                if(!IN3_CheckPanelVersionNumber("SamplePlateSetup", IN3_SamplePlateSetupVersion))
119                        DoAlert /T="The Sample Plate setup panel was created by incorrect version of Indra " 1, "Sample Plate setup needs to be restarted to work properly. Restart now?"
120                        if(V_flag==1)
121                                KillWIndow/Z SamplePlateSetup
122                                IN3S_SampleSetupMain()
123                        else            //at least reinitialize the variables so we avoid major crashes...
124                                IN3S_Initialize()
125                        endif
126                endif
127        endif
128end
129//************************************************************************************************************
130//************************************************************************************************************
131
132
133Function IN3S_MainPanel()
134
135        string oldDf=GetDataFolder(1)
136        setDataFolder root:Packages:SamplePlateSetup
137        DoWindow SamplePlateSetup
138        if(V_Flag)
139                DoWindow/F SamplePlateSetup
140        else
141                PauseUpdate             // building window...
142                NewPanel /K=1 /W=(2.25,43.25,590,725)/N=SamplePlateSetup as "Sample Plate setup"
143                TitleBox Title title="\Zr210Sample Plate setup",pos={120,3},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428), anchor=MC
144                Button GetHelp,pos={490,25},size={80,15},fColor=(65535,32768,32768), proc=IN3S_ButtonProc,title="Get Help", help={"Open www manual page for this tool"}
145                //left size
146                TitleBox Info1 title="\Zr120New positions : ",pos={10,35},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0
147                Button CreateNewSet,pos={10,55},size={150,17}, proc=IN3S_ButtonProc,title="Create New Sample Set", help={"Creates new set of sample positions"}
148                Button AddMoreLines,pos={10,75},size={150,17}, proc=IN3S_ButtonProc,title="Add Sample Positions", help={"Adds more sample positions"}
149                SetVariable NumberOfSamplesToCreate,pos={170,62},size={100,20}, limits={1, 500, 10}, proc=IN3S_SetVarProc,title="Lines = "
150                Setvariable NumberOfSamplesToCreate,fStyle=2, variable=root:Packages:SamplePlateSetup:NumberOfSamplesToCreate, help={"How many sample positions to create"}
151                TitleBox Info2 title="\Zr120Saved Sets : ",pos={10,95},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0
152                PopupMenu SelectSavedSet,pos={10,110},size={330,21},noproc,title="Select Saved set : ", help={"Select folder with saved set of data"}
153                PopupMenu SelectSavedSet,mode=1,value= #"\"---;\"+IN3S_GenStringOfSets()"
154                Button LoadSavedSet,pos={10,135},size={180,17}, proc=IN3S_ButtonProc,title="Load saved Positions Set", help={"Loads postions set saved before"}
155       
156                TitleBox Info3 title="\Zr120Templates : ",pos={300,32},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0
157                SVAR SelectedPlateName=root:Packages:SamplePlateSetup:SelectedPlateName
158                PopupMenu NewPlateTemplate,pos={300,50},size={330,21},proc=IN3S_PopMenuProc,title="Template :", help={"Pick Plate template"}
159                PopupMenu NewPlateTemplate,mode=1,popvalue=SelectedPlateName, fColor=(1,16019,65535)
160                PopupMenu NewPlateTemplate,value="9x9 Acrylic/magnetic plate;NMR Acrylic plate;Old Style Al Plate;NMR Tubes holder;NMR tubes heater;Generic Grid holder;AgBehenateLaB6;"
161                Button PopulateTable,pos={300,75},size={120,17}, proc=IN3S_ButtonProc,title="Populate Table", help={"Creates new set of positions"}
162                Button ImportFile,pos={300,92},size={120,17}, proc=IN3S_ButtonProc,title="Import file", help={"Import file as new set of positions"}
163                Button CreateImage,pos={440,75},size={120,17}, proc=IN3S_ButtonProc,title="Create image", help={"Creates image for survey of sample positions"}
164                Button ImportImage,pos={440,92},size={120,17}, proc=IN3S_ButtonProc,title="Import image", help={"Import image for survey of sample positions"}
165                Button BeamlineSurvey,pos={440,110},size={120,17}, proc=IN3S_ButtonProc,title="Beamline Survey", help={"This opens GUI for survey at the beamline"}
166
167                TitleBox Info4 title="\Zr110Current set name : ",pos={300,110},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0
168                SetVariable UserNameForSampleSet,pos={300,130},size={270,20}, proc=IN3S_SetVarProc,title="Set Name: "
169                Setvariable UserNameForSampleSet,fStyle=2, variable=root:Packages:SamplePlateSetup:UserNameForSampleSet, help={"Name for these samples"}
170                Button SavePositionSet,pos={440,145},size={120,17}, proc=IN3S_ButtonProc,title="Save Position Set", help={"Saves set of positions with user name"}
171               
172                TabControl TableTabs  pos={0,160},size={590,430},tabLabel(0)="Sample Table", value= 0, proc=IN3S_TableTabsTabProc
173            TabControl TableTabs  tabLabel(1)="Option Controls",tabLabel(2)="Export Controls"
174                TitleBox Info20 title="\Zr080Use shift to select range of lines, ctrl/cmd select disjoint multiple lines",pos={5,590},size={400,10},frame=0,fColor=(0,0,65535),labelBack=0
175                //Tab 0
176                        ListBox CommandsList,pos={8,185},size={573,395} //, special={0,0,1 }            //this will scale the width of column, users may need to slide right using slider at the bottom.
177                        ListBox CommandsList,listWave=root:Packages:SamplePlateSetup:LBCommandWv
178                        ListBox CommandsList,selWave=root:Packages:SamplePlateSetup:LBSelectionWv
179                        ListBox CommandsList,proc=IN3S_ListBoxMenuProc, selRow= 0, editStyle= 0
180                        ListBox CommandsList userColumnResize=1,help={"Fill here list of samples, their positions, thickness etc. "}
181                        ListBox CommandsList titleWave=root:Packages:SamplePlateSetup:LBTtitleWv, frame= 2
182                        ListBox CommandsList widths={220,50,50,60,40,40,40,0}
183                        ListBox CommandsList  mode=9            // mode=1 for single row selection, 4 multiple disjoint rows (shift only), mode=9 for shift conigous+ctrl disjoint. 
184                //Tab 1
185                        TitleBox Info10 title="\Zr120Data Collection Controls ",size={250,15},pos={20,190},frame=0,fColor=(0,0,65535),labelBack=0
186                        CheckBox USAXSAll pos={30,220},size={70,20},title="USAXS All?", help={"Run USAXS for All"}
187                        CheckBox USAXSAll variable=root:Packages:SamplePlateSetup:USAXSAll, proc=IN3S_CheckProc
188                        CheckBox SAXSAll pos={30,250},size={70,20},title="SAXS All?", help={"Run SAXS for All"}
189                        CheckBox SAXSAll variable=root:Packages:SamplePlateSetup:SAXSAll,  proc=IN3S_CheckProc
190                        CheckBox WAXSAll pos={30,280},size={70,20},title="WAXS All?", help={"Run WAXS for All"}
191                        CheckBox WAXSAll variable=root:Packages:SamplePlateSetup:WAXSAll,  proc=IN3S_CheckProc
192                        SetVariable DefaultSampleThickness,pos={30,310},size={250,20},limits={0.01,20,0.1}, noproc,title="Default Sample thickness [mm]: "
193                        Setvariable DefaultSampleThickness,fStyle=2, variable=root:Packages:SamplePlateSetup:DefaultSampleThickness, help={"Thickness if not defined."}
194
195
196                        SVAR ExportOrder=root:Packages:SamplePlateSetup:ExportOrder
197                        PopupMenu ExportOrderPop,pos={30,340},size={350,21},proc=IN3S_PopMenuProc,title="Export order  :      ", help={"Pick order of scans to export"}
198                        PopupMenu ExportOrderPop,mode=1,popvalue=ExportOrder
199                        PopupMenu ExportOrderPop,value="USAXS-SAXS-WAXS;SAXS-WAXS-USAXS;USAXS-WAXS-SAXS;"
200
201                        CheckBox RunExportHookFunction pos={30,375},size={90,20},title="Run Export hook function? ", help={"Run export hook function"}
202                        CheckBox RunExportHookFunction variable=root:Packages:SamplePlateSetup:RunExportHookFunction,  noproc
203
204                        Button DisplayHookFunction,pos={300,370},size={240,20}, proc=IN3S_ButtonProc,title="Display Hook Function", help={"Displays hook function for user"}
205
206                        SetVariable USAXSScanTime,pos={30,440},size={250,20},limits={30,360,15}, proc=IN3S_SetVarProc,title="USAXS time for run time estimate = "
207                        Setvariable USAXSScanTime,fStyle=2, variable=root:Packages:SamplePlateSetup:USAXSScanTime, help={"USAXS time from epics, used to calculate run time."}
208                        SetVariable SAXSScanTime,pos={30,460},size={250,20},limits={1,60,5}, proc=IN3S_SetVarProc,title="SAXS time for run time estimate   = "
209                        Setvariable SAXSScanTime,fStyle=2, variable=root:Packages:SamplePlateSetup:SAXSScanTime, help={"SAXS time from epics, used to calculate run time."}
210                        SetVariable WAXSScanTime,pos={30,480},size={250,20},limits={1,60,5}, proc=IN3S_SetVarProc,title="WAXS time for run time estimate  = "
211                        Setvariable WAXSScanTime,fStyle=2, variable=root:Packages:SamplePlateSetup:WAXSScanTime, help={"WAXS time from epics, used to calculate run time."}
212
213       
214
215                        SetVariable DefaultCommandFileName,pos={100,550},size={450,25},noproc,title="Default Command file name : "
216                        Setvariable DefaultCommandFileName,fStyle=2, variable=root:Packages:SamplePlateSetup:DefaultCommandFileName, help={"usaxs.mac typically, or user name if wanted."}
217
218                        //GUI controls, rigth side
219                        TitleBox Info11 title="\Zr120GUI Controls ",size={250,15},pos={340,190},frame=0,fColor=(0,0,65535),labelBack=0
220                        CheckBox DisplayUSWAXScntrls pos={340,220},size={70,20},title="Display Individ Controls?", help={"Individual U-S-WAXS controls per sample"}
221                        CheckBox DisplayUSWAXScntrls variable=root:Packages:SamplePlateSetup:DisplayUSWAXScntrls,  proc=IN3S_CheckProc
222                        CheckBox DisplayAllSamplesInImage pos={340,250},size={90,20},title="Display all samples in image? ", help={"Add to image all defined sample positiosn"}
223                        CheckBox DisplayAllSamplesInImage variable=root:Packages:SamplePlateSetup:DisplayAllSamplesInImage,  proc=IN3S_CheckProc
224                //Tab 2 Export controls
225                        CheckBox ExportCurrentPosSet pos={120,187},size={120,20},title="Export Current set? ", help={"Check to export current set in the table only"}
226                        CheckBox ExportCurrentPosSet variable=root:Packages:SamplePlateSetup:ExportCurrentPosSet,  proc=IN3S_CheckProc, mode=1
227                        CheckBox ExportListOfPosSets pos={320,187},size={120,20},title="Export list of sets below? ", help={"Check to export list of sets per list below"}
228                        CheckBox ExportListOfPosSets variable=root:Packages:SamplePlateSetup:ExportListOfPosSets,  proc=IN3S_CheckProc, mode=1
229
230                        TitleBox Tab2Info1 title="\Zr110Drag from here : ",pos={100,210},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0
231                        TitleBox Tab2Info2 title="\Zr110Drop here in order of export : ",pos={320,210},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0
232                        ListBox SourceBox,pos={20,230},size={250,350} , listwave=root:Packages:SamplePlateSetup:ListOfSavedSetsWv
233                    ListBox SourceBox, selwave=root:Packages:SamplePlateSetup:SelListOfSavedSetsWv, mode=9, focusring=0
234                    ListBox SourceBox, fsize=16, Proc=IN3S_DragDropListBoxProc
235                    ListBox TargetBox, pos={300,230},size={250,350}, listwave=root:Packages:SamplePlateSetup:ListOfWavesForExport
236                    ListBox TargetBox, selwave=root:Packages:SamplePlateSetup:SelListOfWavesForExport, mode=9, focusring=0
237                    ListBox TargetBox, fsize=16, Proc=IN3S_DragDropListBoxProc
238                               
239
240                //controls under the table
241                //save export
242                Button PreviewCommandFile,pos={260,595},size={140,20}, proc=IN3S_ButtonProc,title="Preview cmd file", help={"Creates and displays command file with current set of positions"}
243                Button ExportCommandFile,pos={415,595},size={160,20}, proc=IN3S_ButtonProc,title="Export cmd file", help={"Exports usaxs.mac or defaultname.mac cmd file with current set of positions"}
244                Button AppendToCommandFile,pos={415,620},size={160,20}, proc=IN3S_ButtonProc,title="Append to cmd file", help={"Appends to command file on desktop"}
245                Button ExportCommandFile2,pos={415,645},size={160,20}, proc=IN3S_ButtonProc,title="Dialog Export cmd file", help={"Dialog - Exports cmd file with current set of positions"}
246
247                Setvariable NumberOfSamples title="\Zr100Samples: ",pos={10,610},size={150,15},frame=0,fstyle=3,fColor=(0,0,65535),valueColor=(0,0,0), labelBack=0, noedit=1
248                Setvariable NumberOfSamples,variable=root:Packages:SamplePlateSetup:NumberOfSamples, help={"Number of used saples"}, limits={0,inf,0}
249
250
251                Setvariable CalculatedOverAllTime title="\Zr120Estimated run time [min]: ",pos={10,628},size={220,15},frame=0,fstyle=3,fColor=(0,0,65535),valueColor=(0,0,0), labelBack=0, noedit=1
252                Setvariable CalculatedOverAllTime,variable=root:Packages:SamplePlateSetup:CalculatedOverAllTime, help={"Estimated run time for all"}, limits={0,inf,0}
253
254                Setvariable Warnings title="\Zr120Last Info/Warning: ",pos={10,662},size={550,15},frame=0,fstyle=3,fColor=(0,0,65535),valueColor=(65535,0,0), labelBack=0, noedit=1
255                Setvariable Warnings,variable=root:Packages:SamplePlateSetup:WarningForUser, help={"Last warning which code issued"}
256
257        endif
258        IN3S_FixTabControl()
259
260end
261//*****************************************************************************************************************
262//*****************************************************************************************************************
263
264FUnction IN3S_FixSaveButton()
265
266        NVAR TableIsSaved = root:Packages:SamplePlateSetup:TableIsSaved
267        string TitleStr
268        if(TableIsSaved>0.5)
269                TitleStr = "Positions saved"
270                Button SavePositionSet,win=SamplePlateSetup, fColor=(32792,65535,1)
271                Button SavePositionSet,win=SamplePlateSetup,title=TitleStr, disable=2*TableIsSaved
272        else
273                TitleStr = "Save Position Set"
274                Button SavePositionSet,win=SamplePlateSetup, fColor=(65535,32768,32768)
275                Button SavePositionSet,win=SamplePlateSetup,title=TitleStr, disable=2*TableIsSaved
276        endif
277end
278//*****************************************************************************************************************
279//*****************************************************************************************************************
280
281Function/T IN3S_GenStringOfSets()
282       
283        string ListOfQFolders
284        string result
285        if(DataFolderExists("root:SavedSampleSets:"))
286                result=IN2G_CreateListOfItemsInFolder("root:SavedSampleSets:", 1)
287        else
288                result=""
289        endif
290        return result
291end
292
293
294//*****************************************************************************************************************
295//*****************************************************************************************************************
296
297Function IN3S_SetVarProc(sva) : SetVariableControl
298        STRUCT WMSetVariableAction &sva
299
300        switch( sva.eventCode )
301                case 1: // mouse up
302                case 2: // Enter key
303                case 3: // Live update
304                        Variable dval = sva.dval
305                        String sval = sva.sval
306                       
307                        if(stringMatch(sva.ctrlname,"UserNameForSampleSet"))
308                                SVAR UserNameForSampleSet = root:Packages:SamplePlateSetup:UserNameForSampleSet
309                                UserNameForSampleSet = CleanupName(sval, 0)
310                        endif
311
312                        if(stringMatch(sva.ctrlname,"USAXSScanTime")||stringMatch(sva.ctrlname,"SAXSScanTime")||stringMatch(sva.ctrlname,"WAXSScanTime"))
313                                IN3S_EstimateRunTime()
314                        endif
315                       
316                        break
317                case -1: // control being killed
318                        break
319        endswitch
320
321        return 0
322End
323//*****************************************************************************************************************
324///******************************************************************************************
325static Function IN3S_FixTabControl()
326       
327        variable CurTab
328        ControlInfo /W=SamplePlateSetup TableTabs
329        CurTab=V_Value
330        STRUCT WMTabControlAction tca
331        tca.eventCode =2
332        tca.tab = CurTab
333    IN3S_TableTabsTabProc(tca)
334
335
336end
337///******************************************************************************************
338///******************************************************************************************
339///******************************************************************************************
340Function IN3S_TableTabsTabProc(tca) : TabControl
341        STRUCT WMTabControlAction &tca
342
343        switch( tca.eventCode )
344                case 2: // mouse up
345                        Variable tab = tca.tab
346                        //tab 0
347                        ListBox CommandsList, win=SamplePlateSetup, disable=(tab!=0)
348                        //tab 1
349                        CheckBox USAXSAll,  win=SamplePlateSetup, disable=(tab!=1)
350                        CheckBox SAXSAll,  win=SamplePlateSetup, disable=(tab!=1)
351                        CheckBox WAXSAll,  win=SamplePlateSetup, disable=(tab!=1)
352                        SetVariable DefaultSampleThickness,  win=SamplePlateSetup, disable=(tab!=1)
353                        TitleBox Info10,  win=SamplePlateSetup, disable=(tab!=1)
354                        TitleBox Info11,  win=SamplePlateSetup, disable=(tab!=1)
355                        CheckBox DisplayUSWAXScntrls,  win=SamplePlateSetup, disable=(tab!=1)
356                        CheckBox DisplayAllSamplesInImage,  win=SamplePlateSetup, disable=(tab!=1)
357                        SetVariable DefaultCommandFileName,  win=SamplePlateSetup, disable=(tab!=1)
358                        CheckBox RunExportHookFunction,  win=SamplePlateSetup, disable=(tab!=1)
359                        SetVariable USAXSScanTime,  win=SamplePlateSetup, disable=(tab!=1)
360                        SetVariable SAXSScanTime,  win=SamplePlateSetup, disable=(tab!=1)
361                        SetVariable WAXSScanTime,  win=SamplePlateSetup, disable=(tab!=1)
362                        Button DisplayHookFunction,  win=SamplePlateSetup, disable=(tab!=1)
363                        PopupMenu ExportOrderPop,  win=SamplePlateSetup, disable=(tab!=1)
364                       
365                        CheckBox ExportCurrentPosSet,  win=SamplePlateSetup, disable=(tab!=2)
366                        CheckBox ExportListOfPosSets,  win=SamplePlateSetup, disable=(tab!=2)
367                        NVAR ExportListOfPosSets=root:Packages:SamplePlateSetup:ExportListOfPosSets
368                        NVAR ExportCurrentPosSet=root:Packages:SamplePlateSetup:ExportCurrentPosSet
369                        TitleBox Tab2Info1,  win=SamplePlateSetup, disable=(tab!=2||ExportCurrentPosSet)
370                        TitleBox Tab2Info2,  win=SamplePlateSetup, disable=(tab!=2||ExportCurrentPosSet)
371                        ListBox SourceBox,  win=SamplePlateSetup, disable=(tab!=2||ExportCurrentPosSet)
372                    ListBox TargetBox,  win=SamplePlateSetup, disable=(tab!=2||ExportCurrentPosSet)
373                        IN3S_EstimateRunTime()
374                        break
375                case -1: // control being killed
376                        break
377        endswitch
378
379        return 0
380End
381///******************************************************************************************
382///******************************************************************************************
383///******************************************************************************************
384//************************************************************************************************************
385Function/S IN3S_CreateListOfRows(wave selWave)
386        //create list of selected rows (from end)
387        string ListOfSelRows=""
388        variable i
389        For(i=DimSize(selWave,0)-1;i>=0;i-=1)
390                if(selWave[i][0]==3||selWave[i][0]==10)
391                        ListOfSelRows+=num2str(i)+";"
392                endif
393        endfor
394        return ListOfSelRows
395end
396//************************************************************************************************************
397//************************************************************************************************************
398//************************************************************************************************************
399Function IN3S_ListBoxMenuProc(lba) : ListBoxControl
400        STRUCT WMListboxAction &lba
401        //see IRB1_ConcSeriesListBoxProc
402
403        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
404        Variable row = lba.row
405        Variable col = lba.col
406        WAVE/T/Z listWave = lba.listWave
407        WAVE/Z selWave = lba.selWave
408        string WinNameStr=lba.win
409        string items
410        variable i
411        NVAR/Z TableIsSaved = root:Packages:SamplePlateSetup:TableIsSaved
412        if(!NVAR_Exists(TableIsSaved))
413                variable/g root:Packages:SamplePlateSetup:TableIsSaved
414                NVAR TableIsSaved = root:Packages:SamplePlateSetup:TableIsSaved
415        endif
416        string ListOfSelRows
417        variable tempRow, j, firstSelectedRow, NoSelectedRows
418        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
419       
420        switch( lba.eventCode )
421                case -1: // control being killed
422                        break
423                case 1: // mouse down
424                        ListOfSelRows=IN3S_CreateListOfRows(selWave)
425                        firstSelectedRow = str2num(StringFromList(ItemsInList(ListOfSelRows)-1, ListOfSelRows))
426                        NoSelectedRows = ItemsInList(ListOfSelRows)
427                       
428                        if (lba.eventMod & 0x10)        // rightclick
429                                //items = "Insert new lines;Delete selected lines;Duplicate selected Lines;Set lines as Blank;Set as Dist. Std. AgBehLaB6;Write same Name;"
430                                //items += "Write same Thickness;Same Sx to all empty;Same Sy to all empty;Increment Sx from selected row;Increment Sy from selected row;"
431                                //items += "Copy sel. rows to Clipboard;Paste Clipboard to sel. rows;Insert new rows with Clipboard vals.;"
432                                items = "Copy sel. rows to Clipboard;Paste Clipboard to sel. rows;Insert new rows with Clipboard vals.;"
433                                items += "Insert new lines;Delete selected lines;Duplicate selected Lines;Write same Name;"
434                                items += "Write same Thickness;Same Sx to all empty;Same Sy to all empty;Increment Sx from selected row;Increment Sy from selected row;"
435                                items += "Add to Sx from selected row;Add to Sy from selected row;Set lines as Blank;Set as Dist. Std. AgBehLaB6;"
436                                PopupContextualMenu items
437                                // V_flag is index of user selected item   
438                                switch (V_flag)
439                                        case 1: // "Copy in Table Clipboard"
440                                                make/O/T/N=(NoSelectedRows) root:Packages:SamplePlateSetup:TableClipboardWv
441                                                Wave/T TableClipboardWv = root:Packages:SamplePlateSetup:TableClipboardWv
442                                                SVAR TableClipboard = root:Packages:SamplePlateSetup:TableClipboard
443                                                For(j=0;j<NoSelectedRows;j+=1)
444                                                        tempRow = str2num(StringFromList(j, ListOfSelRows))
445                                                        TableClipboard = "SampleName="+listWave[tempRow][0]+";"
446                                                        TableClipboard += "SX="+listWave[tempRow][1]+";"
447                                                        TableClipboard += "SY="+listWave[tempRow][2]+";"
448                                                        TableClipboard += "TH="+listWave[tempRow][3]+";"
449                                                        TableClipboard += "MD="+listWave[tempRow][4]+";"
450                                                        TableClipboardWv[j] = TableClipboard
451                                                endfor
452                                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
453                                                WarningForUser = "Copied rows "+ListOfSelRows+ " in Clipboard"
454                                                break;
455                                        case 2: // "Paste Table Clipboard in a row"
456                                                Wave/T/Z TableClipboardWv = root:Packages:SamplePlateSetup:TableClipboardWv
457                                                //check we have clipboard...
458                                                if(!WaveExists(TableClipboardWv)||numpnts(TableClipboardWv)<1)
459                                                        Abort "Nothing is stored in Clipboard"
460                                                endif
461                                                //check we have same number of lines selected.
462                                                if(numpnts(TableClipboardWv)>1 && NoSelectedRows!=numpnts(TableClipboardWv))
463                                                        Abort "Number of lines in Clipboard ("+num2str(numpnts(TableClipboardWv))+") does not match number of selected lines in table ("+num2str(NoSelectedRows)+")"
464                                                endif
465                                                //OK, now we should be able to do this...
466                                                SVAR TableClipboard = root:Packages:SamplePlateSetup:TableClipboard
467                                                For(j=0;j<NoSelectedRows;j+=1)
468                                                        if(numpnts(TableClipboardWv)>1)
469                                                                TableClipboard = TableClipboardWv[j]
470                                                        else
471                                                                TableClipboard = TableClipboardWv[0]
472                                                        endif
473                                                        tempRow = str2num(StringFromList(j, ListOfSelRows))
474                                                        listWave[tempRow][0] = StringByKey("SampleName", TableClipboard, "=" , ";")
475                                                        listWave[tempRow][1] = StringByKey("SX", TableClipboard, "=" , ";")
476                                                        listWave[tempRow][2] = StringByKey("SY", TableClipboard, "=" , ";")
477                                                        listWave[tempRow][3] = StringByKey("TH", TableClipboard, "=" , ";")
478                                                        listWave[tempRow][4] = StringByKey("USAXS", TableClipboard, "=" , ";")
479                                                        listWave[tempRow][5] = StringByKey("SAXS", TableClipboard, "=" , ";")
480                                                        listWave[tempRow][6] = StringByKey("WAXS", TableClipboard, "=" , ";")
481                                                        listWave[tempRow][7] = StringByKey("MD", TableClipboard, "=" , ";")
482                                                endfor
483                                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
484                                                WarningForUser = "Pasted Clipboard vals. from org. rows "+ListOfSelRows
485                                                IN3S_EstimateRunTime()
486                                                TableIsSaved = 0
487                                                break;
488                                        case 3: // "Insert New rows with Table Clipboard"
489                                                Wave/T/Z TableClipboardWv = root:Packages:SamplePlateSetup:TableClipboardWv
490                                                //check we have clipboard...
491                                                if(!WaveExists(TableClipboardWv)||numpnts(TableClipboardWv)<1)
492                                                        Abort "Nothing is stored in Clipboard"
493                                                endif
494                                                SVAR TableClipboard = root:Packages:SamplePlateSetup:TableClipboard
495                                                For(j=0;j<numpnts(TableClipboardWv);j+=1)
496                                                        TableClipboard = TableClipboardWv[j]
497                                                        tempRow = firstSelectedRow+1
498                                                        IN3S_InsertDeleteLines(1, tempRow,1)
499                                                        listWave[tempRow][0] = StringByKey("SampleName", TableClipboard, "=" , ";")
500                                                        listWave[tempRow][1] = StringByKey("SX", TableClipboard, "=" , ";")
501                                                        listWave[tempRow][2] = StringByKey("SY", TableClipboard, "=" , ";")
502                                                        listWave[tempRow][3] = StringByKey("TH", TableClipboard, "=" , ";")
503                                                        listWave[tempRow][4] = StringByKey("USAXS", TableClipboard, "=" , ";")
504                                                        listWave[tempRow][5] = StringByKey("SAXS", TableClipboard, "=" , ";")
505                                                        listWave[tempRow][6] = StringByKey("WAXS", TableClipboard, "=" , ";")
506                                                        listWave[tempRow][7] = StringByKey("MD", TableClipboard, "=" , ";")
507                                                endfor
508                                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
509                                                WarningForUser = "Inserted "+num2str(numpnts(TableClipboardWv))+" rows with Clipboard (org. rows: "+ListOfSelRows+") "
510                                                IN3S_EstimateRunTime()
511                                                TableIsSaved = 0
512                                                break;
513                                        case 4: // "Insert new line"
514                                                For(j=0;j<ItemsInList(ListOfSelRows);j+=1)
515                                                        tempRow = str2num(StringFromList(j, ListOfSelRows))
516                                                        IN3S_InsertDeleteLines(1, tempRow,1)
517                                                endfor
518                                                WarningForUser = "Inserted rows after numbers "+ ListOfSelRows
519                                                IN3S_EstimateRunTime()
520                                                TableIsSaved = 0
521                                                break
522                                        case 5: // "Delete selected lines"
523                                                For(j=0;j<ItemsInList(ListOfSelRows);j+=1)
524                                                        tempRow = str2num(StringFromList(j, ListOfSelRows))
525                                                        IN3S_InsertDeleteLines(2, tempRow,1)
526                                                endfor
527                                                WarningForUser = "Deleted rows numbers "+ ListOfSelRows
528                                                IN3S_EstimateRunTime()
529                                                TableIsSaved = 0
530                                                break
531                                        case 6: // "Duplicate selected Line"
532                                                For(j=0;j<ItemsInList(ListOfSelRows);j+=1)
533                                                        tempRow = str2num(StringFromList(j, ListOfSelRows))
534                                                        IN3S_InsertDeleteLines(3, tempRow,1)
535                                                endfor
536                                                WarningForUser = "Duplicated rows numbers "+ ListOfSelRows
537                                                IN3S_EstimateRunTime()
538                                                TableIsSaved = 0
539                                                break
540                                        case 7: // "Write same name"
541                                                string NewSampleName="SampleName"
542                                                string FromWhere = "Selected Rows"
543                                                string AddOrderNumber = "No"
544                                                Prompt NewSampleName, "Write same string in names"
545                                                Prompt FromWhere, "Where to write?", popup "Selected Rows;Empty only;From first selected row;All;"
546                                                Prompt AddOrderNumber, "Add Order numbers (0,1,2,3...)?", popup "No;Yes;"
547                                                DoPrompt /Help="Write same string name" "Default name for all positions", NewSampleName, FromWhere, AddOrderNumber
548                                                if(V_Flag)
549                                                        abort
550                                                endif
551                                                string NameStrtemp2=""
552                                                string OrderNumStr=""
553                                                variable OrderNumber=0
554                                                For(i=0;i<DimSize(listWave,0);i+=1)
555                                                        if(StringMatch(FromWhere, "Empty only"))
556                                                                if(strlen(listWave[i][0])==0)
557                                                                        if(StringMatch(AddOrderNumber, "Yes"))
558                                                                                OrderNumStr=num2str(OrderNumber)
559                                                                                OrderNumber+=1
560                                                                        endif
561                                                                        if(strlen(NewSampleName)>0)     
562                                                                                listWave[i][0] = CleanupName(NewSampleName, 0 , 40)+OrderNumStr
563                                                                        else
564                                                                                listWave[i][0] = ""+OrderNumStr
565                                                                        endif
566                                                                endif
567                                                        elseif(StringMatch(FromWhere, "From first selected row"))
568                                                                if(i>=firstSelectedRow)
569                                                                        if(StringMatch(AddOrderNumber, "Yes"))
570                                                                                OrderNumStr=num2str(OrderNumber)
571                                                                                OrderNumber+=1
572                                                                        endif
573                                                                        if(strlen(NewSampleName)>0)     
574                                                                                listWave[i][0] = CleanupName(NewSampleName, 0 , 40)+OrderNumStr
575                                                                        else
576                                                                                listWave[i][0] = ""+OrderNumStr
577                                                                        endif
578                                                                endif
579                                                        elseif(StringMatch(FromWhere, "All"))
580                                                                        if(StringMatch(AddOrderNumber, "Yes"))
581                                                                                OrderNumStr=num2str(OrderNumber)
582                                                                                OrderNumber+=1
583                                                                        endif
584                                                                        if(strlen(NewSampleName)>0)     
585                                                                                listWave[i][0] = CleanupName(NewSampleName, 0 , 40)+OrderNumStr
586                                                                        else
587                                                                                listWave[i][0] = ""+OrderNumStr
588                                                                        endif
589                                                        elseif(StringMatch(FromWhere, "Selected Rows"))
590                                                                        For(j=0;j<ItemsInList(ListOfSelRows);j+=1)
591                                                                                if(StringMatch(AddOrderNumber, "Yes"))
592                                                                                        OrderNumStr=num2str(ItemsInList(ListOfSelRows)-j-1)
593                                                                                        //OrderNumber+=1
594                                                                                endif
595                                                                                if(strlen(NewSampleName)>0)     
596                                                                                        NameStrtemp2 = CleanupName(NewSampleName, 0 , 40)+OrderNumStr
597                                                                                else
598                                                                                        NameStrtemp2 = ""+OrderNumStr
599                                                                                endif
600                                                                                tempRow = str2num(StringFromList(j, ListOfSelRows))
601                                                                                listWave[tempRow][0]=NameStrtemp2
602                                                                        endfor
603                                                        else
604                                                                //nothing here...
605                                                        endif
606                                                endfor
607                                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
608                                                WarningForUser = "Wrote "+CleanupName(NewSampleName, 0 , 40)+" names as requested"
609                                                IN3S_EstimateRunTime()
610                                                TableIsSaved = 0
611                                                break;
612                                        case 8: // "Write Same Thickness"
613                                                variable newThickness
614                                                NVAR DefSaTh = root:Packages:SamplePlateSetup:DefaultSampleThickness
615                                                newThickness = DefSaTh
616                                                Prompt newThickness, "New Thickness [mm] or NaN for empty"
617                                                string FromWhere2 = "Selected Rows"
618                                                Prompt FromWhere2, "Where to write?", popup "Selected Rows;Empty only;From first selected row;All;"
619                                                DoPrompt /Help="Write new thickness?" "New thickness and where selection", newThickness, FromWhere2
620                                                if(V_Flag)
621                                                        abort
622                                                endif
623                                                For(i=0;i<DimSize(listWave,0);i+=1)
624                                                        if(StringMatch(FromWhere2, "Empty only"))
625                                                                if(strlen(listWave[i][3])==0)
626                                                                        if(numtype(newThickness)==0)
627                                                                                listWave[i][3] = num2str(newThickness)
628                                                                        else
629                                                                                listWave[i][3] = ""
630                                                                        endif
631                                                                endif
632                                                        elseif(StringMatch(FromWhere2, "From first selected row"))
633                                                                if(i>=firstSelectedRow)
634                                                                        if(numtype(newThickness)==0)
635                                                                                listWave[i][3] = num2str(newThickness)
636                                                                        else
637                                                                                listWave[i][3] = ""
638                                                                        endif
639                                                                endif
640                                                        elseif(StringMatch(FromWhere2, "All"))
641                                                                        if(numtype(newThickness)==0)
642                                                                                listWave[i][3] = num2str(newThickness)
643                                                                        else
644                                                                                listWave[i][3] = ""
645                                                                        endif
646                                                        elseif(StringMatch(FromWhere2, "Selected Rows"))
647                                                                        For(j=0;j<ItemsInList(ListOfSelRows);j+=1)
648                                                                                tempRow = str2num(StringFromList(j, ListOfSelRows))
649                                                                                if(numtype(newThickness)==0)
650                                                                                        listWave[tempRow][3] = num2str(newThickness)
651                                                                                else
652                                                                                        listWave[tempRow][3] = ""
653                                                                                endif
654                                                                        endfor
655                                                        else
656                                                                //nothing here...
657                                                        endif
658                                                endfor
659                                                TableIsSaved = 0
660                                                break;                                         
661                                        case 9: // "same sx to all empty"
662                                                variable  NewSxForAll=10
663                                                Prompt NewSxForAll, "Write same SX in all empty lines?"
664                                                DoPrompt /Help="Write same SX position for all empty SX?" "Default sx value for all", NewSxForAll
665                                                if(V_Flag)
666                                                        abort
667                                                endif
668                                                For(i=0;i<DimSize(listWave,0);i+=1)
669                                                        if(strlen(listWave[i][1])==0)
670                                                                listWave[i][1] = num2str(NewSxForAll)
671                                                        endif
672                                                endfor
673                                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
674                                                WarningForUser = "Wrote "+num2str(NewSxForAll)+" for all samples without SX"
675                                                IN3S_EstimateRunTime()
676                                                TableIsSaved = 0
677                                                break;
678                                        case 10:        // "same sy to all empty"
679                                                variable  NewSyForAll=10
680                                                Prompt NewSyForAll, "Write same SY in all empty lines?"
681                                                DoPrompt /Help="Write same SY position for all empty SY?" "Default sy value for all", NewSyForAll
682                                                if(V_Flag)
683                                                        abort
684                                                endif
685                                                For(i=0;i<DimSize(listWave,0);i+=1)
686                                                        if(strlen(listWave[i][2])==0)
687                                                                listWave[i][2] = num2str(NewSyForAll)
688                                                        endif
689                                                endfor
690                                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
691                                                WarningForUser = "Wrote "+num2str(NewSyForAll)+" for all samples without SX"
692                                                IN3S_EstimateRunTime()
693                                                TableIsSaved = 0
694                                                break;
695                                        case 11:        // "Increment Sx from selected row"
696                                                variable  NewSxStep=10
697                                                variable sxstart
698                                                Prompt NewSxStep, "Increment SX from first selected row higher?"
699                                                DoPrompt /Help="Increment SX position for all higher rows?" "Input sx step", NewSxStep
700                                                if(V_Flag)
701                                                        abort
702                                                endif
703                                                if(numtype(str2num(listWave[firstSelectedRow][1]))==0)
704                                                        sxstart = str2num(listWave[firstSelectedRow][1])
705                                                else
706                                                        sxstart = 0
707                                                endif
708                                                For(i=firstSelectedRow;i<DimSize(listWave,0);i+=1)
709                                                        listWave[i][1] = num2str(sxstart+(i-firstSelectedRow)*NewSxStep)
710                                                endfor
711                                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
712                                                WarningForUser = "Calculated new sx for row higher than : " +num2str(row)
713                                                IN3S_EstimateRunTime()
714                                                TableIsSaved = 0
715                                                break;
716                                        case 12:        // "Increment Sy from selected row"
717                                                variable  NewSyStep=10
718                                                variable systart
719                                                Prompt NewSyStep, "Increment SY from selected row higher?"
720                                                DoPrompt /Help="Increment SY position for all higher rows?" "Input sy step", NewSyStep
721                                                if(V_Flag)
722                                                        abort
723                                                endif
724                                                if(numtype(str2num(listWave[firstSelectedRow][2]))==0)
725                                                        systart = str2num(listWave[firstSelectedRow][2])
726                                                else
727                                                        systart = 0
728                                                endif
729                                                For(i=firstSelectedRow;i<DimSize(listWave,0);i+=1)
730                                                        listWave[i][2] = num2str(systart+(i-firstSelectedRow)*NewSyStep)
731                                                endfor
732                                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
733                                                WarningForUser = "Calculated new sy for all samples"
734                                                IN3S_EstimateRunTime()
735                                                TableIsSaved = 0
736                                                break;
737                                        case 13:        // "Add to sx from first selected row"
738                                                variable  AddValue=0
739                                                Prompt AddValue, "Add value to Sx from first selected row ?"
740                                                DoPrompt /Help="Add value SX position for all higher rows?" "Add value to sx", AddValue
741                                                if(V_Flag)
742                                                        abort
743                                                endif
744                                                //if(numtype(str2num(listWave[firstSelectedRow][1]))==0)
745                                                //      sxstart = str2num(listWave[firstSelectedRow][1])
746                                                //else
747                                                //      sxstart = 0
748                                                //endif
749                                                For(i=firstSelectedRow;i<DimSize(listWave,0);i+=1)
750                                                        listWave[i][1] = num2str(str2num(listWave[i][1])+AddValue)
751                                                endfor
752                                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
753                                                WarningForUser = "Calculated new sx for row higher than : " +num2str(row)
754                                                IN3S_EstimateRunTime()
755                                                TableIsSaved = 0
756                                                break;
757                                        case 14:        // "Add to sy from first selected row"
758                                                variable  AddValueY=0
759                                                Prompt AddValueY, "Add value to Sy from first selected row ?"
760                                                DoPrompt /Help="Add value Sy position for all higher rows?" "Add value to Sy", AddValueY
761                                                if(V_Flag)
762                                                        abort
763                                                endif
764                                                For(i=firstSelectedRow;i<DimSize(listWave,0);i+=1)
765                                                        listWave[i][2] = num2str(str2num(listWave[i][2])+AddValueY)
766                                                endfor
767                                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
768                                                WarningForUser = "Calculated new sy for row higher than : " +num2str(row)
769                                                IN3S_EstimateRunTime()
770                                                TableIsSaved = 0
771                                                break;
772                                        case 15:        // "Set line as Blank"
773                                                For(j=0;j<ItemsInList(ListOfSelRows);j+=1)
774                                                        tempRow = str2num(StringFromList(j, ListOfSelRows))
775                                                        listWave[tempRow][0]="Blank"
776                                                        listWave[tempRow][3]="0"
777                                                endfor
778                                                WarningForUser = "Set rows "+ListOfSelRows+" as Blank"
779                                                IN3S_EstimateRunTime()
780                                                TableIsSaved = 0
781                                                break
782                                        case 16:        // "Set Line as Distance Standard"
783                                                For(j=0;j<ItemsInList(ListOfSelRows);j+=1)
784                                                        tempRow = str2num(StringFromList(j, ListOfSelRows))
785                                                        listWave[tempRow][0]="AgBehenateLaB6"
786                                                        listWave[tempRow][3]="1"
787                                                endfor
788                                                WarningForUser = "Set rows "+ListOfSelRows+" as AgBehenateLaB6"
789                                                NVAR USAXSAll=root:Packages:SamplePlateSetup:USAXSAll
790                                                USAXSAll=0
791                                                IN3S_EstimateRunTime()
792                                                TableIsSaved = 0
793                                                break
794                                        default :       // "Sort"
795                                                //DataSelSortString = StringFromList(V_flag-1, items)
796                                                //PopupMenu SortOptionString,win=$(TopPanel), mode=1,popvalue=DataSelSortString
797                                                //IR3C_SortListOfFilesInWvs(TopPanel)   
798                                                break;
799                                endswitch
800                        else    //left click, do something here...
801
802                        endif
803                        IN3S_FixSaveButton()
804                        break
805                case 3: // double click
806
807                        break
808                case 4: // cell selection
809                        IN3S_AddTagToImage(row)
810                        //sync to Bealine setup, if exists...
811                        DoWIndow BeamlinePlateSetup
812                        if(V_Flag)
813                                NVAR SelectedRow=root:Packages:SamplePlateSetup:SelectedRow
814                                SVAR SelectedSampleName=root:Packages:SamplePlateSetup:SelectedSampleName
815                                Wave/T ListWV = root:Packages:SamplePlateSetup:LBCommandWv
816                                Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
817                                NVAR SampleThickness=root:Packages:SamplePlateSetup:SampleThickness
818                                NVAR SampleXTAR=root:Packages:SamplePlateSetup:SampleXTAR
819                                NVAR SampleYTAR=root:Packages:SamplePlateSetup:SampleYTAR
820                                NVAR SampleXTable = root:Packages:SamplePlateSetup:SampleXTable
821                                NVAR SampleYTable = root:Packages:SamplePlateSetup:SampleYTable
822                                NVAR defTh=root:Packages:SamplePlateSetup:DefaultSampleThickness
823                                if(row>=0&& row<DimSize(ListWV, 0))
824                                        SelectedRow=row
825                                        SelectedSampleName = ListWV[SelectedRow][0]
826                                        //ListBox CommandsList, win=SamplePlateSetup, selrow=SelectedRow
827                                        LBSelectionWv[][0]=2
828                                        LBSelectionWv[SelectedRow][0]=3
829                                        SampleXTable = str2num(ListWV[SelectedRow][1])
830                                        SampleYTable = str2num(ListWV[SelectedRow][2])
831                                        SampleThickness = str2num(ListWV[SelectedRow][3])
832                                        SampleThickness = numtype(SampleThickness)==0 ? SampleThickness : defTh
833                                endif
834                                IN3S_MoveToPositionIfOK()
835                        endif
836                        break
837                case 5: // cell selection plus shift key
838                        break
839                case 6: // begin edit
840                        break
841                case 7: // finish edit
842                        //cleanup the name, if Column 0
843                        if(col==0)
844                                string Username=listWave[row][col]
845                                if(strlen(Username)>0)
846                                        listWave[row][col] = CleanupName(Username, 0 , 40)
847                                        DoWIndow BeamlinePlateSetup
848                                        if(V_Flag)
849                                                SVAR SelectedSampleName = root:Packages:SamplePlateSetup:SelectedSampleName
850                                                SelectedSampleName = listWave[row][col]
851                                        endif
852                                endif
853                        endif
854                        //cleanup the numbers for sx, sy and thickness...
855                        if(col>0 && col<4)             
856                                string valueStrFromUser=listWave[row][col]
857                                if(strlen(valueStrFromUser)>0)
858                                        variable valueNumFromUser = str2num(valueStrFromUser)
859                                        if(numtype(valueNumFromUser)==0)        //something is number...
860                                                listWave[row][col] = num2str(IN2G_roundDecimalPlaces(valueNumFromUser,3))
861                                                DoWIndow BeamlinePlateSetup
862                                                if(V_Flag)
863                                                        NVAR SampleXTable = root:Packages:SamplePlateSetup:SampleXTable
864                                                        NVAR SampleYTable = root:Packages:SamplePlateSetup:SampleYTable
865                                                        NVAR Thick=root:Packages:SamplePlateSetup:SampleThickness
866                                                        if(col==1)
867                                                                SampleXTable = IN2G_roundDecimalPlaces(valueNumFromUser,2)
868                                                                IN3S_MoveToPositionIfOK()
869                                                        elseif(col==2)
870                                                                SampleYTable = IN2G_roundDecimalPlaces(valueNumFromUser,2)
871                                                                IN3S_MoveToPositionIfOK()
872                                                        elseif(col==3)
873                                                                Thick = IN2G_roundDecimalPlaces(valueNumFromUser,3)
874                                                        endif
875                                                endif
876                                        else
877                                                listWave[row][col] = ""
878                                                Abort "Input was not valid number, try again"
879                                        endif
880                                endif
881                        endif
882                        //add tag
883                        IN3S_AddTagToImage(row)
884                        IN3S_EstimateRunTime()
885                        TableIsSaved = 0
886                        IN3S_FixSaveButton()
887                        break
888                case 13: // checkbox clicked (Igor 6.2 or later)
889                        //here we need to deal with what happens when user clicks on selection of checkboxes...
890                        NVAR USAXSAll = root:Packages:SamplePlateSetup:USAXSAll
891                        NVAR SAXSAll = root:Packages:SamplePlateSetup:SAXSAll
892                        NVAR WAXSAll = root:Packages:SamplePlateSetup:WAXSAll
893                        if(lba.col==4)  //USAXS
894                                USAXSAll = 0
895                        elseif(lba.col==5)      //SAXS
896                                SAXSAll = 0
897                        elseif(lba.col==6)      //WAXS
898                                WAXSAll = 0
899                        else
900                       
901                        endif
902                        break
903        endswitch
904
905        return 0
906end
907//************************************************************************************************************
908//************************************************************************************************************
909
910Function IN3S_PopMenuProc(pa) : PopupMenuControl
911        STRUCT WMPopupAction &pa
912
913        switch( pa.eventCode )
914                case 2: // mouse up
915                        Variable popNum = pa.popNum
916                        String popStr = pa.popStr
917                        if(StringMatch(pa.ctrlName, "NewPlateTemplate"))
918                                SVAR SelectedPlateName=root:Packages:SamplePlateSetup:SelectedPlateName
919                                SelectedPlateName = popStr
920                        endif
921
922                        if(StringMatch(pa.ctrlName, "ExportOrderPop"))
923                                SVAR ExportOrder=root:Packages:SamplePlateSetup:ExportOrder
924                                ExportOrder = popStr
925                        endif
926                       
927                        break
928                case -1: // control being killed
929                        break
930        endswitch
931
932        return 0
933End
934//************************************************************************************************************
935//************************************************************************************************************
936
937Function IN3S_ButtonProc(ba) : ButtonControl
938        STRUCT WMButtonAction &ba
939
940        switch( ba.eventCode )
941                case 2: // mouse up
942                        NVAR TableIsSaved = root:Packages:SamplePlateSetup:TableIsSaved
943
944                        if(StringMatch(ba.ctrlName, "CreateNewSet" ))
945                                DoAlert/T="This will delete your existing data" 1,  "New Sample positions will be created and existing one deleted, Do you want to continue?"
946                                if(V_Flag==1)   //yes...
947                                        NVAR NumberOfSamplesToCreate = root:Packages:SamplePlateSetup:NumberOfSamplesToCreate
948                                        IN3S_CreateTablesForPlates(NumberOfSamplesToCreate, 1)
949                                        SVAR NewPlateName = root:Packages:SamplePlateSetup:UserNameForSampleSet
950                                        NewPlateName = "NewSampleSet"+num2str(abs(round(gnoise(100))))
951                                        //ListBox CommandsList win=SamplePlateSetup, selRow=0                                   
952                                        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
953                                        LBSelectionWv[][0]=2
954                                        LBSelectionWv[0][0]=3
955                                        IN3S_AddTagToImage(0)           
956                                        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
957                                        WarningForUser = "Created a new set of positions"
958                                        IN3S_EstimateRunTime()
959                                        TableIsSaved = 0
960                                endif
961                        endif
962                        if(StringMatch(ba.ctrlName, "CreateImage" ))
963                                KillWindow/Z TrimCorrectImageDrawing
964                                SVAR SelectedPlateName = root:Packages:SamplePlateSetup:SelectedPlateName
965                                IN3S_DrawImageOfPlate(SelectedPlateName)
966                                AutoPositionWindow/M=0 /R=SamplePlateSetup SamplePlateImageDrawing
967                                Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
968                                ControlInfo/W=SamplePlateSetup CommandsList
969                                if(V_Flag>=0 && V_Flag<dimsize(LBCommandWv,0))
970                                        IN3S_AddTagToImage(V_Value)     
971                                else
972                                        IN3S_AddTagToImage(-4)  //remove all drawings, if needed       
973                                endif
974                        endif
975
976                        if(StringMatch(ba.ctrlName, "TrimImportedImage" ))
977                                IN3S_TrimAndStraightenImage()
978                        endif
979
980                        if(StringMatch(ba.ctrlName, "ImportImage" ))
981                                KillWindow/Z TrimCorrectImageDrawing
982                                IN3S_ImportImageOfPlate()
983                        endif
984                        if(StringMatch(ba.ctrlName, "ImportFile" ))
985                                //KillWindow/Z TrimCorrectImageDrawing
986                                IN3S_ImportFile()
987                        endif
988
989                        if(StringMatch(ba.ctrlName, "DisplayHookFunction" ))
990                                //DisplayProcedure "IN3S_ExportHookFunction"
991                                IN3_InsertHookIntoMainProc()
992                        endif
993
994
995                        if(StringMatch(ba.ctrlName, "PopulateTable" ))
996                                //populate table with positions
997                                DoAlert/T="This will delete your existing data" 1,  "New Sample positions will be created and existing one deleted, Do you want to continue?"
998                                if(V_Flag==1)   //yes...
999                                        KillWindow/Z TrimCorrectImageDrawing
1000                                        SVAR SelectedPlateName=root:Packages:SamplePlateSetup:SelectedPlateName
1001                                        NVAR USAXSAll=root:Packages:SamplePlateSetup:USAXSAll
1002                                        NVAR SAXSAll=root:Packages:SamplePlateSetup:SAXSAll
1003                                        NVAR WAXSAll=root:Packages:SamplePlateSetup:WAXSAll
1004                                        SVAR NewPlateName = root:Packages:SamplePlateSetup:UserNameForSampleSet
1005                                        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1006                                        USAXSAll= 1
1007                                        SAXSAll = 1
1008                                        WAXSAll = 1
1009                                        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
1010                                        strswitch (SelectedPlateName)
1011                                                case "9x9 Acrylic/magnetic plate":       
1012                                                        Wave Centers = root:Packages:SamplePlatesAvailable:Acrylic9x9PlateCenters
1013                                                        //create enough space:
1014                                                        IN3S_CreateTablesForPlates(DimSize(Centers, 0 ), 0)
1015                                                        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
1016                                                        LBCommandWv[][1]=num2str(Centers[p][0])
1017                                                        LBCommandWv[][2]=num2str(Centers[p][1])
1018                                                        LBCommandWv[][0]=""
1019                                                        LBCommandWv[0][0]="Empty for LaB6AgBehehnate"
1020                                                        LBCommandWv[1][0]="AirBlank"
1021                                                        NewPlateName = "AcrylicPlateSet"+num2str(abs(round(gnoise(100))))
1022                                                        //select first row
1023                                                        LBSelectionWv[][0]=2
1024                                                        LBSelectionWv[0][0]=3
1025                                                        WarningForUser = "Created a new set of positions for "+ SelectedPlateName
1026                                                        IN3S_EstimateRunTime()
1027                                                        break           // exit from switch
1028                                                case "NMR Acrylic plate":       
1029                                                        Wave Centers = root:Packages:SamplePlatesAvailable:AcrylicNMRPlateCenters
1030                                                        //create enough space:
1031                                                        IN3S_CreateTablesForPlates(DimSize(Centers, 0 ), 0)
1032                                                        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
1033                                                        LBCommandWv[][1]=num2str(Centers[p][0])
1034                                                        LBCommandWv[][2]=num2str(Centers[p][1])
1035                                                        LBCommandWv[][0]=""
1036                                                        LBCommandWv[0][0]="Empty for LaB6AgBehehnate"
1037                                                        LBCommandWv[1][0]="NMRTubeBlank"
1038                                                        //SVAR NewPlateName = root:Packages:SamplePlateSetup:UserNameForSampleSet
1039                                                        NewPlateName = "AcrylicPlateSet"+num2str(abs(round(gnoise(100))))
1040                                                        //select first row
1041                                                        //ListBox CommandsList win=SamplePlateSetup, selRow=1                                   
1042                                                        LBSelectionWv[][0]=2
1043                                                        LBSelectionWv[0][0]=3
1044                                                        //SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1045                                                        WarningForUser = "Created a new set of positions for "+ SelectedPlateName
1046                                                        IN3S_EstimateRunTime()
1047                                                        break           // exit from switch
1048                                                case "Old Style Al Plate":       
1049                                                        Wave Centers = root:Packages:SamplePlatesAvailable:OldStyleAlPlateCenters
1050                                                        //create enough space:
1051                                                        IN3S_CreateTablesForPlates(DimSize(Centers, 0 ), 0)
1052                                                        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
1053                                                        LBCommandWv[][1]=num2str(Centers[p][0])
1054                                                        LBCommandWv[][2]=num2str(Centers[p][1])
1055                                                        LBCommandWv[][0]=""
1056                                                        LBCommandWv[0][0]="Empty for LaB6AgBehehnate"
1057                                                        LBCommandWv[1][0]="AirBlank"
1058                                                        //SVAR NewPlateName = root:Packages:SamplePlateSetup:UserNameForSampleSet
1059                                                        NewPlateName = "AlPlateSet"+num2str(abs(round(gnoise(100))))
1060                                                        ListBox CommandsList win=SamplePlateSetup, selRow=1                                     
1061                                                        //SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1062                                                        WarningForUser = "Created a new set of positions for "+ SelectedPlateName
1063                                                        IN3S_EstimateRunTime()
1064                                                        break           // exit from switch
1065                                                case "NMR Tubes holder":         
1066                                                        Wave Centers = root:Packages:SamplePlatesAvailable:NMRTubesHolderCenters
1067                                                        //create enough space:
1068                                                        IN3S_CreateTablesForPlates(DimSize(Centers, 0 ), 0)
1069                                                        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
1070                                                        LBCommandWv[][0]=""
1071                                                        LBCommandWv[][1]=num2str(Centers[p][0])
1072                                                        LBCommandWv[][2]=num2str(Centers[p][1])
1073                                                        //SVAR NewPlateName = root:Packages:SamplePlateSetup:UserNameForSampleSet
1074                                                        NewPlateName = "NMRTubesSet"+num2str(abs(round(gnoise(100))))
1075                                                        ListBox CommandsList win=SamplePlateSetup, selRow=1                                     
1076                                                        //SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1077                                                        WarningForUser = "Created a new set of positions for "+ SelectedPlateName
1078                                                        IN3S_EstimateRunTime()
1079                                                        break           // exit from switch
1080                                                case "NMR Tubes heater":         
1081                                                        Wave Centers = root:Packages:SamplePlatesAvailable:NMRTubesHolderCenters
1082                                                        //create enough space:
1083                                                        IN3S_CreateTablesForPlates(DimSize(Centers, 0 ), 0)
1084                                                        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
1085                                                        LBCommandWv[][0]=""
1086                                                        LBCommandWv[][1]=num2str(Centers[p][0])
1087                                                        LBCommandWv[][2]=num2str(Centers[p][1])
1088                                                        //SVAR NewPlateName = root:Packages:SamplePlateSetup:UserNameForSampleSet
1089                                                        NewPlateName = "NMRTubesSet"+num2str(abs(round(gnoise(100))))
1090                                                        ListBox CommandsList win=SamplePlateSetup, selRow=1                                     
1091                                                        //SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1092                                                        WarningForUser = "Created a new set of positions for "+ SelectedPlateName
1093                                                        IN3S_EstimateRunTime()
1094                                                        break           // exit from switch
1095                                                case "Generic Grid holder":     
1096                                                        Wave Centers = root:Packages:SamplePlatesAvailable:GenericGridHolderCenters
1097                                                        //get from user needed information
1098                                                        variable SX0=0, SY0=0, NX=5, NY=5, DX=10, DY=10
1099                                                        Prompt SX0, "Input sx for first center: "
1100                                                        Prompt SY0, "Input sy for first center: "
1101                                                        Prompt NX, "Number of points horizontal : "
1102                                                        Prompt NY, "Number of points vertical   : "
1103                                                        Prompt DX, "Step in x (horizontal) : "
1104                                                        Prompt DY, "Step in y (vertical)   : "
1105                                                        DoPrompt "Define grid start, point numebrs and steps", SX0, SY0, NX, NY, DX, DY
1106                                                        if(V_Flag)
1107                                                                abort
1108                                                        endif
1109                                                        redimension/N=(NX*NY,2) Centers
1110                                                        variable i, j, ict
1111                                                        ict=0
1112                                                        FOr(i=0;i<NX;i+=1)
1113                                                                For(j=0;j<NY;j+=1)
1114                                                                        Centers[ict][0]=SX0+i*DX
1115                                                                        Centers[ict][1]=SY0+j*DY
1116                                                                        ict+=1
1117                                                                endfor
1118                                                        endfor
1119                                                        IN3S_CreateTablesForPlates(DimSize(Centers, 0 ), 0)
1120                                                        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
1121                                                        LBCommandWv[][1]=num2str(Centers[p][0])
1122                                                        LBCommandWv[][2]=num2str(Centers[p][1])
1123                                                        LBCommandWv[][0]=""
1124                                                        LBCommandWv[0][0]=""
1125                                                        LBCommandWv[1][0]=""
1126                                                        SVAR NewPlateName = root:Packages:SamplePlateSetup:UserNameForSampleSet
1127                                                        NewPlateName = "GenericPlateSet"+num2str(abs(round(gnoise(100))))
1128                                                        //ListBox CommandsList win=SamplePlateSetup, selRow=1                                   
1129                                                        LBSelectionWv[][0]=2
1130                                                        LBSelectionWv[0][0]=3
1131                                                        //SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1132                                                        WarningForUser = "Created a new set of positions for "+ SelectedPlateName
1133                                                        IN3S_EstimateRunTime()
1134                                                        break           // exit from switch
1135                                                case "AgBehenateLaB6":   
1136                                                        IN3S_CreateTablesForPlates(1, 1)
1137                                                        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
1138                                                        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
1139                                                        LBCommandWv[][0]="AgBehenateLaB6"
1140                                                        LBCommandWv[][1]="20"
1141                                                        LBCommandWv[][2]="20"
1142                                                        LBCommandWv[][3]="1"
1143                                                        LBSelectionWv[][4]=32
1144                                                        LBSelectionWv[][5]=48
1145                                                        LBSelectionWv[][6]=48
1146                                                        //SVAR NewPlateName = root:Packages:SamplePlateSetup:UserNameForSampleSet
1147                                                        NewPlateName = "Standard"
1148                                                        //NVAR USAXSAll=root:Packages:SamplePlateSetup:USAXSAll
1149                                                        USAXSAll=0
1150                                                        //SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1151                                                        WarningForUser = "Created AgBehenateLaB6 and disabled USAXS"
1152                                                        break           // exit from switch
1153                                                case "Image":   
1154                                                        //nothing to do here...
1155                                                        //here is code which loads image and deal with that. this will be different code and complciated.
1156                                                       
1157                                                        break
1158                                                case "Another Plate":   
1159                                                                //      <code>
1160                                                        break
1161                                                default:                       
1162                                                //      <code>]         // when no case matches
1163                                        endswitch
1164                                        IN3S_AddTagToImage(-4)  //remove all drawings, if needed       
1165                                        TableIsSaved = 0
1166                                endif                   
1167                        endif
1168
1169                        if(StringMatch(ba.ctrlName, "AddMoreLines" ))
1170                                NVAR NewLines=root:Packages:SamplePlateSetup:NumberOfSamplesToCreate
1171                                IN3S_InsertDeleteLines(4, 0, NewLines) 
1172                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1173                                WarningForUser = "Added "+num2str(NewLines)+" new lines"
1174                                IN3S_EstimateRunTime()
1175                                TableIsSaved = 0
1176                        endif
1177                        if(StringMatch(ba.ctrlName, "SavePositionSet" ))
1178                                IN3S_SaveCurrentSampleSet(0,1)                         
1179                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1180                                WarningForUser = "Saved set of positions"
1181                                TableIsSaved = 1
1182                        endif
1183                        if(StringMatch(ba.ctrlName, "LoadSavedSet" ))
1184                                ControlInfo /W=SamplePlateSetup  SelectSavedSet
1185                                string SelectedFolder=S_Value
1186                                if(StringMatch(SelectedFolder, "---" ))
1187                                        return 0
1188                                endif
1189                                if(TableIsSaved<0.5)
1190                                        DoAlert/T="This will overwrite your existing set of positions !!! " 1,  "Existing set is not saved! New set of Sample positions will be created and existing one deleted. Do you want to continue?"
1191                                        if(V_Flag==1)   //yes...
1192                                                //KillWIndow/Z SamplePlateImageDrawing
1193                                                IN3S_LoadSavedSampleSet()
1194                                        endif
1195                                else
1196                                        IN3S_LoadSavedSampleSet()               
1197                                endif
1198                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1199                                WarningForUser = "Loaded set of positions for "+SelectedFolder
1200                                IN3S_EstimateRunTime()
1201                                TableIsSaved = 1
1202                        endif
1203                        if(StringMatch(ba.ctrlName, "PreviewCommandFile" ))
1204                                IN3S_CheckForSensibility()
1205                                IN3S_WriteCommandFile(1,1)
1206                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1207                                WarningForUser = "Created Notebook with commands for review"
1208                        endif
1209                        string newName
1210                        if(StringMatch(ba.ctrlName, "ExportCommandFile" ))
1211                                //here we need to save that notebook somewhere
1212                                newName = IN3S_ExportMacroFile(0,0)
1213                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1214                                WarningForUser = "Exported usaxs.mac on your desktop"
1215                                IN3_FTPUSAXSMacFile()
1216                        endif
1217                        if(StringMatch(ba.ctrlName, "ExportCommandFile2" ))
1218                                //here we need to save that notebook somewhere
1219                                newName = IN3S_ExportMacroFile(1,0)
1220                                if(strlen(newName)>0)
1221                                        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1222                                        WarningForUser = "Exported command file as "+newName
1223                                else
1224                                        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1225                                        WarningForUser = "Command file export was cancelled"
1226                                endif
1227                        endif
1228                        if(StringMatch(ba.ctrlName, "AppendToCommandFile" ))
1229                                newName = IN3S_ExportMacroFile(0,1)
1230                                if(strlen(newName)>0)
1231                                        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1232                                        WarningForUser = "Appended to command file "+newName
1233                                        IN3_FTPUSAXSMacFile()
1234                                else
1235                                        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
1236                                        WarningForUser = "Append To Command file export was cancelled"
1237                                endif
1238                        endif
1239
1240                        if(StringMatch(ba.ctrlName, "BeamlineSurvey" ))
1241                                KillWindow/Z TrimCorrectImageDrawing
1242                                IN3S_BeamlineSurvey()
1243                        endif
1244                        if(StringMatch(ba.ctrlName, "GetHelp" ))
1245                        //https://saxs-igorcodedocs.readthedocs.io/en/latest/Indra/SamplePlateSurvey.html
1246                        //Open www manual with the right page
1247                        IN2G_OpenWebManual("Indra/SamplePlateSurvey.html")
1248                        endif
1249
1250                        IN3S_FixSaveButton()
1251                       
1252                        break
1253                case -1: // control being killed
1254                        break
1255        endswitch
1256        return 0
1257End
1258//************************************************************************************************************
1259static Function IN3_InsertHookIntoMainProc()
1260        //figure out if we have the hook function in main package or already in main Proc window
1261        string FuncInfo = FunctionInfo("IN3S_ExportHookFunction")
1262        //PROCWIN:IN3_SamplePlate.ipf
1263        if(StringMatch(StringByKey("PROCWIN", FuncInfo), "IN3_SamplePlate.ipf" ))
1264                //original location, need to create override function. Or   
1265            String currScrap = GetScrapText()           // copy current scrap text
1266            DisplayProcedure/W=Procedure                       
1267            DoIgorMenu "Edit" "Select All"
1268            DoIgorMenu "Edit" "Copy"
1269            string existingProCode=GetScrapText()       // modify procedure code
1270                String newCode = existingProCode + "\r\roverride "+ProcedureText("IN3S_ExportHookFunction") // modify procedure code
1271            PutScrapText newCode                                        // new code in clipboard...
1272            DoIgorMenu "Edit" "Paste"                           //put in main proc window.
1273            PutScrapText currScrap                      // put previous scrap text back
1274            Execute/P/Q/Z "COMPILEPROCEDURES "          // recompile all
1275            HideProcedures                              // hide all procedure windows
1276        endif
1277    DisplayProcedure/W=Procedure
1278    //DisplayProcedure "IN3S_ExportHookFunction"
1279End
1280//************************************************************************************************************
1281
1282Function IN3_FTPUSAXSMacFile()
1283        //look for ftp batch file and if available and instrument is not running, upload usaxs.mac from desktop.
1284
1285        GetfileFolderInfo/Q/Z "C:Users:usaxs:Documents:WinSCP:putUSAXSMacFile.bat"
1286        if(V_Flag!=0)
1287                return 0
1288        else
1289                GetfileFolderInfo/Q/Z "C:Users:usaxs:Desktop:usaxs.mac"
1290                if(V_Flag!=0)
1291                        DoAlert /T="sftp error" 0, "usaxs.mac was not found on the desktop"
1292                else
1293                        IN3S_BeramlineSurveyAbortIfNeeded("Cannot sftp usaxs.mac")                              //this will abort if instrument is running.
1294                        DoAlert /T="Sftp usaxs.mac to usaxscontrol?" 1, "Do you want to sftp new usaxs.mac to usaxscontrol? Existing one will be overwritten!"
1295                        if(V_Flag==1)
1296                                ExecuteScriptText /W=5 "\"C:\\Users\\usaxs\\Documents\\WinSCP\\putUSAXSMacFile.bat\""
1297                        endif
1298                endif
1299       
1300        endif
1301
1302end
1303//************************************************************************************************************
1304//************************************************************************************************************
1305
1306
1307Function IN3S_CheckProc(cba) : CheckBoxControl
1308        STRUCT WMCheckboxAction &cba
1309
1310        switch( cba.eventCode )
1311                case 2: // mouse up
1312                        Variable checked = cba.checked
1313                        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
1314                        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
1315                        NVAR WAXSAll = root:Packages:SamplePlateSetup:WAXSAll
1316                        NVAR USAXSAll = root:Packages:SamplePlateSetup:USAXSAll
1317                        NVAR SAXSAll = root:Packages:SamplePlateSetup:SAXSAll
1318                        NVAR ExportCurrentPosSet = root:Packages:SamplePlateSetup:ExportCurrentPosSet
1319                        NVAR ExportListOfPosSets = root:Packages:SamplePlateSetup:ExportListOfPosSets
1320                       
1321                        STRUCT WMTabControlAction tca
1322
1323                        if(stringmatch(cba.ctrlName,"ExportCurrentPosSet"))
1324                                ExportListOfPosSets = !ExportCurrentPosSet
1325                                tca.eventCode=2
1326                                tca.tab = 2
1327                                IN3S_TableTabsTabProc(tca)
1328                        endif
1329                        if(stringmatch(cba.ctrlName,"ExportListOfPosSets"))
1330                                ExportCurrentPosSet = !ExportListOfPosSets
1331                                tca.eventCode=2
1332                                tca.tab = 2
1333                                IN3S_TableTabsTabProc(tca)
1334                        endif
1335                        if(stringmatch(cba.ctrlName,"USAXSAll"))
1336                                if(USAXSAll)
1337                                        LBSelectionWv[][4]=48
1338                                else
1339                                        LBSelectionWv[][4]=32
1340                                endif
1341                                IN3S_EstimateRunTime()
1342                        endif
1343                        if(stringmatch(cba.ctrlName,"SAXSAll"))
1344                                if(SAXSAll)
1345                                        LBSelectionWv[][5]=48
1346                                else
1347                                        LBSelectionWv[][5]=32
1348                                endif
1349                                IN3S_EstimateRunTime()
1350                        endif
1351                        if(stringmatch(cba.ctrlName,"WAXSAll"))
1352                                if(WAXSAll)
1353                                        LBSelectionWv[][6]=48
1354                                else
1355                                        LBSelectionWv[][6]=32
1356                                endif
1357                                IN3S_EstimateRunTime()
1358                        endif
1359                        if(stringmatch(cba.ctrlName,"DisplayUSWAXScntrls"))
1360                                IN3S_FixUSWAXSForAll()
1361                                if(checked)
1362                                        WAXSAll  = 0
1363                                        USAXSAll = 0
1364                                        SAXSAll  = 0
1365                                else
1366                                        WAXSAll  = 1
1367                                        USAXSAll = 1
1368                                        SAXSAll  = 1
1369                                endif
1370                        endif
1371                        if(stringmatch(cba.ctrlName,"DisplayAllSamplesInImage"))
1372                                Wave/T listWave=root:Packages:SamplePlateSetup:LBCommandWv
1373                                if(checked)
1374                                        IN3S_AddTagToImage(dimSize(listWave,0)-1)
1375                                else
1376                                        ControlInfo/W=SamplePlateSetup CommandsList
1377                                        if(V_Flag>=0 && V_Flag<dimsize(LBCommandWv,0))
1378                                                IN3S_AddTagToImage(V_Flag)     
1379                                        else
1380                                                IN3S_AddTagToImage(0)   //remove all drawings, if needed       
1381                                                LBSelectionWv[][0]=2
1382                                                LBSelectionWv[0][0]=3
1383                                                //ListBox CommandsList, win=SamplePlateSetup, selRow= 0
1384                                        endif
1385                                endif
1386                        endif
1387                        break
1388                case -1: // control being killed
1389                        break
1390        endswitch
1391
1392        return 0
1393End
1394//************************************************************************************************************
1395//************************************************************************************************************
1396static Function IN3S_FixUSWAXSForAll()
1397
1398        NVAR USAXSAll = root:Packages:SamplePlateSetup:USAXSAll
1399        NVAR SAXSAll = root:Packages:SamplePlateSetup:SAXSAll
1400        NVAR WAXSAll = root:Packages:SamplePlateSetup:WAXSAll
1401        NVAR DiasplyCheckb = root:Packages:SamplePlateSetup:DisplayUSWAXScntrls
1402        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
1403        Wave/T LBTtitleWv = root:Packages:SamplePlateSetup:LBTtitleWv
1404        variable USAXSWidth, SAXSWidth, WAXSWidth, MDwidth
1405        //LBTtitleWv = {"Sample Name", "X [mm]", "Y [mm]", "Thick [mm]", "USAXS", "SAXS", "WAXS", "Metadata"}
1406        //now set the columns based on what is checked...
1407        if(DiasplyCheckb)       //display checkboxes...
1408                LBTtitleWv[4]="USAXS"
1409                USAXSWidth = 40
1410                LBTtitleWv[5]="SAXS"
1411                SAXSWidth = 40
1412                LBTtitleWv[6]="WAXS"
1413                WAXSWidth = 40
1414                LBTtitleWv[7]="MD"
1415                MDwidth = 40
1416        else
1417                LBTtitleWv[4]=""
1418                USAXSWidth = 0 
1419                LBTtitleWv[5]=""
1420                SAXSWidth = 0
1421                LBTtitleWv[6]=""
1422                WAXSWidth = 0
1423                LBTtitleWv[7]=""
1424                MDwidth = 0
1425        endif
1426        ListBox CommandsList win=SamplePlateSetup, widths={220,50,50,60,USAXSWidth,SAXSWidth,WAXSWidth,MDwidth}
1427end
1428//************************************************************************************************************
1429//************************************************************************************************************
1430static Function IN3S_LoadSavedSampleSet([folderToLoad])
1431        string folderToLoad
1432
1433        DFrEF OldDf=GetDataFolderDFR()
1434        string SelectedFolder
1435        if(ParamIsDefault(folderToLoad))
1436                ControlInfo /W=SamplePlateSetup  SelectSavedSet
1437                SelectedFolder=S_Value
1438                if(StringMatch(SelectedFolder, "---" ))
1439                        SetDataFolder OldDf     
1440                        abort
1441                endif
1442        else
1443                SelectedFolder = folderToLoad
1444        endif
1445        if(DataFolderExists("root:SavedSampleSets:"))
1446                setDataFolder root:SavedSampleSets:
1447                if(DataFolderExists(SelectedFolder))
1448                        SetDataFolder SelectedFolder
1449                        Wave/T listWave
1450                        Wave LBSelectionWv
1451                        Wave/T LBTtitleWv
1452                        NVAR USAXSAll
1453                        NVAR SAXSAll
1454                        NVAR WAXSAll
1455                        //these are global ones...
1456                        Wave/T listWaveG=root:Packages:SamplePlateSetup:LBCommandWv
1457                        Wave LBSelectionWvG= root:Packages:SamplePlateSetup:LBSelectionWv
1458                        Wave/T LBTtitleWvG  = root:Packages:SamplePlateSetup:LBTtitleWv
1459                        NVAR USAXSAllG = root:Packages:SamplePlateSetup:USAXSAll
1460                        NVAR SAXSAllG = root:Packages:SamplePlateSetup:SAXSAll
1461                        NVAR WAXSAllG = root:Packages:SamplePlateSetup:WAXSAll
1462                        //and write the values...
1463                        USAXSAllG = USAXSAll
1464                        SAXSAllG = SAXSAll
1465                        WAXSAllG = WAXSAll
1466                        redimension/N=(DimSize(listWave,0), DimSize(listWave,1)) listWaveG, LBSelectionWvG
1467                        LBSelectionWvG = LBSelectionWv
1468                        listWaveG = listWave
1469                        LBTtitleWvG =  LBTtitleWv
1470                        print "Restored settings from folder "+GetDataFolder(1)
1471                        SVAR NewPlateName = root:Packages:SamplePlateSetup:UserNameForSampleSet
1472                        NewPlateName = SelectedFolder
1473                endif
1474        endif   
1475        SetDataFolder OldDf     
1476end
1477//************************************************************************************************************
1478//************************************************************************************************************
1479
1480static Function IN3S_SaveCurrentSampleSet(Overwrite, AddToList)
1481        variable Overwrite, AddToList
1482
1483        DFrEF OldDf=GetDataFolderDFR()
1484                Wave/T listWaveG   =  root:Packages:SamplePlateSetup:LBCommandWv
1485                Wave LBSelectionWvG= root:Packages:SamplePlateSetup:LBSelectionWv
1486                Wave/T LBTtitleWvG  = root:Packages:SamplePlateSetup:LBTtitleWv
1487                NVAR USAXSAllG = root:Packages:SamplePlateSetup:USAXSAll
1488                NVAR SAXSAllG = root:Packages:SamplePlateSetup:SAXSAll
1489                NVAR WAXSAllG = root:Packages:SamplePlateSetup:WAXSAll
1490                SVAR NewPlateName = root:Packages:SamplePlateSetup:UserNameForSampleSet
1491                NewPlateName = CleanupName(NewPlateName, 1) 
1492                newDatafolder/O/S root:SavedSampleSets
1493                string newUniqueName
1494                if(DataFolderExists(NewPlateName)&& !Overwrite)
1495                        DoAlert /T="This name is already used" 2, "Saved named set exists, Overwite(Yes) - Make Name unique (No) - Cancel"
1496                        if(V_Flag==3)
1497                                SetDataFolder OldDf
1498                                abort
1499                        elseif(V_Flag==2)
1500                                newUniqueName= UniqueName(NewPlateName, 11, 1)
1501                        elseif(V_Flag==1)
1502                                newUniqueName = NewPlateName
1503                                KillDataFolder $(newUniqueName)
1504                        endif   
1505                else
1506                        newUniqueName = NewPlateName
1507                        if(Overwrite)
1508                                KillDataFolder/Z $(newUniqueName)
1509                        endif
1510                endif
1511                NewDataFOlder/O/S $(newUniqueName)
1512                variable/g USAXSAll
1513                USAXSAll = USAXSAllG
1514                variable/g SAXSAll
1515                SAXSAll = SAXSAllG
1516                variable/g WAXSAll
1517                WAXSAll = WAXSAllG
1518                Duplicate/O listWaveG, listWave
1519                Duplicate/O LBSelectionWvG, LBSelectionWv
1520                Duplicate/O LBTtitleWvG, LBTtitleWv
1521                print "Stored settings in folder "+GetDataFolder(1)
1522               
1523                PopupMenu SelectSavedSet,win=SamplePlateSetup, mode=1,value= #"\"---;\"+IN3S_GenStringOfSets()"
1524                //add this to list in waves for multi export
1525                if(AddToList)
1526                        Wave/T ListOfSavedSetsWv=root:Packages:SamplePlateSetup:ListOfSavedSetsWv
1527                        Wave SelListOfSavedSetsWv=root:Packages:SamplePlateSetup:SelListOfSavedSetsWv
1528                        variable OldLength=numpnts(ListOfSavedSetsWv)
1529                        redimension/N=(OldLength+1) ListOfSavedSetsWv, SelListOfSavedSetsWv
1530                        ListOfSavedSetsWv[OldLength] = newUniqueName
1531                endif
1532        SetDataFolder OldDf     
1533end
1534
1535
1536//*****************************************************************************************************************
1537//*****************************************************************************************************************
1538
1539static Function IN3S_CheckForSensibility()
1540        //this will check table for sensibility fo data.
1541       
1542        //at this time warns about lack of Blanks...
1543       
1544        //create USAXS command file... For now as notebook and just display for user.
1545
1546        DFrEF OldDf=GetDataFolderDFR()
1547        Wave/T listWaveG   =  root:Packages:SamplePlateSetup:LBCommandWv
1548        Wave LBSelectionWvG= root:Packages:SamplePlateSetup:LBSelectionWv
1549        Wave/T LBTtitleWvG  = root:Packages:SamplePlateSetup:LBTtitleWv
1550        NVAR USAXSAllG = root:Packages:SamplePlateSetup:USAXSAll
1551        NVAR SAXSAllG = root:Packages:SamplePlateSetup:SAXSAll
1552        NVAR WAXSAllG = root:Packages:SamplePlateSetup:WAXSAll
1553        NVAR DefaultSampleThickness=root:Packages:SamplePlateSetup:DefaultSampleThickness
1554        SVAR UserNameForSampleSet = root:Packages:SamplePlateSetup:UserNameForSampleSet
1555        NVAR RunExportHookFunction= root:Packages:SamplePlateSetup:RunExportHookFunction
1556       
1557        variable i, haveAnySAXS, haveAnyWAXS,haveAnyUSAXS
1558        //figure out list of names which will be used...
1559        string ListOfSAXSNames, ListOfWAXSNames, ListOfUSAXSNames
1560        ListOfSAXSNames=""
1561        ListOfWAXSNames=""
1562        ListOfUSAXSNames=""
1563   //SAXS is first.
1564   For(i=0;i<dimsize(listWaveG,0);i+=1)
1565                if(SAXSAllG || LBSelectionWvG[i][5]==48)
1566                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1567                                haveAnySAXS=1
1568                                ListOfSAXSNames+=listWaveG[i][0]+";"
1569                        endif
1570                endif   
1571   endfor
1572   //WAXS is next.
1573   For(i=0;i<dimsize(listWaveG,0);i+=1)
1574                if(WAXSAllG || LBSelectionWvG[i][6]==48)
1575                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1576                                haveAnyWAXS=1
1577                                ListOfWAXSNames+=listWaveG[i][0]+";"
1578                        endif
1579                endif   
1580   endfor
1581   //do we have any USAXS scans?
1582   For(i=0;i<dimsize(listWaveG,0);i+=1)
1583                if(USAXSAllG || LBSelectionWvG[i][4]==48)
1584                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1585                                haveAnyUSAXS=1
1586                                ListOfUSAXSNames+=listWaveG[i][0]+";"
1587                        endif
1588                endif   
1589   endfor
1590        variable NumWAXS, NumWAXSBlanks
1591        variable NumSAXS, NumSAXSBlanks
1592        variable NumUSAXS, NumUSAXSBlanks
1593        NumWAXS=ItemsInList(ListOfWAXSNames)
1594        NumWAXSBlanks=ItemsInList(GrepList(ListOfWAXSNames, "(?i)blank")+GrepList(ListOfWAXSNames, "(?i)empty"))
1595        NumSAXS=ItemsInList(ListOfSAXSNames)
1596        NumSAXSBlanks=ItemsInList(GrepList(ListOfSAXSNames, "(?i)blank")+GrepList(ListOfSAXSNames, "(?i)empty"))
1597        NumUSAXS=ItemsInList(ListOfUSAXSNames)
1598        NumUSAXSBlanks=ItemsInList(GrepList(ListOfUSAXSNames, "(?i)blank")+GrepList(ListOfUSAXSNames, "(?i)empty"))
1599        string MessageToUser=""
1600   if((NumUSAXSBlanks/NumUSAXS)<(1/15))
1601                MessageToUser+=" Blanks for USAXS, "
1602   endif
1603   if((NumSAXSBlanks/NumSAXS)<(1/15))
1604                MessageToUser+=" Blanks for SAXS, "
1605   endif
1606   if((NumWAXSBlanks/NumWAXS)<(1/15))
1607                MessageToUser+=" Blanks for WAXS "
1608   endif
1609   if(strlen(MessageToUser)>5 &&(NumWAXS>1 || NumSAXS>1 || NumUSAXS>1))
1610        DoAlert /T="Not enough blanks, check history area" 0, "Looks like there is not enough "+MessageToUser
1611        Print "You need enough background = blanks/empty runs. Default is at least 1 blank per 15 samples, Suggested is 1 blank per 10 samples."
1612        print "Code expects background measurements will have blank of empty in the name, but name can contain more. e.g.: TapeBlank is recognized as blank."
1613        print "If your background names are different you can go ahead as is."
1614   endif
1615        SetDataFolder OldDf
1616end
1617//*****************************************************************************************************************
1618//*****************************************************************************************************************
1619static Function IN3S_WriteCommandFile(show, AppendHeaders)
1620        variable show, AppendHeaders
1621
1622       
1623        //Options to export multiple saved sets of positions...
1624        NVAR ExportCurrentPosSet=root:Packages:SamplePlateSetup:ExportCurrentPosSet
1625        NVAR ExportListOfPosSets=root:Packages:SamplePlateSetup:ExportListOfPosSets
1626        SVAR CurNameStr=root:Packages:SamplePlateSetup:UserNameForSampleSet
1627        variable i
1628        string CurFolder, TempFolder
1629        curFolder=CurNameStr
1630
1631        if(ExportListOfPosSets)         //user wants to export multiple saved set...
1632                Wave/T ListOfWavesForExport=root:Packages:SamplePlateSetup:ListOfWavesForExport
1633                if(numpnts(ListOfWavesForExport)>0)
1634                        CurNameStr = "TempExportSetStored"
1635                        //save current, just in case
1636                        IN3S_SaveCurrentSampleSet(1,0)
1637                        //cleanup old notebook.
1638                        SVAR/Z nbl=root:Packages:SamplePlateSetup:NotebookName
1639                        if(!SVAR_Exists(nbl))
1640                                NewDataFolder/O root:Packages
1641                                NewDataFolder/O root:Packages:SamplePlateSetup
1642                                String/G root:Packages:SamplePlateSetup:NotebookName=""
1643                                SVAR nbl=root:Packages:SamplePlateSetup:NotebookName
1644                                nbL="CommandFile"
1645                        endif
1646                        if ((strsearch(WinList("*",";","WIN:16"),nbL,0)!=-1))           ///CommandFile notebook exists
1647                                KillWindow/Z $(nbl)
1648                        endif
1649                        //cycle through the list
1650                        For(i=0;i<numpnts(ListOfWavesForExport);i+=1)
1651                                TempFolder = ListOfWavesForExport[i]
1652                                IN3S_LoadSavedSampleSet(folderToLoad=TempFolder)
1653                                IN3S_WriteCommandFileInternal(show, AppendHeaders,0)
1654                        endfor
1655                        IN3S_LoadSavedSampleSet(folderToLoad="TempExportSetStored")
1656                        KillDataFolder/Z root:SavedSampleSets:TempExportSetStored:              //clean up the temp saved data set.
1657                else
1658                        abort "Nothing is on the list here"
1659                endif
1660        elseif(ExportCurrentPosSet)
1661                IN3S_WriteCommandFileInternal(show, AppendHeaders,1)
1662        else
1663                Abort "SOmething wrong with the code in IN3S_WriteCommandFile"
1664        endif
1665end
1666//*****************************************************************************************************************
1667static FUnction IN3S_WriteCommandFileInternal(show, AppendHeaders, KillIfFound)
1668        variable show, AppendHeaders, KillIfFound
1669        //create USAXS command file... For now as notebook and just display for user.
1670
1671        DFrEF OldDf=GetDataFolderDFR()
1672        Wave/T listWaveG   =  root:Packages:SamplePlateSetup:LBCommandWv
1673        Wave LBSelectionWvG= root:Packages:SamplePlateSetup:LBSelectionWv
1674        Wave/T LBTtitleWvG  = root:Packages:SamplePlateSetup:LBTtitleWv
1675        NVAR USAXSAllG = root:Packages:SamplePlateSetup:USAXSAll
1676        NVAR SAXSAllG = root:Packages:SamplePlateSetup:SAXSAll
1677        NVAR WAXSAllG = root:Packages:SamplePlateSetup:WAXSAll
1678        NVAR DefaultSampleThickness=root:Packages:SamplePlateSetup:DefaultSampleThickness
1679        SVAR UserNameForSampleSet = root:Packages:SamplePlateSetup:UserNameForSampleSet
1680        NVAR RunExportHookFunction= root:Packages:SamplePlateSetup:RunExportHookFunction
1681        SVAR/Z nbl=root:Packages:SamplePlateSetup:NotebookName
1682        variable i, haveAnySWAXS, thickness
1683        haveAnySWAXS = 0
1684        if(!SVAR_Exists(nbl))
1685                NewDataFolder/O root:Packages
1686                NewDataFolder/O root:Packages:SamplePlateSetup
1687                String/G root:Packages:SamplePlateSetup:NotebookName=""
1688                SVAR nbl=root:Packages:SamplePlateSetup:NotebookName
1689                nbL="CommandFile"
1690        endif
1691        if ((strsearch(WinList("*",";","WIN:16"),nbL,0)!=-1) && KillIfFound)            ///CommandFile notebook exists
1692                KillWindow/Z $(nbl)
1693        endif
1694       
1695        if ((strsearch(WinList("*",";","WIN:16"),nbL,0) <0))
1696                NewNotebook/K=1/F=0/ENCG={3,0}/N=$nbl/V=1/W=(235.5,44.75,817.5,592.25) as nbl           
1697                Notebook $nbl writeBOM = 0
1698                if(AppendHeaders)
1699                        Notebook $nbl text="        CURRENT_EXPERIMENT_NAME \""+UserNameForSampleSet+"\"\r"
1700                        Notebook $nbl text="            # This file runs USAXS, SAXS and WAXS scans according to the syntax shown below\r"
1701                        Notebook $nbl text="            #       \r"
1702                        Notebook $nbl text="            # Scan Type      sx         sy   Thickness  Sample Name\r"
1703                        Notebook $nbl text="            # ------------------------------------------------------  \r"
1704                        Notebook $nbl text="            # USAXSscan    45.07       98.3     0      \"Water Blank\"\r"
1705                        Notebook $nbl text="            # saxsExp      45.07       98.3     0      \"Water Blank\"\r"
1706                        Notebook $nbl text="            # waxsExp      45.07       98.3     0      \"Water Blank\"  \r"
1707                        Notebook $nbl text="            #      Use a space (not a tab) to separate arguments (i.e., 45.07 <space> 98.3 in the examples above)\r" 
1708                        Notebook $nbl text="\r"
1709                        Notebook $nbl text="            # Run this file by typing the following command in the spec window:   USAXS> CollectData usaxs.mac \r"             
1710                        Notebook $nbl text="\r"                                   
1711                        Notebook $nbl text="            # Stop the run using the \"Stop after this scan?\" checkbox in USAXS user main intf  \r"
1712                        Notebook $nbl text="            # and wait until the USAXS> prompt reappears\r"
1713                        Notebook $nbl text="\r"         
1714                        Notebook $nbl text="            ############ PLACE ALL USER COMMANDS AFTER THIS LINE ############  \r"             
1715                        Notebook $nbl text="\r"
1716                endif
1717        endif
1718        Notebook $nbl text="             \r"
1719
1720   //and now we will write the commands...
1721   //SAXS is first.
1722   
1723   IN3S_WriteListOfCommands(listWaveG, LBSelectionWvG, 0, 0, "")
1724   if(RunExportHookFunction)
1725                IN3S_ExportHookFunction(listWaveG, LBSelectionWvG)
1726   endif
1727
1728        if (show)               ///Logbook want to show it...
1729                DoWindow/F $nbl
1730        else
1731                DoWindow/HIDE=1 $nbl
1732        endif
1733        SetDataFolder OldDf
1734end
1735
1736//Function IN3S_ExportHookFunction(Command, SampleName,SX, SY, Thickness, MD)
1737//      string Command, SampleName,SX, SY, Thickness, MD
1738//      //this hook function will modify output of the command file for given line. This needs to be cutomized for specific need.
1739//      SVAR nbl=root:Packages:SamplePlateSetup:NotebookName
1740//
1741//      //in this case it will write each command in notebook multiple times, in original position and then +/- 1mm in sx and sy
1742//      //center       
1743//      Notebook $nbl text="      "+Command+"        "+SX+"      "+SY+"      "+Thickness+"      \""+SampleName+"\"  \r"
1744//      //and now the variations, only if Sample Name is NOT Blank or Empty
1745//      if(!StringMatch(SampleName, "*Blank*")&&!StringMatch(SampleName, "*Empty*"))
1746//              string TempStr
1747//              TempStr = num2str(str2num(SX)-1)
1748//              Notebook $nbl text="      "+Command+"        "+TempStr+"      "+SY+"      "+Thickness+"      \""+SampleName+"_R"+"\"  \r"
1749//              TempStr = num2str(str2num(SX)+1)
1750//              Notebook $nbl text="      "+Command+"        "+TempStr+"      "+SY+"      "+Thickness+"      \""+SampleName+"_L"+"\"  \r"
1751//              TempStr = num2str(str2num(SY)-1)
1752//              Notebook $nbl text="      "+Command+"        "+SX+"      "+TempStr+"      "+Thickness+"      \""+SampleName+"_B"+"\"  \r"
1753//              TempStr = num2str(str2num(SY)+1)
1754//              Notebook $nbl text="      "+Command+"        "+SX+"      "+TempStr+"      "+Thickness+"      \""+SampleName+"_T"+"\"  \r"
1755//      endif   
1756//end
1757
1758//*****************************************************************************************************************
1759//*****************************************************************************************************************
1760
1761Function IN3S_WriteListOfCommands(listWaveG, LBSelectionWvG, sxOffset, syOffset, TitleModifier)
1762        wave/T listWaveG
1763        wave LBSelectionWvG
1764        variable sxOffset, syOffset
1765        string  TitleModifier
1766       
1767        NVAR DefaultSampleThickness=root:Packages:SamplePlateSetup:DefaultSampleThickness
1768        NVAR USAXSAllG = root:Packages:SamplePlateSetup:USAXSAll
1769        NVAR SAXSAllG = root:Packages:SamplePlateSetup:SAXSAll
1770        NVAR WAXSAllG = root:Packages:SamplePlateSetup:WAXSAll
1771        SVAR ExportOrder=root:Packages:SamplePlateSetup:ExportOrder
1772        // ExportOrder can be: USAXS-SAXS-WAXS, SAXS-WAXS-USAXS, or USAXS-WAXS-SAXS
1773
1774        variable i, haveAnySWAXS, thickness, sxMod, syMod, numSAXSWAXS
1775        haveAnySWAXS = 0
1776        numSAXSWAXS = 0
1777
1778        string Command, SampleName
1779        variable SX, SY
1780        variable HaveUSAXS
1781        //this  function will write (potentially modified) output of the command file for given line. This needs to be cutomized for specific need.
1782        SVAR nbl=root:Packages:SamplePlateSetup:NotebookName
1783
1784        strswitch(ExportOrder)
1785       
1786                case "USAXS-SAXS-WAXS":
1787                   Notebook $nbl text="\r"
1788                   Notebook $nbl text="         #USAXS measurements \r"
1789                   For(i=0;i<dimsize(listWaveG,0);i+=1)
1790                                if(USAXSAllG || LBSelectionWvG[i][4]==48)
1791                                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1792                                                thickness = str2num(listWaveG[i][3])
1793                                                thickness = thickness>0 ? thickness : DefaultSampleThickness
1794                                                SX=str2num(listWaveG[i][1])+sxOffset
1795                                                SY=str2num(listWaveG[i][2])+syOffset
1796                                                Notebook $nbl text="      USAXSscan        "+num2str(SX)+"      "+num2str(SY)+"      "+num2str(thickness)+"      \""+listWaveG[i][0]+TitleModifier+"\"  \r"
1797                                        endif
1798                                endif   
1799                   endfor
1800                        Notebook $nbl text="\r"
1801                        Notebook $nbl text="            #SAXS measurements \r"
1802                   //this is SAXS
1803                   For(i=0;i<dimsize(listWaveG,0);i+=1)
1804                                if(SAXSAllG || LBSelectionWvG[i][5]==48)
1805                                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1806                                                haveAnySWAXS=1
1807                                                numSAXSWAXS+=1
1808                                                thickness = str2num(listWaveG[i][3])
1809                                                thickness = thickness>0 ? thickness : DefaultSampleThickness
1810                                                SX=str2num(listWaveG[i][1])+sxOffset
1811                                                SY=str2num(listWaveG[i][2])+syOffset
1812                                                Notebook $nbl text="      saxsExp        "+num2str(SX)+"      "+num2str(SY)+"      "+num2str(thickness)+"      \""+listWaveG[i][0]+TitleModifier+"\"  \r"
1813                                        endif
1814                                endif   
1815                   endfor
1816                   //WAXS is next.
1817                        Notebook $nbl text="\r"
1818                        Notebook $nbl text="            #WAXS measurements \r"
1819                   For(i=0;i<dimsize(listWaveG,0);i+=1)
1820                                if(WAXSAllG || LBSelectionWvG[i][6]==48)
1821                                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1822                                                haveAnySWAXS=1
1823                                                numSAXSWAXS+=1
1824                                                thickness = str2num(listWaveG[i][3])
1825                                                thickness = thickness>0 ? thickness : DefaultSampleThickness
1826                                                SX=str2num(listWaveG[i][1])+sxOffset
1827                                                SY=str2num(listWaveG[i][2])+syOffset
1828                                                Notebook $nbl text="      waxsExp        "+num2str(SX)+"      "+num2str(SY)+"      "+num2str(thickness)+"      \""+listWaveG[i][0]+TitleModifier+"\"  \r"
1829                                        endif
1830                                endif   
1831                   endfor
1832                        Notebook $nbl text="            #END of batch of measurements \r"
1833                        break
1834                case "USAXS-WAXS-SAXS":
1835                   Notebook $nbl text="\r"
1836                   Notebook $nbl text="         #USAXS measurements \r"
1837                   For(i=0;i<dimsize(listWaveG,0);i+=1)
1838                                if(USAXSAllG || LBSelectionWvG[i][4]==48)
1839                                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1840                                                thickness = str2num(listWaveG[i][3])
1841                                                thickness = thickness>0 ? thickness : DefaultSampleThickness
1842                                                SX=str2num(listWaveG[i][1])+sxOffset
1843                                                SY=str2num(listWaveG[i][2])+syOffset
1844                                                Notebook $nbl text="      USAXSscan        "+num2str(SX)+"      "+num2str(SY)+"      "+num2str(thickness)+"      \""+listWaveG[i][0]+TitleModifier+"\"  \r"
1845                                        endif
1846                                endif   
1847                   endfor
1848                   //WAXS is next.
1849                        Notebook $nbl text="\r"
1850                        Notebook $nbl text="            #WAXS measurements \r"
1851                   For(i=0;i<dimsize(listWaveG,0);i+=1)
1852                                if(WAXSAllG || LBSelectionWvG[i][6]==48)
1853                                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1854                                                haveAnySWAXS=1
1855                                                numSAXSWAXS+=1
1856                                                thickness = str2num(listWaveG[i][3])
1857                                                thickness = thickness>0 ? thickness : DefaultSampleThickness
1858                                                SX=str2num(listWaveG[i][1])+sxOffset
1859                                                SY=str2num(listWaveG[i][2])+syOffset
1860                                                Notebook $nbl text="      waxsExp        "+num2str(SX)+"      "+num2str(SY)+"      "+num2str(thickness)+"      \""+listWaveG[i][0]+TitleModifier+"\"  \r"
1861                                        endif
1862                                endif   
1863                   endfor
1864                        Notebook $nbl text="\r"
1865                        Notebook $nbl text="            #SAXS measurements \r"
1866                   //this is SAXS
1867                   For(i=0;i<dimsize(listWaveG,0);i+=1)
1868                                if(SAXSAllG || LBSelectionWvG[i][5]==48)
1869                                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1870                                                haveAnySWAXS=1
1871                                                numSAXSWAXS+=1
1872                                                thickness = str2num(listWaveG[i][3])
1873                                                thickness = thickness>0 ? thickness : DefaultSampleThickness
1874                                                SX=str2num(listWaveG[i][1])+sxOffset
1875                                                SY=str2num(listWaveG[i][2])+syOffset
1876                                                Notebook $nbl text="      saxsExp        "+num2str(SX)+"      "+num2str(SY)+"      "+num2str(thickness)+"      \""+listWaveG[i][0]+TitleModifier+"\"  \r"
1877                                        endif
1878                                endif   
1879                   endfor
1880                        Notebook $nbl text="            #END of batch of measurements \r"
1881                        break
1882                case "SAXS-WAXS-USAXS":
1883                   //this is SAXS
1884                   For(i=0;i<dimsize(listWaveG,0);i+=1)
1885                                if(SAXSAllG || LBSelectionWvG[i][5]==48)
1886                                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1887                                                haveAnySWAXS=1
1888                                                numSAXSWAXS+=1
1889                                                thickness = str2num(listWaveG[i][3])
1890                                                thickness = thickness>0 ? thickness : DefaultSampleThickness
1891                                                SX=str2num(listWaveG[i][1])+sxOffset
1892                                                SY=str2num(listWaveG[i][2])+syOffset
1893                                                Notebook $nbl text="      saxsExp        "+num2str(SX)+"      "+num2str(SY)+"      "+num2str(thickness)+"      \""+listWaveG[i][0]+TitleModifier+"\"  \r"
1894                                        endif
1895                                endif   
1896                   endfor
1897                   //WAXS is next.
1898                        Notebook $nbl text="\r"
1899                        Notebook $nbl text="            #WAXS measurements \r"
1900                   For(i=0;i<dimsize(listWaveG,0);i+=1)
1901                                if(WAXSAllG || LBSelectionWvG[i][6]==48)
1902                                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1903                                                haveAnySWAXS=1
1904                                                numSAXSWAXS+=1
1905                                                thickness = str2num(listWaveG[i][3])
1906                                                thickness = thickness>0 ? thickness : DefaultSampleThickness
1907                                                SX=str2num(listWaveG[i][1])+sxOffset
1908                                                SY=str2num(listWaveG[i][2])+syOffset
1909                                                Notebook $nbl text="      waxsExp        "+num2str(SX)+"      "+num2str(SY)+"      "+num2str(thickness)+"      \""+listWaveG[i][0]+TitleModifier+"\"  \r"
1910                                        endif
1911                                endif   
1912                   endfor
1913                   //and USAXS .
1914                   //do we have any USAXS scans?
1915                   Duplicate/Free/R=[][4] LBSelectionWvG, TempUSAXSChoice
1916                   WaveStats/Q TempUSAXSChoice
1917                   HaveUSAXS = (V_max>40) ? 1 : 0
1918                   if(haveAnySWAXS && USAXSAllG && HaveUSAXS)
1919                                Notebook $nbl text="\r"
1920                                Notebook $nbl text="            preUSAXStune \r"   
1921                                if(numSAXSWAXS>15)
1922                                        Notebook $nbl text="            preUSAXStune \r"   
1923                                endif
1924                                if(numSAXSWAXS>30)
1925                                        Notebook $nbl text="            preUSAXStune \r"       
1926                                endif
1927                   endif
1928                        Notebook $nbl text="\r"
1929                        Notebook $nbl text="            #USAXS measurements \r"
1930                   For(i=0;i<dimsize(listWaveG,0);i+=1)
1931                                if(USAXSAllG || LBSelectionWvG[i][4]==48)
1932                                        if(strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
1933                                                thickness = str2num(listWaveG[i][3])
1934                                                thickness = thickness>0 ? thickness : DefaultSampleThickness
1935                                                SX=str2num(listWaveG[i][1])+sxOffset
1936                                                SY=str2num(listWaveG[i][2])+syOffset
1937                                                Notebook $nbl text="      USAXSscan        "+num2str(SX)+"      "+num2str(SY)+"      "+num2str(thickness)+"      \""+listWaveG[i][0]+TitleModifier+"\"  \r"
1938                                        endif
1939                                endif   
1940                   endfor
1941                        Notebook $nbl text="\r"
1942                        Notebook $nbl text="            #END USAXS measurements \r"
1943                        break
1944
1945        endswitch
1946
1947end
1948
1949//*****************************************************************************************************************
1950//*****************************************************************************************************************
1951
1952static Function/T IN3S_ExportMacroFile(UseUsername, AppendToExisting)   
1953        variable UseUsername            //set to 0 for usaxs.mac, 1 for user choice.
1954        variable AppendToExisting       //set to 1 if one should append to existing file on desktop.
1955       
1956        IN3S_CheckForSensibility()
1957        string NewFileName
1958        SVAR UserDefinedCmdName=root:Packages:SamplePlateSetup:DefaultCommandFileName
1959        string UseCmdName
1960        if(strlen(UserDefinedCmdName)>4)
1961                UseCmdName = UserDefinedCmdName
1962        else
1963                UseCmdName = "usaxs.mac"
1964        endif
1965        NewPath /C/Q/O UserDesktop , SpecialDirPath("Desktop", 0, 0, 0 )
1966        if(UseUsername)
1967                IN3S_WriteCommandFile(0,1)              //this creates notebook with commands,
1968                SVAR nbl=root:Packages:SamplePlateSetup:NotebookName
1969                SaveNotebook /P=UserDesktop/ENCG=1/S=6/I/M="Select location and name for your command file" $(nbl)  as UseCmdName
1970                if(strlen(S_path)<1)
1971                        Abort
1972                endif
1973                NewFileName = S_path
1974                string NewFullNamePath =  ReplaceString(".txt", NewFileName, "" )
1975                //if needed and user did not use .mac, append it.
1976                if(!StringMatch(NewFullNamePath, "*.mac"))
1977                        NewFullNamePath = NewFullNamePath+".mac"
1978                endif
1979                MoveFile/O  NewFileName  as NewFullNamePath             
1980                NewFileName = NewFullNamePath
1981        else                    //using default name set in panel... Typically usaxs.mac.
1982                if(AppendToExisting)    //need to reimport the existing notebook, cannot append using SaveNotebook
1983                        IN3S_WriteCommandFile(0,0)              //this creates notebook with commands, no header of comments.
1984                        SVAR nbl=root:Packages:SamplePlateSetup:NotebookName
1985                        OpenNotebook /P=UserDesktop/N=TempOldCmdFile/Z UseCmdName
1986                        if(V_Flag!=0)
1987                                NewNotebook as "TempOldCmdFile"
1988                        endif
1989                        //read all from imported TempOldCmdFile and stuff it at the beggining of the nbl
1990                        notebook  TempOldCmdFile, selection={startOfFile, endOfFile }
1991                        GetSelection notebook, TempOldCmdFile, 3
1992                        KillWindow/Z TempOldCmdFile
1993                        //print S_selection
1994                        //got to top of the notebook
1995                        notebook  $(nbl), selection={startOfFile, startOfFile }
1996                        //insert old content from existing file.
1997                        notebook  $(nbl), text=S_selection
1998                        notebook  $(nbl), text="\r"
1999                        notebook  $(nbl), text="###  Appended commands \r"
2000                        notebook  $(nbl), text="\r"
2001                else
2002                        IN3S_WriteCommandFile(0,1)              //this creates notebook with commands, 
2003                        SVAR nbl=root:Packages:SamplePlateSetup:NotebookName
2004                endif
2005                SaveNotebook /P=UserDesktop/ENCG=1/S=6/O $(nbl)  as UseCmdName
2006        endif
2007        SVAR nbl=root:Packages:SamplePlateSetup:NotebookName
2008        KillWindow/Z $(nbl)
2009        if(strlen(S_path)>0)
2010                NewFileName = S_path
2011                print "Your command file was saved as "+NewFileName
2012                return NewFileName
2013        else
2014                print "Save of command file was cancelled "
2015                return ""
2016        endif
2017end
2018
2019
2020//************************************************************************************************************
2021//************************************************************************************************************
2022
2023static Function IN3S_Initialize()
2024
2025        DFrEF OldDf=GetDataFolderDFR()
2026        setdatafolder root:
2027        NewDataFolder/O/S root:Packages
2028        NewDataFolder/O USAXS
2029        NewDataFolder/O/S SamplePlateSetup
2030        //NewDataFolder/O root:AvailableSamplePlates
2031
2032        string ListOfVariables
2033        string ListOfStrings
2034        variable i, j
2035       
2036        ListOfVariables="NumberOfSamplesToCreate;DisplayAllSamplesInImage;"
2037        ListOfVariables+="DefaultSampleThickness;USAXSAll;SAXSAll;WAXSAll;DisplayUSWAXScntrls;"
2038        ListOfVariables+="SampleXTAR;SampleYTAR;SelectedRow;SampleThickness;SampleXRBV;SampleYRBV;"
2039        ListOfVariables+="SampleXTable;SampleYTable;SurveySXStep;SurveySYStep;MoveWhenRowChanges;"
2040        ListOfVariables+="RunExportHookFunction;"
2041        ListOfVariables+="USAXSScanTime;SAXSScanTime;WAXSScanTime;CalculatedOverAllTime;NumberOfSamples;"
2042        ListOfVariables+="TableIsSaved;ExportCurrentPosSet;ExportListOfPosSets;"
2043
2044        ListOfStrings="SelectedPlateName;UserNameForSampleSet;UserName;WarningForUser;"
2045        ListOfStrings+="SelectedSampleName;DefaultCommandFileName;TableClipboard;"
2046        ListOfStrings+="ExportOrder;"
2047        //and here we create them
2048        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
2049                IN2G_CreateItem("variable",StringFromList(i,ListOfVariables))
2050        endfor         
2051        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
2052                IN2G_CreateItem("string",StringFromList(i,ListOfStrings))
2053        endfor 
2054        //waves for multi table export...
2055        Wave/Z/T ListOfSavedSetsWv
2056        if(!WaveExists(ListOfSavedSetsWv))
2057                make/O/N=0/T ListOfSavedSetsWv, ListOfWavesForExport
2058                make/O/N=0 SelListOfSavedSetsWv, SelListOfWavesForExport
2059        endif
2060       
2061        NVAR USAXSAll
2062        NVAR SAXSAll
2063        NVAR WAXSAll
2064        USAXSAll =1
2065        SAXSAll = 1
2066        WAXSAll = 1
2067        NVAR NumberOfSamplesToCreate
2068        if(NumberOfSamplesToCreate<1)
2069                NumberOfSamplesToCreate = 20
2070        endif
2071        SVAR SelectedPlateName
2072        if(strlen(SelectedPlateName)<2)
2073                SelectedPlateName = "9x9 Acrylic/magnetic plate"
2074        endif
2075        NVAR DefaultSampleThickness
2076        if(DefaultSampleThickness<0.01||DefaultSampleThickness>20)
2077                DefaultSampleThickness=1
2078        endif
2079        SVAR WarningForUser
2080        WarningForUser="Tool started... Report bugs and wishes to author!"
2081        SVAR DefaultCommandFileName
2082        if(strlen(DefaultCommandFileName)<4)
2083                DefaultCommandFileName="usaxs.mac"
2084        endif
2085        SVAR ExportOrder
2086        if(strlen(ExportOrder)<2)
2087                ExportOrder="USAXS-SAXS-WAXS"
2088        endif
2089       
2090        NVAR ExportCurrentPosSet
2091        NVAR ExportListOfPosSets
2092        if(ExportCurrentPosSet+ExportListOfPosSets!=1)
2093                ExportCurrentPosSet=1
2094                ExportListOfPosSets=0
2095        endif
2096        NVAR SurveySXStep
2097        if(SurveySXStep<0.01)
2098                SurveySXStep = 1
2099        endif
2100        NVAR SurveySYStep
2101        if(SurveySYStep<0.01)
2102                SurveySYStep = 1
2103        endif
2104        NVAR USAXSScanTime
2105        NVAR SAXSScanTime
2106        NVAR WAXSScanTime
2107        if(USAXSScanTime<30)
2108                USAXSScanTime = 90
2109        endif
2110        if(SAXSScanTime<3)
2111                SAXSScanTime = 20
2112        endif
2113        if(WAXSScanTime<3)
2114                WAXSScanTime = 20
2115        endif
2116        //kill potentially old stuff here
2117        killwaves/Z imageWave, M_RGB2Gray, PlateImageTemp
2118
2119        SetDataFolder OldDf
2120end
2121
2122//*****************************************************************************************************************
2123//*****************************************************************************************************************
2124static Function IN3S_EstimateRunTime()
2125       
2126        NVAR USAXSScanTime = root:Packages:SamplePlateSetup:USAXSScanTime
2127        NVAR SAXSScanTime = root:Packages:SamplePlateSetup:SAXSScanTime
2128        NVAR WAXSScanTime = root:Packages:SamplePlateSetup:WAXSScanTime
2129        NVAR CalculatedOverAllTime = root:Packages:SamplePlateSetup:CalculatedOverAllTime
2130        NVAR USAXSAllG = root:Packages:SamplePlateSetup:USAXSAll
2131        NVAR SAXSAllG = root:Packages:SamplePlateSetup:SAXSAll
2132        NVAR WAXSAllG = root:Packages:SamplePlateSetup:WAXSAll
2133
2134        Wave/T listWaveG   =  root:Packages:SamplePlateSetup:LBCommandWv
2135        Wave LBSelectionWvG= root:Packages:SamplePlateSetup:LBSelectionWv
2136       
2137        NVAR/Z NumberOfSamples   =  root:Packages:SamplePlateSetup:NumberOfSamples
2138        if(!NVAR_Exists(NumberOfSamples))
2139                variable/g  root:Packages:SamplePlateSetup:NumberOfSamples
2140                NVAR NumberOfSamples   =  root:Packages:SamplePlateSetup:NumberOfSamples
2141        endif
2142       
2143        //SAXS LBSelectionWvG[i][5]==48
2144        //WAXS LBSelectionWvG[i][6]==48
2145        //USAXS LBSelectionWvG[i][4]==48
2146        //constant IN3BmSrvUSAXSOverhead = 25                   //overhead for flyscan
2147        //constant IN3BmSrvSAXSOverhead = 10                    //overhead for SAXS, transmission measurement
2148        //constant IN3BmSrvWAXSOverhead = 3                             //overhead for WAXS
2149        //constant IN3BmSrvSampleMoveSpeed = 8                  //average moving samples around in mm/sec
2150        //constant IN3BmSrvTuneTimeStep = 600                   //retune every 600 seconds
2151        //constant IN3BmSrvTuneTimeNumU = 3                             //retune every 3 USAXS scans
2152        //constant IN3BmSrvTuneAveTime  = 40                    //retune takes avergate 40 seconds full preUSAXStune is 40 seconds...
2153        //constant IN3BmSrvSWTuneAveTime = 14                   //SWAXS tune MR
2154        //constant IN3BmSrvMoveGeometryTime = 20                //overhead to mvoe from USAXS to SAXS to WAXS
2155        variable NumUSAXS, NumSAXS, NumWAXS, numSamples
2156        variable i, isused
2157        variable lastSXSAXS, lastSYSAXS, totalSXSYSAXS, firstSXSAXS, firstSYSAXS
2158        variable lastSXUSAXS, lastSYUSAXS, totalSXSYUSAXS, firstSXUSAXS, firstSYUSAXS
2159        variable lastSXWAXS, lastSYWAXS, totalSXSYWAXS, firstSXWAXS, firstSYWAXS
2160    variable SWAXSTime=0
2161        NumUSAXS=0
2162        NumSAXS=0
2163        NumWAXS=0
2164        lastSXSAXS = str2num(listWaveG[0][1])
2165        lastSYSAXS = str2num(listWaveG[0][2])
2166        firstSXSAXS = str2num(listWaveG[0][1])
2167        firstSYSAXS = str2num(listWaveG[0][2])
2168        lastSXUSAXS = str2num(listWaveG[0][1])
2169        lastSYUSAXS = str2num(listWaveG[0][2])
2170        firstSXUSAXS = str2num(listWaveG[0][1])
2171        firstSYUSAXS = str2num(listWaveG[0][2])
2172        lastSXWAXS = str2num(listWaveG[0][1])
2173        lastSYWAXS = str2num(listWaveG[0][2])
2174        firstSXWAXS = str2num(listWaveG[0][1])
2175        firstSYWAXS = str2num(listWaveG[0][2])
2176   For(i=0;i<dimsize(listWaveG,0);i+=1)
2177                isused = (strlen(listWaveG[i][0])>0 && strlen(listWaveG[i][1])>0 && strlen(listWaveG[i][2])>0)
2178                if((SAXSAllG || LBSelectionWvG[i][5]==48)&& isused )
2179                        NumSAXS+=1
2180                        totalSXSYSAXS += sqrt((str2num(listWaveG[i][1])-lastSXSAXS)^2 + (str2num(listWaveG[i][2])-lastSYSAXS)^2 )
2181                        lastSXSAXS = str2num(listWaveG[i][1])
2182                        lastSYSAXS = str2num(listWaveG[i][2])   
2183                endif   
2184                if((WAXSAllG || LBSelectionWvG[i][6]==48)&& isused )
2185                        NumWAXS+=1
2186                        totalSXSYWAXS += sqrt((str2num(listWaveG[i][1])-lastSXWAXS)^2 + (str2num(listWaveG[i][2])-lastSYWAXS)^2 )
2187                        lastSXWAXS = str2num(listWaveG[i][1])
2188                        lastSYWAXS = str2num(listWaveG[i][2])   
2189                endif   
2190        if((USAXSAllG || LBSelectionWvG[i][4]==48)&& isused )
2191                        NumUSAXS+=1
2192                        totalSXSYUSAXS += sqrt((str2num(listWaveG[i][1])-lastSXUSAXS)^2 + (str2num(listWaveG[i][2])-lastSYUSAXS)^2 )
2193                        lastSXUSAXS = str2num(listWaveG[i][1])
2194                        lastSYUSAXS = str2num(listWaveG[i][2]) 
2195                endif   
2196   endfor
2197   numSamples = max(NumUSAXS, NumSAXS, NumWAXS)
2198   NumberOfSamples = numSamples
2199
2200        CalculatedOverAllTime  =  NumUSAXS*(USAXSScanTime+IN3BmSrvUSAXSOverhead)+totalSXSYUSAXS/IN3BmSrvSampleMoveSpeed+NumUSAXS        //this is USAXS
2201                                                                //   USAXS scans                        +                               Total distance/ speed + assume 1 second speed ramp up and down
2202        if(NumUSAXS>0)
2203                //move to USAXS geometry....
2204                CalculatedOverAllTime +=  IN3BmSrvMoveGeometryTime                                                                                                                                              //USAXS->SAXS
2205                //travel from end to start...
2206                CalculatedOverAllTime += sqrt((lastSXUSAXS-firstSXSAXS)^2+(lastSYUSAXS-firstSXSAXS)^2)/IN3BmSrvSampleMoveSpeed                  //last sample to first sample
2207        endif
2208
2209        CalculatedOverAllTime +=  NumSAXS*(SAXSScanTime+IN3BmSrvSAXSOverhead)+totalSXSYSAXS/IN3BmSrvSampleMoveSpeed+NumSAXS             //SAXS
2210                                                                //      SAXS scans                               +                              Total distance/ speed + assume 1 second speed ramp up and down
2211        SWAXSTime = NumSAXS*(SAXSScanTime+IN3BmSrvSAXSOverhead)+totalSXSYSAXS/IN3BmSrvSampleMoveSpeed+NumSAXS
2212        if(NumSAXS>0)
2213                //move to SAXS geometry....
2214                CalculatedOverAllTime +=  IN3BmSrvMoveGeometryTime                                                                                                                                              //SAXS->WAXS
2215                //travel from end to start
2216                CalculatedOverAllTime += sqrt((lastSXSAXS-firstSXWAXS)^2+(lastSYSAXS-firstSXWAXS)^2)/IN3BmSrvSampleMoveSpeed                    //last sample to first sample
2217        endif
2218        CalculatedOverAllTime +=  NumWAXS*(WAXSScanTime+IN3BmSrvWAXSOverhead)+totalSXSYWAXS/IN3BmSrvSampleMoveSpeed+NumWAXS             //WAXS
2219                                                                //  WAXS scans                          +                               Total distance/ speed + assume 1 second speed ramp up and down
2220        SWAXSTime += NumWAXS*(WAXSScanTime+IN3BmSrvWAXSOverhead)+totalSXSYWAXS/IN3BmSrvSampleMoveSpeed+NumWAXS
2221        if(NumWAXS>0)
2222                //move to WAXS geometry....
2223                CalculatedOverAllTime +=  IN3BmSrvMoveGeometryTime                                                                                                                                              //WAXS->USAXS
2224                //travel from end to start
2225                CalculatedOverAllTime += sqrt((lastSXWAXS-firstSXUSAXS)^2+(lastSYWAXS-firstSXUSAXS)^2)/IN3BmSrvSampleMoveSpeed                  //last sample to first sample
2226        endif
2227        variable NumSWTunes = floor(SWAXSTime / IN3BmSrvTuneTimeStep)                   //this is approximate number of SAXS/WAXS tunes * tune time
2228        variable NumUSAXStunes = floor(NumUSAXS/IN3BmSrvTuneTimeNumU)                   //this is typical number of USAXS related tunes (3 flyscans/tune)
2229        CalculatedOverAllTime +=  NumSWTunes*IN3BmSrvSWTuneAveTime + NumUSAXStunes*IN3BmSrvTuneAveTime
2230                                                                                                                                                        //done, calculated average scan time for all which are well defined.
2231        CalculatedOverAllTime/=60               //convert to minutes
2232        CalculatedOverAllTime = round(CalculatedOverAllTime)
2233end
2234
2235//************************************************************************************************************
2236//************************************************************************************************************
2237
2238Function IN3S_CreateDefaultPlates()
2239
2240        DFrEF OldDf=GetDataFolderDFR()
2241        setdatafolder root:
2242        NewDataFolder/O/S root:Packages
2243        NewDataFolder/O/S SamplePlatesAvailable
2244        //Definitions for:
2245        //Acrylic9x9Plate = 9x9 Acrylic/magnetic plate
2246        //OldStyleAlPlate = Old Style Al Plate
2247        //NMRTubesHolder = NMR Tubes holder 300mm x 75mm, sample center sy=25mm
2248        make/O/N=(81,2) Acrylic9x9PlateCenters
2249        make/O/N=(100,2) AcrylicNMRPlateCenters
2250        make/O/N=(60,2) OldStyleAlPlateCenters
2251        make/O/N=(20,2) NMRTubesHolderCenters
2252        make/O/N=(0,2) GenericGridHolderCenters
2253
2254        string ListOfVariables
2255        string ListOfStrings
2256        variable i, j
2257       
2258        ListOfVariables="OldStyleAlPlateRadius;OldStyleAlPlateScale;"
2259        ListOfVariables+="Acrylic9x9PlateRadius;Acrylic9x9PlateScale;AcrylicNMRPlateScale;"
2260        ListOfVariables+="NMRTubesHolderRadius;NMRTubesHolderScale;"
2261
2262        ListOfStrings=""
2263        //and here we create them
2264        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
2265                IN2G_CreateItem("variable",StringFromList(i,ListOfVariables))
2266        endfor         
2267        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
2268                IN2G_CreateItem("string",StringFromList(i,ListOfStrings))
2269        endfor 
2270
2271        //setup parameters
2272        NVAR Acrylic9x9PlateRadius
2273        NVAR Acrylic9x9PlateScale
2274        Acrylic9x9PlateRadius = 4               //radius of sample hole in mm
2275        Acrylic9x9PlateScale = 0.25             //pixels per mm
2276        NVAR AcrylicNMRPlateScale
2277        AcrylicNMRPlateScale = 0.25             //pixels per mm
2278        Wave Acrylic9x9PlateCenters
2279        Acrylic9x9PlateCenters[][0] = 20*ceil(0.01+p/9) 
2280        Acrylic9x9PlateCenters[][1] = 20+20*(p - 9*trunc(p/9))
2281        //NMT Acrylic plate
2282        Wave AcrylicNMRPlateCenters
2283        AcrylicNMRPlateCenters[][0] = 10+10*(p - 20*trunc(p/20))                                ///10*ceil(0.01+p/19)           
2284        AcrylicNMRPlateCenters[][1] = 24.181 + 40*(ceil(0.01+p/20)-1)                   ///24.181+40*(p - 20*trunc(p/20))               
2285       
2286        //Al plate here
2287        NVAR OldStyleAlPlateRadius
2288        OldStyleAlPlateRadius=4
2289        NVAR OldStyleAlPlateScale
2290        OldStyleAlPlateScale = 0.25
2291        Wave OldStyleAlPlateCenters
2292        For(i=0;i<4;i+=1)
2293                For(j=0;j<8;j+=1)
2294                        OldStyleAlPlateCenters[i*15+j][0] = 12.5+i*25
2295                endfor
2296                For(j=8;j<15;j+=1)
2297                        OldStyleAlPlateCenters[i*15+j][0] = 25+i*25
2298                endfor
2299        endfor 
2300        For(i=0;i<4;i+=1)
2301                For(j=0;j<8;j+=1)
2302                        OldStyleAlPlateCenters[i*15+j][1] = 12.5+j*25
2303                endfor
2304                For(j=8;j<15;j+=1)
2305                        OldStyleAlPlateCenters[i*15+j][1] = 25+(j-8)*25
2306                endfor
2307        endfor 
2308        //NMR tubes holder here
2309        NVAR NMRTubesHolderRadius
2310        NVAR NMRTubesHolderScale
2311        NMRTubesHolderRadius=20
2312        NMRTubesHolderScale=0.25
2313        Wave NMRTubesHolderCenters
2314        NMRTubesHolderCenters[][0] = 15+p*10
2315        NMRTubesHolderCenters[][1] = 43
2316        SetDataFolder OldDf
2317end
2318
2319//*****************************************************************************************************************
2320//*****************************************************************************************************************
2321static Function IN3S_CreateTablesForPlates(HowManySamples, forceReset)
2322        variable HowManySamples, forceReset     //set forceReset=1 to rezero all waves.
2323       
2324        DFrEF OldDf=GetDataFolderDFR()
2325        setdatafolder root:Packages:SamplePlateSetup
2326        Wave/T/Z LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
2327        Wave/Z LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
2328        Make/N=8/T/O LBTtitleWv
2329        if(forceReset || !WaveExists(LBSelectionWv) || !WaveExists(LBCommandWv))
2330                Make/N=(0,8)/T/O LBCommandWv
2331                Make/N=(0,8)/O LBSelectionWv
2332        endif
2333        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
2334        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
2335        Wave/T LBTtitleWv = root:Packages:SamplePlateSetup:LBTtitleWv
2336        if(DimSize(LBSelectionWv,0)<1 && HowManySamples<1)
2337                HowManySamples = 20
2338        endif
2339        if(HowManySamples>0)
2340                Redimension/N=(HowManySamples,8) LBCommandWv, LBSelectionWv
2341        endif
2342        LBTtitleWv = {"Sample Name", "X [mm]", "Y [mm]", "Thick [mm]", "USAXS", "SAXS", "WAXS", "MetaData"}
2343        //setup the LBSelectionWv to allow what is needed...
2344        LBSelectionWv[][0] = 2 //set Bit 1, 0x02
2345        LBSelectionWv[][1] = 2 //set Bit 1,
2346        LBSelectionWv[][2] = 2 //set Bit 1,
2347        LBSelectionWv[][3] = 2 //set Bit 1,
2348        LBSelectionWv[][7] = 2 //set Bit 1,
2349        IN3S_SetAllOptions()
2350        SetDataFolder OldDf
2351end
2352//*****************************************************************************************************************
2353//*****************************************************************************************************************
2354//*****************************************************************************************************************
2355static Function IN3S_SetAllOptions()
2356
2357        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
2358        NVAR USAXSAll = root:Packages:SamplePlateSetup:USAXSAll
2359                if(USAXSAll)
2360                        LBSelectionWv[][4]=48
2361                else
2362                        LBSelectionWv[][4]=32
2363                endif
2364        NVAR SAXSAll = root:Packages:SamplePlateSetup:SAXSAll
2365                if(SAXSAll)
2366                        LBSelectionWv[][5]=48
2367                else
2368                        LBSelectionWv[][5]=32
2369                endif
2370        NVAR WAXSAll = root:Packages:SamplePlateSetup:WAXSAll
2371                if(WAXSAll)
2372                        LBSelectionWv[][6]=48
2373                else
2374                        LBSelectionWv[][6]=32
2375                endif
2376end
2377//*****************************************************************************************************************
2378//*****************************************************************************************************************
2379//*****************************************************************************************************************
2380//
2381static Function IN3S_InsertDeleteLines(InsertDelete, row, newLines)     //InsertDelete = 1 for insert, 2 for delete
2382        variable InsertDelete, row, newLines                                            //3 duplicate and add there, 4 add at the end.
2383        //newLines used only with InsertDelete=4 and is number of new lines.
2384       
2385        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
2386        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
2387        variable i
2388        if(InsertDelete==1)                             //insert.
2389                InsertPoints row, 1, LBSelectionWv, LBCommandWv
2390                LBSelectionWv[row][0]=2
2391                LBSelectionWv[row][1]=2
2392                LBSelectionWv[row][2]=2
2393                LBSelectionWv[row][3]=2
2394                NVAR USAXSAll = root:Packages:SamplePlateSetup:USAXSAll
2395                if(USAXSAll)
2396                        LBSelectionWv[row][4]=48
2397                else
2398                        LBSelectionWv[row][4]=32
2399                endif
2400                NVAR SAXSAll = root:Packages:SamplePlateSetup:SAXSAll
2401                if(SAXSAll)
2402                        LBSelectionWv[row][5]=48
2403                else
2404                        LBSelectionWv[row][5]=32
2405                endif
2406                NVAR WAXSAll = root:Packages:SamplePlateSetup:WAXSAll
2407                if(WAXSAll)
2408                        LBSelectionWv[row][6]=48
2409                else
2410                        LBSelectionWv[row][6]=32
2411                endif
2412                //ListBox CommandsList win=SamplePlateSetup, selRow=row                                 
2413                LBSelectionWv[][0]=2
2414                LBSelectionWv[row][0]=3
2415                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
2416                WarningForUser = "Inserted row number "+ num2str(row)
2417        elseif(InsertDelete==2)                                 //delete, easier...
2418                if(dimsize(LBSelectionWv,0)>1)
2419                        DeletePoints /M=0 row, 1, LBSelectionWv, LBCommandWv
2420                        variable newrow
2421                        newrow = row<(dimSize(LBCommandWv,0))?row : row-1
2422                        //ListBox CommandsList win=SamplePlateSetup, selRow=newrow                                     
2423                        LBSelectionWv[][0]=2
2424                        LBSelectionWv[newrow][0]=3
2425                        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
2426                        WarningForUser = "Deleted row number "+ num2str(row)
2427                else
2428                        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
2429                        WarningForUser = "Cannot delete last row ! "
2430                endif
2431        elseif(InsertDelete==3)                                 //duplicate
2432                Duplicate/Free/T/R=[row][] LBCommandWv, tempLBCommandWv
2433                Duplicate/Free/R=[row][] LBSelectionWv, tempLBSelectionWv
2434                InsertPoints row, 1, LBSelectionWv, LBCommandWv
2435                LBCommandWv[row][]              = tempLBCommandWv[0][q]
2436                LBSelectionWv[row][]    = tempLBSelectionWv[0][q]
2437                //ListBox CommandsList win=SamplePlateSetup, selRow=row+1                                       
2438                LBSelectionWv[][0]=2
2439                LBSelectionWv[row+1][0]=3
2440                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
2441                WarningForUser = "Duplicated row number "+ num2str(row)
2442        elseif(InsertDelete==4)                                 //add line at the end
2443                variable Curlength=dimsize(LBCommandWv,0)
2444                Redimension/N=(Curlength+newLines,-1) LBCommandWv, LBSelectionWv
2445                LBSelectionWv[Curlength, ][0]=2
2446                LBSelectionWv[Curlength, ][1]=2
2447                LBSelectionWv[Curlength, ][2]=2
2448                LBSelectionWv[Curlength, ][3]=2
2449                NVAR USAXSAll = root:Packages:SamplePlateSetup:USAXSAll
2450                if(USAXSAll)
2451                        LBSelectionWv[Curlength, ][4]=48
2452                else
2453                        LBSelectionWv[Curlength, ][4]=32
2454                endif
2455                NVAR SAXSAll = root:Packages:SamplePlateSetup:SAXSAll
2456                if(SAXSAll)
2457                        LBSelectionWv[Curlength, ][5]=48
2458                else
2459                        LBSelectionWv[Curlength, ][5]=32
2460                endif
2461                NVAR WAXSAll = root:Packages:SamplePlateSetup:WAXSAll
2462                if(WAXSAll)
2463                        LBSelectionWv[Curlength, ][6]=48
2464                else
2465                        LBSelectionWv[Curlength, ][6]=32
2466                endif
2467                //ListBox CommandsList win=SamplePlateSetup, selRow=Curlength                                   
2468                LBSelectionWv[][0]=2
2469                LBSelectionWv[Curlength][0]=3
2470                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
2471                WarningForUser = "Added row at the end "
2472        endif
2473end
2474//*****************************************************************************************************************
2475//*****************************************************************************************************************
2476//*****************************************************************************************************************
2477//*****************************************************************************************************************
2478//this is from //https://www.wavemetrics.com/code-snippet/listbox-drag-drop, version 1.60, 1-13-2022
2479
2480
2481function IN3S_DragDropListBoxProc(STRUCT WMListboxAction &lba)
2482   
2483     
2484    if(!(lba.eventCode & 0x03)) // neither mouseup nor mousedown
2485        return 0
2486    endif
2487   
2488    variable f = 72/PanelResolution(lba.win) // point/pixel
2489    int dragStarted = strlen(GetUserData(lba.win, lba.ctrlName, "drag"))
2490    string otherListBox = SelectString(cmpstr(lba.ctrlName, "SourceBox")==0, "SourceBox", "TargetBox")
2491    string items
2492    variable j
2493       
2494    if (lba.eventCode==2 && dragStarted) // mouseup, drag completed
2495        // find whether mouse is within OTHER listbox
2496        if(IN3S_isInControl(lba.mouseLoc, lba.win, otherListBox))
2497            ControlInfo /W=$lba.win $otherListBox           
2498            int beforeItem = round(V_startRow + (lba.mouseLoc.v-V_top/f)/V_rowHeight)
2499            wave /SDFR=$S_DataFolder otherListBoxWave=$S_Value
2500            beforeItem = limit(beforeItem, 0, numpnts(otherListBoxWave))
2501            IN3S_copySelection(otherListBox, lba.selwave, lba.listwave, beforeItem)
2502        endif
2503        ListBox $lba.ctrlName, win=$lba.win, userdata(drag)=""
2504    endif
2505    //add right click to remove right column data
2506    if(lba.eventCode==1 && lba.eventMod & 0x10)
2507        if(stringmatch(nameofWave(lba.listWave),"ListOfWavesForExport"))
2508                items = "DeleteRow;"
2509                PopupContextualMenu items
2510                        switch (V_flag)
2511                                case 1: // "Delete row"
2512                                        DeletePoints /M=0 lba.row, 1, lba.listWave, lba.selWave
2513                                        break;
2514                                endswitch
2515        endif
2516    endif
2517
2518    if(lba.eventCode==1 && dragStarted==0) // mousedown, new drag
2519        if( lba.row < 0 || lba.row >= (DimSize(lba.listWave, 0)) )
2520            return 0
2521        endif
2522        //this can be done only from right to left...
2523        if(cmpstr(lba.ctrlName, "SourceBox"))
2524                return 0
2525        endif
2526       
2527        int i, numBoxes, startrow, endrow, mode, fontSize
2528       
2529        // figure out visible rows
2530        ControlInfo /W=$lba.win $lba.ctrlName
2531        startrow = V_startRow
2532        endrow = min(numpnts(lba.selwave)-1, startrow + ceil((V_height/f/V_rowHeight)-2))
2533        // record current value of mode & fsize
2534        string strMode, strFsize
2535        SplitString/E=("mode=\s?([[:digit:]]+)") S_recreation, strMode
2536        mode = strlen(strMode) ? str2num(strMode) : 1
2537        SplitString/E=("fSize=\s?([[:digit:]]+)") S_recreation, strFsize
2538        fontSize = strlen(strFsize) ? str2num(strFsize) : 9
2539        // stops cell selection as mouse moves by setting mode=0
2540        ListBox $lba.ctrlName, win=$lba.win, userdata(drag)="started", mode=0
2541        // userdata(drag) indicates dragging is active, cleared on mouseup
2542       
2543        // create a titlebox for every visible selected item
2544        numBoxes=0
2545        string DBname, strTitle
2546        variable height, width, top , left
2547        for (i=startrow;i<endrow+1;i++)
2548            if (lba.selwave[i] & 0x09)
2549                wave /T listwave=lba.listWave
2550                DBname = "DragBox" + num2str(numBoxes)
2551                height = f*(V_rowHeight-1)
2552                width = f*(lba.ctrlRect.right-lba.ctrlRect.left)
2553                top = f*(lba.ctrlRect.top+(i-startrow)*V_rowHeight+1.5)
2554                left = f*lba.ctrlRect.left
2555                sprintf strTitle, "\\sa%+03d\\x%+03d %s", 3-(fontSize>12), (20-fontSize)*0.625, listwave[i]
2556                TitleBox $DBname, win=$lba.win, title=strTitle, labelBack=(41760,52715,65482), pos={left, top}
2557                TitleBox $DBname, win=$lba.win, fsize=fontSize, fixedSize=1, frame=0, size={width, height}
2558                numBoxes ++
2559            endif
2560        endfor
2561       
2562        // save coordinates of other listbox
2563        ControlInfo /W=$lba.win $otherListBox
2564        struct rect pixelRect
2565        pixelRect.left = v_left/f // point -> pixel
2566        pixelRect.right = v_right/f
2567        pixelRect.top = v_top/f
2568        pixelRect.bottom = pixelRect.top + v_height/f
2569
2570        // monitor mouse movement until mouseup
2571        variable dx, dy, buttondown
2572       
2573        do
2574            GetMouse /W=$lba.win
2575            buttondown = V_flag & 1
2576            dx = v_left - lba.mouseLoc.h // pixels
2577            dy = v_top - lba.mouseLoc.v // pixels
2578            // keep current mouse position updated as mouse moves
2579            lba.mouseLoc.h = v_left
2580            lba.mouseLoc.v = v_top
2581           
2582            // move titleboxes with mouse                   
2583            for(i=0; i<numBoxes; i++)
2584                TitleBox /Z $"DragBox"+num2str(i), win=$lba.win, pos+={dx,dy}
2585            endfor
2586           
2587            // draw focus ring when mouse is over other listbox
2588            if (IN3S_pointInRect(lba.mouseLoc, pixelRect)) // all units are pixels
2589                ListBox $otherListBox, win=$lba.win, focusRing=1
2590                ModifyControl $otherListBox activate
2591            else
2592                ModifyControl $lba.ctrlName activate
2593            endif
2594           
2595            DoUpdate /W=$lba.win
2596        while(buttondown)
2597
2598        // clear titleboxes and return listboxes to normal mode
2599        for(i=0; i<numBoxes; i++)
2600            KillControl /W=$lba.win $"DragBox"+num2str(i)
2601        endfor
2602        ListBox $otherListBox, win=$lba.win, focusRing=0
2603        ListBox $lba.ctrlName, win=$lba.win, mode=mode
2604        ModifyControl $lba.ctrlName activate
2605    endif // end of drag
2606end
2607
2608//*****************************************************************************************************************
2609//*****************************************************************************************************************
2610
2611static function IN3S_copySelection(string toLB, wave selwave, wave /T listwave, variable beforeItem)
2612       
2613    Extract /free/T listwave, switchwave, (selwave & 0x09)
2614    //Extract /O/T listwave, listwave, !(selwave & 0x09)                //this fremoves teh line from teh source, we want to keep it...
2615    //Extract /O selwave, selwave, !(selwave & 0x09)
2616    wave destSelWave = root:Packages:SamplePlateSetup:SelListOfWavesForExport
2617    wave/T  destListWave = root:Packages:SamplePlateSetup:ListOfWavesForExport
2618    destSelWave = 0
2619    variable numItems = numpnts(switchwave)
2620    InsertPoints beforeItem, numItems, destSelWave, destListWave
2621    destSelWave[beforeItem, beforeItem+numItems-1] = 1
2622    destListWave[beforeItem, beforeItem+numItems-1] = switchwave[p-beforeItem]
2623end
2624//*****************************************************************************************************************
2625//*****************************************************************************************************************
2626
2627// point and rect structures must have same units
2628static function IN3S_pointInRect(STRUCT point &pnt, STRUCT rect &r)
2629    return ( pnt.h>r.left && pnt.h<r.right && pnt.v>r.top && pnt.v<r.bottom )
2630end
2631//*****************************************************************************************************************
2632//*****************************************************************************************************************
2633
2634static function IN3S_isInControl(STRUCT point &mouse, string strWin, string strCtrl)
2635    ControlInfo /W=$strWin $strCtrl
2636    variable f = 72/PanelResolution(strWin)
2637    variable hpoint = mouse.h * f
2638    variable vpoint = mouse.v * f   
2639    return ( hpoint>V_left && hpoint<(V_right) && vpoint>V_top && vpoint<(V_top+V_height) )
2640end
2641
2642//*****************************************************************************************************************
2643//*****************************************************************************************************************
2644//*****************************************************************************************************************
2645//*****************************************************************************************************************
2646static Function IN3S_DrawImageOfPlate(WhichOne)
2647        string WhichOne
2648       
2649        //WhichOne = "9x9 Acrylic/magnetic plate"
2650       
2651        DFrEF OldDf=GetDataFolderDFR()
2652        setdatafolder root:Packages:SamplePlatesAvailable
2653        KillWindow/Z SamplePlateImageDrawing
2654        variable HorSize, VertSize
2655        if(stringMatch(whichOne,"9x9 Acrylic/magnetic plate"))
2656                Wave Centers = root:Packages:SamplePlatesAvailable:Acrylic9x9PlateCenters
2657                NVAR Radius = root:Packages:SamplePlatesAvailable:Acrylic9x9PlateRadius
2658                NVAR Scaling = root:Packages:SamplePlatesAvailable:Acrylic9x9PlateScale
2659                //plate is 304.8mm wide x 200mm high, use 1200x800 wave, 0.25mm pixel scaling.
2660                HorSize = 300/Scaling
2661                VertSize = 200/Scaling
2662                Make/O/N=(HorSize,VertSize)/B/U PlateImage
2663                wave PlateImage
2664                //PlateImage = 128                              //set image to 128, that is medium grey in our color system.
2665                SetScale/P x 0,Scaling,"mm", PlateImage
2666                SetScale/P y 0,Scaling,"mm", PlateImage
2667                Duplicate/Free Centers, CentersForDrawing
2668                //create circles, set image to 128, that is medium grey in our color system in solid and 0 in opening for samples.
2669                IN3S_CreateCircles(PlateImage, CentersForDrawing, Radius, Scaling)
2670        elseif(stringMatch(whichOne,"NMR Acrylic plate"))
2671                Wave Centers = root:Packages:SamplePlatesAvailable:AcrylicNMRPlateCenters
2672                //NVAR Radius = root:Packages:SamplePlatesAvailable:Acrylic9x9PlateRadius
2673                NVAR Scaling = root:Packages:SamplePlatesAvailable:AcrylicNMRPlateScale
2674                //plate is 330.2mm wide x 200mm high, use 1200x800 wave, 0.25mm pixel scaling.
2675                HorSize = 330/Scaling
2676                VertSize = 200/Scaling
2677                Make/O/N=(HorSize,VertSize)/B/U PlateImage
2678                wave PlateImage
2679                //PlateImage = 128                              //set image to 128, that is medium grey in our color system.
2680                SetScale/P x 0,Scaling,"mm", PlateImage
2681                SetScale/P y 0,Scaling,"mm", PlateImage
2682                Duplicate/Free Centers, CentersForDrawing
2683                //create NMR tubes, set image to 128, that is medium grey in our color system in solid and 0 in opening for samples.
2684                IN3S_CreateNMRTubes(PlateImage, CentersForDrawing, Scaling)
2685        elseif(stringMatch(whichOne,"Old Style Al Plate"))
2686                Wave Centers = root:Packages:SamplePlatesAvailable:OldStyleAlPlateCenters
2687                NVAR Radius = root:Packages:SamplePlatesAvailable:OldStyleAlPlateRadius
2688                NVAR Scaling = root:Packages:SamplePlatesAvailable:OldStyleAlPlateScale
2689                //plate is 250mm wide x 200mm high, use 1000x800 wave, 0.25mm pixel scaling.
2690                HorSize = 250/Scaling
2691                VertSize = 200/Scaling
2692                Make/O/N=(HorSize,VertSize)/B/U PlateImage
2693                wave PlateImage
2694                //PlateImage = 128                              //set image to 128, that is medium grey in our color system.
2695                SetScale/P x 0,Scaling,"mm", PlateImage
2696                SetScale/P y 0,Scaling,"mm", PlateImage
2697                Duplicate/Free Centers, CentersForDrawing
2698                //create circles, set image to 128, that is medium grey in our color system in solid and 0 in opening for samples.
2699                IN3S_CreateCircles(PlateImage, CentersForDrawing, Radius, Scaling)
2700        elseif(stringMatch(whichOne,"NMR Tubes holder"))
2701                Wave Centers = root:Packages:SamplePlatesAvailable:NMRTubesHolderCenters
2702                NVAR Radius = root:Packages:SamplePlatesAvailable:NMRTubesHolderRadius
2703                NVAR Scaling = root:Packages:SamplePlatesAvailable:NMRTubesHolderScale
2704                //plate is 300mm wide x 75mm high, use 1200x300 wave with 0.25mm pixel scaling.
2705                HorSize = 300/Scaling
2706                VertSize = 75/Scaling
2707                Make/O/N=(HorSize,VertSize)/B/U PlateImage
2708                wave PlateImage
2709                //PlateImage = 128                              //set image to 128, that is medium grey in our color system.
2710                SetScale/P x 0,Scaling,"mm", PlateImage
2711                SetScale/P y 0,Scaling,"mm", PlateImage
2712                Duplicate/Free/R=[1,12] Centers, CentersForDrawing
2713                //create opening for samples, set image to 128, that is medium grey in our color system in solid and 0 in opening for samples.
2714                //IN3S_CreateCircles(PlateImage, CentersForDrawing, Radius, Scaling)
2715                PlateImage = 128
2716                PlateImage[10/Scaling, 210/Scaling][20/Scaling,66/Scaling] = 0
2717               
2718                //add tube lines...
2719                IN3S_AddOtherDrawings(PlateImage, Centers, Radius, Scaling, "VerticalNMR")
2720
2721        elseif(stringMatch(whichOne,"Image"))
2722                //here is code which loads image and deal with that. this will be different code and complciated.
2723
2724        else
2725                Abort "This sample plate name does not have drawign available."
2726        endif
2727        //create plate drawing.         
2728        DoWIndow SamplePlateImageDrawing
2729        if(V_Flag!=1)
2730                PauseUpdate
2731                NewImage/K=1/N=SamplePlateImageDrawing root:Packages:SamplePlatesAvailable:PlateImage
2732                DoWindow/T SamplePlateImageDrawing,"Image of "+WhichOne
2733                ModifyImage PlateImage ctab= {0,256,Grays,1}
2734                ModifyGraph margin(left)=28,margin(bottom)=28,margin(top)=28,margin(right)=28
2735                SetAxis/R left (VertSize*Scaling+0.125),-0.125
2736                SetAxis/R top (HorSize*Scaling+0.125),-0.125
2737                Label left "\\Zr133millimeters from top right corner"
2738                Label top "\\Zr133millimeters from top right corner"
2739                ModifyGraph grid=1
2740                ModifyGraph mirror=3
2741                ModifyGraph nticks(left)=22,nticks(top)=22
2742                ModifyGraph minor=1
2743                ModifyGraph standoff=0
2744                ModifyGraph tkLblRot(left)=90
2745                ModifyGraph btLen=3
2746                ModifyGraph tlOffset=-2
2747                DoUpdate
2748        endif
2749        SetWindow SamplePlateImageDrawing  hook(ImageHook)=IN3S_PlateImageHook
2750
2751        SetDataFolder OldDf
2752end
2753//*****************************************************************************************************************
2754//*****************************************************************************************************************
2755static Function IN3S_WritePositionInTable(mouseVert, mouseHor)
2756        variable mouseHor, mouseVert
2757       
2758        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
2759        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
2760        SVAR SelectedPlateName = root:Packages:SamplePlateSetup:SelectedPlateName
2761        //need to identify where we are and what size the image is
2762        string Margins =  IN2G_FindInRecreation(winrecreation("SamplePlateImageDrawing",0), "margin")
2763        variable margleft=NumberByKey("margin(left)", Margins,"=", ",")
2764        variable margright=NumberByKey("margin(right)", Margins,"=", ",")
2765        variable margtop=NumberByKey("margin(top)", Margins,"=", ",")
2766        variable margbot=NumberByKey("margin(bottom)", Margins,"=", ",")
2767        getwindow SamplePlateImageDrawing wsizeDC
2768        variable horsize=(V_right - V_left)
2769        variable versize=(V_bottom - V_top)
2770        GetAxis /W=SamplePlateImageDrawing /Q left
2771        variable VertMin=min(V_min, V_max)
2772        variable VertMax=max(V_min, V_max)
2773        GetAxis /W=SamplePlateImageDrawing /Q top
2774        variable HorMin=min(V_min, V_max)
2775        variable HorMax=max(V_min, V_max)
2776        variable xpos, ypos     
2777        horsize = horsize-margleft-margright
2778        versize = versize-margtop-margbot
2779        variable HorRange=HorMax - HorMin
2780        variable VertRange=VertMax - VertMin
2781        xpos = HorMin + HorRange*(horsize - (mouseHor-margleft))/(horsize)
2782       
2783        ypos = VertMin + VertRange *(mouseVert-margtop)/(versize)
2784       
2785        //FindLevel  /EDGE=1 /P/Q  LBSelectionWv, 0.5
2786        variable SelectedRow = IN3S_FindFirstSelectedRow()
2787        //ControlInfo /W=SamplePlateSetup CommandsList
2788        if(SelectedRow>=0&&SelectedRow<dimSize(LBCommandWv,0))
2789                LBCommandWv[SelectedRow][1]=num2str(xpos)
2790                LBCommandWv[SelectedRow][2]=num2str(ypos)
2791        else
2792                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
2793                WarningForUser = "Could not records values for this positon, no row selected"
2794                print "Could not records values for this positon, no row selected"
2795        endif
2796       
2797end
2798//*****************************************************************************************************************
2799static Function IN3S_FindFirstSelectedRow()
2800
2801        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
2802        string ListOfSelRows=IN3S_CreateListOfRows(LBSelectionWv)
2803        variable firstSelectedRow = str2num(StringFromList(ItemsInList(ListOfSelRows)-1, ListOfSelRows))
2804        firstSelectedRow = numtype(firstSelectedRow)==0 ? firstSelectedRow : 0
2805        return firstSelectedRow
2806end
2807
2808//*****************************************************************************************************************
2809//*****************************************************************************************************************
2810static Function IN3S_AddTagToImage(row) //add one tag if row is number, all if -1 or DisplayAllSamplesInImage=1
2811        variable row
2812       
2813        DoWindow SamplePlateImageDrawing
2814        if(V_Flag)
2815                Wave/T listWave=root:Packages:SamplePlateSetup:LBCommandWv
2816                if(row>DimSize(listWave,0)-1)
2817                        return 0        //we seem to have issues with row being selected while there are no rows...
2818                endif
2819                NVAR DisplayAllSamplesInImage = root:Packages:SamplePlateSetup:DisplayAllSamplesInImage
2820                //removeFromGraph /Z/W=SamplePlateImageDrawing Tagy
2821                if(row>=0 && !DisplayAllSamplesInImage)
2822                        MAKE/O/N=1 root:Packages:SamplePlateSetup:TagX
2823                        MAKE/O/N=1 root:Packages:SamplePlateSetup:Tagy
2824                        MAKE/O/N=1/T root:Packages:SamplePlateSetup:TagNames
2825                        Wave tagx=root:Packages:SamplePlateSetup:TagX
2826                        Wave tagy= root:Packages:SamplePlateSetup:Tagy
2827                        Wave/T TagNames= root:Packages:SamplePlateSetup:TagNames
2828                        if(strlen(listWave[row][1])>0 && strlen(listWave[row][2])>0)
2829                                tagx=str2num(listWave[row][1])
2830                                tagy=str2num(listWave[row][2])
2831                                Duplicate/O tagy, root:Packages:SamplePlateSetup:TagyLabel
2832                                Wave TagyLabel= root:Packages:SamplePlateSetup:TagyLabel
2833                                TagNames = "   "+listWave[row][0]
2834                                CheckDisplayed /W=SamplePlateImageDrawing Tagy
2835                                if(V_Flag==0)
2836                                        AppendToGraph /W=SamplePlateImageDrawing/T/L Tagy vs tagx
2837                                        ModifyGraph /W=SamplePlateImageDrawing mode(Tagy)=3,marker(Tagy)=19,msize(Tagy)=0,mrkThick(Tagy)=1
2838                                        ModifyGraph /W=SamplePlateImageDrawing useMrkStrokeRGB(Tagy)=1
2839                                endif
2840                                CheckDisplayed /W=SamplePlateImageDrawing TagyLabel
2841                                if(V_Flag==0)
2842                                        AppendToGraph /W=SamplePlateImageDrawing/T/L TagyLabel vs tagx
2843                                        ModifyGraph mode=3,textMarker(TagyLabel)={TagNames,"default",0,20,4,0.00,0.00}
2844                                endif
2845                        else
2846                                removeFromGraph /Z/W=SamplePlateImageDrawing Tagy
2847                                removeFromGraph /Z/W=SamplePlateImageDrawing TagyLabel
2848                        endif
2849                        //Tag/C/W=SamplePlateImageDrawing/N=SampleName/F=0/TL=0/I=1/B=0/G=(64640,0,2246) Tagy, 0, TagNames[0]
2850                elseif(row==-1 || DisplayAllSamplesInImage)
2851                        MAKE/O/N=(dimsize(listWave,0)) root:Packages:SamplePlateSetup:TagX
2852                        MAKE/O/N=(dimsize(listWave,0)) root:Packages:SamplePlateSetup:Tagy
2853                        MAKE/O/N=(dimsize(listWave,0))/T root:Packages:SamplePlateSetup:TagNames
2854                        Wave tagx=root:Packages:SamplePlateSetup:TagX
2855                        Wave tagy= root:Packages:SamplePlateSetup:Tagy
2856                        Wave/T TagNames= root:Packages:SamplePlateSetup:TagNames
2857                        tagx=str2num(listWave[p][1])
2858                        tagy=str2num(listWave[p][2])
2859                        Duplicate/O tagy, root:Packages:SamplePlateSetup:TagyLabel
2860                        Wave TagyLabel= root:Packages:SamplePlateSetup:TagyLabel
2861                        TagNames = "   "+listWave[p][0]
2862                        CheckDisplayed /W=SamplePlateImageDrawing Tagy
2863                        if(V_Flag==0)
2864                                AppendToGraph /W=SamplePlateImageDrawing/T/L Tagy vs tagx
2865                                ModifyGraph /W=SamplePlateImageDrawing mode(Tagy)=3,marker(Tagy)=19,msize(Tagy)=0,mrkThick(Tagy)=1
2866                                ModifyGraph /W=SamplePlateImageDrawing useMrkStrokeRGB(Tagy)=1
2867                        endif
2868                        CheckDisplayed /W=SamplePlateImageDrawing TagyLabel
2869                        if(V_Flag==0)
2870                                AppendToGraph /W=SamplePlateImageDrawing/T/L TagyLabel vs tagx
2871                                ModifyGraph mode=3,textMarker(TagyLabel)={TagNames,"default",0,40,4,0.00,0.00}
2872                        endif
2873                else
2874                        Wave/Z tagx=root:Packages:SamplePlateSetup:TagX
2875                        Wave/Z tagy= root:Packages:SamplePlateSetup:Tagy
2876                        Wave/T/Z TagNames= root:Packages:SamplePlateSetup:TagNames
2877                        if(WaveExists(tagx)&&WaveExists(tagy)&&WaveExists(TagNames))
2878                                redimension/N=0 tagx, tagy, TagNames
2879                        endif
2880                        removeFromGraph /Z/W=SamplePlateImageDrawing Tagy
2881                        removeFromGraph /Z/W=SamplePlateImageDrawing TagyLabel
2882                endif   
2883               
2884       
2885        endif
2886end
2887//*****************************************************************************************************************
2888//*****************************************************************************************************************
2889
2890Function IN3S_PlateImageHook(s)
2891        STRUCT WMWinHookStruct &s
2892
2893        if(stringMatch(s.winName, "SamplePlateImageDrawing"))
2894                switch( s.eventCode )
2895                        case -1: // control being killed
2896                                break
2897                        case 3: // mouse down
2898                                if (s.eventMod & 0x10)  // rightclick
2899                                        string items
2900                                        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
2901                                        items = "Write position;Add Line with positions;Igor right click cmds;"
2902                                                PopupContextualMenu items
2903                                                // V_flag is index of user selected item   
2904                                                switch (V_flag)
2905                                                        case 1: // "Write position"
2906                                                                IN3S_WritePositionInTable(s.mouseLoc.v, s.mouseLoc.h)
2907                                                                //ControlInfo /W=SamplePlateSetup CommandsList
2908                                                                variable V_Value=IN3S_FindFirstSelectedRow()
2909                                                                IN3S_AddTagToImage(V_Value)
2910                                                                variable serrow=V_Value
2911                                                                //sync to Bealine setup, if exists...
2912                                                                DoWIndow BeamlinePlateSetup
2913                                                                if(V_Flag)
2914                                                                        NVAR SelectedRow=root:Packages:SamplePlateSetup:SelectedRow
2915                                                                        SVAR SelectedSampleName=root:Packages:SamplePlateSetup:SelectedSampleName
2916                                                                        Wave/T ListWV = root:Packages:SamplePlateSetup:LBCommandWv
2917                                                                        NVAR SampleThickness=root:Packages:SamplePlateSetup:SampleThickness
2918                                                                        NVAR SampleXTAR=root:Packages:SamplePlateSetup:SampleXTAR
2919                                                                        NVAR SampleYTAR=root:Packages:SamplePlateSetup:SampleYTAR
2920                                                                        NVAR SampleXTable = root:Packages:SamplePlateSetup:SampleXTable
2921                                                                        NVAR SampleYTable = root:Packages:SamplePlateSetup:SampleYTable
2922                                                                        if(serrow>=0)
2923                                                                                SelectedRow=serrow
2924                                                                                SelectedSampleName = ListWV[SelectedRow][0]
2925                                                                                //ListBox CommandsList, win=SamplePlateSetup, selrow=SelectedRow
2926                                                                                LBSelectionWv[][0]=2
2927                                                                                LBSelectionWv[SelectedRow][0]=3
2928                                                                                SampleXTable = str2num(ListWV[SelectedRow][1])
2929                                                                                SampleYTable = str2num(ListWV[SelectedRow][2])
2930                                                                                SampleThickness = str2num(ListWV[SelectedRow][3])
2931                                                                                SampleThickness = numtype(SampleThickness)==0 ? SampleThickness : 1
2932                                                                        endif
2933                                                                        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
2934                                                                        WarningForUser = "Written right click position in table"                       
2935                                                                        IN3S_MoveToPositionIfOK()
2936                                                                endif
2937                                                                return 1
2938                                                                break;
2939                                                        case 2: // "Add Line with positions"
2940                                                                IN3S_InsertDeleteLines(4, 0,1)
2941                                                                //now select the line.
2942                                                                variable SelRow2
2943                                                                Wave/T listWave=root:Packages:SamplePlateSetup:LBCommandWv
2944                                                                SelRow2 = dimSize(listWave,0)-1
2945                                                                Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
2946                                                                LBSelectionWv[][0]=2
2947                                                                LBSelectionWv[SelRow2][0]=3
2948                                                                ListBox CommandsList, win=SamplePlateSetup, selRow= SelRow2
2949                                                                IN3S_WritePositionInTable(s.mouseLoc.v, s.mouseLoc.h)
2950                                                                IN3S_AddTagToImage(SelRow2)
2951                                                                //sync to Bealine setup, if exists...
2952                                                                DoWIndow BeamlinePlateSetup
2953                                                                if(V_Flag)
2954                                                                        NVAR SelectedRow=root:Packages:SamplePlateSetup:SelectedRow
2955                                                                        SVAR SelectedSampleName=root:Packages:SamplePlateSetup:SelectedSampleName
2956                                                                        Wave/T ListWV = root:Packages:SamplePlateSetup:LBCommandWv
2957                                                                        NVAR SampleThickness=root:Packages:SamplePlateSetup:SampleThickness
2958                                                                        NVAR SampleXTAR=root:Packages:SamplePlateSetup:SampleXTAR
2959                                                                        NVAR SampleYTAR=root:Packages:SamplePlateSetup:SampleYTAR
2960                                                                        NVAR SampleXTable = root:Packages:SamplePlateSetup:SampleXTable
2961                                                                        NVAR SampleYTable = root:Packages:SamplePlateSetup:SampleYTable
2962                                                                        if(dimSize(listWave,0)-1>=0)
2963                                                                                SelectedRow=dimSize(listWave,0)-1
2964                                                                                SelectedSampleName = ListWV[SelectedRow][0]
2965                                                                                //ListBox CommandsList, win=SamplePlateSetup, selrow=SelectedRow
2966                                                                                LBSelectionWv[][0]=2
2967                                                                                LBSelectionWv[SelectedRow][0]=3
2968                                                                                SampleXTable = str2num(ListWV[SelectedRow][1])
2969                                                                                SampleYTable = str2num(ListWV[SelectedRow][2])
2970                                                                                SampleThickness = str2num(ListWV[SelectedRow][3])
2971                                                                                SampleThickness = numtype(SampleThickness)==0 ? SampleThickness : 1
2972                                                                        endif
2973                                                                        SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
2974                                                                        WarningForUser = "Added new line with rigth click positions"                   
2975                                                                        IN3S_MoveToPositionIfOK()
2976                                                                endif
2977                                                                return 1
2978                                                                break
2979                                                        case 3: // "Igor right click cmds"
2980                                                                return 0
2981                                                                break
2982                                                        case 4: // "Duplicate selected Line"
2983                                                                //IN3S_InsertDeleteLines(3, row)
2984                                                                break
2985                                                        default :       // "Sort"
2986                                                                break;
2987                                                endswitch
2988                                else    //left click, do something here...
2989                                        //IN3S_WritePositionInTable(s.mouseLoc.v, s.mouseLoc.h)
2990                                        break
2991                                endif
2992                                break
2993                        case 4: // mousemoved
2994                                        break
2995                        case 5: // mouseup
2996                                break
2997                        case 6: // begin edit
2998                                break
2999                        case 7: // finish edit
3000                                break
3001                        case 13: // checkbox clicked (Igor 6.2 or later)
3002                                break
3003                endswitch
3004        endif
3005        return 0
3006end
3007
3008
3009//*****************************************************************************************************************
3010//*****************************************************************************************************************
3011//*****************************************************************************************************************
3012
3013static Function IN3S_AddOtherDrawings(PlateImage, Centers, Radius, Scaling, WhatDrawing)
3014        wave PlateImage, Centers
3015        variable Radius, Scaling
3016        string WhatDrawing
3017        //here we draw other drawings in the image as needed.
3018        variable i, j
3019        variable locCenterX, locCenterY, locWidthX
3020        variable tmpX, tmpYt, tmpYb
3021       
3022        variable NMRverticallenght=23
3023        variable NMRradius=2
3024        if(StringMatch(WhatDrawing, "VerticalNMR"))
3025               
3026                For(i=0;i<dimSize(Centers,0);i+=1)
3027                        locCenterX = centers[i][0]/Scaling
3028                        locCenterY = centers[i][1]/Scaling
3029                        locWidthX = floor(NMRradius/Scaling)
3030                        //left line
3031                        tmpX = locCenterX - locWidthX
3032                        tmpYt = locCenterY + NMRverticallenght/Scaling
3033                        tmpYb = locCenterY - NMRverticallenght/Scaling
3034                        PlateImage[tmpX][tmpYb,tmpYt] = 255
3035                        //right line
3036                        tmpX = locCenterX + locWidthX
3037                        PlateImage[tmpX][tmpYb,tmpYt] = 255
3038                        //fill
3039                        PlateImage[locCenterX-locWidthX+1,locCenterX+locWidthX-1][tmpYb,tmpYt] = 64
3040
3041                endfor
3042       
3043        endif
3044
3045end
3046//*****************************************************************************************************************
3047//*****************************************************************************************************************
3048//*****************************************************************************************************************
3049
3050static Function IN3S_CreateCircles(PlateImage, Centers, Radius,Scaling)
3051        wave PlateImage, Centers
3052        variable Radius, Scaling
3053       
3054        variable i
3055        //this needs to be done by FFT, this is crazy slow...
3056        //For(i=0;i<DimSize(Centers, 0);i+=1)
3057        //      PlateImage = sqrt((x - Centers[i][0])^2+( y - Centers[i][1])^2)<Radius ? 0 : PlateImage(x)(y)
3058        //endfor
3059        //now FFT... Much faster, but bit cumbersome...
3060        //this method - in convolutions - shifts the centers by :
3061        variable PadSphere=Radius/Scaling
3062        //make work space...
3063        Make/Free/S/N=(dimsize(PlateImage,0)+PadSphere, dimsize(PlateImage,1)+PadSphere) WaveToWorkOn, Circle
3064        //SET TO 1 where will be centers of holes
3065        For(i=0;i<DimSize(Centers, 0);i+=1)
3066                WaveToWorkOn [Centers[i][0]/Scaling][Centers[i][1]/Scaling] = 1
3067        endfor
3068        //create image of hole
3069        Circle[0,ceil(2*Radius/Scaling+2)][0,ceil(2*Radius/Scaling+2)] = (sqrt((p*Scaling-Radius)^2+(q*Scaling-Radius)^2)<Radius) ? 1 : 0
3070        //now use fft. MatrixOp should be bit faster.
3071        //fft/DEST=CircleFFT/Free Circle
3072        MatrixOp/FREE CircleFFT=fft(Circle,0)
3073        //fft/DEST=Wave2DInFFT/Free WaveToWorkOn
3074        MatrixOp/FREE Wave2DInFFT=fft(WaveToWorkOn,0)
3075        //convolute together
3076        MatrixOp/FREE MultipliedFFT = Wave2DInFFT * CircleFFT
3077        //IFFT, force real result
3078        //IFFT/Dest=Wave2DOutIFFT/Free MultipliedFFT
3079        MatrixOp/FREE Wave2DOutIFFT=ifft(MultipliedFFT,1)
3080        //this depends on what is used for convolution. If sharp sphere, this is what you need... thresholds are  much smaller for gauss...
3081        imageThreshold/T=(0.5)  Wave2DOutIFFT
3082        wave M_ImageThresh
3083        //now we need to shrink it back to size and remove first PadSphere rows and columns
3084        Duplicate/Free/R=[PadSphere, ][PadSphere, ] M_ImageThresh, ShrunkImageThresh
3085        //and return back to the code.
3086        PlateImage = 128 - (ShrunkImageThresh/2)
3087end
3088//*****************************************************************************************************************
3089//*****************************************************************************************************************
3090//*****************************************************************************************************************
3091
3092static Function IN3S_CreateNMRTubes(PlateImage, Centers, Scaling)
3093        wave PlateImage, Centers
3094        variable Scaling
3095       
3096        variable i
3097        variable NMRTubeRadius, NMRTubeHeight, CenterP, CenterQ
3098        NMRTubeRadius = 2/Scaling
3099        NMRTubeHeight = 10/Scaling
3100        CenterP = NMRTubeHeight - NMRTubeRadius
3101        CenterQ = NMRTubeHeight - NMRTubeRadius
3102        //this needs to be done by FFT, this is crazy slow...
3103        //For(i=0;i<DimSize(Centers, 0);i+=1)
3104        //      PlateImage = sqrt((x - Centers[i][0])^2+( y - Centers[i][1])^2)<Radius ? 0 : PlateImage(x)(y)
3105        //endfor
3106        //now FFT... Much faster, but bit cumbersome...
3107        //this method - in convolutions - shifts the centers by :
3108        variable PadSphereP=NMRTubeRadius/Scaling
3109        variable PadSphereQ=0//NMRTubeHeight/Scaling
3110        //make work space...
3111        Make/Free/S/N=(dimsize(PlateImage,0)+PadSphereP, dimsize(PlateImage,1)+PadSphereP) WaveToWorkOn, NMRTube
3112        //SET TO 1 where will be centers of holes
3113        For(i=0;i<DimSize(Centers, 0);i+=1)
3114                WaveToWorkOn [Centers[i][0]/Scaling][Centers[i][1]/Scaling] = 1
3115        endfor
3116        //create image of hole
3117        NMRTube[0,ceil(2*NMRTubeHeight+2)][0,ceil(2*NMRTubeHeight+2)] = ((abs(p-CenterP)<NMRTubeRadius)&& (abs(q-CenterQ)<NMRTubeHeight)) ? 1 : 0
3118        //now use fft. MatrixOp should be bit faster.
3119        //fft/DEST=CircleFFT/Free Circle
3120        MatrixOp/FREE NMRTubeFFT=fft(NMRTube,0)
3121        //fft/DEST=Wave2DInFFT/Free WaveToWorkOn
3122        MatrixOp/FREE Wave2DInFFT=fft(WaveToWorkOn,0)
3123        //convolute together
3124        MatrixOp/FREE MultipliedFFT = Wave2DInFFT * NMRTubeFFT
3125        //IFFT, force real result
3126        //IFFT/Dest=Wave2DOutIFFT/Free MultipliedFFT
3127        MatrixOp/FREE Wave2DOutIFFT=ifft(MultipliedFFT,1)
3128        //this depends on what is used for convolution. If sharp sphere, this is what you need... thresholds are  much smaller for gauss...
3129        imageThreshold/T=(0.5)  Wave2DOutIFFT
3130        wave M_ImageThresh
3131        //now we need to shrink it back to size and remove first PadSphere rows and columns
3132        Duplicate/Free/R=[PadSphereP, ][PadSphereP, ] M_ImageThresh, ShrunkImageThresh
3133        //and return back to the code.
3134        PlateImage = 128 - (ShrunkImageThresh/2)
3135end
3136
3137//************************************************************************************************************
3138//************************************************************************************************************
3139Function  IN3S_ImportFile()                     //thsi imports ASCII file, need to add otehr types of fioles as needed.
3140
3141        DFrEF OldDf=GetDataFolderDFR()
3142        setdatafolder root:Packages:SamplePlateSetup:
3143
3144        Wave/T LBCommandWv = root:Packages:SamplePlateSetup:LBCommandWv
3145        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
3146        //Wave/T LBTtitleWv = root:Packages:SamplePlateSetup:LBTtitleWv
3147        redimension/N=(400,8) LBCommandWv, LBSelectionWv
3148        //initialize...
3149        string/g ImportFileType
3150        SVAR ImportFileType
3151        if(strlen(ImportFileType)<1)
3152                ImportFileType="12IDB command file"
3153        endif
3154        //import the the text file.
3155        variable refNum, i, imax, iused
3156    String line, tmpStr, MDStart=""
3157        if(StringMatch(ImportFileType, "12IDB command file" ))                  //this is reading web created command files from 12IDB
3158                open/R/F="????" refnum
3159                if(strlen(S_fileName)==0)
3160                        abort
3161                endif
3162                print "Importing 12IDB commands from file : "+S_fileName
3163                SVAR SetName = root:Packages:SamplePlateSetup:UserNameForSampleSet
3164                SetName = CleanupName(StringFromList(ItemsInList(S_fileName,":")-1, S_fileName, ":"), 0)
3165                i=0;imax=0
3166        FSetPos refnum,0
3167                do
3168                FReadLine refnum, line
3169                        if(!StringMatch(line, "#*")&&strlen(line)>1)            //if does not start with #
3170                                //# sample_Name sample_x        sample_y        ExposureTime    thickness(???)  sample_description
3171                                LBCommandWv[i][0] = CleanupName(StringFromList(0, line , ","), 0 , 40)
3172                                LBCommandWv[i][1] = StringFromList(1, line , ",")
3173                                LBCommandWv[i][2] = StringFromList(2, line , ",")
3174                                LBCommandWv[i][3] = StringFromList(4, line , ",")
3175                                //LBCommandWv[i][4] = StringFromList(3, line , ",")
3176                                //LBCommandWv[i][5] = StringFromList(3, line , ",")
3177                                //LBCommandWv[i][6] = StringFromList(3, line , ",")
3178                                //SG4M4, 78, 0, 1.0, 1, 1.5, 100x diluted short nanowires, pH=10, 1.5 M KCl
3179                                tmpStr = line
3180                                tmpStr = RemoveFromList(StringFromList(0, line , ","), tmpStr, ",")     //remove name
3181                                tmpStr = RemoveFromList(StringFromList(1, line , ","), tmpStr, ",")     //remove x
3182                                tmpStr = RemoveFromList(StringFromList(2, line , ","), tmpStr, ",")     //remove y
3183                                tmpStr = RemoveFromList(StringFromList(3, line , ","), tmpStr, ",")     //remove exposure time
3184                                tmpStr = RemoveFromList(StringFromList(4, line , ","), tmpStr, ",")     //remove thickness
3185                                tmpStr = RemoveEnding(tmpStr, "\r")
3186                                tmpStr = RemoveEnding(tmpStr, "\r\n")
3187                                LBCommandWv[i][7] = MDStart+"Sample description: "+tmpStr               //StringFromList(6, line , ",")         //this is MD for BS, ddi tno work with , used by users in description.
3188                                i+=1
3189                        else
3190                                if(!(StringMatch(line, "#IP*") ||StringMatch(line, "# sample_Name*")||StringMatch(line, "#Holder*") ))
3191                                        tmpStr = ReplaceString("#", line, "")
3192                                        tmpStr = ReplaceString("^t", tmpStr, "")
3193                                        MDStart+=RemoveEnding(tmpStr, "\r")+";"
3194                                endif
3195                        endif
3196                while(strlen(line)>0)
3197                close refnum           
3198                LBSelectionWv[][0]=2
3199                LBSelectionWv[][1]=2
3200                LBSelectionWv[][2]=2
3201                LBSelectionWv[][3]=2
3202                NVAR USAXSAll = root:Packages:SamplePlateSetup:USAXSAll
3203                if(USAXSAll)
3204                        LBSelectionWv[][4]=48
3205                else
3206                        LBSelectionWv[][4]=32
3207                endif
3208                NVAR SAXSAll = root:Packages:SamplePlateSetup:SAXSAll
3209                if(SAXSAll)
3210                        LBSelectionWv[][5]=48
3211                else
3212                        LBSelectionWv[][5]=32
3213                endif
3214                NVAR WAXSAll = root:Packages:SamplePlateSetup:WAXSAll
3215                if(WAXSAll)
3216                        LBSelectionWv[][6]=48
3217                else
3218                        LBSelectionWv[][6]=32
3219                endif
3220        endif
3221        redimension/N=(i,8) LBSelectionWv,LBCommandWv
3222       
3223
3224        SetDataFolder OldDf
3225end
3226//************************************************************************************************************
3227//************************************************************************************************************
3228Function IN3S_ImportImageOfPlate()
3229        // imports the image in here: root:Packages:SamplePlatesAvailable:PlateImage
3230        // and allows user to remvoe parralax and trim, set dimensions.
3231       
3232        DFrEF OldDf=GetDataFolderDFR()
3233        setdatafolder root:Packages:SamplePlatesAvailable
3234        KillWindow/Z SamplePlateImageDrawing
3235        NVAR Scaling = root:Packages:SamplePlatesAvailable:Acrylic9x9PlateScale
3236        //need variables here, this may go in Init routine later
3237        variable HorSize, VertSize
3238        variable/g xRT, xRB, xLT, xLB
3239        variable/g yRT, yRB, yLT, yLB
3240        variable/g xDimension
3241        variable/g yDimension
3242        //import the image somehwere
3243        ImageLoad/T=any/O
3244        if(V_Flag!=1)
3245                abort
3246        endif
3247        string/g LoadedImageName=S_fileName
3248        wave imageWave = $(LoadedImageName)
3249        ImageTransform rgb2gray  imageWave
3250        Wave M_RGB2Gray
3251        Duplicate/O M_RGB2Gray, PlateImageTemp
3252        killwaves/Z imageWave, M_RGB2Gray
3253        //set values for the variables, for now 0,0 is in top left corner...
3254        xRT = dimsize(PlateImageTemp,0)*0.9
3255        xRB = dimsize(PlateImageTemp,0)*0.9
3256        xLT = dimsize(PlateImageTemp,0)*0.1
3257        xLB = dimsize(PlateImageTemp,0)*0.2
3258        yRT = dimsize(PlateImageTemp,1)*0.1
3259        yRB = dimsize(PlateImageTemp,1)*0.9
3260        yLT = dimsize(PlateImageTemp,1)*0.2
3261        yLB = dimsize(PlateImageTemp,1)*0.8
3262        if((xDimension+yDimension)<50)
3263                xDimension = 200       
3264                yDimension = 100
3265        endif
3266
3267        //make image, get user input here so we can trim the image and return it back...
3268        KillWindow/Z TrimCorrectImageDrawing
3269        NewImage/K=1/N=TrimCorrectImageDrawing root:Packages:SamplePlatesAvailable:PlateImageTemp
3270        Cursor/W=TrimCorrectImageDrawing/C=(65535,0,0)/H=0/I/P/S=1/T={1,1,1}/NUML=1 A, PlateImageTemp, xRT, yRT 
3271        Cursor/W=TrimCorrectImageDrawing/C=(65535,0,0)/H=0/I/P/S=1/T={1,2,2}/NUML=2 B, PlateImageTemp, xRB, yRB 
3272        Cursor/W=TrimCorrectImageDrawing/C=(65535,0,0)/H=0/I/P/S=1/T={1,3,3}/NUML=3 C, PlateImageTemp, xLT, yLT 
3273        Cursor/W=TrimCorrectImageDrawing/C=(65535,0,0)/H=0/I/P/S=1/T={1,4,4}/NUML=4 D, PlateImageTemp, xLB, yLB 
3274        ControlBar /T/W=TrimCorrectImageDrawing 80
3275        TitleBox LeftTop title="\Zr120Left top (C) : ",pos={10,5},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0
3276        SetVariable xLT,pos={10,25},size={90,20}, disable=2, noedit=1,limits={-inf,inf,0},noproc ,title="Xpos = "
3277        Setvariable xLT,fStyle=2, variable=root:Packages:SamplePlatesAvailable:xLT, help={"This is x postion of C corner"}
3278        SetVariable yLT,pos={10,45},size={90,20}, disable=2, noedit=1,limits={-inf,inf,0},noproc ,title="Ypos = "
3279        Setvariable yLT,fStyle=2, variable=root:Packages:SamplePlatesAvailable:yLT, help={"This is y postion of C corner"}
3280
3281        TitleBox LeftBot title="\Zr120Left bot (D) : ",pos={150,5},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0
3282        SetVariable xLB,pos={150,25},size={90,20}, disable=2, noedit=1,limits={-inf,inf,0},noproc ,title="Xpos = "
3283        Setvariable xLB,fStyle=2, variable=root:Packages:SamplePlatesAvailable:xLB, help={"This is x postion of D corner"}
3284        SetVariable yLB,pos={150,45},size={90,20}, disable=2, noedit=1,limits={-inf,inf,0},noproc ,title="Ypos = "
3285        Setvariable yLB,fStyle=2, variable=root:Packages:SamplePlatesAvailable:yLB, help={"This is y postion of D corner"}
3286
3287        TitleBox Dimensions title="\Zr120Dimensions[mm]: ",pos={260,30},size={150,15},frame=0,fColor=(0,0,65535),labelBack=0
3288        SetVariable xDimension,pos={270,5},size={200,20}, noedit=0,limits={50,500,10},noproc,bodyWidth=70, title="Horizontal [mm] "
3289        Setvariable xDimension,fStyle=2, variable=root:Packages:SamplePlatesAvailable:xDimension, help={"This is x dimension in mm of C corner"}
3290        SetVariable yDimension,pos={270,55},size={200,20}, noedit=0,limits={50,500,10},noproc,bodyWidth=70,title="Vertical    [mm] "
3291        Setvariable yDimension,fStyle=2, variable=root:Packages:SamplePlatesAvailable:yDimension, help={"This is y dimension in mm of C corner"}
3292
3293        Button TrimImportedImage,pos={400,30},size={120,17}, proc=IN3S_ButtonProc,title="Trim image", help={"Trims the image"}
3294
3295        TitleBox RightBot title="\Zr120Right bot (B) : ",pos={550,5},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0
3296        SetVariable xRB,pos={550,25},size={90,20}, disable=2, noedit=1,limits={-inf,inf,0},noproc ,title="Xpos = "
3297        Setvariable xRB,fStyle=2, variable=root:Packages:SamplePlatesAvailable:xRB, help={"This is x postion of B corner"}
3298        SetVariable yRB,pos={550,45},size={90,20}, disable=2, noedit=1,limits={-inf,inf,0},noproc ,title="Ypos = "
3299        Setvariable yRB,fStyle=2, variable=root:Packages:SamplePlatesAvailable:yRB, help={"This is y postion of B corner"}
3300
3301        TitleBox RightTop title="\Zr120Right top (A) : ",pos={690,5},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0
3302        SetVariable xRT,pos={690,25},size={90,20}, disable=2, noedit=1,limits={-inf,inf,0},noproc ,title="Xpos = "
3303        Setvariable xRT,fStyle=2, variable=root:Packages:SamplePlatesAvailable:xRT, help={"This is x postion of A corner"}
3304        SetVariable yRT,pos={690,45},size={90,20}, disable=2, noedit=1,limits={-inf,inf,0},noproc ,title="Ypos = "
3305        Setvariable yRT,fStyle=2, variable=root:Packages:SamplePlatesAvailable:yRT, help={"This is y postion of A corner"}
3306
3307        SetWindow TrimCorrectImageDrawing, hook(CursorsMoved) = IN3S_MyCursorsMovedHook // Install window hook
3308
3309        SetDataFolder OldDf
3310
3311end
3312//************************************************************************************************************
3313//************************************************************************************************************
3314
3315Function IN3S_TrimAndStraightenImage()
3316       
3317       
3318        DFrEF OldDf=GetDataFolderDFR()
3319        setdatafolder root:Packages:SamplePlatesAvailable
3320        wave ImageIn = root:Packages:SamplePlatesAvailable:PlateImageTemp
3321       
3322        NVAR xRT=root:Packages:SamplePlatesAvailable:xRT
3323        NVAR xRB=root:Packages:SamplePlatesAvailable:xRB
3324        NVAR xLT=root:Packages:SamplePlatesAvailable:xLT
3325        NVAR xLB=root:Packages:SamplePlatesAvailable:xLB
3326       
3327        NVAR yRT=root:Packages:SamplePlatesAvailable:yRT
3328        NVAR yRB=root:Packages:SamplePlatesAvailable:yRB
3329        NVAR yLT=root:Packages:SamplePlatesAvailable:yLT
3330        NVAR yLB=root:Packages:SamplePlatesAvailable:yLB
3331
3332        NVAR xDimension=root:Packages:SamplePlatesAvailable:xDimension
3333        NVAR yDimension=root:Packages:SamplePlatesAvailable:yDimension
3334       
3335        SVAR LoadedImageName=root:Packages:SamplePlatesAvailable:LoadedImageName
3336       
3337        variable x1,x2,x3,x4,y1,y2,y3,y4
3338        x1 = xRT
3339        x2 = xRB
3340        x3 = xLT
3341        x4 = xLB
3342        y1 = yRT
3343        y2 = yRB
3344        y3 = yLT
3345        y4 = yLB
3346       
3347        variable Scaling = 10   //10 points/mm. 0.1 mm/pixel.
3348        variable Pwidth
3349        variable NumPx = xDimension*Scaling
3350        variable NumPy = yDimension*Scaling
3351        Pwidth = DimSize(ImageIn,1)/NumPy
3352        make/O/N=(NumPx, NumPy) PlateImage
3353        SetScale/I x 0,xDimension,"mm", PlateImage
3354        SetScale/I y 0,yDimension,"mm", PlateImage
3355
3356        //now we need to fill this image with interpolated lines...
3357        make/N=(NumPx)/O/FREE xwave, ywave
3358        make/N=(NumPy)/O/FREE dummy
3359        MatrixOP/O/free pWave=indexRows(xWave)
3360
3361        MultiThread dummy=IN3S_TrimImgCalcOneLine(p,x1,x2,x3,x4,y1,y2,y3,y4,NumPx-1,NumPy-1,ImageIn,PlateImage, pWave, Pwidth)
3362       
3363        //      //create plate drawing.         
3364        KillWIndow/Z SamplePlateImageDrawing
3365        PauseUpdate
3366        NewImage/K=1/N=SamplePlateImageDrawing root:Packages:SamplePlatesAvailable:PlateImage
3367        DoWindow/T SamplePlateImageDrawing,"Image of "+LoadedImageName
3368        //ModifyImage PlateImage ctab= {0,256,Grays,1}
3369        ModifyGraph margin(left)=28,margin(bottom)=28,margin(top)=28,margin(right)=28
3370        SetAxis/R left (yDimension+0.125),-0.125
3371        SetAxis/R top (xDimension+0.125),-0.125
3372        Label left "\\Zr133millimeters from top right corner"
3373        Label top "\\Zr133millimeters from top right corner"
3374        ModifyGraph grid=1
3375        ModifyGraph mirror=3
3376        ModifyGraph nticks(left)=22,nticks(top)=22
3377        ModifyGraph minor=1
3378        ModifyGraph standoff=0
3379        ModifyGraph tkLblRot(left)=90
3380        ModifyGraph btLen=3
3381        ModifyGraph tlOffset=-2
3382        DoUpdate
3383        SetWindow SamplePlateImageDrawing  hook(ImageHook)=IN3S_PlateImageHook
3384
3385        SetDataFolder OldDf
3386       
3387End
3388//************************************************************************************************************
3389//************************************************************************************************************
3390
3391Function IN3S_MyCursorsMovedHook(s)
3392        STRUCT WMWinHookStruct &s
3393       
3394        Variable hookResult = 0 // 0 if we do not handle event, 1 if we handle it.
3395        NVAR xRT=root:Packages:SamplePlatesAvailable:xRT
3396        NVAR xRB=root:Packages:SamplePlatesAvailable:xRB
3397        NVAR xLT=root:Packages:SamplePlatesAvailable:xLT
3398        NVAR xLB=root:Packages:SamplePlatesAvailable:xLB
3399       
3400        NVAR yRT=root:Packages:SamplePlatesAvailable:yRT
3401        NVAR yRB=root:Packages:SamplePlatesAvailable:yRB
3402        NVAR yLT=root:Packages:SamplePlatesAvailable:yLT
3403        NVAR yLB=root:Packages:SamplePlatesAvailable:yLB
3404       
3405        switch(s.eventCode)
3406                case 7:                         // cursor moved is 7...
3407                        //print s.cursorName
3408                        //print s.pointNumber
3409                        //print s.yPointNumber
3410                        strswitch(s.cursorName)
3411                                hookResult =1
3412                                case "A":
3413                                        xRT = s.pointNumber
3414                                        yRT = s.yPointNumber
3415                                        break
3416                                case "B":
3417                                        xRB = s.pointNumber
3418                                        yRB = s.yPointNumber
3419                                        break
3420                                case "C":
3421                                        xLT = s.pointNumber
3422                                        yLT = s.yPointNumber
3423                                        break
3424                                case "D":
3425                                        xLB = s.pointNumber
3426                                        yLB = s.yPointNumber   
3427                                        break
3428                        endswitch       
3429                        break
3430        endswitch
3431
3432        return hookResult               // 0 if nothing done, else 1
3433End
3434
3435//************************************************************************************************************
3436//************************************************************************************************************
3437
3438ThreadSafe static function IN3S_TrimImgCalcOneLine(i,x1,x2,x3,x4,y1,y2,y3,y4,NumPx,NumPy,M_RGB2Gray,DestImage,pWave, Pwidth)
3439        Variable i,x1,x2,x3,x4,y1,y2,y3,y4,NumPx,NumPy, Pwidth
3440        Wave M_RGB2Gray,DestImage,pWave
3441
3442
3443                Variable xfrac = i/(NumPy)
3444                Variable xstart = (1-xfrac)*x1 + xfrac*x2
3445                Variable ystart = (1-xfrac)*y1 + xfrac*y2
3446                Variable xend   =  (1-xfrac)*x3 + xfrac*x4
3447                Variable yend   =  (1-xfrac)*y3 + xfrac*y4
3448                Variable xScale=(xend-xstart)/(NumPx)
3449                Variable yScale=(yend-ystart)/(NumPx)
3450
3451                MatrixOP/O/FREE xwave=xstart+pWave*xScale               //
3452                MatrixOP/O/FREE ywave=ystart+pWave*yScale
3453                ImageLineProfile/V xWave=xwave, yWave=ywave, srcwave=M_RGB2Gray, width=Pwidth
3454
3455                Wave W_ImageLineProfile
3456                //DestImage[][i]=W_ImageLineProfile[p]
3457                //MatrixOP/O DestImage=setCol(DestImage,i,W_ImageLineProfile)
3458                ImageTransform/G=(i)/D=W_ImageLineProfile putCol DestImage
3459End
3460//************************************************************************************************************
3461//************************************************************************************************************
3462//*****************************************************************************************************************
3463//*****************************************************************************************************************
3464
3465//                              B E A M L I N E    S U R V E Y    C O D E
3466
3467//*****************************************************************************************************************
3468//*****************************************************************************************************************
3469
3470Function IN3S_BeamlineSurvey()
3471
3472        //abort if epics support does not exist...
3473        if(exists("pvOpen")!=4 && IN3SBeamlineSurveyDevelopOn<1)
3474                Abort "This is useful only at the beamline on usaxspc7 or usaxspc11"
3475        endif
3476        /// abort if instrument in use.
3477        IN3S_BeramlineSurveyAbortIfNeeded("Cannot use survey tool")
3478        //
3479        Wave/T ListWV = root:Packages:SamplePlateSetup:LBCommandWv
3480        NVAR SelectedRow=root:Packages:SamplePlateSetup:SelectedRow
3481        //ControlInfo/W=SamplePlateSetup CommandsList
3482        variable V_Value=IN3S_FindFirstSelectedRow()
3483        if(V_Value>=0 && V_Value<DimSize(ListWV,0)-1)
3484                SelectedRow = V_Value
3485        else
3486                SelectedRow = 0
3487        endif   
3488        //Sync values
3489        SVAR SelectedSampleName=root:Packages:SamplePlateSetup:SelectedSampleName
3490        NVAR SampleThickness=root:Packages:SamplePlateSetup:SampleThickness
3491        NVAR SampleXTAR=root:Packages:SamplePlateSetup:SampleXTAR
3492        NVAR SampleYTAR=root:Packages:SamplePlateSetup:SampleYTAR
3493        NVAR SampleXTable = root:Packages:SamplePlateSetup:SampleXTable
3494        NVAR SampleYTable = root:Packages:SamplePlateSetup:SampleYTable
3495        NVAR SampleXRBV=root:Packages:SamplePlateSetup:SampleXRBV
3496        NVAR SampleYRBV=root:Packages:SamplePlateSetup:SampleYRBV
3497        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
3498        SelectedSampleName = ListWV[SelectedRow][0]
3499        //ListBox CommandsList, win=SamplePlateSetup, selrow=SelectedRow
3500        LBSelectionWv[][0]=2
3501        LBSelectionWv[SelectedRow][0]=3
3502        SampleXTable = str2num(ListWV[SelectedRow][1])
3503        SampleYTable = str2num(ListWV[SelectedRow][2])
3504        SampleThickness = str2num(ListWV[SelectedRow][3])
3505        SampleThickness = numtype(SampleThickness)==0 ? SampleThickness : 1
3506        IN3S_AddTagToImage(SelectedRow)                 
3507        DoWIndow BeamlinePlateSetup
3508        if(V_Flag)
3509                DoWindow/F BeamlinePlateSetup
3510        else
3511                IN3S_BeamlineSurveyPanel()
3512        endif
3513        SetWindow BeamlinePlateSetup  hook(EpicsMon)=IN3S_BeamlineSurveyEpicsHook
3514        IN3S_BeamlineSurveyStartEpicsUpdate()
3515        //sync epics, RBV and TAR positions here
3516#if(exists("pvOpen")==4)
3517        variable SxPV, SyPV
3518        pvOpen/Q SxPV, "9idcLAX:m58:c2:m1.RBV"
3519        pvOpen/Q SyPV, "9idcLAX:m58:c2:m2.RBV"
3520        pvWait 5
3521        //this needs to be in background function and in 10Hz loop.     
3522        SampleXRBV = IN3S_GetMotorPositions(SxPV)
3523        SampleYRBV = IN3S_GetMotorPositions(SyPV)
3524        //end of background function loop.
3525        pvClose SxPV
3526        pvClose SyPV
3527#endif
3528        SampleXTAR = SampleXRBV
3529        SampleYTAR = SampleYRBV
3530end
3531
3532//*************************************************************************************************
3533//*************************************************************************************************
3534static Function IN3S_BeramlineSurveyAbortIfNeeded(string WhyString)
3535        variable InstrumentUsed
3536#if(exists("pvOpen")==4)
3537                InstrumentUsed = IN3S_GetPVVariableValue("9idcLAX:dataColInProgress")   
3538                if(InstrumentUsed)
3539                        abort "Instrument is collecting data, cannot "+WhyString
3540                endif
3541#endif
3542end
3543//*************************************************************************************************
3544static Function IN3S_BeamlineSurveyStartEpicsUpdate()
3545        //this starts updating epics.
3546        CtrlNamedBackground IN2SMonitorEpics, period=IN3SBeamlineSurveyEpicsMonTicks, proc=IN3S_BackgroundEpics
3547        CtrlNamedBackground IN2SMonitorEpics, start
3548        return 0
3549end
3550//*************************************************************************************************
3551static Function IN3S_BeamlineSurveyStopEpicsUpdate()
3552        //this starts updating epics.
3553        //CtrlNamedBackground IN2SMonitorEpics, period=IN3SBeamlineSurveyEpicsMonTicks, proc=IN3S_BackgroundEpics
3554        CtrlNamedBackground IN2SMonitorEpics, stop
3555        return 1
3556end
3557//*************************************************************************************************
3558Function IN3S_BeamlineSurveyEpicsHook(s)
3559        STRUCT WMWinHookStruct &s
3560
3561        if(stringMatch(s.winName, "BeamlinePlateSetup"))
3562                switch( s.eventCode )
3563                        case 0: // window being activated
3564                                IN3S_BeamlineSurveyStartEpicsUpdate()
3565                                break
3566                        case 1: // window being deactivated
3567                                //IN3S_BeamlineSurveyStopEpicsUpdate()
3568                                break
3569                        case 2: // window being killed
3570                                IN3S_BeamlineSurveyStopEpicsUpdate()
3571                                break
3572                        case 15: // hide
3573                                IN3S_BeamlineSurveyStopEpicsUpdate()
3574                                break
3575                        case 16: // show
3576                                IN3S_BeamlineSurveyStartEpicsUpdate()
3577                                break
3578                        case 7: // finish edit
3579                                break
3580                endswitch
3581        endif
3582        return 0
3583end
3584//*************************************************************************************************
3585Function IN3S_BackgroundEpics(s) // This is the function that will be called periodically
3586        STRUCT WMBackgroundStruct &s    //note: cannot be static or things will not work.
3587        NVAR SampleXRBV=root:Packages:SamplePlateSetup:SampleXRBV
3588        NVAR SampleYRBV=root:Packages:SamplePlateSetup:SampleYRBV
3589#if(exists("pvOpen")==4)
3590        variable SxPV, SyPV
3591        pvOpen/Q SxPV, "9idcLAX:m58:c2:m1.RBV"
3592        pvOpen/Q SyPV, "9idcLAX:m58:c2:m2.RBV"
3593        pvWait 5
3594        //this needs to be in background function and in 10Hz loop.     
3595        SampleXRBV = IN3S_GetMotorPositions(SxPV)
3596        SampleYRBV = IN3S_GetMotorPositions(SyPV)
3597        //end of background function loop.
3598        pvClose SxPV
3599        pvClose SyPV
3600#endif
3601        return 0
3602end
3603//*************************************************************************************************
3604static function IN3S_GetMotorPositions(SPV)
3605        variable SPV
3606
3607#if(exists("pvOpen")==4)
3608        variable tempRBV
3609        pvGet SPV, tempRBV
3610        return tempRBV
3611#endif
3612end
3613//*************************************************************************************************
3614static function IN3S_GetPVVariableValue(PVString)
3615        string  PVString
3616
3617#if(exists("pvOpen")==4)
3618        variable tempRBV, PVv
3619        pvOpen/Q PVv, PVString
3620        pvGet PVv, tempRBV
3621        pvClose PVv
3622        return tempRBV
3623#endif
3624end
3625//*************************************************************************************************
3626//*************************************************************************************************
3627//*************************************************************************************************
3628
3629Function IN3S_BeamlineSurveyPanel()
3630
3631        string oldDf=GetDataFolder(1)
3632        setDataFolder root:Packages:SamplePlateSetup
3633        /// abort if instrument in use.
3634        IN3S_BeramlineSurveyAbortIfNeeded("Cannot use survey tool")
3635       
3636        DoWindow BeamlinePlateSetup
3637        if(V_Flag)
3638                DoWindow/F BeamlinePlateSetup
3639        else
3640                PauseUpdate             // building window...
3641                NewPanel /K=1 /W=(592.25,43.25,1000,550)/N=BeamlinePlateSetup as "Beamline Sample Plate survey"
3642                SetDrawLayer UserBack
3643                //SetDrawEnv fillfgc= (16386,65535,16385),fillbgc= (0,65535,0)
3644                //SetDrawEnv linefgc= (32792,65535,1),fillbgc= (32792,65535,1),fillfgc= (32792,65535,1)
3645                SetDrawEnv linefgc= (49151,65535,49151),fillbgc= (49151,65535,49151),fillfgc= (49151,65535,49151)
3646                DrawRect 194,175,400,198
3647                SetDrawEnv fillfgc= (49151,65535,49151)
3648                DrawRRect 6,234,189,400
3649                SetDrawEnv fillfgc= (49151,65535,49151)
3650                DrawRRect 212,234,395,400
3651                TitleBox Title title="\Zr210Beamline survey",pos={50,3},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428), anchor=MC
3652                //selected row and sample name
3653                SetVariable SelectedRow,pos={100,40},size={180,20}, limits={0,200,0}, proc=IN3S_SurveySetVarProc,title="Selected row: ",fSize=14
3654                Setvariable SelectedRow,fStyle=2, variable=root:Packages:SamplePlateSetup:SelectedRow, help={"Selected row in the table"},format="%3.0f"
3655
3656                Button MoveRowUp,pos={80,70},size={100,25}, proc=IN3S_SurveyButtonProc,title="Row ⇑",fSize=14, help={"Moves row up (lower row number)"}
3657                Button MoveRowDown,pos={220,70},size={100,25}, proc=IN3S_SurveyButtonProc,title="Row ⇓",fSize=14, help={"Moves row up (lower row number)"}
3658                SetVariable SelectedSampleName,pos={10,105},size={370,25}, limits={0,200,1}, proc=IN3S_SurveySetVarProc,title="Sa Name: ",fSize=14
3659                Setvariable SelectedSampleName,fStyle=2, variable=root:Packages:SamplePlateSetup:SelectedSampleName, help={"Sample name from the table or saved to table"}
3660                SetVariable SampleThickness,pos={20,130},size={250,25}, limits={0,20,0.1}, proc=IN3S_SurveySetVarProc,title="Sa Thickness [mm]: ",fSize=14
3661                Setvariable SampleThickness,fStyle=2, variable=root:Packages:SamplePlateSetup:SampleThickness, help={"Sample Thickness in mm"},format="%3.3f"
3662                Button GoTo00,pos={300,130},size={100,15}, proc=IN3S_SurveyButtonProc,title="Go 0,0",fSize=14, help={"Moves to 0,0"}
3663                Button GoTo00 fColor=(0,65535,0)
3664
3665                SetVariable SampleXTable,pos={30,155},size={130,15}, limits={-inf,inf,0}, noproc, noedit=1,title="Sa X tbl =",fSize=12, frame=0
3666                Setvariable SampleXTable,fStyle=2, variable=root:Packages:SamplePlateSetup:SampleXTable, help={"Sample Thickness in mm"},format="%3.2f"
3667                SetVariable SampleYTable,pos={220,155},size={130,15}, limits={-inf,inf,0}, proc=IN3S_SetVarProc,title="Sa Y tbl =",fSize=12, frame=0
3668                Setvariable SampleYTable,fStyle=2, variable=root:Packages:SamplePlateSetup:SampleYTable, help={"Sample Thickness in mm"},format="%3.2f"
3669               
3670                Button DriveTovals,pos={10,178},size={160,20}, proc=IN3S_SurveyButtonProc,title="Drive to table values",fSize=12, help={"Moves SX and SY to table positions"}
3671                Button DriveTovals fColor=(0,65535,0)
3672                CheckBox MoveWhenRowChanges pos={200,180},size={70,20},title="Drive to SX/SY on row change?", help={"When selected, SX and SY will move when row is changed"}
3673                CheckBox MoveWhenRowChanges variable=root:Packages:SamplePlateSetup:MoveWhenRowChanges,  noproc, fColor=(0,0,0),labelBack=(49151,65535,49151)
3674
3675                //save values...
3676                Button SaveValues,pos={100,208.00},size={200,20}, proc=IN3S_SurveyButtonProc,title="Save Values",fSize=14, help={"Copies values to the table of positions"}
3677                Button SaveValues fColor=(65535,32768,32768)
3678
3679                TitleBox Info1 title="\Zr200Sx : ",pos={45,238},size={20,15},frame=0,fColor=(0,0,65535),labelBack=0,fstyle=1
3680                TitleBox Info2 title="\Zr200Sy : ",pos={265,238},size={20,15},frame=0,fColor=(0,0,65535),labelBack=0,fstyle=1
3681                SetVariable SampleXRBV,pos={80,238},size={60,30}, limits={-200,200, 0}, noproc,title=" ",fSize=18, noedit=1, frame=0
3682                SetVariable SampleXRBV,variable=root:Packages:SamplePlateSetup:SampleXRBV, help={"SX RBV position"},format="%6.2f"
3683                SetVariable SampleYRBV,pos={300,238},size={60,30}, limits={-200,200, 0}, noproc,title=" ",fSize=18, noedit=1, frame=0
3684                SetVariable SampleYRBV,variable=root:Packages:SamplePlateSetup:SampleYRBV, help={"SY RBV position"},format="%6.2f"
3685
3686                SetVariable SampleXTAR,pos={50,270},size={90,30}, limits={-200,200, 0}, proc=IN3S_SurveySetVarProc,title=" ",fSize=25
3687                Setvariable SampleXTAR,fStyle=2, variable=root:Packages:SamplePlateSetup:SampleXTAR, help={"SX position"},format="%6.2f"
3688                SetVariable SampleYTAR,pos={260,270},size={90,30}, limits={-200,200, 0}, proc=IN3S_SurveySetVarProc,title=" ",fSize=25
3689                Setvariable SampleYTAR,fStyle=2, variable=root:Packages:SamplePlateSetup:SampleYTAR, help={"SY position"},format="%6.2f"
3690
3691                Button MoveSXLow,pos={10,260},size={30,50}, proc=IN3S_SurveyButtonProc,title="-",help={"Moves SX lower by the step value"}
3692                Button MoveSXLow,fSize=24,fstyle=1,fColor=(1,16019,65535)
3693                Button MoveSXHigh,pos={150,260},size={30,50}, proc=IN3S_SurveyButtonProc,title="+",help={"Moves SX higher by the step value"}
3694                Button MoveSXHigh,fSize=24,fstyle=1,fColor=(1,16019,65535)
3695
3696                Button MoveSYLow,pos={220,260},size={30,50}, proc=IN3S_SurveyButtonProc,title="-",help={"Moves SY lower by the step value"}
3697                Button MoveSYLow,fSize=24,fstyle=1,fColor=(1,16019,65535)
3698                Button MoveSYHigh,pos={360,260},size={30,50}, proc=IN3S_SurveyButtonProc,title="+",help={"Moves SY higher by the step value"}
3699                Button MoveSYHigh,fSize=24,fstyle=1,fColor=(1,16019,65535)
3700
3701
3702                TitleBox Info3 title="\Zr130Sx step : ",pos={50,310},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0,fstyle=1
3703                TitleBox Info4 title="\Zr130Sy step : ",pos={265,310},size={250,15},frame=0,fColor=(0,0,65535),labelBack=0,fstyle=1
3704
3705                SetVariable SurveySXStep,pos={52,330},size={90,20}, limits={0,100, 1}, proc=IN3S_SurveySetVarProc,title=" ",fSize=20
3706                Setvariable SurveySXStep,fStyle=2, variable=root:Packages:SamplePlateSetup:SurveySXStep, help={"SX step"},format="%6.2f"
3707                SetVariable SurveySYStep,pos={262,330},size={90,20}, limits={0,100, 1}, proc=IN3S_SurveySetVarProc,title=" ",fSize=20
3708                Setvariable SurveySYStep,fStyle=2, variable=root:Packages:SamplePlateSetup:SurveySYStep, help={"SY step"},format="%6.2f"
3709
3710
3711                Button ChangeSXStepLow,pos={10,370},size={75,20}, proc=IN3S_SurveyButtonProc,title="x 0.1",fSize=14, help={"Changes SX step by 0.1"}
3712                Button ChangeSXStepHigh,pos={100,370},size={75,20}, proc=IN3S_SurveyButtonProc,title="x 10",fSize=14, help={"Changes SX step by 10"}
3713
3714                Button ChangeSYStepLow,pos={220,370},size={75,20}, proc=IN3S_SurveyButtonProc,title="x 0.1",fSize=14, help={"Changes SX step by 0.1"}
3715                Button ChangeSYStepHigh,pos={310,370},size={75,20}, proc=IN3S_SurveyButtonProc,title="x 10",fSize=14, help={"Changes SX step by 10"}
3716
3717                Button SetSXAs00,pos={50,405},size={70,15}, proc=IN3S_SurveyButtonProc,title="Set SX 0",fSize=14, help={"Sets current position as 0,0"}
3718                Button SetSXAs00 fColor=(65535,32768,32768)
3719                Button SetSYAs00,pos={260,405},size={70,15}, proc=IN3S_SurveyButtonProc,title="Set SY 0",fSize=14, help={"Sets current position as 0,0"}
3720                Button SetSYAs00 fColor=(65535,32768,32768)
3721
3722                Button SyncMotors,pos={10,425},size={105,15}, proc=IN3S_SurveyButtonProc,title="Sync w/epics",fSize=14, help={"Sync all motors positons with epics"}
3723                Button STOPMotors,pos={10,450},size={105,30}, proc=IN3S_SurveyButtonProc,title="STOP motors",fSize=14, help={"STOP ALL MOTORS MOVEMENT"}
3724                Button STOPMotors fColor=(65535,32768,32768)
3725
3726                Button OpenSlitsLarge,pos={250,425},size={135,20}, proc=IN3S_SurveyButtonProc,title="Open Slits Large",fSize=14, help={"Open slits as large as possible"}
3727                Button OpenSlitsUSAXS,pos={250,450},size={135,20}, proc=IN3S_SurveyButtonProc,title="USAXS Slits",fSize=14, help={"Open Slits for USAXS"}
3728                Button OpenSlitsSWAXS,pos={250,475},size={135,20}, proc=IN3S_SurveyButtonProc,title="SWAXS Slits",fSize=14, help={"Open Slits for SAXS/WAXS"}
3729
3730                TitleBox Info5 title="\Zr110NOTE: row numbering is 0 based...",size={355,20},pos={5,485},frame=0,fColor=(0,0,65535),labelBack=0
3731
3732        endif
3733
3734end
3735
3736
3737//*****************************************************************************************************************
3738//*****************************************************************************************************************
3739//************************************************************************************************************
3740//************************************************************************************************************
3741
3742
3743Function IN3S_SurveySetVarProc(sva) : SetVariableControl
3744        STRUCT WMSetVariableAction &sva
3745
3746        switch( sva.eventCode )
3747                case 1: // mouse up
3748                case 2: // Enter key
3749                case 3: // Live update
3750                        Variable dval = sva.dval
3751                        String sval = sva.sval
3752                       
3753                        if(StringMatch(sva.ctrlName, "SelectedRow"))
3754                                NVAR SelectedRow=root:Packages:SamplePlateSetup:SelectedRow
3755                                SVAR SelectedSampleName=root:Packages:SamplePlateSetup:SelectedSampleName
3756                                Wave/T ListWV = root:Packages:SamplePlateSetup:LBCommandWv
3757                                NVAR SampleThickness=root:Packages:SamplePlateSetup:SampleThickness
3758                                NVAR SampleXTAR=root:Packages:SamplePlateSetup:SampleXTAR
3759                                NVAR SampleYTAR=root:Packages:SamplePlateSetup:SampleYTAR
3760                                NVAR SampleXTable = root:Packages:SamplePlateSetup:SampleXTable
3761                                NVAR SampleYTable = root:Packages:SamplePlateSetup:SampleYTable
3762                                NVAR DefSaThick = root:Packages:SamplePlateSetup:DefaultSampleThickness
3763                                if(SelectedRow>DimSize(ListWV,0)-2)
3764                                        IN3S_InsertDeleteLines(4, SelectedRow, 1)
3765                                endif
3766                                SelectedRow=SelectedRow+1
3767                                SelectedSampleName = ListWV[SelectedRow][0]
3768                                //ListBox CommandsList, win=SamplePlateSetup, selrow=SelectedRow
3769                                Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
3770                                LBSelectionWv[][0]=2
3771                                LBSelectionWv[SelectedRow][0]=3
3772                                SampleXTable = str2num(ListWV[SelectedRow][1])
3773                                SampleYTable = str2num(ListWV[SelectedRow][2])
3774                                SampleThickness = str2num(ListWV[SelectedRow][3])
3775                                SampleThickness = numtype(SampleThickness)==0 ? SampleThickness : DefSaThick
3776                                IN3S_AddTagToImage(SelectedRow)
3777                                IN3S_EstimateRunTime()                 
3778                        endif
3779                       
3780                        if(StringMatch(sva.ctrlName, "SampleXTAR"))
3781                                IN3S_BeamlineSurveyStartEpicsUpdate()
3782                                IN3S_MoveMotorInEpics("SX",dval)
3783                        endif
3784                        if(StringMatch(sva.ctrlName, "SampleYTAR"))
3785                                IN3S_BeamlineSurveyStartEpicsUpdate()
3786                                IN3S_MoveMotorInEpics("SY",dval)       
3787                        endif
3788                        if(StringMatch(sva.ctrlName, "SelectedSampleName"))
3789                                SVAR SelectedSampleName = root:Packages:SamplePlateSetup:SelectedSampleName
3790                                SelectedSampleName = CleanupName(sval, 0 , 40)
3791                        endif
3792                        if(StringMatch(sva.ctrlName, "SampleThickness"))
3793                                NVAR SampleThickness = root:Packages:SamplePlateSetup:SampleThickness
3794                                if(dval<0 || dval>20)
3795                                        DoAlert /T="Wrong thickness" 0, "Thickness must be between 0 and 20 [mm]"
3796                                        SampleThickness = DefSaThick
3797                                endif
3798                        endif
3799               
3800                        break
3801                case -1: // control being killed
3802                        break
3803        endswitch
3804
3805        return 0
3806End
3807//*****************************************************************************************************************
3808//*****************************************************************************************************************
3809//************************************************************************************************************
3810//************************************************************************************************************
3811
3812
3813Function IN3S_SurveyButtonProc(ba) : ButtonControl
3814        STRUCT WMButtonAction &ba
3815
3816        switch( ba.eventCode )
3817                case 2: // mouse up
3818                        // click code here
3819                        NVAR SXStep = root:Packages:SamplePlateSetup:SurveySXStep
3820                        NVAR SYStep = root:Packages:SamplePlateSetup:SurveySYStep
3821//                      NVAR CurentSX=root:Packages:SamplePlateSetup:SampleXTAR
3822//                      NVAR CurentSY=root:Packages:SamplePlateSetup:SampleYTAR
3823                        NVAR SampleXTAR = root:Packages:SamplePlateSetup:SampleXTAR
3824                        NVAR SampleYTAR = root:Packages:SamplePlateSetup:SampleYTAR
3825                        NVAR SampleXRBV = root:Packages:SamplePlateSetup:SampleXRBV
3826                        NVAR SampleYRBV = root:Packages:SamplePlateSetup:SampleYRBV
3827                        Wave LBSelectionWv = root:Packages:SamplePlateSetup:LBSelectionWv
3828                        if(StringMatch(ba.ctrlName, "MoveSXLow"))               
3829                                SampleXTAR = SampleXTAR-SXStep
3830                                IN3S_MoveMotorInEpics("SX",SampleXTAR)                 
3831                        endif
3832                        if(StringMatch(ba.ctrlName, "MoveSXHigh"))
3833                                SampleXTAR = SampleXTAR+SXStep
3834                                IN3S_MoveMotorInEpics("SX",SampleXTAR)
3835                        endif
3836                        if(StringMatch(ba.ctrlName, "MoveSYLow"))               
3837                                SampleyTAR = SampleYTAR-SyStep
3838                                IN3S_MoveMotorInEpics("SY",SampleyTAR)
3839                        endif
3840                        if(StringMatch(ba.ctrlName, "MoveSYHigh"))
3841                                SampleyTAR = SampleYTAR+SyStep
3842                                IN3S_MoveMotorInEpics("SY",SampleyTAR)
3843                        endif
3844                        if(StringMatch(ba.ctrlName, "ChangeSXStepLow"))
3845                                SXStep = (SXStep<0.01 || SXStep>100) ? 1 : SXStep
3846                                SXStep = SXStep>0.1 ? SXStep*0.1 : 0.01
3847                        endif
3848                        if(StringMatch(ba.ctrlName, "ChangeSXStepHigh"))
3849                                SXStep = (SXStep<0.01 || SXStep>100) ? 1 : SXStep
3850                                SXStep = SXStep<10 ? SXStep*10 : 100
3851                        endif
3852
3853                        if(StringMatch(ba.ctrlName, "ChangeSYStepLow"))
3854                                SYStep = (SYStep<0.01 || SYStep>100) ? 1 : SYStep
3855                                SYStep = SYStep>0.1 ? SYStep*0.1 : 0.01
3856                        endif
3857                        if(StringMatch(ba.ctrlName, "ChangeSYStepHigh"))
3858                                SYStep = (SYStep<0.01 || SYStep>100) ? 1 : SYStep
3859                                SYStep = SYStep<10 ? SYStep*10 : 100
3860                        endif
3861                       
3862                        if(StringMatch(ba.ctrlName, "GoTo00"))
3863                                SampleXTAR = 0
3864                                SampleYTAR = 0
3865                                IN3S_MoveMotorInEpics("SX",SampleXTAR)
3866                                IN3S_MoveMotorInEpics("SY",SampleYTAR)
3867                        endif
3868                        if(StringMatch(ba.ctrlName, "SyncMotors"))
3869#if(exists("pvOpen")==4)
3870                                variable SxPV, SyPV
3871                                pvOpen/Q SxPV, "9idcLAX:m58:c2:m1.RBV"
3872                                pvOpen/Q SyPV, "9idcLAX:m58:c2:m2.RBV"
3873                                SampleXTAR = IN3S_GetMotorPositions(SxPV)
3874                                SampleYTAR = IN3S_GetMotorPositions(SyPV)
3875                                SampleXRBV = IN3S_GetMotorPositions(SxPV)
3876                                SampleYRBV = IN3S_GetMotorPositions(SyPV)
3877                                pvWait 5
3878                                pvClose SxPV
3879                                pvClose SyPV
3880#endif
3881                        endif
3882                        variable InstrumentUsed
3883                        if(StringMatch(ba.ctrlName, "SetSXAs00"))
3884#if(exists("pvOpen")==4)
3885                                        InstrumentUsed = IN3S_GetPVVariableValue("9idcLAX:dataColInProgress")   
3886                                        if(InstrumentUsed)
3887                                                abort "Instrument is collecting data, cannot move motors"
3888                                        else   
3889                                                //"SX"
3890                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m1.SSET", 1)
3891                                                sleep/T 10
3892                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m1.VAL", 0)
3893                                                sleep/T 10
3894                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m1.SUSE", 1)
3895                                        endif
3896                                SampleXTAR = 0
3897#endif
3898                        endif           
3899                        if(StringMatch(ba.ctrlName, "SetSYAs00"))
3900#if(exists("pvOpen")==4)
3901                                        InstrumentUsed = IN3S_GetPVVariableValue("9idcLAX:dataColInProgress")   
3902                                        if(InstrumentUsed)
3903                                                abort "Instrument is collecting data, cannot move motors"
3904                                        else   
3905                                                //"SY"
3906                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m2.SSET", 1)
3907                                                sleep/T 10
3908                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m2.VAL", 0)
3909                                                sleep/T 10
3910                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m2.SUSE", 1)
3911                                        endif
3912                                SampleYTAR = 0
3913#endif
3914                        endif           
3915                        if(StringMatch(ba.ctrlName, "STOPMotors"))
3916#if(exists("pvOpen")==4)
3917                                        InstrumentUsed = IN3S_GetPVVariableValue("9idcLAX:dataColInProgress")   
3918                                        if(InstrumentUsed)
3919                                                abort "Instrument is collecting data, cannot move motors"
3920                                        else   
3921                                                IN3S_PutEpicsPv("9idcLAX:alltop", 1)
3922                                        endif
3923#endif
3924                        endif           
3925                        variable HorSlit, VertSLit, HorGuardSlit, VertGuardSlit
3926                        if(StringMatch(ba.ctrlName, "OpenSlitsLarge"))
3927#if(exists("pvOpen")==4)
3928                                        InstrumentUsed = IN3S_GetPVVariableValue("9idcLAX:dataColInProgress")   
3929                                        if(InstrumentUsed)
3930                                                abort "Instrument is collecting data, cannot move motors"
3931                                        else   
3932                                                //c2:m8 is Horizontal slit size
3933                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m8.VAL", 2.5)
3934                                                IN3S_PutEpicsPv("9idcLAX:GSlit1H:size", 2.8)
3935                                                //c2:m8 is Vertical slit size
3936                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m7.VAL", 1.2)
3937                                                IN3S_PutEpicsPv("9idcLAX:GSlit1V:size", 1.4)
3938                                        endif
3939#endif
3940                        endif           
3941
3942                        if(StringMatch(ba.ctrlName, "OpenSlitsUSAXS"))
3943#if(exists("pvOpen")==4)
3944                                        InstrumentUsed = IN3S_GetPVVariableValue("9idcLAX:dataColInProgress")   
3945                                        if(InstrumentUsed)
3946                                                abort "Instrument is collecting data, cannot move motors"
3947                                        else   
3948                                                HorSlit = IN3S_GetPVVariableValue("9idcLAX:USAXS_hslit_ap")
3949                                                VertSLit = IN3S_GetPVVariableValue("9idcLAX:USAXS_vslit_ap")
3950                                                HorGuardSlit = IN3S_GetPVVariableValue("9idcLAX:USAXS_hgslit_ap")
3951                                                VertGuardSlit = IN3S_GetPVVariableValue("9idcLAX:USAXS_vgslit_ap")
3952                                                //c2:m8 is Horizontal slit size
3953                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m8.VAL", HorSlit)
3954                                                IN3S_PutEpicsPv("9idcLAX:GSlit1H:size", HorGuardSlit)
3955                                                //c2:m8 is Vertical slit size
3956                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m7.VAL", VertSLit)
3957                                                IN3S_PutEpicsPv("9idcLAX:GSlit1V:size", VertGuardSlit)
3958                                        endif
3959#endif
3960                        endif           
3961                        if(StringMatch(ba.ctrlName, "OpenSlitsSWAXS"))
3962#if(exists("pvOpen")==4)
3963                                        InstrumentUsed = IN3S_GetPVVariableValue("9idcLAX:dataColInProgress")   
3964                                        if(InstrumentUsed)
3965                                                abort "Instrument is collecting data, cannot move motors"
3966                                        else   
3967                                                HorSlit = IN3S_GetPVVariableValue("9idcLAX:SAXS_hslit_ap")
3968                                                VertSLit = IN3S_GetPVVariableValue("9idcLAX:SAXS_vslit_ap")
3969                                                HorGuardSlit = IN3S_GetPVVariableValue("9idcLAX:SAXS_hgslit_ap")
3970                                                VertGuardSlit = IN3S_GetPVVariableValue("9idcLAX:SAXS_vgslit_ap")
3971                                                //c2:m8 is Horizontal slit size
3972                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m8.VAL", HorSlit)
3973                                                IN3S_PutEpicsPv("9idcLAX:GSlit1H:size", HorGuardSlit)
3974                                                //c2:m8 is Vertical slit size
3975                                                IN3S_PutEpicsPv("9idcLAX:m58:c2:m7.VAL", VertSLit)
3976                                                IN3S_PutEpicsPv("9idcLAX:GSlit1V:size", VertGuardSlit)
3977                                        endif
3978#endif
3979                        endif           
3980               
3981                        if(StringMatch(ba.ctrlName, "MoveRowUp"))
3982                                Wave SelWv=root:Packages:SamplePlateSetup:LBSelectionWv
3983                                NVAR SelectedRow=root:Packages:SamplePlateSetup:SelectedRow
3984                                SVAR SelectedSampleName=root:Packages:SamplePlateSetup:SelectedSampleName
3985                                Wave/T ListWV = root:Packages:SamplePlateSetup:LBCommandWv
3986                                NVAR SampleThickness=root:Packages:SamplePlateSetup:SampleThickness
3987                                NVAR SampleXTAR=root:Packages:SamplePlateSetup:SampleXTAR
3988                                NVAR SampleYTAR=root:Packages:SamplePlateSetup:SampleYTAR
3989                                NVAR SampleXTable = root:Packages:SamplePlateSetup:SampleXTable
3990                                NVAR SampleYTable = root:Packages:SamplePlateSetup:SampleYTable
3991                                NVAR DefSaThick = root:Packages:SamplePlateSetup:DefaultSampleThickness
3992                                if(SelectedRow>0)
3993                                        SelectedRow=SelectedRow-1
3994                                        SelWv[][0]=2
3995                                        SelWv[SelectedRow]=3
3996                                        SelectedSampleName = ListWV[SelectedRow][0]
3997                                        //LBSelectionWv[][0]=2
3998                                        //LBSelectionWv[SelectedRow][0]=3
3999                                        SampleXTable = str2num(ListWV[SelectedRow][1])
4000                                        SampleYTable = str2num(ListWV[SelectedRow][2])
4001                                        SampleThickness = str2num(ListWV[SelectedRow][3])
4002                                        SampleThickness = numtype(SampleThickness)==0 ? SampleThickness : DefSaThick
4003                                endif
4004                                IN3S_AddTagToImage(SelectedRow)
4005                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
4006                                WarningForUser = "Moved selected row up"
4007                                IN3S_MoveToPositionIfOK()
4008                                IN3S_EstimateRunTime()
4009                        endif
4010                        if(StringMatch(ba.ctrlName, "MoveRowDown"))
4011                                Wave SelWv=root:Packages:SamplePlateSetup:LBSelectionWv
4012                                NVAR SelectedRow=root:Packages:SamplePlateSetup:SelectedRow
4013                                SVAR SelectedSampleName=root:Packages:SamplePlateSetup:SelectedSampleName
4014                                Wave/T ListWV = root:Packages:SamplePlateSetup:LBCommandWv
4015                                NVAR SampleThickness=root:Packages:SamplePlateSetup:SampleThickness
4016                                NVAR SampleXTAR=root:Packages:SamplePlateSetup:SampleXTAR
4017                                NVAR SampleYTAR=root:Packages:SamplePlateSetup:SampleYTAR
4018                                NVAR SampleXTable = root:Packages:SamplePlateSetup:SampleXTable
4019                                NVAR SampleYTable = root:Packages:SamplePlateSetup:SampleYTable
4020                                NVAR DefSaThick = root:Packages:SamplePlateSetup:DefaultSampleThickness
4021                                if(SelectedRow>DimSize(ListWV,0)-2)
4022                                        IN3S_InsertDeleteLines(4, SelectedRow, 1)
4023                                endif
4024                                SelectedRow=SelectedRow+1
4025                                SelWv[][0]=2
4026                                SelWv[SelectedRow]=3
4027                                SelectedSampleName = ListWV[SelectedRow][0]
4028                                //LBSelectionWv[][0]=2
4029                                //LBSelectionWv[SelectedRow][0]=3
4030                                SampleXTable = str2num(ListWV[SelectedRow][1])
4031                                SampleYTable = str2num(ListWV[SelectedRow][2])
4032                                SampleThickness = str2num(ListWV[SelectedRow][3])
4033                                SampleThickness = numtype(SampleThickness)==0 ? SampleThickness : DefSaThick
4034                                IN3S_AddTagToImage(SelectedRow)
4035                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
4036                                WarningForUser = "Moved selected row down"
4037                                IN3S_MoveToPositionIfOK()
4038                                IN3S_EstimateRunTime()
4039                        endif
4040                        if(StringMatch(ba.ctrlName, "DriveTovals"))
4041                                NVAR SelectedRow=root:Packages:SamplePlateSetup:SelectedRow
4042                                Wave/T ListWV = root:Packages:SamplePlateSetup:LBCommandWv
4043                                NVAR SampleXTable = root:Packages:SamplePlateSetup:SampleXTable
4044                                NVAR SampleYTable = root:Packages:SamplePlateSetup:SampleYTable
4045                                NVAR SampleXTAR = root:Packages:SamplePlateSetup:SampleXTAR
4046                                NVAR SampleYTAR = root:Packages:SamplePlateSetup:SampleYTAR
4047                                SampleXTAR = SampleXTable
4048                                SampleYTAR = SampleYTable
4049                                IN3S_MoveMotorInEpics("SX",SampleXTAR) 
4050                                IN3S_MoveMotorInEpics("SY",SampleYTAR)
4051                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
4052                                WarningForUser = "Moved to sample position from table"
4053                        endif
4054                        if(StringMatch(ba.ctrlName, "SaveValues"))
4055                                NVAR SelectedRow=root:Packages:SamplePlateSetup:SelectedRow
4056                                NVAR SampleThickness=root:Packages:SamplePlateSetup:SampleThickness
4057                                SVAR SelectedSampleName=root:Packages:SamplePlateSetup:SelectedSampleName
4058                                NVAR SampleXRBV=root:Packages:SamplePlateSetup:SampleXRBV
4059                                NVAR SampleYRBV=root:Packages:SamplePlateSetup:SampleYRBV
4060                                Wave/T ListWV = root:Packages:SamplePlateSetup:LBCommandWv
4061                                ListWV[SelectedRow][0] = SelectedSampleName
4062                                ListWV[SelectedRow][1] = num2str(IN2G_RoundDecimalPlaces(SampleXRBV,3))
4063                                ListWV[SelectedRow][2] = num2str(IN2G_RoundDecimalPlaces(SampleYRBV,3))
4064                                ListWV[SelectedRow][3] = num2str(IN2G_RoundDecimalPlaces(SampleThickness,3))
4065                                NVAR SelectedRow=root:Packages:SamplePlateSetup:SelectedRow
4066                                IN3S_AddTagToImage(SelectedRow)
4067                                SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
4068                                WarningForUser = "Saved positions to table"
4069                                NVAR TableIsSaved = root:Packages:SamplePlateSetup:TableIsSaved
4070                                TableIsSaved = 0
4071                                IN3S_FixSaveButton()                           
4072                                IN3S_EstimateRunTime()
4073                        endif
4074                        break
4075                case -1: // control being killed
4076                        break
4077        endswitch
4078
4079        return 0
4080End
4081//*****************************************************************************************************************
4082//*****************************************************************************************************************
4083//*****************************************************************************************************************
4084Function IN3S_MoveToPositionIfOK()
4085        //moves to SX and SY on row change, if OK
4086        //root:Packages:SamplePlateSetup:MoveWhenRowChanges = 1
4087        //panel BeamlinePlateSetup exists
4088        DoWindow BeamlinePlateSetup
4089        if(V_Flag)      //exists
4090                NVAR ShouldMove=root:Packages:SamplePlateSetup:MoveWhenRowChanges
4091                if(ShouldMove)
4092                        NVAR SampleXTAR=root:Packages:SamplePlateSetup:SampleXTAR
4093                        NVAR SampleYTAR=root:Packages:SamplePlateSetup:SampleYTAR
4094                        NVAR TableSX=root:Packages:SamplePlateSetup:SampleXTable
4095                        NVAR TableSY=root:Packages:SamplePlateSetup:SampleYTable
4096                        if(numtype(TableSX)==0 && numtype(TableSY)==0) //are these numbers?
4097                                SampleXTAR = TableSX
4098                                SampleYTAR = TableSY
4099                                IN3S_MoveMotorInEpics("SX",TableSX)
4100                                IN3S_MoveMotorInEpics("SY",TableSY)     
4101                                //SVAR WarningForUser = root:Packages:SamplePlateSetup:WarningForUser
4102                                //WarningForUser = "Moving to SX and SY position read from Table"
4103                        endif
4104                endif
4105        endif
4106end
4107//*****************************************************************************************************************
4108//************************************************************************************************************
4109//************************************************************************************************************
4110
4111static Function IN3S_MoveMotorInEpics(WhichMotor,MovePosition)
4112        string WhichMotor               //SX or SY
4113        variable MovePosition   
4114        //avoid moving if instrument is running, 9idcLAX:dataColInProgress = 1
4115        variable InstrumentUsed=0
4116#if(exists("pvOpen")==4)
4117        InstrumentUsed = IN3S_GetPVVariableValue("9idcLAX:dataColInProgress")   
4118        if(InstrumentUsed)
4119                abort "Instrument is collecting data, cannot move motors"
4120        else   
4121                if(stringMatch(WhichMotor,"SX"))
4122                        IN3S_PutEpicsPv("9idcLAX:m58:c2:m1.VAL", MovePosition)
4123                elseif(stringMatch(WhichMotor,"SY"))
4124                        IN3S_PutEpicsPv("9idcLAX:m58:c2:m2.VAL", MovePosition)
4125                endif
4126        endif
4127#else
4128        print "Could not move motors, no epics installed"
4129#endif
4130end
4131//*****************************************************************************************************************
4132//*****************************************************************************************************************
4133//************************************************************************************************************
4134//************************************************************************************************************
4135
4136static Function IN3S_PutEpicsPv(PVAddress, target)      //note, this waits until motor is done moving...
4137        string PVAddress
4138        variable target
4139#if(exists("pvOpen")==4)
4140        variable sxRBV
4141        pvOpen/T=5 sxRBV, PVAddress                             // /T is timeout, should wait only this timeout.
4142        pvPutNumber/Q sxRBV, target                             // /Q returns immediately, else waits until completion. 
4143        pvClose sxRBV
4144#endif 
4145end
4146
4147//*****************************************************************************************************************
4148//*****************************************************************************************************************
4149
4150//                            E N D     B E A M L I N E    S U R V E Y    C O D E
4151
4152//*****************************************************************************************************************
4153//*****************************************************************************************************************
4154
4155//Function IN3S_ExportHookFunction(Command, SampleName,SX, SY, Thickness, MD)
4156//      string Command, SampleName,SX, SY, Thickness, MD
4157//      //this hook function will modify output of the command file for given line. This needs to be cutomized for specific need.
4158//      SVAR nbl=root:Packages:SamplePlateSetup:NotebookName
4159//
4160//      //in this case it will write each command in notebook multiple times, in original position and then +/- 1mm in sx and sy
4161//      //center       
4162//      Notebook $nbl text="      "+Command+"        "+SX+"      "+SY+"      "+Thickness+"      \""+SampleName+"\"  \r"
4163//      //and now the variations, only if Sample Name is NOT Blank or Empty
4164//      if(!StringMatch(SampleName, "*Blank*")&&!StringMatch(SampleName, "*Empty*"))
4165//              string TempStr
4166//              TempStr = num2str(str2num(SX)-1)
4167//              Notebook $nbl text="      "+Command+"        "+TempStr+"      "+SY+"      "+Thickness+"      \""+SampleName+"_R"+"\"  \r"
4168//              TempStr = num2str(str2num(SX)+1)
4169//              Notebook $nbl text="      "+Command+"        "+TempStr+"      "+SY+"      "+Thickness+"      \""+SampleName+"_L"+"\"  \r"
4170//              TempStr = num2str(str2num(SY)-1)
4171//              Notebook $nbl text="      "+Command+"        "+SX+"      "+TempStr+"      "+Thickness+"      \""+SampleName+"_B"+"\"  \r"
4172//              TempStr = num2str(str2num(SY)+1)
4173//              Notebook $nbl text="      "+Command+"        "+SX+"      "+TempStr+"      "+Thickness+"      \""+SampleName+"_T"+"\"  \r"
4174//      endif   
4175//end
Note: See TracBrowser for help on using the repository browser.