【Eplan-Api】检查项目内中断点是否关联和重复

【Eplan-Api】检查项目内中断点是否关联和重复

注明

测试版本为EplanP8,版本为2.9。
初步学习,程序非最优方式,仅提供思路,欢迎交流。
点击进入Eplan官方Api链接,注意文档为全英文。

思路

  1. 首先必须选中项目,判断是项目效率才高,如果只是单纯的某一页,不如直接用肉眼看。
  2. 遍历项目内所有页面,遍历页面内部件,然后判断部件是否是中断点。
  3. 中断点一旦关联就会存在标识符,标识符是部件的一个属性,可直接判断改属性是否为空。
  4. 判断重复较复杂,必须记录下所有的中断点然后统计数量,一般关联超过两次就是重复关联。一般情况下,中断点只存在一进一出,或者单独进或者出。

检查中断点是否关联

1:判断选取焦点是否为项目,然后遍历项目出中断点

SelectionSet 类
可以使用 SelectionSet::GetCurrentProject 方法获取用户当前正在处理的项目。
也可以通过 SelectionSet::GetSelectedPages 方法获取当前选定的页面。
根据图形编辑器或页面概述对话框当前是否具有焦点,可以选择一个或多个页面。
最重要的是,可以通过 SelectionSet.Select 属性从任何焦点(非模态)对话框中选择任何对象集。这些对象由函数作为 StorableObject 数组返回。可以遍历数组并确定有关对象的类型(以及任何其他信息)。

            SelectionSet selectionSet = new SelectionSet();
            StorableObject[] storableObjects = selectionSet.Selection;

            if (storableObjects.Length == 0)
            {
                MessageBox.Show("未选择项目!");
            }
            else
            {
                foreach (StorableObject storableObject in storableObjects)
                {
                    //选择的是项目
                    if (storableObject is Project)
                    {
                        //遍历项目内所有界面
                        foreach (Page page in ((Project)storableObject).Pages)
                        {
                            //遍历界面内所有可放置的部件符号等等
                            foreach (Placement placement in page.AllPlacements)
                            {
                                //如果Placement是中断点
                                if (placement is InterruptionPoint)
                                {
                                    ;
                                }
                            }
                        }
                    }
                }
            }

2.定义需要使用的变量

            //关联字符串定义
            int i = 0, j = 0;
            //用于最后的页面的字符串输出
            string PageNameSum = "";
            //用于记录未关联中断点所处的页面
            string[] PageName = new string[1000];

3.判断中断点的标识符属性是否为空,如果为空记录下改中断点所处的页面。

                                    //判断中断点是否有标识符
                                    if (((InterruptionPoint)placement).Properties.FUNC_DEVICETAG_MAIN_WITHSEPARATOR.ToString() == "")
                                    {
                                        if (i < 1000)
                                        {
                                            //记录未关联中断点的页面名字
                                            PageName[i] = ((InterruptionPoint)placement).Page.Name.ToString();
                                            i++;
                                            j++;
                                        }
                                    }

4.把统计的未关联页面名称和成一个字符串,放便输出

                        for (i = 0; i < j; i++)
                        {
                            PageNameSum = PageNameSum + PageName[i] + " 存在未关联" + "\n";
                        }

检查中断点是否重复

1.中断点重复必须记录下所有的中断点,然后处理判断次数,超过3次表示重复关联。并且还需要记录下出现过的页面名字。

            //重复字符串定义
            string PageNameRepetSum = "";
            string PageNameRepetPageSum = "";
            bool MidStates;
            string[] PageNameRepet = new string[10000];
            string[] PageNameRepetPage = new string[10000];
            int[,] Counts = new int[10000, 1];
            int a = 0, b = 0, c = 0;

2.记录下所有中断点,,然后遍历记录的数组,次数用一个二维数组表示,暂时不用担心重复计数的问题,后面专门处理。*[]

                                    //获取中断点的标识符,同时记录重复次数,方便后续判断
                                    PageNameRepet[a] = ((InterruptionPoint)placement).Properties.FUNC_DEVICETAG_MAIN_WITHSEPARATOR.ToString();
                                    PageNameRepetPage[a] = ((InterruptionPoint)placement).Page.Name;
                                    Counts[a, 0] = 0;
                                    foreach (string str in PageNameRepet)
                                    {
                                        if (str == PageNameRepet[a])
                                        {
                                            Counts[a, 0]++;
                                        }
                                    }
                                    a++;

3.由于记录的顺序是从小到大,中断点重复就会在后面重复计数,我们实际只取同名中断点最高次数的值,所以从大到小判断,同时滤过同名中断点的记录值。*[]

                        //逆序,方便取次数的最大值
                        for (i = a - 1; i >= 0; i--)
                        {
                            if (Counts[i, 0] > 2)
                            {
                                //定义中间量
                                MidStates = true;

                                for (c = i + 1; c < a; c++)
                                {
                                    //如果后续有重复则不再记录
                                    if (PageNameRepet[i] == PageNameRepet[c])
                                    {
                                        MidStates = false;
                                    }
                                }

                                if (MidStates)
                                {
                                    PageNameRepetPageSum = "";
                                    for (c = 0; c < a; c++)
                                    {
                                        //如果后续有重复则不再记录
                                        if (PageNameRepet[c] == PageNameRepet[i])
                                        {
                                            PageNameRepetPageSum = PageNameRepetPageSum + PageNameRepetPage[c] + "  ";
                                        }
                                    }
                                    PageNameRepetPageSum =

                                    PageNameRepetSum = PageNameRepetSum + PageNameRepet[i] + " 存在关联重复,关联次数 " + Counts[i, 0] + " " + "关联位置:" + PageNameRepetPageSum + "\n";
                                }

                            }
                        }

效果演示

为了方便查看,新建了一个界面,显示字符串。同时也方便把窗口放在一旁,一边去图纸中找有问题的位置。

在这里插入图片描述
对于一些特殊的中断点,可以在程序中&&条件,防止误提示,毕竟一些特殊中断点是需要重复使用的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值