C#进行Visio二次开发之设备状态跟踪

简介:
明察秋毫,很多情况下是非常需要的,例如,如果我们完善了一套系统,能够将四川赈灾的款项的筹集、采购、分发等步骤都能明察秋毫,相信整个世界会安静很多。
同样,对于一个使用Visio进行二次开发的程序来说,背后你需要知道用户增加了那些设备,删除了那些设备,修改了那些设备,这样你才能对整个系统的数据进行有效的控制,否则“赈灾”款项就可能丢失了,呵呵。
那我们应该如何做才能有效的处理这些事件,达到对设备的变更明察秋毫呢?
我前面介绍了一篇文章《 C#进行Visio开发的事件处理  》,其中也介绍了各种事件侦听,我们要对设备进行跟踪的话,基本上只需要侦听这几个事件,并对之进行处理即可。
             const  string sink =  "";
            Event newEvent =  null;

            EventList applicationEvents = eventApplication.EventList;
            EventList documentEvents = eventDocument.EventList;

            newEvent = documentEvents.AddAdvise(
                ( unchecked(( short)VisEventCodes.visEvtAdd) + ( short)VisEventCodes.visEvtShape),
                (IVisEventProc) this, sink,  " ShapeAdd ");

            newEvent = documentEvents.AddAdvise(
                ( short)VisEventCodes.visEvtDel + ( short)VisEventCodes.visEvtShape,
                (IVisEventProc) this, sink,  " ShapeDelete ");

              newEvent = documentEvents.AddAdvise(
                ( short)VisEventCodes.visEvtMod + ( short)VisEventCodes.visEvtCell,
                (IVisEventProc) this, sink,  " CellChanged ");
         object IVisEventProc.VisEventProc( short eventCode,  object source,  int eventId,
             int eventSequenceNumber,  object subject,  object moreInfo)
         {
        .
            switch (eventCode)
            {
                case (short)VisEventCodes.visEvtShape + unchecked((short)VisEventCodes.visEvtAdd):
                    eventShape = (Shape)subject;
                    handleShapeAdd(eventShape);
                    break;

                case (short)VisEventCodes.visEvtDel + (short)VisEventCodes.visEvtShape:
                    eventShape = (Shape)subject;
                    handleShapeDelete(eventShape);
                    break;

                case (short)VisEventCodes.visEvtCell + (short)VisEventCodes.visEvtMod:
                    Visio.Cell cell = (Cell)subject;
                    if (cell.Name.IndexOf("Prop") >= 0)//限制只执行自定义事件一次
                    {
                        eventShape = cell.Shape;
                        handleCellModify(eventShape);
                    }

                    break;

                default:
                    break;
            }


            return result;
        }

以上是对几个特别事件的侦听,我们要实现设备的跟踪,需要在这几个事件中处理相关的设备信息。为了跟踪好设备的相关信息,我们需要定义一个实体类ShapeLogInfo类放置相关的设备信息,如Shape的GUID,Shape的ID,设备状态(添加、修改、删除),Shape的Name,还有就是我们自定义的一个属性“设备类型”。

         /// <summary>
        
/// 形状的类型,即设备类型
        
/// </summary>

         public  string ShapeType

         /// <summary>
        
/// 形状ID
        
/// </summary>

         public  string ShapeID

         /// <summary>
        
/// 形状的GUID
        
/// </summary>

         public  string ShapeGuid

         /// <summary>
        
/// 形状的状态:新增、编辑、删除
        
/// </summary>

         public ShapeStatus ShapeStatus

         /// <summary>
        
/// 形状名称
        
/// </summary>

         public  string ShapeName

为了更好的管理ShapeLogInfo的相关信息,我们把相同设备类型(ShapeType)的放到一起管理,于是,我们再创建一个ShapeTypeLogInfo类来装载相关的日志信息,具体如下:

         /// <summary>
        
/// 形状类型
        
/// </summary>

     public  string ShapeType

         /// <summary>
        
/// 形状类型对应的数据库表名称
        
/// </summary>

         public  string ShapeTableName

         /// <summary>
        
/// 该形状类型对应的形状日志对象集合
        
/// </summary>

         public Dictionary< string, ShapeLogInfo> ShapeColloction

为了判断是否有相应的ShapeTypeLogInfo和ShapeLogInfo,需要定义几个函数用来维护相关的集合信息,如下所示:

         /// <summary>
        
/// 获取形状对应的类型,如果没有则创建
        
/// </summary>

         private ShapeTypeLogInfo GetShapeType(ShapeLogInfo shape)

         /// <summary>
        
/// 如果集合中有,修改状态;否则添加一个新的
        
/// </summary>

         public  void AddLog(ShapeLogInfo shapeLogInfo)

         /// <summary>
        
/// 判断指定的形状是否是在集合中存在
        
/// </summary>

         public  bool IsNewShape(ShapeLogInfo shape)


         /// <summary>
        
/// 取当前设备在集合中存储的ShapeLog对象
        
/// </summary>

         public ShapeLogInfo GetShape( string shapeType,  string shapeId)

完成这些函数后,最后需要做的就是在添加、删除、修改Shape的侦听事件中加入相关的日志就可以了,如在删除设备的时候,我们是这样记录相关信息的

private  void visioEventSink_OnShapeDelete( object sender, EventArgs e)
{
            Shape shape = (Shape)sender;
            string strDeviceType = string.Empty;
            string strDeviceName = string.Empty;
            string strDeviceID = string.Empty;

            strDeviceType = VisioUtility.GetShapeCellValue(shape, "设备类型");
            strDeviceID = VisioUtility.GetShapeCellValue(shape, "GUID");


            ShapeLogInfo logInfo = new ShapeLogInfo();
            logInfo.ShapeType = strDeviceType;
            logInfo.ShapeID = shape.NameID;
            logInfo.ShapeName = VisioUtility.GetShapeCellValue(shape, "名称");

            if (shape.Application.IsUndoingOrRedoing)
            {
                ShapeLogInfo info = Portal.gc.gOperationLog.GetShape(strDeviceType, shape.NameID);
                if (info != null)
                {
                    strDeviceID = info.ShapeGuid;
                }

            }


            logInfo.ShapeGuid = strDeviceID;
            logInfo.ShapeStatus = ShapeStatus.DeleteShape;
            Portal.gc.gOperationLog.AddLog(logInfo);
}

其中if (shape.Application.IsUndoingOrRedoing)是为了判断该操作是否为Undo或者Redo导致的操作,如果是,我们获取它之前Shape的GUID即可。

记录了设备的这些修改信息,我们就可以在保存数据的时候,根据这些信息移除相关的关系,添加或者删除相关的设备信息了,而且这些信息,对于我们记录用户的图纸修订记录也是必须要做的事情。

本文转自博客园伍华聪的博客,原文链接:C#进行Visio二次开发之设备状态跟踪,如需转载请自行联系原博主。



 

目录
相关文章
|
7月前
|
数据采集 存储 安全
C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备
术麻醉信息管理系统主要还是为了手术室开发提供全面帮助的系统,其主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配,再到术前访视、术中记录及术后恢复的全过程中都可以得到全方位的保障。
52 4
C#手术麻醉系统源码 可对接HIS  LIS   PACS 医疗系统各类设备
|
监控 安全 开发工具
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C#)
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C#)
99 0
基于C#的ArcEngine二次开发56:双击属性表跳转目标要素并闪烁
基于C#的ArcEngine二次开发56:双击属性表跳转目标要素并闪烁
基于C#的ArcEngine二次开发56:双击属性表跳转目标要素并闪烁
基于C#的ArcEngine二次开发54:IStatusBar状态栏接口的使用
基于C#的ArcEngine二次开发54:IStatusBar状态栏接口的使用
基于C#的ArcEngine二次开发54:IStatusBar状态栏接口的使用
|
NoSQL 数据处理 C#
基于C#的ArcEngine二次开发52:GDB数据处理过程中与Name相关的操作
基于C#的ArcEngine二次开发52:GDB数据处理过程中与Name相关的操作
基于C#的ArcEngine二次开发52:GDB数据处理过程中与Name相关的操作
基于C#的ArcEngine二次开发51:获取图层字段唯一值列表(Get Unique Values)
基于C#的ArcEngine二次开发51:获取图层字段唯一值列表(Get Unique Values)
基于C#的ArcEngine二次开发51:获取图层字段唯一值列表(Get Unique Values)
|
算法 C#
基于C#的ArcEngine二次开发50:生成面空洞连接线
基于C#的ArcEngine二次开发50:生成面空洞连接线
基于C#的ArcEngine二次开发50:生成面空洞连接线
|
存储 NoSQL Unix
基于C#的ArcEngine二次开发50:MDB创建新要素类及“无当前记录”异常处理
基于C#的ArcEngine二次开发50:MDB创建新要素类及“无当前记录”异常处理
基于C#的ArcEngine二次开发50:MDB创建新要素类及“无当前记录”异常处理
|
C# 开发工具
基于C#的ArcEngine二次开发47:Addins常见问题解决方案集锦
基于C#的ArcEngine二次开发47:Addins常见问题解决方案集锦
基于C#的ArcEngine二次开发47:Addins常见问题解决方案集锦