ファイル名:StraitLine.m

function [OUTOBJ] = straitline(OBJ);
% Figure上に直線を引くプログラム。
% 引数は、何も無しか、既に作った直線のオブジェクトハンドル値を入力する。引数が無い時はマウスポインターにより、オブジェ
% クトを選択する事になる。Axes軸範囲内を指定すれば基本的には新しい直線が出来るが、既に作った直線上をクリックするとその
% 直線を選択して移動させたりする事ができる。
% Zoomボタンは、直線の向いている方向(実際には[DIRECTION]ポップアップメニューを参照します)に垂直な方向を拡大するだけで
% ある。つまりY軸方向に直線が走っていたら、X軸が拡大される(2Dを基準に考えています)。
% ----------------------------------------------------------------------------------------------
% 個人的メモ:
% hold on[=set(gca,'NextPlot','add')と同じ]をしてlineオブジェクトをもう一つ増やす方法と、axes軸をもう一つ作って最初から
% あるaxes軸に貼り付ける方法と、line関数を使って'Parent'を指定して直接くっつける方法がある。
% axes軸の方法はkasanegaki2,3,4などで使っていてhold onもありきたりなのでここではline関数を使う。
% ダイアログボックスのプロパティ値は基本的に[dialog.m]を参考にした。
% figure('BackingStore','off','ButtondownFcn','if isempty(allchild(gcbf)), close(gcbf), end','Color',get(0,'DefaultUicontrolBackgroundColor'),'Colormap',[],'IntegerHandle','off','InvertHardcopy','off','HandleVisibility','callback','Menubar','none','NumberTitle','off','PaperPositionMode','auto','Resize','off','Visible','on','WindowStyle','modal')
% このプロパティ値を更に[inputdlg.m]を参考にして若干変更した。
% 基本的流れを、uiwaitを実行してキー入力を制限して、ボタンが押されたらuiresumeを実行して終了する様にしようとしたが、
% やめた。関数ファイルだとファイルの最後まで行ってしまうと、関数内部で使われていた変数がクリアされてしまう。それは
% [uiwait]を使っても同じだった。よってボタンなどの[CallBack]には既に作っていたオブジェクト値などの変数は全て使えない。
% よって、[UIConotrol]の[Figure]-[UserData]にそれらオブジェクト値等の情報を全て入れておく事により、ボタンで呼び出され
% た時も、[UIControl]の[Figure]オブジェクトを見つければ、他の様々なオブジェクト値も参照できる。しかしこれを全部
% [UIControl]-[CallBack]用の文字列に書き込むのは面倒なので、関数の中からもう一度関数[straitline.m]を呼び出して
% [CallBack]用の所を実行するように変えた
% ----------------------------------------------------------------------------------------------

if nargin~=1 | ~isstr(OBJ)              % 最初に起動した時(文字でない時)
    LINEPROP{1,1} = [0 0 1];            % 直線の初期値(新しく作る時)。線の色
    LINEPROP{1,2} = 0.5;                % 線の太さ
    LINEPROP{1,3} = 1;                  % 線の種類
    LINEDIR       = 2;                  % クリック時に引く直線の方向の初期値
    BTNTXTFONT    = 'Terminal';         % uicontrolの初期設定。文字のフォント
    TXTFONTSIZE0  = 9;                  % エディット部の文字の大きさ
    BTNFONTSIZE0  = 9;                  % ボタン部の文字の大きさ
    TXTFONTSIZE1  = TXTFONTSIZE0*1.5;   % 実際に用意するスペース
    EDITWIDTH0    = TXTFONTSIZE1*5;     % エディット部分の幅(10文字分)
    BTNFONTSIZE1  = BTNFONTSIZE0*1.2;   % 実際に用意するスペース
    BTNSIZE0      = BTNFONTSIZE1*7;     % ボタン部の横の大きさ
    BTNSIZE1      = BTNFONTSIZE1*2;     % ボタン部の縦の大きさ
    SPACER0       = TXTFONTSIZE0*0.5;   % 各ボタン等の間隔
    UIFIGCOLOR    = get(0,'DefaultUicontrolBackgroundColor');   % 背景色
    DIRECTION     = {'X','Y','Z'};                              % 線を引く方向
    LINESTYLE     = {'-','--',':','-.'};                        % 線種
% ----------------------------------------------------------------------------------------------
    if nargin == 1                                              % 既に関数の引数で指定されている時
        if ~strcmp(get(OBJ,'Tag'),'STRAITLINE')
            error('引数のオブジェクトの指定が違います。');
        end
        fprintf('既に作った直線を引数で選択しました。\n');
        FIG = get(get(OBJ,'Parent'),'Parent');
        AXS = get(OBJ,'Parent');
        [LINEPROP,LINEDATA] = GETLINEINFO(OBJ,LINESTYLE);
        LIM = get(AXS,{'XLim','YLim','ZLim'});                  % [Figure]の軸の範囲を求める
    else
        FIG = gcf;
        fprintf('現在アクティブなFigureの中に直線を引くプログラム。\n');
        fprintf('直線を引くグラフ内か、既に作った直線上をクリックして下さい。\n');
    end                                 % あらゆる[ButtonDownFcn]の無効化
    INITWINBTNFCN=get(FIG,{'WindowButtonDownFcn','WindowButtonMotionFcn','WindowButtonUpFcn'});
    set(FIG,{'WindowButtonDownFcn','WindowButtonMotionFcn','WindowButtonUpFcn'},{'','',''});
    ALLCHILD = findall(FIG);
    INITBTNDWNFCN = get(ALLCHILD,'ButtonDownFcn');
    set(ALLCHILD,'ButtonDownFcn','');
    INITPOINTER = get(FIG,'Pointer');
    set(FIG,'Pointer','fullcrosshair'); % [Pointer]の変更
    FIGUNIT = get(FIG,'Units');
    set(FIG,'Units','points');
    POS = get(FIG,'Position');
    set(FIG,'Units',FIGUNIT);           % [points]単位でFigureの位置を求める
    if nargin ~= 1                      % 引数が無い時
        waitforbuttonpress;             % Figure,Axes情報の取得
        OBJ = get(gcf,'CurrentObject');
        AXS = get(gcf,'CurrentAxes');
        if isempty(AXS)
            error('Axes軸が有りません。グラフを作ってからやり直して下さい。');
        end
        LIM = get(AXS,{'XLim','YLim','ZLim'});                  % [Figure]の軸の範囲を求める
        if strcmp(get(OBJ,'Tag'),'STRAITLINE')                  % 新規直線の作成
            fprintf('既に作った直線を選択しました。\n');
            [LINEPROP,LINEDATA] = GETLINEINFO(OBJ,LINESTYLE);
        else
            fprintf('グラフに新しい直線を作ります。\n');
            LINEDATA = CALCLINE(AXS,LIM,LINEDIR);               % 初期に引く線の座標を求める
            OBJ = line('Parent',AXS,{'XData','YData','ZData'},LINEDATA,'Tag','STRAITLINE','Color',LINEPROP{1,1},'LineWidth',LINEPROP{1,2},'LineStyle',LINESTYLE{1,LINEPROP{1,3}});
        end
    end
% ----------------------------------------------------------------------------------------------
    BTNPOS1 = [0*BTNSIZE0 1*SPACER0, SPACER0, BTNSIZE0, BTNSIZE1];      % ボタン1の位置
    BTNPOS2 = BTNPOS1;  BTNPOS2(1,1) = BTNPOS1(1,1) BTNSIZE0 SPACER0;   % ボタン2の位置
    BTNPOS3 = BTNPOS1;  BTNPOS3(1,1) = BTNPOS2(1,1) BTNSIZE0 SPACER0;   % ボタン3の位置
    BTNPOS4 = BTNPOS1;  BTNPOS4(1,1) = BTNPOS3(1,1) BTNSIZE0 SPACER0;   % ボタン4の位置
    ZUITXTPOS = [SPACER0, 2*SPACER0 BTNSIZE1, TXTFONTSIZE1, TXTFONTSIZE1];          % Z軸文字
    YUITXTPOS = ZUITXTPOS;  YUITXTPOS(1,2) = ZUITXTPOS(1,2) TXTFONTSIZE1 SPACER0;   % Y軸文字
    XUITXTPOS = YUITXTPOS;  XUITXTPOS(1,2) = YUITXTPOS(1,2) TXTFONTSIZE1 SPACER0;   % X軸文字
    ZUIMINPOS = ZUITXTPOS;  ZUIMINPOS(1,1) = ZUITXTPOS(1,1) TXTFONTSIZE1 SPACER0;   % Z軸最小
    ZUIMINPOS(1,3) = EDITWIDTH0;
    YUIMINPOS = ZUIMINPOS;  YUIMINPOS(1,2) = ZUIMINPOS(1,2) TXTFONTSIZE1 SPACER0;   % Y軸最小
    XUIMINPOS = YUIMINPOS;  XUIMINPOS(1,2) = YUIMINPOS(1,2) TXTFONTSIZE1 SPACER0;   % X軸最小
    TITMINPOS = XUIMINPOS;  TITMINPOS(1,2) = XUIMINPOS(1,2) TXTFONTSIZE1 SPACER0/4; % 最小軸タイトル
    ZUIMAXPOS = ZUIMINPOS;  ZUIMAXPOS(1,1) = ZUIMINPOS(1,1) EDITWIDTH0 SPACER0;     % Z軸最大
    YUIMAXPOS = ZUIMAXPOS;  YUIMAXPOS(1,2) = ZUIMAXPOS(1,2) TXTFONTSIZE1 SPACER0;   % Y軸最大
    XUIMAXPOS = YUIMAXPOS;  XUIMAXPOS(1,2) = YUIMAXPOS(1,2) TXTFONTSIZE1 SPACER0;   % X軸最大
    TITMAXPOS = XUIMAXPOS;  TITMAXPOS(1,2) = XUIMAXPOS(1,2) TXTFONTSIZE1 SPACER0/4; % 最大軸タイトル
    COLORTXTPOS = [BTNPOS3(1,1), ZUITXTPOS(1,2), EDITWIDTH0, TXTFONTSIZE1];         % 色種タイトル
    WIDTHTXTPOS = COLORTXTPOS;  WIDTHTXTPOS(1,2) = COLORTXTPOS(1,2) TXTFONTSIZE1 SPACER0;   % 線太
    STYLETXTPOS = WIDTHTXTPOS;  STYLETXTPOS(1,2) = WIDTHTXTPOS(1,2) TXTFONTSIZE1 SPACER0;   % 線種
    DIRTXTPOS   = STYLETXTPOS;  DIRTXTPOS(1,2)   = STYLETXTPOS(1,2) TXTFONTSIZE1 SPACER0;   % 方向
    COLOREDITPOS = COLORTXTPOS; COLOREDITPOS(1,1) = COLORTXTPOS(1,1) EDITWIDTH0 SPACER0;    % 色種
    WIDTHEDITPOS = WIDTHTXTPOS; WIDTHEDITPOS(1,1) = WIDTHTXTPOS(1,1) EDITWIDTH0 SPACER0;    % 線太
    STYLEEDITPOS = STYLETXTPOS; STYLEEDITPOS(1,1) = STYLETXTPOS(1,1) EDITWIDTH0 SPACER0;    % 線種
    DIREDITPOS   = DIRTXTPOS;   DIREDITPOS(1,1)   = DIRTXTPOS(1,1)   EDITWIDTH0 SPACER0;    % 方向
    UIFIGWIDTH  = BTNPOS4(1,1) BTNSIZE0 SPACER0;        % [points]単位
    UIFIGHEIGHT = DIREDITPOS(1,2) TXTFONTSIZE1 SPACER0; % [points]単位
    UIFIGPOS    = [POS(1,1:2) UIFIGWIDTH UIFIGHEIGHT];  % Figureの位置と大きさ
    BTNCLBK1 = 'straitline(''ZOOM IN'');';
    BTNCLBK2 = 'straitline(''ZOOM OUT'');';             % CallBack
    BTNCLBK3 = 'straitline(''QUIT'')';
    BTNCLBK4 = 'straitline(''REMOVE'');';
    EDITCLBK = 'straitline(''EDIT'');';
    WINBTNDWNFCN = 'straitline(''WINBTNDWNFCN'');';
    UIFIG = figure('BackingStore','off','Color',UIFIGCOLOR,'Colormap',[],'IntegerHandle','off','InvertHardcopy','off',...
        'HandleVisibility','callback','Menubar','none','NumberTitle','off','Resize','off','Visible','off','WindowStyle',...
        'normal','Name','STRAITLINE.M','Pointer','arrow','Units','points','Tag','STRAITLINE','Position',UIFIGPOS,'CloseRequestFcn',BTNCLBK3);
    BTNPROP.Style      = 'PushButton';
    BTNPROP.Parent     = UIFIG;
    BTNPROP.FontName   = BTNTXTFONT;
    BTNPROP.Units      ='points';
    BTNPROP.FontSize   = BTNFONTSIZE0;
    BTNPROP.FontWeight ='bold';
    BTN1 = uicontrol(BTNPROP,'String','ZOOM IN','Position',BTNPOS1,'CallBack',BTNCLBK1);
    BTN2 = uicontrol(BTNPROP,'String','ZOOM OUT','Position',BTNPOS2,'CallBack',BTNCLBK2);
    BTN3 = uicontrol(BTNPROP,'String',' QUIT ','Position',BTNPOS3,'CallBack',BTNCLBK3);
    BTN4 = uicontrol(BTNPROP,'String','REMOVE','Position',BTNPOS4,'CallBack',BTNCLBK4);
    TXTPROP.Parent     = UIFIG;
    TXTPROP.FontName   = BTNTXTFONT;
    TXTPROP.Units      = 'points';
    TXTPROP.FontSize   = TXTFONTSIZE0;
    TXTPROP.FontWeight = 'bold';
    ZUITXT = uicontrol(TXTPROP,'Style','Text','Position',ZUITXTPOS,'String','Z');
    YUITXT = uicontrol(TXTPROP,'Style','Text','Position',YUITXTPOS,'String','Y');
    XUITXT = uicontrol(TXTPROP,'Style','Text','Position',XUITXTPOS,'String','X');
    TITMIN = uicontrol(TXTPROP,'Style','Text','Position',TITMINPOS,'String','MIN');
    TITMAX = uicontrol(TXTPROP,'Style','Text','Position',TITMAXPOS,'String','MAX');
    COLORTXT = uicontrol(TXTPROP,'Style','Text','Position',COLORTXTPOS,'String','LineColor');
    WIDTHTXT = uicontrol(TXTPROP,'Style','Text','Position',WIDTHTXTPOS,'String','LineWidth');
    STYLETXT = uicontrol(TXTPROP,'Style','Text','Position',STYLETXTPOS,'String','LineStyle');
    DIRTXT   = uicontrol(TXTPROP,'Style','Text','Position',DIRTXTPOS  ,'String','Direction');
    EDITPROP.Parent   = UIFIG;
    EDITPROP.FontName = BTNTXTFONT;
    EDITPROP.Units    = 'points';
    EDITPROP.FontSize = TXTFONTSIZE0;
    EDITPROP.BackGroundColor = [1 1 1];
    EDITPROP.Callback        = EDITCLBK;
    ZUIMIN = uicontrol(EDITPROP,'Style','Edit','Position',ZUIMINPOS,'String',LINEDATA{1,3}(1,1));
    YUIMIN = uicontrol(EDITPROP,'Style','Edit','Position',YUIMINPOS,'String',LINEDATA{1,2}(1,1));
    XUIMIN = uicontrol(EDITPROP,'Style','Edit','Position',XUIMINPOS,'String',LINEDATA{1,1}(1,1));
    ZUIMAX = uicontrol(EDITPROP,'Style','Edit','Position',ZUIMAXPOS,'String',LINEDATA{1,3}(1,2));
    YUIMAX = uicontrol(EDITPROP,'Style','Edit','Position',YUIMAXPOS,'String',LINEDATA{1,2}(1,2));
    XUIMAX = uicontrol(EDITPROP,'Style','Edit','Position',XUIMAXPOS,'String',LINEDATA{1,1}(1,2));
    COLOREDIT = uicontrol(EDITPROP,'Style','Edit','Position',COLOREDITPOS,'String',num2str(LINEPROP{1,1}));
    WIDTHEDIT = uicontrol(EDITPROP,'Style','Edit','Position',WIDTHEDITPOS,'String',LINEPROP{1,2});
    STYLEEDIT = uicontrol(EDITPROP,'Style','Popupmenu','Position',STYLEEDITPOS,'String',LINESTYLE,'Value',LINEPROP{1,3});
    DIREDIT   = uicontrol(EDITPROP,'Style','Popupmenu','Position',DIREDITPOS,'String',DIRECTION,'Value',LINEDIR);
    USERDATA={FIG,AXS,OBJ,LINESTYLE,XUIMIN,XUIMAX,YUIMIN,YUIMAX,ZUIMIN,ZUIMAX,COLOREDIT,WIDTHEDIT,STYLEEDIT,DIREDIT,INITWINBTNFCN,ALLCHILD,INITPOINTER,INITBTNDWNFCN};
    set(UIFIG,'Tag','CURRENTUICONTROL');                % 他の物と区別する為にTagを作る
    set(UIFIG,'UserData',USERDATA);
    set(FIG,'WindowButtonDownFcn',WINBTNDWNFCN);
    set(UIFIG,'Visible','on');
else                                                    % UICONTROLの中から呼び出した時
    MODE = OBJ;                                         % 入力引数をMODEに納める
    UIFIG = findall(0,'Tag','CURRENTUICONTROL');        % まず[直線オブジェクト]を探す
    USERDATA = get(UIFIG,'UserData');                   % 保存しておいたパラメータを取り出す
    FIG           = USERDATA{1, 1};
    AXS           = USERDATA{1, 2};
    OBJ           = USERDATA{1, 3};
    LINESTYLE     = USERDATA{1, 4};
    XUIMIN        = USERDATA{1, 5};
    XUIMAX        = USERDATA{1, 6};
    YUIMIN        = USERDATA{1, 7};
    YUIMAX        = USERDATA{1, 8};
    ZUIMIN        = USERDATA{1, 9};
    ZUIMAX        = USERDATA{1,10};
    COLOREDIT     = USERDATA{1,11};
    WIDTHEDIT     = USERDATA{1,12};
    STYLEEDIT     = USERDATA{1,13};
    DIREDIT       = USERDATA{1,14};
    INITWINBTNFCN = USERDATA{1,15};
    ALLCHILD      = USERDATA{1,16};
    INITPOINTER   = USERDATA{1,17};
    INITBTNDWNFCN = USERDATA{1,18};
    LIM = get(AXS,{'XLim','YLim','ZLim'});              % [Figure]の軸の範囲を求める
    if strcmp(MODE,'ZOOM IN')
        LINEDIR = get(DIREDIT,'Value');
        switch LINEDIR
        case 1
            CENTER = (str2num(get(YUIMIN,'String')) str2num(get(YUIMAX,'String')))/2;
            LIMSPACE = (LIM{1,2}(1,2)-LIM{1,2}(1,1))/4;
            if LIMSPACE <= 1/1000
                set(AXS,'YLimMode','auto');
            else
                XLIM = [CENTER-LIMSPACE CENTER LIMSPACE];
                set(AXS,'YLim',XLIM);
            end
        case 2
            CENTER = (str2num(get(XUIMIN,'String')) str2num(get(XUIMAX,'String')))/2;
            LIMSPACE = (LIM{1,1}(1,2)-LIM{1,1}(1,1))/4;
            if LIMSPACE <= 1/1000
                set(AXS,'XLimMode','auto');
            else
                XLIM = [CENTER-LIMSPACE CENTER LIMSPACE];
                set(AXS,'XLim',XLIM);
            end
        case 3
            CENTER = (str2num(get(XUIMIN,'String')) str2num(get(XUIMAX,'String')))/2;
            LIMSPACE = (LIM{1,1}(1,2)-LIM{1,1}(1,1))/4; % Zに平行な時はX軸を変更する
            if LIMSPACE <= 1/1000
                set(AXS,'XLimMode','auto');
            else
                XLIM = [CENTER-LIMSPACE CENTER LIMSPACE];
                set(AXS,'XLim',XLIM);
            end
        end
    elseif strcmp(MODE,'ZOOM OUT')
        LINEDIR = get(DIREDIT,'Value');
        switch LINEDIR
        case 1
            CENTER = (str2num(get(YUIMIN,'String')) str2num(get(YUIMAX,'String')))/2;
            LIMSPACE = (LIM{1,2}(1,2)-LIM{1,2}(1,1));
            if LIMSPACE >= 100000
                set(AXS,'YLimMode','auto');
            else
                YLIM = [CENTER-LIMSPACE CENTER LIMSPACE];
                set(AXS,'YLim',YLIM);
            end
        case 2
            CENTER = (str2num(get(XUIMIN,'String')) str2num(get(XUIMAX,'String')))/2;
            LIMSPACE = (LIM{1,1}(1,2)-LIM{1,1}(1,1));
            if LIMSPACE >= 100000
                set(AXS,'XLimMode','auto');
            else
                XLIM = [CENTER-LIMSPACE CENTER LIMSPACE];
                set(AXS,'XLim',XLIM);
            end
        case 3
            CENTER = (str2num(get(XUIMIN,'String')) str2num(get(XUIMAX,'String')))/2;
            LIMSPACE = (LIM{1,1}(1,2)-LIM{1,1}(1,1));   % Zに平行な時はX軸を変更する
            if LIMSPACE >= 100000
                set(AXS,'XLimMode','auto');
            else
                XLIM = [CENTER-LIMSPACE CENTER LIMSPACE];
                set(AXS,'XLim',XLIM);
            end
        end
    elseif strcmp(MODE,'QUIT')
        CLOSEREQFCN(FIG,UIFIG,INITWINBTNFCN,ALLCHILD,INITPOINTER,INITBTNDWNFCN);
    elseif strcmp(MODE,'REMOVE')
        CLOSEREQFCN(FIG,UIFIG,INITWINBTNFCN,ALLCHILD,INITPOINTER,INITBTNDWNFCN);
        delete(OBJ);
    elseif strcmp(MODE,'EDIT')                          % [EDIT]ボタン
        APPLY(OBJ,LINESTYLE,XUIMIN,XUIMAX,YUIMIN,YUIMAX,ZUIMIN,ZUIMAX,COLOREDIT,WIDTHEDIT,STYLEEDIT);
    elseif strcmp(MODE,'WINBTNDWNFCN')
        LINEDIR = get(DIREDIT,'Value');
        LINEDATA = CALCLINE(AXS,LIM,LINEDIR);           % クリックした所に作る線の座標を求める
        set(OBJ,{'XData','YData','ZData'},LINEDATA,'Color',str2num(get(COLOREDIT,'String')),'LineWidth',str2num(get(WIDTHEDIT,'String')),'LineStyle',LINESTYLE{1,get(STYLEEDIT,'Value')});
        set(XUIMIN,'String',LINEDATA{1,1}(1,1));
        set(XUIMAX,'String',LINEDATA{1,1}(1,2));
        set(YUIMIN,'String',LINEDATA{1,2}(1,1));
        set(YUIMAX,'String',LINEDATA{1,2}(1,2));
        set(ZUIMIN,'String',LINEDATA{1,3}(1,1));
        set(ZUIMAX,'String',LINEDATA{1,3}(1,2));
    else
        error('入力引数が不正です');
    end
end                                                     % 新規か更なる呼び出しかの条件の終了
% ----------------------------------------------------------------------------------------------
if nargout == 1                                         % 出力引数の指定がある時は値を返す
    OUTOBJ=OBJ;
end
% ----------------------------------------------------------------------------------------------
function LINEDATA = CALCLINE(AXS,LIM,LINEDIR)           % クリックした所に作る線の座標を求める

CURPOINT = get(AXS,'CurrentPoint');                     % クリック位置の座標を求める
switch LINEDIR                                          % 奥側の点の位置を使って線を引く
case 1
    LINEDATA = {LIM{1,1}, CURPOINT(2,2)*ones(1,2), CURPOINT(2,3)*ones(1,2)};
    if any(get(AXS,'View')==90)
        LINEDATA{1,3} = [0 0];
    end
case 2
    LINEDATA = {CURPOINT(2,1)*ones(1,2), LIM{1,2}, CURPOINT(2,3)*ones(1,2)};
    if any(get(AXS,'View')==90)
        LINEDATA{1,3} = [0 0];
    end
case 3
    LINEDATA = {CURPOINT(2,1)*ones(1,2), CURPOINT(2,2)*ones(1,2), LIM{1,3}};
otherwise
    error('直線を引く方向を示す値がおかしいです。');
end                                                     % X,Y軸方向直線は2次元プロット時(Viewが[? 90]or[90 ?]の時)には[ZData]を[0 0]にする
% ----------------------------------------------------------------------------------------------
function [LINEPROP,LINEDATA] = GETLINEINFO(OBJ,LINESTYLE)   % getで得た線種文字の番号変換もする

LINEPROP = get(OBJ,{'Color','LineWidth','LineStyle'});
if ~any(strcmp(LINESTYLE,LINEPROP{1,3}))
    error('設定されていない線種です。');
end
LINEPROP{1,3} = find(strcmp(LINESTYLE,LINEPROP{1,3}));
LINEDATA = get(OBJ,{'XData','YData','ZData'});
% ----------------------------------------------------------------------------------------------
function APPLY(OBJ,LINESTYLE,XUIMIN,XUIMAX,YUIMIN,YUIMAX,ZUIMIN,ZUIMAX,COLOREDIT,WIDTHEDIT,STYLEEDIT)

set(OBJ,'XData',[str2num(get(XUIMIN,'String')) str2num(get(XUIMAX,'String'))],'YData',[str2num(get(YUIMIN,'String')) str2num(get(YUIMAX,'String'))],...
    'ZData',[str2num(get(ZUIMIN,'String')) str2num(get(ZUIMAX,'String'))],'Color',str2num(get(COLOREDIT,'String')),'LineWidth',str2num(get(WIDTHEDIT,'String')),...
    'LineStyle',LINESTYLE{1,get(STYLEEDIT,'Value')});
% ----------------------------------------------------------------------------------------------
function CLOSEREQFCN(FIG,UIFIG,INITWINBTNFCN,ALLCHILD,INITPOINTER,INITBTNDWNFCN)

set(FIG,{'WindowButtonDownFcn','WindowButtonMotionFcn','WindowButtonUpFcn'},INITWINBTNFCN);
set(ALLCHILD,{'ButtonDownFcn'},INITBTNDWNFCN);
set(FIG,'Pointer',INITPOINTER);
delete(UIFIG);                                          % [UIFIG]を消す
% ----------------------------------------------------------------------------------------------