行列シートの基本操作行列シートとワークシートは、Originオブジェクト構造でのレベルが同じため、このセクションのサンプルは、ワークシートの基本操作の章で紹介しているものと似通っています。
新しい行列シートを追加する
Matrixbook, Add One SheetMatrixbook, Activate a SheetAddLayerメソッドを使用して、行列ブック内の行列シートを追加します。
// "MBook1"という名前の行列ブックにアクセス
MatrixPage mp("MBook1");
// 行列ブックに新しいシートを追加
int index = mp.AddLayer("New Matrix Sheet");
// 新しい行列シートにアクセス
MatrixLayer mlayerNew = mp.Layers(index);
行列シートをアクティブにする
Active MatrixsheetActive WindowActive WorkbookActive Matrixbook行列ブック内のシートをアクティブにするには、関数 set_active_layer を使用できます。
// フルネームで行列シートにアクセス
MatrixLayer mLayer("[MBook1]MSheet1");
// この行列シートをアクティブに設定
set_active_layer(mLayer);
行列シートを削除する
Destroy メソッドを使用して行列シートを削除します。
MatrixLayer ly = Project.ActiveLayer();
if( ly ) // アクティブレイヤが行列シートの場合
ly.Destroy(); // 行列シートを削除
行列ブック内の行列シートにアクセスするmatrixbook, Get One Sheetmatrixbook, Get Name
ワークブック内のワークシートにアクセスするのと同様、行列ブック内の行列シートへは以下の方法によりアクセスできます。
- 全レイヤ名による
// 行列シートのフルネーム
string strFullName = "[MBook1]MSheet1!";
// 行列シートのインスタンスを構成し、名前を付けたシートを付加
MatrixLayer matLy1(strFullName);
// 名前付きシートに既存行列のインスタンスを付加
matLy2.Attach(strFullName);
- 行列ブックには、行列レイヤのコレクションが含まれています。全ての特定の行列ブック内の行列レイヤを 、foreachステートメントを使用してループします。
MatrixPage matPage("MBook1");
foreach(Layer ly in matPage.Layers)
out_str(ly.GetName());
- 名前かインデックスで特定の行列シートにアクセス
// ページ MBook1には、最低でも2つの行列シートがあると仮定
// それらのシート名は、MSheet1 と MSheet2
MatrixPage matPage("MBook1");
MatrixLayer lyFirst = matPage.Layers(0); //インデックスによる
MatrixLayer lySecond = matPage.Layers("MSheet2"); //名前による
行列シートのプロパティを修正する
次数の取得と設定
Originでは、行列シート内のすべての行列オブジェクトは同じ次数(列と行の数が同じ)を共有します。
- 行列シートの行と列の数を取得するには、まず行列シートの最初の行列オブジェクトを取得し、MatrixObject クラスのメソッド (GetNumCols と GetNumRows) を使用します。
// 行と列の数を取得
MatrixLayer ml = Project.ActiveLayer(); // アクティブ行列シートを取得
MatrixObject mo = ml.MatrixObjects(0); // 第1行列オブジェクトを取得
int nNumRows = mo.GetNumRows(); // 行数を取得
int nNumCols = mo.GetNumCols(); // 列数を取得
- 行列シートの次数を設定するには、MatrixLayer::SetSize メソッドを使用します。
// 行と列の数を設定
MatrixLayer ml = Project.ActiveLayer(); // アクティブ行列シートを取得
ml.SetSize(-1, 5, 5); //次数を 5x5 に設定
- MatrixObject クラスは、次数設定のためのメソッド SetSize を提供します。しかし、同じ行列シート内の全行列オブジェクトの次数は同じであるため、MatrixObjectで定義されるメソッドであるにも関わらず、行列シートの次数が変更されることに注意してください。
// 行と列の数を設定
MatrixLayer ml = Project.ActiveLayer(); // アクティブな行列シートを取得
MatrixObject mo = ml.MatrixObjects(0); // 第1オブジェクトを取得
int nNumRows = 5, nNumCols = 5;
mo.SetSize(nNumRows, nNumCols); // 次数を 5x5 に設定
- 行列は、番号が付けられた列と行を持ち、これらは等間隔で線形にマッピングされたX値およびY値です。SetXY メソッドでXY のマッピング座標を設定できます。Note: このメソッドは、行列オブジェクトによって利用可能ですが、XYマッピングは同じ行列シート上で共有します。
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のラベルは各行列オブジェクトで固有です。次のコードは、ラベルの取得と設定の方法を示しています。
- XYラベルを設定 Matrixsheet, Get/Set Labels for XY
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);
- XYラベルを取得
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);
- Zラベルを設定Matrixsheet, Get/Set Labels for Z
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); // 適用
- Zラベル取得
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);
}
|