Monday, April 9, 2012

How to transfer data dynamically between GUIs?‎

ในหัวข้อนี้เป็นการแก้ไขและเพิ่มเติมความสามารถจากหัวข้อ uitable in GUI MATLAB นั่นคือผมยังใช้ไฟล์ก่อนหน้านี้อยู่ แต่สร้าง GUI ขึ้นมาเพิ่มอีกหนึ่งหน้าต่างครับ

ความสามารถของโปรแกรมนี้ที่ผมต้องการมีรายละเอียดดังนี้
- GUI หน้าหลักที่มีชื่อว่า sampleTable ให้อ่านข้อมูลตัวเลขที่ถูกเก็บไว้ในไฟล์ช
นิด text file (ในที่นี้คือ dat.txt) แล้วแสดงผลเป็นกราฟและแสดงผลข้อมูลดังกล่าวในตารางที่สร้างขึ้น
- ส่งค่าข้อมูลดังกล่าวออกไปยังอีก GUI หนึ่ง ในที่นี้ให้ชื่อว่า externalTable
- สามารถบันทึกข้อมูลเป็นไฟล์ Ms. Excel ด้วย

การแลกเปลี่ยนข้อมูลระหว่าง GUI อาศัยฟังก์ชัน (คำสั่ง) ดังต่อไปนี้
- setappdata ใช้สำหรับกำหนดให้ตัวแปร (ที่เก็บข้อมูลไว้) ถูกมอง
เห็นได้จาก GUI อื่นๆ
- getappdata ใช้สำหรับรับค่าจากตัวแปรที่กำหนดโดย setappdata

ภาพด้านล่างแสดง รูปร่างหน้าโปรแกรมที่สร้างจาก GUIDE ได้แก่ sampleTable.fig และ externalTable.fig



ส่วนภาพโปรแกรมเมื่อถูกสั่งให้ทำงาน แสดงดังภาพด้านล่าง

การเพิ่มเติม source code มีดังนี้
สำหรับไฟล์ sampleTable.m มีดังนี้ครับ

% --- Executes on button press in pushDisplayDATA.
function pushDisplayDATA_Callback(hObject, eventdata, handles)
% hObject handle to pushDisplayDATA (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.dataShow= handles.inputDATA(:,2:5);
set(handles.tableDATA, 'data',handles.dataShow)
% ----- เตรียม ข้อมูลไว้สำหรับ GUI อื่นๆ ------------
setappdata(0, 'test_data', handles.dataShow);
% ในที่นี้เก็บข้อมูล handles.dataShow ไว้ใน test_data

externalTable; % open externalTable GUI
guidata(hObject,handles);

% --- Executes on button press in push2Excel. ส่วนนี้
% จะบันทึกข้อมูลเป็น excel file
function push2Excel_Callback(hObject, eventdata, handles)
% hObject handle to push2Excel (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
data=handles.dataShow;
StandardConFileName = uiputfile('*.xls','Save as');
xlswrite(StandardConFileName,data);

สำหรับไฟล์ externalTable.m มีดังนี้ครับ

% --- Outputs from this function are returned to the command line.
function varargout = externalTable_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

Table_data=getappdata(0, 'test_data');%รับข้อมูลจาก sampleTable ซึ่งเก็บไว้ใน %test_data
% ----- ตรงไม่ต้องกังวลครับ เราจะจัดการข้อมูลยังไงก็ได้ ตามความต้องการเลยครับ -----
Table_data1=(Table_data(:,1))./max(Table_data(:,1));
Table_data2=(Table_data(:,2))./max(Table_data(:,2));
Table_data3=(Table_data(:,3))./max(Table_data(:,3));
Table_data4=(Table_data(:,4))./max(Table_data(:,4));
Table_data=[Table_data1 Table_data2 Table_data3 Table_data4];

% ------------ แสดงข้อมูลในตาราง externalTable --------------
set(handles.uitableAcceptDAT,'data',Table_data);

% ------- ให้สร้าง figure ขึ้นมาใหม่ สำหรับการเขียนกราฟข้อมูล -------
figure()
plot(Table_data1,'-*b');hold on
plot(Table_data2,'+r-');
plot(Table_data3,'--k');
plot(Table_data4,'-og');hold off
xlabel('index');ylabel('Normalized value');title('Test interface Multi-GUIs');
varargout{1} = handles.output;

download ไฟล์ทั้งหมดที่นี่  ===> download files

References

1. http://blogs.mathworks.com/videos/2005/10/03/guide-video-part-two/
2. http://www.mathworks.com/matlabcentral/answers/6831-updating-application-data-from-several-gui-s
3. http://stackoverflow.com/questions/5346635/how-to-pass-parameters-to-a-matlab-gui-file

No comments:

Post a Comment