スクリプトを使用したプロジェクト タスクの自動化
この例では、プロジェクト 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
と入力してください。
起動タスクと終了タスクの自動化の詳細については、起動タスクの自動化を参照してください。
参考
currentProject
| listModifiedFiles
| refreshSourceControl
| addLabel
| createLabel