• C#进行Visio二次开发之组合形状操作


    由于一朋友需要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.6889760#
        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.3937010"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二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    解析ASP.NET WebForm和Mvc开发的区别
    relink:在Linux/UNIX平台上relink Oracle软件(转)
    Java开发 Eclipse使用技巧(转)
    职场人生:情商
    RPC
    PLSQL Developer Debug
    uC/OS-III学习2::uC/OS-III LED闪烁实验
    Flex文件读取报错
    C++字节对齐问题
    写可測试的代码
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1761893.html
Copyright © 2020-2023  润新知