очистить рабочее пространство GUI matlab - PullRequest
1 голос
/ 27 марта 2012

У меня есть новая кнопка в моем графическом интерфейсе, вот ее обратный вызов:

function ptlNew_ClickedCallback(hObject, eventdata, handles)  
% hObject    handle to ptlNew (see GCBO)  
% eventdata  reserved - to be defined in a future version of MATLAB  
% handles    structure with handles and user data (see GUIDATA)  
cla(handles.axes1,'reset');  
clear variables  

но последняя строка не работает
Что я могу сделать, чтобы очистить рабочее пространство моего графического интерфейса, не закрывая его для заполнения памяти?
мои переменные в структуре ручек
например, если у меня есть переменная X, я должен получить к ней доступ в виде дескрипторов .X
Я сделал свои переменные свойства дескриптора, потому что я хотел получить к ним доступ более чем в одной функции обратного вызова, и я не хотел делать их Global

Также я попытался очистить определенную переменную. поэтому вместо очистить переменные я использовал эту строку кода
прозрачные ручки. Фиксированные пиксели
Но это тоже не работает, и когда я пытаюсь получить к нему доступ в следующей строке с помощью кода:
handles.FiducialPixels
он печатается в окне команд точно так же, как это было раньше
Я действительно смущен, что я могу сделать? Интересная проблема заключается в том, что строка очистить переменные или очистить дескрипторы.

Когда Ли-Аунг Ип ответил, я перевел звонок обратно на эту форму:

function ptlNew_ClickedCallback(hObject, eventdata, handles)
names = fieldnames(handles);
rmfield(handles,'FiducialPixels');
names = fieldnames(handles)
handles.FiducialPixels  

но это то, что появляется в командной строке бегущих строк 4 и 5:

names =

'figure1'
'pnlControlPointsImageCoordinates'
'uitoolbar1'
'pnlCalculateParameters'
'mnuInteriorOrientation'
'btnLoad2'
'edtImageFile'
'text17'
'edtInteriorOrientation'
'edtF'
'text16'
'edtYPPA'
'text15'
'edtXPPA'
'text14'
'text13'
'btnBrowseLensDistortion'
'edtLensDistortion'
'text12'
'btnBrowseInteriorFile'
'text11'
'axes2'
'uitoggletool3'
'uitoggletool2'
'uitoggletool1'
'ptlNew'
'txtCalculation'
'btnJumpTo'
'btnLoad'
'edtImagePath'
'text9'
'btnSaveParameters'
'btnCalculate'
'edtNumber'
'text8'
'uitable1'
'btnGinput'
'btnBrowse'
'edtFilePath'
'text1'
'btngrpTypeOfOrientation'
'axes1'
'mnuItemControlPointsImageCoordinates'
'mnuItemCalculateParameters'
'rdbtnProjective'
'rdbtnAffine'
'rdbtnConformal'
'output'
'TableData'
'TableDataEmpty'
'Matrix'
'FiducialImageCoordinates'
'dataH'
'FiducialPixels'
'flag'
'X'

592 ручки. Фиксированные пиксели

ans =

1.0e + 003 *

7.5294    3.8246
0.1357    3.8723
3.9200    0.2311
3.8882    7.4499
7.4817    0.2311
0.2152    7.5294
0.2311    0.2311
7.4658    7.4817

Вы видите ручки. Фиксированные пиксели все еще существуют
Даже если вы используете guidata (hObject, handles) после третьей строки, результат будет таким же

1 Ответ

4 голосов
/ 28 марта 2012

Если вы хотите удалить абсолютно каждую переменную рабочего пространства, включая все (глобальные) переменные рабочего пространства, созданные вашим сценарием, и эти переменные, созданные в командной строке и переменные, созданные другими скриптами, просто используйте:

clear

Использование clear (каждая переменная) считается невежливым. Это связано с тем, что пользователь может выполнить некоторую работу в командной строке перед вызовом сценария. Когда ваш скрипт вызывает clear, все его работы стираются (навсегда!)


Если вы хотите удалить handles.FiducialPixels - то есть определенный элемент структуры handles - тогда clear - это не то, что вам нужно. Вместо этого используйте функцию rmfield() , предназначенную для удаления полей из структур.

Домашнее задание: прочитайте страницы документации по struct и функции для работы со структурами: cell2struct | deal | fieldnames | getfield | isfield | isstruct | namelengthmax | orderfields | rmfield | setfield | struct2cell | substruct.


Редактировать (1): rmfield() работает работает. Вы просто не используете его правильно.

>> figure
>> handles.h1 = uicontrol

handles = 

    h1: 329.0011

>> handles.h2 = uicontrol

handles = 

    h1: 329.0011
    h2: 0.0016

>> handles = rmfield(handles, 'h1')

handles = 

    h2: 0.0016

С doc rmfield:

rmfield

Удалить поля из структуры

Синтаксис

s = rmfield(s, 'fieldname')

s = rmfield(s, fields)

Описание

s = rmfield(s, 'fieldname') удаляет указанное поле из структурный массив s.

s = rmfield(s, fields) удаляет более одного поля одновременно. fields является символьным массивом имен полей или массивом ячеек строк.

Обратите внимание, что соглашение о вызовах s = rmfield(...) указывает, что rmfield возвращает что-то. В этом случае исходная структура s не изменяется . Вместо этого rmfield() возвращает структуру new без полей, которые вы указали для удаления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...