C# カーブエディタ作成 点の削除機能

前回の記事

bravememo.hatenablog.com

完成画面


CurveEditor ver 0 5 α版

点の削除機能

点の削除はボタンとDeleteキーからできるようにしています。 Deleteキーの入力についてですが、キー入力を受け付けられるようにするにはFormのKeyPreivewをTrueにさせる必要があります。

f:id:Brave345:20191211101840p:plain

削除方法はlist.RemoveAt()を使用して削除しています。 ただし追加の時と同じで削除する際も選択している前後の点を結びなおさないといけないです。

開始点の移動制限

前回の制御点と同じような感じで前の開始点と現在の終了点の間に収まるようにClampさせるだけです。

ソースコード

全部乗せると長いので前回の差分だけ載せます

//CurvePointControl.cs
 class CurvePointControl
    {
     /// <summary>
        /// 選択している点の削除(ボタンver)
        /// </summary>
        public void DeletePoint()
        {
            //削除できないなら
            if(!isDeletePoint())
            {
                DeleteErrorMessage();//エラーメッセージ
                return;
            }
            var LastCnt = m_list.Count() - 1;

            //最後の開始点を選択してるなら
            if (m_SelectPoint == LastCnt)
            {
                var BeforeSelectPoint = m_SelectPoint - 1;  //ひとつ前の終了点の移動
                //一つ前の終了点と最後の終了点を結ぶ
                BezierPoint sp2 = m_list[BeforeSelectPoint];

                sp2.endPoint.X = ScrrenRightPosX;//終了点は一番右端
                sp2.endPoint.Y = m_list[LastCnt].endPoint.Y;
                m_list[BeforeSelectPoint] = sp2;
            }
            else
            {         
                var NextSelectPoint = m_SelectPoint + 1;  //選択している次のポイント
                var BeforeSelectPoint = m_SelectPoint - 1;  //ひとつ前の終了点の移動
                //一つ前の終了点と一つ先の開始点をつなぐ
                BezierPoint sp2 = m_list[BeforeSelectPoint];

                sp2.endPoint = m_list[NextSelectPoint].startPoint;
                m_list[BeforeSelectPoint] = sp2;
            }
            //削除
            m_list.RemoveAt(m_SelectPoint);
            //削除したときは選択モード解除 でないとエラーが出る
            m_SelectMode = SelectMode.None;
        }
        /// <summary>
        /// 点を削除できる状態か
        /// </summary>
        /// <returns></returns>
        bool isDeletePoint()
        {
            //最初の開始点は削除できない
            if (m_SelectPoint == 0) return false;
            //開始点をしてる時のみ削除できる
            if (m_SelectMode != SelectMode.SelectStart) return false;

            return true;
        }
        /// <summary>
        /// 削除出来ない点ならエラーメッセージを出す
        /// </summary>
        public void DeleteErrorMessage()
        {
            //点を選択してないときは削除できない
            if (m_SelectMode == SelectMode.None)
            {
                MessageBox.Show("点を選択していません");
                return;
            }
            //終了点は削除できない
            if (m_SelectMode == SelectMode.SelectEnd)
            {
                MessageBox.Show("最後の点は削除できません。");
                return;
            }
            //最初の開始点は削除できない
            if (m_SelectPoint == 0)
            {
                MessageBox.Show("最初の点は削除できません。");
                return;
            }
        }

   /// <summary>
        /// 開始点の移動
        /// </summary>
        /// <param name="mouse"></param>
        public void MoveStartPoint(MouseEventArgs mouse)
        {
            BezierPoint sp = m_list[m_SelectPoint]; //選択している点

            sp.startPoint.Y = Clamp(mouse.Y, ScrrenTopPosY, ScrrenBottomPosY);
            // 一番最初の開始点だけY軸にしか動かせないように
            if (!isSelectFirstStartPoint())
            {
            
                var BeforeSelectPoint = m_SelectPoint - 1;
                //X軸の移動 intervalPointPosを加算減算すること隣の点と同じ座標にならないようにする
                int minpx = m_list[BeforeSelectPoint].startPoint.X + intervalPointPos;
                int maxpx = sp.endPoint.X - intervalPointPos;
                sp.startPoint.X = Clamp(mouse.X, minpx, maxpx);
                //ひとつ前の終了点の移動
                BezierPoint sp2 = m_list[BeforeSelectPoint];
                sp2.endPoint = sp.startPoint;
                m_list[BeforeSelectPoint] = sp2;
            }
       
            m_list[m_SelectPoint] = sp;
        }

};
//Formcs
        //点削除ボタンクリック
        private void button1_Click(object sender, EventArgs e)
        {
            m_CurvePointControl.DeletePoint();
            Refresh();//再描画
        }
        //キーを押した際のイベント
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            //デリートキー押したら
             if (e.KeyCode == Keys.Delete)
             {
                 m_CurvePointControl.DeletePoint();//点削除
                 Refresh();//再描画
             }
            //エスケープキーを押したら
            if (e.KeyCode == Keys.Escape)
            {
                Close();
            }
        }

終わりに

これで保存と読み込み機能以外はカーブエディタとしての最低限の機能はできました。 次ずっと飾りだった入力項目の実装をしていこうかなと思います

次の記事

bravememo.hatenablog.com