ACAD中撤销恢复机制的浅析

上传人:ji****72 文档编号:37504725 上传时间:2018-04-17 格式:DOC 页数:6 大小:45KB
返回 下载 相关 举报
ACAD中撤销恢复机制的浅析_第1页
第1页 / 共6页
ACAD中撤销恢复机制的浅析_第2页
第2页 / 共6页
ACAD中撤销恢复机制的浅析_第3页
第3页 / 共6页
ACAD中撤销恢复机制的浅析_第4页
第4页 / 共6页
ACAD中撤销恢复机制的浅析_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《ACAD中撤销恢复机制的浅析》由会员分享,可在线阅读,更多相关《ACAD中撤销恢复机制的浅析(6页珍藏版)》请在金锄头文库上搜索。

1、ACAD 中撤销恢复机制的浅析中撤销恢复机制的浅析ACAD 平台的撤销恢复机制主要就是以 ACAD 中执行的命令为单位的,下面将从使用这一套机制入手,来试着来分析这一套机制。如果想使用和了解 ACAD 的撤销恢复机制,必然要从自定义实体入手,因为,ACAD 中所有的操作其实就是对 DWG 中数据对象的一些操作,只不过是以命令为单位来组织一个操作中的操作对象,所以 ACAD 的撤销恢复机制的针对对象都是 ACAD 的数据库对象,而已经封装好的数据库对象我们是无法了解到其内部的运行机制的,但 ARX 给我们提供了扩展 ACAD 数据库对象的机会,那就是自定义对象和实体技术,并且也预留也一些接口,用

2、来实现自定义对象和实体的信息的撤销与恢复。首先,稍微介绍一下 ARX 实现自动撤销恢复与部分撤销恢复的一些接口:a).AcDbObject:assertWriteEnable(Adesk:Boolean autoUndo = true,Adesk:Boolean recordModified = true);该函数是用来验证当前操作节点是否以写方式打开而进行操作的,其中每一个参数 autoUndo 就是标记调用这个接口的成员函数中,是不是会自动进行 undo 记录。b).virtual Acad:ErrorStatus AcDbObject:dwgInFields(AcDbDwgFiler *

3、 pFiler);该函数是用来将编档器中的备忘数据恢复到对象中。c).virtual Acad:ErrorStatus AcDbObject: dwgOutFields( AcDbDwgFiler* pFiler);该函数是用来将对象的状态及数据备忘到编档器中。d).void AcDbObject:disableUndoRecording(Adesk:Boolean disable);该函数是用来禁用、启用某对象的 UNDO 操作的。e).void AcDbDatabase:disableUndoRecording(bool disable)。该函数是用来禁用、启用整个数据库的 UNDO 操作

4、的。f).virtual Acad:ErrorStatus AcDbObject:applyPartialUndo(AcDbDwgFiler* undoFiler,AcRxClass* classObj);该函数是控制对象局部撤销恢复信息的接口。g); AcDbDwgFiler * AcDbObject:undoFiler();该函数是用来返回记录对象撤销恢复记录的编档器如何实现自动撤销?当在对象的成员函数中使用 assertWriteEnable 时参数 autoUndo 为 true 则是告诉系统需要自动的实现撤销恢复记录,自动撤销恢复记录中保存的状态信息是在 dwgInFields、dw

5、gOutFields 接口中对撤销编档器写入的信息;当已写方式打开一个对象时,在第一个调用其对象的成员函数中对assertWriteEnable 进行了一次 autoUndo 参数为 true 的函数时,系统的 UNDO 机制会调用一次该对象成员 dwgOutFields 以备份当前对象的信息(需要备份多少信息,由用户程序自己来决定) ;当执行 UNDO命令时,系统的 UNDO 机制同样会先进行一次 dwgOutFields 调用以备份当前对象的信息,然后再调用一次 dwgInFields 将之前的撤销备份信息写入对象;系统的 REDO 机制就是利用了 UNDO 机制,当执行 REDO 命令时

6、,系统的 UNDO 机制同样会先进行一次 dwgOutFields 调用以备份当前对象的信息,然后再调用一次 dwgInFields 将之前的重做备份信息写入对象;这样就完成了系统的自动撤销恢复;下面附上少许代码:void AMenLine:SetStartPoint( const AcGePoint3d /自动撤销恢复m_ptStart = pt; /设置新值void AMenLine:SetEndPoint( const AcGePoint3d /自动撤销恢复m_ptEnd = pt; /设置新值Acad:ErrorStatus AMenLine:dwgOutFields (AcDbDwg

7、Filer *pFiler) const assertReadEnabled () ;/- Save parent class information first.Acad:ErrorStatus es =AcDbEntity:dwgOutFields (pFiler) ;if ( es != Acad:eOk )return (es) ;/- Object version number needs to be saved firstif ( (es =pFiler-writeUInt32 (AMenLine:kCurrentVersionNumber) != Acad:eOk )return

8、 (es) ;/撤销编档器if( pFiler-filerType() = AcDb:kUndoFiler )pFiler-writePoint3d(m_ptStart); pFiler-writePoint3d(m_ptEnd);return (pFiler-filerStatus () ;Acad:ErrorStatus AMenLine:dwgInFields (AcDbDwgFiler *pFiler) assertWriteEnabled () ;/- Read parent class information first.Acad:ErrorStatus es =AcDbEntit

9、y:dwgInFields (pFiler) ;if ( es != Acad:eOk )return (es) ;/- Object version number needs to be read firstAdesk:UInt32 version =0 ;if ( (es =pFiler-readUInt32 (if ( version AMenLine:kCurrentVersionNumber )return (Acad:eMakeMeProxy) ;/撤销编档器if( pFiler-filerType() = AcDb:kUndoFiler )pFiler-readPoint3d(p

10、Filer-readPoint3d(return (pFiler-filerStatus () ;如何实现局部撤销?当在对象的成员函数中使用 assertWriteEnable 时参数 autoUndo 为 false 则告诉系统将由用户程员自己来实现撤销恢复,而不使用系统的自动记录来实现,从而实现局部的撤销恢复,当用户程序想实现局部撤销的时候,需要在调用 assertWriteEnable 的成员函数中,调用 AcDbDwgFiler * AcDbObject:undoFiler();得到编档器,然后将需要实现撤销恢复的信息,写入编档器中从而完成信息状态的记录,在文档上有介绍,编入的第一个信

11、息,应该是对象所在的 AcRxClass 指针,用来作判断是否是属于对应实体的信息;当系统在执行 UNDO 操作的时候,会如若发现有局部信息的记录,会自动调用 applyPartialUndo( AcDbDwgFiler* undoFiler, AcRxClass* classObj)接口,所以,用户程序想真正的完成局部撤销的时候,还需要在这个接口中实现局部信息状态的恢复,其中 applyPartialUndo 接口中的 AcDbDwgFiler* undoFiler 参数就是保存信息状态时使用 AcDbDwgFiler *AcDbObject:undoFiler()得到的那个撤销编档器,Ac

12、RxClass* classObj 就是你在保存息状态的时候编入的第一个信息值(AcRxClass 指针),如果在对象的多个成员函数中,都使用和实现了局部撤消机制,而在当前命令中,有调用这些接口对对象进行修改,那么在系统执行 UNDO 操作时,会多次调用 applyPartialUndo( AcDbDwgFiler* undoFiler,AcRxClass* classObj)接口,从而实现每一个成员函数保存的信息的局部撤销,那么在设计上,你就可以在编档的时候编一个 DWORD 型的值,用来区分多次调用applyPartialUndo(AcDbDwgFiler* undoFiler,AcRxC

13、lass* classObj)接口的一个标记,为不同的成员函数操作导致调用到的 applyPartialUndo 编号,从而正确的实现多个成员函数局部撤销。与局部撤销对应的就是局部的恢复,其实,在 ACAD 系统中,它们使用的是同一套机制,看 ARX 帮助说明,就可以发现,局部撤销是通过在设置属性的 SET 函数中,调用相对应的接口获取撤销编档器后,把需要撤消的信息,写入编档器备份,等系统执行 UNDO 命令时,会根据 UNDO 命令栈中的数据情况,来调用实体的applyPartialUndo,从而使用户程序有机会把备份的值还原,而恢复操作,也是一个样的,它要求用户要编写 applyParti

14、alUndo 接口时,不能使用直接对对象成员属性赋值的方法,而必须采用也实现了UNDO 机制的 SET 函数(一般情况下就可以利用同一个函数) ,来实现对应值的设置,因为,在这个设置的过程中,其实又会对现在撤销前的值进行一个备份,当使用系统 REDO 机制的时候,也同样会调用 applyPartialUndo,使用户程序有机会把对应的值重做,这其实就是 UNDO 机制的一种巧妙应用而已。下面附上少许代码:void AMenLine:SetStartPoint( const AcGePoint3d /局部撤销恢复AcDbDwgFiler* pFiler = NULL;if( (pFiler =

15、AcDbObject:undoFiler() != NULL )pFiler-writeItem(this-desc(); /写入对象对应的运行时识别类pFiler-writeItem(1); /为起点所编的号 1pFiler-writePoint3d(m_ptStart); /将起点源值写入撤销编档器m_ptStart = pt; /设置新值void AMenLine:SetEndPoint( const AcGePoint3d /局部撤销恢复AcDbDwgFiler* pFiler = NULL;if( (pFiler = AcDbObject:undoFiler() != NULL )pFiler-writeItem(this-desc(); /写入对象对应的运行时识别类pFiler-writeItem(1); /为终点所编的号 1pFiler-writePoint3d(m_ptStart); /将终点源值写入撤销编档器m_ptEnd = pt; /设置新值Acad:ErrorStatus AMenLine:applyPartialUndo( AcDbDwgFiler* undoFiler, AcRxClass* classObj )if( this-desc() != classObj )/如果运行时信息不匹配,则调用父类的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号