Инструменты пользователя

Инструменты сайта


developers:tutorial:undoredo

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
developers:tutorial:undoredo [2019/03/24 10:41]
vasya
developers:tutorial:undoredo [2022/03/15 19:16] (текущий)
proxor
Строка 276: Строка 276:
     }     }
 </​code>​ </​code>​
 +
 +Также вносим изменения в Module.cs в функцию редактирования модели. Теперь перед изменением значений мы вызываем метод [[developers:​references:​topomatic.foundationclasses.iupdatable.beginupdate|BeginUpdate]] а после метод [[developers:​references:​topomatic.foundationclasses.iupdatable.beginupdate|EndUpdate]]. Кроме того теперь нет необходимости выставлять свойство [[developers:​references:​topomatic.foundationclasses.statecontrollerobject.modified|Modified]] вручную,​ при изменении истории значение свойства определяется автоматически.
 +
 +<code csharp>
 +        [cmd("​edit_pointsmodel"​)]
 +        public void EditModel()
 +        {
 +            var cadView = CadView;
 +            if (cadView != null)
 +            {
 +                var model_layer = ModelLayer.GetModelLayer(cadView);​
 +                if (model_layer != null)
 +                {
 +                    //​список выбранных точек
 +                    var positions = new List<​Vector2D>​();​
 +                    //​делегат для динамической отрисовки
 +                    DrawCursorEvent dynamic_draw = delegate (CadPen pen, Vector3D vertex)
 +                    {
 +                        //если есть точки в списке,​ нужно их нарисовать и нарисовать линию
 +                        //от последней выбранной точки, до текущего положения курсора
 +                        if (positions.Count > 0)
 +                        {
 +                            pen.Color = Color.Lime;
 +                            pen.BeginDraw();​
 +                            try
 +                            {
 +                                for (int i = 1; i < positions.Count;​ i++)
 +                                {
 +                                    pen.DrawLine(positions[i - 1], positions[i]);​
 +                                }
 +                                pen.DrawLine(positions[positions.Count - 1], vertex.Pos);​
 +                            }
 +                            finally
 +                            {
 +                                pen.EndDraw();​
 +                            }
 +                        }
 +                    };
 +                    //​подписываемся на событие отрисовки
 +                    cadView.DynamicDraw += dynamic_draw;​
 +                    try
 +                    {
 +                        Vector3D pos;
 +                        //​просим пользователя указать несколько точек
 +                        while (CadCursors.GetPoint(cadView,​ out pos, "​Укажите точку"​))
 +                        {
 +                            positions.Add(pos.Pos);​
 +                        }
 +                        //если точки заданы,​ то изменяем нашу модель
 +                        if (positions.Count > 0)
 +                        {
 +                            //​получаем её со слоя
 +                            var model = model_layer.Model;​
 +                            //​начинаем групповое изменение модели
 +                            model.BeginUpdate();​
 +                            try
 +                            {
 +                                //​добавляем новые точки
 +                                var points = model.Add();​
 +                                for (int i = 0; i < positions.Count;​ i++)
 +                                {
 +                                    points.AddPoint(positions[i]);​
 +                                }
 +                            }
 +                            finally
 +                            {
 +                                //​заканчиваем групповое изменение модели
 +                                model.EndUpdate();​
 +                            }
 +                            //​обновляем видовой экран
 +                            cadView.Unlock();​
 +                            cadView.Invalidate();​
 +                        }
 +                    }
 +                    finally
 +                    {
 +                        //​отписываемся от события отрисовки
 +                        cadView.DynamicDraw -= dynamic_draw;​
 +                    }
 +                }
 +            }
 +        }
 +</​code>​
 +
 +В результате мы получим возможность использовать историю изменений и отменять изменения в нашей модели с помощью этого механизма.
 +
 +<​note>​[[developers:​tutorial:​tutorialcode|Исходный код]] примера расположен в проекте **"​tutorial10"​**.</​note>​
  
developers/tutorial/undoredo.1553424079.txt.gz · Последние изменения: 2021/07/22 14:28 (внешнее изменение)