由於一朋友需要Visio實現仿真模擬Demo,因此我在原來Visio項目代碼基礎上進行改進調整,完成了其需要的功能。現將對原有Visio二次開發項目的創新思路及成果總結一下,以飨讀者,也做為一個標志,供日後參考,或者於各位同行,一起研究切磋。先貼圖展示整個項目的該款,表明此文章所托並非空穴來風、紙上談兵!
本人基於項目的Visio的二次開發文章寫了很多,其中涉及到各形狀方面的操作,但基本上都是做為一個圖形的整體來實現各種效果的,由於仿真需要,需要將換向閥實現左右變換功能,而換向閥是一個組合控件,基本上對組合控件操作都是一個整體性的操作,不能局部進行位置變換的,所以要實現這種變化,還真是費了不少功夫。
需求是要求做線路分析的時候,油經過後,組合圖形實現效果變換,如下圖所示:
上面的圖形變化為下圖(實現了左右組合圖形的互換變化的效果)
一般光靠操作整個圖形實現變化是不太可能的,因此考慮化整為零,把其中兩個組合圖形從整體中分離,然後再進行組合操作即可。首先嘗試通過宏記錄方式查看代碼,得到分解後的形狀操作宏代碼如下所示:
Sub 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
}
世界本簡單,只因道未知;無師可自通,碼界無秘密。
主要研究技術:代碼生成工具、Visio二次開發、送水管理軟件等共享軟件開發
出處:http://www.iqidi.com