C#进行Visio二次开发之组合形状操作
由于一朋友需要Visio实现仿真模拟Demo,因此我在原来Visio项目代码基础上进行改进调整,完成了其需要的功能。现将对原有Visio二次开发项目的创新思路及成果总结一下,以飨读者,也做为一个标志,供日后参考,或者于各位同行,一起研究切磋。先贴图展示整个项目的该款,表明此文章所托并非空穴来风、纸上谈兵!
本人基于项目的Visio的二次开发文章写了很多,其中涉及到各形状方面的操作,但基本上都是做为一个图形的整体来实现各种效果的,由于仿真需要,需要将换向阀实现左右变换功能,而换向阀是一个组合控件,基本上对组合控件操作都是一个整体性的操作,不能局部进行位置变换的,所以要实现这种变化,还真是费了不少功夫。
需求是要求做线路分析的时候,油经过后,组合图形实现效果变换,如下图所示:
上面的图形变化为下图(实现了左右组合图形的互换变化的效果)
一般光靠操作整个图形实现变化是不太可能的,因此考虑化整为零,把其中两个组合图形从整体中分离,然后再进行组合操作即可。首先尝试通过宏记录方式查看代码,得到分解后的形状操作宏代码如下所示:
Macro1()
Dim
UndoScopeID1
As
Long
UndoScopeID1
=
Application.BeginUndoScope(
"
移动对象
"
)
ActiveWindow.DeselectAll
ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(
60
), visSubSelect
Application.ActiveWindow.Selection.Move
0.405512
,
-
0
#
ActiveWindow.Selection.RemoveFromGroup
Application.EndUndoScope UndoScopeID1,
True
ActiveWindow.DeselectAll
ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(
25
), visSubSelect
Application.ActiveWindow.Selection.Move
0.314961
,
-
0
#
Dim
UndoScopeID2
As
Long
UndoScopeID2
=
Application.BeginUndoScope(
"
移动对象
"
)
ActiveWindow.DeselectAll
ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(
60
), visSelect
Application.ActiveWindow.Selection.Move
-
0.688976
,
0
#
ActiveWindow.DeselectAll
ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(
22
), visSelect
ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(
60
), visSelect
ActiveWindow.Selection.AddToGroup
Application.EndUndoScope UndoScopeID2,
True
End Sub
至此,完成万里长征第一步,也证实分解后的图形,可以通过移动位置的方式实现,虽然定位形状我们不能靠ActiveWindow.Page.Shapes.ItemFromID(60)来定位,但是我们可以通过埋在形状中的设备类型参数来实现形状的定位的(这里我在设计模具的时候,把两个形状的的设备类型属性分别设置为“阀A"和”阀B“)。
进一步分析整体组合形状的ShapeSheet参数发现,里面有一个很重要的参数,如下图所示:
F1查看其帮助说明,如下所示
因此可以看到,可以通过该属性的设置,来实现组合形状的分离操作,在图纸上实际操作一下,把0修改为1或者2,果然可以实现子形状的选择操作了。
建立一个操作函数,来实现选择模式的修改,如下所示:
///
<summary>
///
设置形状的选择属性
///
</summary>
///
<param name="targetShape">
指定的形状
</param>
///
<param name="selectMode">
///
0 仅选择组合形状。
///
1 首先选择组合形状
///
2 首先选择组合的组成部分
///
</param>
[CLSCompliant(
false
)]
public
static
void
SetGroupSelectMode(Visio.Shape targetShape,
int
selectMode)
{
targetShape.get_CellsSRC((
short
)VisSectionIndices.visSectionObject, (
short
)VisRowIndices.visRowGroup,
(
short
)VisCellIndices.visGroupSelectMode).FormulaU
=
selectMode.ToString();
}
本人实现了图形变化效果,截取项目部分代码,作为分析研究之用,如下所示:
代码
else
if
(equipType
==
"
4/2阀
"
)
{
VisioUtility.SetGroupSelectMode(shape,
2
);
//
改变模式,使之可以选择子形状
#region
MyRegion
foreach
(Shape subShape
in
shape.Shapes)
{
string
subEquipType
=
VisioUtility.GetShapeCellValue(subShape,
"
设备类型
"
);
if
(subEquipType
==
"
阀A
"
||
subEquipType
==
"
阀B
"
)
{
subShape.Text
=
subEquipType;
if
(intValue
!=
0
)
{
continue
;
}
try
{
VisWindow.DeselectAll();
VisWindow.Select(subShape, (
short
)VisSelectArgs.visSubSelect);
if
(subEquipType
==
"
阀A
"
)
{
VisWindow.Selection.Move(
0.393701
,
0
,
"
inches
"
);
//
移动到右边
}
else
if
(subEquipType
==
"
阀B
"
)
{
VisWindow.Selection.Move(
-
0.393701
,
-
0
,
"
inches
"
);
//
移动到左边
}
System.Windows.Forms.Application.DoEvents();
Thread.Sleep(
50
);
}
catch
(Exception ex)
{
VisWindow.DeselectAll();
}
}
}
VisioUtility.SetGroupSelectMode(shape,
0
);
//
还原选择模式,成为组合形状
#endregion
}
世界本简单,只因道未知;无师可自通,码界无秘密。