MicroGDS 機能と特長

C#による「自由曲線」サンプル 

マウスの移動軌跡を基にして、自由曲線を作図するカスタマイズサンプルをご紹介します。ここではツールバーおよびイベントマネージャを利用して機能を実現しています。

※以下のサンプルソースは、MicroGDS V10用となります。MicroGDS V11で使用する場合は、イベントマネージャの変数にセットする値を以下に置き換えてください。
「true」→「-1」
「false」→「0」

例)  
  変更前 axCadEvMgr601.Initialize = true;
  変更後 axCadEvMgr601.Initialize = -1;

用途

ツールバー上で線種および色を選択して自由曲線を作図します。また文字種および色を選択して入力したテキストを作図します。

ツール作成の流れ


1. 開発用プロジェクトを作成する
   開発用プロジェクトの作成
   MicroGDSの.NETライブラリの追加
   MicroGDSイベントマネージャの追加 

2. ツールを作成する
   ソースコードの貼り付け
   「Form1.cs」に2つのイベントを設定
   プロジェクトをビルドして実行ファイル(.exe)を作成
3. 実行の仕方
4. ソース解説
5. サンプルソース

1. 開発用プロジェクトを作成する

Microsoft Visual Studio 2005を利用して、開発用プロジェクトの作成手順、MicroGDSの.NETライブラリ(MGDSNet)の追加方法、MicroGDSイベントマネージャの追加方法の流れを説明します。

開発用プロジェクトの作成
  1. スタートメニューから「Microsoft Visual Studio 2005」を実行します。
  2. Microsoft Visual Studioのツールメニューから「ファイル/新規作成/プロジェクト」を実行します。

    ※ツールメニューに「ファイル/新規作成/プロジェクト」が無く、「ファイル/新しいプロジェクト」が存在する場合は、Microsoft Visual Studioの開発設定が「Visual Basic 開発設定」または「Web 開発設定」になっている可能性が考えられます。 その場合はメニュー項目の名称が異なる場合がありますので、随時名称を読み替えて手順を進めてください。 このページ内の開発設定と同じにする場合は、「ツール/設定のインポートとエクスポート」を実行し、ウィザードから「すべての設定をリセット」を選んで「次へ」をクリックします。 次の「現在の設定の保存」ダイアログで「はい、現在の設定を保存します」を選んで「次へ」をクリックします。 そして「設定の既定のコレクションの選択」ダイアログで「全般的な開発設定」を選んで「完了」をクリックします。 最後に「リセットの完了」ダイアログで「閉じる」をクリックすると、開発設定を変更することができます。

  3. 「プロジェクトの種類」より「Visual C#」を選択し、「テンプレート」から「Windows アプリケーション」を選択します。また「プロジェクト名」欄に作成するアプリケーションの名前「DrawFreeLine」を入力します。
  4. 「OK」ボタンをクリックするとプロジェクトが作成されます。
MicroGDSの.NETライブラリの追加
  1. Microsoft Visual Studioのツールメニューから「プロジェクト/参照の追加」を実行します。
  2. 「.NET」タブよりコンポーネント名「MicroGDS API」を選択します。
  3. 「OK」ボタンをクリックするとソリューションエクスプローラの参照設定に「MGDSNet」が追加され、MicroGDSのカスタマイズに必要な.NETライブラリが使用できるようになります。
MicroGDSイベントマネージャの追加
  1. Microsoft Visual Studioのツールメニューから「ツール/ツールボックス アイテムの選択」を実行します。
  2. 「COMコンポーネント」タブより名前「MicroGDS Event Manager」をチェックします。
  3. 「OK」ボタンをクリックし、「Form1.cs [デザイン]」タブ内のフォーム上をクリックして、ドラッグ中のアイコンを配置します。
    ※アイコンがドラッグされない場合は、Microsoft Visual Studioのツールメニューから「表示/ツールボックス」を実行し、ツールボックス内から「MicroGDS Event Manager」を選択してフォーム上に配置します。
  4. アイコンを配置することでソリューションエクスプローラの参照設定に「AxCadevmgrLib60」と「CadevmgrLib60」とが追加され、MicroGDSイベントマネージャが使用できるようになります。

2. ツールを作成する

ソースコードの貼り付け
  1. Microsoft Visual Studioの「Form1.cs [デザイン]」タブをクリックします。
  2. ツールメニューから「表示/コード」を実行します。
  3. ツールメニューから「編集/すべて選択」を実行し、現状のソースコードをすべて選択します。
  4. ツールメニューから「編集/削除」を実行し、現状のソースコードをすべて削除します。
  5. このページ内のサンプルソースをWebブラウザ上でコピーして、Microsoft Visual Studioのツールメニューから「編集/貼り付け」を実行し、ソースコードを貼り付けます。
「Form1.cs」に2つのイベントを設定
  1. Microsoft Visual Studioの「Form1.cs [デザイン]」タブをクリックします。
  2. ツールメニューから「表示/プロパティ ウィンドウ」を実行します。
  3. プロパティウィンドウ上側のコントロール選択コンボボックスから「Form1」を選択します。
  4. コンボボックス下のツールバーより、「イベント」ボタンをクリックします。
  5. プロパティグリッド内の「Load」をクリックし、右側のコンボボックスから「Form1_Load」を選択して、フォーム読込時のイベントを関連付けます。
  6. 同様に「FormClosed」をクリックし、右側のコンボボックスから「Form1_FormClosed」を選択して、フォームを閉じた時のイベントを関連付けます。
プロジェクトをビルドして実行ファイル(.exe)を作成
  1. Microsoft Visual Studioのツールメニューから「ビルド/ソリューションのビルド」を実行します。

    ※ソースコードがビルドされた際にエラーが表示された場合は、これまでの手順のいずれかで作業が誤っていることが考えられますので、作業の流れを再度確認してください。

  2. Microsoft Visual Studioのツールメニューから「表示/出力」を実行します。
  3. ビルドが正常に終了し、出力ウィンドウ内に「ビルド: 1 正常終了または最新の状態、0 失敗、0 スキップ」と表示されていることを確認します。
  4. 出力ウィンドウ内の「DrawFreeLine ->」の行に、実行ファイル(.exe)が作成されたフォルダのパスが確認できます。この実行ファイル(.exe)と同じフォルダ内に以下のツールバー用ビットマップファイル(計6ファイル)をダウンロードします。
    customize_sample03_draw.bmp
    customize_sample03_text.bmp
    customize_sample03_red.bmp
    customize_sample03_blue.bmp
    customize_sample03_green.bmp
    customize_sample03_exit.bmp
    ※WebブラウザがMicrosoft Internet Explorerの場合は、上記表内のファイル名または画像を右クリックして「対象をファイルに保存」を実行し、「ビットマップ イメージ」形式で実行ファイル(.exe)と同じフォルダ内に保存してください。
    ※デフォルトのパスは「マイ ドキュメント」フォルダ内の「\Visual Studio 2005\Projects\DrawFreeLine\DrawFreeLine\bin\Debug」ですが、開発環境によって異なる場合があります。

3. 実行の仕方

  1. MicroGDS 10.0を起動し、新規作成で「新規シングルユーザーファイル」を作成します。
  2. MicroGDSの「ミニウィンドウエディタ」より、レイヤ(通常はdefault)をカレントに設定します。
  3. Microsoft Visual Studioのツールメニューから「デバッグ/デバッグ開始」を実行します。
  4. MicroGDSの下側に「FreeLine」ツールバーが作成されます。
    ※各ボタンの機能はステータスバーおよびツールバー上に表示される説明(ツールチップ)を参考にしてください。
  5. ツールバーの「ツールの終了」をクリックするとツールバーが削除され、Microsoft Visual Studioのデバッグ状態が終了し、プログラムが終了します。

4. ソース解説

  1. MicroGDSの.NETライブラリ(MGDSNet)のネームスペース(namespace)を宣言し、このファイル内でMicroGDSの.NETライブラリを使用する際に「Informatix.MGDS.Cad.〜」を省略して「Cad.〜」として使えるようにします。
    using Informatix.MGDS;
    
  2. MicroGDSイベントマネージャを利用するためにはフォームが必要です。ただしユーザインターフェースはMicroGDSのツールバーを介して行なうので、フォーム自体は非表示にしています。 起動中のMicroGDSを識別するセッションIDを取得し、それをMicroGDSイベントマネージャにセットしています。これにより、MicroGDSで発生したイベントがプログラム側に伝達されるようになります。 イベントの定義はソースコードの「イベントの設定」部分で行なっています。MicroGDS上のツールバーのいずれかのボタンが押された時には「CustomCommand」イベントが通知されます。 このイベントが発生した際に、プログラム内でどの機能を実行するかを分岐して判断させます。このサンプルでは「+= delegate();」という形でC#の匿名メソッドの記述を利用して定義し、ソースコードの視認性を高めています。 カレントのドキュメントが変更された時には「CurDocChange」イベントが通知され、この場合はツールバー上のスタイルの定義を更新します。 プログラムが終了する前にMicroGDSが終了された場合は「MgdsClose」イベントが通知され、(MicroGDSとは独立した)このプログラムを終了するための処理が実行されます。 MicroGDS上でマウスを動かすと「DynamicPos」イベントが通知されますが、自由曲線の指示の際にのみ利用するので、ここではイベントの設定だけを行なっています。 最終的なイベントの開始は「axCadEvMgr601.EV_〜」と「axCadEvMgr601.Initialize」とに「true」を入れることで開始されます。
            /// 
            /// フォーム読込時のイベント
            /// 
            private void Form1_Load(object sender, EventArgs e)
            {
            	(省略)
            }
    
  3. このツールはフォーム型のアプリケーションなので、フォームが閉じられるメソッド「this.Close()」が実行されることで、プログラムが終了します。 プログラムの終了時にこのイベントが発生するので、MicroGDSイベントマネージャからのイベント通知を停止します。
            /// 
            /// フォームを閉じた時のイベント
            /// 
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
            	(省略)
            }
    
  4. MicroGDSとの通信を開始し、ツールバーを作成します。どのボタンが押されたかを判断するためには1〜999までのイベントIDを設定し、「CustomCommand」イベントに設定した処理内で判定します。 ここでは「Cad.GetFreeToolbarEvent」を使うことで、MicroGDSから未使用のイベントのIDを取得して、ツールバーの各ボタンに割り当てています。 ツールバーを作成したら、MicroGDSとの通信を切断します。
            /// 
            /// ツールバーの作成
            /// 
            private bool prepareToolBarButtons()
            {
            	(省略)
            }
    
  5. カレントのドキュメントに定義されている線種および文字種を取得して、ツールバー内のコンボボックスに設定します。 このメソッドは2箇所(ツールバーの作成時およびカレントのドキュメントが切り替わった時)から呼ばれるため、独立したメソッドにしています。 また線種および文字種の取得には共通部分が多いので、処理を共有してソースコードを減らしています。
            /// 
            /// スタイルリストのコンボボックスの内容を設定
            /// 
            private void setupStyleCombo()
            {
            	(省略)
            }
    
            /// 
            /// コンボボックスの内容を設定
            /// 
            private void setupComboText(string listName, string curStyle, Style styleType)
            {
            	(省略)
            }
    
  6. ツールバー上に自由曲線およびテキスト図形の色を選択するボタンを追加します。 ここではボタンを押す度に、押されたボタンを削除し、次の色のボタンを追加しています。 追加する際には終了ボタンの手前になるように、終了ボタンの位置を動的に取得しています。
            /// 
            /// 色変更ボタンの作成
            /// 
            private void setColourButton(int eventNo)
            {
            	(省略)
            }
    
  7. 自由曲線の作図を行なうメソッドです。この機能が実行中には他の機能が動作しないように「CustomCommand」イベントを停止しています。 開始位置がスナップされて終了位置がスナップされるまでの間は「DynamicPos」イベントの通知がされるように「axCadEvMgr601.EV_DynamicPos」の値を変更します。 これにより「Cad.GetArg」で問い合わせ中にも、MicroGDS上でマウスが動く度にイベントが発生し、「Form1_Load」メソッド内で設定した「DynamicPos」イベント処理での「Cad.LineTo」が実行され、マウスの軌跡に線分を描き続けていきます。 またUndoマーカのモードを明示的に設定することで、BackSpaceでキャンセルする動作をUndoの処理で実現しています。
            /// 
            /// 自由曲線の作図
            /// 
            private void EvMgr_Draw()
            {
            	(省略)
            }
    
  8. テキストの作図を行なうメソッドです。この機能が実行中には他の機能が動作しないように「CustomCommand」イベントを停止しています。 図形をドラッグするためには、一度図面上に作図する必要があり、このメソッドでは図面の表示領域を取得して、表示領域外へ一時的に作図してドラッグに利用しています。 また通常テキストのドラッグ中はテキストの領域がボックス表示されるだけで内容が分りません。ここでは「Cad.LinesFromCurText」にてテキストを図形化(線プリミティブ化)することで、ドラッグ中でもテキストの内容が確認できるようになります。 配置する位置がスナップされた後は、一時的に作図したオブジェクトのフック点を移動してから、図形化した線プリミティブを削除し、正しいテキストプリミティブを作図することで、プリミティブタイプの置き換えを実現しています。
            /// 
            /// テキストの作図
            /// 
            private void EvMgr_Text()
            {
            	(省略)
            }
    
  9. 終了の処理を行なうメソッドです。ここではツールバーを削除し、「this.Close()」メソッドを実行してプログラムを終了させます。
            /// 
            /// 終了の処理
            /// 
            private void EvMgr_Exit()
            {
            	(省略)
            }
    
  10. 自由曲線およびテキスト図形を作図する際に、ツールバーで設定した色を、MicroGDSの実際の色として設定しています。
            /// 
            /// 色の設定
            /// 
            private void setColour(int ColNo)
            {
            	(省略)
            }
    
  11. 自由曲線を作図している最中で、マウスの移動距離が少ない場合、線分を作図しないように判定するメソッドです。 これを行なうことで、長さの短い線分(short vector)が作られることを防止します。
            /// 
            /// 距離の判定
            /// 
            private bool isSamePos(double x1, double y1, double x2, double y2)
            {
            	(省略)
            }
    
  12. 自由曲線およびテキスト図形の作図前後でMicroGDSのパラメータが変化しないように、各種パラメータを保存、そして元に戻すメソッドをまとめたクラスです。
            /// 
            /// パラメータ保存用のクラス
            /// 
            private class cSaveParams
            {
            	(省略)
            }
    
  13. MicroGDSのアプリケーションウィンドウ上にメッセージボックスを出すクラスです。このツールとMicroGDSとは独立したプロセスで動作するプログラムです。 このため単にツールからメッセージボックスを表示すると、タイミングによってはMicroGDSのアプリケーションウィンドウの下側に埋まってしまい、 メッセージボックスが出ているにも関わらず、そのメッセージに気が付かないことで、一見MicroGDSがフリーズしたように感じます。 .NETのIWin32Windowインターフェースを利用して、このクラスにMicroGDSのウィンドウハンドルを設定し、メッセージボックスの引数に渡すことで、 MicroGDSのアプリケーションウィンドウ上にメッセージボックスが表示され、確実にメッセージを伝えることができるようになります。
            /// 
            /// IWin32Windowを実装するクラス
            /// 
            private class WinHandle : IWin32Window
            {
            	(省略)
            }
    

5.サンプルソース

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Informatix.MGDS;

namespace DrawFreeLine
{
    public partial class Form1 : Form
    {
        //変数の初期化
        private Conversation cv = null;             //MicroGDSとの通信用
        private cSaveParams CurParam = null;        //パラメータの保持用
        private int[] EventsNo = new int[4];        //イベントIDの保持用
        private const string tbname = "FreeLine";   //ツールバーの名称
        private int curcol = 2;                     //選択中の色
        private double LastDragX = 0.0;             //ドラッグ時の最終X座標
        private double LastDragY = 0.0;             //ドラッグ時の最終Y座標
        private const double epsilon = 0.5;         //同位置の判定用マージン

        /// 
        /// フォームのコンストラクタ
        /// 
        public Form1()
        {
            InitializeComponent();
        }

        /// 
        /// フォーム読込時のイベント
        /// 
        private void Form1_Load(object sender, EventArgs e)
        {
            //フォームを非表示にする
            this.Opacity = 0;
            this.ShowInTaskbar = false;

            //MicroGDSとの通信を準備
            cv = new Conversation();

            //パラメータ保持用のクラスを初期化
            CurParam = new cSaveParams();

            //ツールバーとコマンド用イベントの設定
            if (!prepareToolBarButtons())
            {
                //スレッドのメッセージループを終了する
                Application.ExitThread();
                return;
            }

            //MicroGDSのセッションIDを取得
            int[] sessions = new int[1];
            Cad.GetSessionIDs(sessions, 1);

            //イベント監視対象のMicroGDSを設定
            axCadEvMgr601.SessionID = sessions[0];

            //イベントの設定(カスタムコマンドが選ばれた時に発生)
            axCadEvMgr601.CustomCommand += delegate(object sender_sub,
                AxCadevmgrLib60._DCadEvMgrEvents60_CustomCommandEvent e_sub)
            {
                if (e_sub.userData == EventsNo[0])
                {
                    //自由曲線の作図
                    EvMgr_Draw();
                }
                else if (e_sub.userData == EventsNo[1])
                {
                    //テキストの作図
                    EvMgr_Text();
                }
                else if (e_sub.userData == EventsNo[2])
                {
                    //色変更ボタンの変更
                    setColourButton(EventsNo[2]);
                }
                else if (e_sub.userData == EventsNo[3])
                {
                    //終了の処理
                    EvMgr_Exit();
                }
            };

            //イベントの設定(カレントのドキュメントが変更された時に発生)
            axCadEvMgr601.CurDocChange += delegate
            {
                //スタイルコンボボックスの内容を再設定
                setupStyleCombo();
            };

            //イベントの設定(MicroGDSが終了した時に発生)
            axCadEvMgr601.MgdsClose += delegate
            {
                //ツールを終了
                this.Close();
            };

            //イベントの設定(ドラッグ時描画用のDynamicPosイベント)
            axCadEvMgr601.DynamicPos += delegate(object sender_sub,
                AxCadevmgrLib60._DCadEvMgrEvents60_DynamicPosEvent e_sub)
            {
                //ウィンドウ範囲外は処理しない
                if (e_sub.x == 0.0 && e_sub.y == 0.0 && e_sub.snapCode == 0)
                {
                    return;
                }

                //Short Vectorの防止
                if (isSamePos(LastDragX, LastDragY, e_sub.x, e_sub.y))
                {
                    return;
                }

                //自由曲線の描画
                Cad.Vector cvec = new Cad.Vector(e_sub.x, e_sub.y, 0.0);
                Cad.LineTo(cvec);

                //short vectorの防止用に値を保持
                LastDragX = e_sub.x;
                LastDragY = e_sub.y;
            };

            //イベント監視の開始
            axCadEvMgr601.EV_CustomCommand = true;
            axCadEvMgr601.EV_CurDocChange = true;
            axCadEvMgr601.EV_MgdsClose = true;
            axCadEvMgr601.Initialize = true;
        }

        /// 
        /// フォームを閉じた時のイベント
        /// 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            //イベント監視の停止
            axCadEvMgr601.Initialize = false;
        }

        /// 
        /// ツールバーの作成
        /// 
        private bool prepareToolBarButtons()
        {
            bool status = false;

            try
            {
                //MicroGDSと通信開始
                cv.Start();

                //ツールバーを作成
                Cad.TBarCustomCreate(tbname, Docking.Bottom, string.Empty, 0, 0);

                //自由曲線ボタンを追加
                EventsNo[0] = Cad.GetFreeToolbarEvent(0);
                Cad.TBarInsertButtonFromFile(tbname, 0, "Draw", "{/e" +
                    EventsNo[0].ToString() + " /tmw}", TBarButton.Push, "自由な線を描く",
                    EventsNo[0], Application.StartupPath + @"\customize_sample03_draw.bmp");

                //テキストボタンを追加
                EventsNo[1] = Cad.GetFreeToolbarEvent(0);
                Cad.TBarInsertButtonFromFile(tbname, 1, "Text", "{/e" +
                    EventsNo[1].ToString() + " /tmw}", TBarButton.Push, "テキストを記入",
                    EventsNo[1], Application.StartupPath + @"\customize_sample03_text.bmp");

                //テキストボックスを追加
                Cad.TBarInsertControl(tbname, 2, "TextBox", TBar.EditText,
                    200, 0, string.Empty, 0, 0, "作図するテキストを入力", 0);

                //線種コンボボックスを追加
                Cad.TBarInsertControl(tbname, 3, "lslist", TBar.StaticCombo,
                    150, 0, string.Empty, 0, 0, "朱書き用線種", 0);

                //文字種コンボボックスを追加
                Cad.TBarInsertControl(tbname, 4, "cslist", TBar.StaticCombo,
                    150, 0, string.Empty, 0, 0, "朱書き用文字種", 0);

                //スタイルコンボボックスの内容を設定
                setupStyleCombo();

                //色ボタンを追加
                EventsNo[2] = Cad.GetFreeToolbarEvent(0);
                setColourButton(EventsNo[2]);

                //終了ボタンを追加
                EventsNo[3] = Cad.GetFreeToolbarEvent(0);
                Cad.TBarInsertButtonFromFile(tbname, 6, "Exit", "{/e" +
                    EventsNo[3].ToString() + "}", TBarButton.Push, "ツールの終了",
                    EventsNo[3], Application.StartupPath + @"\customize_sample03_exit.bmp");

                status = true;
            }
            catch (Exception ee)
            {
                MessageBox.Show("ツールバーの作成に失敗しました。\n" + ee.Message,
                    Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                //MicroGDSと通信切断
                if (cv.Started)
                {
                    cv.Stop();
                }
            }

            return status;
        }

        /// 
        /// スタイルリストのコンボボックスの内容を設定
        /// 
        private void setupStyleCombo()
        {
            //MicroGDSと通信開始
            bool cvstart = false;
            if (!cv.Started)
            {
                cv.Start();
                cvstart = true;
            }

            //設定ウィンドウの確認
            try
            {
                string wname;
                Cad.GetSetWndName(out wname);
            }
            catch
            {
                //設定ウィンドウが無い場合
                if (cvstart)
                {
                    //MicroGDSと通信切断
                    if (cv.Started)
                    {
                        cv.Stop();
                    }
                }

                return;
            }

            //線種リストの設定
            string curlstyle;
            Cad.GetSetLineStyle(out curlstyle);
            setupComboText("lslist", curlstyle, Style.Line);

            //文字種リストの設定
            string curcstyle;
            Cad.GetSetCharStyle(out curcstyle);
            setupComboText("cslist", curcstyle, Style.Char);

            //MicroGDSと通信切断
            if (cvstart)
            {
                if (cv.Started)
                {
                    cv.Stop();
                }
            }
        }

        /// 
        /// コンボボックスの内容を設定
        /// 
        private void setupComboText(string listName, string curStyle, Style styleType)
        {
            //定義されたスタイルを取得
            string styleList = string.Empty;
            string tempStyle;
            int CurCount = 0;
            int SelNo = 0;
            for (bool bStat = Cad.StyleScan(styleType, out tempStyle);
                            bStat; bStat = Cad.StyleScanNext(styleType, out tempStyle))
            {
                if (curStyle == tempStyle)
                {
                    SelNo = CurCount;
                }

                if (CurCount > 0)
                {
                    styleList += "\n";
                }

                styleList += tempStyle;
                CurCount++;
            }

            //リストの内容を設定
            Cad.TBarSetItemText(tbname, listName, styleList);

            //コンボボックスの項目を選択
            Cad.TBarSetListCurSel(tbname, listName, SelNo);
        }

        /// 
        /// 色変更ボタンの作成
        /// 
        private void setColourButton(int eventNo)
        {
            //MicroGDSと通信開始
            bool convstart = false;
            if (!cv.Started)
            {
                cv.Start();
                convstart = true;
            }

            //色変更ボタンの削除
            string tagName;
            for (bool bStat = Cad.TBarItemScan(out tagName, tbname);
                                bStat; bStat = Cad.TBarItemNext(out tagName))
            {
                if (tagName == "colb")
                {
                    Cad.TBarRemoveItem(tbname, "colb");
                    break;
                }
            }

            //終了ボタンの位置を検索
            int TarExistIndex = 0;
            for (bool bStat = Cad.TBarItemScan(out tagName, tbname);
                                bStat; bStat = Cad.TBarItemNext(out tagName))
            {
                if (tagName == "Exit")
                {
                    break;
                }

                TarExistIndex++;
            }

            //色変更ボタンを追加
            string TarBmpFile = string.Empty;
            if (curcol == 0)
            {
                curcol = 1;
                TarBmpFile = "customize_sample03_blue.bmp";
            }
            else if (curcol == 1)
            {
                curcol = 2;
                TarBmpFile = "customize_sample03_green.bmp";
            }
            else
            {
                curcol = 0;
                TarBmpFile = "customize_sample03_red.bmp";
            }
            Cad.TBarInsertButtonFromFile(tbname, TarExistIndex, "colb", "{/e" +
                eventNo.ToString() + "}", TBarButton.Push, "色の変更、赤→青→緑",
                eventNo, Application.StartupPath + @"\" + TarBmpFile);

            //MicroGDSと通信切断
            if (convstart)
            {
                cv.Stop();
            }
        }

        /// 
        /// 自由曲線の作図
        /// 
        private void EvMgr_Draw()
        {
            //コマンドボタンイベントは受けない
            axCadEvMgr601.EV_CustomCommand = false;

            try
            {
                //MicroGDSと通信
                cv.Start();

                //設定レイヤの確認
                int SetLayNo = -1;
                try
                {
                    SetLayNo = Cad.GetSetLayLink();
                }
                catch
                {
                    SetLayNo = -1;
                }

                if (SetLayNo == -1)
                {
                    throw new Exception("設定レイヤがありません。");
                }

                //現在の設定値を保持
                CurParam.save();

                //プログラムで使用する縮尺・色に変更
                Cad.SelectObject();
                Cad.SetAxesScale(1.0);
                setColour(curcol);
                Cad.InfoBarButton(InfoBar.SnapGuides, false);

                //線種の変更
                string editText;
                Cad.TBarGetEditItemText(out editText, tbname, "lslist");
                Cad.SetLineStyle(editText);

                //Undoマーカのモードを明示的挿入にする
                Cad.UndoDisable();

                //Undoマーカを挿入
                Cad.UndoSetMarker();

                //BackSpaceでのUNDO用カウントを初期化
                int undocount = 0;

                //自由曲線の描画
                bool newobj = true;
                for (; ; )
                {
                    //自由曲線の開始位置の取得
                    Cad.Vector cvPos = new Cad.Vector(0, 0, 0);
                    string argSnap = string.Empty;
                    string argPrompt = "線の開始位置をスナップ、終了[Enter]、戻す[BackSpace]";
                    Snap argSnapType = Snap.Nothing;
                    Snapped snStat = Cad.GetArg(out cvPos, ref argSnap, argPrompt, argSnapType);

                    //Enterで処理の終了
                    if (snStat == Snapped.Enter)
                    {
                        break;
                    }

                    //戻す処理
                    if (snStat == Snapped.Backspace)
                    {
                        //前に描いたものを消去
                        if (undocount > 0)
                        {
                            if (Cad.CanUndo())
                            {
                                Cad.Undo();
                            }
                            undocount--;
                        }

                        continue;
                    }

                    //マウスクリックの場合
                    if (snStat == Snapped.Mouse)
                    {
                        //オブジェクトを作成
                        if (newobj)
                        {
                            Cad.CreateObject("朱書き:線", cvPos);
                            newobj = false;
                        }

                        //描画の開始
                        Cad.MoveTo(cvPos);
                        LastDragX = cvPos.x;
                        LastDragY = cvPos.y;
                        for (; ; )
                        {
                            //DynamicPosイベントの開始
                            axCadEvMgr601.EV_DynamicPos = true;

                            //自由曲線の通過位置の取得
                            argPrompt = "マウスドラッグで描画、スナップで線を終了";
                            snStat = Cad.GetArg(out cvPos, ref argSnap, argPrompt, argSnapType);

                            //DynamicPosイベントの停止
                            axCadEvMgr601.EV_DynamicPos = false;

                            //マウスクリックの場合
                            if (snStat == Snapped.Mouse)
                            {
                                //クリック位置まで描画する
                                if (!isSamePos(cvPos.x, cvPos.y, LastDragX, LastDragY))
                                {
                                    Cad.LineTo(cvPos);
                                }

                                //Undoマーカの挿入(マークの記入単位でUndo)
                                Cad.UndoSetMarker();
                                undocount++;

                                //処理を抜ける
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ee)
            {
                //MicroGDSのウィンドウ上にメッセージボックスを出す処理
                int CurWnd = 0;
                if (cv.Started)
                {
                    CurWnd = Cad.GetSetWndHandle();
                }
                WinHandle MgHandle = new WinHandle(CurWnd);

                //エラーメッセージ
                MessageBox.Show(MgHandle, "MicroGDS Error\n" + ee.Message,
                    Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                //設定値を元に戻す
                Cad.SelectObject();
                CurParam.restore();

                //Undoマーカー挿入を通常モードにする
                Cad.UndoEnable();

                //MicroGDSと通信切断
                if (cv.Started)
                {
                    cv.Stop();
                }
            }

            //コマンドボタンイベント受付の再開
            axCadEvMgr601.EV_CustomCommand = true;
        }

        /// 
        /// テキストの作図
        /// 
        private void EvMgr_Text()
        {
            //コマンドボタンイベントは受けない
            axCadEvMgr601.EV_CustomCommand = false;

            try
            {
                //MicroGDSと通信
                cv.Start();

                //設定レイヤの確認
                int SetLayNo = -1;
                try
                {
                    SetLayNo = Cad.GetSetLayLink();
                }
                catch
                {
                    SetLayNo = -1;
                }

                if (SetLayNo == -1)
                {
                    throw new Exception("設定レイヤがありません。");
                }

                //テキストを取得
                string etext = string.Empty;
                Cad.TBarGetEditItemText(out etext, tbname, "TextBox");
                if (etext == string.Empty)
                {
                    throw new Exception("作図するテキストがありません。");
                }

                //現在の設定を保持
                CurParam.save();

                //プログラムで使用する縮尺・色に変更
                Cad.SelectObject();
                Cad.SetAxesScale(1.0);
                setColour(curcol);

                //文字種の変更
                string editText;
                Cad.TBarGetEditItemText(out editText, tbname, "cslist");
                Cad.SetCharStyle(editText);

                //Undoマーカのモードを明示的挿入にする
                Cad.UndoDisable();

                //Undoマーカを挿入
                Cad.UndoSetMarker();

                //図面領域の取得
                double xl, xh, yh, yl;
                Cad.GetZoomArea(out xl, out yh, out xh, out yl);

                //ドラッグ用のオブジェクトを図面領域外に作成
                Cad.Vector opos = new Cad.Vector(xh * 10.0, yh * 10.0, 0.0);
                Cad.CreateObject("朱書き:テキスト", opos);
                Cad.CreateText(etext, opos);

                //作成したテキストプリミティブをカレントにする
                Cad.PriTriple[] plist = new Cad.PriTriple[1];
                Cad.GetPriSelections(1, plist);
                Cad.CurPrimitive(plist[0].llink, plist[0].vlink, plist[0].plink);

                //ドラッグ時にテキストが判別できるようにテキストを図形する
                Cad.LinesFromCurText();

                //カレントのオブジェクトを選択状態にする
                Cad.SelectObject();
                Cad.SelectAdd();

                //選択図形の移動先を取得
                string snap = string.Empty;
                Snapped sStat = Cad.DragSelection(out opos, ref snap,
                    "テキスト配置先、キャンセル[Esc]", Snap.Nothing, opos,
                    true, DragFence.Ignore, string.Empty);
                if (sStat == Snapped.Escape)
                {
                    //キャンセルの場合は選択図形を削除
                    Cad.DeleteSelection();
                }
                else
                {
                    //カレントのオブジェクトを移動する
                    Cad.CurObjHook(opos);

                    //カレントのオブジェクトからドラッグ用の全プリミティブを削除
                    int[] prilist = Cad.GetPriLinks();
                    foreach (int pl in prilist)
                    {
                        Cad.DeletePrimitive(plist[0].llink, plist[0].vlink, pl);
                    }

                    //カレントのオブジェクトにテキストプリミティブを作成
                    Cad.CreateText(etext, opos);
                }
            }
            catch (Exception ee)
            {
                //MicroGDSのウィンドウ上にメッセージボックスを出す処理
                int CurWnd = 0;
                if (cv.Started)
                {
                    CurWnd = Cad.GetSetWndHandle();
                }
                WinHandle MgHandle = new WinHandle(CurWnd);

                //エラーメッセージ
                MessageBox.Show(MgHandle, "MicroGDS Error\n" + ee.Message,
                    Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                //設定を元に戻す
                Cad.SelectObject();
                CurParam.restore();

                //Undoマーカー挿入を通常モードに
                Cad.UndoEnable();

                //MicroGDSと通信を終了
                if (cv.Started)
                {
                    cv.Stop();
                }
            }

            //コマンドボタンイベント受付の再開
            axCadEvMgr601.EV_CustomCommand = true;
        }

        /// 
        /// 終了の処理
        /// 
        private void EvMgr_Exit()
        {
            //MicroGDSと通信開始
            cv.Start();

            try
            {
                Cad.TBarDelete(tbname);
            }
            catch (Exception ee)
            {
                //MicroGDSのウィンドウ上にメッセージボックスを出す処理
                int CurWnd = 0;
                if (cv.Started)
                {
                    CurWnd = Cad.GetSetWndHandle();
                }
                WinHandle MgHandle = new WinHandle(CurWnd);

                //エラーメッセージ
                MessageBox.Show(MgHandle, "ツールバーの削除に失敗しました。\n" + ee.Message,
                    Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                //MicroGDSと通信切断
                if (cv.Started)
                {
                    cv.Stop();
                }
            }

            //ツールを終了
            this.Close();
        }

        /// 
        /// 色の設定
        /// 
        private void setColour(int ColNo)
        {
            if (ColNo == 0)
            {
                //赤
                Cad.SetColourEx(-1, 255, 0, 0, 200);
            }
            else if (ColNo == 1)
            {
                //青
                Cad.SetColourEx(-1, 0, 0, 255, 200);
            }
            else
            {
                //緑
                Cad.SetColourEx(-1, 0, 255, 0, 200);
            }
        }

        /// 
        /// 距離の判定
        /// 
        private bool isSamePos(double x1, double y1, double x2, double y2)
        {
            double xdist = x2 - x1;
            double ydist = y2 - y1;
            double dist = Math.Sqrt(xdist * xdist + ydist * ydist);
            if (dist < epsilon)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// 
        /// パラメータ保存用のクラス
        /// 
        private class cSaveParams
        {
            //保存フラグ
            private bool IsSaved = false;

            //設定保存用
            private double savescale = 0.0;
            private int[] savecol = new int[5] { 0, 0, 0, 0, 0 };
            private string savelstyle = string.Empty;
            private string savecstyle = string.Empty;
            private int saveobj = 0;
            private bool snapguidesetting;

            public void save()
            {
                //現在の縮尺を記録
                Cad.GetSetAxesScale(out savescale);

                //現在の設定色を記録
                Cad.GetSetColourEx(out savecol[0], out savecol[1],
                    out savecol[2], out savecol[3], out savecol[4]);

                //現在の設定スタイルを記録
                Cad.GetSetLineStyle(out savelstyle);
                Cad.GetSetCharStyle(out savecstyle);

                //現在の設定オブジェクトを記録
                int tolink;
                try
                {
                    tolink = Cad.GetSetObjLink();
                }
                catch
                {
                    tolink = 0;
                }
                saveobj = tolink;

                //情報バーボタン「SnapGuide」の状態を記録
                snapguidesetting = Cad.GetInfoBarButton(InfoBar.SnapGuides);

                //保存した
                IsSaved = true;
            }

            public void restore()
            {
                if (!IsSaved)
                {
                    //保存されていない
                    return;
                }

                //設定縮尺を復元
                Cad.SetAxesScale(savescale);

                //設定色を復元
                Cad.SetColourEx(savecol[0], savecol[1], savecol[2], savecol[3], savecol[4]);

                //設定スタイルを復元
                Cad.SetLineStyle(savelstyle);
                Cad.SetCharStyle(savecstyle);

                //設定オブジェクトを復元
                if (saveobj != 0)
                {
                    Cad.SetObject(Cad.GetSetLayLink(), saveobj);
                }

                //情報バーの設定
                Cad.InfoBarButton(InfoBar.SnapGuides, snapguidesetting);

                //フラグをクリア
                IsSaved = false;
            }
        }

        /// 
        /// IWin32Windowを実装するクラス
        /// 
        private class WinHandle : IWin32Window
        {
            private IntPtr _Handle = IntPtr.Zero;

            public WinHandle(int newHandle)
            {
                _Handle = (IntPtr)newHandle;
            }

            public IntPtr Handle
            {
                get
                {
                    return _Handle;
                }
            }
        }
    }
}