ガントチャート作成日記

イナズマ線の表示の不具合を解消した。


イナズマ線はCellごとにPointCollection型のプロパティに値を指定している。
開始点、中間点、終了点はそれぞれ高さや行の幅×進捗率で計算して保持している。

        /// <summary>
        /// イナズマ線を表示
        /// </summary>
        /// <param name="targetTask">イナズマ線を表示するタスク</param>
        /// <param name="showPairThunderLine">ペアタスクのイナズマ線を表示するかどうか</param>
        public void ShowThunderLine(GanttGridTask targetTask,bool showPairThunderLine)
        {
            if (GanttGridCells == null) { return; }
            foreach (var rowItem in this.GanttGridCells.Where(i => i.DataTemplateType == GanttCell.TemplateType.ThunderLineRow && i.Task.Id.ToString() == targetTask.Id.ToString()))
            {
                // 通常タスクのイナズマ線を描画
                if (this.ThunderLineVisible)
                {
                    if (targetTask.Name != "" || targetTask.Name != null) { rowItem.ThunderLine = _GetThunderLinePoint(targetTask); }
                    else { rowItem.ThunderLine = null; }
                }

            }
        }

        /// <summary>
        /// イナズマ線のPointCollecctionを取得
        /// </summary>
        /// <param name="targetTask">イナズマ線を作成するタスク</param>
        /// <returns>
        ///  
        ///  ・基準日付時点でタスクが完了していないものは進捗位置までの線を引く
        ///    ⇒ 進捗率が1(完了)以外で、終了日
        ///  ・基準日までに開始できていないものは線を引く
        ///    ⇒ 進捗率が1(完了)以外で、終了日
        /// 
        ///  ・タスクの進捗率が基準日より遅れている場合に線を引く
        ///    ⇒ タスクの進捗率が1(完了)以外で、基準日より前にタスクの終了予定日がある
        ///      タスクの進捗率が1(完了)以外で、基準日より開始予定日が小さい場合
        ///  ・タスクの進捗率が基準日より進んでいる場合に線を引く
        ///
        /// </returns>
        private PointCollection _GetThunderLinePoint(GanttGridTask targetTask)
        {
            TimeSpan ts = this.ThunderLineBaseDate - ProjectStartDay; ;
            PointCollection _ThunderLine = new PointCollection();

            if ((targetTask.ProgressRate != 1 && targetTask.EndDay < this.ThunderLineBaseDate)
                || ((targetTask.ProgressRate != 1) && this.ThunderLineBaseDate > targetTask.StartDay)
                || ((targetTask.ProgressRate != 0) && this.ThunderLineBaseDate < targetTask.EndDay))
            {
                double startPoint = targetTask.Cell.ColumnIndex * this.ColumnWidth;
                double durectionPoint = targetTask.Cell.ColumnSpan * this.ColumnWidth;
                if (targetTask.ProgressRate == 0) { durectionPoint = durectionPoint * 0.01; }
                else { durectionPoint = durectionPoint * targetTask.ProgressRate; }

                _ThunderLine.Add(new Point(ts.Days * this.ColumnWidth, 0));
                _ThunderLine.Add(new Point(startPoint + durectionPoint, this.RowHeight / 2));
                _ThunderLine.Add(new Point(ts.Days * this.ColumnWidth, this.RowHeight));
            }
            else
            {
                _ThunderLine.Add(new Point(ts.Days * this.ColumnWidth, 0));
                _ThunderLine.Add(new Point(ts.Days * this.ColumnWidth, this.RowHeight));
            }

            return _ThunderLine;

        }

表現するためには、XAMLにDataTemplateを宣言しておいて、DataTemplateSelecterで変換している。

        <!-- イナズマ線を描画するためのDataTemplate -->
        <DataTemplate x:Key="ThunderLineRowLineTypeDataTemplate" >
            <Grid>
                <Polyline Points="{Binding ThunderLine}"  Stroke="Red" StrokeThickness="1" />
            </Grid>
        </DataTemplate>

ガントチャートを表現するためにItemControlに独自に作成したGanttTaskCell型をバインドしている。どのようなDataTemplateを利用するかはTemplateSelecterで切り替えている。そうすることで曜日によって色を変えたり、色々することができる。

詳細は全部完成してからいつか書きたいとは思う。

ついでに、垂直スクロールだけではなく、左クリックを押しながらホイールすれば水平スクロールもするように修正してみた。結構便利な気がする。


0 件のコメント:

コメントを投稿

PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...