如何使用C#进行Visio二次开发-总结版

简介:

很久没有写C#进行Visio二次开发的文章了,这次温习一下Visio二次开发的相关知识,全面总结一下Visio 二次开发的方方面面。一方面让对Visio的开发不太了解人员有一个全局的认识,对已经看过我前面文章的人来一个回顾总结。

本次主要根据我在Visio二次开发过程中,获得的一些实际系统开发经验以及学习历程,分三个方面对下面内容进行介绍:

1)介绍C#的Visio二次开发管理系统的架构设计思路

2)介绍C#进行Visio开发的准备工作

3)Visio的编程对象模型

1)Viso二次开发管理系统的架构设计思路 

 

为了,有效的模仿Office界面,我们使用了很多相似工具条图标,图标有一个透明的颜色,可以使得图标展示更加完美,不留底图背景的痕迹。

当然,整个布局使用了很有名的WeifenLuo.WinFormsUI.DockContent, 来使得界面更加完美,另外,有一点值得提及的是,为了使得工具条可以移动,分段等操作,这里还使用了框架本身提供的ToolStripPannel面板。

下面对系统的各个界面区域做一个总体的说明,首先我们看看下面的图形,我分了几个部分。 

 

其中红色部分是Visio控件本身的内容,左边的形状(也称模具)窗口,是通过调用打开形状文件而呈现出来的。我们做Visio的二次开发,多数是和这个控件打交道了。其他部分,设计好界面后(主要涉及布局界面的设计使用了),只需要调用相关的API接口就可以实现相关的功能了。 

Viso二次开发架构设计图

整个系统的架构设计如下图所示,其中绿色部分为外部控件,其他部分为自己编写的代码,边界也划分的比较清晰,界面层只是和业务逻辑层交互,不会直接操作数据库或者Visio文件,这两个部分交给下面数据访问层(DAL) 和 Visio对象访问层(VOL)进行封装调用。数据访问层对数据库的访问,是通过微软的企业库Enterprise Library库进行调用的,这样可以保证更少的代码,更高的代码质量。其中实体层和通用层是各个模块的共用的内容。  

 

Visio的二次开发,除了需要操作Visio的文件(包含多个模具文件,Viso文档)还有就是也需要和数据库打交道。

为了较好区分和协调他们的访问,我设定了一个访问边界:访问数据库的层不会访问Visio文件对象,访问Visio文件对象的不会去访问数据库,它们统一由业务层(Business)调配,各层之间分享Entity层的信息即可。

数据库的底层访问通过利用Enterprise Library的模块完成,因此DAL层只需要做较少的工作即可完成对数据库的访问了。

Visio的二次开发图纸审批流程

 

 图纸只有通过了编辑后,同时校对、和审核才能够发布,已发布的图方可供Web 端查看。

保存图纸的时候,如果是制图员,将在图纸“制图”栏目中填写用户名,并擦除复核、校对、签发的用户名,图纸状态恢复“编辑”状态;如果是校对或者复核人员,将在“校对”或者“复核”中填写用户名,并擦除“签发”的用户名,图纸恢复“已校对”或者“发布中”的状态;如果是签发人员,系统询问“是否发布”,选择是图纸状态变为“已发布”,否则变为“发布中”,并擦除签发的用户名。

整个发布的流程,是通过属性值进行判断,没有涉及太多的流程内容,因此对图纸的发布操作也相对比较简单。

系统模具对象关系

整个系统设计很多类型的模具对象,所有的设备都有一个字段用来表示其属于那种设备,设备基本上分下面为几类:一类是纯粹的符号,不涉及统计等信息,如河流、道路等;一类是线路设备,包括母线、电缆、架空线;一类是开关,包括负荷开关、刀闸、继保开关等;一类是变压器,包括公用变压器、专用变压器等。

模具的设计比较讲究,由于Visio在图纸分析的时候,如果是组合的模具图标,会认为是两个模具图标,对于拓扑分析非常不利,因此所有的模具均是通过ShapeSheet中的Geometry形状进行绘制,这样就保证整个模具是一个整体,模具绘制是个非常精细复杂的工作,还需要考虑文本、开关闭合等事件的界面处理效果,这个如果需要了解和掌握,需要开几节课程才能讲的清楚。下图大致绘制出了系统中设备的层次关系图,注意仅是概念图,真实的系统中,设备直接没有继承关系。

 

 

 Visio二次开发的设备状态跟踪

对于一个使用Visio进行二次开发的程序来说,背后你需要知道用户增加了那些设备,删除了那些设备,修改了那些设备(移动或者更改了文字、属性等操作),这样你才能对整个系统的数据进行有效的控制。如果需要知道这些,那么你对设备的状态跟踪就显得非常重要,特别是一个删除设备的操作,设计到需要删除相关的内容的时候,这项工作就特别的重要了。

由于设备的状态更新频繁,为了系统的稳定及效率,整个系统是在图纸保存或者修改的时候,并不保存相关的设备信息;当图纸发布的时候,清空原来的数据库设备信息表,重新遍历图纸的设备信息,把它一次性写到数据库中,这样保证了发布图纸设备信息的权威性,同时提高了系统的性能。


 

 Visio对象状态跟踪的事件侦听

在C#的Viso开发例子中,都建议采用事件侦听的方式进行处理相关的内容,这是一个很好的突破(相对VB中的开发例子而已),不过处理也有一些麻烦,主要是观念的转变以及细节的考虑吧。在这里,你可以侦听到任何你关注的事件,然后通过自定义的函数,实现自己的业务处理,这种方式实现起来确实比较简洁,思路非常清晰。

 

Visio对象数据库对象及关系

为了保持Visio的相关设备信息,你需要在数据库中建立相关的表,来存储设备属性信息以及图纸信息,方便信息的统计查询,图纸更可以通过Web进行查看等。

其中的Device1是一个根据SystableField表自动生成出来的设备表,它的表名会自动在SysDeviceTable中注册,方便寻找对应设备类型是哪个表。SystableField是差不多是根据Visio对象里面的属性定义的一个拷贝,里面记录了字段名称、字段类型、是否可见、排序、格式、默认值等这些Visio属性定义里面有的(你打开ShapeSheet中就看到每个属性对应一行的定义信息,就是这里面的内容的存储了)。

系统里面有一个VisioImage和VisioImageRelease的表,一个是存放增加或者修改的图纸内容(二进制存储),一个是存放发布后的图纸(二进制存储),我们系统打开图纸的侯,就是写在这个表的二进制文件,还原成Visio文件,进行打开的。

 

2)C#进行Visio开发的准备工作

安装Visio2007、VisioSDK2003和2007版

     Visio2007是推荐的开发版本,因为目前基本上Visio2007应用比较多了,而且2003估计也买不到了,另外Visio的SDK,建议两个版本的都要安装,互补下相信息的不足。如VisioSDK2003中 有对象模型图,2007中没有。

熟悉Visio Drawing Control控件使用

       这个控件的熟悉使用时非常重要的,因此在开发之初,最好能够多用这个控件做一些简单的例子,了解里面的各种属性、函数,以及事件的处理等。这样对于开发一个复杂的系统,是非常有帮助的。

Visio开发帮助文档

         VisSDK.chm

         Visio Code Samples Library.chm

        这两个帮助文档基本上涵盖了Visio开发的方方面面,其中有很多代码可以用来做参考,里面对于一些概念或者对象的说明及分析,也是非常独到和有帮助的,虽然是英文的内容,看起来比较费劲,但是开发文档的英文都是比较简单的,应该多看看。

 Visio2007文档操作

        查看ShapeSheet属性及帮助内容

   这个是无可替代的开发熟悉内容,里面的对于各个ShapeSheet的属性描述,更是进阶高级Visio开发的必经之路。

 Visio宏的录制

     要熟练掌握Office的宏录制和查看功能,对于Visio开发来说就是熟悉和了解宏代码了,里面如何操作Visio对象,是很有参考意义的。

设置Visio文档的开发人员模式

 

 切换Visio的ShapeSheet视图

 

 

ShapeSheet视图

 

 

 3)Visio的编程对象模型

Visio二次开发中,对于其对象模型的了解,就写我们吃饭用筷子一样重要,否则不熟悉筷子的使用场景和方法,是吃不到东西的。

其中主要的是下面几个对象: 

 Application

 Window (Application.ActiveWindow)

 Document (Application.ActiveDocument)

 Master、Shape、Cell

一个程序中,就只有一个Application对象,类似进程的概念;打开的Visio文件有很多窗口,有一个ActiveWindow的主窗口,选区窗口、形状窗口等;模具文件打开后也是一个Document、打开的Visio文件也是一个Document、ActvieDocument是指当前Visio窗口对应的文档,每个Visio的Document有一个或者多个Page,如系统中有两个Page、一个为绘图Page,一个为背景Page。

模具文件里面有很多Master,Master类似于模板的概念,一个Master代表一个设备类型、Shape是定义一个图形的信息,模具里面的Master有且只有一个Shape,每个Shape又有很多Cell,代表一个ShapeSheet里面的一个格子,每个格子都有一个唯一的引用名称的。

Visio文档里面,和模具文件不同,里面一个大千世界,有很多Master,也很多Shape和Cell,但是由于我们看到图纸可能一个模具的设备会有拷贝多个,因此它们公用一个Master,也就是一个Master有多个Shape引用,我们分析文件,就知道里面有一个MasterID,有点像数据库里面的外键一样。

下面是VisioSDK2003中的对象模型图,概括了各个对象之间的关系。

 

 

关于拓扑关系

    Visio自己的拓扑关系信息很少,除了有一个Connection知道设备的两个连接关系外,信息比较少,如果需要做设备的拓扑图形分析,需要保存他们自己的关系到数据库中,指定一个开始的设备,然后对图形进行分析,如系统中的停电分析、线损分析等,都是在数据库中进行分析,实现的效果还不错,就是会比较麻烦一些。

Visio XML格式文件分析

Master格式

Pages/Shapes格式

Visio的XML文件之Master部分 

 

 图纸的XML文档中,Master后面的Shapes集合中只有一个Shape对象

 图纸的Shapes集合有多个对象,每个对象的NameUName值可能不一样,一般使用NameU

Visio的XML文件之Pages、Shapes 

 

  Visio中很多属性都有一个同名+U的属性名称,一般情况下最好使用这个名称如NameU,因此这个是一个唯一的名字,有时候你会发现Name相同,但他们就是不一样,因为他们的NameU名称不一样的。

模具文件操作

 

 

 

 本文是综合了所有讲过和未讲过的Visio开发知识,有些地方时前面介绍很少或者带过的,在此做了深层次的分析和介绍,对于Visio开发和探索,国内资料相对比较少,很多是探索性和尝试性的研究,希望本文能够为大家做一定的指引作用。

 本文转自博客园伍华聪的博客,原文链接:如何使用C#进行Visio二次开发-总结版,如需转载请自行联系原博主。



目录
相关文章
|
12月前
|
C#
CAD2015 C#二次开发 字体变形
CAD2015 C#二次开发 字体变形
基于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常见问题解决方案集锦
|
存储 C# Python
基于C#的ArcEngine二次开发46:编辑内容回撤与炸开multipart feature
基于C#的ArcEngine二次开发46:编辑内容回撤与炸开multipart feature
基于C#的ArcEngine二次开发46:编辑内容回撤与炸开multipart feature
|
C# 数据库
基于C#的ArcEngine二次开发45:属性值设置中的DBNull、null和default
基于C#的ArcEngine二次开发45:属性值设置中的DBNull、null和default
基于C#的ArcEngine二次开发45:属性值设置中的DBNull、null和default