程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#進行Visio二次開發之雞毛蒜皮(一)

C#進行Visio二次開發之雞毛蒜皮(一)

編輯:關於C#

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;
    }

 

這下明白了 多少了呢,要飲水思源哦

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved