行列シートの基本操作

行列シートとワークシートは、Originオブジェクト構造でのレベルが同じため、このセクションのサンプルは、ワークシートの基本操作の章で紹介しているものと似通っています。

新しい行列シートを追加する

AddLayerメソッドを使用して、行列ブック内の行列シートを追加します。

// "MBook1"という名前の行列ブックにアクセス
MatrixPage mp("MBook1");

// 行列ブックに新しいシートを追加
int index = mp.AddLayer("New Matrix Sheet"); 

// 新しい行列シートにアクセス
MatrixLayer mlayerNew = mp.Layers(index);

行列シートをアクティブにする

行列ブック内のシートをアクティブにするには、関数 set_active_layer を使用できます。

// フルネームで行列シートにアクセス
MatrixLayer mLayer("[MBook1]MSheet1");

// この行列シートをアクティブに設定
set_active_layer(mLayer);

行列シートを削除する

Destroy メソッドを使用して行列シートを削除します。

MatrixLayer ly = Project.ActiveLayer();
if( ly ) // アクティブレイヤが行列シートの場合
    ly.Destroy(); // 行列シートを削除

行列ブック内の行列シートにアクセスする

ワークブック内のワークシートにアクセスするのと同様、行列ブック内の行列シートへは以下の方法によりアクセスできます。

  1. 全レイヤ名による
  2. // 行列シートのフルネーム
    string strFullName = "[MBook1]MSheet1!";
    
    // 行列シートのインスタンスを構成し、名前を付けたシートを付加
    MatrixLayer matLy1(strFullName);
    
    // 名前付きシートに既存行列のインスタンスを付加
    matLy2.Attach(strFullName);
  3. 行列ブックには、行列レイヤのコレクションが含まれています。全ての特定の行列ブック内の行列レイヤを 、foreachステートメントを使用してループします。
  4. MatrixPage matPage("MBook1");
    foreach(Layer ly in matPage.Layers)
        out_str(ly.GetName());
  5. 名前かインデックスで特定の行列シートにアクセス
  6. // ページ MBook1には、最低でも2つの行列シートがあると仮定
    // それらのシート名は、MSheet1 と MSheet2 
    MatrixPage matPage("MBook1");
    MatrixLayer lyFirst = matPage.Layers(0); //インデックスによる
    MatrixLayer lySecond = matPage.Layers("MSheet2"); //名前による

行列シートのプロパティを修正する

次数の取得と設定

Originでは、行列シート内のすべての行列オブジェクトは同じ次数(列と行の数が同じ)を共有します。

  1. 行列シートの行と列の数を取得するには、まず行列シートの最初の行列オブジェクトを取得し、MatrixObject クラスのメソッド (GetNumColsGetNumRows) を使用します。
  2. // 行と列の数を取得
    MatrixLayer ml = Project.ActiveLayer(); // アクティブ行列シートを取得	
    MatrixObject mo = ml.MatrixObjects(0); // 第1行列オブジェクトを取得
    
    int nNumRows = mo.GetNumRows();  // 行数を取得
    int nNumCols = mo.GetNumCols();  // 列数を取得
  3. 行列シートの次数を設定するには、MatrixLayer::SetSize メソッドを使用します。
  4. // 行と列の数を設定
    MatrixLayer ml = Project.ActiveLayer(); // アクティブ行列シートを取得
    ml.SetSize(-1, 5, 5);  //次数を 5x5 に設定
  5. MatrixObject クラスは、次数設定のためのメソッド SetSize を提供します。しかし、同じ行列シート内の全行列オブジェクトの次数は同じであるため、MatrixObjectで定義されるメソッドであるにも関わらず、行列シートの次数が変更されることに注意してください。
  6. // 行と列の数を設定
    MatrixLayer ml = Project.ActiveLayer(); // アクティブな行列シートを取得 
    MatrixObject mo = ml.MatrixObjects(0); // 第1オブジェクトを取得
    
    int nNumRows = 5, nNumCols = 5;
    mo.SetSize(nNumRows, nNumCols);  // 次数を 5x5 に設定
  7. 行列は、番号が付けられた列と行を持ち、これらは等間隔で線形にマッピングされたX値およびY値です。SetXY メソッドでXY のマッピング座標を設定できます。Note: このメソッドは、行列オブジェクトによって利用可能ですが、XYマッピングは同じ行列シート上で共有します。
  8. MatrixLayer ml = Project.ActiveLayer();  // アクティブレイヤを取得
    MatrixObject mo = ml.MatrixObjects(0);  // 第1行列オブジェクトを取得
    mo.SetXY(-10, 20, -2.3, 12.4);  // Xを -10 から 20 にし、Yを -2.3 から 12.4 に設定

ラベルの取得と設定

行列のラベルには、X、Y、Zに対するロングネーム、単位、コメントが含まれます。XとYのラベルは、行列シート内の全行列オブジェクトで共通で、Zのラベルは各行列オブジェクトで固有です。次のコードは、ラベルの取得と設定の方法を示しています。

  1. XYラベルを設定
  2. MatrixPage mp("MBook1");
    MatrixLayer ml = mp.Layers(0); // 第1行列シート	
    
    Tree tr;
    tr.Root.Dimensions.X.LongName.strVal = "X Values";
    tr.Root.Dimensions.X.Unit.strVal = "X Units";
    tr.Root.Dimensions.X.Comment.strVal = "X Comment";
    
    tr.Root.Dimensions.Y.LongName.strVal = "Y Values";
    tr.Root.Dimensions.Y.Unit.strVal = "Y Units";
    tr.Root.Dimensions.Y.Comment.strVal = "Y Comment";
    
    // XYラベルのための行列シート上でフォーマットをセット
    if( 0 == ml.UpdateThemeIDs(tr.Root) )
    	ml.ApplyFormat(tr, true, true);
  3. XYラベルを取得
  4. MatrixPage mp("MBook1");
    MatrixLayer ml = mp.Layers(0); // 第1行列シート
    
    // 行列オブジェクトではなく行列シートのXYラベルを取得
    Tree tr;
    tr = ml.GetFormat(FPB_ALL, FOB_ALL, TRUE, TRUE);
    
    TreeNode trX = tr.Root.Dimensions.X;
    if( !trX.LongName.IsEmpty() )
    	printf("X Long Name: %s\n", trX.LongName.strVal);
    if( !trX.Unit.IsEmpty() )
    	printf("X Unit: %s\n", trX.Unit.strVal);
    if( !trX.Comment.IsEmpty() )
    	printf("X Comment: %s\n\n", trX.Comment.strVal);
    
    TreeNode trY = tr.Root.Dimensions.Y;
    if( !trY.LongName.IsEmpty() )
    	printf("Y Long Name: %s\n", trY.LongName.strVal);
    if( !trY.Unit.IsEmpty() )
    	printf("Y Unit: %s\n", trY.Unit.strVal);
    if( !trY.Comment.IsEmpty() )
    	printf("Y Comment: %s\n", trY.Comment.strVal);
  5. Zラベルを設定
  6. MatrixPage mp("MBook1");
    MatrixLayer ml = mp.Layers(0); // 第1行列シート
    MatrixObject mo = ml.MatrixObjects(0);// 第1行列オブジェクト
    
    // フォーマットツリーを構成して文字列値をツリーノードに割り当て
    Tree tr;	
    tr.Root.LongName.strVal = "Z Long Name";
    tr.Root.Unit.strVal = "Z Units";
    tr.Root.Comment.strVal = "Z Comment";
    
    // 行列シートではなく、行列オブジェクトにZラベルを適用
    if( 0 == mo.UpdateThemeIDs(tr.Root) ) // 各ツリーノードのIDを追加
    	mo.ApplyFormat(tr, true, true);	// 適用
  7. Zラベル取得
  8. MatrixPage mp("MBook1");
    MatrixLayer ml = mp.Layers(0); // 第1行列シート
    MatrixObject mo = ml.MatrixObjects(0);
    
    Tree tr;	
    tr = mo.GetFormat(FPB_ALL, FOB_ALL, TRUE, TRUE);
    
    printf("Z Short Name: %s\n", tr.Root.ShortName.strVal);
    if( !tr.Root.LongName.IsEmpty() )// 空でない場合
    	printf("Z Long Name is %s\n", tr.Root.LongName.strVal);
    if( !tr.Root.Unit.IsEmpty() )
    	printf("Z Unit is %s\n", tr.Root.Unit.strVal);
    if( !tr.Root.Comment.IsEmpty() )
    	printf("Z Comment is %s\n", tr.Root.Comment.strVal);

行列シートのフォーマット

テーマツリーを使用して、プログラムで行列シートをフォーマットできます。

次のサンプルは、アクティブ行列シートないのセルブロックをフォーマットし、背景を青色、テキストを明るい深紅色にします。

MatrixLayer ml = Project.ActiveLayer();
 
Tree tr;
tr.Root.CommonStyle.Fill.FillColor.nVal = SYSCOLOR_BLUE;
tr.Root.CommonStyle.Color.nVal = SYSCOLOR_LTMAGENTA;
 
DataRange dr;
dr.Add(NULL, ml, 2, 2, 5, 3); // 第1行、列、最後の行、列
if( 0 == dr.UpdateThemeIDs(tr.Root) )
    dr.ApplyFormat(tr, TRUE, TRUE);

行列セルテキスト色の取得と設定

次のサンプルでは、せるのテキスト色を取得して設定します。

// 単純なユーティリティ関数に 'set' コードを内包
bool setCellTextColor(Datasheet& ds, int row, int col, uint color)
{
    Grid grid;
    if( !grid.Attach(ds) )
        return false;
    vector<uint> vTextColor(1);
    vTextColor[0] = color;
    return grid.SetCellTextColors(vTextColor, col, row, row);
}
 
// シンプルなユーティリティ関数に 'get' コードを内包
bool getCellTextColor(Datasheet& ds, int row, int col, uint& color)
{
    Grid grid;
    if( !grid.Attach(ds) )
        return false;
    vector<uint> vTextColor;
    if( !grid.GetCellTextColors(vTextColor, col, row, row) )
        return false;
    color = vTextColor[0];
    return true;
}
 
// 上述のユーティリティ関数をテストするためのシンプルな関数
void testCellTextColor(int nRow = 3, int nCol = 4)
{
    MatrixLayer ml = Project.ActiveLayer();
	// nRow, nCol は LT/GUI インデックス, 1-offsetを使用するが OC は 0-offset
	int row = nRow-1, col = nCol-1;
    setCellTextColor(ml, row, col, SYSCOLOR_BLUE);
 
    uint color;
    getCellTextColor(ml, row, col, color);
    printf("color == %d\n", color);
}