如何使用C#进行Visio二次开发

    Visio在VB6中的开发有很多现成的项目及代码,但在.NET领域相对比较滞后,但是从Visio SDK2007发布以来,给予Visio的C#开发逐渐多了起来,虽然和VB6的开发思路有一定的相似,不过平台不一样,做出来的东西差别还是有一定的距离,虽然总体慢一点,但是,DotNET框架的逐渐强大以及更多的DotNet程序和开发人员的加入,带给大家更高的整合价值以及更美好的发展未来。
    本人将会在C#领域将Visio的二次开发进行下去,希望大家一起学习研究,碰撞出更美的火花

Visio Drawing Control控件使用
Visio开发必备
    Visio SDK 2007
         VisSDK.chm
         Visio Code Samples Library.chm
 Visio文档操作
     查看ShapeSheet属性及帮助内容
     宏的录制

Visio的几个重要对象

 Application
 Window (Application.ActiveWindow)
 Document (Application.ActiveDocument)
 Master、Shape

Visio XML格式文件分析
 Master格式

 
Pages/Shapes格式 

 图纸的XML文档中,Master后面的Shapes集合中只有一个Shape对象
 图纸的Shapes集合有多个对象,每个对象的NameU和Name值可能不一样,一般使用NameU
Visio基本操作的实现

VisApplication = this.ctrlDrawing.Document.Application;
VisWindow = VisApplication.ActiveWindow;
VisDocument = VisApplication.ActiveDocument;

//Settings
VisApplication.Settings.ShowShapeSearchPane = false; //显示搜索形状窗体
VisApplication.Settings.EnableAutoConnect = false; //自动链接(2007默认)
VisApplication.Settings.StencilBackgroundColor = 10070188; //vbGrayText

//文档各种显示
VisApplication.DoCmd((short)VisUICmds.visCmdViewRulers);
VisApplication.DoCmd((short)VisUICmds.visCmdViewGrid);
VisApplication.DoCmd((short)VisUICmds.ShowGuides);
VisApplication.DoCmd((short)VisUICmds.ShowConnectPoints);
VisApplication.DoCmd((short)VisUICmds.ShowPageBreaks);

//各种窗口
VisApplication.DoCmd((short)VisUICmds.visCmdShapesWindow);
VisApplication.DoCmd((short)VisUICmds.visCmdPanZoom);
VisApplication.DoCmd((short)VisUICmds.visCmdCustProp);
VisApplication.DoCmd((short)VisUICmds.visCmdSizePos);


SendKeys.Send("^(x)");
//VisApplication.DoCmd((short)VisUICmds.visCmdUFEditCut);
SendKeys.Send("{DELETE}");
//VisApplication.DoCmd((short)VisUICmds.visCmdUFEditClear);
SendKeys.Send("^+(p)");
//VisApplication.DoCmd(VisUICmds.visCmdFormatPainter);
SendKeys.Send("^(z)");
//VisApplication.DoCmd(VisUICmds.visCmdEditUndo);

调用工具条对象、菜单对象的方法
Application.CommandBars
Microsoft.Office.Core.CommandBars共享Office对象模型
使用CommandBar代替UIObject 
CommandBar对象中,菜单及工具条是同一个东西
CommandBar、CommandBarButton、 CommandBarComboBox、CommandBarControl、 和 CommandBarPopup
示例:执行视图中的工具条的所有按钮事件。

Microsoft.Office.Core.CommandBars commandBars;
commandBars = (Microsoft.Office.Core.CommandBars)VisApplication.CommandBars;

foreach (Microsoft.Office.Core.CommandBarControl control in commandBars["View"].Controls)
{
    Microsoft.Office.Core.CommandBarButton button =  control as  Microsoft.Office.Core.CommandBarButton;
    if (button != null)
    {
        button.Execute();
    }
}

StringBuilder sb = new StringBuilder();
foreach (Microsoft.Office.Core.CommandBar bar in commandBars)
{
    sb.Append(string.Format("CommandBar Name:{0}\r\n", bar.Name));
    foreach(Microsoft.Office.Core.CommandBarControl control in bar.Controls)
    {
        Microsoft.Office.Core.CommandBarButton button =  control as  Microsoft.Office.Core.CommandBarButton;
        if(button != null)
        {
            sb.Append(string.Format("Button Name:{0} \r\n", button.Caption));
        }                    
    }
}
Form2 frm = new Form2();
frm.txtContent.Text = sb.ToString();
frm.Show();


short flags = (short)VisOpenSaveArgs.visOpenDocked | (short)VisOpenSaveArgs.visOpenRO;
StencilOpenEx(wndVisio.Application, flags);

/// <summary>
/// 打开模具的公共方法
/// </summary>
/// <param name="visApp">按引用调用的VisioApplication对象</param>
/// <param name="flags">打开的模式</param>
private void StencilOpenEx(Application visApp, short flags)
{
    List<string> stencilList = GetStencils();
    string stencilFileName;
    
    foreach(string stencil in stencilList)
    {
        stencilFileName = GetStencilsFileName(stencil);
        if(!string.IsNullOrEmpty(stencilFileName))
        {
            visApp.Documents.OpenEx(Portal.gc.gStencileFileBasePath + stencilFileName, flags);
        }
    }
}

//关闭模具文件
visApp.Documents["Switch.vss"].Close();
visApp.Documents["Span.vss"].Close();
visApp.Documents["Line.vss"].Close();
visApp.Documents["Label.vss"].Close();
visApp.Documents["Construct.vss"].Close();
visApp.Documents["Monitor.vss"].Close();
Visio Shape的属性操作
  StringToFormulaForString、FormulaStringToString函数
  访问属性
  设置属性
  添加属性

//列出模具组
this.cmbStencilGroup.Items.Clear();
List<string> stencilGroups = stencil.GetStencils();
foreach (string group in stencilGroups)
{
    this.cmbStencilGroup.Items.Add(group);
}


//根据模具组列出模具
string stencilName = stencil.GetStencilsFileName(this.cmbStencilGroup.Text);
this.cmbStencil.Items.Clear();
string tempName;
foreach (Master master in visApp.Documents[stencilName].Masters)
{
    tempName = master.Name;
    if (!stencil.IsExcludeItem(tempName))
    {
        this.cmbStencil.Items.Add(tempName);
    }
}


//根据模具,获取对应的属性集合,遍历属性集合,列出属性名称
string stencilName = stencil.GetStencilsFileName(this.cmbStencilGroup.Text);
string masterName = this.cmbStencil.Text;
Visio.Shape shape = visApp.Documents[stencilName].Masters[masterName].Shapes[1];
if (shape != null)
{
    List<StencilPropertyInfo> propInfos = property.GetPropertyCollection(shape);
    foreach (StencilPropertyInfo info in propInfos)
    {
        this.cmbProperty.Items.Add(info.Name);
    }
}


//根据模具、模具属性,列出对应的属性信息
string stencilName = stencil.GetStencilsFileName(this.cmbStencilGroup.Text);
string masterName = this.cmbStencil.Text;
Visio.Shape shape = visApp.Documents[stencilName].Masters[masterName].Shapes[1];
StencilPropertyInfo info = property.GetProperty(shape, this.cmbProperty.Text);
if (info != null)
{
    this.txtName.Text = info.Name;//属性名称
    this.txtValue.Text = info.Value;//属性值
    this.txtFormat.Text = info.Format;//属性格式
    this.txtSortKey.Text = info.Sort;//属性的排序
    this.txtPrompt.Text = info.Prompt;//属性的提示信息
}


//根据模具,获取属性对象集合
public List<StencilPropertyInfo> GetPropertyCollection(Visio.Shape shape)
{
    List<StencilPropertyInfo> list = new List<StencilPropertyInfo>();
    StencilPropertyInfo propertyInfo;
    Visio.Cell shapeCell;
    short shortSectionProp = (short)VisSectionIndices.visSectionProp;

    if (shape != null)
    {
        for (short i = 0; i < shape.get_RowCount(shortSectionProp) - 1; i++ )
        {
            if (shape.get_CellsSRCExists(shortSectionProp, i, (short)VisCellIndices.visCustPropsLabel, 0) != 0)
            {
                propertyInfo = new StencilPropertyInfo();

                shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsLabel);
                propertyInfo.Name = VisioUtility.FormulaStringToString(shapeCell.RowNameU);

                shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsPrompt);
                propertyInfo.Prompt = VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsFormat);
                propertyInfo.Format = VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsValue);
                propertyInfo.Value = VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsSortKey);
                propertyInfo.Sort = VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                //shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsType);
                //propertyInfo.PropType = VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                //shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsInvis);
                //propertyInfo.InVisible = VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                //..
                list.Add(propertyInfo);
            }
        }
    }

    return list;
}


//根据模具和属性名称,获取属性对象信息
public StencilPropertyInfo GetProperty(Visio.Shape shape, string propertyName)
{
    List<StencilPropertyInfo> list = GetPropertyCollection(shape);
    StencilPropertyInfo propertyInfo = null;
    foreach(StencilPropertyInfo tempInfo in list)
    {
        if (tempInfo.Name == propertyName)
        {
            propertyInfo = tempInfo;
            break;
        }
    }

    return propertyInfo;
}

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

时间: 2024-08-01 02:36:34

如何使用C#进行Visio二次开发的相关文章

C#进行Visio二次开发之界面设计及架构设计

写C#进行Visio二次开发的系列文章有很多篇了,都是写一些经验总结和技术知识的分享,本文继续来探讨这方面开发的一些心得,主要介绍下WinForm界面的设计和Visio软件的架构设计.先看看我花了N个月的业余时间完成的软件概貌,然后大家一起讨论下相关的技术知识. 软件界面主要有菜单区.工具条区.图纸内容区.右边的管理区.状态条区等等,主要注意的是采用了ToolStripPanel来进行布局,然后并使用了有名的WeifenLuo.WinFormsUI.Docking.dll控件对图纸内容区.右边的

C#进行Visio二次开发之自定义右键菜单

Visio Drawing Control中集成自定义菜单是很多项目必须的,很多朋友也问 过我如何实现这些菜单,下面介绍下Visio自定义菜单的实现. Visio二次 开发中,为Visio Drawing Control添加自定义菜单有两种方式:一种是使用捕捉 Visio的MouseUpEvent事件,弹出ContextMenu即可:另一种是通过在PageSheet中 增加Action来实现,也就是使用RUNADDONWARGS函数来实现. 两种实现的 效果如下图所示,两者的区别是,使用第二种会

C#进行Visio二次开发之动态仿真实现

Visio二次开发可以实现的项目情景很多,如电气线路分析.配电网络分析.流程图等,现因为项目需要,又认识多了一个应用场合,液压传动的仿真.项目效果图如下所示: 查看原图(大图) 动态仿真,其实也就是模拟实际线路的走向,实现动画的展现.以前我的Visio的项目,基本上都是基于静态的图形展现,并没有设置太多的动态展现.原来配电网络的通电线路的分析,严格来说也是静态的,因为基本上是一次性把通电和不通电的线路给绘制出来.而动态仿真则要求慢慢的动画展现线路的走向和颜色变化. 如活塞运动的仿真,要求不停止动

C#进行Visio二次开发之组合形状操作

由于一朋友需要Visio实现仿真模拟Demo,因此我在原来Visio项目代码基础上进行改进调整,完成了其需要的功能.现将对原有Visio二次开发项目的创新思路及成果总结一下,以飨读者,也做为一个标志,供日后参考,或者于各位同行,一起研究切磋.先贴图展示整个项目的该款,表明此文章所托并非空穴来风.纸上谈兵! 本人基于项目的Visio的二次开发文章写了很多,其中涉及到各形状方面的操作,但基本上都是做为一个图形的整体来实现各种效果的,由于仿真需要,需要将换向阀实现左右变换功能,而换向阀是一个组合控件,

Visio二次开发(一)----巧用Visio宏

最近做的项目中需要用到Visio二次开发,安装了Visio的SDK,还有从网上找了一些这方面的博客,Visio的SDK是全英文的,看着有点费劲,很多的东西都不知道该如何去找,不过网上的一些博客还是有一些不错的,前两天发现一个有助于Visio二次开发的方法,下面分享给大家. 就是巧用Visio的宏来帮助你进行二次开发,通过Visio宏的录制功能,将你对Visio的具体操作转换成VBA代码,这样你就会知道它的一些具体是怎么实现的了,下面是具体的步骤: 在Visio中右键,选中开发工具 然后再工具栏中

Visio二次开发(二)----Shape的添加和连接

     先说一说为什么我要用到Visio的二次开发,现在做的项目设计到了一些电子地图,下面的这张图片是美工画的一张地铁里面门禁布局图,而这些图在做项目的时候是需要用Visio画的,有提前画好的直接加载到项目中就可以使用,但是有些是需要通过代码也就是二次开发来实现的!      下面说说具体的实现过程:      shape的添加      你只需要找到相应的模板,模板下的形状,就可以加载形状,没有什么困难的,如果你实在不知道,那么就学者去用用Visio宏,对你的学习很有帮助(Visio二次开发

C#进行Visio二次开发之文件导出及另存Web页面

原文:C#进行Visio二次开发之文件导出及另存Web页面 在我前面很多关于Visio的开发过程中,介绍了各种Visio的C#开发应用场景,包括对Visio的文档.模具文档.形状.属性数据.各种事件等相关的基础处理,以及Visio本身的整体项目应用,虽然时间过去很久,不过这些技术依旧还在使用中,最近应客户培训的需要,我对所有的内容进行了重新整理,把一些没有介绍的很详细或者很少的内容进行了丰富,因此本文介绍的主题-Visio二次开发之文件导出及另存Web页面,介绍一下Visio文件另存为其他几种格

C#进行Visio二次开发之知识点考核试题

本人做过多年的Visio二次开发,根据个人的经验总结及项目积累,写了一些小小的随笔文章(具体可参考<伍华聪的Visio二次开发文章>,上月有幸给深圳一个团队做了两天的Visio培训,当了一回客座老师,重新拉起Visio二次开发这面大旗,个人觉得这也是一次比较难忘的一次经历. 本次准备的培训,除了全面介绍Visio的相关知识和概念,还以实战开发的方式加深Visio二次开发的知识掌握,另外还通过试题来考核各个学生的掌握情况,本文主要是介绍我根据自己一直以来的Visio开发经验所得,准备的Visio

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

很久没有写C#进行Visio二次开发的文章了,这次温习一下Visio二次开发的相关知识,全面总结一下Visio 二次开发的方方面面.一方面让对Visio的开发不太了解人员有一个全局的认识,对已经看过我前面文章的人来一个回顾总结. 本次主要根据我在Visio二次开发过程中,获得的一些实际系统开发经验以及学习历程,分三个方面对下面内容进行介绍: 1)介绍C#的Visio二次开发管理系统的架构设计思路 2)介绍C#进行Visio开发的准备工作 3)Visio的编程对象模型 1)Viso二次开发管理系统