メインコンテンツまでスキップ

ダイアグラムビューでの条件付き書式変更

プレビュー公開

本機能および本機能で利用する API は先行公開しているものです。 現時点で品質保証しておりませんので、ご利用される場合はユーザー様の責任でご利用ください。 また、これらの仕様は予告なく変更する場合がありますのでご了承ください。

概要

ダイアグラムビューに表示されるシェイプやラベルなどの書式を、モデルのフィールド値などを条件として動的に変更できます。

条件付き書式変更を実現するには次の実装が必要です。

  • コールバック関数の実装
  • コールバック関数の登録処理の実装

コールバック関数の実装

条件付き書式変更のコールバック関数を実装します。 コールバック関数には次の種類があります。

  • シェイプの書式変更コールバック関数
  • ラベル/テキストの書式変更コールバック関数
  • コンパートメントアイテムの書式変更コールバック関数

以下では、それぞれのコールバック関数の実装について説明します。

シェイプの書式変更コールバック関数

シェイプの書式変更コールバック関数のシグネチャと、コールバック関数で設定可能なスタイルは次の通りです。
コールバック関数の詳細は IViewDefinitions.RegisterGetStyleCallback メソッド の引数 getter の説明をご参照ください。

コールバック関数のシグネチャ

object get_styleFunction(IEditorElement element, IModel model, IStyleProperty target)

設定可能なスタイル

  • 文字色
  • 背景色
  • 線色
  • 線の太さ
  • 線のスタイル(実線 | 点線 | 鎖線 | 1点鎖線 | 2点鎖線 | なし)
  • 図形(※ノードシェイプのみ)
  • 画像(※ノードシェイプのみ)
  • 線の種類(直線 | 折れ線 | 1元ベジェ曲線 | 2元ベジェ曲線 | ツリー)(※コネクタシェイプのみ)
  • 始点形状(※コネクタシェイプのみ)
  • 終点形状(※コネクタシェイプのみ)

ラベル/テキストの書式変更コールバック関数

ラベル/テキストの書式変更コールバック関数のシグネチャと、コールバック関数で設定可能なスタイルは次の通りです。
詳細は IViewDefinitions.RegisterGetTextStyleCallback メソッド の引数 getter の説明をご参照ください。

コールバック関数のシグネチャ

object get_TextStyleFunction(IShape shape, TextTypes type, string textPath, IModel model, IStyleProperty target)

設定可能なスタイル

  • 文字色
  • フォント
  • フォントサイズ
  • 下線
  • 斜体
  • 太字
  • 取り消し線

コンパートメントアイテムの書式変更コールバック関数

コンパートメントアイテムの書式変更コールバック関数のシグネチャと、コールバック関数で設定可能なスタイルは次の通りです。
詳細は IViewDefinitions.RegisterGetCompartmentItemTextStyleCallback メソッド の引数 getter の説明をご参照ください。

コールバック関数のシグネチャ

object object get_ItemTextStyleFunction(INode node, int areaIndex, string areaPath, IModel itemModel, IStyleProperty target)

設定可能なスタイル

  • 文字色
  • フォント
  • フォントサイズ
  • 下線
  • 斜体
  • 太字
  • 取り消し線
  • アイコン
  • アイコンの表示

コールバック関数の登録処理の実装

IExtention を実装したメインクラスの公開メソッドである Activate メソッドに、コールバック関数の登録処理を実装します。
詳細は IViewDefinitions インタフェース の各メソッドをご参照ください。


サンプル:ダイアグラムでのシェイプの強調表示

ダイアグラムビューでの条件付き書式変更のサンプルとして、モデル名に特定キーワードが含まれているシェイプを強調表示する方法を説明します。 以下では、Visual Studio プロジェクトの新規作成から、実際に条件付き書式を組み込むところまでを説明します。

全体の流れ

  • Visual Studio プロジェクトの新規作成
  • 条件付き書式コールバック関数の実装
  • 条件付き書式コールバック関数登録処理の実装

公開サンプル

  • 以下の手順で作成されるサンプルのソースコード一式を GitHub で公開しています。

    外部リンク: ShapeHighlightingSample

ゴールイメージ

画面キャプチャ or GIFアニメ

  • Next Design のサンプルプロジェクトから [先進運転システムソフト開発] プロジェクトを開きます。
  • [システム論理設計] の [システム機能構造] から [機能構造図] を開きます。
  • 名前に特定キーワード「TBD」が含まれているサブシステムが次のように強調表示されます。
    • フォント色:赤
    • 枠線色:赤
    • 太字
    • 下線

Visual Studio プロジェクトの新規作成

Visual Studio プロジェクトは次のページを参考に新規作成します。

チュートリアル > モデル一括検証

なお、モデル追加時の初期化処理の追加では、マニフェストに以下の定義は不要です。

  • UI の拡張ポイント定義(リボンタブ・グループ・ボタン)
  • コマンドの拡張ポイント定義

実装例

manifest.json

{
"name": "DensoCreate.NextDesign.Extensions.ShapeHighlightingSample",
"version": "1.0.0",
"publisher": "DENSO CREATE Inc.",
"license": "Next Design 使用許諾契約書に準ずる。Copyright (C) 2021 DENSO CREATE INC. All rights reserved.",

"main": "ShapeHighlightingSample.dll", // エントリーポイントとしてビルド結果の DLL ファイル名を指定します。
"lifecycle": "project", // ライフサイクルとしてプロジェクトライフサイクルを指定します。
"baseprofile": "車載システムソフト開発" // 対象プロジェクトの条件としてプロファイル名を指定します。
}

条件付き書式コールバック関数の実装

条件付き書式を実現するコールバック関数を実装します。

  • GetShapeStyle:フォント色、枠線色
  • GetTextStyle:太字、下線

実装例

強調表示をするコールバック関数を実装します。

ShapeHighlightingEntryPoint.cs

using System.Linq;
using System.Collections.Generic;
using NextDesign.Core;
using NextDesign.Core.EditingCapabilities;
using NextDesign.Desktop;
using NextDesign.Extension;

namespace ShapeHighlightingSample
{
public class ShapeHighlightingEntryPoint : IExtension
{
// 作業中のテキストを強調表示する書式です
private Dictionary<StyleAttributes, object> workingTextAttribute
= new Dictionary<StyleAttributes, object>()
{
{ StyleAttributes.IsBold, true},
{ StyleAttributes.IsUnderline, true}
};

// 作業中のシェイプを強調表示する書式です
private Dictionary<StyleAttributes, object> workingShapeAttribute
= new Dictionary<StyleAttributes, object>()
{
{ StyleAttributes.ForeColor, "Red"},
{ StyleAttributes.BorderColor, "Red"}
};

/// <summary>
/// テキストのスタイル値を取得するコールバック関数です
/// </summary>
private object GetTextStyle(IShape shape, TextTypes textType, string textPath, IModel model, IStyleProperty styleProperty)
{
object outValue;
if (workingTextAttribute.TryGetValue(styleProperty.Attribute, out outValue))
{
// 「TBD」が名称に含まれると太字、下線にします。
if (model.Name.Contains("TBD"))
{
return outValue;
}
}
// 太字、下線以外の書式は変更しないため、styleProperty.CurrentValueを返します。
return styleProperty.CurrentValue;
}

/// <summary>
/// シェイプのスタイル値を取得するコールバック関数です
/// </summary>
private object GetShapeStyle(IEditorElement element, IModel model, IStyleProperty styleProperty)
{
object outValue;
if (workingShapeAttribute.TryGetValue(styleProperty.Attribute, out outValue))
{
// 「TBD」が名称に含まれるとフォント色と枠線色を赤にします。
if (model.Name.Contains("TBD"))
{
return outValue;
}
}

// フォント色と枠線色以外の書式は変更しないため、styleProperty.CurrentValueを返します。
return styleProperty.CurrentValue;
}

}
}

条件付き書式コールバック関数の登録処理、登録解除処理の実装

IExtention を実装したメインクラスの公開メソッド Activate にコールバック関数の登録処理を実装します。そして、メインクラスの公開メソッド Deactviate にコールバック関数の登録解除処理を実装します。

実装例

条件付き書式コールバック関数の実装に続き、条件付き書式コールバック関数の登録処理、登録解除処理を実装します。

ShapeHighlightingEntryPoint.cs

using System.Linq;
using System.Collections.Generic;
using NextDesign.Core;
using NextDesign.Core.EditingCapabilities;
using NextDesign.Desktop;
using NextDesign.Extension;

namespace ShapeHighlightingSample
{
public class ShapeHighlightingEntryPoint : IExtension
{

/// <summary>
/// エクステンションを活性化します
/// </summary>
/// <param name="context">実行コンテキスト</param>
public void Activate(IContext context)
{
// 条件付き書式を適用する対象の要素定義を取得します
// 対象は、
// ダイアグラム「機能構造図」の「Subsystem」です
IElementDef targetDefinition = GetTargetDefinition(context, "SystemStructureModel", "機能構造図", "SubSystem");

// コールバック関数を登録します
// タイトルの文字色は、テキストではなくシェイプのスタイルで変更します。
var viewDefinitions = context.App.Workspace.CurrentProject.Profile.ViewDefinitions;
viewDefinitions.RegisterGetStyleCallback(targetDefinition, GetShapeStyle);
viewDefinitions.RegisterGetTextStyleCallback(targetDefinition, TextTypes.Title, GetTextStyle);
}

/// <summary>
/// エクステンションを非活性化します
/// </summary>
/// <param name="context">実行コンテキスト</param>
public void Deactivate(IContext context)
{
// 登録したコールバック関数を解除します
IElementDef targetDefinition = GetTargetDefinition(context, "SystemStructureModel", "機能構造図", "SubSystem");
var viewDefinitions = context.App.Workspace.CurrentProject.Profile.ViewDefinitions;
viewDefinitions.UnregisterStyleCallback(targetDefinition);
}

/// <summary>
/// 書式変更対象を取得します
/// </summary>
private IElementDef GetTargetDefinition(IContext context, string diagramClassName, string diagramName, string targetClassName)
{
var profile = context.App.Workspace.CurrentProject.Profile;

// カレントプロジェクトから名称で対象の要素定義を取得します。
var diagramClass = profile.Metamodels.GetClass(diagramClassName);
var diagramDefinition = profile.ViewDefinitions.FindEditorDefByClass(diagramClass, diagramName).GetItem(0);
var targetClass = profile.Metamodels.GetClass(targetClassName);
var targetDefinition = profile.ViewDefinitions.FindElementDefByClass(diagramDefinition, targetClass).GetItem(0);
return targetDefinition;
}
}
}