در ادامه پست های اول و دوم در زمینه ساخت رابط گرافیکی کاربر یا GUI میخواهیم پروژه کامل تری را با یکدیگر انجام دهیم . در این پروژه قصد داریم تست BMI را با استفاده از نرم افزار متلب انجام دهیم. این تست به این صورت است که قد و وزن فرد را گرفته و وضعیت اضافه وزن، چاقی یا لاغری فرد را محاسبه میکند. نتایج خروجی این تست در یک فایل اکسل ذخیره میشود. در این روژه ما از دکمه رادیویی یا radio button و همچنین دکمه ای برای ذخیره اطلاعات در اکسل استفاده میکنیم. اگر قسمت های قبلی آموزش رابط گرافیکی کاربر را مطالعه نکرده اید توصیه میشود قبل از مطالعه ادامه متلب به سراغ آن ها بروید.
برای شروع کار ابتدا با دستور guide یک GUI خالی باز کنید و سپس با توجه به قسمت های قبلب آموزش رابط گرافیکی کاربر ، صفحه زیر را بسازید. تنها نکته جدید در این صفحه ، دکمه رادیویی است که از گزینه های سمت چپ قابل دسترسی است. همانطور که میدانید فرق بین دکمه رادیویی و چک باکس در این است که اگر دو یا چند گزینه در صفحه داشته باشیم و از چک باکس استفاده کنیم، چک باکس ها بدون محدودیت میتوانند تیک بخورند اما دکمه رادیویی فقط و فقط باید یک گزینه تیک خورده باشد. برای زیباتر شدن صفحه، دو دکمه رایویی را در یک panel یا گروه دکمه ها قرار می دهیم و نتیجه به شکل زیر است :
ما ویژگی دکمه ها و بخش های مختلف پروژه را ب شکل زیر تنظیم کردیم. پارامترهایی که خالی هستند در واقع هیچ تغییری در آن ها انجام نشده است و مقدار پیشفرض خود نرم افزار را دریافت کرده اند.
در واقع اسم تگ ها با توابعی که در نرم افزار ساخته میشوند همخوانی دارند و مهم است که از جدول بالا در نام گذاری ها پیروی کنید در غیر این صورت باید نام توابع را با نام انتخابی خود در محیط کد نویسی تغییر دهید.
محیط خود را با نام bmi.fig یا هر نام دلخواه دیگری ذخیره کنید در گام بعدی مطابق جلسات قبل، با راست کلیک بر روی یکی از عناصر صفحه، از گزینه view callbacks گزینه callback را انتخاب میکنیم. تا کد های اولیه ساخته شوند سپس تغییرات لازم زیر را بر روی کد ها اعمال میکنیم :
% --- Executes just before bmi is made visible. function bmi_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 bmi (see VARARGIN) % Choose default command line output for bmi handles.output = hObject; handles.metric = 0; handles.wu = 'lb'; handles.hu = 'in'; handles.name = ''; handles.age = ''; handles.bmi = 0; handles.weight = ''; handles.height = ''; handles.result = ''; handles.condition = ''; % Update handles structure guidata(hObject, handles);
اما کد های بالا را ما به چه منظور استفاده کردیم؟ دلیل استفاده از کد های بالا در این است که اگر کاربر اطلاعات را به درستی وارد نکرد و یا مطابق انتظار ما تمام فیلد ها پر نشد، مشکلی برای برنامه پی نیاید و فیلد ها با مقادیر پیشفرض پر شوند و در صورت استفاده نکردن از کد ها بالا ممکن است برنامه به درستی کار نکند یا دچار مشکل شود. در واقع کدهای بالا پایدار برنامه ما را بالا میبرد.
در قسمت مربوط به نام و سن باید کد های زیر را وارد کنیم:
% --- Executes on text input in name_text. function name_text_Callback(hObject, eventdata, handles) handles.name = get(hObject,'String'); guidata(hObject, handles) % --- Executes on text input in age_text. function age_text_Callback(hObject, eventdata, handles) handles.age = get(hObject,'String'); guidata(hObject, handles)
در این مرحله، کابر باید انتخاب کند که قد و وزن خود را بر حسب kg/cm میخواهد وارد کند یا بر حسب lb/in کدهای زیر را با هم بررسی میکنیم :
% --- Executes on button press in anglo_radio. function anglo_radio_Callback(hObject, eventdata, handles) handles.anglo = get(hObject,'Value'); set(handles.weight_label, 'String', 'Weight (lb):') set(handles.height_label, 'String', 'Height (in):') set(handles.metric_radio, 'Value', 0) handles.metric = 0; handles.wu = 'lb'; handles.hu = 'in'; guidata(hObject, handles) % --- Executes on button press in metric_radio. function metric_radio_Callback(hObject, eventdata, handles) handles.metric = get(hObject,'Value'); set(handles.weight_label, 'String', 'Weight (kg):') set(handles.height_label, 'String', 'Height (cm):') set(handles.anglo_radio, 'Value', 0) handles.anglo = 0; handles.wu = 'kg'; handles.hu = 'cm'; guidata(hObject, handles)
خط 5 و 6 از کد های بالا لیبل یا تیتر باکس های ورود اطلاعات قد و وزن را تعیین میکنند.
خط 7 ، دکمه رادیویی kg/cm (یا metric) را از حالت انتخاب خارج میکند. خط 8 که مهمترین قسمت این کد است، مقدار پارامتر handles.metric را برابر 0 قرار میدهد که در بخش های بعدی از این متغیر برای تشخیص واحد انتخابی کاربر استفاده میکنیم . در واقع با این کد مشخص میشود که کاربر حالت metric یا همان کیلوگرم / سانتیمتر را انتخاب نکرده است. کد های خط 16 تا 24 نیز معکوس این کار را انجام میدهند و مشخص میکنند که کابر واحد متریک را انتخاب کرده است.
کدهای زیر برای ورود اطلاعات قد و وزن توسط کابر ، استفاده شده اند:
% --- Executes on text input in weight_text. function weight_text_Callback(hObject, eventdata, handles) num = str2double(get(hObject,'String')); if isnan(num) set(hObject,'String', 0); end handles.weight = num; guidata(hObject, handles) % --- Executes on text input in height_text. function height_text_Callback(hObject, eventdata, handles) num = str2double(get(hObject,'String')); if isnan(num) set(hObject,'String', 0); end handles.height = num; guidata(hObject, handles);
مطابق جلسات قبل ابتدا رشت ورودی توسط کابر به عدد تبدیل میشود و سپس چک میشود که آیا عبارت وارد شده عدد بوده یا خیر . در صورتی که کابر به جای عدد، رشته متنی وارد کرده باشد، عدد 0 جایگزین میشود.
فرمول محاسبه BMI به صورت زیر است :
% --- Executes on button press in calculate_button. function calculate_button_Callback(hObject, eventdata, handles) if handles.metric w = handles.weight; h = handles.height; else w = handles.weight/2.2046; h = handles.height/0.3937; end bmi = 1e4 * w/h^2; if bmi < 18.5 s = ' Underweight'; elseif 18.5 <= bmi & bmi < 25 s = ' Normal'; elseif 25 <= bmi & bmi < 30 s = ' Overweight'; else s = ' Obese'; end bmis = [num2str(bmi, 3) s]; set(handles.result_text, 'String', bmis); handles.result = bmi; handles.condition = s; guidata(hObject,handles);
در خط 4 متغیر metric که قبلا توسط دکمه رادیویی مقدار دهی شده بود در اینجا خوانده میشود و اگر مقدار 0 را داشته باشد در خط 8 و 9 تبدیل واحد از kg/cm به lb/in انجام میشود در خط 12 فرمول محاسبه بالا اعمال میشود و در ادامه وضعیت چهارگانه فرد مورد آزمایش در متغیر s ذخیره میشود.
برای دکمه پاک کردن صفحه از کدهای ساده زیر استفاده میکنیم :
% --- Executes on button press in clear_button. function clear_button_Callback(hObject, eventdata, handles) set(handles.name_text, 'String', '') handles.name = ''; set(handles.age_text, 'String', '') handles.age = ''; set(handles.weight_text, 'String', '0') handles.weight = 0; set(handles.height_text, 'String', '0') handles.height = 0; set(handles.result_text, 'String', '') handles.result = 0; handles.condition = '';
در پست های بعدی در مورد چگونگی ذخیره اطلاعات در فایل اکسل بحث خواهیم کرد :
نتایج به صورت زیر است :
آموزش رابط گرافیکی کاربر ادامه دارد…