Графический интерфейс Matlab: ссылка на существующий дескриптор объекта с использованием переменной

В настоящее время я работаю над финальным проектом Matlab для школы. Я считаю себя довольно хорошо осведомленным и опытным, когда дело доходит до программирования... но в Matlab просто СЛИШКОМ много странностей.

Основной вопрос (понял это после нахождения ответа)! Как я могу использовать переменную в вызове объекта дескриптора графического интерфейса без имени переменной, используемой вместо значения?

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

Мой проект — создание простой версии старой игры «Морской бой».

Моя проблема: в настоящее время у меня есть 5 объектов (топоров) для частей корабля. Они выбираются по одному для перемещения в другое место (сетку). Я могу использовать setpixelposition для перемещения каждого объекта после нажатия кнопки.

Прямо сейчас под нажатием кнопки у меня есть что-то вроде этого

function btnPlaceShip_Callback(hObject, eventdata, handles) 

    %Store the current selected ship(passed from an onclick to a label) 
    ship = get(handles.lblSelectedShip,'string');

    %I have tried everything I could think of, but basically I want to achieve the
    %following

    setpixelposition(handles.ship, [0 250 50 250]) 
    %where the variable 'ship' contains the name of the object.

Другими словами, var ship = 'shipAircraftCarrier' и..

    setpixelposition(handles.shipAircraftCarrier, [0 250 50 250]) 

работает! (устанавливает позицию указанного корабля). Однако, используя переменную ship, Matlab воспринимает строку буквально, а не ее значение. Вместо этого было бы крайне удобно использовать переменную!

Если у кого есть решения, буду признателен. Я прошерстил Интернет, но, возможно, мне не хватает фундаментального понимания материала графического интерфейса Matlab. Справочные документы Matlab очень не описательные и не очень помогают.


person mtotho    schedule 24.04.2012    source источник


Ответы (3)


Как упоминалось другими, используйте динамические имена полей. Хотя у меня нет кода для его проверки, я считаю, что простое размещение скобок вокруг ship заменит строку на имя структуры, таким образом

setpixelposition(handles.(ship), [0 250 50 250])

Старайтесь избегать использования eval(), если это вообще возможно.

person Adrian    schedule 25.04.2012
comment
Спасибо. Я попробую это в ближайшее время. Прежде чем я увидел, что на этот вопрос ответили, я весь день пробовал разные вещи! Но я многому научился - я наконец-то понял, как Matlab организует все эти графические интерфейсы! Я думаю, что все было запутанно, потому что я не понимал автоматически сгенерированный код, и потребовалось некоторое время, чтобы понять его (то есть теперь я понимаю, что «дескрипторы» - это просто массив структур!) - person mtotho; 25.04.2012

Вы можете сделать это с помощью функции eval, но вам нужно быть осторожным с инъекциями строк:

setpixelposition(eval(strcat('handles.',ship)), [0 250 50 250])  
person Bruce Hart    schedule 24.04.2012
comment
Спасибо за ответ. Я бы попробовал это, но другие пользователи упомянули, что я могу просто поместить переменную в круглые скобки, например: setpixelposition(handles.(ship), position), что короче. Я не думаю, что мне нужно беспокоиться о вводе строк в мой скрипт Matlab, тем более что эта переменная вводится не через поле ввода, а скорее выбор графического интерфейса - person mtotho; 25.04.2012

Вы можете использовать динамические имена полей или getfield. Индексация полей с использованием идентификаторов и строк очень похожа в Matlab structs и Javascript objects.

Матлаб:

fromId = handles.shipAircraftCarrier; %identifier
fromString = handles.('shipAircraftCarrier'); %string

Javascript:

var fromId = handles.shipAircraftCarrier; //identifier
var fromString = handles["shipAircraftCarrier"]; //string
person AE426082    schedule 24.04.2012
comment
Спасибо! переменная shipTag — это строковая переменная, равная тегу корабля. Я попробую использовать: handles.(shipTag) вместо handles.shipTag - person mtotho; 25.04.2012