本文主要分享一些在Visio二次开发中碰到的各种小问题及其解决方法:
1. 为图元设置颜色
在一些分析中,如电气线路分析中,需要根据不同的状态改变图元的颜色,那么如何改变指定图元的设备颜色呢?
2. 获取图元设备的连接关系
每个设备Shape都有一个Connects和FromConnects集合,该集合是Connect对象集合,每个Connect有ToSheet和FromSheet属性,分别是指向一个Shape对象,我们如果要获取设备的关联关系,就是需要判断这些Connect的ToSheet和FromSheet属性。
3. 获取图元的属性集合
我们知道,每个图元Shape甚至Page对象都有很多自定义属性,你可以通过在Visio的开发模式中查看ShapeSheet查看到。而所有这些属性中,每行又代表一个属性的各种定义信息,如Label是什么,Prompt(提示)是什么,Value(值)是什么,Type(类型)是什么,这就有点类似于我们在数据库定义一个字段,需要指定字段的名称,类型等等,那如果我们需要把这些信息保存下来,我们该如何获取呢?
本文主要分享一些在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 = 42. 获取图元设备的连接关系
每个设备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实现方式#region Visio2003的ShowShapeSearchPane实现方式
//Window searchWindow = wndVisio.Windows.get_ItemFromID(Convert.ToInt16(VisWinTypes.visWinIDShapeSearch));
//if (searchWindow != null)
//{
// searchWindow.Visible = false;
//}
#endregion
还有一种方式可以管理窗口,如下面代码,对各种内置的窗口实现了统一的管理

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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)