Thursday, April 26, 2012

Recall the last input parameters after exiting the program and set default input parameters

ผมพัฒนาโปรแกรมอยู่ตัวหนึ่งครับ การใช้งานผู้ใช้ต้องใส่ input parameter หลายค่าในหลายๆที่ด้วย ซึ่งอาจทำให้ผู้ใช้งานเหนื่อยใจกับเรื่องนี้ เช่น ถ้ารันโปรแกรมกับตัวอย่าง input parameter เหมือนเดิมแต่ต้องกลับมานั่งใส่ทีละตัวทุกครั้ง ผมเลยต้องพยายามหาแนวทางเพื่อแก้ปัญหานี้ อันนี้ถามจากผู้รู้จากเว็บไซต์นี้ครับ shadowwares (ขอชมว่าเป็นมืออาชีพครับสำหรับไซต์นี้)

ดังนั้นในครั้งนี้ผมนำเสนอ การเรียกข้อมูล input เก่า (ครั้งล่าสุดหลังจากปิดโปรแกรม) พร้อมด้วยการกำหนดค่า เริ่มต้นไว้ด้วย (default) โดยได้รับคำแนะนำจากไซต์ที่กล่าวข้างต้น ผมใช้คำสั่ง save และ load ครับ แต่ปัญหาการใช้ คำสั่ง load ก็คือเราต้องมีไฟล์โปรแกรมโหลดก่อนครับ ดังนั้นในที่นี้ผมจะจัดเตรียมไว้ด้วยครับ (ผมทำง่ายๆ คือ ตอนแรกอย่าพึ่งใช้คำสั่ง load สั่งให้ save ก่อน เราก็จะได้ไฟล์เพื่อโหลดละครับ)

ผมจึงจำลองการเขียนกราฟของสองฟังก์ชันขึ้นมา ได้แก่ sine and sinc functions (y=sin(x) and y=sin(x)/x) ผู้ใช้งานสามารถกำหนดค่า x จากการใส่ค่าเริ่มต้น ค่าสุดท้าย และ step size ของการเพิ่มค่า x นอกจากนี้ยังมีโหมดให้เลือกใช้ค่า default ที่โปรแกรมกำหนดมาให้ใช้ได้อีกด้วยในที่นี้กำหนดให้ x เริ่มตั้งแต่ -50 ถึง 50 โดยเพิ่มค่าทีละ 0.1 หรือ x=[-50 : 0.1 : 50]

การแก้ไข source code นั้นผมขอยกมาเฉพาะส่วนครับ รายละเอียดไปดูใน DefaultParameter.m เอา ผมสร้าง GUI ขึ้นมาและให้ชื่อว่า DefaultParameter.fig และไฟล์ที่เตรียมไว้ชื่อ parameters.mat

ปกติผมไม่ค่อยได้แก้ไขส่วนนี้ครับ แต่ถ้าเราจะจัดการให้โปรแกรมรู้จักค่าต่างๆ ตั้งแต่เปิดใช้งานต้องนำมาใส่ไว้ในส่วนนี้ครับ อธิบายประมาณนี้เลยครับ
- ก่อนอื่นโหลดไฟล์ที่เก็บ parameters ต่างๆมาก่อน (คำสั่ง load)
- กำหนดให้ edit text handles รับค่าที่โหลดมาไปใช้ (คำสั่ง set)
- รับค่าจาก  edit text handles มาไว้ใน handles ที่เราตั้งไว้ (คำสั่ง get)

% --- Executes just before DefaultParameter is made visible.
function DefaultParameter_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to DefaultParameter (see VARARGIN)
% Choose default command line output for DefaultParameter
handles.output = hObject;
%Load the last variable from file.mat
load parameters.mat;
%-------------------------------------------
set(handles.editInitial,'String',InitialValue);
set(handles.editFinal,'String',FinalValue);
set(handles.editStep,'String',StepSizeValue);
%-------------------------------------------
Initial_value=get(handles.editInitial,'string');
handles.InitialValue=Initial_value;
Final_value=get(handles.editFinal,'string');
handles.FinalValue=Final_value;
StepSize_value=get(handles.editStep,'string');
handles.StepSizeValue=StepSize_value;

%---set initial value for if condition in PlotOperate_Callback
handles.SincPlotCheck=0; % กำหนดค่าให้ก่อน ใช้กับปุ่มกด plot graph
handles.SinePlotCheck=0;
% Update handles structure
guidata(hObject, handles);

ส่วนนี้จะทำงานเมื่อกดปุ่ม default parameters โปรแกรมจะเรียกค่า defaults ที่กำหนดไว้มาให้ตัวแปร
นั่นคือในที่นี้ default ก็คือ x = [-50 : 0.1 : 50]

% --- Executes on button press in pushDefault.
function pushDefault_Callback(hObject, eventdata, handles)
% hObject    handle to pushDefault (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%set default parameters, when the default buttom was pressed
set(handles.editInitial,'String','-50');
set(handles.editFinal,'String','50');
set(handles.editStep,'String','0.1');
Initial_value=get(handles.editInitial,'string');
handles.InitialValue=Initial_value;
Final_value=get(handles.editFinal,'string');
handles.FinalValue=Final_value;
StepSize_value=get(handles.editStep,'string');
handles.StepSizeValue=StepSize_value;
guidata(hObject, handles);

ในส่วนนี้จะทำงาน โดยแสดงกราฟบน axes1 ได้แก่
การเขียนกราฟของ sine function และ sinc function (sinX/X)

% --- Executes on button press in PlotOperate.
function PlotOperate_Callback(hObject, eventdata, handles)
% hObject    handle to PlotOperate (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles.axes1;
Initial  = str2double(handles.InitialValue); %#ok<*ST2NM>
Final    = str2double(handles.FinalValue);
Stepsize = str2double(handles.StepSizeValue);
x        = [Initial : Stepsize : Final];
y=sin(x);
yy=sinc(x);%sin(x)./x;

if handles.SinePlotCheck==1
    plot(x,y);
elseif handles.SincPlotCheck==1
    plot(x,yy);
else
    plot(x,y,'g');hold on;
    plot(x,yy,'r');hold off;
end

guidata(hObject, handles);

%save structure handles in file.mat
save parameters.mat -struct handles; % คำสั่งบันทึกพารามิเตอร์ต่างๆก่อนปิดโปรแกรม

No comments:

Post a Comment