戻る>>
サンプルプログラム
棒ダイナミックグラフのサンプルプログラム。
(sample006)
|
2系列の棒グラフ(sample004)の動的グラフ(ダイナミックグラフ)サンプルプログラムです。 sample004の棒グラフに1秒毎に再計算した結果を mngInfo.SetCommand(GraphWeaverData.CommandID.redrawGraphPoint) で再描画しています。 サンプルでは、VisioManagerコールバック関数に別スレッドでデータ再計算をして再描画処理を入れています。 終了時にスレッドの状態をチェックしていませんので、Abort処理を行わず終了するとエラーになる場合がありますので、実装時には処理を追加してください。
|
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;
using Visio = Microsoft.Office.Interop.Visio;
using Sakura.GW.Lib;
using Sakura.GW.AbstractLayer;
using Sakura.GW.AbstractLayer.Visio;
using Sakura.GW.Visio.Draw;
namespace VisioAddinGW_App
{
public partial class Form1 : Form
{
bool bExec = false;
int counter = 0;
public Visio.Application visioApp = null;
//GraphWeaver管理マネージャ
GraphWeaverMng visioManager = null;
//Visio用描画モジュール
VisioAddInLib_draw visioDrawModule = null;
//GraphWeaver設定情報
GraphWeaverData mngInfo = new GraphWeaverData();
List list1 = new List();
List list2 = new List();
long docIndex;
Thread thDrawNewData = null;
public Form1()
{
visioApp = (Visio.Application)new Microsoft.Office.Interop.Visio.InvisibleAppClass();
mngInfo.SetDataSeriesNo(2);
InitializeComponent();
}
//Random データのセット
public void RandomDataSet()
{
int seed = Environment.TickCount;
list1.Clear();
list2.Clear();
Random rnd = new Random(seed);
//データ指定
double totl = 0.0;
int r;
for (int x = 1; x < 11; x += 1)
{
r = rnd.Next(1, 11);
totl += r;
Sakura.GW.Lib.Point pos = new Sakura.GW.Lib.Point(r);
list1.Add(pos);
double y = totl / x;
//MessageBox.Show("r=" + r + " total=" + totl + " y=" + y);
Sakura.GW.Lib.Point pos2 = new Sakura.GW.Lib.Point(y);
list2.Add(pos2);
}
mngInfo.SetDataRowData(0, list1);
mngInfo.SetDataRowData(1, list2);
}
///
/// Visio終了時コールバック関数
///
/// アプリケーションハンドル
private void visioApp_BeforeQuit(Microsoft.Office.Interop.Visio.Application app)
{
//Visioが終了された
visioApp = null;
}
delegate void func();
///
/// コールバック関数
///
/// 処理結果フラグ
public void CallbackFunc(ErrorID eErrorID)
{
func fText = delegate() { mess.Text = "描画コマンド " + eErrorID.ToString(); };
func fButton = delegate() { button1.Text = "Start"; };
string message = "";
this.Invoke(fText);
if (eErrorID == ErrorID.NoError)
{
//エラーなし
if (bExec)
{
if (thDrawNewData == null)
{
thDrawNewData = new Thread(drawNewData);
if (thDrawNewData != null)
{
thDrawNewData.Name = string.Format("AppDrawThread : {0}", counter);
thDrawNewData.Start();
counter++;
}
bExec = true;//trueのまま
}
}
return;
}
else if (eErrorID == ErrorID.ProcAbort)
{
//処理中断
message = "Abort";
bExec = false;
}
else
{
//エラー発生
message = "Error ";
message += "\n( error code = " + eErrorID.ToString() + " )";
bExec = false;
}
this.Invoke(fButton);
//ダイアログ表示
MessageBox.Show(message, "GraphWeaver",
MessageBoxButtons.OK, (eErrorID == ErrorID.NoError) ? MessageBoxIcon.Information : MessageBoxIcon.Error);
}
///
/// Visio終了時コールバック関数
///
public void CallbackVisioClosedFunc()
{
//外部からVisioが終了させられたので、ハンドルをnullに設定
visioApp = null;
this.Close();
}
private void button1_Click(object sender, EventArgs e)
{
if (bExec)
{
if (thDrawNewData != null)
{
try
{
thDrawNewData.Abort();
}
catch (ThreadAbortException)
{
}
thDrawNewData = null;
}
bExec = false;
mess.Text = "";
button1.Text = "Start";
return;
}
button1.Enabled = false;
if (visioApp == null)
{
visioApp = (Visio.Application)new Microsoft.Office.Interop.Visio.InvisibleAppClass();
if (visioManager != null)
{
visioManager.stop();
visioManager = null;
visioDrawModule = null;
}
}
else
{
//Visioウィンドウ表示
visioApp.Window.WindowState = (int)Visio.VisWindowStates.visWSRestored;
visioApp.Visible = true;
visioApp.Window.WindowState = (int)Visio.VisWindowStates.visWSActive;
}
if (visioDrawModule == null)
{
//描画モジュールにVisioのApplicationハンドルを渡してインスタンス作成
visioDrawModule = new VisioAddInLib_draw(visioApp);
//管理マネージャに描画モジュールのハンドルを渡してインスタンス作成
visioManager = new GraphWeaverMng(visioDrawModule);
//処理終了時のコールバック登録
visioManager.ResponseFuncs += new GraphWeaverMng.callbackResponse(CallbackFunc);
//Visio終了時のコールバック登録
visioManager.VisioClosedFunc += new GraphWeaverMng.callbackVisioClosed(CallbackVisioClosedFunc);
//管理マネージャ起動
visioManager.start();
}
RandomDataSet();
string pageName = "";
//ページ作成
if (visioManager.createDocument("", out docIndex))
{
pageName = "乱数棒グラフ";
//初期ページを対象にする
if (!visioManager.takeoverPage(docIndex, pageName))
{
//失敗時、新規にページ作成
if (!visioManager.createPage(docIndex, ref pageName))
{
return;
}
}
}
//ページ設定
double he = 297;
double wi = 210;
mngInfo.SetPage(pageName, wi, he, 1.0, LengthUnit.mm);
//グラフ設定
double ghe = 237.0;
double gwi = 168.0;
mngInfo.SetGraphSize(GraphType.BarChart, gwi, ghe, 21.0, 30.0);
//タイトル設定
GraphWeaver_FontAttribute titleAttr = new GraphWeaver_FontAttribute();
titleAttr.fontSizePoint = 25.0;
titleAttr.fontColor.setIndex(ColorIndex.Blue);
mngInfo.SetGraphTitle("1から10までの乱数の発生状況と平均値", titleAttr);
//描画象限設定
//mngInfo.SetGraphImageLimit(Quadrant.QuadrantAll);
//軸設定
GraphWeaver_AxisPack axisSet = new GraphWeaver_AxisPack();
axisSet.axisSpec = AxisSpec.AxisX; //軸種別
axisSet.bEnable = true; //軸表示フラグ
axisSet.min = 0; //最小値
axisSet.max = 10; //最大値
axisSet.title = "回数"; //軸表示名称
axisSet.titleAttr.fontSizePoint = 20.0; //軸表示名称フォントサイズ
axisSet.titleAttr.fontColor.setIndex(ColorIndex.Black); //軸表示名称フォント色
axisSet.tickness = 0.7; //軸太さ
axisSet.axisColor.setIndex(ColorIndex.Black); //軸色
axisSet.additionalLine1.tics = 0; //第1補助線きざみ値
axisSet.additionalLine1.ticLength = 5; //第1補助線長さ
axisSet.additionalLine1.ticThickness = 1; //第1補助線太さ
axisSet.additionalLine1.ticColor.setIndex(ColorIndex.Black); //第1補助線色
axisSet.additionalLine1.ticFontAttr.fontSizePoint = 15.0; //第1補助線数値フォントサイズ(pt)
axisSet.additionalLine1.ticFontAttr.fontColor.setIndex(ColorIndex.Transparence); //第1補助線数値フォント色
axisSet.additionalLine2.mTics = 5; //第2補助線分割数
axisSet.additionalLine2.mTicLength = 3; //第2補助線長さ
axisSet.additionalLine2.mTicThickness = 1; //第2補助線太さ
axisSet.additionalLine2.mTicColor.setIndex(ColorIndex.Black); //第2補助線色
axisSet.arrowStyle = AxisArrowStyle.NoHeads; //軸先端形状 (Head:矢印 Heads:両矢印 NoHeads:なし)
//X軸設定
mngInfo.SetGraphAxisPack(axisSet);
axisSet.axisSpec = AxisSpec.AxisY; //軸種別
axisSet.title = "出現数"; //軸表示名称
axisSet.additionalLine1.tics = 5; //第1補助線きざみ値
//axisSet.additionalLine1.ticLength = 0; //第1補助線長さ
axisSet.additionalLine1.ticFontAttr.fontColor.setIndex(ColorIndex.Black); //第1補助線数値フォント色
//Y軸設定
mngInfo.SetGraphAxisPack(axisSet);
//棒設定
GraphWeaver_BarPack barPack = new GraphWeaver_BarPack();
barPack.style = BarStyle.Normal; //棒のスタイル
barPack.type = BarType.Vertical; //棒のタイプ
barPack.width = 5.0; //棒の太さ
//系列0設定
barPack.barColor.setIndex(ColorIndex.Red); //棒の色
mngInfo.SetGraphBar(0,barPack); //棒の設定
//系列1設定
barPack.barColor.setIndex(ColorIndex.Blue); //棒の色
mngInfo.SetGraphBar(1,barPack); //棒の設定
mngInfo.SetCommand(GraphWeaverData.CommandID.drawGraphAll);
if (!visioManager.DoCommand(docIndex, mngInfo))
{
MessageBox.Show("Not Execute!");
}
else
{
mess.Text = "描画中";
button1.Text = "Abort";
bExec = true;
}
button1.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
bExec = false;
if (thDrawNewData != null)
{
try
{
thDrawNewData.Abort();
}
catch (Exception)
{
}
}
this.Close();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (visioManager != null)
{
if (visioApp != null)
{
//ドキュメントを閉じる
visioManager.closeDocument(docIndex);
}
//管理マネージャ停止
visioManager.stop();
}
try
{
//Visioを閉じる
if (visioApp != null)
{
visioApp.Quit();
Marshal.ReleaseComObject(visioApp); //COMオブジェクト解放
visioApp = null;
}
}
catch (Exception)
{
}
}
private void drawNewData()
{
func fText = delegate() { mess.Text = "redrawing"; };
Thread.Sleep(500);
this.Invoke(fText);
RandomDataSet();
mngInfo.SetCommand(GraphWeaverData.CommandID.redrawGraphPoint);
if (visioManager.DoCommand(docIndex, mngInfo))
{
bExec = true;
}
thDrawNewData = null;
}
}
}
戻る>>