【问题标题】:Delete MATLAB subclass of graphics primitive删除图形基元的 MATLAB 子类
【发布时间】:2018-08-14 09:52:21
【问题描述】:

我正在尝试在 MATLAB 2017b 中创建一个类似于 Line 对象类的类,但析构函数存在问题。我想与其他图形对象实现类似的行为,当删除句柄时不再引用该对象,如下例所示:

 >> l1 = line([0 1], [0 1]);

如果包含行 l1 的图窗现在已关闭,则变量显示 l1 正在引用已删除的对象:

>> l1

l1 = 

  handle to deleted Line

我创建了以下类:

classdef circle < handle ...
        & matlab.mixin.CustomDisplay & matlab.mixin.SetGet

    properties
        Center = [];
        Color = [0 0.4470 0.7410];
        Radius = [];
    end

    properties (SetAccess = 'protected')
        LineHandle = [];
    end

    methods
        function obj = circle(radius, center, varargin)
            if nargin > 0
                % assign property values
                obj.Radius = radius;
                obj.Center = center;

                % generate plotting variables
                phi = linspace(0, 2*pi, 90);
                x = radius*cos(phi) + center(1);
                y = radius*sin(phi) + center(2);

                % draw circle
                obj.LineHandle = line(x, y);

                % create listeners in line object
                obj.createListener;

                % set variable properties
                for k = 1:2:length(varargin)
                    % set superclass properties
                    if (isprop(obj.LineHandle, varargin{k}))
                        set(obj.LineHandle, varargin{k},varargin{k+1});
                        if (isprop(obj, varargin{k}))
                            set(obj, varargin{k}, varargin{k+1});
                        end
                    end        
                end
            end
        end

        % listener to invoke delete if line is closed
        function createListener(obj)         
            set(obj.LineHandle,'DeleteFcn',...
                @obj.delete);
        end

         function delete(obj,varargin)
            disp('deleted')
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            % command to delete class ???
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
         end

    end

end

如果包含圆对象的图形是闭合的,则删除线,但圆对象仍然存在。有没有办法同时删除对圆对象的引用?

【问题讨论】:

  • 如果您检查已删除行的class(l1),它仍然是一个 Line 对象实例 (matlab.graphics.primitive.Line)。我怀疑对象的内部标志(例如隐藏属性)将其标记为已删除。你可以在你的类中维护这样一个标志(并在.delete 方法中设置它)。我看到你已经从 matlab.mixin.CustomDisplay 派生了你的类,所以在这种情况下,你只需要为你的 circle 类定义 getHeadergetPropertyGroupsgetFooter 方法。 getHeader 是否返回“句柄删除的圈子”,而 PropertyGroups 或页脚没有?
  • 定义isvalid()删除后返回0也有帮助?
  • 我为getHeadegetPropertyGroupsgetFooter定义了方法,它们运行良好。但是我怎样才能让isvalid在被删除后返回0?我试图实现一个方法,但得到以下错误Method 'isvalid' in class 'circle' conflicts with the Sealed method from the superclass definition in 'handle'.

标签: matlab graphics matlab-figure matlab-class


【解决方案1】:

我自己找到了答案。该函数只需要具有与 delete 不同的名称:

function delete_obj(obj, varargin)
        % delete handle
        delete(obj)
end

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2010-12-26
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    相关资源
    最近更新 更多