13
{$IFDEF FPC}LResources, {$ENDIF}
14
SysUtils, Variants, Classes, Graphics, Controls, Forms,
15
Dialogs, StdCtrls, Buttons, ToolWin, ComCtrls;
18
TAnatForm = class(TForm)
20
SaveBtn: TSpeedButton;
23
UpdateBtn: TSpeedButton;
24
OpenBtn: TSpeedButton;
25
DeleteBtn: TSpeedButton;
26
procedure SaveBtnClick(Sender: TObject);
27
procedure AddBtnClick(Sender: TObject);
28
procedure ComboBox1Change(Sender: TObject);
29
procedure UpdateCombo;
30
procedure OpenBtnClick(Sender: TObject);
31
procedure Update(lIndex: integer);
32
procedure UpdateBtnClick(Sender: TObject);
33
procedure DeleteBtnClick(Sender: TObject);
34
procedure OpenAnat(lFilename: string);
37
{ Private declarations }
39
{ Public declarations }
47
uses nifti_img_view, nifti_img, nifti_hdr_view, define_types;
48
{$IFNDEF FPC} //Delphi
56
TLandmarkRA = array of TLandmark;
58
kAnatFilter = 'AnatomyFile|*.anat';
60
gLandmarks: TLandmarkRA;
61
procedure TAnatForm.CloseAnat;
63
if length(gLandmarks) < 1 then
65
SetLength(gLandmarks,0);
69
procedure TAnatForm.SaveBtnClick(Sender: TObject);
76
if length(gLandmarks) < 1 then begin
77
showmessage('No landmarks open - either open a file or create new landmarks');
80
ImgForm.SaveDialog1.Filter := kAnatFilter;
81
ImgForm.SaveDialog1.DefaultExt := '.anat';
82
ImgForm.SaveDialog1.Filename := ChangeFileExt(ImgForm.SaveDialog1.Filename, ImgForm.SaveDialog1.DefaultExt); //10102006
83
if not ImgForm.SaveDialog1.Execute then exit;
85
AssignFile(lF, ImgForm.SaveDialog1.Filename);
87
for i := 0 to length(gLandmarks)-1 do
88
Writeln(lF, gLandmarks[i].Name+kSep+floattostr(gLandmarks[i].X)+kSep+floattostr(gLandmarks[i].Y)+kSep+floattostr(gLandmarks[i].Z) );
93
procedure TAnatForm.UpdateCombo;
98
ComboBox1.Items.Clear;
99
if length(gLandmarks) < 1 then
101
for i := 0 to length(gLandmarks)-1 do
102
ComboBox1.Items.Add(gLandmarks[i].Name);
103
ComboBox1.ItemIndex := length(gLandmarks)-1;
104
ComboBox1Change(nil);
108
procedure TAnatForm.AddBtnClick(Sender: TObject);
114
i := length(gLandmarks)+1;
115
s := 'A'+inttostr(i);
116
lOK := InputQuery('Enter a name', 'region name', s);
119
setlength(gLandmarks,i);
120
gLandmarks[i-1].Name := s;
126
MMToImgCoord(lX,lY,lZ,lXmm,lYmm,lZmm);
127
if lX <> ImgForm.XViewEdit.value then ImgForm.XViewEdit.value := lX;
128
if lY <> ImgForm.YViewEdit.value then ImgForm.YViewEdit.value := lY;
129
if lZ <> ImgForm.ZViewEdit.value then ImgForm.ZViewEdit.value := lZ;
131
procedure SetLandmark(index: integer);//indexed from 0
133
//lXmm,lYmm,lZmm: single;
136
if (index < 0) or (index >= length(gLandmarks)) then
138
MMToImgCoord(lX,lY,lZ,gLandmarks[index].X,gLandmarks[index].Y,gLandmarks[index].Z);
139
if lX <> ImgForm.XViewEdit.value then ImgForm.XViewEdit.value := lX;
140
if lY <> ImgForm.YViewEdit.value then ImgForm.YViewEdit.value := lY;
141
if lZ <> ImgForm.ZViewEdit.value then ImgForm.ZViewEdit.value := lZ;
142
ImgForm.XViewEditChange(nil);
145
procedure TAnatForm.ComboBox1Change(Sender: TObject);
147
SetLandmark(ComboBox1.ItemIndex);
150
function NextTab(lStr: string; var lP: integer): string;
151
//reports text prior to comma...
157
if len < lP then exit;
159
if (lStr[lP] = chr(9){','}) then begin
163
//if lStr[lP] <> ' ' then
164
result := result + lStr[lP];
169
procedure TAnatForm.OpenAnat(lFilename: string);
173
n, line, col : integer;
175
if not Fileexists(lFilename) then begin
179
//will load the TAB delimited TXT here
180
sl := TStringList.Create;
182
//load the tab delimited txt file
183
sl.LoadFromFile(lFilename) ;
184
//for each tab delimited line
186
setlength(gLandmarks,sl.Count);
187
for line := 0 to sl.Count-1 do begin
190
if (NextTab(st,col) <> '') and (NextTab(st,col) <> '') and(NextTab(st,col) <> '') and(NextTab(st,col) <> '') then begin
193
gLandmarks[line].Name := NextTab(st,col);
194
gLandmarks[line].X := strtofloat(NextTab(st,col));
195
gLandmarks[line].Y := strtofloat(NextTab(st,col));
196
gLandmarks[line].Z := strtofloat(NextTab(st,col));
199
setlength(gLandmarks,n);
208
procedure TAnatForm.OpenBtnClick(Sender: TObject);
210
if not OpenDialogExecute(kAnatFilter,'Select background image',false) then exit;
211
OpenAnat(HdrForm.OpenHdrDlg.Filename) ;
214
procedure TAnatForm.Update(lIndex: integer);
218
if lIndex >= Length(gLandmarks) then
220
X := round(ImgForm.XViewEdit.value);
221
Y := round(ImgForm.YViewEdit.value);
222
Z := round(ImgForm.ZViewEdit.value);
223
ImgCoordToMM(X,Y,Z, gLandmarks[lIndex].X,gLandmarks[lIndex].Y,gLandmarks[lIndex].Z);
224
ComboBox1Change(nil);
227
procedure TAnatForm.UpdateBtnClick(Sender: TObject);
229
Update(ComboBox1.ItemIndex);
233
procedure TAnatForm.DeleteBtnClick(Sender: TObject);
237
l := Length(gLandmarks);
238
i := ComboBox1.ItemIndex;
239
if (l < 1) or (i >= l) or (i < 0) then
242
for p := i+1 to l-1 do
243
gLandmarks[p-1] := gLandmarks[p];
244
SetLength(gLandmarks,l-1);