Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
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> | ||