默认头像
路人甲
路人甲
  • 注册日期2003-12-15
  • 发帖数107
  • QQ
  • 铜币221枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:4157回复:15

我们经常见的编辑菜单中"撤消"与"恢复"是如何工作的?

楼主#
更多 发布于:2004-07-29 17:18

如题所说.小弟现在做一个鼠标操作的东东.要实现撤消与恢复.不知从何下手.望各位高人给个思路.对象是C#与MO2.3下的加点,移点或删点等操作.谢谢!

喜欢0 评分0
默认头像
路人甲
路人甲
  • 注册日期2003-12-15
  • 发帖数107
  • QQ
  • 铜币221枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-08-13 08:30
得到很大的启发,多谢GIS.
举报 回复(0) 喜欢(0)     评分
默认头像
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
2楼#
发布于:2004-08-12 12:37
今天讲讲利用MO实现编辑过程中的Undo、Redo的一种思路,利用临时图层实现图层编辑过程中的Undo,Redo。今天举得例子比较简单,就是增添要素和删除要素的撤销和重做(假设编辑过程中点线面图层每类只有一个)。

1. 建立临时图层

临时图层是在每次程序加载的时候创建,利用shapefile文件,包含4个字段,分别表示操作标识,操作流水号,关键字段,字段内容,当然为了实现点线面各个图层的操作,需要创建3个shp。

2.在添加和删除要素后

系统中当前流水号增加1,向临时图层增加或者删除这一次操作影响的要素以及他们的字段信息,当然操作流水号也需要增添,操作标识标识这次的操作类型,也需要添加。

3.在进行一些操作后Undo

有了以上信息,在执行操作的过程中就可以Undo了,比如我在一次操作中增添了两个点、一条线,那么在Undo的时候就先从临时图层中通过当前操作流水号分别查询出添加的记录,这些记录的操作标识应该是“添加操作”,然后通过关键字段,在实际图层中查找,删除相应的要素。同时系统的操作流水号-1。

4.我现在要Redo了

如果上面的Undo错了,我需要恢复删除的要素,那么就需要首先将系统中当前流水号增加1,然后从临时图层中查询当前操作流水号所影响的记录,然后由于操作标识是“添加操作”,所以我们将这些要素和相应的字段信息进行分解,添加到对应的图层。

5.我在Undo操作后执行添加和删除操作拉

这个时候首先需要从流水表删除操作流水号>系统当前流水号的记录,然后同2进行操作。

GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2003-09-19
  • 发帖数58
  • QQ
  • 铜币210枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2004-08-12 12:25
http://geoexplore.blog.hexun.com/ qq: 657824310 电子邮箱:jayon@126.com
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2004-08-12
  • 发帖数16
  • QQ
  • 铜币113枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2004-08-12 11:32
有点思路,谢谢
举报 回复(0) 喜欢(0)     评分
默认头像
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
5楼#
发布于:2004-08-09 15:26

不写代码好象是不行的,需要定义很多变量来记录操作次数和状态等

Function Redo(map As MapObjects2.map, times As Long)     If undoNow >= undoTimes Then     MsgBox "Too big"     ElseIf undoNow < 0 Then     MsgBox "Less than zero"     Else    Select Case undoType(undoNow)    Case utMovePoint     URMovePoint map    Case utMovePoints     URMovePoints map    Case utAddPoint     URAddPoint map    Case utAddShape     URAddShape map    Case utLineDelPoint     URLineDelPoint map    Case utPolygonDelPoint     URPolygonDelPoint map    Case utAddLine     URAddLine map    Case utMoveLinePoint     URMoveLinePoint map    Case utMovePolygonPoint     URMovePolygonPoint map    Case utMoveLine     URMoveLine map    Case utMovePolygon     URMovePolygon map    Case utDelShape     URDelShape map    Case utZoom     URZoom map    Case utChangeShape     URChangeShape map    Case Else    End Select     End If End Function

GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2003-12-15
  • 发帖数107
  • QQ
  • 铜币221枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2004-08-09 14:45
版主是论坛上屈指可数的好版主之列的版主.能讲一下大概思路吗?你的属标操作的信息是如何记录的?如果撤消以后又后悔了或者又后悔了咋办呀?如果我也写这么多代码的话,头儿早把我扔垃圾篓了.版主救我! [此贴子已经被作者于2004-8-9 15:04:53编辑过]
举报 回复(0) 喜欢(0)     评分
默认头像
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
7楼#
发布于:2004-08-09 09:21

程序很多,点线面的redo和undo都要写,这里贴上两个函数看看先

'添加线 Function UAddLine(map As MapObjects2.map, layerNum As Long, Line As MapObjects2.Line) On Error GoTo exit1 Dim lineNew As New MapObjects2.Line

Set m_map = map    Dim recs As MapObjects2.Recordset  Set recs = map.Layers(layerNum).Records  CopyLine lineNew, Line    pushTypeAStep utAddLine  pushInt layerNum  pushObject lineNew  pushEnd    recs.Edit  recs.AddNew  Set recs.Fields("Shape").Value = lineNew    recs.Update  recs.StopEditing      Refresh map Set lineNew = Nothing exit1: End Function

Private Function URAddLine(map As MapObjects2.map) 'redo On Error GoTo exit1 Dim typea, layerNum As Long

Dim Line As MapObjects2.Line

typea = pipType  layerNum = pipInt Set Line = pipObject  pipEnd

Dim recs As MapObjects2.Recordset Set recs = map.Layers(layerNum).Records  recs.Edit  recs.AddNew  Set recs.Fields("Shape").Value = Line  recs.Update  recs.StopEditing  Refresh map exit1: End Function

GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2003-12-15
  • 发帖数107
  • QQ
  • 铜币221枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2004-08-09 09:14
多谢!急等!
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2004-07-01
  • 发帖数121
  • QQ
  • 铜币506枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2004-08-06 08:25

谢谢GIS!

如果你爱他就让他学GIS,如果你恨他就让他学GIS!
举报 回复(0) 喜欢(0)     评分
上一页
默认头像

返回顶部