zoukankan      html  css  js  c++  java
  • C#进行Visio二次开发之鸡毛蒜皮(一)

    本文主要分享一些在Visio二次开发中碰到的各种小问题及其解决方法:
    1. 为图元设置颜色
    在一些分析中,如电气线路分析中,需要根据不同的状态改变图元的颜色,那么如何改变指定图元的设备颜色呢?下面提供代码解决该问题。
      shape.get_CellsU("LineColor").ResultIU = (double)VisDefaultColors.visDarkGreen;//有电(绿色)
    其中VisDefaultColors是一个枚举,有很多颜色,可以查下SDK,也可以使用其对应的数值来代替
    Constant Value Description

    visBlack

    0

    Black

    visBlue

    4

    Blue

    visCyan

    7

    Cyan

    visDarkBlue

    10

    Dark blue

    visDarkCyan

    13

    Dark cyan

    visDarkGray

    19

    Dark gray

    visDarkGreen

    9

    Dark green

    visDarkRed

    8

    Dark red

    visDarkYellow

    11

    Dark yellow

    ............

    上面的代码是比较简洁的写法,当然也可以使用下面这种方式:
    shape.get_CellsSRC((short)VisSectionIndices.visSectionObject, (short)VisRowIndices.visRowLine,(short)VisCellIndices.visLineColor).FormulaU = 4

    2. 获取图元设备的连接关系
    每个设备Shape都有一个Connects和FromConnects集合,该集合是Connect对象集合,每个Connect有ToSheet和FromSheet属性,分别是指向一个Shape对象,我们如果要获取设备的关联关系,就是需要判断这些Connect的ToSheet和FromSheet属性。
    如下代码:
                string strShapes = ";";
                
    if (IsSpecialEquipTypeInShape(shape))
                
    {
                    
    foreach (Visio.Connect connect in shape.Connects)
                    
    {
                        strShapes 
    += GetConnectsShapes(shape, connect.ToSheet);     //检查接入的设备
                        strShapes += GetConnectsShapes(shape, connect.FromSheet);   //检查接出的设备
                    }


                    
    foreach (Visio.Connect connect in shape.FromConnects)
                    
    {
                        strShapes 
    += GetConnectsShapes(shape, connect.ToSheet);     //检查接入的设备
                        strShapes += GetConnectsShapes(shape, connect.FromSheet);   //检查接出的设备
                    }

                }

            /// <summary>
            
    /// 获取与当前的图元连接(接入或接出)的所有相关设备
            
    /// </summary>

            private string GetConnectsShapes(Visio.Shape shape, Visio.Shape toFromSheet)
            
    {
                
    string strShapes = string.Empty;
                
    bool exist = VisioUtility.ShapeCellExist(toFromSheet, "设备类型");
                
    bool isSpecial = IsSpecialEquipTypeInShape(toFromSheet);

                
    if (toFromSheet != null && exist && isSpecial)
                
    {
                    
    //Visio图元的连接集合,会存放自己本身的,所以此处需要判断。
                    if (shape.ID != toFromSheet.ID)
                    
    {
                        strShapes 
    += string.Format("{0};", toFromSheet.ID);
                    }

                }


                
    return strShapes;
            }

    3. 获取图元的属性集合
    我们知道,每个图元Shape甚至Page对象都有很多自定义属性,你可以通过在Visio的开发模式中查看ShapeSheet查看到。而所有这些属性中,每行又代表一个属性的各种定义信息,如Label是什么,Prompt(提示)是什么,Value(值)是什么,Type(类型)是什么,这就有点类似于我们在数据库定义一个字段,需要指定字段的名称,类型等等,那如果我们需要把这些信息保存下来,我们该如何获取呢?下面举例说明:
                Dictionary<string, StencilPropertyInfo> list = new Dictionary<string, StencilPropertyInfo>();
                StencilPropertyInfo propertyInfo;
                Visio.Cell shapeCell;
                
    short shortSectionProp = (short)VisSectionIndices.visSectionProp;

                
    if (shape != null)
                
    {
                    
    for (short i = 0; i < shape.get_RowCount(shortSectionProp); 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.SortKey 
    = VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                            shapeCell 
    = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsType);
                            propertyInfo.PropType 
    = (PropType)shapeCell.get_ResultInt((short)VisUnitCodes.visNumber, 0);

                            shapeCell 
    = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsInvis);
                            
    if ("True".Equals(VisioUtility.FormulaStringToString(shapeCell.FormulaU), StringComparison.OrdinalIgnoreCase))
                            
    {
                                propertyInfo.InVisible 
    = true;
                            }


                            propertyInfo.PropRowID 
    = i;                       

                            
    if(!list.ContainsKey(propertyInfo.Name))
                            
    {
                                list.Add(propertyInfo.Name, propertyInfo);
                            }

                        }

                    }

                }


                
    return list;

    4. 关闭视图中打开的所有模具
    一般来说,一个Visio文档,一般会打开很多模具窗口,用来辅助画图的,我们有时候不小心关闭一些,又有可能打开多几个,那么你是如何记住这些打开的模具文件的呢,我们要如何关闭全部呢,你可以使用TryCatch来关闭每个文件,即使它可能已经关闭了,这种才保证不会出错;我们不太喜欢暴力,还有没有更好的方法呢,让它自己知道那些可以关闭的呢?

            /// <summary>
            
    /// 关闭视图中打开的所有模具
            
    /// </summary>
            
    /// <param name="visApp"></param>
            
    /// <returns></returns>

            public bool CloseAllStencileDocument(Application visApp)
            
    {
                
    string[] strs = new string[0];
                Array arr 
    = strs as Array;
                visApp.Documents.GetNames(
    out arr);
                Document visDoc;
                
    foreach (object file in arr)
                
    {
                    
    if (file.ToString().IndexOf(".vss", StringComparison.OrdinalIgnoreCase) > 0)
                    
    {
                        visDoc 
    = visApp.Documents[file];
                        
    if (visDoc != null)
                        
    {
                            visDoc.Close();
                        }

                    }

                }

                
    return true;
            }


    5. 管理Visio内置的窗口
    Visio控件提供了很多内置的窗口,你可以根据需要显示或者隐藏它,如我们常常看到的图元属性窗口、形状查询窗口、模具管理窗口等等,很典型的例子,我们很多时候不需要那个形状查询窗口,想把它隐藏,那么这些该如何操作呢?
    我前面写过的文章C#进行Visio二次开发的常见问题处理 有说明,如下所示:

            //Visio2007的形状窗口中去除搜索形状功能
                VisApplication.Settings.ShowShapeSearchPane = false;

                Visio2003的ShowShapeSearchPane实现方式
    Visio2003的ShowShapeSearchPane实现方式


    还有一种方式可以管理窗口,如下面代码,对各种内置的窗口实现了统一的管理

                    for (int i = drawingControl.Window.Windows.Count; i > 0; i--{
                        Window visWindow;
                        
    int windowType;

                        visWindow 
    = drawingControl.Window.Windows.get_ItemEx(i);
                        windowType 
    = visWindow.Type;

                        
    if (windowType == (int) VisWinTypes.visAnchorBarBuiltIn) {

                            
    switch (visWindow.ID) 
                            
    {
                                
    case (int) VisWinTypes.visWinIDCustProp:
                                
    case (int) VisWinTypes.visWinIDDrawingExplorer:
                                
    case (int) VisWinTypes.visWinIDMasterExplorer:
                                
    case (int) VisWinTypes.visWinIDPanZoom:
                                
    case (int) VisWinTypes.visWinIDShapeSearch:
                                
    case (int) VisWinTypes.visWinIDSizePos:
                                
    case (int) VisWinTypes.visWinIDStencilExplorer:

                                    visWindow.Visible 
    = false;
                                    
    break;

                                
    default:
                                    
    break;
                            }

                        }

                    }


    这下明白了多少了呢,要饮水思源哦

    转载请注明出处:
    撰写人:伍华聪  http:
    //www.iqidi.com 
    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    快速构建ceph可视化监控系统
    Codeforces Round #277.5 解题报告
    【MapReduce】经常使用计算模型具体解释
    Unity3D教程:静态调用C#的dll
    【Oracle错误集锦】:PLSQL无法直连64位Oracle11g数据库
    关于ios下字体描边的一个细节
    未来社交站点:15秒内让你闻名全球 虚拟现实与社交网络融合
    iOS多语言(国际化)开发(尾随系统 + APP内手动设置)
    Java String对象的经典问题
    jsp+tomcat+ 创建project 配置project
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1209507.html
Copyright © 2011-2022 走看看