-
Notifications
You must be signed in to change notification settings - Fork 2
/
SLPA_ce20170418a.ipf
13009 lines (10163 loc) · 417 KB
/
SLPA_ce20170418a.ipf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
//SLPA
// - Load_LEEMDAT_ce20170226a.ipf
// - SLP_NEXAFS_ce20170104a.ipf
// - DispXPS_Panel_ce20170302f.ipf
// - ImgXPS_Panel_ce20170321e.ipf
// - SLP_Util_ce20170226a.ipf
//ver. ce20170104a
// - Add SLP_Load_oldLEEM_Img() - Load old .DAT file from Elmitec LEEM (before 2014)
//ver. ce20161216a
// - Add image creation date/time in the param list
//ver. ce20161215c
// - Add Image notes
// - Some cosmetic changes
// - Bug fix on deleting many DataSet
//ver. ce20161215b
// - Delete dataset is available. It warns when some images are in used. Dataset won't be deleted in that case.
//ver. ce20161214a
// - Cross-hair in the Find screen dialog (only if the x-y scale is not set). Values of new x_center and y_center can be manually changed.
// - Change Plot single image button to Plot fullsize image (required that the data file is accessible). Plot single image still works with double clicking the image name in the list
//ver. ce20161210a
// - Stitch - ROI can be modified. Mask creation window also shows selected image behind the mask.
//ver. ce20161209a
// - Add functions to scale images, find screen position, and image stitching
// - Plot the displayed image w/ description legend
// - Export selected images to TIFF files in selected folder w/ a .csv file containing image details
//[from Stitch .ipf Ver. ce20161128a.ipf
// - Work with LoadLEEM .ipf
// - Set scale for selected images in the dataset. Scale can be pixel, relative or absolute (offset with Mitutoyo X,Y reading).
//Ver. ce20161207a.ipf
// - Stitching almost works. Need algorithm for some FOV adjustment (e.g. 75um FOV is not really
//ver. ce20161119a
// - Load images (.DAT) in batch. Read and store important LEEM/PEEM parameters from the header of the image file
//ver.ce20161123a
// - User interface
// - Load sets of image and automatically save the image set.
//ver.ce20161124a
// - Bug fixed - solve the problem when the some image number is missing. Change the search algorithm in the SLP_LL_setup function (now ver.2)
// - Record no. of images in the 4th column of DatasetListW
// - Cosmetic change to the image plot display
//ver. ce20161126a
// - New dataset selection and display automatically after loading
// - Default resize option is 0.25 and is kept afterward
// - Bug fixed - parameter display update
// - Dataset name suggestion using folder name
//ver. ce20161127a
// - Warn when users use duplicated dataset name
//ver. ce20161127b
// - Remove the 128 dataset limit. ImgSetListW size is increased with added datasets
// - use 'row=" in the ListBox selection so that the selection is always visible when switching between datasets
// - Prevent users from clicking outside the range in Image and DataSet listboxes
//ver. ce20161127c
// - Image/dataset selection with SelWave
// - Select all/select none buttons for image list
//ver. ce20161127d
// - Image ctab (colour/first colour/last colour)is retained for the next image selection. It is saved for the next time the program is run
//ver. ce20170226a
// - Add new image load panel. The multiple image loading is easier and more efficient.
// - Bug fix on the deleting datasets (the previous version doesn't use /TXOP=6 in the FindValue so the deletion had been wrong
//Todos
// - New Loading dialog (SLP_LoadImg_Panel)
// + Bug fixes
// - Editable note column for images and dataset
// - Load TIFF&other file types as well
// - Should discriminate the LEED/Disp. mode and prevent program from interrupting the processes
// - Error when all datasets are deleted
// + Functionality
// - Report making
// - Record time when images have been captured
//Menu "SLP"
//"Initialize",SLP_InitProgram()
//"XPS analysis", SLP_create_DispXPS_01()
//End
Menu "SLP"
"Load LEEM images..",SLP_LL_CreatePanel01()
End
Function SLP_LL_CreatePanel01()
//Check whether initiallization is needed
If (!DataFolderExists("root:Package_SLP:LoadLEEM" ))
SLP_LoadLEEM_init()
slp_Stitch_Init()
SLP_Util_Init()
Endif
wave /T SLP_ImgParamColDescrptn=root:Package_SLP:LoadLEEM:SLP_ImgParamColDescrptn
wave /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
wave SLP_ImgSetListSelW=root:Package_SLP:LoadLEEM:SLP_ImgSetListSelW
NVAR LoadLEEM_Sel=root:Package_SLP:LoadLEEM:LoadLEEM_Sel
NVAR LL_InitFlg=root:Package_SLP:LoadLEEM:LL_InitFlg
NVAR Dataset_Sel=root:Package_SLP:LoadLEEM:Dataset_Sel
DoWindow/K SLP_LL_01
NewPanel /W=(200,90,1000,610) /N=SLP_LL_01
//ShowTools/A
//SetDrawLayer UserBack
//DrawRect 38,43,330,266
Display /HOST=SLP_LL_01 /N=SLP_LL_01_ImPlot /W=(20,40,330,270)
ModifyGraph tick=3,noLabel=2
ModifyGraph width=0,height=0
ModifyGraph standoff=0
Button Button_DelDataSet,pos={650,10},size={130,20}, Fsize=10,title="Delete selected datasets",proc=ButtonProc_LL_DelDataSet
Button Button_FindScreenPos,pos={370,130},size={130,20}, Fsize=10,title="Find screen position..",proc=ButtonProc_LL_FindScreen
Button Button_SetScale,pos={370,155},size={130,20},Fsize=10,title="Set scale..", proc=ButtonProc_LL_SetScale
Button Button_Stitch,pos={370,180},size={130,20},Fsize=10,title="Stitch images..", proc=ButtonProc_LL_Stitch
Button Button_LoadFullSize,pos={370,215},size={130,20},Fsize=10,title="Load fullsize image", proc=ButtonProc_LL_LoadFullSize
Button Button_ExportSelImg,pos={370,240},size={130,20},Fsize=10,title="Export selected images..",proc=ButtonProc_LL_ExportSelImg
Button Button_CreateReport,pos={370,265},size={130,20},Fsize=10,title="Create report.."
Button Button_LoadImg,pos={20,280},size={115,20},Fsize=10,title="Load image set..", proc=ButtonProc_LL_LoadImg
Button Button_SelAll,pos={150,280},size={90,20},Fsize=10,title="Select all", proc=ButtonProc_LL_SelAll
Button Button_SelNone,pos={245,280},size={90,20},Fsize=10,title="Select none", proc=ButtonProc_LL_SelNone
Button Button_Done,pos={725,490},size={50,20},title="Done", proc=ButtonProc_LL_done
TitleBox SLP_LLP_TitleBox_Main,pos={330,10},size={210,20},title="LEEM/PEEM Image Browser"
TitleBox SLP_LLP_TitleBox_Main,fSize=16,frame=0
TitleBox SLP_LLP_TitleBox_Main1,pos={556,22},size={66,16},title="Dataset list"
TitleBox SLP_LLP_TitleBox_Main1,fSize=12,frame=0
TitleBox SLP_LLP_Titlebox_Descriptions, fsize=9, frame=0, pos={20,485},title="Double click wave name to display image in a separate window"
ListBox list0,pos={20,305},size={750,177}
ListBox list0,titleWave=SLP_ImgParamColDescrptn,mode= 2,selRow= 0
ListBox list0,widths={35,150,50,50,50,50,40,40,50,50,70,50,70,250,85,85}
ListBox list0,userColumnResize= 1
ListBox list0, proc=ListBoxProc_LL_ImgList
//ListBox list0, selWave=SLP_ImgParamListSelW
ListBox list1,pos={550,40},size={220,255}
ListBox list1,listWave=SLP_ImgSetListW
ListBox list1,mode= 2,selRow= 0
ListBox list1 widths={35,76,48,60}
ListBox list1,userColumnResize= 1
ListBox list1,titleWave=root:Package_SLP:LoadLEEM:SLP_DatasetColDescrptn
ListBox list1, proc=ListBoxProc_LL_DatasetList
ListBox list1, selrow=Dataset_Sel
ListBox list1, selWave=SLP_ImgSetListSelW
NVAR ce_X=root:Package_SLP:LoadLEEM:ce_X
NVAR ce_Y=root:Package_SLP:LoadLEEM:ce_Y
NVAR ce_SampleTemp=root:Package_SLP:LoadLEEM:ce_SampleTemp
SVAR ce_FOV1=root:Package_SLP:LoadLEEM:ce_FOV1
SVAR ce_Notes=root:Package_SLP:LoadLEEM:ce_Notes
SVAR ce_Date=root:Package_SLP:LoadLEEM:ce_Date
TitleBox SLP_LLP_TitleBox_02, pos={350,40},frame=0,title="Image parameters:"
Setvariable SetVar_X,pos={350,60},size={80,15},limits={-inf,inf,0},title="x:",value=ce_X,noedit=1
Setvariable SetVar_Y,pos={435,60},size={80,15},limits={-inf,inf,0},title="y:",value=ce_Y,noedit=1
Setvariable SetVar_SampleTemp,pos={350,80},size={80,15},limits={-inf,inf,0},title="Temp:",value=ce_SampleTemp,noedit=1
Setvariable SetVar_FOV1,pos={435,80},size={80,15},title="FOV:",value=ce_FOV1,noedit=1
Setvariable SetVar_Date,pos={350,100},size={180,15},title=" ",value=ce_Date,noedit=1,frame=0
Setvariable SetVar_notes,pos={20,15},size={300,15},title="Image notes:",value=ce_Notes,proc=SetVarProc_ImgNotes
//SetVariable setvar0,pos={387,149},size={50,19},fSize=12
//SetVariable setvar0,limits={-inf,inf,0},noedit= 1
//string DataSetName=SLP_ImgSetListW[LoadLEEM_Sel][1]
SVAR CurrentDataSet=root:Package_SLP:LoadLEEM:CurrentDataSet
If (LL_InitFlg==0)
string Pkg_Location="root:Package_SLP:LoadLEEM:"+CurrentDataSet
string ImgList_Fname=Pkg_Location+":SLP_ImgListW"
string ImgParam_Fname=Pkg_Location+":SLP_ImgParamListW"
string ImgParamSel_Fname=Pkg_Location+":SLP_ImgParamListSelW"
wave /T SLP_ImgListW=$ImgList_Fname
wave /T SLP_ImgParamListW=$ImgParam_Fname
wave SLP_ImgParamListSelW=$ImgParamSel_Fname
Wave /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
SLP_LL_PlotImage(SLP_ImgListW[LoadLEEM_sel][3],SLP_ImgListW[LoadLEEM_sel][2])
ListBox list0,listWave=SLP_ImgParamListW
ListBox list0, selWave=SLP_ImgParamListSelW
ListBox list0,selRow=LoadLEEM_sel
ListBox list0, selWave=SLP_ImgParamListSelW
Endif
End
Function SLP_Load_oldLEEM_Img()
//Load old .DAT file from Elmitec LEEM (before 2014)
//Positions (in bytes) for image size and image data (can be found from U-View manual)
variable ImWidth_Location=40
variable ImHeight_Location=42
variable ImageData_Location=392
variable ce_RefNum
String fileFilters = "Data Files (*.dat):.dat;"
open /R /F=fileFilters ce_RefNum
string ce_FileName=S_fileName
ce_FileName=stringfromlist(itemsinlist(S_fileName,":")-1,S_fileName,":")
ce_FileName=stringfromlist(0,ce_FileName,".")
variable ce_ImWidth=0
variable ce_ImHeight=0
fsetpos ce_RefNum,ImWidth_Location
fbinread /F=2 ce_RefNum, ce_ImWidth
fsetpos ce_RefNum,ImHeight_Location
fbinread /F=2 ce_RefNum, ce_ImHeight
string ImgW_Name=ce_FileName
Prompt ImgW_Name, "Image wave name:"
DoPrompt "Enter",ImgW_Name
make /O /N=(ce_ImWidth,ce_ImHeight) $ImgW_Name /WAVE=ImgW
fsetpos ce_RefNum,ImageData_Location
fbinread /F=2 ce_RefNum,ImgW
Close ce_RefNum
NewImage ImgW
End
Function SLP_LL_DataSetSelect(DataSet_Row)
variable DataSet_Row
string SelectedDataSetName
//Plot the new image and select the new dataset
//NVAR N_Datasets=root:Package_SLP:LoadLEEM:N_Datasets
SVAR CurrentDataset=root:Package_SLP:LoadLEEM:CurrentDataset
NVAR LoadLEEM_Sel=root:Package_SLP:LoadLEEM:LoadLEEM_Sel
NVAR DataSet_Sel=root:Package_SLP:LoadLEEM:DataSet_Sel
wave /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
string DataSetName=SLP_ImgSetListW[DataSet_Row][1]
string Pkg_Location="root:Package_SLP:LoadLEEM:"+DataSetName
string ImgList_Fname=Pkg_Location+":SLP_ImgListW"
string ImgParam_Fname=Pkg_Location+":SLP_ImgParamListW"
string ImgParamSel_Fname=Pkg_Location+":SLP_ImgParamListSelW"
wave /T SLP_ImgListW=$ImgList_Fname
wave /T SLP_ImgParamListW=$ImgParam_Fname
wave SLP_ImgParamListSelW=$ImgParamSel_Fname
string LLSel_Recall_Fname=Pkg_Location+":LoadLEEM_Sel_Recall"
NVAR LoadLEEM_Sel_Recall=$LLSel_Recall_Fname
//Make selection for List0 (Image list)
ListBox list0,listwave= SLP_ImgParamListW,selRow=LoadLEEM_Sel_Recall,Row=LoadLEEM_Sel_Recall,selWave=SLP_ImgParamListSelW
LoadLEEM_Sel=LoadLEEM_Sel_Recall
//Make selection for List1 (Dataset list)
ListBox list1,selRow=DataSet_Row
CurrentDataset=SLP_ImgSetListW[DataSet_Row][1]
Dataset_Sel=DataSet_Row
//Plot the image (the first one in the new dataset)
SLP_LL_PlotImage(SLP_ImgListW[LoadLEEM_Sel_Recall][3],SLP_ImgListW[LoadLEEM_Sel_Recall][2])
End
Function ButtonProc_LL_DelDataSet(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
// click code here
DoAlert 1,"Delete selected dataset(s)?"
if (V_flag==1)
NVAR Dataset_Sel=root:Package_SLP:LoadLEEM:Dataset_Sel
wave SLP_ImgSetListSelW=root:Package_SLP:LoadLEEM:SLP_ImgSetListSelW
//Change dataset selection if the current one is going to be delected
if (SLP_ImgSetListSelW[Dataset_Sel][0]==48)
//Find the first non-selected DataSet from the top
variable i=0
For (i=0;i<dimsize(SLP_ImgSetListSelW,0)&&SLP_ImgSetListSelW[i][0]==48;i+=1)
DoUpdate
Endfor
//i is now the index of the first non-selected DataSet
If (i<dimsize(SLP_ImgSetListSelW,0))
SLP_LL_DataSetSelect(i)
Else //All datasets have been selected
SLP_LoadLEEM_Init()
Endif
Endif
SLP_LL_DelDataSetBatch()
endif
break
case -1: // control being killed
break
endswitch
return 0
End
Function SLP_LL_DelDataSetBatch()
//Modified 20170226 by CE
WAVE /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
WAVE SLP_ImgSetListSelW=root:Package_SLP:LoadLEEM:SLP_ImgSetListSelW
variable i=0
string DataSetName=""
string DeleteList=""
variable Del_error=0
string Error_txt=""
For (i=0;i<dimsize(SLP_ImgSetListW,0)&&Del_error==0;i+=1)
if (SLP_ImgSetListSelW[i][0]==48) //If the check box is checked
//Deleting the dataset [CODE:SLP_LL_DelDataSet]
DataSetName=SLP_ImgSetListW[i][1]
Del_error=SLP_LL_DelDataSet(DataSetName)
i-=1 //Go back one row
//Add the index of the dataset to be deleted in the DataSet list
If (Del_error!=0) //If imageset folder cannot be deleted, generate an error message
Error_txt="Error deleting dataset: "+DataSetName+"\r Images in the dataset are being used somewhere in the current project"
DoAlert 0,Error_txt
EndIf
Endif
Endfor
End
Function SLP_LL_DelDataSet(DataSetName)
string DataSetName
// - DataSet name as the input parameter and not the row position
// - Delete data folder, and modify the ListW in Pkg folder
// - The function returen Error_Flg
//Modified 20170226 by CE
WAVE /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
WAVE SLP_ImgSetListSelW=root:Package_SLP:LoadLEEM:SLP_ImgSetListSelW
NVAR N_datasets=root:Package_SLP:LoadLEEM:N_datasets
FindValue /TEXT=DataSetName /TXOP=6 SLP_ImgSetListW
variable col=floor(V_value/dimsize(SLP_ImgSetListW,0))
variable row=V_value-col*dimsize(SLP_ImgSetListW,0)
string Pkg_Location="root:Package_SLP:LoadLEEM:"+DataSetName
string ImgList_Fname=Pkg_Location+":SLP_ImgListW"
wave /T ImgListW=$ImgList_Fname
string Img_Location=ImgListW[0][2]
killDataFolder /Z $Img_Location
variable DeleteImgError_Flg=V_Flag
if (DeleteImgError_Flg==0)
//Only delete package folder if Image folder can be deleted
killDataFolder /Z $Pkg_Location
//Remove the row from SLP_ImgSetListW
DeletePoints row,1, SLP_ImgSetListW
DeletePoints row,1, SLP_ImgSetListSelW
//Update the number of DataSets
N_datasets-=1
Endif
Return DeleteImgError_Flg
End
Function ButtonProc_LL_SetScale(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
// click code here
Create_SetScale_Panel()
break
case -1: // control being killed
break
endswitch
return 0
End
Function ButtonProc_LL_LoadFullSize(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
// click code here
SLP_LoadFullSize()
break
case -1: // control being killed
break
endswitch
return 0
End
Function ListBoxProc_LL_ImgList(lba) : ListBoxControl
STRUCT WMListboxAction &lba
Variable row = lba.row
Variable col = lba.col
WAVE/T/Z listWave = lba.listWave
WAVE/Z selWave = lba.selWave
SVAR CurrentDataSet=root:Package_SLP:LoadLEEM:CurrentDataSet
NVAR LoadLEEM_Sel=root:Package_SLP:LoadLEEM:LoadLEEM_Sel
string LoadLEEM_Sel_Recall_FName="root:Package_SLP:LoadLEEM:"+CurrentDataSet+":LoadLEEM_Sel_Recall"
NVAR LoadLEEM_Sel_Recall=$LoadLEEM_Sel_Recall_FName
string Pkg_Location="root:Package_SLP:LoadLEEM:"+CurrentDataSet
string ImgList_Fname=Pkg_Location+":SLP_ImgListW"
string ImgParam_Fname=Pkg_Location+":SLP_ImgParamListW"
wave /T SLP_ImgListW=$ImgList_Fname
wave /T SLP_ImgParamListW=$ImgParam_Fname
wave /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
if (row>=0&&row<dimsize(SLP_ImgParamListW,0))
String ImageName=SLP_ImgListW[row][3]
String ImageLocation=SLP_ImgListW[row][2]
//string Full_ImageName=ImageLocation+":"+ImageName
switch( lba.eventCode )
case -1: // control being killed
break
case 4: // mouse down
LoadLEEM_Sel=row
LoadLEEM_Sel_Recall=row
SLP_LL_PlotImage(ImageName,ImageLocation)
break
case 3: // double click
LoadLEEM_Sel=row
LoadLEEM_Sel_Recall=row
SLP_LL_PlotImage(ImageName,ImageLocation)
SLP_LL_PlotSingleImg()
break
//case 4: // cell selection
case 5: // cell selection plus shift key
break
case 6: // begin edit
break
case 7: // finish edit
break
case 13: // checkbox clicked (Igor 6.2 or later)
break
endswitch
Else
ListBox List0, SelRow=LoadLEEM_Sel
endif
return 0
End
Function ButtonProc_LL_ExportSelImg(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
// click code here
SLP_LL_ExportSelImg()
break
case -1: // control being killed
break
endswitch
return 0
End
Function SLP_LL_ExportSelImg()
SVAR CurrentDataSet=root:Package_SLP:LoadLEEM:CurrentDataSet
string Pkg_Location="root:Package_SLP:LoadLEEM:"+CurrentDataSet
string ImgList_Fname=Pkg_Location+":SLP_ImgListW"
string ImgParam_Fname=Pkg_Location+":SLP_ImgParamListW"
string ImgParamSel_Fname=Pkg_Location+":SLP_ImgParamListSelW"
wave /T SLP_ImgListW=$ImgList_Fname
wave /T SLP_ImgParamListW=$ImgParam_Fname
wave /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
wave SLP_ImgParamListSelW=$ImgParamSel_Fname
wave SLP_ImgSetListSelW=root:Package_SLP:LoadLEEM:SLP_ImgSetListSelW
//Choose folder to save image files
GetFileFolderInfo /D/Q
NewPath /O/Q PathName, S_Path //Create SYMBOLIC path (cannot use normal text for path!)
//Prepare textwave to convert to .csv file
make /T/O /N=(1,dimsize(SLP_ImgParamListW,1)) SLP_ImgParamExpW
wave SLP_ImgParamColDescrptn=root:Package_SLP:LoadLEEM:SLP_ImgParamColDescrptn
duplicate /T/O SLP_ImgParamColDescrptn, SLP_ImgParamColDescrptn_tmp
redimension /N=(1,dimsize(SLP_ImgParamColDescrptn,0)) SLP_ImgParamColDescrptn_tmp
SLP_ImgParamExpW[0][]=SLP_ImgParamColDescrptn_tmp[0][q]
killwaves SLP_ImgParamColDescrptn_tmp
//Load selected images
variable i=0
variable j=1
string FileName=""
string ImgFName=""
For (i=0;i<dimsize(SLP_ImgListW,0);i+=1)
if (SLP_ImgParamListSelW[i][0]==48)
ImgFName=SLP_ImgListW[i][2]+SLP_ImgListW[i][3]
wave ImgW=$ImgFName
FileName=SLP_ImgListW[i][3]+".TIFF"
//Filename="test"+num2str(i)
ImageSave /IGOR /T="tiff" /P=PathName ImgW as FileName //(cannot use normal text for path!)
redimension /N=(dimsize(SLP_ImgParamExpW,0)+1,dimsize(SLP_ImgParamExpW,1)) SLP_ImgParamExpW
SLP_ImgParamExpW[j][]=SLP_ImgParamListW[i][q]
j+=1
Endif
Endfor
//Create .csv file w/ image details
//edit SLP_ImgParamExpW
string out_name="Parameter_List_"+CurrentDataSet+".csv"
Save/G /O /M="\n" /P=PathName SLP_ImgParamExpW as out_name
killwaves SLP_ImgParamExpW
End
Function SLP_LL_PlotSingleImg()
SVAR CurrentDataSet=root:Package_SLP:LoadLEEM:CurrentDataSet
string Pkg_Location="root:Package_SLP:LoadLEEM:"+CurrentDataSet
string ImgList_Fname=Pkg_Location+":SLP_ImgListW"
string ImgParam_Fname=Pkg_Location+":SLP_ImgParamListW"
wave /T SLP_ImgListW=$ImgList_Fname
wave /T SLP_ImgParamListW=$ImgParam_Fname
wave /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
wave SLP_ImgSetListSelW=root:Package_SLP:LoadLEEM:SLP_ImgSetListSelW
NVAR LoadLEEM_Sel=root:Package_SLP:LoadLEEM:LoadLEEM_Sel
NVAR Dataset_Sel=root:Package_SLP:LoadLEEM:Dataset_Sel
String ImgW_FName=SLP_ImgListW[LoadLEEM_Sel][2]+SLP_ImgListW[LoadLEEM_Sel][3]
wave ImgW=$ImgW_FName
String ImgLabel_L1="Image wave name: "+SLP_ImgListW[LoadLEEM_Sel][3]
String ImgLabel_L2="(x,y): ("+SLP_ImgParamListW[LoadLEEM_Sel][2]+"mm ,"+SLP_ImgParamListW[LoadLEEM_Sel][3]+"mm), FOV: "+SLP_ImgParamListW[LoadLEEM_Sel][5]
String ImgLabel_L3="Temperature: "+SLP_ImgParamListW[LoadLEEM_Sel][4]+ "。"
NewImage ImgW
//ModifyGraph margin(bottom)=60
Legend /A=RB "\Z08"+ImgLabel_L1+"\r"+ImgLabel_L2+"\r"+ImgLabel_L3
End
Function ListBoxProc_LL_DatasetList(lba) : ListBoxControl
STRUCT WMListboxAction &lba
Variable row = lba.row
Variable col = lba.col
WAVE/T/Z listWave = lba.listWave
WAVE/Z selWave = lba.selWave
SVAR CurrentDataSet=root:Package_SLP:LoadLEEM:CurrentDataSet
NVAR Dataset_sel=root:Package_SLP:LoadLEEM:Dataset_sel
wave /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
string Sel_Recall_Name="root:Package_SLP:LoadLEEM:"+CurrentDataSet+":LoadLEEM_Sel_Recall"
NVAR LoadLEEM_Sel_Recall=$Sel_Recall_Name
NVAR LoadLEEM_Sel=root:Package_SLP:LoadLEEM:LoadLEEM_Sel
LoadLEEM_Sel_Recall=LoadLEEM_Sel
if (row!=-1&&row<dimsize(SLP_ImgSetListW,0)) //Prevent users from clicking outside the SLP_ImgSetListW's range
switch( lba.eventCode )
case -1: // control being killed
break
case 4: // mouse down
CurrentDataSet=SLP_ImgSetListW[row][1]
Dataset_Sel=row
string ImageParamListW_FName="root:Package_SLP:LoadLEEM:"+CurrentDataSet+":SLP_ImgParamListW"
string ImageListW_FName="root:Package_SLP:LoadLEEM:"+CurrentDataSet+":SLP_ImgListW"
Sel_Recall_Name="root:Package_SLP:LoadLEEM:"+CurrentDataSet+":LoadLEEM_Sel_Recall"
NVAR LoadLEEM_Sel_Recall=$Sel_Recall_Name
LoadLEEM_Sel=LoadLEEM_Sel_Recall
wave /T SLP_ImgParamListW=$ImageParamListW_FName
wave /T SLP_ImgListW=$ImageListW_FName
ListBox list0,listWave=SLP_ImgParamListW,selRow=LoadLEEM_Sel,Row=LoadLEEM_Sel
string Pkg_Location="root:Package_SLP:LoadLEEM:"+CurrentDataSet
string ImgParamSel_Fname=Pkg_Location+":SLP_ImgParamListSelW"
wave SLP_ImgParamListSelW=$ImgParamSel_Fname
ListBox list0, selWave=SLP_ImgParamListSelW
SLP_LL_PlotImage(SLP_ImgListW[LoadLEEM_Sel][3],SLP_ImgListW[LoadLEEM_Sel][2])
break
case 3: // double click
break
//case 4: // cell selection
case 5: // cell selection plus shift key
break
case 6: // begin edit
break
case 7: // finish edit
break
case 13: // checkbox clicked (Igor 6.2 or later)
break
endswitch
else
Listbox List1, SelRow=Dataset_Sel
endif
return 0
End
Function SLP_LL_PlotImage(ImageName,ImageLocation)
string ImageName
string ImageLocation
SVAR CurrentImageName=root:Package_SLP:LoadLEEM:CurrentImageName
SVAR LL_ImgColour=root:Package_SLP:LoadLEEM:LL_ImgColour
//SVAR Image_Location=root:Package_SLP:LoadLEEM:LoadLEEM_ImgLoc
//Check whether the plot is blank
variable N_images=itemsinlist(ImageNameList("SLP_LL_01#SLP_LL_01_ImPlot",";"))
string FullImageName=ImageLocation+ImageName
string PlotName="SLP_LL_01#SLP_LL_01_ImPlot"
If (N_images!=0) //If the image plot is not empty
if (!stringmatch(ImageName,CurrentImageName)) //If the same image is already there - don't do anything
//Accquire the colour setting of the previous image
string prev_ImgInfo=imageinfo(PlotName,CurrentImageName,0)
string prev_ImgColour=stringfromlist(1,greplist(prev_ImgInfo,"RECREATION",0,";"),":")
prev_ImgColour=RemoveEnding(prev_ImgColour) //Remove ';' at the end
LL_ImgColour=prev_ImgColour //Save the image colour settings
Appendimage /W=$PlotName $FullImageName;delayupdate
Execute "ModifyImage /W="+PlotName+" "+ImageName +" "+ prev_ImgColour + ";Delayupdate"//Need to use Execute command
//ModifyImage /W=$PlotName $ImageName ctab= {45,90,Terrain,0};delayupdate
removeimage /W=$PlotName $CurrentImageName //Remove previous image
Endif
Else
Appendimage /W=$PlotName $FullImageName;delayupdate
Execute "ModifyImage /W="+PlotName+" "+ImageName +" "+ LL_ImgColour + ";Delayupdate"//Need to use Execute command
//ModifyImage /W=$PlotName $ImageName ctab= {45,90,Terrain,0};delayupdate
Endif
ModifyGraph /W=$PlotName standoff=0
ModifyGraph /W=$PlotName fSize=7
SetAxis /W=$PlotName/A/R left
ModifyGraph /W=$PlotName minor=1
CurrentImageName=ImageName
//Display the important parameters
NVAR LoadLEEM_sel=root:Package_SLP:LoadLEEM:LoadLEEM_sel
SVAR CurrentDataSet=root:Package_SLP:LoadLEEM:CurrentDataSet
string SLP_ImgParamListW_FName="root:Package_SLP:LoadLEEM:"+CurrentDataSet+":SLP_ImgParamListW"
Wave /T SLP_ImgParamListW=$SLP_ImgParamListW_FName
NVAR ce_X=root:Package_SLP:LoadLEEM:ce_X
NVAR ce_Y=root:Package_SLP:LoadLEEM:ce_Y
NVAR ce_SampleTemp=root:Package_SLP:LoadLEEM:ce_SampleTemp
SVAR ce_FOV1=root:Package_SLP:LoadLEEM:ce_FOV1
SVAR ce_notes=root:Package_SLP:LoadLEEM:ce_notes
SVAR ce_Date=root:Package_SLP:LoadLEEM:ce_Date
ce_X=str2num(SLP_ImgParamListW[LoadLEEM_sel][2])
ce_Y=str2num(SLP_ImgParamListW[LoadLEEM_sel][3])
ce_SampleTemp=str2num(SLP_ImgParamListW[LoadLEEM_sel][4])
ce_FOV1=SLP_ImgParamListW[LoadLEEM_sel][5]
ce_Notes=SLP_ImgParamListW[LoadLEEM_sel][13]
ce_Date=SLP_ImgParamListW[LoadLEEM_sel][14]
End
Function SLP_LL_LoadImg_V2()
NVAR LL_InitFlg=root:Package_SLP:LoadLEEM:LL_InitFlg
NVAR LL_Resize=root:Package_SLP:LoadLEEM:LL_Resize
NVAR Dataset_Sel=root:Package_SLP:LoadLEEM:Dataset_Sel
SVAR ImgLocation=root:Package_SLP:Util:AutoUpdateFileList:imgLocation
wave/T W_FileList=root:Package_SLP:Util:AutoUpdateFileList:W_FileList
wave W_FileList_Sel=root:Package_SLP:Util:AutoUpdateFileList:W_FileList_Sel
wave M_PreviewedImg=root:Package_SLP:Util:AutoUpdateFileList:M_PreviewedImg
NVAR ImgSel=root:Package_SLP:Util:AutoUpdateFileList:ImgSel
Wave /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
//Use folder name for the IMAGESET name
string FolderName=stringfromlist(itemsinlist(ImgLocation,":")-1,ImgLocation,":")
variable Resize=LL_Resize
variable exit_flg=0
string DataSetName=""
Do //Loop until user put non-duplicated datasetname
//Suggest a dataset name that doesn't match with the existing ones
DataSetName=FolderName
DataSetName=SLP_Util_AddNumToDataSet(DataSetName,SLP_ImgSetListW)
//Ask user's inputs for DataSetName
prompt DataSetName,"Dataset name"
prompt Resize,"Resizing factor"
doprompt "Enter parameters", DataSetName,Resize
//Check whether the new dataset name already exists
wave /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
findvalue /TEXT=DataSetName /TXOP=6 SLP_ImgSetListW
if (V_value==-1)
//START LOADING//
SLP_LoadLEEM_setup_V3(DataSetName)
SLP_LoadLEEM_batch_V2(DataSetName,resize)
LL_InitFlg=0 //Init. flag = 0 once the first dataset is loaded
LL_Resize=Resize //Keep the resize value for next times
//DoUpdate
//Plot the new image and select the new dataset
NVAR N_Datasets=root:Package_SLP:LoadLEEM:N_Datasets
SVAR CurrentDataset=root:Package_SLP:LoadLEEM:CurrentDataset
NVAR LoadLEEM_Sel=root:Package_SLP:LoadLEEM:LoadLEEM_Sel
string Pkg_Location="root:Package_SLP:LoadLEEM:"+DataSetName
string ImgList_Fname=Pkg_Location+":SLP_ImgListW"
string ImgParam_Fname=Pkg_Location+":SLP_ImgParamListW"
wave /T SLP_ImgListW=$ImgList_Fname
wave /T SLP_ImgParamListW=$ImgParam_Fname
//DoUpdate
//Make selection for List0 (Image list)
ListBox list0,win=SLP_LL_01,listwave= SLP_ImgParamListW,selRow=0
LoadLEEM_Sel=0
//string Pkg_Location="root:Package_SLP:LoadLEEM:"+CurrentDataSet
string ImgParamSel_Fname=Pkg_Location+":SLP_ImgParamListSelW"
wave SLP_ImgParamListSelW=$ImgParamSel_Fname
ListBox list0,win=SLP_LL_01, selWave=SLP_ImgParamListSelW
//Make selection for List1 (Dataset list)
ListBox list1,win=SLP_LL_01,selRow=N_Datasets-1
CurrentDataset=SLP_ImgSetListW[N_Datasets-1][1]
Dataset_Sel=N_Datasets-1
//Plot the image (the first one in the new dataset)
SLP_LL_PlotImage(SLP_ImgListW[0][3],SLP_ImgListW[0][2])
exit_flg=1
Else
doalert 1,"Duplicated dataset name. Do you want to choose new dataset name?"
if (V_flag==2)
exit_flg=1
endif
Endif
while (exit_flg==0) //Go back to prompt if the user want to use a new name
End
Function SLP_LoadLEEM_setup_V3(DataSetName)
//Create list of images and save the list in the LoadLEEM package folder. Have to do this before SLP_LoadLEEM_batch()
String DatasetName //Use DataSetName as folder name (2 folders - data and pacakage)
SVAR ImgLocation=root:Package_SLP:Util:AutoUpdateFileList:imgLocation
//Use Image File Location from SLP_LoadImg_Panel
NewPath/O SymbImgPath ImgLocation
//Create 2 folders to store data, param
string CurrentFolder=getdatafolder(1)
string Data_folder_name=CurrentFolder+DatasetName
string Pkg_folder_name="root:Package_SLP:LoadLEEM:"+DataSetName
newdatafolder /O $Data_folder_name
newdatafolder /O $Pkg_folder_name
//Move to PACKAGE folder
setdatafolder $Pkg_folder_name
//Create a wave that store raw file locations in the computer (and later to store image wave location in Igor project and the byte locations to load Img param and Img.)
make /T /O /N=(0,6) SLP_ImgListW=""
NVAR N_images=root:Package_SLP:LoadLEEM:N_images
wave/T W_FileList=root:Package_SLP:Util:AutoUpdateFileList:W_FileList
wave W_FileList_Sel=root:Package_SLP:Util:AutoUpdateFileList:W_FileList_Sel
//Check which files to load. Stored them in the SLP_ImgListW (first 2 columns)
variable i=0
N_Images=0
For (i=0;i<dimsize(W_FileList,0);i+=1)
If (W_FileList_Sel[i][0]) //If the image is selected
redimension /N=(dimsize(SLP_ImgListW,0)+1,dimsize(SLP_ImgListW,1)) SLP_ImgListW
SLP_ImgListW[dimsize(SLP_ImgListW,0)-1][0]=ImgLocation
SLP_ImgListW[dimsize(SLP_ImgListW,0)-1][1]=W_FileList[i][0]
N_Images+=1
EndIf
EndFor
//Create a wave to store image parameters + SelWave (for listbox)
make /T /O /N=(N_Images,16) SLP_ImgParamListW=""
make /O /N=(N_Images,16) SLP_ImgParamListSelW=0
SLP_ImgParamListSelW[][0]=32 //Make first column = check boxes
//Create global variables that are stored in the image set folder
variable /G LoadLEEM_Sel_Recall
variable /G SetScale_Flg=0
//Go back to the same place
setdatafolder $CurrentFolder
End
Function SLP_LoadLEEM_batch_V2(DataSetName,resize) //If resize =0 -> no resize
string DataSetName
variable resize
NVAR LEEMdata_pointer=root:Package_SLP:LoadLEEM:LEEMdata_pointer
NVAR LEEMimage_pointer=root:Package_SLP:LoadLEEM:LEEMimage_pointer
NVAR N_datasets=root:Package_SLP:LoadLEEM:N_datasets
NVAR ce_OBJ=root:Package_SLP:LoadLEEM:ce_OBJ
NVAR ce_STV=root:Package_SLP:LoadLEEM:ce_STV
NVAR ce_SampleTemp=root:Package_SLP:LoadLEEM:ce_SampleTemp
NVAR ce_X=root:Package_SLP:LoadLEEM:ce_X
NVAR ce_Y=root:Package_SLP:LoadLEEM:ce_Y
NVAR ce_Exposure=root:Package_SLP:LoadLEEM:ce_Exposure
SVAR ce_PressureTag1=root:Package_SLP:LoadLEEM:ce_PressureTag1
NVAR ce_Pressure1=root:Package_SLP:LoadLEEM:ce_Pressure1
SVAR ce_PressureTag2=root:Package_SLP:LoadLEEM:ce_PressureTag2
NVAR ce_Pressure2=root:Package_SLP:LoadLEEM:ce_Pressure2
SVAR ce_FOV1=root:Package_SLP:LoadLEEM:ce_FOV1
SVAR ce_FOV2=root:Package_SLP:LoadLEEM:ce_FOV2
NVAR N_Images=root:Package_SLP:LoadLEEM:N_Images
string Pkg_Location="root:Package_SLP:LoadLEEM:"+DataSetName
string ImgList_Fname=Pkg_Location+":SLP_ImgListW"
string ImgParam_Fname=Pkg_Location+":SLP_ImgParamListW"
wave /T SLP_ImgListW=$ImgList_Fname
wave /T SLP_ImgParamListW=$ImgParam_Fname
wave /T SLP_ImgSetListW=root:Package_SLP:LoadLEEM:SLP_ImgSetListW
wave SLP_ImgSetListSelW=root:Package_SLP:LoadLEEM:SLP_ImgSetListSelW
//Increase the number of row by 1 and add new image set information
redimension /N=(dimsize(SLP_ImgSetListW,0)+1,4) SLP_ImgSetListW
redimension /N=(dimsize(SLP_ImgSetListSelW,0)+1,4) SLP_ImgSetListSelW
SLP_ImgSetListSelW[dimsize(SLP_ImgSetListSelW,0)-1][0]=32
variable i=0
string Filename=""
string ImgName=""
string Current_folder=getdatafolder(1)
newdatafolder /O $DataSetName
setdatafolder $DataSetName
string creation_Date
string creation_Time
string creation_Text
//SVAR WNameSuggestion=root:Package_SLP:Util:WNameSuggest:WNameSuggestion
For (i=0;i<dimsize(SLP_ImgListW,0);i+=1)
FileName=SLP_ImgListW[i][0]+SLP_ImgListW[i][1]
ImgName=stringfromlist(0,SLP_ImgListW[i][1],".") //Remove the file extension
//SLP_Util_WNameSuggest(ImgName,0)
ImgName=SLP_Util_WNameSuggest(ImgName,0,31)
SLP_Load_LEEM_Img(Filename,ImgName)
wave ImageW=$ImgName
//Resize the image wave to save the RAM
if (resize!=0)
SLP_Resize_Img_Overwrite(ImgName,resize)
endif
//Record image wave's name and location
SLP_ImgListW[i][2]=Current_folder+DataSetName+":"
SLP_ImgListW[i][3]=ImgName
SLP_ImgListW[i][4]=num2str(LEEMdata_pointer)
SLP_ImgListW[i][5]=num2str(LEEMimage_pointer)
//Read from LEEM Data block and write down image parameters
SLP_get_LEEM_Param(LEEMdata_pointer,LEEMimage_pointer,Filename)
SLP_ImgParamListW[i][1]=ImgName
SLP_ImgParamListW[i][2]=num2str(ce_X)
SLP_ImgParamListW[i][3]=num2str(ce_Y)
SLP_ImgParamListW[i][4]=num2str(ce_SampleTemp)
SLP_ImgParamListW[i][5]=ce_FOV1
SLP_ImgParamListW[i][6]=ce_FOV2
SLP_ImgParamListW[i][7]=num2str(ce_STV)
SLP_ImgParamListW[i][8]=num2str(ce_OBJ)
SLP_ImgParamListW[i][9]=ce_PressureTag1
SLP_ImgParamListW[i][10]=num2str(ce_Pressure1)
SLP_ImgParamListW[i][11]=ce_PressureTag2
SLP_ImgParamListW[i][12]=num2str(ce_Pressure2)
//Unused slots for extra parameters
//SLP_ImgParamListW[i][13]=
GetFileFolderInfo /Q FileName
creation_Date=secs2date(V_modificationDate,1)
creation_Time=secs2Time(V_modificationDate,1)
SLP_ImgParamListW[i][14]=creation_Date+" "+creation_Time
//SLP_ImgParamListW[i][15]=
Endfor
//Record new list name in the Image Set List wave
SLP_ImgSetListW[N_DataSets][1]=DataSetName
SLP_ImgSetListW[N_DataSets][2]=num2str(resize)
SLP_ImgSetListW[N_DataSets][3]=num2str(N_images)
N_DataSets+=1
setdatafolder $Current_folder
//DoUpdate
End
Function ButtonProc_LL_LoadImg(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
// click code here
//Ask the user to identify a folder on the computer
SLP_CreateLoadImg()
break
case -1: // control being killed
break
endswitch
return 0
End
Function ButtonProc_LL_FindScreen(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
// click code here
SLP_Create_FindScreenPanel()
break
case -1: // control being killed