Main Content

スクリプトを使用したプロジェクト タスクの自動化

この例では、プロジェクト API を使用して、変更済みファイル、依存関係、ショートカットおよびラベルの操作も含めて、ファイルを操作するプロジェクト タスクを自動化する方法を示します。

コマンド ラインでのプロジェクトの取得

機体のプロジェクトを開き、currentProject を使用してコマンド ラインでプロジェクトを操作するためのプロジェクト オブジェクトを取得します。

proj = sldemo_slproject_airframe
Building with 'MinGW64 Compiler (C)'.
MEX completed successfully.

proj = 

  Project with properties:

                        Name: "Airframe Example"
    SourceControlIntegration: "Git"
          RepositoryLocation: "C:\workSpace\examples\repositories\airframe3"
       SourceControlMessages: ["Branch status: Normal"    …    ]
                    ReadOnly: 0
                    TopLevel: 1
                Dependencies: [1×1 digraph]
                  Categories: [1×1 matlab.project.Category]
                       Files: [1×32 matlab.project.ProjectFile]
                   Shortcuts: [1×7 matlab.project.Shortcut]
                 ProjectPath: [1×7 matlab.project.PathFolder]
           ProjectReferences: [1×0 matlab.project.ProjectReference]
                StartupFiles: [1×0 string]
               ShutdownFiles: [1×0 string]
         DefinitionFilesType: FixedPathMultiFile
                 Description: "This is an example project.↵↵Use the "Project Shortcuts" toolstrip tab to find ways of getting started with this project."
                  RootFolder: "C:\workSpace\examples\airframe3"
       SimulinkCodeGenFolder: "C:\workSpace\examples\airframe3\work\codegen"
        ProjectStartupFolder: "C:\workSpace\examples\airframe3"
         SimulinkCacheFolder: "C:\workSpace\examples\airframe3\work\cache"

プロジェクトのコマンドの検索

プロジェクトで何ができるか調べます。

methods(proj)
Methods for class matlab.project.Project:

addFile                       listImpactedFiles             
addFolderIncludingChildFiles  listModifiedFiles             
addPath                       listRequiredFiles             
addReference                  refreshSourceControl          
addShortcut                   reload                        
addShutdownFile               removeCategory                
addStartupFile                removeFile                    
addprop                       removePath                    
close                         removeReference               
createCategory                removeShortcut                
export                        removeShutdownFile            
findCategory                  removeStartupFile             
findFile                      runChecks                     
isLoaded                      updateDependencies            
listAllProjectReferences      

Call "methods('handle')" for methods of matlab.project.Project inherited from handle.

プロジェクト ファイルの確認

プロジェクト オブジェクトを取得後、ファイルなどのプロジェクト プロパティを確認できます。

files = proj.Files
files = 

  1×32 ProjectFile array with properties:

    Path
    Labels
    Revision
    SourceControlStatus

このリストにあるファイルにアクセスするためのインデックスを作成します。次のコマンドでは、ファイル番号 10 のファイルが取得されます。各ファイルには、ファイルのパスおよびファイルに付けられたラベルを示すプロパティがあります。

proj.Files(10)
ans = 

  ProjectFile with properties:

                   Path: "C:\workSpace\examples\airframe3\data\controller.sldd"
                 Labels: [1×1 matlab.project.Label]
               Revision: "27b6d5ec735ea103997d4cf6fc7abe625665678b"
    SourceControlStatus: Unmodified

10 番目のファイルのラベルを調べます。

proj.Files(10).Labels
ans = 

  Label with properties:

            File: "C:\workSpace\examples\airframe3\data\controller.sldd"
        DataType: 'none'
            Data: []
            Name: "Design"
    CategoryName: "Classification"

名前を指定して、特定のファイルを取得します。

myfile = findFile(proj, 'models/AnalogControl.slx')
myfile = 

  ProjectFile with properties:

                   Path: "C:\workSpace\examples\airframe3\models\AnalogControl.slx"
                 Labels: [1×1 matlab.project.Label]
               Revision: "27b6d5ec735ea103997d4cf6fc7abe625665678b"
    SourceControlStatus: Unmodified

ファイルで何ができるか調べます。

methods(myfile)
Methods for class matlab.project.ProjectFile:

addLabel     findLabel    removeLabel  

変更済みファイルの取得

任意のブロックを追加してプロジェクト モデル ファイルを変更します。

open_system('AnalogControl')
add_block('built-in/SubSystem', 'AnalogControl/test')
save_system('AnalogControl')

プロジェクトの変更済みファイルをすべて取得します。2 つの変更済みファイルを確認します。変更済みモデル ファイルが表示されるプロジェクトの [変更済みファイル] ビューおよび対応するプロジェクト定義ファイルと比較します。

modifiedfiles = listModifiedFiles(proj)
modifiedfiles = 

  1×2 ProjectFile array with properties:

    Path
    Labels
    Revision
    SourceControlStatus

2 番目の変更済みファイルを取得します。ファイルの SourceControlStatus プロパティが [変更済み] であることを確認します。同様に、listModifiedFiles は、プロジェクトの [変更済みファイル] ビューに表示される、追加、競合、削除されたファイルをすべて返します。

modifiedfiles(2)
ans = 

  ProjectFile with properties:

                   Path: "C:\workSpace\examples\airframe3\resources\project\uuid-08e31a06-2b0a-43a0-8031-deb3ab31ef15.xml"
               Revision: ""
    SourceControlStatus: Added

個々のファイルでクエリを実行する前にソース管理ステータスを更新します。listModifiedFiles を使用する前に行う必要はありません。

refreshSourceControl(proj)

特定のソース管理ステータスをもつすべてのプロジェクト ファイルを取得します。たとえば、Unmodified のファイルを取得します。

proj.Files(ismember([proj.Files.SourceControlStatus], matlab.sourcecontrol.Status.Unmodified))
ans = 

  1×23 ProjectFile array with properties:

    Path
    Labels
    Revision
    SourceControlStatus

ファイルの依存関係の取得

ファイルの依存関係を更新します。プロジェクトは依存関係の解析を実行し、プロジェクト ファイル間の既知の依存関係を更新します。

updateDependencies(proj)

機体のプロジェクトで依存関係のリストを取得します。[依存関係] プロパティには、MATLAB ダイグラフ オブジェクトとして保存されている、プロジェクト ファイル間の依存関係のグラフが含まれます。

g = proj.Dependencies
g = 

  digraph with properties:

    Edges: [21×1 table]
    Nodes: [21×1 table]

モデルで必要なファイルを取得します。

requiredFiles = bfsearch(g, which('AnalogControl'))
requiredFiles =

  3×1 cell array

    {'C:\workSpace\examples\airframe3\models\AnalogControl.slx'}
    {'C:\workSpace\examples\airframe3\data\controller.sldd'    }
    {'C:\workSpace\examples\airframe3\data\buses.sldd'         }

グラフ内のすべてのタイプの最上位ファイルを取得します。

g.Nodes.Name(indegree(g)==0);

依存関係のある最上位ファイルを取得します。

g.Nodes.Name(indegree(g)==0 & outdegree(g)>0)
ans =

  4×1 cell array

    {'C:\workSpace\examples\airframe3\models\DigitalControl.slx'}
    {'C:\workSpace\examples\airframe3\models\LinearActuator.slx'}
    {'C:\workSpace\examples\airframe3\models\slproject_f14.slx' }
    {'C:\workSpace\examples\airframe3\tests\f14_airframe_test.m'}

転置されたグラフを作成し、影響を受けた (または "上流の") ファイルを見つけます。

transposed   = flipedge(g)
impacted = bfsearch(transposed, which('vertical_channel'))
transposed = 

  digraph with properties:

    Edges: [21×1 table]
    Nodes: [21×1 table]


impacted =

  4×1 cell array

    {'C:\workSpace\examples\airframe3\models\vertical_channel.slx'}
    {'C:\workSpace\examples\airframe3\models\f14_airframe.slx'    }
    {'C:\workSpace\examples\airframe3\models\slproject_f14.slx'   }
    {'C:\workSpace\examples\airframe3\tests\f14_airframe_test.m'  }

データ ディクショナリの影響を受けたファイルを見つけます。

impacted2 = bfsearch(transposed, which('buses.sldd'))
impacted2 =

  11×1 cell array

    {'C:\workSpace\examples\airframe3\data\buses.sldd'             }
    {'C:\workSpace\examples\airframe3\data\controller.sldd'        }
    {'C:\workSpace\examples\airframe3\data\system_model.sldd'      }
    {'C:\workSpace\examples\airframe3\tests\f14_airframe_test.m'   }
    {'C:\workSpace\examples\airframe3\models\AnalogControl.slx'    }
    {'C:\workSpace\examples\airframe3\models\DigitalControl.slx'   }
    {'C:\workSpace\examples\airframe3\models\LinearActuator.slx'   }
    {'C:\workSpace\examples\airframe3\models\NonLinearActuator.slx'}
    {'C:\workSpace\examples\airframe3\models\f14_airframe.slx'     }
    {'C:\workSpace\examples\airframe3\models\slproject_f14.slx'    }
    {'C:\workSpace\examples\airframe3\models\vertical_channel.slx' }

依存関係や孤立したファイルの数など、ファイルの情報を取得します。

averageNumDependencies = mean(outdegree(g));
numberOfOrphans = sum(indegree(g)+outdegree(g)==0);

モデルの階層構造に変更を加える場合は、ボトムアップ方式で開始し、トポロジカル順序で検索します。

ordered = g.Nodes.Name(flip(toposort(g)));

ショートカットのクエリ

プロジェクトの [ショートカット] プロパティを調べます。

shortcuts = proj.Shortcuts
shortcuts = 

  1×7 Shortcut array with properties:

    Name
    Group
    File

配列内のショートカットを調べます。

shortcuts(7)
ans = 

  Shortcut with properties:

     Name: "Rebuild Project's S-functions"
    Group: "Utility"
     File: "C:\workSpace\examples\airframe3\utilities\rebuild_s_functions.m"

ショートカットのファイル パスを取得します。

shortcuts(7).File
ans = 

    "C:\workSpace\examples\airframe3\utilities\rebuild_s_functions.m"

ショートカット cell 配列内のすべてのファイルを調べます。

{shortcuts.File}'
ans =

  7×1 cell array

    {["C:\workSpace\examples\airframe3\custom_tasks\analyzeModelFiles.m"]}
    {["C:\workSpace\examples\airframe3\custom_tasks\billOfMaterials.m"  ]}
    {["C:\workSpace\examples\airframe3\custom_tasks\checkCodeProblems.m"]}
    {["C:\workSpace\examples\airframe3\custom_tasks\runUnitTest.m"      ]}
    {["C:\workSpace\examples\airframe3\models\slproject_f14.slx"        ]}
    {["C:\workSpace\examples\airframe3\reports\slproject_f14.pdf"       ]}
    {["C:\workSpace\examples\airframe3\utilities\rebuild_s_functions.m" ]}

ファイルのラベル

char 型の、ラベルの新しいカテゴリを作成します。プロジェクトで、新しい Engineers カテゴリが [ラベル] ペインに表示されます。

createCategory(proj, 'Engineers', 'char')
ans = 

  Category with properties:

                Name: "Engineers"
        SingleValued: 0
            DataType: "char"
    LabelDefinitions: [1×0 matlab.project.LabelDefinition]

新規カテゴリで何ができるか調べます。

category = findCategory(proj, 'Engineers');
methods(category)
Methods for class matlab.project.Category:

createLabel  findLabel    removeLabel  

新しいカテゴリに新しいラベルを定義します。

createLabel(category, 'Bob');

ラベル定義を取得します。

ld = findLabel(category, 'Bob')
ld = 

  LabelDefinition with properties:

            Name: "Bob"
    CategoryName: "Engineers"

取得したファイルにラベル myfile を付けます。ファイルをプロジェクトで選択すると、ラベル エディター ペインでこのラベルを確認できます。

addLabel(myfile, 'Engineers', 'Bob');

特定のラベルを取得して、テキストなどのデータをそのラベルに付加します。

label = findLabel(myfile, 'Engineers', 'Bob');
label.Data = 'Please assess'
label = 

  Label with properties:

            File: "C:\workSpace\examples\airframe3\models\AnalogControl.slx"
        DataType: 'char'
            Data: 'Please assess'
            Name: "Bob"
    CategoryName: "Engineers"

次のように、ラベル データの変数を指定できます。

mydata = label.Data
mydata =

    'Please assess'

数値データ型の新しいラベル カテゴリを作成します。

createCategory(proj, 'Assessors', 'double');
category = findCategory(proj, 'Assessors');
createLabel(category, 'Sam');

指定したファイルに新しいラベルを付加し、データ値 2 をそのラベルに割り当てます。

myfile = proj.Files(14);
addLabel(myfile, 'Assessors', 'Sam', 2)
ans = 

  Label with properties:

            File: "C:\workSpace\examples\airframe3\lib\timesthree.tlc"
        DataType: 'double'
            Data: 2
            Name: "Sam"
    CategoryName: "Assessors"

プロジェクトを閉じる

コマンド ラインでプロジェクトを閉じる処理は、プロジェクト ツールを使用してプロジェクトを閉じる場合と同じです。たとえば、プロジェクトはシャットダウン スクリプトを実行し、未保存のモデルを確認します。

close(proj)

詳細

API の使用方法の詳細については、doc currentProject と入力してください。

起動タスクと終了タスクの自動化の詳細については、起動タスクの自動化を参照してください。

参考

| | | |

関連するトピック