Почему мой линейный объект регистрируется как двойной в конструкторе приложений Matlab? - PullRequest
3 голосов
/ 11 июня 2019

В Matlab, если бы я это сделал:

lines
lines(1)=plot(1:5,1:5)
lines(2)=plot(1:10,1:10)

Линии были бы зарегистрированы как вектор, в котором хранятся линейные объекты, однако в App-Designer я сделал то же самое, но он каким-то образом интерпретирует объекты как двойные, а не как линии. В своих свойствах я объявил строки глобальной переменной следующим образом:

lines

Затем я использовал свойство в отдельной функции так же, как указано выше

app.lines(1)=plot(1:5,1:5)
app.lines(2)=plot(1:10,1:10)

Проблема, с которой я столкнулся, заключается в том, что она регистрирует его как двойной объект вместо строкового. Кто-нибудь знает, почему это? Если да, есть ли какие-либо возможные исправления?

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Раньше все графические маркеры были числами. Только после выпуска R2014b это особые объекты. Когда они представили эти объекты, они убедились, что старый код может продолжать работать. Одним из последствий этого является то, что дескрипторы графических объектов легко преобразуются в числа при назначении их в числовой массив. Таким образом,

lines = 0;
lines(1) = plot(1:5,1:5);

преобразует дескриптор графического объекта в его числовой эквивалент.

Этот номер все еще можно использовать для доступа к графическому объекту. Вам просто нужно использовать старый (до R2014b) синтаксис:

set(lines(1),'property',value)
get(lines(1),'property')

Чтобы это преобразование не произошло, инициализируйте lines пустым массивом графических объектов:

lines = gobjects(0); % empty graphics array object

см. Документацию для gobjects, чтобы узнать, как использовать эту функцию.


Как только преобразование в число произошло, вы можете снова получить объект графического дескриптора, используя функцию handle:

lines = handle(lines);
0 голосов
/ 11 июня 2019

Я думаю, что нашел решение:

Объявите lines как свойство app как графику gobjects:

properties (Access = private)
    %Declare lines as array of objects of class matlab.graphics.chart.primitive.Line
    %lines matlab.graphics.chart.primitive.Line
    lines = gobjects(0); %Cris Luengo suggestion is better...  
end

Вы можете добавить свойство, нажав кнопку «+ P».

Соответствующая часть учебного кода для дизайнера приложений:

classdef tutorialApp < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure              matlab.ui.Figure
        UIAxes                matlab.ui.control.UIAxes
        AmplitudeSliderLabel  matlab.ui.control.Label
        AmplitudeSlider       matlab.ui.control.Slider
    end


    properties (Access = private)
        % lines matlab.graphics.chart.primitive.Line
        lines = gobjects(0); %Cris Luengo suggestion is better...  
    end


    methods (Access = private)

        % Value changed function: AmplitudeSlider
        function AmplitudeSliderValueChanged(app, event)
            value = app.AmplitudeSlider.Value;
            %plot(app.UIAxes, value*peaks)
            app.lines(1) = plot(app.UIAxes, 1:5,1:5);
            app.lines(2) = plot(app.UIAxes, 1:10,1:10);
        end
    end

Отображение app.lines(1) в командной строке (я установил точку останова в строке app.lines(2) ...):

K>> app.lines(1)

ans = 

  Line with properties:

          Color: [0 0.4470 0.7410]
      LineStyle: '-'
      LineWidth: 0.5000
         Marker: 'none'
     MarkerSize: 6
MarkerFaceColor: 'none'
          XData: [1 2 3 4 5]
          YData: [1 2 3 4 5]
          ZData: [1×0 double]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...