1. 為圖元設置顏色
在一些分析中,如電氣線路分析中,需要根據不同 的狀態改變圖元的顏色,那麼如何改變指定圖元的設備顏色呢?下面提供代碼解 決該問題。
shape.get_CellsU("LineColor").ResultIU = (double)VisDefaultColors.visDarkGreen;//有電(綠色)
其中 VisDefaultColors是一個枚舉,有很多顏色,可以查下SDK,也可以使用其對應的 數值來代替
............
上面的代碼是比較簡潔的寫法,當然也可 以使用下面這種方式:
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;
}
這下明白了 多少了呢,要飲水思源哦