GraphWeaver for Visio サンプルプログラム
サンプルプログラムご利用にあたって
    以下の使用条件を遵守して下さい。
  • サンプルプログラムおよび資料のネットワークへの公衆送信、および、雑誌・製品への無許可の添付・複製を禁止します。
  • 当社は、サンプルプログラムおよび資料の使用に付随また関連して発生する損害に関して、一切の責任を負わないものとします。
  • サンプルプログラムおよび資料に、誤字・脱字・位置ずれ等の表記、又、内容に誤りがございましても当社として責任は負わないものとします。
  • サンプルプログラムおよび資料は、予告せずに改良・変更することがあります。
  • サンプルプログラムおよび資料は、動作例・応用例を説明するためのものです。したがってこれらの情報を使用される場合には、使用者の責任においてプログラムを設計してください。これらの使用に付随また関連して発生する損害に関して、当社は一切の責任を負わないものとします。
戻る>> サンプルプログラム
折れ線ダイナミックグラフのサンプルプログラム。 (sample007)
1次元2系列の折れ線グラフ(sample005)の動的グラフ(ダイナミックグラフ)サンプルプログラムです。
sample005の折れ線グラフに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;
        }
    }
}
							
戻る>>
GraphWeaver for Visio に関するお問い合せは まで。

※Microsoft及びOffice,Visio,Excell,PowerPointは米国Microsoft Corporationの登録商標です。