15
15
{$IFDEF COMPILEYOKE}
19
19
LResources, fx8, cpucount, SysUtils, Classes, Graphics, Controls, Forms,
20
20
Dialogs, Menus, ComCtrls, ExtCtrls, StdCtrls, GraphicsMathLibrary, ClipBrd,
21
21
define_types, Spin, Buttons, nifti_hdr, nifti_hdr_view, nifti_img, voismooth,
22
IniFiles, ReadInt, registry, simpleipc, stat, Distr, bet, mni, prefs, CropEdges,
22
IniFiles, ReadInt, registry, stat, Distr, bet, mni, prefs, CropEdges,
23
23
userdir, graphx, GraphType, IntfGraphics, landmarks;
27
PINtBuffer = ^TIntBuffer;
28
TIntBuffer = Array[0..6] of single;}
448
439
{$IFDEF COMPILEYOKE}
449
440
if not gYoke then
451
SendIPCFloats(SimpleIPCClient1,lXmm,lYmm,lZmm);
442
SetShareFloats(lXmm,lYmm,lZmm);
455
447
procedure TImgForm.CreateShareMem;
457
449
{$IFDEF COMPILEYOKE}
458
startipcserver(SimpleIPCServer1,SimpleIPCClient1);
450
CreateSharedMem(self);
452
YokeTimer.Enabled := gYoke;
463
456
procedure TImgForm.YokeTimerTimer(Sender: TObject);
459
lXmm,lYmm,lZmm: single;
465
461
if not gYoke then
466
462
YokeTimer.Enabled := false;
468
if SimpleIPCServer1.Active then SimpleIPCServer1.PeekMessage(1,true);
464
//labelx.caption := inttostr(random(888));
467
//LabelX.caption := inttostr(random(888));
468
if not GetShareFloats(lXmm,lYmm,lZmm) then
470
//LabelY.caption := inttostr(random(888));
471
MMToImgCoord(lX,lY,lZ,lXmm,lYmm,lZmm);
472
if lX <> XViewEdit.value then XViewEdit.value := lX;
473
if lY <> YViewEdit.value then YViewEdit.value := lY;
474
if lZ <> ZViewEdit.value then ZViewEdit.value := lZ;
475
XViewEditChange(nil);
668
676
gBGImg.ResliceOnLoad := IniBool(lIniFile,'Reslice',gBGImg.ResliceOnLoad);
669
677
gBGImg.OrthoReslice := IniBool(lIniFile,'ResliceOrtho',gBGImg.OrthoReslice);
670
678
gBGImg.ThinPen := IniBool(lIniFile, 'ThinPen',True);
671
ToolPanel.Visible := IniBool(lIniFile, 'ShowDraw',False);
679
ToolPanel.Visible := IniBool(lIniFile, 'ShowDraw',True);
672
680
DrawMenu.Visible := ToolPanel.visible;
673
681
if IniBool(lIniFile,'Smooth2D',Menu2DSmooth.checked) then
674
682
gBGImg.StretchQuality := sqHigh
1108
1116
SaveAsVOIorNIFTI(gMRIcroOverlay[lLayer].ImgBuffer,gMRIcroOverlay[lLayer].ImgBufferItems,gMRIcroOverlay[lLayer].ImgBufferBPP,1,false,gMRIcroOverlay[kBGOverlayNum].NiftiHdr,gMRIcroOverlay[lLayer].HdrFilename);
1112
1119
procedure ApplySaveDlgFilter (lSaveDlg: TSaveDialog);
1114
1121
lLen,lPos,lPipes,lPipesReq: integer;
1117
1124
lPipesReq := (lSaveDlg.FilterIndex * 2)-1;
1118
1125
if lPipesReq < 1 then exit;
1119
1126
lLen := length(lSaveDlg.Filter);
1122
//Median(DeltaF, 1, N_inc) / LN2
1123
1129
while (lPos < lLen) and (lPipes < lPipesReq) do begin
1124
1130
if lSaveDlg.Filter[lPos] = '|' then
1133
1139
lExt := lExt + lSaveDlg.Filter[lPos];
1142
lName := lSaveDlg.Filename;
1136
1143
if lExt <> '' then
1137
lSaveDlg.Filename := ChangeFileExt(lSaveDlg.Filename,lExt);
1144
lSaveDlg.Filename := ChangeFileExtX(lName,lExt);
1140
1149
procedure TImgForm.SaveDialog1Close(Sender: TObject);
1142
1151
ApplySaveDlgFilter(SaveDialog1);
1145
procedure TImgForm.SimpleIPCServer1Message(Sender: TObject);
1148
lXmm,lYmm,lZmm: single;
1152
if not GetIPCFloats(SimpleIPCServer1.StringMessage, lXmm,lYmm,lZmm) then
1154
MMToImgCoord(lX,lY,lZ,lXmm,lYmm,lZmm);
1155
if lX <> XViewEdit.value then XViewEdit.value := lX;
1156
if lY <> YViewEdit.value then YViewEdit.value := lY;
1157
if lZ <> ZViewEdit.value then ZViewEdit.value := lZ;
1158
XViewEditChange(nil);
1160
if SimpleIPCServer1.Active then SimpleIPCServer1.PeekMessage(1,true);
1164
1155
procedure Add2MRU (var lNewFilename: string); //add new file to most-recent list
1279
1270
//if (ssShift in KeyDataToShiftState(vk_Shift)) then begin
1280
1271
// if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,not gBGImg.ResliceOnLoad,false) then exit
1273
if (ssCtrl in KeyDataToShiftState(vk_Shift)) and (gBGIMg.OrthoReslice) then begin
1274
gBGIMg.OrthoReslice := false;
1275
OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,false,false);
1276
gBGIMg.OrthoReslice := true;
1277
end else if (ssShift in KeyDataToShiftState(vk_Shift)) then begin
1278
if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,not gBGImg.ResliceOnLoad,false) then exit
1282
1280
if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,gBGImg.ResliceOnLoad,false) then exit;
1284
1282
XViewEdit.MaxValue := gBGImg.ScrnDim[1];//gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[1];
2523
2521
end else if (lHisto[lInc] > 0) {necessarily also and (lRegionVol[lInc] > 0)} then
2524
2522
TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr20[lInc] +kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ;
2525
2523
end; //for each row
2525
procedure DescribeVOIonLabels (lOverlayNum: integer; lShowFilename: boolean);
2527
lLocalMax,lLocalSum : HistoDoubleRA;
2532
lXmm,lYmm,lZmm: single;
2533
lHisto,lRegionVol,lLocalMaxPos: HistoRA;
2534
lInc,lRegion: Integer;
2537
lLabelStr50 : Array[0..kHistoBins] of kstr50;
2539
lInten := 0;//just to hide compiler hint...
2540
(*if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 2) and ('ratlas.nii.gz' = (extractfilename( gMRIcroOverlay[kBGOverlayNum].HdrFileName))) then begin
2541
DescribeVOIonLabelsRAT(lOverlayNum,lShowFilename);
2544
if (gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) or (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP <> 1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 2) then
2546
TextForm.MemoT.Lines.add(' Custom Region Analysis');
2547
TextForm.MemoT.Lines.add(' For Speculative Brodmann Map: 0=not cortical and 48=no Brodmann label');
2548
lVOI := IsVOIROIExt(gMRIcroOverlay[lOverlayNum].HdrFileName);
2549
if (not lVOI) and (lOverlayNum = kVOIOverlayNum) then
2551
//next describe format
2552
if lShowfilename then
2553
lLabelStr := kTextSep+'Filename'+kTextSep
2555
lLabelStr := kTextSep;
2556
if lVOI then //intensity min/max position are not important
2557
TextForm.MemoT.Lines.add(lLabelStr+'Index'+kTextSep+'Area'+kTextSep+'N>0'+kTextSep+'%N>0')
2559
TextForm.MemoT.Lines.add(lLabelStr+'Index'+kTextSep+'Area'+kTextSep+'N>0'+kTextSep+'%N>0'+kTextSep+'Sum>0'+kTextSep+'Mean>0'+kTextSep+'Max'+kTextSep+'MaxX'+kTextSep+'MaxY'+kTextSep+'MaxZ');
2561
if lShowFilename then begin
2562
if gMRIcroOverlay[lOverlayNum].HdrFileName = '' then
2563
lLabelStr := 'VOI'+kTextSep
2565
lLabelStr := gMRIcroOverlay[lOverlayNum].HdrFileName+kTextSep;
2568
for lInc := 0 to kHistoBins do begin
2570
lLocalMax[lInc] := 0;
2571
lLocalSum[lInc] := 0;
2572
lRegionVol[lInc] := 0;
2573
if (gMRIcroOverlay[kBGOverlayNum].UsesCustomPalette) then
2574
lLabelStr50[lInc] := inttostr(lInc)+kTextSep+gBGImg.LabelStr20[lInc]
2576
lLabelStr50[lInc] := inttostr(lInc)+kTextSep+realtostr(Scrn2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lInc),2);
2578
for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do
2579
if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then
2580
inc(lHisto[gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc]]);
2582
l32Buf := SingleP(gMRIcroOverlay[lOverlayNum].ImgBuffer );
2583
l16Buf := SmallIntP(gMRIcroOverlay[lOverlayNum].ImgBuffer );
2584
//NEXT if..else July07 - ROIs only use screen buffer, not imgbuffer...
2585
if gMRIcroOverlay[lOverlayNum].ScrnBufferItems = gMRIcroOverlay[lOverlayNum].ImgBufferItems then
2586
l8Buf := gMRIcroOverlay[lOverlayNum].ImgBuffer
2588
l8Buf := gMRIcroOverlay[lOverlayNum].ScrnBuffer;
2589
for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin
2590
if (gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 4) then
2591
lInten := l32Buf^[lInc]
2592
else if (gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 2) then
2593
lInten := l16Buf^[lInc]
2594
else if gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 1 then
2595
lInten := l8Buf^[lInc];//July07
2596
lRegion := gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc];
2598
lLocalSum[lRegion] := lLocalSum[lRegion]+lInten;
2599
if lInten > lLocalMax[lRegion] then begin
2600
lLocalMax[lRegion] := lInten;//intensity
2601
lLocalMaxPos[lRegion] := lInc;//location
2603
inc(lRegionVol[lRegion]);
2605
for lInc := 0 to kHistoBins do begin
2606
if (not lVOI) and (lLocalMax[lInc] > 0) then begin
2607
lLocalMax[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalMax[lInc]);
2608
lLocalSum[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalSum[lInc]);
2609
ImgPosToMM(lLocalMaxPos[lInc], lXmm,lYmm,lZmm);
2610
TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr50[lInc] +kTextSep + inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])
2611
+kTextSep+floattostr( lLocalSum[lInc])+kTextSep+floattostr( lLocalSum[lInc]/lRegionVol[lInc]) //Sum>0, mean>0
2612
+kTextSep + floattostr(lLocalMax[lInc])+kTextSep+floattostr(lXmm)+kTextSep+floattostr(lYmm)+kTextSep+floattostr(lZmm) );
2613
end else if (lHisto[lInc] > 0) {necessarily also and (lRegionVol[lInc] > 0)} then
2614
TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr50[lInc] +kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ;
2528
2619
procedure ShowDescriptive (lOverlayNum: integer; lShowFilename: boolean);
2530
2621
lROIVol: array [1..3] of integer;