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

简介:
+关注继续查看
明察秋毫,很多情况下是非常需要的,例如,如果我们完善了一套系统,能够将四川赈灾的款项的筹集、采购、分发等步骤都能明察秋毫,相信整个世界会安静很多。
同样,对于一个使用Visio进行二次开发的程序来说,背后你需要知道用户增加了那些设备,删除了那些设备,修改了那些设备,这样你才能对整个系统的数据进行有效的控制,否则“赈灾”款项就可能丢失了,呵呵。
那我们应该如何做才能有效的处理这些事件,达到对设备的变更明察秋毫呢?
我前面介绍了一篇文章《C#进行Visio开发的事件处理 》,其中也介绍了各种事件侦听,我们要对设备进行跟踪的话,基本上只需要侦听这几个事件,并对之进行处理即可。
None.gif            const string sink = "";
None.gif            Event newEvent = null;
None.gif
None.gif            EventList applicationEvents = eventApplication.EventList;
None.gif            EventList documentEvents = eventDocument.EventList;
None.gif
None.gif            newEvent = documentEvents.AddAdvise(
None.gif                (unchecked((short)VisEventCodes.visEvtAdd) + (short)VisEventCodes.visEvtShape),
None.gif                (IVisEventProc)this, sink, "ShapeAdd");
None.gif
None.gif            newEvent = documentEvents.AddAdvise(
None.gif                (short)VisEventCodes.visEvtDel + (short)VisEventCodes.visEvtShape,
None.gif                (IVisEventProc)this, sink, "ShapeDelete");
None.gif
None.gif              newEvent = documentEvents.AddAdvise(
None.gif                (short)VisEventCodes.visEvtMod + (short)VisEventCodes.visEvtCell,
None.gif                (IVisEventProc)this, sink, "CellChanged");
None.gif
None.gif        object IVisEventProc.VisEventProc(short eventCode, object source, int eventId,
None.gif            int eventSequenceNumber, object subject, object moreInfo)
ExpandedBlockStart.gif        {
InBlock.gif        dot.gifdot.gifdot.gifdot.gifdot.gif.
InBlock.gif            switch (eventCode)
ExpandedSubBlockStart.gif            {
InBlock.gif                case (short)VisEventCodes.visEvtShape + unchecked((short)VisEventCodes.visEvtAdd):
InBlock.gif                    eventShape = (Shape)subject;
InBlock.gif                    handleShapeAdd(eventShape);
InBlock.gif                    break;
InBlock.gif
InBlock.gif                case (short)VisEventCodes.visEvtDel + (short)VisEventCodes.visEvtShape:
InBlock.gif                    eventShape = (Shape)subject;
InBlock.gif                    handleShapeDelete(eventShape);
InBlock.gif                    break;
InBlock.gif
InBlock.gif                case (short)VisEventCodes.visEvtCell + (short)VisEventCodes.visEvtMod:
InBlock.gif                    Visio.Cell cell = (Cell)subject;
InBlock.gif                    if (cell.Name.IndexOf("Prop") >= 0)//限制只执行自定义事件一次
ExpandedSubBlockStart.gif
                    {
InBlock.gif                        eventShape = cell.Shape;
InBlock.gif                        handleCellModify(eventShape);
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    break;
InBlock.gif
InBlock.gif                default:
InBlock.gif                    break;
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            return result;
ExpandedBlockEnd.gif        }

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

ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 形状的类型,即设备类型
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public string ShapeType
None.gif
ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 形状ID
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public string ShapeID
None.gif
ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 形状的GUID
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public string ShapeGuid
None.gif
ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 形状的状态:新增、编辑、删除
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public ShapeStatus ShapeStatus
None.gif
ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 形状名称
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public string ShapeName

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

ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 形状类型
ExpandedBlockEnd.gif        
/// </summary>

None.gif    public string ShapeType
None.gif
ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 形状类型对应的数据库表名称
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public string ShapeTableName
None.gif
ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 该形状类型对应的形状日志对象集合
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public Dictionary<string, ShapeLogInfo> ShapeColloction

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

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

None.gif        private ShapeTypeLogInfo GetShapeType(ShapeLogInfo shape)
None.gif
ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 如果集合中有,修改状态;否则添加一个新的
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public void AddLog(ShapeLogInfo shapeLogInfo)
None.gif
ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 判断指定的形状是否是在集合中存在
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public bool IsNewShape(ShapeLogInfo shape)
None.gif
None.gif
ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 取当前设备在集合中存储的ShapeLog对象
ExpandedBlockEnd.gif        
/// </summary>

None.gif        public ShapeLogInfo GetShape(string shapeType, string shapeId)

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

None.gifprivate void visioEventSink_OnShapeDelete(object sender, EventArgs e)
ExpandedBlockStart.gif{
InBlock.gif            Shape shape = (Shape)sender;
InBlock.gif            string strDeviceType = string.Empty;
InBlock.gif            string strDeviceName = string.Empty;
InBlock.gif            string strDeviceID = string.Empty;
InBlock.gif
InBlock.gif            strDeviceType = VisioUtility.GetShapeCellValue(shape, "设备类型");
InBlock.gif            strDeviceID = VisioUtility.GetShapeCellValue(shape, "GUID");
InBlock.gif
InBlock.gif
InBlock.gif            ShapeLogInfo logInfo = new ShapeLogInfo();
InBlock.gif            logInfo.ShapeType = strDeviceType;
InBlock.gif            logInfo.ShapeID = shape.NameID;
InBlock.gif            logInfo.ShapeName = VisioUtility.GetShapeCellValue(shape, "名称");
InBlock.gif
InBlock.gif            if (shape.Application.IsUndoingOrRedoing)
ExpandedSubBlockStart.gif            {
InBlock.gif                ShapeLogInfo info = Portal.gc.gOperationLog.GetShape(strDeviceType, shape.NameID);
InBlock.gif                if (info != null)
ExpandedSubBlockStart.gif                {
InBlock.gif                    strDeviceID = info.ShapeGuid;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

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

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

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

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



 

目录
相关文章
|
1月前
|
Web App开发 Java 开发工具
systrace: 系统级跟踪工具的解析
systrace是Android4.1版本之后推出的,对系统Performance分析的工具,该工具结合Android 内核的数据,最终会生产html文件。 systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况等
|
2月前
ArcGIS:如何进行半自动化跟踪和全自动化跟踪?
ArcGIS:如何进行半自动化跟踪和全自动化跟踪?
32 0
Revit 二次开发—元素处于选中状态(待完善)
Revit 二次开发—元素处于选中状态(待完善)
Revit二次开发—更改激活视图(activeview)失败原因
Revit二次开发—更改激活视图(activeview)失败原因
Revit二次开发—更改激活视图(activeview)失败原因
|
7月前
|
vr&ar 图形学 Windows
CATIA等设计类软件实时渲染流化解决方案
**实时渲染技术可以实现在VR/AR眼镜中查看CATIA模型,其实不仅仅是VR和AR眼镜,还可以是手机、平板、电脑中直接打开网页就可以查看和浏览CATIA等3D模型。而VR/AR眼镜中通过实时渲染技术不仅仅可以查看CATIA模型,其他的比如BIM/Unreal/unity等模型也都是OK的。**那具体是怎么实现的呢?使用起来麻烦吗?能不能支持多人同时使用呢?关于这些对于实时渲染比较相关的问题,这里点量云小芹做统一解释说明。
100 0
CATIA等设计类软件实时渲染流化解决方案
|
9月前
|
监控
西门子S7-200 SMART如何使用状态图表,如何创建、监视、强制、趋势显示
上篇文章中我们学习了S7-200 SMART系统块的组态,本篇我们来介绍在编程软件STEP7-Micro/WIN SMART中如何使用状态图表,以及如何创建、监视、强制、趋势显示。在STEP7-Micro/WIN SMART与PLC之间成功建立通信,并且将程序下载到PLC后,就可以监控和调试程序了。程序状态监控可以监视程序的运行情况,但是如果需要监控的变量较多,不能在程序编辑器中同时显示的时候就需要使用状态图表监控。接下来我们来介绍在STEP7-Micro/WIN SMART如何使用状态图表监控和调试程序。
西门子S7-200 SMART如何使用状态图表,如何创建、监视、强制、趋势显示
|
存储 数据采集 SQL
案例分享:Qt西门子机床人机界面以及数据看板定制(西门子通讯,mysql数据库,生产信息,参数信息,信息化看板,权限控制,播放器,二维图表,参数调试界面)
案例分享:Qt西门子机床人机界面以及数据看板定制(西门子通讯,mysql数据库,生产信息,参数信息,信息化看板,权限控制,播放器,二维图表,参数调试界面)
案例分享:Qt西门子机床人机界面以及数据看板定制(西门子通讯,mysql数据库,生产信息,参数信息,信息化看板,权限控制,播放器,二维图表,参数调试界面)
服务开发+虚拟设备完成设备属性变更模拟
为了测试物联网平台数据分析的GIS组件,我们准备模拟一个设备随机在一定范围内(比如在(120±0.05,30±0.01)附近,避免一下子跑到非洲,一下子跑到南极)上报地理信息。由于物联网平台的虚拟设备推送只能定时推送+全取值范围随机数值,不能满足有一定数学表达式的推送策略。如果手上没有设备(尤其是正常设备无法通过热点WIFI接入测试环境),又想在云端持续的模拟设备行为,怎么办呢?通过服务开发+虚拟
1272 0
|
API Windows 程序员
如何在UWP中统一处理不同设备间的页面回退逻辑
原文:如何在UWP中统一处理不同设备间的页面回退逻辑       已经有一段时间没有写博客来记录自己的学习点滴了。现在回想起来确实有些惭愧,期间经历了一些事情,到目前为止算是平息了,是时候该收收心来充实自己了。
651 0