【MATLAB/Simulink】 코멘트 아웃을 찾아 삭제하는 스크립트를 만들어 보았다

줄거리



Simulink 모델을 작성해 나가면, 텍스트 언어와 같이 코멘트 아웃이 점점 쌓여 갑니다. 다행히 Simulink (또는 MATLAB)에서 코멘트 아웃을 찾을 수 있으며, 그 일제 삭제도 용이합니다. 그러나 그 중에는 당연히 타인이 남긴 것도 있어, 그들을 삭제해도 괜찮은지는 스스로는 판단할 수 없습니다.

그래서 모델에 남겨진 코멘트 아웃을 하나씩 검색해 가고, 삭제 혹은 삭제하지 않는, 의 판단이 가능한 툴을 작성합니다.

환경



· MATLAB 2015b
· Simulink 8.6

실제로 사용해보기



작성한 스크립트를 아래 Simulink 모델 "test_co.slx"에 대해 사용해 보겠습니다.
이 모델은 각 계층에 블록과 서브 시스템의 주석 처리가 흩어져 있습니다.



먼저 스크립트를 실행합니다. 모델의 모든 주석 처리가 목록에 표시됩니다.


그런 다음 목록에 추가된 주석 처리를 클릭하면 해당 위치로 이동하여 클릭 대상이 파란색으로 강조 표시됩니다. GUI 쪽에는 「삭제하고 다음을 검색」버튼과 「삭제하지 않고 다음을 검색」버튼이 새롭게 표시됩니다.



'삭제하고 다음 찾기'를 누르면 Simulink에서 대상 주석 처리가 삭제되고 목록에서 사라집니다.



"삭제하지 않고 다음 검색"을 누르면 단순히 강조 대상이 다음 블록으로 이동합니다.



점점 삭제해 나가면, 마지막에는 이하와 같이 표시됩니다.
(처음부터 코멘트 아웃이 존재하지 않는 경우에도 유사한 표시가 이루어집니다)


출처



delete_comment_out.m

function delete_comment_out

    % リスト上のブロック/サブシステムをクリック時、そのブロック/サブシステムを強調する
    function go_to_commented_out(source, command)

        if ~strcmp(source.String, nocomsg) % コメントアウトが存在する場合
            if prvco ~= 0 && ~strcmp(command, 'delete') 
                % 前回強調したブロックを、元の状態に戻す
                hilite_system(source.String(prvco), 'default');
            else
                % 特定のブロック/サブシステムが強調状態になって初めて、削除ボタンなどを表示する
                dlt_next.Visible  = 'on';
                just_next.Visible = 'on';
            end

            % ブロックを強調
            hilite_system(source.String(source.Value), 'user1');

            prvco = source.Value; % 今回強調したブロックを、前回値として保存
        end
    end

    % 現在強調しているコメントアウトを削除して次のコメントアウトを強調
    function delete_block_and_next_block(~, ~)

        % リストの一番下以外のコメントアウトを強調している時
        if tgtbox.Value < size(tgtbox.String, 1)

            curco = tgtbox.Value; % リスト上で強調中のブロック/サブシステム番号を保存
        else  % 一番下を強調している時
            curco = 1;
            tgtbox.Value = curco; % リストの最初に戻る
        end

        delete_block(tgtbox.String(tgtbox.Value));

        % コメントアウトされたブロック/サブシステムを再取得(削除したコメントアウトをリストから除くため)
        list = find_system('test_co', 'IncludeCommented', 'on', 'Commented', 'on');

        if isempty(list) % コメントアウトが1つもない場合

            list = nocomsg;
        end
        tgtbox.String = list;    
        tgtbox.Value = curco;

        go_to_commented_out(tgtbox, 'delete'); % 次のブロック/サブシステムを強調
    end

    % 現在強調しているコメントアウトを削除しないで次のコメントアウトを強調
    function go_next_block(~, ~)

        % リストの一番下以外のコメントアウトを強調している時
        if tgtbox.Value < size(tgtbox.String, 1)

            tgtbox.Value = tgtbox.Value + 1; % リスト上の次のブロック/サブシステムを強調
        else % 一番下を強調している時
            tgtbox.Value = 1; % リストの最初に戻る
        end

        go_to_commented_out(tgtbox, 'go_next'); % 次のブロック/サブシステムを強調
    end

    % Simulinkモデルを読み込み
    load_system('test_co');

    % コメントアウトされたブロック/サブシステムを取得
    list = find_system('test_co', 'IncludeCommented', 'on', 'Commented', 'on');

    figure('Name', 'コメントアウト削除ツール', 'Position', [300, 150, 600, 370]);

    prvco = 0; % 前回強調していたブロック/サブシステムの番号
    nocomsg = '** コメントアウトされているブロック/サブシステムはありません。 **';

    if isempty(list) % コメントアウトが1つもない場合
        list = nocomsg;
    end

    % ブロックの強調/強調解除の設定
    set_param(0, 'HiliteAncestorsData',... 
                    struct('HiliteType', 'user1', ... 
                           'ForegroundColor', 'darkGreen', ... 
                           'BackgroundColor', 'lightBlue'));
    set_param(0, 'HiliteAncestorsData', ... 
                    struct('HiliteType', 'default', ... 
                           'ForegroundColor', 'black', ... 
                           'BackgroundColor', 'white'));

    uicontrol('Style', 'text', 'String', 'コメントアウトされたブロック/サブシステムを以下に表示', 'Position', [35, 335, 250, 20]);
    tgtbox = uicontrol('Style', 'listbox', 'String', list, 'Position', [35, 45, 525, 250], 'Callback', @go_to_commented_out);
    dlt_next  = uicontrol('Visible', 'off', 'Style', 'pushbutton', 'String', '削除して次を検索', 'Position', [35, 305, 110, 25], 'Callback', @delete_block_and_next_block);
    just_next = uicontrol('Visible', 'off', 'Style', 'pushbutton', 'String', '削除せずに次を検索', 'Position', [170, 305, 110, 25], 'Callback', @go_next_block);
end


참고로 한 정보



본 기사 집필을 위해서, 하기 사이트님의 정보를 참고로 했습니다.


내용
링크 대상


MATLAB에서 Simulink의 모든 주석 처리 삭제
htp : // bg. s도 th-rks. 네 t/아 r ゔぇ s/3343


마지막



지적·개선안·실수 지적, 대환영입니다. 어쩌면 즐거움을 느끼고 기술의 바다에 익사합니다.

좋은 웹페이지 즐겨찾기