【Eplan-Api】检查项目内元件是否已经选择部件

【Eplan-Api】检查项目内元件是否已经选择部件

注明

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

思路

  1. 首先必须选中项目,判断是项目效率才高,如果只是单纯的某一页,不如直接用肉眼看。
  2. 遍历项目内所有页面,遍历页面内部件,然后判断元件是否已经选择部件。
  3. 由于元件的类型太多,实际我们需要选出我们需要的某些类型的元件。
  4. 注意元件只有“主功能”才需要选择部件,端子同理。
  5. 对于未选择部件的元件,返回页面名称和标识符,方便后续纠错。

检查元件是否已经选择部件

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 Function)
                                {
                                    ;
                                }
                            }
                        }
                    }
                }
            }

2.定义需要使用的变量

            //部件选择数量
            int PartCount;
            //元件类型
            string PartCctegory = "";

            int i = 0, j = 0;
            //用于最后的页面的字符串输出
            string PageNameSum = "";
            string[] PageName = new string[1000];

3.获取元件的类型和部件选择数量。

                                    //部件选型数量
                                    PartCount = ((Function)placement).ArticleReferences.Length;

                                    //部件类型
                                    PartCctegory = ((Function)placement).Category.ToString();                                    

4.这里提供几种元件类型的名字。

                                安全开关:CircuitBreaker
                                端子:Terminal
                                漏电保护:CurrentCircuitBreaker
                                开关:Switch
                                断路器:Overload
                                线缆:Cable
                                接触器:Coil

5.判断是否是我们需要判断的元件,然后部件数量为0,元件是主功能。

((Function)placement).IsMainFunction),返回TRUE则代表是主功能。

                                    if ((PartCctegory == "CircuitBreaker" || PartCctegory == "CurrentCircuitBreaker" ||
                                        PartCctegory == "Overload" || PartCctegory == "Cable" ||PartCctegory == "Coil")
                                        && PartCount==0 && ((Function)placement).IsMainFunction)//注意设备还必须是主功能
                                    {
                                        PageName[i] = ((Function)placement).Page.Name.ToString() + "  " + PartCctegory + " " + ((Function)placement).Properties.FUNC_DEVICETAG_MAIN_WITHSEPARATOR.ToString();
                                        i++;
                                        j++;
                                    }
                                    //如果是端子则只有主端子需要选部件
                                    else if(PartCctegory == "Terminal" && ((Terminal)placement).IsMainTerminal && PartCount == 0)
                                    {
                                        PageName[i] = ((Function)placement).Page.Name.ToString() + "  " + PartCctegory + " " + ((Function)placement).Properties.FUNC_DEVICETAG_MAIN_WITHSEPARATOR.ToString();
                                        i++;
                                        j++;
                                    }

6.需要补充的是端子分为主端子和分布式端子,端子不用用元件是否是主功能来判断,只能用端子自己的主端子来判断。

((Terminal)placement).IsMainTerminal,返回TRUE则代表主端子。

7.最后输出结果,这里为了方便查看,新建了一个界面显示。

                        for (i = 0; i < j; i++)
                        {
                            PageNameSum = PageNameSum + PageName[i] +" "+ "存在未选型" + "\n";
                        }
                        FormAll.FormLabel.Variable.Label = PageNameSum;
                        FormAll.FormLabel form = new FormAll.FormLabel();
                        form.Show();

效果演示

在这里插入图片描述

可以自由对需要检查的元件加入IF条件中,不知道元件名字可以用该指令查询。

PartCctegory = ((Function)placement).Category.ToString();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值