mfedit.m

Package [view]: fuzzy.rar
Upload User: hnchenxi
Upload Date: 2008-11-02
Package Size: 1083k
Code Size: 51k
Category: AI-NN-PR
Development Platform: Matlab
  1. function mfedit(action,varType,varIndex);
  2. %MFEDIT Membership function editor.
  3. %
  4. %   mfedit('a') generates a membership function editor that allows
  5. %   you to modify all the membership sunctions for your FIS stored
  6. %   in the file a.fis.
  7. %
  8. %   mfedit(a) operates on a MATLAB workspace variable for a FIS 
  9. %   structure a.
  10. %
  11. %   mfedit alone opens the membership function editor with no FIS
  12. %   loaded.
  13. %   
  14. %   The Membership Function (MF) Editor is used to create, 
  15. %   remove, and modify the MFs for a given fuzzy system. On 
  16. %   the left side of the diagram is a "variable palette" 
  17. %   region that you use to select the current variable by 
  18. %   clicking once on one of the displayed boxes. Information   
  19. %   about the current variable is displayed in the text region 
  20. %   below the palette area.
  21. %
  22. %   To the right is a plot of all the MFs for the current 
  23. %   variable. You can select any of these by clicking once on 
  24. %   the line or name of the MF. Once selected, you can modify 
  25. %   the properties of the MF using the controls in the lower right.  
  26. %   MFs are added and removed using the Edit menu.    
  27. %
  28. %   See also FUZZY, RULEEDIT, RULEVIEW, SURFVIEW, ANFISEDIT
  29. %   Kelly Liu 6-26-96 Ned Gulley, 4-30-94, N. Hickey 03-17-01
  30. %   Copyright 1994-2002 The MathWorks, Inc. 
  31. %   $Revision: 1.70 $  $Date: 2002/04/02 21:25:21 $
  32. if get(0,'ScreenDepth')>2,
  33.    figColor=[0.9 0.9 0.9];
  34.    selectColor=[1 0 0];
  35.    unselectColor=[0 0 0];
  36.    inputColor=[1 1 0.8];
  37.    outputColor=[0.8 1 1];
  38. else
  39.    figColor=[1 1 1];
  40.    selectColor=[0 0 0.1];
  41.    unselectColor=[0 0 0.1];
  42.    inputColor=[1 1 1];
  43.    outputColor=[1 1 1];
  44. end
  45. if nargin<1,
  46.    newFis=newfis('Untitled');
  47.    newFis=addvar(newFis,'input','input1',[0 1],'init');
  48.    newFis=addvar(newFis,'output','output1',[0 1],'init');
  49.    action=newFis;
  50. end
  51. if isstr(action),
  52.    if action(1)~='#',
  53.       % The string "action" is not a switch for this function, 
  54.       % so it must be a disk file
  55.       fis=readfis(action);
  56.       action='#initialize';
  57.    end
  58. else
  59.    % For initialization, the fis matrix is passed in as the parameter
  60.    fis=action;
  61.    action='#initialize';
  62. end
  63. if strcmp(action,'#initialize'),
  64. fisName=fis.name;
  65. fisType=fis.type;
  66. if isfield(fis, 'input')
  67. numInputs=length(fis.input);
  68. else
  69. numInputs=0;
  70. end
  71. if isfield(fis, 'output')
  72. numOutputs=length(fis.output);
  73. else
  74. numOutputs=0;
  75. end
  76. if isfield(fis, 'rule')
  77. numRules=length(fis.rule);
  78. else
  79. numRules=0;
  80. end
  81. % Protect against bad Sugeno FIS (with output MF params=[])
  82. if strcmpi(fisType,'sugeno')
  83. for ctOut=1:numOutputs
  84. for ctMF=1:length(fis.output(ctOut).mf)
  85. isLinear = strcmpi(fis.output(ctOut).mf(ctMF).type,'linear');
  86. if isempty(fis.output(ctOut).mf(ctMF).params)
  87. fis.output(ctOut).mf(ctMF).params = zeros(1,1+numInputs*isLinear);
  88. end
  89. end
  90. end
  91. end
  92. %===================================
  93. % Information for all objects
  94. frmColor=192/255*[1 1 1];
  95. btnColor=192/255*[1 1 1];
  96. popupColor=192/255*[1 1 1];
  97. editColor=255/255*[1 1 1];
  98. border=6;
  99. spacing=6;
  100. figPos=get(0,'DefaultFigurePosition');
  101. maxRight=figPos(3);
  102. maxTop=figPos(4);
  103. btnWid=100;
  104. btnHt=22;
  105. %====================================
  106. % The FIGURE
  107. thisfis{1}=fis;
  108. figNumber=figure( ...
  109. 'Name',['Membership Function Editor: ' fisName], ...
  110. 'NumberTitle','off', ...
  111.         'IntegerHandle','off',...
  112. 'Visible','off', ...
  113. 'Color',figColor, ...
  114.         'CloseRequestFcn','fisgui #close',...
  115. 'MenuBar','none', ...
  116. 'UserData',thisfis, ...
  117. 'Position',figPos, ...
  118. 'KeyPressFcn','mfedit #keypress', ...
  119. 'DefaultAxesFontSize',8, ...
  120. 'Tag','mfedit', ...
  121. 'DoubleBuffer', 'on', ...
  122. 'BackingStore','off');
  123. figPos=get(figNumber,'position');
  124. %====================================
  125. % The MENUBAR items
  126. % Call fisgui to create the menubar items
  127. fisgui #initialize
  128. %====================================
  129. % The MAIN frame 
  130. top=(maxTop)*0.47;
  131. bottom=border; 
  132. right=maxRight-border;
  133. left=border;
  134. frmBorder=spacing;
  135. frmPos=[left-frmBorder bottom-frmBorder ...
  136. right-left+frmBorder*2 top-bottom+frmBorder*2]+[1 0 1 0];
  137. %====================================
  138. % The MAIN axes
  139. tickColor=[0.5 0.5 0.5];
  140. axBorder=40;
  141. axPos=[left+axBorder+(right-left)/5 top+axBorder ...
  142. 4/5*(right-left)-1.5*axBorder maxTop-top-border-1.5*axBorder];
  143. btnDownFcn='mfedit #deselectmf';
  144. param.CurrMF=-1;
  145. param.Action='';
  146. mainAxHndl=axes( ...
  147. 'Units','pixel', ...
  148. 'XColor',tickColor,'YColor',tickColor, ...
  149. 'Color',inputColor, ...
  150. 'Position',axPos, ...
  151. 'Tag','mainaxes', ...
  152. 'Userdata', param, ...
  153. 'ButtonDownFcn',btnDownFcn, ...
  154. 'Box','on');
  155. titleStr='Membership function plots';
  156. title(titleStr,'Color','black');
  157. %====================================
  158. % The VARIABLE PALETTE axes
  159. axBorder=5;
  160. axPos=[left+axBorder top+2*axBorder ...
  161. 1/5*(right-left)-1.5*axBorder maxTop-top-border-7*axBorder];
  162. axHndl=axes( ...
  163. 'Units','pixel', ...
  164. 'Visible','off', ...
  165. 'XColor',tickColor,'YColor',tickColor, ...
  166. 'Position',axPos, ...
  167. 'Tag','variables', ...
  168. 'Box','on');
  169. axes(mainAxHndl)
  170. %draw frame
  171. mainFrmHndl=uicontrol( ...
  172. 'Style','frame', ...
  173. 'Units','pixel', ...
  174. 'Position',frmPos, ...
  175. 'BackgroundColor',frmColor);
  176. %====================================
  177. % The VARIABLE frame 
  178. top=top-spacing;
  179. bottom=border+4*spacing+btnHt;
  180. left=border+spacing;
  181. right=left+2*btnWid+spacing;
  182. frmBorder=spacing;
  183. frmPos=[left-frmBorder bottom-frmBorder ...
  184. right-left+frmBorder*2 top-bottom+frmBorder*2]+[1 0 1 0];
  185. varFrmHndl=uicontrol( ...
  186. 'Style','frame', ...
  187. 'Units','pixel', ...
  188. 'Position',frmPos, ...
  189. 'BackgroundColor',frmColor);
  190. varSpacing=(top-bottom-5*btnHt)/4;
  191. %------------------------------------
  192. % The VARIABLE label field
  193. n=1;
  194. labelStr='Current Variable';
  195. pos=[left top-btnHt*n-varSpacing*(n-1) 2*btnWid btnHt];
  196. hndl=uicontrol( ...
  197. 'Style','text', ...
  198. 'BackgroundColor',frmColor, ...
  199. 'HorizontalAlignment','left', ...
  200. 'Units','pixel', ...
  201. 'Position',pos, ...
  202. 'String',labelStr);
  203. %------------------------------------
  204. % The VARIABLE NAME text field
  205. n=2;
  206. name='varname';
  207. labelStr='Name';
  208. pos=[left top-btnHt*n-varSpacing*(n-1) btnWid btnHt];
  209. hndl=uicontrol( ...
  210. 'Style','text', ...
  211. 'BackgroundColor',frmColor, ...
  212. 'HorizontalAlignment','left', ...
  213. 'Units','pixel', ...
  214. 'Position',pos, ...
  215. 'String',labelStr);
  216. %------------------------------------
  217. % The VARIABLE NAME display field
  218. pos=[right-btnWid top-btnHt*n-varSpacing*(n-1) btnWid btnHt];
  219. hndl=uicontrol( ...
  220. 'Style','text', ...
  221. 'Units','pixel', ...
  222. 'Position',pos, ...
  223. 'HorizontalAlignment','left', ...
  224. 'BackgroundColor',popupColor, ...
  225. 'String',' ', ...
  226. 'Tag',name);
  227. %------------------------------------
  228. % The VARIABLE TYPE text field
  229. n=3;
  230. labelStr='Type';
  231. pos=[left top-btnHt*n-varSpacing*(n-1) btnWid btnHt];
  232. hndl=uicontrol( ...
  233. 'Style','text', ...
  234. 'BackgroundColor',frmColor, ...
  235. 'HorizontalAlignment','left', ...
  236. 'Units','pixel', ...
  237. 'Position',pos, ...
  238. 'String',labelStr);
  239. %------------------------------------
  240. % The VARIABLE TYPE display field
  241. labelStr=' input| output';
  242. name='vartype';
  243. pos=[right-btnWid top-btnHt*n-varSpacing*(n-1) btnWid btnHt];
  244. hndl=uicontrol( ...
  245. 'Style','text', ...
  246. 'HorizontalAlignment','left', ...
  247. 'BackgroundColor',popupColor, ...
  248. 'Units','pixel', ...
  249. 'Position',pos, ...
  250. 'Tag',name, ...
  251. 'String',labelStr);
  252. %------------------------------------
  253. % The VARIABLE RANGE text field
  254. n=4;
  255. labelStr='Range';
  256. pos=[left top-btnHt*n-varSpacing*(n-1) btnWid btnHt];
  257. hndl=uicontrol( ...
  258. 'Style','text', ...
  259. 'BackgroundColor',frmColor, ...
  260. 'HorizontalAlignment','left', ...
  261. 'Units','pixel', ...
  262. 'Position',pos, ...
  263. 'String',labelStr);
  264. %------------------------------------
  265. % The VARIABLE RANGE edit field
  266. name='varrange';
  267. callbackStr='mfedit #varrange';
  268. pos=[right-btnWid top-btnHt*n-varSpacing*(n-1) btnWid btnHt];
  269. hndl=uicontrol( ...
  270. 'Style','edit', ...
  271. 'Units','pixel', ...
  272. 'Position',pos, ...
  273. 'HorizontalAlignment','left', ...
  274. 'BackgroundColor',editColor, ...
  275. 'Callback',callbackStr, ...
  276. 'Tag',name);
  277. %------------------------------------
  278. % The VARIABLE DISPLAY RANGE text field
  279. n=5;
  280. labelStr='Display Range';
  281. pos=[left top-btnHt*n-varSpacing*(n-1) btnWid btnHt];
  282. hndl=uicontrol( ...
  283. 'Style','text', ...
  284. 'BackgroundColor',frmColor, ...
  285. 'HorizontalAlignment','left', ...
  286. 'Units','pixel', ...
  287. 'Position',pos, ...
  288. 'String',labelStr);
  289. %------------------------------------
  290. % The VARIABLE DISPLAY RANGE edit field
  291. name='disprange';
  292. callbackStr='mfedit #disprange';
  293. pos=[right-btnWid top-btnHt*n-varSpacing*(n-1) btnWid btnHt];
  294. hndl=uicontrol( ...
  295. 'Style','edit', ...
  296. 'Units','pixel', ...
  297. 'Position',pos, ...
  298. 'HorizontalAlignment','left', ...
  299. 'BackgroundColor',editColor, ...
  300. 'Callback',callbackStr, ...
  301. 'Tag',name);
  302. %====================================
  303. % The MF frame 
  304. bottom=border+7*spacing+2*btnHt;
  305. left=right+3*spacing;
  306. right=maxRight-border-spacing;
  307. frmBorder=spacing;
  308. frmPos=[left-frmBorder bottom-frmBorder ...
  309. right-left+frmBorder*2 top-bottom+frmBorder*2]+[1 0 1 0];
  310. mfFrmHndl=uicontrol( ...
  311. 'Style','frame', ...
  312. 'Units','pixel', ...
  313. 'Position',frmPos, ...
  314. 'BackgroundColor',frmColor);
  315. mfBtnWid=1.2*btnWid;
  316. mfHSpacing=(right-left-2*mfBtnWid);
  317. mfVSpacing=(top-bottom-4*btnHt)/3;
  318. %------------------------------------
  319. % The MEMBERSHIP FUNCTION text field
  320. n=1;
  321. labelStr='Current Membership Function (click on MF to select)';
  322. pos=[left top-btnHt*n-mfVSpacing*(n-1) right-left btnHt];
  323. uicontrol( ...
  324. 'Style','text', ...
  325. 'BackgroundColor',frmColor, ...
  326. 'HorizontalAlignment','left', ...
  327. 'Units','pixel', ...
  328. 'Position',pos, ...
  329. 'String',labelStr);
  330. %------------------------------------
  331. % The MF Name text label
  332. n=2; m=1;
  333. labelStr='Name';
  334. pos=[left+(m-1)*(mfBtnWid+mfHSpacing) top-btnHt*n-mfVSpacing*(n-1) mfBtnWid btnHt];
  335. hndl=uicontrol( ...
  336. 'Style','text', ...
  337. 'HorizontalAlignment','left', ...
  338. 'BackgroundColor',frmColor, ...
  339. 'Units','pixel', ...
  340. 'Position',pos, ...
  341. 'String',labelStr);
  342. %------------------------------------
  343. % The MF NAME edit field
  344. m=2;
  345. callbackStr='mfedit #mfname';
  346.     labelStr = 'test';
  347. name='mfname';
  348. pos=[left+(m-1)*(mfBtnWid+mfHSpacing) top-btnHt*n-mfVSpacing*(n-1) mfBtnWid btnHt];
  349. hndl=uicontrol( ...
  350. 'Style','edit', ...
  351. 'Units','pixel', ...
  352. 'Position',pos, ...
  353. 'HorizontalAlignment','left', ...
  354. 'BackgroundColor',editColor, ...
  355. 'Tag',name, ...
  356. 'Callback',callbackStr, ...
  357. 'String','testval');
  358. %------------------------------------
  359. % The MF TYPE text label
  360. n=3; m=1;
  361. labelStr='Type';
  362. pos=[left+(m-1)*(mfBtnWid+mfHSpacing) top-btnHt*n-mfVSpacing*(n-1) mfBtnWid btnHt];
  363. hndl=uicontrol( ...
  364. 'Style','text', ...
  365. 'HorizontalAlignment','left', ...
  366. 'BackgroundColor',frmColor, ...
  367. 'Units','pixel', ...
  368. 'Position',pos, ...
  369. 'String',labelStr);
  370. %------------------------------------
  371. % The MF TYPE popup menu
  372. m=2;
  373. callbackStr='mfedit #mftype';
  374. labelStr1=str2mat(' trimf',' trapmf',' gbellmf',' gaussmf',' gauss2mf',' sigmf');
  375. labelStr1=str2mat(labelStr1,' dsigmf',' psigmf',' pimf',' smf',' zmf');
  376. labelStr2=str2mat(' constant',' linear');
  377. name='mftype';
  378. pos=[left+(m-1)*(mfBtnWid+mfHSpacing) top-btnHt*n-mfVSpacing*(n-1) mfBtnWid btnHt];
  379. hndl=uicontrol( ...
  380. 'Style','popupmenu', ...
  381. 'Units','pixel', ...
  382. 'UserData',labelStr2, ...
  383. 'Position',pos, ...
  384. 'HorizontalAlignment','left', ...
  385. 'BackgroundColor',popupColor, ...
  386. 'Callback',callbackStr, ...
  387. 'String',labelStr1, ...
  388. 'Tag',name);
  389. %------------------------------------
  390. % The MF PARAMS text label
  391. n=4; m=1;
  392. labelStr='Params';
  393. pos=[left top-btnHt*n-mfVSpacing*(n-1) btnWid btnHt];
  394. hndl=uicontrol( ...
  395. 'Style','text', ...
  396. 'HorizontalAlignment','left', ...
  397. 'BackgroundColor',frmColor, ...
  398. 'Units','pixel', ...
  399. 'Position',pos, ...
  400. 'String',labelStr);
  401. %------------------------------------
  402. % The MF PARAMS edit field
  403. n=4;
  404. callbackStr='mfedit #mfparams';
  405. name='mfparams';
  406. pos=[left+btnWid top-btnHt*n-mfVSpacing*(n-1) right-left-btnWid btnHt];
  407. hndl=uicontrol( ...
  408. 'Style','edit', ...
  409. 'HorizontalAlignment','left', ...
  410. 'BackgroundColor',editColor, ...
  411. 'Units','pixel', ...
  412. 'Position',pos, ...
  413. 'Callback',callbackStr, ...
  414. 'Tag',name);
  415. callbackStr='mfedit #plotmfs';
  416. name='numpoints';
  417. pos=[0.851 0.94 0.10 0.05];
  418. hndl=uicontrol( ...
  419. 'Style','edit', ...
  420. 'HorizontalAlignment','right', ...
  421. 'BackgroundColor',editColor, ...
  422. 'Units','normal', ...
  423. 'Position',pos, ...
  424. 'String', '181', ...
  425. 'Callback',callbackStr, ...
  426. 'Tag',name);
  427. pos=[0.74 0.94 0.10 0.05];
  428. hndl=uicontrol( ...
  429. 'Style','text', ...
  430. 'HorizontalAlignment','right', ...
  431. 'BackgroundColor', figColor, ...
  432. 'Units','normal', ...
  433. 'Position',pos, ...
  434. 'FontSize',8, ...
  435. 'String', 'plot points:', ...
  436. 'Tag','pointlabel');
  437. %====================================
  438. % The CLOSE frame 
  439. bottom=border+4*spacing+btnHt;
  440. top=bottom+btnHt;
  441. left=border+2*btnWid+5*spacing;
  442. right=maxRight-border-spacing;
  443. clsBtnWid=1.2*btnWid;
  444. clsSpacing=(right-left-3*clsBtnWid)/2;
  445. frmBorder=spacing;
  446. frmPos=[left-frmBorder bottom-frmBorder ...
  447. right-left+frmBorder*2 top-bottom+frmBorder*2]+[1 0 1 0];
  448. clsFrmHndl=uicontrol( ...
  449. 'Style','frame', ...
  450. 'Units','pixel', ...
  451. 'Position',frmPos, ...
  452. 'BackgroundColor',frmColor);
  453. %------------------------------------
  454. % The HELP button
  455. labelStr='Help';
  456. callbackStr='mfedit #help';
  457. helpHndl=uicontrol( ...
  458. 'Style','push', ...
  459. 'Position',[left bottom clsBtnWid btnHt], ...
  460. 'BackgroundColor',btnColor, ...
  461. 'String',labelStr, ...
  462. 'Callback',callbackStr);
  463. %------------------------------------
  464. % The CLOSE button
  465. labelStr='Close';
  466. callbackStr='fisgui #close';
  467. closeHndl=uicontrol( ...
  468. 'Style','push', ...
  469. 'Position',[right-clsBtnWid bottom clsBtnWid btnHt], ...
  470. 'BackgroundColor',btnColor, ...
  471. 'String',labelStr, ...
  472. 'Callback',callbackStr);
  473. %====================================
  474. % The STATUS frame 
  475. top=border+spacing+btnHt;
  476. bottom=border+spacing;
  477. right=maxRight-border-spacing;
  478. left=border+spacing;
  479. frmBorder=spacing;
  480. frmPos=[left-frmBorder bottom-frmBorder ...
  481. right-left+frmBorder*2 top-bottom+frmBorder*2]+[1 0 1 0];
  482. topFrmHndl=uicontrol( ...
  483. 'Style','frame', ...
  484. 'Units','pixel', ...
  485. 'Position',frmPos, ...
  486. 'BackgroundColor',frmColor);
  487. %------------------------------------
  488. % The STATUS text window
  489. labelStr=' ';
  490. name='status';
  491. pos=[left bottom right-left btnHt];
  492. hndl=uicontrol( ...
  493. 'Style','text', ...
  494. 'BackgroundColor',frmColor, ...
  495. 'HorizontalAlignment','left', ...
  496. 'Units','pixel', ...
  497. 'Position',pos, ...
  498. 'Tag',name, ...
  499. 'String',labelStr);
  500. % Plot the curves of the first input variable
  501. if nargin<3, varIndex=1; end
  502. if nargin<2, varType='input'; end
  503. mfedit('#update',varType,varIndex);
  504.     % Call selectmf to select first mf and populate mf text boxes
  505.     localSelectmf([], [], selectColor);
  506. % Uncover the figure
  507. set(figNumber, ...
  508. 'Visible','on', 'HandleVisibility','callback');
  509. elseif strcmp(action,'#update'),
  510. %====================================
  511. figNumber=watchon;
  512. oldfis=get(figNumber,'UserData');
  513. fis=oldfis{1};
  514. % Clear the current variable plots and redisplay
  515. inputAxes=findobj(figNumber,'Type','axes','Tag','input');
  516. outputAxes=findobj(figNumber,'Type','axes','Tag','output');
  517. delete([inputAxes; outputAxes])
  518. varAxes=findobj(figNumber,'Type','axes','Tag','variables');
  519. axes(varAxes);
  520. mfedit #plotvars
  521.     
  522.     % Select any variables in the FIS Editor that are new or have been double clicked  
  523.     FuzzyEdHndl = findall(0, 'Type', 'Figure', 'Name', ['Membership Function Editor: ' fis.name]);
  524.     if ~isempty(FuzzyEdHndl)
  525.         % [1 0.3 0.3] is the color used by the FIS Editor to highlight variables
  526.         SelectAxHndl = findobj(FuzzyEdHndl, 'Type', 'Axes', 'XColor', [1 0.3 0.3]);
  527.         if ~isempty(SelectAxHndl)
  528.             varIndex = get(SelectAxHndl,'UserData');
  529.             varName  = get(SelectAxHndl,'Tag');
  530.             if strcmp('i',varName(1))
  531.                 varType = 'input';
  532.             else
  533.                 varType = 'output';
  534.             end
  535.         else
  536.             % The default variable is the first input
  537.             varIndex = 1;
  538.             varType = 'input';    
  539.         end
  540.     end
  541.     
  542.    currVarAxes=findobj(figNumber,'Type','axes','Tag',varType,'UserData',varIndex);
  543. if isempty(currVarAxes),
  544. statmsg(figNumber,'No variables for this system');
  545. else
  546. currVarAxesChildren=get(currVarAxes,'Children');
  547. set(figNumber,'CurrentObject',currVarAxesChildren(1));
  548. mfedit #selectvar
  549. statmsg(figNumber,'Ready');
  550. end
  551. watchoff(figNumber)
  552. elseif strcmp(action,'#keypress'),
  553. %====================================
  554. figNumber=gcf;
  555. removeMFHndl=findobj(figNumber,'Type','uimenu','Tag','removemf');
  556.     key_number = get(figNumber,'CurrentCharacter');
  557.     if ~isempty(key_number)
  558.         if abs(key_number)==127,
  559.             if strcmp(get(removeMFHndl,'Enable'),'on')
  560. mfedit #removemf
  561.             end
  562.         end
  563.     end
  564. elseif strcmp(action,'#selectvar'),
  565. %====================================
  566. figNumber=watchon; 
  567. oldfis=get(figNumber,'UserData');
  568. fis=oldfis{1};
  569. fisType=fis.type;
  570. newCurrVarPatch=get(figNumber,'CurrentObject');
  571. %   sss=get(newCurrVarPatch)
  572. %   newCurrVarPatch = gcbo;
  573. %   if isempty(newCurrVarPatch)| ~strcmp(get(newCurrVarPatch, 'Type'), 'patch')
  574. %     newCurrVarPatch=findobj(figNumber, 'Tag', 'input1');
  575. %   end
  576. newCurrVar=get(newCurrVarPatch,'Parent');
  577. varIndex=get(newCurrVar,'UserData');
  578. varType=get(newCurrVar,'Tag');
  579. % Deselect all others if necessary
  580. oldCurrVar=findobj(figNumber,'Type','axes','XColor',selectColor);
  581. if newCurrVar~=oldCurrVar,
  582. set(oldCurrVar,'XColor','k','YColor','k');
  583. set(oldCurrVar,'LineWidth',1);
  584. end
  585. % Now hilight the new selection
  586. set(newCurrVar,'XColor',selectColor,'YColor',selectColor);
  587. set(newCurrVar,'LineWidth',3);
  588. % Set all current variable display registers ...
  589. dispRangeHndl=findobj(figNumber,'Type','uicontrol','Tag','disprange');
  590. customHndl=findobj(figNumber,'Type','uimenu','Tag','addcustommf');
  591. if strcmp(fisType,'sugeno') & strcmp(varType,'output'),
  592. % Handle sugeno case
  593. dispRangeStr=' ';
  594. set(dispRangeHndl,'String',dispRangeStr,'UserData',dispRangeStr, ...
  595. 'Enable','off');
  596. set(customHndl,'Enable','off');
  597. else
  598. dispRangeStr=[' ' mat2str(eval(['fis.' varType '(' num2str(varIndex) ').range']), 4)];   
  599. set(dispRangeHndl,'String',dispRangeStr,'UserData',dispRangeStr, ...
  600. 'Enable','on');
  601. set(customHndl,'Enable','on');
  602. end
  603. if strcmp(get(figNumber,'SelectionType'),'open'),
  604. fisgui #findgui
  605. end
  606. % The VARIABLE NAME text field
  607. name='varname';
  608. hndl=findobj(figNumber,'Type','uicontrol','Tag',name);
  609. varName=eval(['fis.' varType '(' num2str(varIndex),').name']);
  610. set(hndl,'String',varName);
  611. % The VARIABLE TYPE text field
  612. name='vartype';
  613. hndl=findobj(figNumber,'Type','uicontrol','Tag',name);
  614. set(hndl,'String',varType);
  615. % The VARIABLE RANGE text field
  616. name='varrange';
  617. hndl=findobj(figNumber,'Type','uicontrol','Tag',name);
  618. rangeStr=mat2str(eval(['fis.' varType '(' num2str(varIndex),').range']),4);
  619. labelStr=[' ' rangeStr];
  620. set(hndl,'String',labelStr);
  621. statmsg(figNumber,['Selected variable "' varName '"']);
  622. mfedit #plotmfs
  623.     % Call localSelectmf to select first mf and populate mf text boxes
  624.     localSelectmf([], [], selectColor);
  625. watchoff(figNumber)
  626. elseif strcmp(action,'#deselectmf'),
  627. %====================================
  628. figNumber=get(0,'CurrentFigure');
  629. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  630. varType=get(currVarAxes,'Tag');
  631. mainAxes=findobj(figNumber,'Type','axes','Tag','mainaxes');
  632. param=get(mainAxes,'UserData');
  633. currMF=param.CurrMF;
  634. lineHndl=findobj(mainAxes,'Tag','mfline', 'UserData', currMF);
  635. %  for i=1:length(lineHndlList)
  636. %    thisparam=get(lineHndlList(i), 'UserData');
  637. %    if thisparam.CurrMF == currMF,
  638. %      lineHndl=lineHndlList(i);
  639. %      break;
  640. %    end
  641. %  end
  642. txtHndl=findobj(mainAxes,'Type','text','UserData',currMF);
  643. % Clear the current MF register
  644. param.CurrMF=-1;
  645. set(mainAxes,'UserData',param);
  646. if strcmp(varType,'input'),
  647. backgroundColor=inputColor;
  648. else 
  649. backgroundColor=outputColor;
  650. end
  651. set(lineHndl,'Color',backgroundColor);
  652. set(lineHndl,'LineWidth',1);
  653. set(lineHndl,'Color',unselectColor);
  654. %    set(lineHndl, 'Tag', 'line');
  655. set(txtHndl,'Color',unselectColor,'FontWeight','normal');
  656. % Clean up the MF fields
  657. hndl=findobj(figNumber,'Type','uicontrol','Tag','mfname');
  658. if strcmp(get(hndl,'Enable'),'on'),
  659. set(hndl,'String',' ','Enable','off');
  660. hndl=findobj(figNumber,'Tag','mftype');
  661. set(hndl,'Value',1,'Enable','off');
  662. hndl=findobj(figNumber,'Type','uicontrol','Tag','mfparams');
  663. set(hndl,'String',' ','Enable','off');
  664. hndl=findobj(figNumber,'Type','uimenu','Tag','removemf');
  665. set(hndl,'Enable','off');
  666. end
  667. elseif strcmp(action,'#varrange'),
  668. %====================================
  669. figNumber=watchon; 
  670. oldfis=get(figNumber,'UserData');
  671. fis=oldfis{1};
  672. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  673. varIndex=get(currVarAxes,'UserData');
  674. varType=get(currVarAxes,'Tag');
  675. % Get the range
  676. oldRange=eval(['fis.' varType '(' num2str(varIndex) ').range']);
  677. varRangeHndl=findobj(figNumber,'Type','uicontrol','Tag','varrange');
  678. dispRangeHndl=findobj(figNumber,'Type','uicontrol','Tag','disprange');
  679. newRangeStr=get(varRangeHndl,'String');
  680. % We'll put the brackets in later; no point in dealing with the hassle
  681. index=[find(newRangeStr=='[') find(newRangeStr==']')];
  682. newRangeStr(index)=32*ones(size(index));
  683. newRangeStr=['[' newRangeStr ']'];
  684. % Use eval try-catch to prevent really weird stuff...
  685. newRange=eval(newRangeStr,mat2str(oldRange,4));
  686. if length(newRange)~=2,
  687. statmsg(figNumber,'Range vector must have exactly two elements');
  688. newRange=oldRange;
  689. end
  690. if diff(newRange)<=0,
  691. statmsg(figNumber,'Range vector must be of the form [lowLimit highLimit]');
  692. newRange=oldRange;
  693. end
  694. rangeStr=mat2str(newRange,4);
  695. set(varRangeHndl,'String',[' ' rangeStr]);
  696. % The next section changes the parameters of the MFs so they span the 
  697. % new range. This is appropriate for Mamdani systems, and for the inputs
  698. % of Sugeno systems, but not for the output of Sugeno systems
  699. if ~(strcmp(fis.type,'sugeno') & strcmp(varType,'output')),
  700. if ~all(newRange==oldRange),
  701. % Don't bother to do anything unless it's changed
  702. % Change all params here
  703. numMFs=eval(['length(fis.' varType '(' num2str(varIndex) ').mf)']);
  704. for count=1:numMFs,
  705. oldParams=eval(['fis.' varType '(' num2str(varIndex) ').mf(' num2str(count) ').params']);
  706. mfType=eval(['fis.' varType '(' num2str(varIndex)  ').mf(' num2str(count) ').type']);
  707. [newParams,errorStr]=strtchmf(oldParams,oldRange,newRange,mfType);
  708. eval(['fis.' varType '(' num2str(varIndex) ').mf(' num2str(count) ').params=' mat2str(newParams) ';']);
  709. end
  710. eval(['fis.' varType '(' num2str(varIndex) ').range=' mat2str(newRange) ';']);
  711. updtfis(figNumber,fis,[4 5]);
  712. pushundo(figNumber,fis);
  713. % ... and plot
  714. set(dispRangeHndl,'String',[' ' rangeStr]);
  715. mfedit #plotmfs
  716. end
  717. end
  718. watchoff(figNumber)
  719. elseif strcmp(action,'#disprange'),
  720. %====================================
  721. figNumber=watchon; 
  722. oldRange=[];
  723. oldfis=get(figNumber,'UserData');
  724. fis=oldfis{1};
  725. % Find current variable
  726. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  727. varIndex=get(currVarAxes,'UserData');
  728. varType=get(currVarAxes,'Tag');
  729. varRangeHndl=findobj(figNumber,'Type','uicontrol','Tag','varrange');
  730. dispRangeHndl=findobj(figNumber,'Type','uicontrol','Tag','disprange');
  731. % Get the old range
  732. oldRangeStr=get(dispRangeHndl,'UserData');
  733. newRangeStr=get(dispRangeHndl,'String');
  734. % We'll put the brackets in later; no point in dealing with the hassle
  735. index=[find(newRangeStr=='[') find(newRangeStr==']')];
  736. newRangeStr(index)=32*ones(size(index));
  737. newRangeStr=['[' newRangeStr ']'];
  738. % Use eval try-catch to prevent really weird stuff...
  739. newRange=eval(newRangeStr,mat2str(oldRange,4));
  740. if length(newRange)~=2,
  741. statmsg(figNumber,'Range vector must have exactly two elements');
  742. newRangeStr=oldRangeStr;
  743. end
  744. if diff(newRange)<=0,
  745. statmsg(figNumber,'Range vector must be of the form [lowLimit highLimit]');
  746. newRangeStr=oldRangeStr;
  747. end
  748. newRange=eval(newRangeStr,oldRangeStr);
  749. rangeStr=mat2str(newRange,4);
  750. set(dispRangeHndl,'String',[' ' rangeStr]);
  751. % ... and plot
  752. mfedit #plotmfs
  753. watchoff(figNumber)
  754. elseif strcmp(action,'#mfname'),
  755. %====================================
  756. figNumber=watchon; 
  757. oldfis=get(figNumber,'UserData');
  758. fis=oldfis{1};
  759. mfNameHndl=findobj(figNumber,'Type','uicontrol','Tag','mfname');
  760. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  761. varIndex=get(currVarAxes,'UserData');
  762. varType=get(currVarAxes,'Tag');
  763. if strcmp(varType,'input'),
  764. backgroundColor=inputColor;
  765. else 
  766. backgroundColor=outputColor;
  767. end
  768. thisuserdata=get(gca,'UserData');
  769. currMF=thisuserdata.CurrMF;
  770. oldName=eval(['fis.' varType '(' num2str(varIndex),').mf(' num2str(currMF),').name']);
  771. newName=deblank(get(mfNameHndl,'String'));
  772. % Strip off the leading space
  773. newName=fliplr(deblank(fliplr(newName)));
  774. % Replace any remaining blanks with underscores
  775. newName(find(newName==32))=setstr(95*ones(size(find(newName==32))));
  776. msgStr=['Renaming MF ' num2str(currMF) ' to "' newName '"'];
  777. statmsg(figNumber,msgStr);
  778. txtHndl=findobj(figNumber,'Type','text','UserData',currMF);
  779. set(txtHndl,'Color',backgroundColor);
  780. set(txtHndl,'String',newName);
  781. set(txtHndl,'Color',selectColor);
  782. set(mfNameHndl,'String',[' ' newName]);
  783. eval(['fis.' varType '(' num2str(varIndex) ').mf(' num2str(currMF) ').name=''' newName  '''' '; ']);
  784. pushundo(figNumber,fis);
  785. updtfis(figNumber,fis,[3 4]);
  786. watchoff(figNumber)
  787. elseif strcmp(action,'#mftype'),
  788. %====================================
  789. figNumber=watchon; 
  790. %   mfTypeHndl=get(figNumber,'CurrentObject');
  791. mfTypeHndl=gcbo;
  792. oldfis=get(figNumber,'UserData');
  793. fis=oldfis{1};
  794. fisType=fis.type;
  795. numInputs=length(fis.input);
  796. % Is the current variable input or output?
  797. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  798. varIndex=get(currVarAxes,'UserData');
  799. varType=get(currVarAxes,'Tag');
  800. mainAxes=findobj(figNumber,'Type','axes','Tag','mainaxes');
  801. %  currMF=get(mainAxes,'UserData');
  802. param=get(mainAxes,'UserData');
  803. currMF=param.CurrMF;
  804. if strcmp(varType,'input'),
  805. backgroundColor=inputColor;
  806. else 
  807. backgroundColor=outputColor;
  808. end
  809. typeList=get(mfTypeHndl,'String');
  810. typeValue=get(mfTypeHndl,'Value');
  811. newType=deblank(typeList(typeValue,:));
  812. % Strip off the leading space
  813. newType=fliplr(deblank(fliplr(newType)));
  814. msgStr=['Changing MF ' num2str(currMF) ' type to "' newType '"'];
  815. statmsg(figNumber,msgStr);
  816. paramHndl=findobj(figNumber,'Tag','mfparams');
  817. % Now translate and insert the translated parameters
  818. if strcmp(fisType,'sugeno') & strcmp(varType,'output'),
  819. % Handle the sugeno case
  820.         oldParams=fis.(varType)(varIndex).mf(currMF).params;
  821. if strcmp(newType,'constant'),
  822. % Pick off only the constant term
  823. newParams=oldParams(length(oldParams));
  824.     fis.(varType)(varIndex).mf(currMF).type=newType;
  825. fis.(varType)(varIndex).mf(currMF).params=newParams;
  826. else
  827. fis.(varType)(varIndex).mf(currMF).type=newType;
  828. if length(oldParams)==1
  829. fis.(varType)(varIndex).mf(currMF).params=[zeros(1,numInputs) oldParams];
  830. end  
  831. end
  832. newParams=fis.(varType)(varIndex).mf(currMF).params;
  833. mfParamHndl=findobj(figNumber,'Type','uicontrol','Tag','mfparams');
  834. set(mfParamHndl,'String',[' ' mat2str(newParams,4)]);
  835. pushundo(figNumber,fis);
  836. updtfis(figNumber,fis,[4 5]);
  837. else
  838. oldParams=fis.(varType)(varIndex).mf(currMF).params;
  839. oldType=fis.(varType)(varIndex).mf(currMF).type;
  840. oldType=deblank(oldType);
  841. newType=deblank(newType);
  842.         varRange=fis.(varType)(varIndex).range;
  843.         tol=1e-3*(varRange(2)-varRange(1));
  844. [newParams,errorStr]=mf2mf(oldParams,oldType,newType,tol);
  845. if isempty(newParams),
  846. statmsg(figNumber,errorStr);
  847. set(paramHndl,'String',[' ' mat2str(oldParams,4)]);
  848. val=findrow(oldType,typeList);
  849. set(mfTypeHndl,'Value',val);
  850. else
  851. % Set the MF params to the right value
  852. set(paramHndl,'String',[' ' mat2str(newParams,4)]);
  853. % Replot the new curve
  854. lineHndl=findobj(mainAxes,'Tag','mfline','UserData',currMF);
  855. %       lineHndlList=findobj(mainAxes,'Type','mfline');
  856. %       for i=1:length(lineHndlList)
  857. %         thisparam=get(lineHndlList(i), 'UserData');
  858. %         if ~isempty(thisparam) & thisparam.CurrMF == currMF,
  859. %           lineHndl=lineHndlList(i);
  860. %          break;
  861. %         end
  862. %       end
  863. txtHndl=findobj(mainAxes,'Type','text','UserData',currMF);
  864. % First erase the old curve
  865. set(lineHndl,'Color',backgroundColor);
  866. set(txtHndl,'Color',backgroundColor);
  867. x=get(lineHndl,'XData');
  868. mfType=eval(['fis.' varType '(' num2str(varIndex) ').mf(' num2str(currMF) ').type']);
  869.             y=evalmf(x,newParams,newType);
  870. set(lineHndl,'YData',y,'Color',selectColor);
  871. centerIndex=find(y==max(y));
  872. centerIndex=round(mean(centerIndex));
  873. txtPos=get(txtHndl,'Position');
  874. txtPos(1)=x(centerIndex);
  875. set(txtHndl,'Position',txtPos,'Color',selectColor);
  876. eval(['fis.' varType '(' num2str(varIndex) ').mf(' num2str(currMF) ').type=''' newType ''';']);
  877. eval(['fis.' varType '(' num2str(varIndex) ').mf(' num2str(currMF) ').params=' mat2str(newParams) ';']);
  878. pushundo(figNumber,fis);
  879. updtfis(figNumber,fis,[4 5]);
  880. mfdrag('mf', lineHndl, newType, newParams);
  881. end
  882. end
  883. watchoff(figNumber)
  884. elseif strcmp(action,'#mfparams'),
  885. %====================================
  886. mfParamHndl = gcbo;
  887. figNumber=watchon; 
  888. oldfis=get(figNumber,'UserData');
  889. fis=oldfis{1};
  890. fisType=fis.type;
  891. % Is the current variable input or output?
  892. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  893. varIndex=get(currVarAxes,'UserData');
  894. varType=get(currVarAxes,'Tag');
  895. if strcmp(varType,'input'),
  896. backgroundColor=inputColor;
  897. else 
  898. backgroundColor=outputColor;
  899. end
  900. mainAxes=findobj(figNumber,'Type','axes','Tag','mainaxes');
  901. param=get(mainAxes,'UserData');
  902. currMF=param.CurrMF;
  903. % Read user input
  904. newParamStr=get(mfParamHndl,'String');
  905. if isempty(newParamStr)
  906. newParams = [];
  907. else
  908. newParams = evalin('base',newParamStr,'[]');
  909. if ~isreal(newParams)
  910. newParams = [];
  911. else
  912.     newParams = reshape(newParams,[1 prod(size(newParams))]);
  913. end
  914. end
  915. % Use the old parameters for error-checking
  916. RefStruct = substruct('.',varType,'()',{varIndex},'.','mf','()',{currMF});
  917. EditedMF = subsref(fis,RefStruct);
  918. oldParams = EditedMF.params;
  919. % Resolve length discrepancies for Sugeno outputs
  920. if length(newParams)==1 & strcmpi(fisType,'sugeno') & strcmpi(varType,'output')
  921. newParams = [zeros(1,length(fis.input)*strcmp(EditedMF.type,'linear')),newParams];
  922. end
  923. % Update FIS data
  924. if length(newParams)~=length(oldParams),
  925. % Back out change
  926. newParams = oldParams;
  927. msgStr = sprintf('Invalid parameter vector. No change made to MF %d',currMF);
  928. else
  929. % Send status message to the user
  930. msgStr=sprintf('Changing parameter for MF %d to %s',currMF,newParamStr);
  931. if strcmp(fisType,'sugeno') & strcmp(varType,'output'),
  932. % Nothing to do for sugeno output case...
  933. EditedMF.params = newParams;
  934. fis = subsasgn(fis,RefStruct,EditedMF);
  935. pushundo(figNumber,fis);
  936. updtfis(figNumber,fis,[4 5]);
  937. else
  938. lineHndl=findobj(mainAxes,'Type','line','UserData',currMF);
  939. x=get(lineHndl,'XData');
  940. try 
  941. y = evalmf(x,newParams,EditedMF.type);
  942. % New data OK. Update FIS
  943. EditedMF.params = newParams;
  944. fis = subsasgn(fis,RefStruct,EditedMF);
  945. % Replot the curve
  946. txtHndl=findobj(mainAxes,'Type','text','UserData',currMF);
  947. centerIndex=find(y==max(y));
  948. centerIndex=round(mean(centerIndex));
  949. txtPos=get(txtHndl,'Position');
  950. txtPos(1) = x(centerIndex);
  951. txtPos(2) = y(centerIndex) + 0.1;
  952. set(txtHndl,'Position',txtPos,'Color',selectColor);
  953. set(lineHndl,'YData',y,'Color',selectColor);
  954. pushundo(figNumber,fis);
  955. mfdrag('mf', lineHndl, EditedMF.type, newParams);
  956. updtfis(figNumber,fis,[4 5]);
  957. catch
  958. % There's been an error in the MF code, so don't change anything
  959. msgStr = sprintf('Invalid parameter vector. No change made to MF %s',EditedMF.type);
  960. newParams=oldParams;
  961. end
  962. end
  963. end
  964. set(mfParamHndl,'String',[' ' mat2str(newParams,4)]);
  965. statmsg(figNumber,msgStr);
  966. watchoff(figNumber)
  967. elseif strcmp(action,'#plotmfs'),
  968. %====================================
  969. figNumber=gcf;
  970. oldfis=get(figNumber,'UserData');
  971. fis=oldfis{1};
  972. % Find the selected variable
  973. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  974. varIndex=get(currVarAxes,'UserData');
  975. varType=get(currVarAxes,'Tag');
  976. if strcmp(varType,'input'),
  977. backgroundColor=inputColor;
  978. else 
  979. backgroundColor=outputColor;
  980. end
  981. fisType=fis.type;
  982. mainAxes=findobj(figNumber,'Tag','mainaxes');
  983. axes(mainAxes);
  984. varName=eval(['fis.' varType '(' num2str(varIndex) ').name']);
  985. try
  986. numMFs=eval(['length(fis.' varType '(' num2str(varIndex) ').mf)']);
  987. catch
  988. numMFs=0;
  989. end  
  990. if strcmp(fisType,'sugeno') & strcmp(varType,'output'),
  991. % Handle sugeno case
  992. cla
  993. if isfield(fis, 'input')
  994. numInputs=length(fis.input);
  995. else
  996. numInputs=0;
  997. end
  998. inLabels=[];
  999. for i=1:numInputs
  1000. inLabels=strvcat(inLabels, fis.input(i).name);
  1001. end
  1002. varRange=[-1 1];
  1003. for count=1:numMFs,
  1004. mfName=eval(['fis.' varType '(' num2str(varIndex) ').mf(' num2str(count) ').name']);
  1005. txtStr=deblank(mfName);
  1006. if numMFs>6,
  1007. % Use two columns
  1008. if (count-1)<(numMFs/2),
  1009. % This is column one
  1010. xPos=0.25*diff(varRange)+varRange(1);
  1011. yPos=(count-1)/(numMFs/2-1);
  1012. else
  1013. % This is column two
  1014. xPos=0.75*diff(varRange)+varRange(1);
  1015. yPos=(count-round(numMFs/2)-1)/(round(numMFs/2)-1);
  1016. end
  1017. else
  1018. % Only one column is necessary
  1019. xPos=0;
  1020. yPos=(count)/(numMFs);
  1021. end
  1022. text(xPos,yPos,txtStr, ...
  1023. 'Color',unselectColor, ...
  1024. 'UserData',count, ...
  1025. 'EraseMode','normal', ...
  1026. 'HorizontalAlignment','center', ...
  1027. 'FontSize',8, ...
  1028. 'ButtonDownFcn',{@localSelectmf selectColor});
  1029. end
  1030. set(gca,'XTick',[],'YTick',[], ...
  1031. 'XLim',[-1 1],'YLim',[-0.2 1.2], ...
  1032. 'Color',backgroundColor);
  1033. else
  1034. % This is either an input variable or a mamdani output
  1035. dispRangeHndl=findobj(figNumber,'Tag','disprange');
  1036. varRange=eval(get(dispRangeHndl,'String'));
  1037. ptsHndl = findobj(figNumber, 'Tag', 'numpoints');
  1038. numPts=get(ptsHndl, 'String');
  1039. numPts=str2double(numPts);
  1040. cla
  1041. % Draw all the lines
  1042. set(gca, ...
  1043. 'YTick',[0 0.5 1],'XTickMode','auto', ...
  1044. 'YLim',[-0.05 1.2], ...
  1045. 'Color',backgroundColor);
  1046. [xAllMFs,yAllMFs]=plotmf(fis,varType,varIndex,numPts);
  1047. for mfIndex=1:numMFs,
  1048. x=xAllMFs(:,mfIndex);
  1049. y=yAllMFs(:,mfIndex);
  1050. mfName=eval(['fis.' varType '(' num2str(varIndex) ').mf(' num2str(mfIndex) ').name']);
  1051. line(x,y, ...
  1052. 'Color',unselectColor, ...
  1053. 'LineWidth',1, ...
  1054. 'UserData',mfIndex, ...
  1055. 'EraseMode','normal', ...
  1056. 'Tag', 'mfline',...
  1057. 'ButtonDownFcn',{@localSelectmf selectColor})
  1058. centerIndex=find(y==max(y));
  1059. centerIndex=round(mean(centerIndex));
  1060. text(x(centerIndex), 1.1 ,mfName, ...
  1061. 'HorizontalAlignment','center', ...
  1062. 'Color',unselectColor, ...
  1063. 'FontSize',8, ...
  1064. 'UserData',mfIndex, ...
  1065. 'EraseMode','normal', ...
  1066. 'Tag', 'mftext',...
  1067. 'ButtonDownFcn',{@localSelectmf selectColor});
  1068. param=get(gca, 'Userdata');
  1069. param.CurrMF=-1;
  1070. set(gca,'UserData',param,'XLim',varRange);
  1071. set(gca,'XLim',varRange);
  1072. end
  1073. end
  1074. xlabel([varType ' variable "' varName '"'],'Color','black');
  1075. % Clean up the MF fields
  1076. hndl=findobj(figNumber,'Type','uicontrol','Tag','mfname');
  1077. set(hndl,'String',' ','Enable','off');
  1078. hndl=findobj(figNumber,'Type','uicontrol','Tag','mftype');
  1079. set(hndl,'Value',1,'Enable','off');
  1080. hndl=findobj(figNumber,'Type','uicontrol','Tag','mfparams');
  1081. set(hndl,'String',' ','Enable','off');
  1082.     % Ensure plot is redrawn correctly
  1083.     refresh(figNumber);
  1084. elseif strcmp(action,'#removemf'),
  1085. %====================================
  1086. figNumber=watchon;
  1087. oldfis=get(figNumber,'UserData');
  1088. fis=oldfis{1};
  1089. % Find the selected variable and MF
  1090. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  1091. varIndex=get(currVarAxes,'UserData');
  1092. varType=get(currVarAxes,'Tag');
  1093. mainAxes=findobj(figNumber,'Type','axes','Tag','mainaxes');
  1094. param=get(mainAxes,'UserData');
  1095. %  currMF=get(mainAxes,'UserData');
  1096. currMF=param.CurrMF;
  1097. lineHndl=findobj(mainAxes,'Type','line','UserData',currMF);
  1098. txtHndl=findobj(mainAxes,'Type','text','UserData',currMF);
  1099. [fis,errorStr]=rmmf(fis,varType,varIndex,'mf',currMF, true);
  1100. if isempty(fis),
  1101. statmsg(figNumber,errorStr);
  1102. else
  1103. delete(lineHndl);
  1104. delete(txtHndl);
  1105. updtfis(figNumber,fis,[3 4 5 6]);
  1106. pushundo(figNumber,fis);
  1107. mfedit #plotmfs
  1108.         % Deselect the remove mf menu item
  1109. hndl=findobj(figNumber,'Type','uimenu','Tag','removemf');
  1110. set(hndl,'Enable','off');
  1111. end
  1112. watchoff(figNumber)    
  1113. elseif strcmp(action,'#removeallmfs'),
  1114. %====================================
  1115. figNumber=watchon;
  1116. oldfis=get(figNumber,'UserData');
  1117. fis=oldfis{1};
  1118. % Find the selected variable
  1119. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  1120. varIndex=get(currVarAxes,'UserData');
  1121. varType=get(currVarAxes,'Tag');
  1122. mainAxes=findobj(figNumber,'Type','axes','Tag','mainaxes');
  1123. lineHndlList=findobj(mainAxes,'Tag','mfline');
  1124. txtHndlList=findobj(mainAxes,'Type','text');
  1125. deleteFlag=1;
  1126. count=eval(['length(fis.' varType '(' num2str(varIndex) ').mf)']);
  1127. while count>=1,
  1128. [fis,errorStr]=rmmf(fis,varType,varIndex,'mf',count);
  1129. count=count-1;
  1130. if isempty(fis),
  1131. % if any of these MFs are used in the rule base, we can't delete
  1132. deleteFlag=0;
  1133. statmsg(figNumber,errorStr);
  1134. count=0;
  1135. end
  1136. end
  1137. if deleteFlag
  1138. delete(lineHndlList);
  1139. delete(txtHndlList);
  1140. pushundo(figNumber,fis);
  1141. updtfis(figNumber,fis,[]);
  1142. mfedit #plotmfs
  1143.         % Deselect the remove mf menu items
  1144. hndl=findobj(figNumber,'Type','uimenu','Tag','removeallmf');
  1145. set(hndl,'Enable','off');
  1146. hndl=findobj(figNumber,'Type','uimenu','Tag','removemf');
  1147. set(hndl,'Enable','off');
  1148. end
  1149. watchoff(figNumber)    
  1150. elseif strcmp(action,'#addcustommf'),
  1151. %====================================
  1152. figNumber=watchon;
  1153. oldfis=get(figNumber,'UserData');
  1154. fis=oldfis{1};
  1155. % Find the selected variable and MF
  1156. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  1157. varIndex=get(currVarAxes,'UserData');
  1158. varType=get(currVarAxes,'Tag');
  1159. cmfdlg(figNumber,fis,varType,varIndex,figNumber);
  1160. watchoff(figNumber);
  1161. elseif strcmp(action,'#addmfs'),
  1162. %====================================
  1163. figNumber=watchon;
  1164. oldfis=get(figNumber,'UserData');
  1165. fis=oldfis{1};
  1166. % Find the selected variable and MF
  1167. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  1168. varIndex=get(currVarAxes,'UserData');
  1169. varType=get(currVarAxes,'Tag');
  1170.     
  1171.     mfdlg(figNumber,fis,varType,varIndex);
  1172.     mfdlgfig=findobj(0, 'Tag', 'mfdlg');
  1173.     waitfor(mfdlgfig);
  1174.     watchoff(figNumber);
  1175.     oldfis=get(figNumber,'UserData');
  1176.     fis=oldfis{1};
  1177.     updtfis(figNumber,fis,[3]);
  1178.     % There is now atleast one mf therefore check the remove all mf menu item
  1179.     hndl=findobj(figNumber,'Type','uimenu','Tag','removeallmf');
  1180.     set(hndl,'Enable','on');
  1181.     
  1182. elseif strcmp(action,'#plotvars'),
  1183. %====================================
  1184. figNumber=gcf;
  1185. oldfis=get(figNumber,'UserData');
  1186. fis=oldfis{1};
  1187. if isfield(fis, 'input')
  1188. numInputs=length(fis.input);
  1189. else
  1190. numInputs=0;
  1191. end
  1192. if isfield(fis, 'output')
  1193. numOutputs=length(fis.output);
  1194. else
  1195. numOutputs=0;
  1196. end
  1197. for i=1:numInputs
  1198. if isfield(fis.input(i), 'mf')
  1199. numInputMFs(i)=length(fis.input(i).mf);
  1200. else
  1201. numInputMFs(i)=0;
  1202. end
  1203. end
  1204. for i=1:numOutputs
  1205. if isfield(fis.output(i), 'mf')
  1206. numOutputMFs(i)=length(fis.output(i).mf);
  1207. else
  1208. numOutputMFs(i)=0;
  1209. end
  1210. end
  1211. if isfield(fis, 'rule')
  1212. numRules=length(fis.rule);
  1213. else
  1214. numRules=0;
  1215. end
  1216. fisName=fis.name;
  1217. fisType=fis.type;
  1218. mainAxHndl=gca;
  1219. set(mainAxHndl,'Units','pixel','XTick',[],'YTick',[])
  1220. mainAxPos=get(mainAxHndl,'Position');
  1221. axis([mainAxPos(1) mainAxPos(1)+mainAxPos(3) ...
  1222. mainAxPos(2) mainAxPos(2)+mainAxPos(4)]);
  1223. xCenter=mainAxPos(1)+mainAxPos(3)/2;
  1224. yCenter=mainAxPos(2)+mainAxPos(4)/2;
  1225. title('FIS Variables')
  1226. set(get(mainAxHndl,'Title'),'Visible','on','FontSize',10,'Color','black')
  1227. % Inputs first
  1228. if get(0,'ScreenDepth')>2,
  1229. inputColor=[1 1 0.5];
  1230. outputColor=[0.5 1 1];
  1231. else
  1232. inputColor=[1 1 1];
  1233. outputColor=[1 1 1];
  1234. end
  1235. tickColor=[0.5 0.5 0.5];
  1236.     fontSize=8;
  1237.     
  1238.     boxWid=(1/2)*mainAxPos(3);
  1239.     boxHt=(1/(max(4,numInputs)))*mainAxPos(4);
  1240.     xInset=boxWid/10;
  1241.     yInset=boxHt/5;
  1242.     
  1243.     xMin=-1; xMax=1;
  1244.     
  1245.     for varIndex=1:numInputs,
  1246.         boxLft=mainAxPos(1);
  1247.         boxBtm=mainAxPos(2)+mainAxPos(4)-boxHt*varIndex;
  1248.         axPos=[boxLft+xInset boxBtm+yInset boxWid-2*xInset boxHt-2*yInset];
  1249.         
  1250.         varName=eval(['fis.input(' num2str(varIndex) ').name']);
  1251.         axName='input';
  1252.         axHndl=axes( ...
  1253.             'Units','pixel', ...
  1254.             'Box','on', ...
  1255.             'XTick',[],'YTick',[], ...
  1256.             'XColor',tickColor,'YColor',tickColor, ...
  1257.             'YLim',[-0.1 1.1], ...
  1258.             'Color',inputColor, ...
  1259.             'Tag',axName, ...
  1260.             'UserData',varIndex, ...
  1261.             'Position',axPos);
  1262.         mfIndex=(1:numInputMFs(varIndex))+sum(numInputMFs(1:(varIndex-1)));
  1263.         colorOrder=get(gca,'ColorOrder');
  1264.         
  1265.         % Plot three cartoon membership functions in the box
  1266.         x=(-1:0.1:1)';
  1267.         y1=exp(-(x+1).^2/0.32); y2=exp(-x.^2/0.32); y3=exp(-(x-1).^2/0.32);
  1268.         xlineMatrix=[x x x];
  1269.         ylineMatrix=[y1 y2 y3];
  1270.         line(xlineMatrix,ylineMatrix,'Color','black');
  1271.         xiInset=(xMax-xMin)/10;
  1272.         axis([xMin-xiInset xMax+xiInset -0.1 1.1])
  1273.         
  1274.         % Lay down a patch that simplifies clicking on the region
  1275.         patchHndl=patch([xMin xMax xMax xMin],[0 0 1 1],'black');
  1276.         set(patchHndl, ...
  1277.             'EdgeColor','none', ...
  1278.             'FaceColor','none', ...
  1279.             'ButtonDownFcn','mfedit #selectvar');
  1280.         
  1281.         % Now put on the variable name as a label
  1282.         xlabel(varName);
  1283.         labelName=[axName 'label'];
  1284.         set(get(axHndl,'XLabel'), ...
  1285.             'FontSize',fontSize, ...
  1286.             'Color','black', ...
  1287.             'Tag',labelName); 
  1288.     end
  1289.     
  1290.     % Now for the outputs
  1291.     boxHt=(1/(max(4,numOutputs)))*mainAxPos(4);
  1292.     
  1293.     
  1294.     
  1295.     for varIndex=1:numOutputs,
  1296.         boxLft=mainAxPos(1)+boxWid;
  1297.         boxBtm=mainAxPos(2)+mainAxPos(4)-boxHt*varIndex;
  1298.         axPos=[boxLft+xInset boxBtm+yInset boxWid-2*xInset boxHt-2*yInset];
  1299.         
  1300.         varName=eval(['fis.output(' num2str(varIndex) ').name']);
  1301.         axName='output';
  1302.         axHndl=axes( ...
  1303.             'Units','pixel', ...
  1304.             'Box','on', ...
  1305.             'Color',outputColor, ...
  1306.             'XTick',[],'YTick',[], ...  
  1307.             'XLim',[xMin xMax],'YLim',[-0.1 1.1], ...
  1308.             'XColor',tickColor,'YColor',tickColor, ...
  1309.             'Tag',axName, ...
  1310.             'UserData',varIndex, ...
  1311.             'Position',axPos);
  1312.         mfIndex=(1:numOutputMFs(varIndex))+sum(numOutputMFs(1:(varIndex-1)));
  1313.         if ~strcmp(fisType,'sugeno'),
  1314.             % Only try to plot outputs it if it's not a Sugeno-style system
  1315.             x=[-1 -0.5 0 0.5 1]';
  1316.             xlineMatrix=[x x x];
  1317.             ylineMatrix=[0 1 0 0 0;0 0 1 0 0; 0 0 0 1 0]';
  1318.             line(xlineMatrix,ylineMatrix,'Color','black');
  1319.             xoInset=(xMax-xMin)/10;
  1320.         else
  1321.             text(0,0.5,'f(u)', ...
  1322.                 'FontSize',fontSize, ...
  1323.                 'Color','black', ...
  1324.                 'HorizontalAlignment','center');
  1325.         end
  1326.         
  1327.         % Lay down a patch that simplifies clicking on the region
  1328.         patchHndl=patch([xMin xMax xMax xMin],[0 0 1 1],'black');
  1329.         set(patchHndl, ...
  1330.             'EdgeColor','none', ...
  1331.             'FaceColor','none', ...
  1332.             'ButtonDownFcn','mfedit #selectvar');
  1333.         
  1334.         xlabel(varName);
  1335.         labelName=[axName 'label'];
  1336.         set(get(axHndl,'XLabel'), ...
  1337.             'FontSize',fontSize, ...
  1338.             'Color','black', ...
  1339.             'Tag',labelName);
  1340.     end
  1341.     
  1342.     hndlList=findobj(figNumber,'Units','pixels');
  1343.     set(hndlList,'Units','normalized')
  1344.     
  1345. elseif strcmp(action,'#help');
  1346.     figNumber=watchon;
  1347.     helpwin(mfilename)
  1348.     watchoff(figNumber)
  1349.     
  1350. end;    % if strcmp(action, ...
  1351. %%%%%%%%%%%%%%%%%%%%%%%
  1352. %%% localgetmfparam %%%
  1353. %%%%%%%%%%%%%%%%%%%%%%%
  1354. function out = localgetmfparam(fis, varType, varNum, mfNum, param)
  1355. switch varType
  1356. case 'input'
  1357.     switch param
  1358.     case 'name'
  1359.         out=fis.input(varNum).mf(mfNum).name;
  1360.     case 'type'
  1361.         out=fis.input(varNum).mf(mfNum).type;
  1362.     case 'params'
  1363.         out=fis.input(varNum).mf(mfNum).params;
  1364.     end   
  1365. case 'output'
  1366.     switch param
  1367.     case 'name'
  1368.         out=fis.output(varNum).mf(mfNum).name;
  1369.     case 'type'
  1370.         out=fis.output(varNum).mf(mfNum).type;
  1371.     case 'params'
  1372.         out=fis.output(varNum).mf(mfNum).params;
  1373.     end   
  1374. end
  1375. %%%%%%%%%%%%%%%%%%%%%
  1376. %   localSelectmf   %
  1377. %%%%%%%%%%%%%%%%%%%%%
  1378. function localSelectmf(eventSrc, eventHdl, selectColor)
  1379. % Called when a user btn downs on an mf and selects the first mf
  1380. % to be selected when a new input or output is plotted.
  1381. figNumber=watchon;
  1382. oldfis=get(figNumber,'UserData');
  1383. fis=oldfis{1};
  1384. fisType=fis.type;
  1385. % Is the current variable input or output?
  1386. currVarAxes=findobj(figNumber,'Type','axes','XColor',selectColor);
  1387. varIndex=get(currVarAxes,'UserData');
  1388. varType=get(currVarAxes,'Tag');
  1389. if ~isempty(eventSrc)
  1390.     % The function was called from a btn down action on an object
  1391.     mainAxes=get(eventSrc,'Parent');
  1392.     % Find the new current MF
  1393.     param=get(mainAxes,'UserData');
  1394.     oldCurrMF=param.CurrMF;
  1395.     newCurrMF=get(eventSrc,'UserData');
  1396.     param.CurrMF=newCurrMF;
  1397.     plot_mfs = 1;
  1398. else
  1399.     % The function was called directly and should initialize the first mf
  1400.     oldCurrMF = -1;
  1401.     % Check there is an mf to plot
  1402.     if ~isempty(currVarAxes)
  1403.         % Check there is an mf to plot
  1404.         if length(eval(['fis.' varType '(' num2str(varIndex) ').mf'])) >= 1
  1405.             plot_mfs = 1;
  1406.             % Set the first mf to be selected
  1407.             newCurrMF = 1;
  1408.             kids = get(figNumber,'Children');
  1409.             mainAxes = kids(find(strcmp(get(kids,'tag'),'mainaxes')));
  1410.             param.CurrMF=1;
  1411.         else
  1412.             % There are no mfs therefore dont plot anything
  1413.             plot_mfs = 0;
  1414.             % Set the remove mf menuitems
  1415.             h1 = findobj(figNumber,'Type','uimenu','Tag','removemf');
  1416.             h2 = findobj(figNumber,'Type','uimenu','Tag','removeallmf');
  1417.             set([h1, h2],'Enable','off');
  1418.         end
  1419.     else 
  1420.         % There is no selected input or output therefore dont plot anything
  1421.         plot_mfs = 0;
  1422.     end
  1423. end
  1424. % Plot an mf
  1425. if plot_mfs == 1
  1426.     % Deselect other currently selected MF curves
  1427.     if oldCurrMF~=newCurrMF, 
  1428.         if oldCurrMF~=-1 
  1429.             mfedit #deselectmf
  1430.         end
  1431.         set(mainAxes,'UserData',param);
  1432.         
  1433.         % Find the info for the new MF
  1434.         mfType=localgetmfparam(fis, varType, varIndex, newCurrMF, 'type');
  1435.         mfName=localgetmfparam(fis, varType, varIndex, newCurrMF, 'name');
  1436.         mfParams=localgetmfparam(fis, varType, varIndex, newCurrMF, 'params');      
  1437.         % Set the MF name, type and params to the right value
  1438.         mfNameHndl=findobj(figNumber,'Type','uicontrol','Tag','mfname');
  1439.         set(mfNameHndl,'String',[' ' mfName],'Enable','on');
  1440.         
  1441.         mfTypeHndl=findobj(figNumber,'Type','uicontrol','Tag','mftype');
  1442.         mfTypeList=get(mfTypeHndl,'String');
  1443.         if strcmp(fisType,'sugeno') & strcmp(varType,'output'),
  1444.             % Prepare sugeno mf type popup menu
  1445.             if size(mfTypeList,1)>2,
  1446.                 set(mfTypeHndl,'String',get(mfTypeHndl,'UserData'));
  1447.                 set(mfTypeHndl,'UserData',mfTypeList);
  1448.             end
  1449.         else
  1450.             % Prepare mamdani mf type popup menu
  1451.             if size(mfTypeList,1)==2,
  1452.                 set(mfTypeHndl,'String',get(mfTypeHndl,'UserData'));
  1453.                 set(mfTypeHndl,'UserData',mfTypeList);
  1454.             end
  1455.             % Make the selected line bold
  1456.             currLineHndl=findobj(mainAxes,'Tag','mfline','UserData',newCurrMF);
  1457.             
  1458.             set(currLineHndl,'Color',selectColor);
  1459.             mfdrag('mf', currLineHndl, mfType, mfParams);
  1460.             set(currLineHndl,'LineWidth',2);
  1461.         end
  1462.         
  1463.         % Make the selected text bold
  1464.         currTxtHndl=findobj(mainAxes,'Type','text','UserData',newCurrMF);
  1465.         set(currTxtHndl,'Color',selectColor,'FontWeight','bold');
  1466.         
  1467.         mfTypeList=get(mfTypeHndl,'String');
  1468.         mfTypeValue=findrow(mfType,mfTypeList);
  1469.         if isempty(mfTypeValue),
  1470.             mfTypeList=str2mat(mfTypeList, [' ' mfType]);
  1471.             mfTypeValue=findrow(mfType,mfTypeList);
  1472.             set(mfTypeHndl,'String',mfTypeList,'Value',mfTypeValue);
  1473.             msgStr=['Installing custom membership function "' mfType '"'];
  1474.             statmsg(figNumber,msgStr);
  1475.         end
  1476.         set(mfTypeHndl,'Value',mfTypeValue,'Enable','on');
  1477.         curr_info = get(gca, 'CurrentPoint');
  1478.         
  1479.         hndl=findobj(figNumber, 'Tag','mfparams');
  1480.         set(hndl,'String',[' ' mat2str(mfParams,4)],'Enable','on', ...
  1481.             'Userdata', [curr_info(1,1) mfParams]);
  1482.         
  1483.         hndl=findobj(figNumber,'Type','uimenu','Tag','removemf');
  1484.         set(hndl,'Enable','on');
  1485.         
  1486.     end
  1487.     % Reset the remove all mfs menuitem
  1488.     hndl=findobj(figNumber,'Type','uimenu','Tag','removeallmf');
  1489.     set(hndl,'Enable','on');
  1490. end
  1491. watchoff(figNumber)